天天看點

3.3.4 PCI裝置進行DMA寫時發生Cache命中

如果pci裝置通路的位址在某個cpu的cache行中命中時,可能會出現三種情況。

第一種情況是命中的cache行其狀态為e,即cache行中的資料與存儲器中的資料一緻;而第二種情況是命中的cache行其狀态為s。其中e位為1表示該資料在smp處理器系統中,有且僅有一個cpu的cache中具有資料副本;而s位為1表示在smp處理器系統中,該資料至少在兩個以上cpu的cache中具有資料副本。

當cache行狀态為e時,這種情況比較容易處理。因為pci裝置(通過host主橋)寫入存儲器的資訊比cache行中的資料新,而且pci裝置在進行dma寫操作之前,存儲器與cache中資料一緻,此時cpu僅需要在snoop phase使無效(invalidate)這個cache行,然後fsb總線事務将資料寫入存儲器即可。當然如果fsb總線事務可以将資料直接寫入cache,并将cache行的狀态更改為m,也可提高dma寫的效率,這種方式的實作難度較大,第3.3.5節将介紹這種優化方式。

cache行狀态為s時的處理情況與狀态為e時的處理情況大同小異,pci裝置在進行寫操作時也将資料直接寫入主存儲器,并使無效狀态為s的cache行。

第三種情況是命中的cache行其狀态為m(modified),即cache行中的資料與存儲器的資料不一緻,cache行中儲存最新的資料拷貝,主存儲器中的部分資料無效。對于smp系統,此時有且僅有一個cpu中的cache行的狀态為m,因為mesi協定規定存儲器中的資料不能在多個cpu的cache行中的狀态為m。

我們假定一個處理器的cache行長度為32b,即256b。當這個cache行的狀态為m時,表示這個cache行的某個位元組、雙字、幾個雙字、或者整個cache行中的資料比主存儲器中含有的資料新。

假設host主橋通路的位址,在snoop phase,通過cpu進行總線監聽後,發現其對應的cache行狀态為m。此時host主橋進行存儲器寫操作時,處理情況較為複雜,此時這些狀态為m的資料需要回寫到主存儲器。

我們考慮如圖3?8所示的執行個體。假定處理器的cache使用回寫(write-back)政策進行更新。在這個執行個體中,host主橋對存儲器的某個位址進行寫操作,而所有cpu通過fsb總線進行總線監聽時發現,host主橋使用的這個目的位址在某個cpu的cache行命中,此時這個cpu将置hitm#信号為0,并置hit#信号為1,表示目前cache行中含有的資料比存儲器中含有的資料更新。

3.3.4 PCI裝置進行DMA寫時發生Cache命中

我們假設此時在cache行中,陰影部分的資料比存儲器中的資料新,而其他資料與存儲器保持一緻,即在這個cache行中第0~3個雙字的資料是目前處理器系統中最新的資料,而第4~7個雙字中的資料與存儲器保持一緻。

如果pci裝置向存儲器寫的資料區域可以完全覆寫這些陰影部分,如對第0~5個雙字進行寫操作時,這種情況不難處理。此時cpu隻需在總線監聽階段,将這個cache行使無效,然後将資料寫入存儲器即可。因為完成這個存儲器寫操作之後,pci裝置寫入的資料是最新的,而且這個最新的資料将完全覆寫在cache行中陰影部分的資料,是以cpu隻需要簡單地将這個cache行使無效即可。

然而pci裝置(host主橋)無法預先知道這些cache行中的資料哪些是有效的,哪些是無效的,而僅知道命中了一個“被修改過”的cache行,進而pci裝置(host主橋)無法保證能夠對cache行中有效資料進行覆寫。是以pci裝置對存儲器進行寫操作時,不能簡單地使無效(invalid)狀态位為m的cache行。

我們仍然以圖3?8為例,考慮一個pci裝置将4個雙字(第4~7個雙字)的資料寫入到一個存儲器中,這4個雙字所通路的資料在某個cpu的cache行中命中,而且該cache行的狀态為m,而且這個cache行的前4個雙字曾被處理器修改過。

此時cpu對fsb總線監聽時,不能簡單将目前cache行使無效,因為這個使無效操作将丢失陰影部分的有效資料。這個陰影部分中的有效資料并沒有被pci裝置重新寫入,是以在整個處理器系統中,這個陰影部分仍然包含最新的資料。将最新的資料丢棄顯然是一種錯誤做法,将會導緻處理器系統的崩潰。

為此host主橋需要專門處理這種情況,不同的host主橋采用了不同的方法處理這種情況,但無外乎以下三種方法。

(1)      cpu進行總線監聽後發現,host主橋通路的資料命中了一個狀态位為m的cache行,此時存儲器控制器将通知host主橋重試或者延時處理,并暫時停止host主橋發起的這次存儲器寫操作。随後cpu将狀态位為m的cache行與存儲器進行同步後,再使無效這個cache行。之後host主橋在合适的時機,重新發起被host主橋要求重試的總線事務,此時cpu再次進行總線監聽時不會再次出現cache命中的情況,是以host主橋可以直接将資料寫入存儲器。許多host主橋使用這種方法處理pci裝置的存儲器寫總線事務。

(2)      首先host主橋将接收pci裝置進行dma寫的資料,并将這些資料放入存儲器控制器的一個緩沖區中,同時結束pci裝置的存儲器寫總線事務。之後cpu進行總線監聽,如果cpu發現host主橋通路的資料命中了一個狀态位為m的cache行時,則這個cache行放入存儲器控制器的另一個緩沖區後,使無效這個cache行。最後存儲器控制器将這兩個緩沖區的資料合并然後統一寫入到存儲器中。

(3)      host主橋并不結束目前pci總線周期,而直接進行總線監聽,如果cpu進行總線監聽發現host主橋通路的資料命中了一個狀态位為m的cache行時,則将這個cache行整體寫入存儲器控制器的緩沖區後使無效這個cache行,之後host主橋開始從pci裝置接收資料,并将這些資料直接寫入這個緩沖區中。最後host主橋結束pci裝置的存儲器寫總線周期,同時存儲器控制器将這個緩沖區内的資料寫入存儲器。

以上這幾種情況是pci裝置進行存儲器寫時,host主橋可能的處理情況,其中第1種方法最常用。而x86處理器使用的implicit writeback方式,與第2種方法基本類似。第3種方法與第2種方法并沒有本質不同。

但是如果pci裝置對一個或者多個完整cache行的存儲器區域進行寫操作時,上述過程顯得多餘。對完整cache行進行寫操作,可以保證将cache行對應的存儲器區域完全覆寫,此時cache行中的資料在pci裝置完成這樣的操作後,在處理器系統中将不再是最新的。pci裝置進行這樣的存儲器寫操作時,可以直接将資料寫入存儲器,同時直接使無效狀态為m的cache行。

pci總線使用存儲器寫并無效(memory write and invalidate)總線事務,支援這種對一個完整cache行進行的存儲器寫總線事務。pci裝置使用這種總線事務時,必須要事先知道目前處理器系統中cpu使用的cache行大小,使用這種總線事務時,一次總線事務傳遞資料的大小必須以cache行為機關對界。為此pci裝置必須使用配置寄存器cache line size儲存目前cache行的大小,cache line size寄存器在pci配置空間的位置見圖2?9。

存儲器讀(memory read)、存儲器多行讀(memory read multiple)和存儲器單行讀(memory read line)總線事務也是pci總線中的重要總線事務,這些總線事務不僅和cache有關,還和pci總線的預讀機制有關,本篇在第3.4.5節中重點介紹這些總線事務。