我是linux设备驱动程序开发的新手。我正在尝试编写一个simple hello world module
,它将显示在我尝试将hello_world
模块插入内核的系统上运行的内核版本。
我在version.h中使用LINUX_VERSION_CODE
来获取linux版本并构建模块。
当我尝试将ko文件插入到不同于其构建位置的系统上时,它仍会显示构建它的内核版本
我认为问题在于使用C macro
。
有人可以帮我找到如何找到要插入ko的本地机器的linux版本而不是找到我的模块构建的内核版本
答案 0 :(得分:1)
您是对的 - LINUX_VERSION_CODE
是一个宏,它提供有关您用于编译模块的Linux标头版本的编译时信息。宏无法了解模块实际加载到的内核版本。
utsname()
中的<linux/utsname.h>
函数提供了指向new_utsname
结构的指针,该结构包含sysname
,release
和version
成员你正在寻找什么。
/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
因此,sysname
为Linux
,release
为4.1.6-1-ARCH
,version
为#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015
。