gpt4 book ai didi

init - __init 和 __exit 宏用于内置和可加载模块

转载 作者:行者123 更新时间:2023-12-01 02:33:26 27 4
gpt4 key购买 nike

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

This demonstrates a feature of kernel 2.2 and later. Notice the changein the definitions of the init and cleanup functions. The __init macrocauses the init function to be discarded and its memory freed once theinit function finishes for built−in drivers, but not loadable modules.If you think about when the init function is invoked, this makesperfect sense.

There is also an __initdatawhich works similarly to __init but for init variables rather thanfunctions.

The __exit macro causes the omission of the function whenthe module is built into the kernel, and like__exit, has no effect for loadable modules. Again, if you consider when the cleanup function runs


我明白了;宏 __init一旦内置驱动程序的 init 函数完成,就会导致 init 函数被丢弃并释放其内存。但为什么?不适用于可加载模块?我无法理解它。
我知道这是一件愚蠢的事情,但我想了一段时间,无法完全理解。为什么使用内置驱动程序而不是可加载模块? __init 中分配的变量、地址等两者都需要,对吗?

最佳答案

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

This answer to a question about the nature of __init 为这个主题提供了一些启示。本质上,内核构建系统会查找所有标记为 __init 的函数。 ,跨越内核的所有部分,并安排它们,使它们都在同一个内存块中。

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

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

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

关于init - __init 和 __exit 宏用于内置和可加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com