Linux kernel 在运行时从linux内核模块获取内核版本

Linux kernel 在运行时从linux内核模块获取内核版本,linux-kernel,kernel-module,kernel-mode,Linux Kernel,Kernel Module,Kernel Mode,如何从linux内核模块代码内核模式中获取运行内核版本的运行时信息?一次只能安全地为任何一个内核版本构建模块。这意味着在运行时请求模块是多余的 您可以在构建时通过查看最新内核中UTS\u版本的价值来发现这一点,这是通过其他方式实现的。按照惯例,Linux内核模块加载机制不允许加载未针对运行内核编译的模块,因此,您所指的正在运行的内核很可能在内核模块编译时就已经知道了 为了检索版本字符串常量,旧版本要求您包括、其他版本和新版本。如果您真的想在运行时获得更多信息,那么linux/utsname.h中

如何从linux内核模块代码内核模式中获取运行内核版本的运行时信息?

一次只能安全地为任何一个内核版本构建模块。这意味着在运行时请求模块是多余的


您可以在构建时通过查看最新内核中UTS\u版本的价值来发现这一点,这是通过其他方式实现的。

按照惯例,Linux内核模块加载机制不允许加载未针对运行内核编译的模块,因此,您所指的正在运行的内核很可能在内核模块编译时就已经知道了

为了检索版本字符串常量,旧版本要求您包括、其他版本和新版本。如果您真的想在运行时获得更多信息,那么linux/utsname.h中的utsname函数是最标准的运行时接口

虚拟/proc/version procfs节点的实现使用utsname->release

如果要在编译时根据内核版本调整代码,可以使用预处理器块,例如:

#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
它允许您与主要/次要版本进行比较。

为什么我不能为任何版本构建内核模块

因为内核模块API在设计上是不稳定的,如内核树中所述:。摘要如下:

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.
另见:

如何在编译时执行此操作,请访问: