(24)2-9-9-12分页(上)
一、10-10-12 分頁的尋址范圍
在之前的學習中,有一個課后思考題:10-10-12分頁模式物理內存能夠識別的最多范圍是多少?
我們當時是怎么算的呢?很簡單嘛,有1024個頁表,每個頁表有1024個物理頁,每個物理頁有4KB,那不就是 1024 * 1024 * 4KB = 4GB 嗎?!
答案確實是4GB,但很遺憾,如果你是這樣算的,那你對 10-10-12 分頁就還沒有理解到位。
更有甚者可能會說,32位系統,2^32=4GB,所以尋址范圍是4GB,這就更加錯的離譜。
實際上,決定物理內存尋址范圍的是頁表項PTE。
PTE 的低12位是屬性;高20位是基址,低12位補零后構成了物理頁基址。所以,物理地址的尋址范圍是由PTE構成的這32位物理頁基址決定的,4GB是從這里來的。
注意,線程的4GB和物理地址尋址范圍的4GB不是一個東西。 物理地址尋址的4GB我們剛才已經解釋過,是由PTE決定的。而線程的4GB其實指的是32位線性地址確定的,這個才是和32位系統相關的,和分頁模式無關,32位系統的線性地址就是32位。
二、10-10-12 分頁的缺點
缺點就是物理地址尋址范圍太小了,只有4GB。隨著硬件的發展,物理內存已經超過4GB了,所以我們需要一種新的分頁模式來映射更多的物理內存,2-9-9-12 分頁就應運而生了。
三、2-9-9-12 分頁
先放一張 2-9-9-12分頁的結構圖,有個印象:
2-9-9-12 分頁將物理地址尋址范圍擴大到 2^36=64GB。實現方式就是將物理頁基址由原來的32位擴大到36位,同時為了內存對齊,PTE整體由原來的4字節擴大到了8字節,下面是PTE結構圖:
關于PTE屬性,暫時不表,先解釋一下 2-9-9-12 這幾個數字的含義。
有人可能疑惑說為什么需要PDPT這個表呢?剩下的2位不用不行嗎?答:如果不用,那么線性地址就只有30位了,一個進程最多就只能映射1GB的內存了。
如果上面這段解釋還有疑問,那你就還沒理解進程4GB和物理地址的區別,請從頭開始閱讀這篇博客,這里確實容易產生混淆,要多花時間理解。
本節課只需要理解到這里就夠了,關于PTE的屬性,以及PDE和PDPTE,將在下一節課學習。
四、實驗:線性地址轉換成物理地址
本文演示XP系統2-9-9-12分頁如何將線性地址轉換成物理地址。
XP默認分頁模式就是 2-9-9-12,如果之前改成了10-10-12,就要先改回來。
首先,編寫一個程序,定義一個變量,然后打印它的線性地址。
按2-9-9-12分頁拆分線性地址
00 PDPI=0 00?0000?000 PDI=0 100101111 PTI=12F 111101100000? 物理頁偏移:F60查CR3
!process 0 0
CR3=134c03e0
查PDPTE
!dq 134c03e0+0
PDPTE=00000000`0e662001
PDT=00e662000
查PDE
!dq 00e662000+0
PDE=00000000`0e099067
PTT=00e099000
查PTE
!dq 00e099000+12F*8
PTE=80000000`0de5d067
物理頁基址=00de5d000
查物理地址
!dd 00de5d000+F60
查到數據是0x12345678,證明成功找到物理地址。
用 !vtop 指令驗證:
實驗成功。
總結
以上是生活随笔為你收集整理的(24)2-9-9-12分页(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (23)逆向分析 MmIsAddress
- 下一篇: (25)2-9-9-12分页(下)