在设备驱动程序中查找linux版本

时间:2015-09-24 11:19:08

标签: driver linux-device-driver

我是linux设备驱动程序开发的新手。我正在尝试编写一个simple hello world module,它将显示在我尝试将hello_world模块插入内核的系统上运行的内核版本。

我在version.h中使用LINUX_VERSION_CODE来获取linux版本并构建模块。 当我尝试将ko文件插入到不同于其构建位置的系统上时,它仍会显示构建它的内核版本

我认为问题在于使用C macro。 有人可以帮我找到如何找到要插入ko的本地机器的linux版本而不是找到我的模块构建的内核版本

1 个答案:

答案 0 :(得分:1)

您是对的 - LINUX_VERSION_CODE是一个宏,它提供有关您用于编译模块的Linux标头版本的编译时信息。宏无法了解模块实际加载到的内核版本。

utsname()中的<linux/utsname.h>函数提供了指向new_utsname结构的指针,该结构包含sysnamereleaseversion成员你正在寻找什么。

/proc/version中使用了来自这些成员的信息,如fs/proc/version.c所示:

static int version_proc_show(struct seq_file *m, void *v)
{
    seq_printf(m, linux_proc_banner,
        utsname()->sysname,
        utsname()->release,
        utsname()->version);
    return 0;
}

linux_proc_banner是一个字符串,目前定义如下:

const char linux_proc_banner[] =
    "%s version %s"
    " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
    " (" LINUX_COMPILER ") %s\n";

在我的系统上,阅读/proc/version - 从而读取这些成员 - 导致获得以下字符串:

Linux version 4.1.6-1-ARCH (builduser@tobias) (gcc version 5.2.0 (GCC) ) #1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015

因此,sysnameLinuxrelease4.1.6-1-ARCHversion#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015