我正在阅读有关 linux 内核开发的内容,但我只是阅读了一些我不明白的文字。这是讨论模块的 __init 和 __exit 宏的段落:
这演示了内核 2.2 及更高版本的功能。注意 init 和 cleanup 函数定义的变化。__init 宏会导致 init 函数被丢弃并在 init 函数为内置驱动程序完成后释放其内存,但不是可加载模块。如果您考虑何时调用 init 函数,这是完全合理的。
还有一个 __initdata 与 __init 类似,但用于初始化变量而不是函数。
__exit 宏会在模块内置到内核中时导致函数的省略,并且与 __exit 一样,对可加载模块没有影响。同样,如果您考虑清理功能何时运行
我明白了;__init一旦内置驱动程序的 init 函数完成,宏就会导致 init 函数被丢弃并释放其内存。但为什么?不适用于可加载模块?我无法理解。
我知道这是一件愚蠢的事情,但我想了一段时间,无法完全理解。为什么内置驱动程序而不是可加载模块?__init两者都需要分配的变量、地址等,对吗?
你是对的; 即使在模块中,也可能存在初始化后您确实不需要的函数,因此原则上它们可以从内存中删除。__init对模块没有影响的原因更多是因为它实现起来有多容易。
这个关于性质的问题的答案__init对这个主题有所了解。本质上,内核构建系统会在内核的所有部分中查找所有标记为 的函数__init,并将它们排列起来,以便它们都位于同一内存块中。
然后,当内核启动时,它可以一次性释放那一块内存。
这种预先排序的想法不适用于模块。init 代码必须在加载模块时加载,因此它不能与其他 init 代码共享空间。相反,内核必须从每个模块中挑选几百个字节并单独释放它们。
但是,硬件页面大小通常为 4KB,因此很难以小于该值的块来释放内存。因此,尝试释放__init每个单独模块中的函数可能比它的价值更麻烦。
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |