【发布时间】:2013-05-19 06:01:12
【问题描述】:
我想知道是否有一个 gcc 宏可以告诉我 Linux 内核版本,以便我可以适当地设置变量类型。如果没有,我将如何定义自己的宏来执行此操作?
【问题讨论】:
标签: c linux gcc macros linux-kernel
我想知道是否有一个 gcc 宏可以告诉我 Linux 内核版本,以便我可以适当地设置变量类型。如果没有,我将如何定义自己的宏来执行此操作?
【问题讨论】:
标签: c linux gcc macros linux-kernel
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 获取当前内核版本的方式。
【讨论】:
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_version。 kernel_x_foo_type 等。是您希望以内核版本为条件的类型。调用代码需要查看kernel_version 并访问相应的u.k_x、u.k_y 或u.k_z 数据。
【讨论】: