我在哪里可以找到gcc扩展属性的引用

时间:2016-12-06 04:20:57

标签: c linux gcc kernel

在Linux内核,compiler.h中,我找到了__iomem

的定义

# define __iomem __attribute__((noderef, address_space(2)))

然后我知道__attribute__(())是GCC的延伸。 但我无法在GCC.GNU.Org中找到noderef或address_space的引用

我只在manual page of sparse

中找到address_space是扩展属性

2 个答案:

答案 0 :(得分:0)

“#define iomem __attribute ((noderef,address_space(2)))”

浏览互联网我可以找到以下详细信息:

“iomem”意味着两件事:它意味着稀疏应该抱怨 如果指针被直接解除引用(它是一个“noderef”指针), 它位于“地址空间2”而不是普通地址空间(0)。

此address_space(2)或address_space(0)表示用于区分内核空间或用户空间或iomem,如cpu ring 0到ring 3。

有关详细信息,请访问以下链接: -

What is the use of __iomem in linux while writing device drivers?

答案 1 :(得分:0)

我最近在Linux Kernel来源中遇到了这个问题,也感到困惑。追踪答案并非最简单,我正在为这个问题提供答案,希望将来有人会看到答案的真实性,而不会在评论中错过答案。

正如@MarcGlisse正确说明的那样,您在GCC文档中找不到 noderef 或_address_space_,因为它们不是GCC属性。它们仅对Sparse有意义。这就是为什么这样定义__iomem之类的原因

#ifdef __CHECKER__
#define __iomem __attribute__((noderef, address_space(2)))
#else
#define __iomem
#endif

在“常规”编译下,已定义了宏,但实际上忽略了该宏。如果启用了“稀疏”检查器,则会对其进行仔细检查。

@alk前段时间通过提供指向此LKML article的链接进行了评论,其中Linus对此进行了很好的解释。我首先浏览了在Linux Questions thread中于2006年问到的这篇文章中的链接。奇怪的是,我的浏览器出于“安全原因”拒绝打开该链接,因此我不得不在LKML档案中找到困难的方法。

我希望这有助于了解正在发生的事情。既然您是在大约2.5年前问这个问题的,那么您可能会发现情况确实如此。