[保护模式]非PAE模式
文章目錄
- 非PAE 非物理地址擴(kuò)展
- 線性地址 有效地址 物理地址
- CR3
- PDE/PTE
- 物理頁(yè)的屬性
- 通過(guò)線性地址訪問(wèn)PDT和PTT
- 指向PDT的線性地址 0xC0300000
- 總結(jié)
- 指向PTT的線性地址 0xC0000000/C0001000
- 總結(jié)
- 訪問(wèn)PDT與PTT公式總結(jié)
非PAE 非物理地址擴(kuò)展
線性地址 有效地址 物理地址
如下指令:
mov eax,dword ptr ds:[0x12345678]這個(gè)地址如果想訪問(wèn)成功,首先取決于段機(jī)制,看當(dāng)前的環(huán)境能否通過(guò)段權(quán)限檢查以及是否超過(guò)limit限制等等。其次,取決于頁(yè)機(jī)制。
- 其中,0x12345678是有效地址
- ds.base+0x12345678是線性地址
- 線性地址也不是真正的地址,還有一個(gè)地址被稱(chēng)為物理地址
CPU會(huì)通過(guò)這個(gè)線性地址作為一個(gè)目錄,去索引物理地址。問(wèn)題在于A進(jìn)程有一個(gè)地址0x12345678,B進(jìn)程也有一個(gè)地址0x12345678。那么CPU通過(guò)什么去分別找到這兩個(gè)相同內(nèi)存地址的不同的物理地址呢?答案是頁(yè)目錄基址。
CR3
每個(gè)進(jìn)程都有一個(gè)CR3寄存器,保存頁(yè)目錄基址。這個(gè)基址是物理地址。CR3指向一個(gè)物理頁(yè),一共4096字節(jié),如圖:
PDE/PTE
- CR3寄存器保存的物理地址指向頁(yè)目錄表PDT,里面的每一個(gè)成員叫PDE。頁(yè)目錄表大小為4KB,每個(gè)成員為4個(gè)字節(jié)。
- 每一個(gè)PDE又指向頁(yè)表PTT,里面的每一個(gè)成員叫PTE。頁(yè)表大小為4KB,每個(gè)成員為4個(gè)字節(jié)。
- 每一個(gè)PTE都指向物理頁(yè),每個(gè)物理頁(yè)大小為4096個(gè)字節(jié)
- PDE與PTE都是4個(gè)字節(jié)(32位),前20位是物理地址,后12位是屬性
- PTE可以沒(méi)有物理頁(yè),也可以指向物理頁(yè),但只能對(duì)應(yīng)一個(gè)物理頁(yè)
- 多個(gè)PTE可以指向同一個(gè)物理頁(yè)
- 每一個(gè)線性地址都會(huì)經(jīng)過(guò)一個(gè)PDE和PTE最終指向一個(gè)物理頁(yè),這個(gè)物理頁(yè)能不能讀寫(xiě)取決于經(jīng)過(guò)的PDT和PTE的后12位
物理頁(yè)的屬性
- 物理頁(yè)的屬性由PDE和PTE共同決定
- P:是否有效
- R/W:是否可讀可寫(xiě),0代表只讀,1代表可讀可寫(xiě)
- U/S:U/S=0 物理頁(yè)只允許特權(quán)用戶訪問(wèn);U/S=1 物理頁(yè)普通用戶也能訪問(wèn)。高2G以上的內(nèi)存只有內(nèi)核才能訪問(wèn)的原因是U/S位設(shè)置的問(wèn)題,如果將內(nèi)核的某個(gè)頁(yè)設(shè)置為1,就可以在R3進(jìn)行訪問(wèn)了
- A:是否被訪問(wèn)過(guò),訪問(wèn)過(guò)設(shè)置為1。即使只訪問(wèn)一個(gè)字節(jié)也會(huì)導(dǎo)致PDE和PTE置1
- D:是否被寫(xiě)過(guò);0沒(méi)有被寫(xiě)過(guò),1被寫(xiě)過(guò)
- PS:只對(duì)PDE有意義,PS==PageSize的意思。當(dāng)PS==1的時(shí)候PDE直接指向物理頁(yè),無(wú)PTE,低22位是頁(yè)內(nèi)偏移。此時(shí),線性地址只能拆成兩段:大小為4MB,俗稱(chēng)大頁(yè)
- 9-11位:當(dāng)P位為0時(shí),CPU會(huì)產(chǎn)生缺頁(yè)異常,此時(shí)這兩位標(biāo)識(shí)了該線性地址是否有效,也標(biāo)識(shí)了該線性地址對(duì)應(yīng)的物理內(nèi)存所在
通過(guò)線性地址訪問(wèn)PDT和PTT
指向PDT的線性地址 0xC0300000
現(xiàn)在問(wèn)題來(lái)了,如果我們想訪問(wèn)0這個(gè)地址,那么就必須找到PDT和PTT,而CR3里面保存的PDT是物理地址,提供給CPU使用的,代碼只能訪問(wèn)線性地址。
如何解決這個(gè)問(wèn)題呢?有一個(gè)線性地址,指向的是PDT,這個(gè)地址就是0xC0300000,下面對(duì)這個(gè)地址進(jìn)行拆分
0xC0300000 #二進(jìn)制為: 1100 0000 0011 0000 0000 0000 0000 0000 #拆成10:10:12 1100 0000 00------>0x300*4=C00 11 0000 0000------>0x300*4=C00 0000 0000 0000將這個(gè)線性地址拆分之后,找到的對(duì)應(yīng)的物理頁(yè)就是CR3保存的頁(yè)目錄PDT基址所在的物理頁(yè)。那就意味著我們可以直接通過(guò)這個(gè)線性地址去修改PDT。
**結(jié)論:**C0300000存儲(chǔ)的值就是PDT,如果我們要訪問(wèn)第N個(gè)PDE,那么有如下公式:
0xC0300000+N*4總結(jié)
指向PTT的線性地址 0xC0000000/C0001000
也就是說(shuō)通過(guò)0xC0300000這個(gè)線性地址可以任意修改頁(yè)目錄表,但如果我們要設(shè)置某個(gè)線性地址PDE和PTE那么還要能夠訪問(wèn)PTT,如何訪問(wèn)呢?
答案是通過(guò)這兩個(gè)線性地址:0xC0000000/C0001000。
通過(guò)拆分可以知道,訪問(wèn)0xC0000000這個(gè)地址就等于是訪問(wèn)第一個(gè)PTT表;訪問(wèn)C0001000這個(gè)地址就等于是訪問(wèn)第二個(gè)PTT表。兩個(gè)地址之間相差0x1000。如果想訪問(wèn)第三個(gè)PTT表的話以此類(lèi)推。
總結(jié)
訪問(wèn)PDT與PTT公式總結(jié)
PDI:頁(yè)目錄表索引
PTI:頁(yè)表索引
訪問(wèn)頁(yè)目錄表的公式:0xC0300000+PDI*4
訪問(wèn)頁(yè)表的公式:0xC0000000+PDI*4096+PTI*4
與PTT公式總結(jié)
PDI:頁(yè)目錄表索引
PTI:頁(yè)表索引
訪問(wèn)頁(yè)目錄表的公式:0xC0300000+PDI*4
訪問(wèn)頁(yè)表的公式:0xC0000000+PDI*4096+PTI*4
總結(jié)
以上是生活随笔為你收集整理的[保护模式]非PAE模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [保护模式]任务段
- 下一篇: [保护模式]PAE模式