initcall排序定义如下:
http://lxr.free-electrons.com/source/include/linux/init.h#L194
是,以供参考:
/*
* A "pure" initcall has no dependencies on anything else, and purely
* initializes variables that couldn't be statically initialized.
*
* This only exists for built-in code, not for modules.
* Keep main.c:initcall_level_names[] in sync.
*/
#define pure_initcall(fn) __define_initcall(fn, 0)
#define core_initcall(fn) __define_initcall(fn, 1)
#define core_initcall_sync(fn) __define_initcall(fn, 1s)
#define postcore_initcall(fn) __define_initcall(fn, 2)
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
#define arch_initcall(fn) __define_initcall(fn, 3)
#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
#define subsys_initcall(fn) __define_initcall(fn, 4)
#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
#define fs_initcall(fn) __define_initcall(fn, 5)
#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
#define device_initcall(fn) __define_initcall(fn, 6)
#define device_initcall_sync(fn) __define_initcall(fn, 6s)
#define late_initcall(fn) __define_initcall(fn, 7)
#define late_initcall_sync(fn) __define_initcall(fn, 7s)
由于module_init
已经#defined是device_initcall
,什么也没有依赖于它得到一个通用模块初始化序列的结尾。早加载模块,您只需改变其module_init
调用别的东西,发生较早(如subsys_initcall
,例如)
注:刚接通事物的秩序可以打破其他依赖,并且可以在一个catch-得到22来自地狱的依赖循环。
反正这还不是完整的图片。我们有两个阶段:模块初始化,驱动程序被探测。第二个驱动程序的' - > probe()'将在设备出现**和**模块初始化时被调用。在依赖关系的情况下,' - > probe()'可能会失败并返回-EPROBE_DEFER,以允许稍后重新探测。此外,现在有一个用于推迟探测的异步机制。 – 0andriy