我正在使用sparse linux tool
清除代码中的噪音。假设我在文件abc.c
中定义了以下结构:
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 :(得分: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* __iomem
和void __iomem *
不一样。后者是通过使用__iomem
为base
指针提供属性而必须完成的方式。