Tro*_*ing 4 linux x86 x86-64 linux-device-driver linux-kernel
问题:
我经常__meminit在 Linux 源代码中看到装饰器放在函数前面。我想知道__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
Run Code Online (Sandbox Code Playgroud)
但还是无法理解它的用法。
后续问题:
Linux 学习者在哪里可以找到此类宏的描述?
不幸的是,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扩展到:
__section(".meminit.text")。这会将函数放置在该.meminit.text部分中。它只是一个具有标准化名称的普通部分。_cold 扩展到GCC冷属性。它告诉 GCC 该函数很少被调用,因此最好针对大小而不是速度来优化它。notrace用于将函数标记为不可 ftraceable。为了适应这个答案,整个机制有点复杂。__latent_entropy是一个 GCC 属性(如果启用了必要的插件),使函数将一些(固定)熵混合到内核“全局熵状态”中。您会发现所有这些属性对于初始化函数都有意义
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |