歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux的initcalls調用機制

Linux的initcalls調用機制

日期:2017/2/28 16:09:20   编辑: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中。

Copyright © Linux教程網 All Rights Reserved