【问题标题】:Meaning of version info in .mod.c file in Linux kernelLinux内核中.mod.c文件中版本信息的含义
【发布时间】:2013-07-29 03:16:41
【问题描述】:

在所有可加载的内核模块中,当给定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" },
...
...
}

【问题讨论】:

    标签: c linux kernel driver


    【解决方案1】:

    __versions 部分包含在所有单独的 *.mod.c 文件中

      CRC         Symbol
    { 0xa6d8dcb5, "module_layout" },
    { 0x16c2b958, "register_netdevice" },
      ...         ...
    

    是符号及其对应 CRC 的列表。这有两个主要用途:

    1. 所有导出符号的全局列表。
    2. 加载ko模块时的模块版本检查。

    模块版本控制背后的原理

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

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

    modpost 工具在 Linux 内核编译期间生成 CRC。它由modpost script 调用。整个过程在Documentation/kbuild/modules.rst:450有详细讲解。

    entire source code of the modpost tool 在 Linux 内核源代码中可用。 add_depends() 是负责在每个 *.mod.c 文件中生成整个 __versions 部分的相关函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      相关资源
      最近更新 更多