Windows記憶體管理-分頁

紅人發表於2021-12-12

0x01未開啟PAE分頁模式

cr0 暫存器pg位為1就是開啟分頁模式之後說有的地址都是虛擬地址 經過換算得到實體地址再去訪問

ps=0時

 

ps=1時

 

 

 

 

 

計算方法,這裡的pde 是頁目錄 pte 頁表  cr3 是實體地址  下面是個實際例子

 

 

 

這裡取得 31-12位 地址後面都要補充000 因為頁大小是4k ,他們的欄位分別是

 

 

 英特爾手冊上面的

 

 

 

 

0x02開啟PAE分頁32位模式

 

 

 可以看到在開啟pae 模式 實體地址擴充套件模式   32根地址線變成52根 這是 64位cpu 執行時 擴充套件方法

32位擴充套件 應該是 36為地址線 這裡演示是64位 cpu 執行32的程式 地址  

64位cpu 預設是48位地址線 開啟擴充套件是52位計算方法一樣

 

 

 開啟pae標誌位  在cr4暫存器的第6個位置, 比沒開啟時多加了一個 pdpte 表 用來多定址多的4根線地址

pde ps位=0 就是4kb的頁, ps=1 就是2mb的頁

 

每個標誌位  多加了xd標誌頁的執行許可權

 

 

 

 

 

 

0x03開啟PAE分頁64位模式

 

 

 和上面一樣 多加了 pml4e 用來定址更多的線

 

 

 

 

 

 

 

 

 其實沒什麼東西 按照裡面的地址會拆分就行 知道怎麼算實體地址

0x04 32位解析例子

 

 

 cr4 拆分  第6個是 1 開啟了pae模式  這是一個32位系統按照上面32地址拆分

6f9=  xxxx 1111 xxxx  

8003f000 地址 拆分

10    0 0000 0000     0 0011 1111     0000  0000  0000

offset :0

pdpt:2

pde:0

pte:3f

這裡找就是

cr3地址*1000h+2*8=pdpt地址

 

 

 頁目錄地址就是 000717000  偏移0

 

 

 頁目錄屬性  163= xxxx  0110  xxxx  ps=0 是一個4k的頁  接著看 4k 頁表解析就行了

 

 

 pa=00003f000+0 offset  就是真實實體地址

 

 

 和 gdtr 一樣   0

 

 

 如果是2mb的頁也是按照上面的方法找對應圖表的地址解析

0x05 64位解析例子

 

 

 看前面圖知道 64位 預設是48跟線  後面都是保留位   真實地址 f88003faa9a8   

 

 

 

找gdtr 實體地址 64位系統 cr3=3ea64

f80005115000

1  1111 0000      0 0000 0000      0 0010 1000         1 0001 0101          0000 0000 0000

offset :000

pml4: 115

pdpt:1f0

pde:28

pte:115

 

 

 得到pml4表

 

 得到頁目錄指標表   063=xxxx 0110 xxxx  ps=0第8位不是1 不是1gb的頁 

 

 得到pte 表  063  ps=0 不是2mb 的頁   這是是4k的頁 代表按 4k頁 地址解析

 

 得到頁表地址

 

 對比2個地址

 

 

一樣找的沒錯

 

相關文章