我在某些操作系统内核中看到以下代码。但我不明白__section
的使用方式,也不知道这段代码的意思。
#define KEEP_PAGER(sym) \
extern const unsigned long ____keep_pager_##sym; \
const unsigned long ____keep_pager_##sym \
__section("__keep_meta_vars_pager") = (unsigned long)&sym
答案 0 :(得分:3)
它的特定Linux内核C macro definition包围GCC extension,指定atttribute to use for an object。这是编写 部分 属性定义的较短方式
历史上,linux内核已经written specifically for building with the GCC compiler,并广泛使用低级扩展来进行特定的硬件操作和优化。
部分 属性专门用于确定用其标记的对象的存储位置。 ELF binary format将目标文件排列到命名的部分中,使用这样的属性允许程序员更精确地指定标记对象的信息放在目标对象中的位置
多年来,我们一直致力于提高不同编译器之间这些编译器扩展的兼容性,并使Linux可以与其他编译器进行编译(如果你看{4}},你可以使用#39} ; ll看到它充满了各种编译器功能的条件指令。像这样的宏可以是一种有用的方法,可以在不同的编译器实现中为低级功能提供可移植的内部API。
内核和内核驱动程序C代码非常关注物理硬件实现的直接细节,需要以应用程序级C代码很少的方式明确编译器二进制输出。
Linux内核使用命名部分的原因的一个例子是the linux header file where the macro is defined - 仅在启动期间使用的函数和数据被分组到一段内存中,一旦启动完成就可以轻松释放 - 你可以熟悉启动消息,以及释放未使用的内核内存:...'接近linux启动序列的末尾
答案 1 :(得分:0)
很难说__section
完全没有它的定义,但可能是变量“section”属性。它用于将编译器放置变量放入与“bss”或“data”不同的部分。有关详细信息,请参阅GCC documentation。