NVDIMM原理與應用之二:X86 Cache 管理的幾種模式

weixin_33766168發表於2017-11-09

X86 Cache 管理的幾種模式


為了應對不同的應行場景,X86體系結構提供了多種維護cache一致性的模式和硬體機制。這些應用模式包括write back/write combing/write through/uncache,而和此相關的硬體包括store buffer, write combing buffer, MMTR,CR暫存器等。準確理解上面四種cache模式的差異,瞭解實現過程中的涉及到的不同硬體的模組,能夠幫助工程師加深對系統結構的認識,從而能夠針對 具體的應用,比如NVDIMM/NTB/SSD等,選擇最合適的 等裝置的cache模式。


1. store buffer


為了提高效能,允許記憶體寫操作在真正執行完之前指令能夠返回,X86處理器能夠把對記憶體的寫操作都臨時儲存到一個store buffer裡面去。這個store buffer經常和指令執行部件關聯在一起,它能夠暫存對記憶體的讀寫,這樣處理器就不用等真正的讀寫返回了。此外處理器還能自動保證序的正確性。當出現下面的情況下,硬體自動把store buffer裡面的東西drain to memory:

  • 中斷;


  • 記憶體屏障;


  • LOCK操作;


  • MFENCE/SFENCE;


  • IO操作


  • 順序指令


2.catch line


當處理器接受到從記憶體讀的運算元剛好是可以cache的時候,處理器會從記憶體中讀出長為cache line的資料到物理的cache line上去。


3.write combing/write through/write back/write protect的區別


3.1 write combiling:

讀寫沒有cache,只是先寫到了writing combing buffer,硬體不會自己維護memory一致性,對一致性有要求的軟體必須留意到寫往可WC的記憶體會出現延遲,並且如果對一致性有要求必須清空write combing buffer。注意write combing buffer  不同於L1/L2/L3 cache和store buffer,它只在WC模式下才會用到。它會在下面的情況下被硬體清空:

  • SFENCE/MFENCE指令


  • CPUID指令;


  • 讀寫uncache的記憶體區域;


  • 中斷;


  • 執行LOCK指令






在write combiling模式下,猜測讀是允許的, 寫操作可能會延遲,因為它可能會被合併到writing bffer裡面去,直到後面的序列化指令例如(SFENCE,MFENCE,CPUID, read/write uncached memory,an interrupt, or LOCK instruction)出現。這種write combining 模式適合視訊記憶體空間。


3.2 write though

讀寫可合併;寫命中時:既到cache,又到記憶體,然後返回;寫回記憶體時,invalid的cache沒有catch fill,valid的cache有catch fill或者被invalid;


3.3 write back

讀寫可合併;寫命中時:先到cache, 在需要釋放它的cache line(比如cache full)時再寫回記憶體;寫不命中時,到記憶體,然後進行cache fill。


3.4 Write protect

寫擴大到系統匯流排,並導致匯流排上的所有處理器相應的cache line都被invalid.


3.5 uncached 

如果用unreached模式,只需要disable cache就可以,下面的步驟可以disablecache:

  • 設定CR0上的CD為1, NW flag = 0;



  • disable MTRRs 且設定預設的記憶體型別是uncached(或者用MTRR設定所有的記憶體區域是uncache的)。


注意MTRR和OS 頁表/頁目錄表之間的優先順序及關係:


BIOS設定了好全域性的MTRR表格之後,核心還是可以通過頁表和頁目錄表進行修改。

為了維護cache一致性,需要用wbinvd命令,寫回並無效所有的L1/L2/L3 Cache。


4. WBINVD和CFLUSH的區別


WBINVD:寫回所有內部cache的有改動的cache line,然後無效L1/L2/L3級cache的內容


CFLUSH:把指定cache line裡面的資料flush到記憶體,然後釋放相應的cache line,這條指令提供了使用者顯示地釋放cache空間的介面,特別當使用者確定當前cache裡面的內容暫時不會再訪問到的時候可以用CFLUSH來釋放cache line給其他資料用。
















本文轉自儲存之廚51CTO部落格,原文連結:http://blog.51cto.com/xiamachao/1746123 ,如需轉載請自行聯絡原作者




相關文章