void __iomem *和void * __iomem之间的区别?

时间:2014-10-29 08:54:32

标签: c linux linux-kernel gcc-warning

我正在使用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中删除此警告。

1 个答案:

答案 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* __iomemvoid __iomem *不一样。后者是通过使用__iomembase指针提供属性而必须完成的方式。