1. 程式人生 > >Intel系統程式設計指南第十一章——11.5 Cache控制

Intel系統程式設計指南第十一章——11.5 Cache控制

Intel 64和IA-32架構提供了各種用於控制資料和指令的cache的機制,以及為控制在處理器、Cache和儲存器之間讀寫次序的機制。這些機制可以被劃分為兩組:

1、Cache控制暫存器和位元——Intel 64和IA-32架構定義了控制暫存器內的若干個專用暫存器和各個位,以及控制L1、L2和L3 Cache中的cache系統儲存器位置的頁和目錄表條目。這些機制控制了物理儲存器區域的虛擬儲存器頁的cache。

2、Cache控制和儲存器次序指令——Intel 64和IA-32架構提供了若干條指令來控制資料的cache,儲存器讀寫的次序,以及資料預取。這些指令允許軟體控制指定資料結構的cache,以對儲存器中的指定位置控制儲存器一致性,以及迫使在一個程式中的指定位置強儲存器次序。

以下小節描述了兩組cache控制機制。

11.5.1 Cache控制暫存器和位元

圖11-3描繪了IA-32處理器中的Cache控制機制。與儲存器地址空間不同,這些在Intel 64處理器中也以相同方式工作。

Intel 64和IA-32架構提供了以下Cache控制暫存器和位元,用於允許或限制對儲存器中的各種頁或區域的cache:

1、CD標誌,控制暫存器CR0的位30——控制系統儲存器位置的cache(見2.5小節)。如果CD標誌被清0,那麼cache對整個儲存器被允許,但可以通過其它Cache控制機制對儲存器的個別的頁或區域進行限制。當CD標誌被置1,那麼對於P6和更新的處理器家族,cache被限制在處理器的Cache中(Cache層級);而對於奔騰處理器則被禁用。然而,如果CD標誌被置1,Cache將仍然響應窺探交通。Cache應該被顯式地衝刷以確保儲存器一致性。對於最高的處理器效能,控制暫存器CR0中的CD和NW位應該都被清0。

置1CD標誌的效果對於從P6家族開始的處理器家族與奔騰處理器相比有些不同。為了確保CD標誌置1後的儲存器的一致性,Cache應該被顯式地衝刷(見11.5.3小節)。對P6或更新的處理器家族置1,修改Cache行填充和更新行為。對這些處理器的CD標誌置1也不會迫使嚴格的儲存器訪問次序,除非MTRR被禁止以及/或所有儲存器作為不被cache的而引用(見8.2.5小節)。

2、NW標誌,控制暫存器CR0的位29——對系統儲存器位置控制寫策略(見2.5小節)。如果NW和CD標誌被清0,那麼寫回對整個系統儲存器被允許,但可以通過其它Cache控制機制對儲存器的個別的頁或區域進行限制。

注:對於奔騰4和Intel至強處理器,NW標誌並不是一個需要關心的標誌;即,當CD標誌被置1時,處理器使用不填充的Cache模式,不管NW是否置1。

對於Intel凌動處理器,NW標誌並不是一個需要關心的標誌;即,當CD標誌被置1時,處理器禁止cache,不管NW標誌是否置1。

對於奔騰處理器,當L1 Cache被禁止時(控制暫存器CR0的CD和NW標誌被置1),在DP(雙處理器)系統中,外部窺探被接受,而在單處理器系統中,外部窺探被禁止。

當窺探被禁止時,地址奇偶性不被檢查,並且APCHK#訊號對一個受破壞的地址不被斷言;然而,當窺探被接受時,地址奇偶性被檢查,並且APCHK#對受破壞的地址做出斷言。

3、在頁目錄和頁表條目中的PCD標誌——分別為個別的頁表和頁控制cache(見4.9小節)。這個標誌只有當分頁被允許並且控制暫存器CR0中的CD標誌被清0的時候才有效。PCD標誌當清0時允許cache頁表或頁,而當置1時禁止cache。

4、頁目錄和頁表條目中的PWT標誌——分別對個別的頁表和頁控制寫策略(見4.9小節)。這個標誌只有當分頁被允許並且控制暫存器CR0中的NW標誌被清0時才有效。PWT標誌當清0時允許頁表或頁的寫回cache,而當置1時為通寫cache。

5、控制暫存器CR3中的PCD和PWT標誌——對頁目錄控制全域性的cache和寫策略(見2.5小節)。PCD標誌當清0時允許對頁目錄的cache,而當置1時禁止cache。PWT標誌當清0時允許對頁目錄的寫回cache,而當置1時為通寫cache。這些標誌對個別的頁表不影響cache和寫策略。這些標誌只有當分頁被允許並且控制暫存器CR0中的CD標誌被清0時才有效果。

6、頁目錄和頁表條目中的G(全域性的)標誌(對P6家族處理器中的IA-32架構所引入)——控制對個別頁的TLB條目的沖刷。見4.10小節。

7、在控制暫存器CR4中的PGE(頁全域性允許)標誌——允許帶G標誌的全域性頁的建立。見4.10小節。

8、儲存器類型範圍暫存器(MTRR)(在P6家族處理器中引入)——控制用於在物理儲存器的指定區域的cache型別。在11.3小節中所描述的任一cache型別可以被選擇。

9、頁屬性表(PAT)MSR(在奔騰III處理器中引入)——擴充套件處理器的儲存器型別效能以允許儲存器型別基於一頁一頁被分配(見11.12小節)。

10、第三級Cache禁止標誌IA32_MISC_ENABLES MSR的位6(只在基於Intel NetBurst微架構上的處理器可用)——允許L3 Cache被禁止和允許,獨立於L1和L2 Cache。

11、KEN#WB/WT#引腳(奔騰處理器)——允許外部硬體控制用於儲存器指定區域的cache方法。它們執行類似於P6家族處理器中的MTRR的功能(但並不相同)。

12、PCD和PWT引腳(奔騰處理器)——這些引腳(與控制暫存器CR3中、頁表目錄中和頁表條目中的PCD和PWT標誌相關聯)允許在一個外部L2 Cache中的cache基於一頁一頁受到控制,與操作在這些處理器的L1 Cache上的控制相一致。P6和更新的處理器家族不提供這些引腳,因為L2 Cache在晶片包的內部。

11.5.2 Cache控制的優先順序

Cache控制標誌和MTRR為限制cache而有層級地操作。即,如果CD標誌被置1,那麼cache被全域性禁止(見表11-5)。如果CD標誌被清0,那麼頁級Cache控制標誌以及/或MTRR可以被用於限制cache。如果頁級和MTRR cache控制有一個疊交,那麼禁止cache的機制就有一個優先順序。比如,如果一個MTRR使系統儲存器的一個區域變為不可被cache的,那麼一個頁級cache控制不能被用於為那個區域的一個頁允許cache。反過來也同樣正確;即,如果一個頁級cache控制指派了一個頁是不可被cache的,那麼一個MTRR不能使該頁變為可被cache。

在回寫和通寫cache策略的對一個頁或一個區域的儲存器的分配中有一個疊交的情況下,那麼通寫策略獲得優先權。寫繫結策略(只能通過MTRR或PAT被分配)會越過通寫或回寫而獲取優先權。

在頁級的儲存器型別的選擇依賴於PAT是否被用於為頁選擇儲存器型別而不同。這在以下小節中描述。

在基於Intel NetBurst微架構的處理器上,第三級Cache可以用IA32_MISC_ENABLE MSR的位6來禁止。使用IA32_MISC_ENALBES[位6]來越過為那些處理器中的L3 Cache的CD標誌、MTRR以及PAT而獲取優先權。即,當第三級Cache禁止標誌被置1時(Cache被禁止),那麼其它Cache控制在L3 Cache上沒有效果;當此標誌被清0(允許)時,在L3上的Cache控制具有與它們在L1和L2 Cache上的具有相同的效果。

IA32_MISC_ENALBES[位6]在Intel酷睿i7處理器中不被支援,也不在基於Intel酷睿和Intel凌動微架構的處理器上被支援。

11.5.2.1 為奔騰Pro和奔騰II處理器選擇儲存器型別

奔騰Pro和奔騰II處理器不支援PAT。這裡,對一個頁的有效儲存器型別用MTRR,以及頁的頁表或頁目錄條目中的PCD和PWT位來選擇。表11-6描述了MTRR儲存器型別的對映以及對有效儲存器型別的頁級cache屬性,當正常的cache有效時(控制暫存器CR0的CD和NW標誌被清0)。用灰色表示出來的結合對於奔騰Pro和奔騰II處理器是實現定義的。系統設計者被鼓勵避免這些實現定義的結合。

當正常的cache有效時,在表11-6中所展示的有效儲存器型別使用以下規則被確定:

1、如果為頁的PCD和PWT屬性都為0,那麼有效的儲存器型別與MTRR定義的儲存器型別是相同的。

2、如果PCD標誌被置1,那麼有效儲存器型別是UC。

3、如果PCD標誌被清0且PWT標誌被置1,那麼為WB儲存器型別的有效儲存器型別是WT,而為所有其他儲存器型別的有效儲存器型別是由MTRR定義的。

4、將PCD和PWT標誌的值互換一下對於WP和WC儲存器型別被認為是模型指定的,而為WB、WT和UC儲存器型別是架構定義的。

11.5.2.2 為奔騰III和之後的處理器家族選擇儲存器型別

Intel酷睿2 Duo,Intel凌動,Intel酷睿Duo,Intel酷睿Solo,奔騰M,奔騰4,Intel至強和奔騰III處理器使用PAT來選擇有效的頁級儲存器型別。這裡,一個頁的儲存器型別通過MTRR,以及一個PAT條目中的值來選擇。而此PAT條目是用在一個頁表或頁目錄條目中的PAT、PCD和PWT位所選出的(見11.12.3小節)。表11-7描述了MTRR儲存器型別和PAT條目型別到有效儲存器型別的對映,當正常的cache有效時(控制暫存器CR0中的CD和NW標誌被清0)。

11.5.2.3 用不同儲存器型別跨頁寫值

如果儲存器中兩個毗鄰的頁有不同的儲存器型別,並且一個字或更長的運算元被寫到一個儲存器位置,而該位置跨了那兩個頁的邊界,那麼運算元可能會對儲存器寫兩次。這個動作對於實際到儲存器的寫不會呈現一個問題;然而,如果一個裝置被對映到被指派到那兩個頁的儲存空間的話,那麼該裝置可能會有故障。

11.5.3 防止cache

在L1、L2和L3 Cache已經被允許並收到Cache填充後要禁止它們,要執行以下步驟:

1、進入非填充Cache模式。(將控制暫存器CR0到1的CD標誌置1,並且NW標誌清0)

2、使用WBINVD指令沖刷所有Cache。

3、禁止MTRR並且將預設的儲存器型別設定為不被cache的,或置1所有不被cache的儲存器型別的MTRR。

在CD標誌被置1後,Cache必須被沖刷(步驟2),以確保系統儲存器的一致性。如果Cache不被沖刷,Cache對讀的命中將仍然發生,並且資料將從有效的Cache行被讀。

上述所列出的獨立的步驟的意圖為指明三個明確的要求:(i)中止新資料替換Cache中已存在的資料,(ii)確保已在Cache中的資料被驅逐到儲存器,(iii)確保後面的儲存器引用觀察UC儲存器型別語義。Cache控制硬體的不同處理器實現可以允許這三個要求的軟體實現的一些變動。

11.5.4 禁止和允許L3 Cache

在基於NetBurst微架構的處理器上,第三級Cache可以用IA32_MISC_ENABLE MSR的位6來禁止。第三級Cache禁止標誌(IA32_MISC_ENABLE MSR的位6)允許L3 Cache禁止和允許,而獨立於L1和L2 Cache。在使用該控制來允許或禁止L3 Cache之前,軟體應該禁止並沖刷所有的處理器Cache,如11.5.3小節中所描述的那樣,以防止儲存在L3 Cache中的資訊丟失。在L3 Cache被禁止或允許之後,為整個處理器的Cache可以被恢復。

帶有L3的更新的Intel 64處理器不支援IA32_MISC_ENABLES[位6],此過程在11.5.3小節中描述。

11.5.5 Cache管理指令

Intel 64和IA-32架構提供了若干種指令管理L1、L2和L3指令。INVD, WBINVD, 和WBINVD指令是系統指令,對整個L1、L2和L3 Cache操作。PREFETCHh和CLFLUSH指令以及非臨時搬移指令(MOVNTI、MOVNTQ、MOVNTDQ、MOVNTPS、MOVNTPD),這些在SSE/SSE2擴充套件中引入,對cache提供更大粒度的控制。

INVB和WBINVD指令被用於無效化L1、L2和L3 Cache的內容。INVD指令無效化所有內部Cache條目,然後產生一個特殊功能匯流排週期,指示外部Cache也應該被無效化。INVD指令應該被小心使用。它並不強迫被修改的Cache行的寫回;從而被存放在Cache行並且沒有被寫回到系統儲存器的資料將會被丟失。除非有一個特定要求或能從不寫回被修改的Cache行而無效化Cache獲利(諸如在測試或錯誤恢復期間,這段時間內,主儲存器的Cache一致性不被關心),軟體應該使用WBINVD指令。

WBINVD指令首先將在所有的內部Cache中的任何被修改的Cache行寫回,然後無效化L1、L2和L3 Cache的內容。它確保了與主儲存器的Cache一致性被維護,而不管有效的寫策略(即,通寫或回寫)。這個操作之後,WBINVD指令產生一個(P6家族處理器)或兩個(奔騰和Intel486處理器)特殊功能匯流排週期來指示給外部Cache控制器,已被修改資料的寫回,後面緊跟著外部Cache的無效化應該發生。WBINVD完成的時間和週期將會由於不同的Cache層級的大小以及其它因素而有所不同。作為一個結果,對WBINVD指令的使用會對中斷/事件響應時間有所影響。

PREFETCHh指令允許一個程式對處理器建議來自系統儲存器中一個指定位置的Cache行被預取到Cache層級中(見11.8小節)。

CLFLUSH指令允許被選中的Cache行從儲存器被沖刷。這條指令給一個程式顯式地釋放完Cache空間的能力,當獲悉系統儲存器被cache的段在最近的將來不會被訪問。

非臨時搬移指令(MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, 以及MOVNTPD)允許資料從處理器的暫存器直接被搬到系統儲存器,而不被寫到L1、L2以及/或L3 Cache。這些指令可以被用於防止Cache汙染,當對在被儲存回系統儲存器之前將僅被修改一次的資料操作時。這些指令對通用目的、MMX、XMM暫存器中的資料操作。

11.5.6 L1資料Cache上下文模式

L1資料Cache上下文模式是基於支援Intel超執行緒技術的Intel NetBurst微架構的處理器的一個特徵。當CPUID.1:ECX[bit 10] = 1時,處理器支援使用L1資料Cache上下文模式標誌(IA32_MISC_ENABLE[位24])設定L1資料Cache上下文模式。可選擇的模式有自適應(預設)模式和共享模式。

BIOS負責配置L1資料Cache上下文模式。

11.5.6.1 自適應模式

自適應模式促進邏輯處理器之間的L1資料Cache的共享。當執行在自適應模式下,L1資料Cache在同一個核心中跨邏輯處理器被共享,如果:

1、為共享Cache的邏輯處理器的CR3控制暫存器是相同的。

2、相同的分頁模式被用於共享Cache的邏輯處理器。

在這種情況下,整個L1資料Cache對每個邏輯處理器可用(而不是競爭性地共享)。

如果CR3的值對於共享一個L1資料Cache的邏輯處理器是不同的,或邏輯處理器使用不同的分頁模式,那麼處理器對Cache資源會有競爭。這減少了為每個邏輯處理器的有效的Cache大小。對Cache的別名是不允許的(這防止資料反覆換入換出)

11.5.6.2 共享模式

在共享模式中,L1資料Cache在邏輯處理器之間被競爭地共享。即使邏輯處理器使用相同的CR3暫存器以及分頁模式,這也是真的。

在共享模式下,L1資料Cache中的線性地址可以被別名化,這意味著Cache中的一個線性地址可以指向不同的物理位置。解決別名的機制會導致資料反覆地換入換出。出於這個理由,IA32_MISC_ENABLE[位24] = 0對於基於支援Intel超執行緒技術的Intel NetBurst微架構的處理器是更好的配置。