在Linux内核,compiler.h中,我找到了__iomem
# define __iomem __attribute__((noderef, address_space(2)))
然后我知道__attribute__(())
是GCC的延伸。
但我无法在GCC.GNU.Org中找到noderef或address_space的引用
答案 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年前问这个问题的,那么您可能会发现情况确实如此。