5

我正在阅读有关 linux 内核开发的信息,但我只是阅读了一些我不理解的文本。以下是关于模块的 __init 和 __exit 宏的段落:

这演示了内核 2.2 及更高版本的一个特性。注意 init 和 cleanup 函数定义的变化。__init 宏会导致 init 函数被丢弃并在 init 函数完成后释放其内存以用于内置驱动程序,但不是可加载模块。如果您考虑一下何时调用 init 函数,这很有意义。

还有一个 __initdata,其工作方式与 __init 类似,但用于初始化变量而不是函数。

__exit 宏在模块内置到内核时会导致函数的省略,并且与 __exit 一样,对可加载模块没有影响。同样,如果您考虑清理功能何时运行

我明白了;__init一旦内置驱动程序的 init 函数完成,宏会导致 init 函数被丢弃并释放其内存。但是为什么?不适用于可加载模块?我无法理解它。

我知道这是一件愚蠢的事情,但我想了一段时间,无法完全理解。为什么使用内置驱动程序而不是可加载模块?__init两者都需要分配的变量,地址等,对吗?

4

1 回答 1

5

你是对的; 即使在模块中,也可能存在初始化后您确实不需要的功能,因此原则上可以将它们从内存中删除。__init对模块没有影响的原因更多是因为它实现起来有多容易。

对有关性质的问题的回答__init为该主题提供了一些启示。本质上,内核构建系统在内核的所有部分中查找所有标记为 的函数__init,并将它们安排在同一个内存块中。

然后,当内核启动时,它可以一次性释放这块内存。

这种预先排序的想法不适用于模块。加载模块时必须加载初始化代码,因此它不能与其他初始化代码共享空间。相反,内核必须从每个模块中挑选几百个字节并单独释放它们。

但是,硬件页面大小通常为 4KB,因此很难以小于 4KB 的块释放内存。因此,尝试释放__init每个单独模块中的功能可能比它的价值更麻烦。

于 2012-07-26T14:50:54.450 回答