2015-05-14 259 views
4

在我看過wmb()多次的PCI DMA驅動程序之一中。 wmb()函數實際上做了什麼? 某處被提及爲「不傷人的聖水」。這個功能的目的是什麼?什麼是在Linux驅動程序中的wmb()

+4

也許這是一個「寫內存障礙」? https://www.kernel.org/doc/Documentation/memory-barriers.txt – stakx

回答

11

Stakx對你的問題的評論已經指向full answer:的確是一個寫內存屏障。

但是,如果你不是那麼熟悉的概念,該文件可能無法提供關於「爲什麼」的足夠信息。

讓我們假設一個串行端口,在那裏你必須寫字節到某個地址。串行芯片將通過電線發送這些字節。 重要的是你不要搞亂寫 - 他們必須保持秩序或一切都是亂碼。

但以下是不夠的:

*serial = 'h'; 
    *serial = 'e'; 
    *serial = 'l'; 
    *serial = 'l'; 
    *serial = 'o'; 

由於編譯器,處理器,內存子系統以及它們之間的公共汽車被允許重新排序店爲優化(相信我,是的,他們是和是, 他們是這樣)。

所以你必須添加代碼,以確保該商店不糾纏起來。 這就是wmb()宏所做的:防止商店重新排序。

請注意,只是使串行指針變得不穩定:雖然它確保編譯器不會重新排序,但提到的其他機制仍然會造成嚴重破壞。這在another kernel doc piece中有記錄。

對此事的很好看的是Paul McKenney's book,可作爲免費的PDF和付費的死樹的版本。

2

Wmb表示寫入內存屏障。 它在編譯的指令flow.its平臺相關中插入硬件內存障礙。 該功能保證寫入操作的順序。 在執行任何後續寫入之前,wmb()函數完成之前的寫入操作完成。