2011-11-06 200 views

回答

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 

它可以讓你比較兌主要/次要版本。

+0

中的utsname()函數的伎倆。謝謝。 – Bogi

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?