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