我正在阅读有关linux内核开发的内容,我刚刚读了一些我不明白的文字。以下段落讨论了模块的 __init 和 __exit 宏:
这演示了内核 2.2 及更高版本的一个功能。注意变化
在 init 和 cleanup 函数的定义中。 __init 宏
导致 init 函数被丢弃并释放其内存。
init 函数完成内置驱动程序,但不完成可加载模块。
如果您考虑一下 init 函数何时被调用,这使得
完美的感觉。
还有一个 __initdata
其工作方式与 __init 类似,但针对的是 init 变量而不是
功能。
__exit 宏会导致函数在以下情况下被省略:
该模块内置于内核中,就像
__exit,对可加载模块没有影响。同样,如果您考虑清理函数何时运行
我明白了;宏观__init
一旦内置驱动程序的 init 函数完成,就会导致 init 函数被丢弃并释放其内存。但why?不适用于可加载模块?我无法理解它。
我知道这是一件愚蠢的事情,但我想了一会儿却无法完全理解。为什么是内置驱动程序而不是可加载模块?变量、地址等分配在__init
两者都需要,对吗?
你说得对;即使在模块中,也可能存在初始化后实际上不需要的函数,因此原则上可以将它们从内存中删除。原因__init
对模块没有影响更多的是关于它的实现容易程度。
这是对有关性质的问题的回答__init https://stackoverflow.com/a/8832142/460258阐明了这个主题。本质上,内核构建系统会查找所有标记为的函数__init
,跨越内核的所有部分,并对它们进行排列,以便它们都位于同一内存块中。
然后,当内核启动时,它可以一次性释放这块内存。
这种预排序的想法对于模块来说不太适用。加载模块时必须加载init代码,因此它不能与其他init代码共享空间。相反,内核必须从每个模块中挑选几百个字节并单独释放它们。
然而,硬件页面大小通常为 4KB,因此很难以小于该大小的块释放内存。所以试图释放__init
每个单独模块中的功能可能比它的价值更麻烦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)