通过查询加载的模块或.ko文件,我可以非常方便地找到加载的内核模块的版本。
有没有一种标准的方法来执行此操作而不用挖掘源代码?
答案 0 :(得分:8)
$ 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:
答案 1 :(得分:1)
运行时方法
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上使用this setup进行测试。
<强> version
强>
version
由MODULE_VERSION
宏设置。如果未给出MODULE_VERSION
,则该文件不存在。
<强> srcversion
强>
srcversion
是用于编译内核模块的源代码的MD4哈希值。它是使用https://github.com/torvalds/linux/blob/v4.9/scripts/mod/modpost.c#L1978
要启用它,请执行以下操作:
MODULE_VERSION
CONFIG_MODULE_SRCVERSION_ALL
进行编译。然后为所有模块生成srcversion
,包括未设置MODULE_VERSION
的模块:modinfo srcversion: How do I generate this from my source? srcversion
仅在给出时出现。
然后,您可以检查已构建的.ko
是否与已修改的版本匹配:
modinfo mymod.ko
当您开发自己的内核模块并在计算机之间复制模块时,这是一个非常有用的健全性检查。
来自模块代码内部的THIS_MODULE
您可以使用THIS_MODULE->version
,例如:What is the significance of THIS_MODULE in Linux kernel module drivers?