感谢支持
我们一直在努力

Linux的initcalls调用机制

只要看看 include/linux/init.h中的定义就清楚了: 


#define core_initcall(fn)        __define_initcall(“1”,fn)


#define postcore_initcall(fn)        __define_initcall(“2”,fn)


#define arch_initcall(fn)        __define_initcall(“3”,fn)


#define subsys_initcall(fn)            __define_initcall(“4”,fn)


#define fs_initcall(fn)                     __define_initcall(“5”,fn)


#define device_initcall(fn)           __define_initcall(“6”,fn)


#define late_initcall(fn)         __define_initcall(“7”,fn) 


#define __initcall(fn) device_initcall(fn)




#define console_initcall(fn) /


       static initcall_t __initcall_##fn /


       __attribute_used__ __attribute__((__section__(“.con_initcall.init”)))=fn




#define security_initcall(fn) /


       static initcall_t __initcall_##fn /


       __attribute_used__ __attribute__((__section__(“.security_initcall.init”))) = fn


 


#define module_init(x)   __initcall(x);  //modlue的级别是6


链接的时候按下面的顺序链接:



 __initcall_start = .;


   *(.initcall1.init)


   *(.initcall2.init)


   *(.initcall3.init)


   *(.initcall4.init)


   *(.initcall5.init)


   *(.initcall6.init)


   *(.initcall7.init)


  __initcall_end = .;



因此,在do_initcalls的时候就按照前面的顺序来了。



其中 console_initcall等这些则是定义在专门的section中的。比如console_initcall就是定义在:__con_initcall_start与__con_initcall_end这个section中。

赞(0) 打赏
转载请注明出处:服务器评测 » Linux的initcalls调用机制
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏