`__meminit` 在 Linux 内核中是什么意思?

问题描述 投票:0回答:1

问题

我经常在 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 linux-kernel x86 x86-64 linux-device-driver
1个回答
1
投票

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

__meminit
linux/init.h中定义为

#define __meminit        __section(".meminit.text") __cold notrace \
                          __latent_entropy

此文件顶部的注释简要说明了

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

从普通代码调用标有

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

所有

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

__meminit
扩展为:

你会看到所有这些属性对于初始化函数都是有意义的

© www.soinside.com 2019 - 2024. All rights reserved.