如何從linux內核模塊代碼(內核模式)中獲取有關哪個版本的內核正在運行的運行時信息?在運行時從linux內核模塊獲取內核版本
6
A
回答
16
按照慣例,Linux內核模塊加載機制不允許加載未針對正在運行的內核編譯的模塊,因此您所指的「正在運行的內核」很可能已在內核模塊編譯時已知。
爲了檢索版本字符串常量,舊版本要求您包含<linux/version.h>
,其他<linux/utsrelease.h>
和更新的<generated/utsrelease.h>
。如果您真的想在運行時獲得更多信息,那麼函數linux/utsname.h
是最標準的運行時接口。
執行虛擬/proc/version
procfs節點使用utsname()->release
。
如果你想調節基於在編譯時內核版本的代碼,你可以使用一個預處理器塊,如:
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
它可以讓你比較兌主要/次要版本。
3
您一次只能安全地爲任何一個內核版本構建模塊。這意味着在運行時從模塊詢問是多餘的。
通過查看最近的內核中的UTS_RELEASE
的值,您可以在構建時找到此值,其中包括<generated/utsrelease.h>
以及其他這樣做的方式。
0
爲什麼我不能爲任何版本構建內核模塊?
由於內核模塊API的設計不穩定,如內核樹中所述:Documentation/stable_api_nonsense.txt
。摘要如下:
Executive Summary
-----------------
You think you want a stable kernel interface, but you really do not, and
you don't even know it. What you want is a stable running driver, and
you get that only if your driver is in the main kernel tree. You also
get lots of other good benefits if your driver is in the main kernel
tree, all of which has made Linux into such a strong, stable, and mature
operating system which is the reason you are using it in the first
place.
參見:How to build a Linux kernel module so that it is compatible with all kernel releases?
如何做到這一點在編譯時被要求在:Is there a macro definition to check the Linux kernel version?
相關問題
- 1. 如何在內核模塊中打印linux內核版本號
- 2. 從Linux內核模塊
- 3. 運行Linux內核模塊(Hello World)
- 4. Linux內核和我的內核模塊
- 5. 啓動時內核模塊在Linux內核中的狀態
- 6. 無法在Linux內核版本4.2.3上從內核模塊打開/讀取文本文件
- 7. Linux內核模塊編程
- 8. Linux內核模塊調試
- 9. Linux內核模塊編譯
- 10. Linux內核模塊ABI(x86)
- 11. 安裝Linux內核模塊
- 12. Linux內核模塊配置
- 13. Linux內核模塊編譯
- 14. 關於linux內核模塊
- 15. 剖析Linux內核模塊
- 16. CentOS的Linux內核版本
- 17. Linux內核版本號?
- 18. Linux內核版本編號
- 19. Linux內核模塊:在運行時動態加載代碼
- 20. 在編寫Linux內核模塊時獲取用戶進程pid
- 21. 內核模塊如何連接到正在運行的內核?
- 22. 基本的linux內核模塊
- 23. 使用C讀取linux內核版本?
- 24. 如何在安裝新內核時自動執行linux內核模塊編譯?
- 25. 如何從Linux內核克隆模塊?
- 26. 從Linux內核模塊寫入debugfs
- 27. 編譯linux內核模塊時出錯
- 28. 內核模塊版本魔術錯誤
- 29. linux內核模塊內存檢查器
- 30. 如何從Linux內核模塊獲取使用次數?
中的utsname()函數的伎倆。謝謝。 – Bogi