Linux核心驅動程式初始化順序的調整(轉)
Linux核心驅動程式初始化順序的調整(轉)[@more@]今天在做一個驅動的時候要用到另一個驅動(I2C)提供的API,在核心初始化時碰到了一個依賴問題。
我的驅動在I2C初始化之前就執行起來了,而這時I2C提供的API還處於不可用狀態。查了很多資料,網上有人說所有使用module_init這個宏的驅動程式的起動順序都是不確定的(我沒有查到權威的資料)。後來在linuxforum上看到一張帖子,這裡面講了一下這個問題:
所有的__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)
我的驅動在I2C初始化之前就執行起來了,而這時I2C提供的API還處於不可用狀態。查了很多資料,網上有人說所有使用module_init這個宏的驅動程式的起動順序都是不確定的(我沒有查到權威的資料)。後來在linuxforum上看到一張帖子,這裡面講了一下這個問題:
所有的__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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-960602/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript調整option順序JavaScript
- AIX磁碟順序調整AI
- jQuery調整li元素順序jQuery
- linux驅動中使用順序鎖Linux
- jQuery調整li元素順序程式碼例項jQuery
- JavaScript 調整li元素上下順序JavaScript
- Git調整commit之間順序GitMIT
- 【劍指offer】調整陣列順序陣列
- jQuery實現的新聞列表上下移動調整順序程式碼例項jQuery
- windows驅動載入順序Windows
- 調整陣列元素順序演算法陣列演算法
- 九、 Java程式初始化的順序(二)Java
- Linux 修改核心啟動預設引導順序Linux
- Win10怎麼調整輸入法的順序?Win10
- linux啟動順序Linux
- 使用 Python 旋轉PDF頁面、或調整PDF頁面順序Python
- Java初始化順序Java
- java類初始化的順序Java
- JAVA物件的初始化順序Java物件
- linux3.4.2核心-LCD驅動程式的移植Linux
- Java 類初始化順序Java
- Java類初始化順序Java
- win10硬碟順序調整怎麼設定 win10如何改變硬碟順序Win10硬碟
- Java中class的初始化順序Java
- 關於java的初始化順序Java
- ecshop如何調整商品屬性篩選項的顯示順序?
- CentOS 7.0 系統更改核心啟動順序CentOS
- 使用@AutoConfigureBefore、After、Order調整Spring Boot自動配置順序Spring Boot
- 使用@AutoConfigureBefore調整配置順序竟沒生效?
- win10系統怎麼調整輸入法順序Win10
- c#物件初始化順序C#物件
- (轉)Linux 核心引數及Oracle相關引數調整LinuxOracle
- 程式碼說事 之 建立java物件的初始化順序Java物件
- 總結類初始化時的程式碼執行順序
- Linux系統核心模組和驅動的編寫(轉)Linux
- linux驅動程式設計(轉)Linux程式設計
- Linux裝置驅動程式 (轉)Linux
- LINUX下的裝置驅動程式 (轉)Linux