Linux 内核中的“__meminit”是什么意思?

Tro*_*ing 4 linux x86 x86-64 linux-device-driver linux-kernel

问题

我经常__meminit在 Linux 源代码中看到装饰器放在函数前面。我想知道__meminit装饰器是什么意思。

例如。在arch/x86/mm/init_64.cstatic void __meminit remove_pagetable(unsigned long start, unsigned long end, bool direct, struct vmem_altmap *altmap)

尝试

我尝试查看宏的定义,例如

/* Used for MEMORY_HOTPLUG */
#define __meminit        __section(.meminit.text) __cold notrace \
                          __latent_entropy
Run Code Online (Sandbox Code Playgroud)

但还是无法理解它的用法。

后续问题:

Linux 学习者在哪里可以找到此类宏的描述?

Mar*_*oom 7

不幸的是,Linux 没有很好的文档记录,阅读源代码和构建直觉仍然是了解其工作原理的主要方法。

__meminit在linux/init.h中定义为

#define __meminit        __section(".meminit.text") __cold notrace \
                          __latent_entropy
Run Code Online (Sandbox Code Playgroud)

该文件顶部的注释简要解释了如何__init使用宏来标记仅在初始化期间使用且稍后可以丢弃的函数。
__meminit是 的专门版本__init,它标记了在内存初始化期间使用的函数。正如定义之前的
注释所暗示的那样,它与内存热插拔一起使用。 据推测,如果启用内存热插拔,内核将不会释放内存初始化函数,因为这些函数随时都可能需要(例如,插入新的 DIMM 时)。但它仍然会释放其他初始化函数。/* Used for MEMORY_HOTPLUG */__meminit

从普通代码中调用标记为 的函数通常是不安全的__XXXinit(它可能不再存在),但如果您正在编写处理内存热插拔的代码,那么您知道内核不会释放__meminit函数并且它是安全的打电话给他们(在这种情况下)。

所有__XXXinit宏的工作原理都类似,它们将函数/变量放在具有特定名称的部分中,以便内核稍后可以释放它。

__meminit扩展到:

您会发现所有这些属性对于初始化函数都有意义