2015-11-02 108 views
0

我針對飛思卡爾iMX53 Arm CPU板的嵌入式Linux 2.6.35.3。更改內核驅動程序中內置的驅動程序的初始化順序?

當內核啓動過程中,所有與CAN總線相關的各種驅動程序(FlexCAN)都被初始化並準備使用時,我需要更改它。我需要更早地初始化CAN總線,然後才能在用戶空間準備好腳本完成工作之前儘早發送一些特定的CAN原始消息。

如何控制內核在編譯(內置)內核模塊/驅動程序在啓動和初始化序列期間內部由內核探測的時間。

我不是在談論文件系統級別的.ko文件,這些文件可以在腳本中進行模塊化檢測..這是在此之前的方式。

對不起,我格式不好的linux問題..我不經常在內核空間工作..嘗試破解我的方式儘可能快。

回答

1

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來自地獄的依賴循環。

+0

反正這還不是完整的圖片。我們有兩個階段:模塊初始化,驅動程序被探測。第二個驅動程序的' - > probe()'將在設備出現**和**模塊初始化時被調用。在依賴關係的情況下,' - > probe()'可能會失敗並返回-EPROBE_DEFER,以允許稍後重新探測。此外,現在有一個用於推遲探測的異步機制。 – 0andriy