0

我在http://lxr.free-electrons.com/source/arch/arm/include/asm/io.h?v=3.1;a=arm的 linux 内核代码中找到了以下代码

#define __raw_readl(a)          (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))

我无法理解。它是如何工作的。我知道它曾经从映射设备内存中读取一些字节,但不明白它是如何工作的?

4

1 回答 1

1

它似乎以下列方式工作:

  1. 调用__chk_io_ptr(a)以检查可用内存
  2. unsigned int通过取消引用指针从内存中读取。

我想你使用这个宏的方式如下:

unsigned int data = __raw_readl(a);

通过预处理器,它被替换为:

unsigned int data =  (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a));

因此,作为data存储unsigned long值中的逗号运算符的结果由a.

编辑:似乎__chk_io_ptr(a)是根据this的宏。

#define __chk_io_ptr(x) (void)0

这实际上什么也没做。

于 2013-08-21T09:12:01.130 回答