19.x64下算出PTE

X64下用的是9-9-9-9-12的分页模式,PML4E-PDPTE-PDE-PTE-偏移,线性地址的前16位是作符号扩展,后48位是分页模式.

1.PTE是直接指向物理内存的,X86下有个固定的页目录表0xc0000000 可得到所有地址信息,X64下为了安全起见,页目录表随机了,文章末有分析如何得到。

一、PTE的算法:

1.已一个线性地址为例0xfffffa801a628b30,下面先拆分

PML4E:1111 1010 1                1F5

PDPTE:000 0000 00                0

PDE:01 1010 011                     D3

PTE:0 0010 1000                       28

偏移:1011 0011 0000               B30

 

PTE先理解为线性地址 

 

 

 

19.x64下算出PTE

2.首先,每次启动系统后0地址的PTE是固定的,每隔0x1000大小PTE会增加8,由此先得到0的PTE,再根据大小便可算出0xfffffa801a628b30的PTE

已知、0的PTE为0xfffffa801a628b30,根据算法(线性地址48位÷0x1000)*8+0的PTE=线性地址PTE

(0xfa801a628b30>>12)<<3+0xFFFFF68000000000=0xFFFFF6FD400D3140  (符合图上)

 

二、PDE的算法:把PTE理解成线性地址,(PTE线性地址48位>>21)*8+0的PTE=线性地址PDE

(0xF6FD400D3140  >>21)<<3+0xFFFFF68000000000=0xFFFF F6FB 7EA0 0698

 

三、PDPTE的算法:把PDE理解成线性地址,(PDE线性地址48位÷0x1000)*8+0的PTE=线性地址PDPTE

(0xF6FB7EA00698>>12)<<3+0xFFFFF68000000000=0xFFFF F6FB 7DBF 5000

 

四、PML4E的算法:PML4E理解成线性地址,(PDPTE线性地址48位÷0x1000)*8+0的PTE=线性地址PML4E

(0xF6FB 7DBF 5000>>12)<<3+0xFFFFF68000000000=0xFFFF F6FB 7DBE DFA8

 

五、上面的算法得到了999912的算法,但是一切都是围绕着0的PTE已知的情况下,定位MiReturnSystemVa / MiSystemWsMetaPage 函数,硬编码得到

 

19.x64下算出PTE

 

 

 

上一篇:CISP-PTE 2021真题


下一篇:虚拟内存的那点事儿