2014-10-29 511 views
1

我使用sparse linux tool來清除代碼中的噪音。假設我有以下文件abc.c定義爲結構:void __iomem *和void * __iomem之間的區別?

static struct check1 { 
    void __iomem **base_regs; 
}; 

在同一個文件abc.c。我有以下的代碼線以及(設X爲正整數):

殼體1:

static struct check1 *check1_var; 
struct check2 { 
    void* __iomem base= check1_var -->base_regs[X]; 
} 

殼體2:

struct check2 { 
    void __iomem *base= check1_var-->base_regs[X]; 
} 

在情況1中,我我收到以下警告

warning: incorrect type in initializer (different address spaces) 

但是,當我切換到第2種情況時,此警告消除。

我的問題是:void __iomem *void* __iomem之間有什麼區別。在我看來,他們應該是一樣的?請幫我在這裏,我沒有得到爲什麼這個警告的情況下遭到移除2.

+0

http://stackoverflow.com/questions/19100536/what-is-the-use-of-iomem-in-linux-while-writing-device-drivers – 2014-10-29 09:03:22

+0

@ ANBU.SANKAR謝謝你在這裏分享。但我已經經歷了這個,但沒有找到我的答案。正如你在'結構check1'看到'base_regs'還標有'__iomem'並在這兩個情況下,我分配'__iomem'標記指針則什麼區別。 ? – 2014-10-29 09:06:20

+2

@AmitSharma閱讀http://lwn.net/Articles/102232/。這顯示了類似的討論https://lkml.org/lkml/2014/9/24/1187。 – iqstatic 2014-10-29 10:08:56

回答

1

正如提到的鏈接表示,2.6.9內核和更高版本中包含旨在提高內核如何與工作的一系列變化I/O內存。其中第一個是用於標記指向I/O存儲器的指針的新的__iomem註釋。這些註釋與__user標記非常相似,只是它們引用了不同的地址空間。

的定義如下給出:

# define __user   __attribute__((noderef, address_space(1))) 
# define __iomem  __attribute__((noderef, address_space(2))) 

__user,所述__iomem標記用於在內核代碼的一個文檔的作用;它被編譯器忽略。然而,當用稀疏檢查代碼時,開發人員會看到由代碼組成的全新警告,這些代碼會將正常指針與__iomem指針混合在一起,或者將這些指針取消引用。

void* __iomemvoid __iomem *是不一樣的。後者是通過使用__iomem來完成的,您正在向base指針提供屬性。

相關問題