2014-10-29 267 views
1

我使用sparse linux tool来清除代码中的噪音。假设我有以下文件abc.c定义为结构:void __iomem *和void * __iomem之间的区别?

static struct check1 { 
    void __iomem **base_regs; 
}; 

在同一个文件abc.c。我有以下的代码线以及(设X为正整数):

壳体1:

static struct check1 *check1_var; 
struct check2 { 
    void* __iomem base= check1_var -->base_regs[X]; 
} 

壳体2:

struct check2 { 
    void __iomem *base= check1_var-->base_regs[X]; 
} 

在情况1中,我我收到以下警告

warning: incorrect type in initializer (different address spaces) 

但是,当我切换到第2种情况时,此警告消除。

我的问题是:void __iomem *void* __iomem之间有什么区别。在我看来,他们应该是一样的?请帮我在这里,我没有得到为什么这个警告的情况下遭到移除2.

+0

http://stackoverflow.com/questions/19100536/what-is-the-use-of-iomem-in-linux-while-writing-device-drivers – 2014-10-29 09:03:22

+0

@ ANBU.SANKAR谢谢你在这里分享。但我已经经历了这个,但没有找到我的答案。正如你在'结构check1'看到'base_regs'还标有'__iomem'并在这两个情况下,我分配'__iomem'标记指针则什么区别。 ? – 2014-10-29 09:06:20

+2

@AmitSharma阅读http://lwn.net/Articles/102232/。这显示了类似的讨论https://lkml.org/lkml/2014/9/24/1187。 – iqstatic 2014-10-29 10:08:56

回答

1

正如提到的链接表示,2.6.9内核和更高版本中包含旨在提高内核如何与工作的一系列变化I/O内存。其中第一个是用于标记指向I/O存储器的指针的新的__iomem注释。这些注释与__user标记非常相似,只是它们引用了不同的地址空间。

的定义如下给出:

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

__user,所述__iomem标记用于在内核代码的一个文档的作用;它被编译器忽略。然而,当用稀疏检查代码时,开发人员会看到由代码组成的全新警告,这些代码会将正常指针与__iomem指针混合在一起,或者将这些指针取消引用。

void* __iomemvoid __iomem *是不一样的。后者是通过使用__iomem来完成的,您正在向base指针提供属性。

相关问题