假設我有一個8字節的long pointer
到我的程序物理內存中的內存位置。我的程序很小,完全可以放入緩存中。該計劃很簡單。它簡單地通過mmap()調用映射/dev/mem
中的物理內存中的任意內存位置,通過該8字節長指針讀取並寫回該位置。但是,該位置離我的程序駐留在物理內存中的位置很遠,因此,L1/L2緩存無法覆蓋該地址。當CPU寫入不在緩存中的內存位置時,CPU會做什麼?
:根據文章獲得物理與存儲(由古斯塔沃·杜阿爾特寫的,我不能鏈接),存儲器寫入時有一個存儲單元中的緩存行已準備好被寫入RAM只發生
通常,內核將所有RAM存儲器視爲回寫,這會產生最佳性能 。在回寫模式下,內存訪問單元爲高速緩存行 ,Core 2中有64個字節。如果程序在內存中讀取單個字節 ,則處理器會將包含該字節的整個高速緩存行加載到L2中,並且L1緩存。當程序寫入內存時, 處理器僅修改緩存中的行,但不更新主內存。後來,當有必要發佈修改後的 線公交車,整個高速緩存行是在一次
書面但如果作爲目標的存儲器位置不在緩存中(正如我上面所描述的)東西,將它立即寫入?
謝謝。那麼還有沒有其他方式可以讓內存寫入不通過緩存?例如,我想從地址A寫入一個字節到地址B.字節A是否必須到達緩存,並且其內容被檢索並寫入地址B?是否有任何內存讀取/寫入操作不通過緩存? – Amumu 2013-02-27 08:54:14
這是一個非常系統(處理器/操作系統)的依賴..例如,在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