2.2.3 頁表地址映射
概述
OEA通過SRs寄存器將內(nèi)存分成256M的段,每一個段的內(nèi)存模型通過頁地址變換將EA空間的頁映射到物理地址PA空間中的頁,為了提高編程的靈活性,MMU提供了52位的內(nèi)部虛擬地址。
備注:需要注意的是塊地址轉(zhuǎn)換的優(yōu)先級高于頁地址轉(zhuǎn)換,當(dāng)進(jìn)行塊地址轉(zhuǎn)換時頁地址轉(zhuǎn)換處于抑制狀態(tài)。
頁地址轉(zhuǎn)換可以分成兩個步驟:
Step1:將32位的EA轉(zhuǎn)換成52位的內(nèi)部VA
這一步通過SRs寄存器來實現(xiàn),SRs提供虛擬段號(Virtual Segment ID),VSID和EA中的虛擬頁號以及頁內(nèi)偏移級聯(lián),最終構(gòu)成52位的VA;
備注:SRs寄存器不僅提供了虛擬段號,還提高了段的保護(hù)信息。
Step2:通過頁表項PTEs將內(nèi)部VA轉(zhuǎn)換成物理地址PA
PTEs提供物理頁號RPN(Physical Page Number)和頁的保護(hù)信息。
下面我們來描述頁地址變換的詳細(xì)機(jī)制:
PowerPC的MMU從訪存指令中獲取的32位有效地址EA(effective address)分成三個部分:
EA[0:3]:存放的是CR寄存器的索引(范圍在0到15),用于選擇CR寄存器。目的是從CR寄存器讀取24位的虛擬段號(VSID-virtual segment ID);
EA[4:19]:存放的是頁表索引,用于在頁目錄表中定位頁表項。它和從CR寄存器中讀取的24位VSID,構(gòu)成52位虛擬地址(Virtual Address)的前40位,這40位我們稱之為虛擬頁號(VPN-Virtual Page Number)
EA[20:31]:頁內(nèi)偏移地址,它和VPN構(gòu)成52位虛擬地址。
這樣我們就可以得到52位的虛擬地址,然后由虛擬地址的VPN位,我們在TBL或者頁表中找到20位的物理頁號(RPN-Physical page number),它和EA[20:31]構(gòu)成32位的物理地址。
示意圖如下:
備注:從圖中我們可以看出由EA到PA,PowerPC構(gòu)架需要先把有效地址(EA)轉(zhuǎn)化虛擬地址(VA),從VA中獲得VPN,通過VPN在TLB或者頁表(PageTable)中檢索頁表項PTE(PageTable Entry),接著從PTE中獲取RPN,最后RPN和頁內(nèi)偏移地址(ByteOffset)拼接成物理地址PA(PhysicalAddress)。
這一過程主要分成兩個步驟:
2.2.3.1 由32位的有效地址EA轉(zhuǎn)換成52位的虛擬地址VA
SR寄存器中包含虛擬段號VSID和段的包含信息,其具體格式如下:
這一步驟在上面的圖示中已經(jīng)清晰的描述過,這里就不在贅述。
2.2.3.2 由52位的虛擬地址VA轉(zhuǎn)化成32位的物理地址
這一步驟比較復(fù)雜,且聽我慢慢道來,O(∩_∩)O~
本步驟也分為三個小步:
第一個小步:先由52位的虛擬地址(VA)找到頁表項組(PTEGs)的地址;
第二個小步:再從頁表項組(PTEGs)中逐個查找,從而找到頁表項(PTE)的地址;
第三個小步:最后從PTE中取出RPN和和字節(jié)偏移地址(Byte Offset)拼接,構(gòu)成32位的物理地址,具體過程如下:
2.2.3.2.1由52位的虛擬地址VA找到頁表項組(PTEGs)的地址
解釋一下,PowerPC構(gòu)架中的頁表由頁表項組(PTEGs)構(gòu)成的,而每個PTEGs又是由PTE構(gòu)成的,每個PTE有8個字節(jié)。
PTE的格式如下:
MMU為了找到目標(biāo)頁表項PTE,它使用兩個hash函數(shù)(稱之為主hash函數(shù)和次hash函數(shù)),我們首先用主hash函數(shù)找到一個PTEGs,在PTEGs中逐個需找目標(biāo)PTE,如果該PTEGs中不存在目標(biāo)PTE,我們再用次hash函數(shù)找一組PTEGs,再在其中需找目標(biāo)PTE,如果還不在的話,此時就會發(fā)生ISI或者DSI中斷,交由操作系統(tǒng)來處理了。
備注:
為了描述清楚問題,我們來解釋一下主hash函數(shù)和次hash函數(shù)。
主hash函數(shù):
輸入?yún)?shù):
虛擬地址VA[5:23]
有效地址EA[4:19](即Page Index,也是VA[24:39])
處理:這兩個地址繼續(xù)或操作,由于兩個位段長度不同,我們第二個位段的高位補(bǔ)3個0,這樣都形成了19位的長度,便于操作。
輸出:上述兩個位段的或操作的結(jié)果
次hash函數(shù):
出入?yún)?shù):
輸出:
兩個hash函數(shù)處理過程如下:
解釋完兩個函數(shù)之后,我們繼續(xù)上面的話題:如何由52位的虛擬地址(VA)找到頁表項組(PTEGs)的地址。
52位的虛擬地址VA的兩個字段VA[5:23]和VA[4:19](即也是有效地址EA[4:19])提供給主hash函數(shù),主hash函數(shù)經(jīng)過運(yùn)算之后給我們提供了19位計算結(jié)果。
我們怎么樣來使用這個hash函數(shù)呢?這就牽涉到SDR1寄存器(其實SDR1主要用于確定頁表的基地址和頁表的大小)
32位的SDR1寄存器的格式如下所示:
SDR1[0:15]位:稱為HTABORG位,它保存的是32位頁表(Page Table)物理地址的高16位;
SDR1[23:31]位:稱為HTABMASK位,頁表地址的掩碼;
需要注意的是SDR[0:15]的16位數(shù)值是內(nèi)存中頁表數(shù)目的上限,也可以理解為頁表的基址一部分,這一部分到底有多少位,是由HTABMASK決定的。
為了更詳細(xì)的說明這種機(jī)制,我們舉一個例子來說明:
比如說頁表基址為0xA6000000,即二進(jìn)制:0b1010 0110 00000000 0000 0000 0000 0000
而SDR1寄存器的值為0b1010 0110 0000 0000 0000 0000 00000011,
其中SDR1[0:15](即HTABORG):1010 0110 0000 0000
因為HTABMASK的后兩位是連續(xù)的兩個1,所以HTABORG中的后兩位將參與計算PTEGs在頁表中的偏移地址,HTABORG中的高14位1010 0110 000000將作為頁表的基址的高地址部分,剩下的(32-14)位補(bǔ)0就是頁表的基地址。
備注:至于為什么HTABMASK的后端有多少個連續(xù)的1,HTABORG的后端就是相同數(shù)目個連續(xù)的0,我們在后面的運(yùn)算中可以清晰的看出來(其實就是不讓這些數(shù)據(jù)位有效,來使得hash函數(shù)的相同數(shù)目的高Bit位參與計算PTEGs在頁表中的偏移地址)
由于通過主hash函數(shù)計算出來的PTEGs可能不一定含有目標(biāo)PTE,所以我們又根據(jù)次hash函數(shù)函數(shù)計算一個PTEGs地址,如果兩個PTEGs都沒有目標(biāo)PTE,就是讓操作系統(tǒng)產(chǎn)生缺頁中斷。
示意圖如下:
為了更清楚的說明hash函數(shù)計算頁表(Page Table)內(nèi)PTEGs地址的過程,我們再看下面的例子:
2.2.3.2.2尋找頁表項(PTE)的地址
在上面的2.2.3.1中,我們找到了頁表項組(PTEGs)的地址,現(xiàn)在我們只要從從頁表項組(PTEGs)中逐個查找,我們的目標(biāo)PTE地址。
我們需要先從通過主hash計算出來的PTEGs組中逐個查找目標(biāo)PTE,如果不存在的話,我們再在通過次hash表計算出來的PTEGs組中逐個查找,如果還找不到的話,就讓OS產(chǎn)生缺頁中斷把包含目標(biāo)PTEGs的頁表調(diào)入主存,然后再次重復(fù)上述過程。
2.2.3.2.3 如何找到物理地址
我們從在2.2.3.2.2中獲取到的PTE中取出RPN和和字節(jié)偏移地址(Byte Offset)連接,構(gòu)成32位的物理地址。
這個示意圖如下:
備注:
增加一個PTE的匯編指令:
lock(PTE)
PTE[RPN,R,C,WIMG,PP] ← new values
eieio
PTE[VSID,H,API,V] ← new values (V = 1)
sync
unlock(PTE)
刪除一個PTE的匯編指令:
lock(PTE)
PTE[V] ← 0
sync
tlbie(old_EA)
eieio
tlbsync
sync
unlock(PTE)
至此頁地址變換機(jī)制就介紹完了,關(guān)于頁地址轉(zhuǎn)換中的權(quán)限保護(hù),我沒有刻意去介紹。這一塊的內(nèi)容比較簡單,詳細(xì)內(nèi)容參考:
Programming Environments Manual for 32-BitImplementations of the PowerPC Architecture.chapter7.MMU
聯(lián)系客服