【问题标题】:Finding linux version inside a device driver在设备驱动程序中查找 linux 版本
【发布时间】:2015-09-24 11:19:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: driver linux-device-driver


    【解决方案1】:

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

    <linux/utsname.h> 中的 utsname() 函数提供了一个指向 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多