在使用這兩個函數的時候,想了想他們之間的不同,從函數的功能來看,他們都是在驅動代碼中讀虛擬地址。但是通過他們的實現的源碼,可以看到,他們之間是有不同的;
在ARM架構下他們的實現:
#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a))
#define ioread32(p) ({ unsigned int __v = le32_to_cpu((__force __le32)__raw_readl(p)); __v; })
___raw_readl() 不進行端序的檢查,ioread32()會檢查體系機構的端序。其中__force作用如下:
# define __force __attribute__((force))
表示所定義的變量類型是可以做強制類型轉換的,在進行Sparse分析的時候,使其不用產生告警信息。