你是对的 - LINUX_VERSION_CODE 是一个宏,它提供有关您用于编译模块的 Linux 头文件版本的编译时信息。宏无法知道模块实际加载到的内核版本。
<linux/utsname.h> 中的 utsname() 函数提供了一个指向 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。