如何从linux内核模块代码(内核模式)中获取有关运行哪个内核版本的运行时信息?
答案 0 :(得分:18)
按照惯例,Linux内核模块加载机制不允许加载未针对正在运行的内核编译的模块,因此您所指的“运行内核”很可能在内核模块编译时已知。
要检索版本字符串常量,旧版本要求您包含<linux/version.h>
,其他<linux/utsrelease.h>
和更新版<generated/utsrelease.h>
。如果您真的想在运行时获取更多信息,那么来自utsname()
的{{1}}函数是最标准的运行时界面。
虚拟linux/utsname.h
procfs节点的实现使用/proc/version
。
如果要在编译时根据内核版本调整代码,可以使用预处理程序块,例如:
utsname()->release
它允许您与主要/次要版本进行比较。
答案 1 :(得分:3)
您一次只能为任何一个内核版本安全地构建模块。这意味着在运行时从模块询问是多余的。
你可以在构建时找到这个,通过查看UTS_RELEASE
中<generated/utsrelease.h>
的值{{1}}以及其他方法。
答案 2 :(得分: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?