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行中含有的數據比存儲器中含有的數據更新。
我們假設此時在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節中重點介紹這些總線事務。
最後更新:2017-04-03 16:48:39