虛擬地址和物理地址轉(zhuǎn)換
內(nèi)核也不能直接訪(fǎng)問(wèn)物理地址.但因?yàn)閮?nèi)核的虛擬地址和物理地址之間只是一個(gè)差值0xc0000000的區(qū)別,所以從物理地址求虛擬地址或從虛擬地址求物理地址很容易。那么虛擬地址和物理地址怎么轉(zhuǎn)換?學(xué)習(xí)啦小編整理了修改硬盤(pán)物理地址的相關(guān)資料。供大家參考!
虛擬地址和物理地址轉(zhuǎn)換參考如下
虛擬地址(Virtual Address Space)
虛擬地址并不真實(shí)存在于計(jì)算機(jī)中。每個(gè)進(jìn)程都分配有自己的虛擬空間,而且只能訪(fǎng)問(wèn)自己被分配使用的空間。理論上,虛擬空間受物理內(nèi)存大小的限制,如給有4GB內(nèi)存,那么虛擬地址空間的地址范圍就應(yīng)該是0x00000000~0xFFFFFFFF(4GB)。
為什么每個(gè)進(jìn)程的虛擬地址空間范圍都可以這么大呢,這涉及到地址的映射機(jī)制;程序?qū)嶋H運(yùn)行時(shí),系統(tǒng)會(huì)先將虛擬地址映射到物理地址中的范圍。
另外一個(gè)概念:虛擬內(nèi)存。虛擬內(nèi)存是內(nèi)存中的一片連續(xù)地址空間。在物理存儲(chǔ)位置上的意義,不一定就是指物理內(nèi)存,可能也是在硬盤(pán)上開(kāi)辟的一篇地址空間。
物理地址(physical address)
物理地址用于內(nèi)存芯片級(jí)的單元尋址,與處理器和CPU連接的地址總線(xiàn)相對(duì)應(yīng)。
——這個(gè)概念應(yīng)該是這幾個(gè)概念中最好理解的一個(gè),但是值得一提的是,雖然可以直接把物理地址理解成插在機(jī)器上那根內(nèi)存本身,把內(nèi)存看成一個(gè)從0字節(jié)一直到最大空量逐字節(jié)的編號(hào)的大數(shù)組,然后把這個(gè)數(shù)組叫做物理地址,但是事實(shí)上,這只是一個(gè)硬件提供給軟件的抽像,內(nèi)存的尋址方式并不是這樣。所以,說(shuō)它是“與地址總線(xiàn)相對(duì)應(yīng)”,是更貼切一些,不過(guò)拋開(kāi)對(duì)物理內(nèi)存尋址方式的考慮,直接把物理地址與物理的內(nèi)存一一對(duì)應(yīng),也是可以接受的。也許錯(cuò)誤的理解更利于形而上的抽像。
虛地址到物理地址的轉(zhuǎn)換過(guò)程
MVA (Modified Virtual address,修改過(guò)的虛擬地址,這個(gè)地址由CPU產(chǎn)生#1)
step1.通過(guò)TTBR找到粗表描述符
轉(zhuǎn)換表基地址#2 + MVA的粗頁(yè)表索引 = 粗頁(yè)表的物理地址
step2.通過(guò)粗表描述符找到小頁(yè)描述符
粗頁(yè)表基地址#3 + MVA的小頁(yè)表索引 = 小頁(yè)表的物理地址
step3.通過(guò)小頁(yè)描述符找到物理地址
小頁(yè)基地址#4 + MVA的頁(yè)索引 = 物理地址
step1得到的粗頁(yè)表的物理地址位定義
step2得到的小頁(yè)表的物理地址位定義
step3得到的物理地址位定義
注1:嚴(yán)格的說(shuō),這個(gè)地址是可能是FCSE或ARM926ej-s處理器產(chǎn)生
注2:轉(zhuǎn)換表基地址保存在TTBR,詳見(jiàn)TTBR
注3:粗頁(yè)表基地址保存在粗頁(yè)表描述符中,詳見(jiàn)粗頁(yè)表描述符
注4:小頁(yè)表基地址保存在粗頁(yè)表描述符中,詳見(jiàn)小頁(yè)表描述符
--------------------------------------------------------------------------------------
CP15
系統(tǒng)控制協(xié)處理器(CP15)被用來(lái)配置和控制ARM926ej-s處理器。cache、mmu都通過(guò)CP15的寄存器來(lái)控制。需要使用專(zhuān)門(mén)的指令訪(fǎng)問(wèn)CP15的寄存器。
ARM926ej-s系統(tǒng)中的地址
ARM926ej-s產(chǎn)生的地址為虛地址(VA),F(xiàn)CSE(快速上下文切換控制器)將VA轉(zhuǎn)換為修改過(guò)的虛地址(MVA)供MMU使用,MMU將MVA轉(zhuǎn)換為T(mén)CM和AMBA總線(xiàn)的物理地址(PA)。
CP15的c1寄存器
c1寄存器是ARM926ej-s處理器的控制寄存器。該寄存器用來(lái)使能或禁用cache、配置MMU。
I 0: 禁用iCache,1使能iCache
C 0:禁用dCache,1使能dCache
如果c1寄存器禁用了cache,小頁(yè)表的C、B位是無(wú)效的。
TLB
MMU是OS分頁(yè)內(nèi)存管理的硬件基礎(chǔ)。MMU使用TLB(Translation lookaside buffer,即旁路轉(zhuǎn)換緩沖,或稱(chēng)為頁(yè)表緩沖;用來(lái)存放虛擬地址到物理地址的轉(zhuǎn)換表)將虛擬地址轉(zhuǎn)換為物理地址。
TLB保存在SDRAM中。
TTBR
TTBR是Translation Table Base Register的縮寫(xiě),中文全稱(chēng)是:轉(zhuǎn)換表基地址寄存器。TTBR是協(xié)處理器CP15的c2寄存器。
由于讀取TTBR時(shí)Bit13~Bit0是不可預(yù)測(cè)的,所以粗頁(yè)表的起始地址必須是按64K對(duì)齊的。
粗表描述符
填充為紅色的位固定為0/1。Bit8~Bit5為域控制位,可以定義16個(gè)域。
小頁(yè)描述符
填充為紅色的位固定為0/1。AP3~AP0為訪(fǎng)問(wèn)控制位,訪(fǎng)問(wèn)控制位和域控制位配合完成了對(duì)內(nèi)存訪(fǎng)問(wèn)權(quán)限的管理。在boot中,禁用域控制,同時(shí)將AP3~AP0全部設(shè)置為3(任何人都可以讀寫(xiě))。只關(guān)注 C cache控制位,B buffer控制位。
#寫(xiě)通。讀命中,從Dcche讀取數(shù)據(jù),讀未命中,(cache)行填充;寫(xiě)命中,寫(xiě)數(shù)據(jù)帶Dcache,并緩沖到外邊存儲(chǔ)器寫(xiě)未命中,緩沖到外部存儲(chǔ)器
#寫(xiě)回。讀命中,從Dcache讀取數(shù)據(jù),讀未命中,(cache)行填充;寫(xiě)命中,寫(xiě)數(shù)據(jù)帶Dcache ;寫(xiě)未命中,緩沖到外部存儲(chǔ)器
虛擬地址到物理地址的轉(zhuǎn)換步驟
已知一個(gè)虛擬地址0x01AF5518, 則轉(zhuǎn)換的過(guò)程如下:
注意: *這里討論的以Windows下普通模式分頁(yè)的情況, 也就是2級(jí)頁(yè)表的情況*
1.首先把虛擬地址拆分成3個(gè)部分(低12位, 中10位, 高10位), 換成2進(jìn)制如下:
-> 0000 0001 1010 1111 0101 0101 0001 1000
按照10, 10, 12的位數(shù)重新排列后
-> (頁(yè)目錄索引)00 000 00110, (頁(yè)表項(xiàng)索引)10 1111 0101, (偏移)0101 0001 1000
換算成十六進(jìn)制后可以得到如下結(jié)果
頁(yè)目錄索引 = 6, 頁(yè)表項(xiàng)索引 = 0x2f5 , 偏移 = 0x518
2. 根據(jù)當(dāng)前的CR3寄存器中的物理地址定位頁(yè)目錄表基址
Cr3中存放的是物理地址, 這個(gè)物理地址指向進(jìn)程的頁(yè)目錄表基址, 由此可以得到
頁(yè)目錄表基址(PDE) = Cr3 = 0xAA0E5000
3. 計(jì)算頁(yè)表項(xiàng)的地址
頁(yè)表地址存放在頁(yè)目錄表(PDE)中的第6個(gè)項(xiàng)目中, 也就是
[0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867為該頁(yè)表屬性值, PTE = 0x3D955000
3. 計(jì)算頁(yè)面物理地址
我們要找的頁(yè)面在這個(gè)頁(yè)表中的第0x2f5項(xiàng), 所以虛擬地址所在的頁(yè)的物理地址為
[0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =
假設(shè)[0x3D955BD4] = 0x7095e847, 頁(yè)面的物理地址 x0x7095e000, 0x00000847表示的是頁(yè)面屬性
4. 計(jì)算最終的物理地址
由虛擬地址分離的偏移可以計(jì)算出最終的物理地址為
0x7095E000 + 0x00000518 = 0x7095E518.
看過(guò)“虛擬地址和物理地址轉(zhuǎn)換 ”的人還看了: