gliethttpgliethttp.blog.chinaunix.net
gliethttp
全部博文(2005)
2014年(2)
2013年(2)
2012年(16)
2011年(66)
2010年(368)
2009年(743)
2008年(491)
2007年(317)
linux_zj
程睿
mzh2100
dogsun88
叶绍琛
kowems
gongping
chumojin
高泽然
xy7777
os123456
hiderhao
zahassio
byy6by
zxy11861
COVID_19
a1960048
swzswz
分类: LINUX
2007-06-30 13:15:08
linux启动时对编译进内核驱动模块的加载文章来源:http://gliethttp.cublog.cn今天北京下雨了[init/main.c]start_kernel()->rest_init()->kernel_thread创建核心线程init()->do_basic_setup()->do_initcalls()static void __init do_initcalls(void){ initcall_t *call; call = &__initcall_start; do { (*call)(); call++; } while (call < &__initcall_end); /* Make sure there is no pending stuff from the initcall sequence */ flush_scheduled_tasks();}vmlinux-armv.lds.in中对__initcall_start的定义... __initcall_start = .; *(.initcall.init) __initcall_end = .;.../include/linux/init.h中对.initcall.init和initcall_t定义typedef int (*initcall_t)(void);#define __init_call __attribute__ ((unused,__section__ (".initcall.init ")))#define module_init(x) __initcall(x);在dirvers/at91/net/at91_ether.c中module_init(at91ether_init)所以可以看出at91ether_init初始化函数指针将会被连接到.initcall.init空间,因此(*call)();系统启动时核心线程Init将直接调用at91ether_init()完成网络硬件初始化;对于insmod加载的驱动,所有工作由insmod独立解析完成,insmod系统调用原型为sys_init_module将rtl8019驱动编译进linux内核1>驱动代码:rtl8019.c2>在net目录下的config.in文件中添加一项 dep_tristate ' RTL8019 support' CONFIG_RTL8019 $CONFIG_ISA3>make menuconfig 将RTL8019 support选择'y',保存退出,autoconf文件中出现一个宏定义:#define CONFIG_RTL80194>向net目录下的makefile,添加: obj-$(CONFIG_RTL8019) += rtl8019.o5>编译内核,即将rtl8019添加到了linux内核注:在menuconfig中选择m和y的区别: y:模块驱动编译到内核中,启动时自动加载 m:模块会被编译,但是不会被编译到内核中,只是生成.o文件,我们可以收集这些.o文件做到linux的文件系统,如:ramdisk中,然后用modprobe或insmod实现动态加载.
上一篇:linux2.4.19下__ioremap函数中remap_area_pages虚拟地址映射建立函数
下一篇:简析linux系统调用
登录 注册