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

4
问题

我经常在 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学习者在哪里可以找到这些宏的描述?

1个回答

6

不幸的是,Linux 的文档并不是很完善,阅读源代码和建立直觉仍然是学习其工作原理的主要方式。

__meminitlinux/init.h 中被定义为:

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

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

通常情况下,从普通代码调用标记有__XXXinit的函数是不安全的(它可能已不存在),但如果您正在编写处理内存热插拔的代码,则知道内核不会释放__meminit函数,并且可以安全地调用它们(在此上下文中)。

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

__meminit 展开为:

你可以看到,所有这些属性都对于一个初始化函数来说是有意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接