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