__init和__exit宏使用率内置和可加载模块(__init and __exit macros

2019-09-20 06:54发布

我正在读关于Linux内核开发,我只是阅读一些文字,我不明白。 下面是款,其中谈到了__init和__exit宏模块:

这里展示了内核2.2及更高版本的功能。 注意在初始化和清理函数的定义的变化。 在__init宏导致init函数被丢弃的内存被释放,一旦初始化函数完成了内置的驱动程序,但没有可加载模块。 如果你想在调用初始化函数时约,这非常有意义。

还有它的工作方式类似于__init但对于初始化变量,而不是功能的__initdata。

该__exit宏导致功能的省略当模块被编译进内核,和__exit一样,对动态加载模块是无效的。 同样,如果你认为当清理函数运行

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

我知道这是一个愚蠢的事情,但我想过一段时间,不能完全理解它。 为什么内置驱动器而不是可加载模块? 变量,在分配的地址等__init将需要为两个,对不对?

Answer 1:

你是对的; 即使一个模块中有可能是因为你真的不初始化之后需要的功能,这样他们就可以在原则上从内存中删除。 究其原因__init对模块是无效的更多的是这将是多么容易实现。

这回答关于本质问题__init揭示一些关于这个问题光。 从本质上讲,内核构建系统寻找所有与标记功能__init ,在所有的内核块,并安排他们,使他们都将在相同的内存块。

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

这种预排序的想法不使用模块这么好。 初始化代码具有被装载模块时被加载,所以它不能与其它初始化代码空间。 相反,内核就必须挑几百个字节出每个模块的独立和解放他们。

然而,硬件页面大小通常是4KB,所以很难以释放内存在的小于块。 所以,试图释放__init功能每个单独模块中可能是更多的麻烦比它的价值。



文章来源: __init and __exit macros usage for built-in and loadable modules
标签: init exit