轉自網站:http://blog.sina.com.cn/s/blog_633f462901018reb.html
0. 綜述
總的來說TLB miss處理分為硬件處理和軟件處理兩種,硬件處理代表架構為X86,X86-64,IBM VM370;軟件處理代表為: MIPS, SPARC, Alpha;同時兼容軟硬件處理的架構:PowerPC。以下便簡要介紹各個架構的TLB MISS處理過程及其特性。
1. ARM架構
ARM架構的TLB雖然程序員可見,但是並不能像MIPS架構那樣可以顯示的向TLB中寫入固定的內容,TLB缺失重填過程是由硬件來完成的,具體過程如下:(參考:<<ARM920T的MMU與Cache>>文章)
1) ARM的MMU和Cache集成在15號協處理器中。其中第2號寄存器存着頁表的基地址(TTB);第8號寄存器提供了TLB invalid等TLB操作;第10號寄存器提供了TLB鎖定操作。
2) 以TTB中的內容為基地址,以VA[31:20]為索引在表中查出第二級頁表(Coarse Page Table)的基地址,同樣是物理地址,也就是說第二級頁表也是直接按這個地址存在物理內存中的。
3) 以VA[19:12]為索引在第二級頁表中查出物理頁面的基地址加上VA[11:0]這個偏移量就可以取出相應地址上的數據。
4) 過程稱為Translation Table Walk從TTB走到一級頁表,又走到二級頁表,又走到物理頁面,一次尋址其實是三次訪問物理內存。注意這個“走”的過程完全是硬件做的,每次CPU尋址時MMU就自動完成以上四步,不需要編寫指令指示MMU去做,前提是操作系統要維護頁表項的正確性,每次分配內存時填寫相應的頁表項,每次釋放內存時清除相應的頁表項,在必要的時候分配或釋放整個頁表。
5) 除了硬件TTW,CP15的8號寄存器支持的TLB操作如下:
a) 無效指令TLB
b) 無效指令單一入口
c) 無效整個數據TLB
d) 無效數據單一入口
e) 無效所有TLB
因此由上面分析可以看到ARM的類似X86架構是硬件完成TLB重填,而且不能顯示訪問TLB的每一項。
2. SPARC架構
SPARC架構類似MIPS,使用的是軟件管理TLB重填異常,TLB中也擁有區分不同地址空間的標識符 context id,是否使用特權級是根據操作模式和TRAP LEVEL決定的。SPARC的TLB重填異常如下:
1) 發生TLB異常時陷入操作系統
2) 操作系統首先查詢TSB中是否存在缺失項
a) 如果有load到TLB中
b) 如果沒有則執行TSB缺失函數
3) SPARC訪問TLB的命令是ldxa,stxa等,具體方式見linux內核中 arch/sparc/ kernel/itlb_miss.S文件中填充TLB的部分
3. POWERPC架構
POWERPC架構的TLB MISS有硬件查詢的部分有軟件查詢的部分。其TLB MISS處理的方式如下,一共兩輪查詢
1) 首先查詢處理器中的DBAT和IBAT寄存器,這些寄存器只有4或8個,用於映射內核地址,最大能映射到256M。如果這次查詢成功則不進行下輪查詢。
2) 若第一次查詢不成功,則進行第二輪查詢,這輪查詢不一定被所有的類型的POWERPC處理器支持,查詢中首先通過段寄存器獲得一個52位地址。這52位線性地址使用hash表存放其頁表。硬件獲得52地址對應的hash值,查詢頁表。如果不存在則解決hash 沖突繼續查,如果繼續查不中則陷入到OS中進行處理。
3) POWERPC G1系列不支持查詢hash表,而使用軟件方式查詢標准頁表,之后寫入TLB;G2~G4系列均采用硬件查詢hash表。最新的POWERPC處理器支持兩種方式選擇。
4) POWERPC系列訪問TLB指令類似tlbre, tlbwe等,有點類似MIPS。
4. Alpha架構
Alpha同樣使用軟件TLB重填,同樣具有ASID用於保證TLB中存在不同地址空間的項。但是Alpha的TLB重填很奇特,使用機器碼來完成三級頁表的查詢,換句話說Alpha的TLB miss重填函數固化在機器碼中。
5. X86,x86-64架構
X86使用的是硬件頁表查詢,特點是:
1) 操作系統並不知道有TLB存在
2) CPU保證TLB和頁表一致性。即當頁表改變或者切換時需要刷新TLB。
3) TLB中不存在ASID。
4) OS不能單一操作某一TLB表項,只能通過INVLPG指令無效整個TLB。
5) X86的硬件page table walk過程略~
6. MIPS架構
MIPS使用的是軟件TLB miss方法,使用ASID區分不同的用戶空間。具體過程如下:
1) 訪問地址TLB不存在時候,陷入內核產生TLB miss異常。
2) TLB miss 處理函數查詢三級頁表獲得地址並填入TLB
3) MIPS架構中訪問TLB指令時:tlbwi,tlbri等。