【问题标题】:Module Programming in linuxlinux中的模块编程
【发布时间】:2013-11-13 09:23:59
【问题描述】:

这里是简单的模块程序代码。

#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */
#include <linux/init.h>     /* Needed for the macros */

static int hello3_data __initdata = 3;

static int __init hello_3_init(void)
{
    printk(KERN_INFO "Hello, world %d\n", hello3_data);
    return 0;
}

static void __exit hello_3_exit(void)
{
    printk(KERN_INFO "Goodbye, world %d\n",hello3_data);
}

module_init(hello_3_init);
module_exit(hello_3_exit);

我已经用__initdata 宏初始化了一个变量,用__init 初始化了一个函数。当我执行insmod 时,模块被插入并且我能够看到日志消息(/var/log/messages)。但是,当我执行rmmod 时,它无法将其删除,并显示为Resource busy

My question is does the `modules_init` function cleans the memory of `hello3_data`??

or it is done by `module_exit`??.  

请有人解释一下。

【问题讨论】:

    标签: linux linux-kernel linux-device-driver embedded-linux


    【解决方案1】:

    请在声明变量hello3_data 时使用__initdata 修饰符,该修饰符指定该变量只能在__init 函数中使用。

    尝试使用make CONFIG_DEBUG_SECTION_MISMATCH=y 之类的选项重新编译您的内核模块,您将看到如下警告:

    警告:/home/pengyu/temp/yusen/test_mod.o(.exit.text+0x3):从函数 cleanup_module() 到变量 .init.data:hello3_data 的引用部分不匹配
    函数 __exit cleanup_module() 引用 变量 __initdata hello3_data.
    这在退出函数中的错误处理时经常看到 在初始化路径中使用功能。
    修复通常是删除 __initdata 注释 hello3_data,因此它可以在 init 部分之外使用。

    您可以简单地删除 __initdata 并重试。

    已编辑:

    在这里,我试图提供进一步的解释。内核模块本身的格式为ELF (Executable and Linkable Format)(带有一些内核模块特定的部分)。 the .init and .fini sections 的功能由包括insmod 在内的链接器和加载器支持。

    在这种情况下,#define __initdata __section(.init.data) 属性的工作方式类似于 __attribute__((section(".init.data"))),它明确指定数据/函数应放入哪个部分。

    作为内核模块,.init 的部分不能保证在模块初始化后保留,并且该部分中的任何内容都不应该在初始化函数之外引用。见Linux Device Drivers, Third Edition第31页:

    定义中的 _init 标记可能看起来有点奇怪;这是对内核的一个提示,即给定函数仅在初始化时使用。模块加载器在加载模块后丢弃初始化函数,使其内存可用于其他用途。仅在初始化期间使用的数据有一个类似的标记 (_initdata)。 __init 和 __initdata 的使用是可选的,但值得一试。请确保不要将它们用于初始化完成后将使用的任何函数(或数据结构)

    【讨论】:

    • 谢谢。这就是我想知道的。顺便说一句,#define __initdata __section(.init.data) 是写在 /linux/init.h 中的,你能详细说明一下吗,内核怎么知道它只能在__init 函数中使用。
    • 非常感谢。这有帮助。!!
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多