ARM中MMU之地址轉換
第一次發帖略微有點激動,有不足的地方還請各位大神指教。
最近看了看mmu,找了好多資料,看了好多博文終於稍微清楚了一點,現在我把自己理解的內容總結一下:
首先我來說一下MMU的作用,MMU就是負責虛擬地址(virtual address)轉化成實體地址(physical address)。
下面我來說一下ARM CPU上的地址轉換過程涉及三個概念:虛擬地址(VA)(CPU核心對外發出VA),變換後的虛擬地址(MVA)(VA被轉換為MVA供cache和MMU使用,在此將MVA轉換為PA),實體地址(PA)(最後使用PA讀寫實際裝置)。
(1)CPU看到的用到的只是VA,CPU不管VA最終是怎樣到
(2)而cache、MMU也是看不到VA的,它們使用的是MVA(VA到MVA的轉換是由硬體自動完成的);
(3)實際裝置看不到VA、MVA,讀寫裝置使用的是PA實體地址。
前期的鋪墊基本完成,接下來進入重點。
在此過程中要用到以下兩個必備的東西:
1、cp15協處理器的c2暫存器(這個裡面的東西需要程式設計師自己裝載)
2、虛擬地址MVA。
接下來我說以下mmu對虛擬地址到實體地址的轉化過程。
1、無論進行那種有效轉換都必須進行一級頁表的轉換,所以我們先去產生一級頁表。產生一級頁表經過以下步驟
a) 由協處理器CP15中的暫存器C2(高18位,即[31:14]為轉換表基地址,低14位為0)為一級轉換表基地址,即TTB該地址指向了一個2^14=16KB
b) 將MVA的高12位,即位[31:20]作為一級轉換表的地址索引,因此一級轉換表具有2^12=4096項,這4096項的地址為32位,最高的18位[31:14]為暫存器C2的高18位,中間12位為MVA的高12位[31:20],最低2位為0b00。這4096項中的內容稱為一級描述符。至此一級頁表產生完畢。
2、mmu拿到一級描述符首先看它的後兩位也就是bits[1:0],根據這兩位的取值mmu會進入不同的轉換模式,這兩位會出現下面四種取值。其中這四種取值分別對應四種模式,下面我一一解釋。
a) 00 無效不進行轉換
b) 01 進行粗頁式轉換
c) 10 進行段式轉換
d) 11 進行細頁式轉換
3、接下來對於不同的轉換模式,就要進行不同的轉換。我下面將對三種轉換模式進行一一分析。
a) 0b10(段式轉換),把段式轉換放在第一個說的原因是在ARM中大量用到了段式 和細頁式轉換。
段式轉換是最簡單的一種轉換方式,它是將我們剛才產生的一級描述符(即4096項中的內容)的高12位作為段的基地址,用MVA的低20位作為每個段的偏移量,由此我們可以輕鬆的推出每個段的大小為2^20=1MB,至此我們就得到了一個實體地址PA。
b) 0b11(細頁式轉換)
細頁式轉換,它是將我們剛才產生的一級描述符的高20位bits[31:12],再加上MVA的bits[19:10](第二級表索引)合體,bits[1:0]補0,獲取第二級描述符的地址,至此其一級轉換結束,因為其二級轉換方式和粗頁式的二級轉換方式相同所以我下面一塊分析。
c) 0b01(粗頁式轉換)
粗頁式轉換,它是將我們剛才產生的一級描述符的高22位bits[31:10],再加上MVA的bits[19:12](第二級表索引)合體,最後兩位補0,獲取第二級描述符的地址(32位),至此其一級轉換結束。
4、下面我們將進入二級轉換,對於二級轉換隻針對細頁式和粗頁式,沒有段式轉換。
a) 經過一級轉換我們得到了二級描述符的地址,我們通過此地址可以得到二級描述符,我們根據二級描述符的低兩位bits[1:0]同樣可以分為四種轉換模式:
i. 00 無效不進行轉換
ii. 01 大頁描述符
iii. 10 小頁描述符
iv. 11 極小頁描述符
b) 接下來我將對各個模式進行分析。
i. 01(大頁描述符)
此時我們取出二級描述符中的bits[31:16]——大頁基址,它和MVA的bits[15:0]組成一個32位的實體地址,這就是MVA對應的PA。
ii. 10(小頁描述符)
此時我們取出二級描述符中的bits[31:12]與MVA的bits[11:0]組成一個32位的地址,這就是MVA對應的PA。
iii. 11(極小頁描述符)
此時我們取出二級描述符中的bits[31:10]與MVA的bits[9:0]組成一個32位的地址,這就是MVA對應的PA。
以上就是MMU對虛擬地址轉換到實體地址的過程,本人第一次寫學習筆記,還有很多不足之處還請各位前輩指教,謝謝各位。