问题:
我经常在 Linux 源代码中看到
__meminit
装饰器放在函数前面。我想知道 __meminit
装饰器是什么意思。
例如。在
arch/x86/mm/init_64.c
:
static 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
但是还是看不懂它的用法
后续问题:
Linux学习者在哪里可以找到这些宏的描述?
不幸的是,Linux 的文档不是很好,阅读源代码和构建直觉仍然是了解其工作原理的主要方式。
__meminit
在linux/init.h中定义为
#define __meminit __section(".meminit.text") __cold notrace \
__latent_entropy
此文件顶部的注释简要说明了
__init
宏如何用于标记仅在初始化期间使用且稍后可以丢弃的函数。__meminit
是 __init
的特殊版本,它标记了在内存初始化期间使用的函数。/* Used for MEMORY_HOTPLUG */
定义之前的注释__meminit
所暗示的那样,它与内存热插拔一起使用。从普通代码调用标有
__XXXinit
的函数通常是不安全的(它可能不再存在)但是如果你正在编写处理内存热插拔的代码,那么你知道内核不会释放 __meminit
函数并且调用它们是安全的(在这种情况下)。
所有
__XXXinit
宏的工作方式相似,它们将函数/变量放在具有特定名称的部分中,以便内核稍后可以释放它。
__meminit
扩展为:
__section(".meminit.text")
。这会将函数放在 .meminit.text
部分中。它只是一个具有标准化名称的普通部分。_cold
扩展到 GCC cold 属性。它告诉 GCC 该函数很少被调用,因此最好针对大小而不是速度优化它。notrace
用于将函数标记为不可追踪。整个机器都涉及到这个答案。__latent_entropy
是一个 GCC 属性,用于(如果启用了必要的插件)使函数将一些(固定的)熵混合到内核“全局熵状态”.你会看到所有这些属性对于初始化函数都是有意义的