我們如何定製內置的驅動程序加載順序(先製作一些內置的驅動程序模塊,然後再加載相關的模塊)?什麼是Linux內置驅動程序加載順序?
回答
內置驅動程序不會是加載,因此內置。它們的初始化函數被調用,當內核自行建立時驅動程序被激活。這些初始化函數在init/main.c::do_initcalls()
中調用。所有初始化呼叫分類水平,這是在initcall_levels
定義和include/linux/init.h
這些級別是在連接器腳本(arch/*/kernel/vmlinux.lds.*
)定義實際工作中的符號。在內核編譯時,鏈接器收集標記爲module_init()
或其他*_initcall()
的所有函數,按級別進行分類,將所有函數放在同一級別,並創建一個類似於函數指針數組的函數。
do_initcall_level()在運行時所做的是調用數組中指針指向的每個函數。除do_initcall_level中的級別之外,沒有調用策略,但數組中的順序在鏈接時間中確定。
所以,現在你可以看到司機的啓動順序是固定在鏈接時間,但你可以做什麼?
- 把你的初始化函數在較高的水平,或
- 把你的設備驅動程序在較高位置
Makefile
如果你看了上面的第一個是明確的。即)使用early_initcall(),而不是適當的。
第二個需要更多的解釋。爲什麼Makefile
問題中的命令是當前內核構建系統如何工作以及連接器如何工作的原因。長話短說,構建系統將獲取obj-y
中的所有對象文件並將它們鏈接在一起。它依賴於環境,但鏈接器很有可能將第一個目標文件放置在較低地址的obj-y
中,因此早些時候調用該文件。
如果你只是想讓你的驅動程序比同一個目錄下的其他驅動程序更早被調用,這是最簡單的方法。
depmod
檢查每個模塊導出和需要的符號,並對它們進行拓撲排序,以便modprobe
稍後可以用來以正確的順序加載模塊。要求你想依賴的模塊中的符號足以讓它做正確的事情。
最近我遇到了這個問題,我的充電器驅動程序依賴ADC驅動程序,因此在加載ADC驅動程序充電器驅動程序之前已加載並檢查在DTS文件中定義的adc phandle並且必須通過ADC驅動程序進行初始化。它通過更改驅動程序/ Makefile中模塊的順序得到解決
- 1. 什麼是Windows內核驅動程序?
- 2. 嵌入式linux驅動程序加載
- 3. Linux內核中的驅動程序探測順序
- 4. QSqlDatabase:驅動程序未加載驅動程序未加載
- 5. 使用驅動程序內部的驅動程序的Linux
- 6. 將Linux驅動程序轉換爲可加載內核模塊
- 7. 使用OSR驅動程序加載程序加載驅動程序錯誤
- 8. Linux內核配置設備的順序是什麼?
- 9. 當驅動程序內置驅動程序時,驅動程序不工作
- 10. 加載JDBC驅動程序
- 11. 什麼是在Linux驅動程序中的wmb()
- 12. Linux驅動程序中的platform_get_resource是什麼?
- 13. 瞭解Linux內核驅動程序
- 14. 限制在linux內核驅動程序
- 15. linux內核字符驅動程序
- 16. Linux I2C內核驅動程序
- 17. 更改內核驅動程序中內置的驅動程序的初始化順序?
- 18. 什麼是jTDS驅動程序?
- 19. 什麼是pyspark驅動程序?
- 20. 什麼是測試驅動程序?
- 21. 是什麼在MySQL JDBC驅動程序
- 22. 什麼是Type 4 XA驅動程序?
- 23. 什麼是驅動程序功能?
- 24. 什麼是jdbc驅動程序「org.gjt.mm.mysql.Driver」?
- 25. 驅動程序是什麼意思?
- 26. Linux啓動加載程序
- 27. Py2app不包含Sqlite驅動程序 - 「數據庫錯誤:驅動程序未加載驅動程序未加載」
- 28. QT:驅動程序未加載,但驅動程序存在
- 29. Windows驅動程序編程或Linux驅動程序編程?
- 30. 爲什麼使用libusb需要卸載內核驅動程序?
感謝@Yasushi Shoji爲您提供了非常詳細的解釋! – 2012-07-26 06:49:11
這是一個很好的答案! – VividD 2014-08-20 08:39:18