- 论坛徽章:
- 0
|
(版本为2.6.17.7)
内核初始化设备驱动的过程:start_kernel()->rest_init()->do_basic_setup()->do_initcalls()
函数do_initcalls如下:
for (call = __initcall_start; call < __initcall_end; call++) {//循环调用__initcall_start与__initcall_end之间函数
.........
result = (*call)();
.........
}
关于module_init的定义如下:
#define __define_initcall(level,fn) \
90 static initcall_t __initcall_##fn __attribute_used__ \
91 __attribute__((__section__(".initcall" level ".init"))) = fn
#define device_initcall(fn) __define_initcall("6",fn)
#define __initcall(fn) device_initcall(fn)
#define module_init(x) __initcall(x);
文件linux/arch/arm/kernel/vmlinux.lds.S 中
__initcall_start = .;
49 *(.initcall1.init)
50 *(.initcall2.init)
51 *(.initcall3.init)
52 *(.initcall4.init)
53 *(.initcall5.init)
54 *(.initcall6.init)
55 *(.initcall7.init)
56 __initcall_end = .;
module_init应该对应着(.initcall6.init)(根据上面的原代码),现在的问题是,内核的drivers中有许多调用了module_init宏,而 *(.initcall6.init)只能存放一个函数指针,那为什么每一个调用了module_init宏的模块都能被执行呢?
请朋友们指点!
[ 本帖最后由 小z 于 2008-7-23 12:58 编辑 ] |
|