Linux内核中.mod.c文件中版本信息的含义

Linux内核中.mod.c文件中版本信息的含义,c,linux,kernel,driver,C,Linux,Kernel,Driver,在所有可加载的内核模块中,当给出make时,除了modulename.ko之外,它还会生成一个名为modulename.mod.c的文件 以下代码摘录自.mod.c文件,该文件包含{number,function}对。 这个数字的意义是什么?编译器是如何生成这个数字的 static const struct modversion_info ____versions[] __used __attribute__((section("__versions"))) = { { 0xa

在所有可加载的内核模块中,当给出
make
时,除了
modulename.ko
之外,它还会生成一个名为
modulename.mod.c
的文件

以下代码摘录自
.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" },
...
...
}

包含在所有单个
*.mod.c
文件中的
\u版本
部分

  CRC         Symbol
{ 0xa6d8dcb5, "module_layout" },
{ 0x16c2b958, "register_netdevice" },
  ...         ...
是符号及其对应的CRC的列表。这有两个主要用途:

  • 所有导出符号的全局列表
  • 加载模块时检查模块版本控制

  • 模块版本控制背后的基本原理 模块版本控制由CONFIG_MODVERSIONS标记启用,并且 用作简单的ABI一致性检查。完整值的CRC值 将创建导出符号的原型。当一个模块 加载/使用时,将内核中包含的CRC值与 模块中的相似值;如果它们不相等,内核 拒绝加载模块,因为这表明模块是用 参考不同版本的Linux内核源代码

    编译成功后,所有导出符号的所有CRC的全局列表存储在Linux内核源目录中的文件
    Module.symvers
    中。本质上,此检查确保从内核模块调用的任何导出符号都存在于模块预期的相同位置(内核中的偏移量)

    modpost工具在编译Linux内核期间生成CRC。它被调用。整个过程将在下一页详细说明

    Linux内核源代码中提供了。是负责在每个
    *.mod.c
    文件中生成整个
    \u版本
    部分的相关函数