2012-11-08 43 views
4

86/x86-64的暴露MTRR(記憶型範圍寄存器),其可以是指定的用於不同用途的物理地址空間(例如,可緩存的,不可改變,Writecombining等)不同的部分是有用的。MTRR寄存器如何實現?

我的問題是被任何人知道如何將這些限制在由MTRRs定義的物理地址空間在硬件中執行?在每個內存訪問,那麼硬件檢查物理地址是否屬於在給定範圍之前的過程決定是否應該查找緩存或查找的writecombining緩衝或直接發送給內存控制器?

感謝

回答

5

維基說文章MTRR在於:

較新的(主要是64位)的x86 CPU支持稱爲頁面屬性表,允許對這些每個表的設置更先進的技術,模式,而不是具有低粒度的有限數量的寄存器

因此,對於較新的x86/x86_64的CPU的,可以說,可以MTRR作爲附加技術PAT來實現(帕ge屬性表)。其中PAT被存儲在存儲器中的地方是頁表,並在TLB表存儲它們的CPU(緩存)在(在頁表條目,或PTE一些比特)(它是MMU一部分)。 TLB(和MMU)已經是每個內存訪問訪問的地方。我想,這可能是控制的存儲器類型的好地方,即使MTRR(?)

但是,如果我停止猜測,並會打開RTFM什麼書?有一本關於x86世界的非常好的書:Unabridged Pentium 4:IA32 Processor Genealogy(ISBN-13:978-0321246561)。第7部分,第24章「Pentium Pro軟件增強」,「增加了MTRR」部分。

有在582-584頁每MTRR內存類型長的規則,但所有5種(不可緩存= UC的規則,寫結合= WC,直寫式= WT,寫保護WP =,直寫返回= WB)開始於:「執行高速緩存查找」。

而在第9部分「奔騰III」第32章「奔騰III至強」一書清楚地指出:

當它必須執行存儲器存取,所述處理器協商兩個MTRRs和所選擇的PTE或PDE來確定記憶類型(以及因此遵循的行爲規則)。

但是從另一側... WRMSR成MTRR暫存器將(根據Intel說明書 「instruct32.chm」)無效TLB:

當WRMSR指令用於寫入的MTRR中,TLB的都無效,包括全局條目(請參閱「轉換後備緩衝器(TLB)」中的IA-32英特爾(R)體系結構軟件開發人員手冊,卷第3章3)。

而且還有一個直接在暗示「英特爾64和IA-32架構軟件開發者手冊,卷3A」,節「10.11.9大頁面注意事項」:

的MTRRs提供存儲器爲有限數量的區域打字,這些區域具有4 KB的粒度(與4 KB頁面的粒度相同)。 給定頁面的內存類型緩存在處理器的TLB中。

你問:

在每個內存訪問,那麼硬件檢測的物理地址是否在給定範圍落在

號每次存儲器訪問是不是所有MTRRs比較。當PTE加載到TLB中時,所有MTRR範圍都預先與PTE的內存位組合在一起。那麼唯一檢查內存類型的地方是TLB行。檢查每個存儲器訪問的TLB是否爲。

是否應該查找緩存或查找的writecombining緩衝或將其發送給內存控制器直接

沒有,有一些東西我們沒有了解清楚。高速緩存尋找每一次訪問,即使是UC(例如,如果地區只是變成UC,可以有應該被驅逐的緩存副本)。

從第24章(其爲約奔騰4):從可高速緩衝存儲

荷載 ,處理器被允許從高速緩存的類型的存儲器是WP,WT和WB存儲器(如定義由MTRR和PTE或PDE)。

當內核調度一個負載拖把時,拖把被放置在爲Allocator階段保留的加載緩衝區中。然後,將內存中的數據讀取請求被髮送到L1數據緩存爲滿足:

  1. 緩存是否包含所請求的讀數據線的副本,讀取的數據被放置在負載緩衝。
  2. 如果高速緩存查找導致未命中,則請求會向上轉發到L2高速緩存。
  3. 如果L2高速緩存具有包含請求的讀取數據的扇區副本,則讀取數據立即放入加載緩衝區,並將該區段複製到L1數據高速緩存中。
  4. 如果高速緩存查找導致未命中,則請求會上傳到L3高速緩存(如果存在)或FSB接口單元。
  5. 如果L3緩存具有包含請求的讀取數據的扇區的副本,則讀取的數據立即放入加載緩衝區,並將該扇區複製到L2緩存和L1數據緩存中。
  6. 如果頂層高速緩存中的查找導致未命中,則將請求轉發到FSB接口單元。
  7. 當扇區從內存中返回時,讀取的數據立即放入加載緩衝區,扇區被複制到L3緩存(如果存在的話),L2緩存和L1數據緩存中。

處理器核心被允許推測地執行從WC,WP,WT或WB存儲器空間讀取數據從不可緩存的存儲器

荷載負荷 的不可緩存的存儲器類型是UC和WC(如MTRR和PTE或PDE所定義)。

當內核調度一個加載拖把時,讀取請求被放置在加載緩衝區中,該緩衝區在分配器階段爲其保留。內存數據讀取請求也被提交給處理器的高速緩存。在高速緩存命中的情況下,高速緩存行將從高速緩存中逐出。該請求被髮送到FSB接口單元。內存數據讀取事務在FSB上執行,以從內存中僅提取請求的字節。當數據從內存中返回時,讀取的數據立即放入加載緩衝區。

處理器核不允許推測執行讀取從UC存儲器空間數據

存儲對UC存儲器 UC是兩個不可緩存的存儲器類型中的一個(另一個是WC存儲器類型)的負載。當執行存儲到UC存儲器時,它會在Allocator階段爲其保留的存儲緩衝區中發佈。存儲到UC內存的數據也會提交給L1數據緩存,L2緩存或L3緩存(如果有的話)。在發生緩存命中的情況下,該行將從緩存中逐出。

當含有商店UC存儲器存儲緩衝器轉發到FSB接口單元,存儲器數據寫入事務...是在FSB

商店進行WC存儲器 的WC存儲器類型是非常適合的是具有以下特徵的存儲器的區域(例如,視頻幀緩衝器):

  • 處理器不從WC存儲器高速緩存中。
  • 允許從WC內存推測執行負載。
  • 存儲到WC存儲器的內容存儲在處理器的Write Combining Buffers(WCB)中。
  • 每個WCB可以容納一行(64字節的數據)。
  • 由於對一行WC存儲空間執行存儲,所以這些字節在分配給WCB的WCB中進行累計,以便將寫入操作記錄到該行內存空間。
  • 後續存儲到WCB中的某個位置可以覆蓋較早存儲到該位置的該位置的一個字節。換句話說,對同一位置的多次寫入都會摺疊,以便位置反映寫入該位置的最後一個數據字節。
  • 當WCB通過FSB最終轉儲到外部存儲器時,數據不一定按照執行早期編程存儲的相同順序寫入存儲器。被寫入的設備必須能夠容忍這種類型的行爲(即它必須正常工作)。有關更多信息,請參閱第105頁上的「WCB FSB事務」。

存儲對WT存儲器

當商店可緩存,直寫式存儲被執行。該商店被髮布在Store緩衝區中,該緩衝區被保留用於Allocator階段。另外,商店被提交給L1數據緩存進行查找。有以下幾種可能性: *如果存儲點擊在數據緩存中,緩存中的行會更新,但它保持S狀態(表示該行有效)。 *如果商店錯過了數據高速緩存,它將被轉發到L2高速緩存並執行查找: * - 如果它在L2高速緩存中的一條線上命中,該行會更新,但仍保持S狀態(這意味着該行是有效的)。 * - 如果未命中L2緩存並且沒有L3緩存,則不會採取進一步的操作。