是否有宏定义来检查Linux内核版本?

时间:2013-05-23 18:30:04

标签: c linux gcc macros linux-kernel

我想知道是否有一个gcc宏会告诉我Linux内核版本,所以我可以适当地设置变量类型。如果没有,我将如何定义我自己的宏呢?

2 个答案:

答案 0 :(得分:62)

linux / version.h 文件有一个名为KERNEL_VERSION的宏,可让您根据安装的当前Linux头文件版本(LINUX_VERSION_CODE)检查所需的版本。例如,要检查当前的Linux标头是否适用于内核 v2.6.16 或更早版本:

#include <linux/version.h>

#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif

在运行时获取版本信息的更好方法是使用include/linux/utsname.h中的utsname函数。

char *my_kernel_version = utsname()->release;

这基本上是/proc/version获取当前内核版本的方式。

另见

  

Getting kernel version from linux kernel module at runtime

答案 1 :(得分:1)

gcc不会知道此信息。作为替代方案,您可以在运行时轻松确定大量内核信息。

您可以定义运行时类型,如

struct unified_foo {
     unsigned int kernel_version;
     union {
         kernel_x_foo_type k_x;
         kernel_y_foo_type k_y;
         kernel_z_foo_type k_z;
     } u;
};

并在运行时让代码查看/proc/version(或者您需要从内核运行时环境获得的任何内容)并适当地设置kernel_versionkernel_x_foo_type等人。是您希望以内核版本为条件的类型。调用代码需要查看kernel_version并访问相应的u.k_xu.k_yu.k_z数据。