__user表示是一個(gè)用戶空間的指針,所以kernel不可能直接使用。

#ifdef __CHECKER__
# define __user __attribute__((noderef, address_space(1)))
# define __kernel /* default address space */
#else
# define __user
# define __kernel
#endif

noderef告訴編譯器,不應(yīng)該解除該指針的引用,因?yàn)樵诋?dāng)前地址空間中它是沒(méi)有意義的。

這里的CHECKER表示是否使用了Sprase(就是一種靜態(tài)分析工具,用來(lái)分析內(nèi)核源碼中的BUG)。是不是想研究一下了?呵呵??梢詤⒁?jiàn)http://sparse.wiki./index.php/Main_Page

所以對(duì)于這種變量,在kernel中使用要用到copy_to_user和copy_from_user。

__iomem是2.6.9中加入的特性。是用來(lái)個(gè)表示指會(huì)指向一個(gè)I/O的內(nèi)存空間。主要是為了driver的通用性考慮。由于不同的CPU體系 結(jié)構(gòu)對(duì)I/O空間的表示可能不同。當(dāng)使用__iomem時(shí),compiler會(huì)忽略對(duì)變量的檢查(因?yàn)橛玫氖莢oid __iomem)。但sparse會(huì)對(duì)它進(jìn)行檢查,當(dāng)__iomem的指針和正常的指針混用時(shí),就會(huì)發(fā)出一些warnings。

下面還有一些為個(gè)變量新加入的函數(shù):

    unsigned int ioread8(void __iomem *addr);
    unsigned int ioread16(void __iomem *addr);
    unsigned int ioread32(void __iomem *addr);
    void iowrite8(u8 value, void __iomem *addr);
    void iowrite16(u16 value, void __iomem *addr);
    void iowrite32(u32 value, void __iomem *addr);