2014-08-28 64 views
1

我知道如何通過TLB &緩存幫助cpu訪問數據。 但我很困惑,無論是數據緩存& TLB共享相同的CPU緩存或MMU硬件有單獨的緩存TLB。在發生上下文切換時,誰將刷新TLB和數據緩存的內容?關於TLB和數據緩存

+0

的TLB緩存通常是分開的,也不同的高速緩存用於指令和數據。無效緩存是操作系統的責任。 – 2014-08-28 09:43:00

+0

爲什麼'C'標籤? – dragosht 2014-08-28 09:49:49

回答

0

這非常依賴於CPU。

既然你談論「MMU硬件」,我假設你有一個非常古老的書。至少在過去的20年中,MMU已經非常緊密地集成到大多數CPU中。

無論如何,讓我們從緩存開始。在大多數你每天都會遇到的CPU上,比如i386和x86_64,這些高速緩存都是物理索引的。這意味着他們緩存物理內存訪問內容,因此不需要在上下文切換時刷新它們。

在其他具有虛擬高速緩存的CPU架構上,有多種機制來確保高速緩存一致性。在一些完全虛擬地址緩存的情況下,操作系統的工作是在上下文切換時刷新整個緩存。在某些情況下,虛擬索引緩存也有一個物理標記,以確保無論我們從緩存獲得的是正確的(緩存行查找與TLB查找並行,因此檢查物理地址不是問題)。在其他情況下,操作系統爲每個不同的上下文都分配一個明確的上下文編號,這也是高速緩存查找的一部分,並且不需要在上下文切換時刷新高速緩存。

對於TLB,基本上有三種主要口味。一個是具有顯式上下文編號的緩存,因此您不需要在上下文切換上進行任何操作。當新頁面表被加載時(這是i386和x86_64),第二種風格自動刷新TLB。加載新頁面表後,一些較舊的CPU需要顯式TLB刷新。做TLB的第三種方式是用特殊的陷阱處理程序完全用軟件填充它們。

對於TLB和普通緩存是否共享內存的問題。通常沒有。在您需要多少TLB與緩存之間很難取得平衡。另外,在TLB和緩存中查找事情的方式完全不同,並且需要保持一致性。這就是說,通常TLB總是從物理內存中加載,有些CPU甚至需要在TLB加載之前緩存刷新。在酷睿2英特爾開始從CPU緩存而導致錯誤的熱鬧量在早期的Core 2 CPU和加載TLB低級別的內存管理文件,甚至一些重寫基本上所做的所有未來英特爾CPU不向下兼容,並有許多老操作系統內核無法在Core 2和更新的Intel CPU上正常運行。