红联Linux门户
Linux帮助

Linux的initcalls调用机制

发布时间:2014-12-17 10:35:24来源:linux网站作者:linux人

只要看看 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中。