首先來看看__user的宏定義:
#ifdef __CHECKER__
# define __user __attribute__((noderef, address_space(1)))
從宏定義可以看出,在配置__CHECKER__宏的條件下,__user宏定義有效,而顯然可以看出宏__CHECKER__是作為檢查機制出現的,所以我們可以推斷宏__user應該是用來檢查錯誤使用。
而事實上也確實如此,它是為了編譯內核/模塊時用 make C=1選項,打開靜態語法檢查工具sparse,來探測可能出現的錯誤。同時也可以看出它對文件的生成並沒有影響,只是用來檢查語法正確性。
進一步研究發現,sparse是一個靜態的C語法檢查工具,Linux下編譯內核或編譯module時,可以附加C=1來調用sparse檢查代碼.
另外,sparse定義了幾個內存空間,sparse針對Linux內核定義了幾個地址空間, kernel空間為默認, user空間為1, io區間為2. 這樣可以檢查訪問地址的代碼是否有問題。包括其中address_space(1)指用戶空間。
例如驅動編寫中,size_t hello_read(struct file *file, char __user *buff, size_t count, loff_t *offp)
{
return 0;
}