在所有可加载的内核模块中,当给出make
时,除了modulename.mod.c
之外,它还会生成一个名为modulename.ko
的文件。
以下代码摘录来自.mod.c
文件,其中包含{number, function}
对。
这个号码有什么意义?这个数字是如何由编译器生成的?
static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {
{ 0xa6d8dcb5, "module_layout" },
{ 0x16c2b958, "register_netdevice" },
{ 0x609f1c7e, "synchronize_net" },
{ 0x90a60c63, "kmem_cache_destroy" },
{ 0x402b8281, "__request_module" },
{ 0x844a8af7, "netdev_info" },
{ 0xdfdb0ee8, "kmalloc_caches" },
{ 0x12da5bb2, "__kmalloc" },
{ 0x92d42843, "cfg80211_cqm_rssi_notify" },
{ 0xc86289e8, "perf_tp_event" },
...
...
}
答案 0 :(得分:4)
所有单个__versions
文件中包含的*.mod.c
部分
CRC Symbol
{ 0xa6d8dcb5, "module_layout" },
{ 0x16c2b958, "register_netdevice" },
... ...
是符号列表及其对应的CRC。这有两个主要用途:
ko
模块时的模块版本检查。模块版本控制由 CONFIG_MODVERSIONS 标记启用,并且 用作简单的ABI一致性检查。 CRC值为满 创建导出符号的原型。当一个模块是 加载/使用,比较内核中包含的CRC值 模块中的类似值;如果它们不相等,那就是内核 拒绝加载模块,因为它表明模块是用它构建的 引用不同版本的Linux内核源代码。
编译成功后,所有导出符号的所有CRC的全局列表都存储在Linux内核源目录的文件Module.symvers
中。本质上,此检查确保从内核模块调用的任何导出符号都存在于模块所期望的相同位置(内核中的偏移量)。
modpost 工具在编译Linux内核期间生成CRC。它由modpost script调用。整个过程在Documentation/kbuild/modules.txt:438详细解释。
Linux内核源代码中提供了entire source code of the modpost tool。 add_depends()
是负责在每个__versions
文件中生成整个*.mod.c
部分的相关函数。