【问题标题】:Is there a macro definition to check the Linux kernel version?是否有用于检查 Linux 内核版本的宏定义?
【发布时间】:2013-05-19 06:01:12
【问题描述】:

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

【问题讨论】:

    标签: c linux gcc macros linux-kernel


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      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 数据。

      【讨论】:

      • 是否有另一种方法可以让我根据内核版本拥有不同的变量类型?
      猜你喜欢
      • 2017-10-23
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2023-03-27
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多