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中。

相关内容