我在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))
我无法理解。它是如何工作的。我知道它曾经从映射设备内存中读取一些字节,但不明白它是如何工作的?
我在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))
我无法理解。它是如何工作的。我知道它曾经从映射设备内存中读取一些字节,但不明白它是如何工作的?
它似乎以下列方式工作:
__chk_io_ptr(a)
以检查可用内存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
这实际上什么也没做。