Linux核心驅動程式初始化順序的調整

2021-04-21 09:35:04 字數 1613 閱讀 4632

今天在做乙個驅動的時候要用到另乙個驅動(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.init 

postcore_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系統屬性...