今天在做乙個驅動的時候要用到另乙個驅動(i2c)提供的api,在核心
初始化時碰到了乙個依賴問題。
我的驅動在i2c初始化之前就執行起來了,而這時i2c提供的api還處於不可用狀態。查了很多資料,網上有人說所有使用module_init這個巨集的驅動程式的起動順序都是不確定的(我沒有查到權威的資料)。
所有的__init函式在區段.initcall.init中還儲存了乙份函式指標,在初始化時核心會通過這些函式指標呼叫這些__init函式指標,並在整個初始化完成後,釋放整個init區段(包括.init.text,.initcall.init等)。
注意,這些函式在核心
初始化過程中的呼叫順序只和這裡的函式指標的順序有關,和1)中所述的這些函式本身在.init.text區段中的順序無關。在2.4核心中,這些函式指標的順序也是和鏈結的順序有關的,是不確定的。在2.6核心中,initcall.init區段又分成7個子區段,分別是
.initcall1.init.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
當需要把函式fn放到.initcall1.init區段時,只要宣告
core_initcall(fn);
即可。
其他的各個區段的定義方法分別是:
core_initcall(fn) --->.initcall1.initpostcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init
而與2.4相容的initcall(fn)則等價於device_initcall(fn)。各個子區段之間的順序是確定的,即先呼叫.initcall1.init中的函式指標,再呼叫.initcall2.init中的函式指標,等等。而在每個子區段中的函式指標的順序是和鏈結順序相關的,是不確定的。
在核心中,不同的init函式被放在不同的子區段中,因此也就決定了它們的呼叫順序。這樣也就解決了一些init函式之間必須保證一定的呼叫順序的問題。按照include/linux/init.h檔案所寫的,我在驅動裡償試了這樣兩種方式:
__define_initcall("7", fn);late_initcall(fn);
都可以把我的驅動調整到最後呼叫。實際上上面兩個是一回事:
#define late_initcall(fn) __define_initcall("7", fn)
Linux核心驅動程式初始化順序的調整
今天在做乙個驅動的時候要用到另乙個驅動 i2c 提供的api,在核心初始化時碰到了乙個依賴問題。我的驅動在i2c初始化之前就執行起來了,而這時i2c提供的api還處於不可用狀態。查了很多資料,網上有人說所有使用module init這個巨集的驅動程式的起動順序都是不確定的 我沒有查到權威的資料 所有...
linux核心初始化
1 系統的引導和初始化 linux 系統的引導有好幾種方式 常見的有 lilo,loadin引導和linux的自舉引導 bootsect loader 而後者所對應源程式為arch i386 boot bootsect.s,它為實模式的匯程式設計序,無論是哪種引導方式,最後都要跳轉到 arch i3...
測試Linux核心驅動程式
在編寫linux核心驅動程式中,我們介紹了如何在ubuntu上為android系統編寫linux核心驅動程式。在這個名為hello的linux核心驅動程式中,建立三個不同的檔案節點來供使用者空間訪問,分別是傳統的裝置檔案 dev hello proc系統檔案 proc hello和devfs系統屬性...