九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
PowerPCE600內(nèi)核MMU機(jī)制分析二

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),VSIDEA中的虛擬頁號以及頁內(nèi)偏移級聯(lián),最終構(gòu)成52位的VA;

備注:SRs寄存器不僅提供了虛擬段號,還提高了段的保護(hù)信息。

 

Step2通過頁表項PTEs將內(nèi)部VA轉(zhuǎn)換成物理地址PA

PTEs提供物理頁號RPNPhysical Page Number)和頁的保護(hù)信息。

 

下面我們來描述頁地址變換的詳細(xì)機(jī)制:

PowerPCMMU從訪存指令中獲取的32位有效地址EAeffective address)分成三個部分:

EA[0:3]存放的是CR寄存器的索引(范圍在015),用于選擇CR寄存器。目的是從CR寄存器讀取24位的虛擬段號(VSID-virtual segment ID);

EA[4:19]存放的是頁表索引,用于在頁目錄表中定位頁表項。它和從CR寄存器中讀取的24VSID,構(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位的物理地址。

示意圖如下:


備注:從圖中我們可以看出由EAPA,PowerPC構(gòu)架需要先把有效地址(EA)轉(zhuǎn)化虛擬地址(VA),從VA中獲得VPN,通過VPNTLB或者頁表(PageTable)中檢索頁表項PTEPageTable 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.152位的虛擬地址VA找到頁表項組(PTEGs)的地址

解釋一下,PowerPC構(gòu)架中的頁表由頁表項組(PTEGs)構(gòu)成的,而每個PTEGs又是由PTE構(gòu)成的,每個PTE8個字節(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ǔ)30,這樣都形成了19位的長度,便于操作。

輸出:上述兩個位段的或操作的結(jié)果

 

hash函數(shù):

出入?yún)?shù):

      hash函數(shù)的輸出結(jié)果

輸出:

      hash函數(shù)的輸出結(jié)果的反碼

兩個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

      SDR1[23:31]HTABMASK):0 0000 0011

因為HTABMASK的后兩位是連續(xù)的兩個1,所以HTABORG中的后兩位將參與計算PTEGs在頁表中的偏移地址,HTABORG中的高141010 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               // order 1st PTEupdate before 2nd

PTE[VSID,H,API,V] new values (V = 1)

sync               // ensure updates completed

unlock(PTE)

 

刪除一個PTE的匯編指令:

lock(PTE)

PTE[V]    // (other fields dont matter)

sync          // ensure update completed

tlbie(old_EA)  // invalidate oldtranslation

eieio         // order tlbie before tlbsync

tlbsync       // ensure tlbie completed on all processors

sync          //ensure tlbsync completed

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


 







 

 

 

 

 

 

  

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
x86_64內(nèi)存尋址 - 分頁
徹底搞懂虛擬內(nèi)存,虛擬地址,虛擬地址空間
[原創(chuàng)]Linux arm 啟動 c語言部分詳解第二講(Start kernel-> setup_a - 技術(shù)文檔 - 安裝啟動 Linux時代 - 開源、自由、共享 - 中國最大的Linux技術(shù)社區(qū)
關(guān)于高端內(nèi)存
關(guān)于x86下TLB的一點(diǎn)總結(jié)
【原創(chuàng)】(十五)Linux內(nèi)存管理之RMAP
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服