歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

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

Copyright © Linux教程網 All Rights Reserved