我的情况是,通过查询加载的模块或 .ko 文件来查找加载的内核模块的版本会非常方便。
有没有一种标准的方法可以在不深入研究源代码的情况下做到这一点?
$ apropos modinfo
modinfo (8) - display information about a kernel module
$ modinfo cpuid.ko
filename: cpuid.ko
author: H. Peter Anvin <hpa@zytor.com>
description: x86 generic CPUID driver
license: GPL
vermagic: 2.6.37 SMP preempt mod_unload PENTIUM4 gcc-4.4.5
depends:
运行时方法
insmod /module_version.ko
cat /sys/modules/module_version/version
# => 1.0
cat /sys/module/module_version/srcversion
# => AB0F06618BC3A36B687CDC5
modinfo /module_version.ko | grep -E '^(src|)version'
# => version: 1.0
# => srcversion: AB0F06618BC3A36B687CDC5
在内核 4.9.6 上使用此设置进行测试。
/sys/modules/module_version/version
version
由MODULE_VERSION
宏设置。
MODULE_VERSION
如果模块中未使用宏,则该文件不存在。
/sys/module/module_version/srcversion
srcversion
是用于编译内核模块的源代码的MD4哈希。它是在构建时从https://github.com/torvalds/linux/blob/v4.9/scripts/mod/modpost.c#L1978使用https://github.com/torvalds/linux/blob/自动计算的v4.9/scripts/mod/sumversion.c#L400
要启用它,请执行以下任一操作:
MODULE_VERSION
为模块设置CONFIG_MODULE_SRCVERSION_ALL
。srcversion
然后为所有模块生成,包括那些没有MODULE_VERSION
设置的模块:modinfo srcversion:如何从我的源代码生成它?该srcversion
文件仅在上述条件之一成立时才存在。
然后,您可以检查构建.ko
的是否与 insmodded 匹配:
modinfo mymod.ko
当您开发自己的内核模块并在机器之间复制模块时,这是一个非常有用的完整性检查。
从内部模块代码本身与THIS_MODULE
可以使用THIS_MODULE->version
,这里举个例子:Linux内核模块驱动中THIS_MODULE的意义是什么?