2013-02-27 80 views
0

假設我有一個8字節的long pointer到我的程序物理內存中的內存位置。我的程序很小,完全可以放入緩存中。該計劃很簡單。它簡單地通過mmap()調用映射/dev/mem中的物理內存中的任意內存位置,通過該8字節長指針讀取並寫回該位置。但是,該位置離我的程序駐留在物理內存中的位置很遠,因此,L1/L2緩存無法覆蓋該地址。當CPU寫入不在緩存中的內存位置時,CPU會做什麼?

根據文章獲得物理與存儲(由古斯塔沃·杜阿爾特寫的,我不能鏈接),存儲器寫入時有一個存儲單元中的緩存行已準備好被寫入RAM只發生

通常,內核將所有RAM存儲器視爲回寫,這會產生最佳性能 。在回寫模式下,內存訪問單元爲高速緩存行 ,Core 2中有64個字節。如果程序在內存中讀取單個字節 ,則處理器會將包含該字節的整個高速緩存行加載到L2中,並且L1緩存。當程序寫入內存時, 處理器僅修改緩存中的行,但不更新主內存。後來,當有必要發佈修改後的 線公交車,整個高速緩存行是在一次

書面但如果作爲目標的存儲器位置不在緩存中(正如我上面所描述的)東西,將它立即寫入?

回答

1

您引用的參考文獻解釋了在這種情況下會發生什麼 - 如果內存地址最近未被訪問,並且尚未加載到高速緩存行中,則您讀到該位置將導致該內存中的內容位置 - 以及可能的周邊位置 - 被讀入緩存行。一旦進入高速緩存,寫入相關存儲器地址將發生到該高速緩存行,直到在某個時刻主存儲器被更新的高速緩存行更新爲止。

+0

謝謝。那麼還有沒有其他方式可以讓內存寫入不通過緩存?例如,我想從地址A寫入一個字節到地址B.字節A是否必須到達緩存,並且其內容被檢索並寫入地址B?是否有任何內存讀取/寫入操作不通過緩存? – Amumu 2013-02-27 08:54:14

+0

這是一個非常系統(處理器/操作系統)的依賴..例如,在x86/x64架構中['Memory type range registers'](http://en.wikipedia.org/wiki/Memory_type_range_register)和['Page屬性表](http://en.wikipedia.org/wiki/Page_attribute_table)允許將某些內存區域設置爲未緩存。我相信不同的操作系統以不同的方式揭示這一點。 – Michael 2013-02-27 09:39:18