如何从 linux 内核模块代码(内核模式)中获取有关正在运行哪个版本的内核的运行时信息?
3 回答
按照惯例,Linux 内核模块加载机制不允许加载未针对正在运行的内核编译的模块,因此您所指的“正在运行的内核”很可能在内核模块编译时就已经知道了。
为了检索版本字符串常量,旧版本要求您包含<linux/version.h>
、其他<linux/utsrelease.h>
和较新的<generated/utsrelease.h>
。如果你真的想在运行时获取更多信息,那么utsname()
function fromlinux/utsname.h
是最标准的运行时接口。
虚拟/proc/version
procfs 节点的实现使用utsname()->release
.
如果要在编译时根据内核版本调整代码,可以使用预处理器块,例如:
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
它允许您与主要/次要版本进行比较。
您一次只能为任何一个内核版本安全地构建一个模块。这意味着在运行时从模块询问是多余的。
您可以在构建时通过查看UTS_RELEASE
最近内核的值来发现这一点,这是 <generated/utsrelease.h>
其他方法之一。
为什么我不能为任何版本构建内核模块?
因为内核模块 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.
另请参阅:如何构建 Linux 内核模块以使其与所有内核版本兼容?
在编译时如何做被问到:是否有宏定义来检查 Linux 内核版本?