19.x64下算出PTE

本文详细解析了X64架构下的内存管理,包括PTE(页表项)、PDE(页目录项)和PDPTE/PML4E的计算方法,以及如何基于0的PTE定位关键函数。通过固定公式演示了从线性地址到物理地址的转换过程,适合深入理解64位系统内存布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

一、X64内存的算法:

1.首先定位到页目录基质,也就是线性地址0的PTE,WIN7固定是0xFFFFF68000000000

通过固定公式计算可以得到0的PDE\PDPTE\PML4E,把PTE当成一个线性地址来计算

PTE:                 0xFFFFF68000000000

PDE:                 0xFFFFF6FB40000000 ,算法:((页目录基质&0xffff ffff ffff)>>0xc) *8 + 页目录基质

PDPTE:          0xFFFFF6FB7DA00000 ,算法:((PDE&0xffff ffff ffff)>>0xc) *8 + 页目录基质

PML4E:          0xFFFFF6FB7DBED000,算法:((PDPTE&0xffff ffff ffff)>>0xc) *8 + 页目录基质

以上都可以当做基质来算每个线性地址

 

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

 

 

二、PML4E的算法PML4E的index*8+PML4E基质

((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>39)<<3+0xFFFFF6FB7DBED000=0xFFFFF6FB7DBEDFA8

 

三、PDPTE的算法PDPTE的index*8+PDPTE基质 

((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>30)<<3+0xFFFFF6FB7DA00000 =0xFFFFF6FB7DBF5000

 

四、PDE的算法PDE的index*8+PDE基质 

((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>21)<<3+0xFFFFF6FB40000000 =0xFFFFF6FB7EA00698

 

五、PTE算法:PTE的index*8+PTE基质 

((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>12)<<3+0xFFFFF68000000000=0xFFFFF6FD400D3140

六、上面的算法得到了999912的算法,但是一切都是围绕着0的PTE(页目录表基质)已知的情况下,定位MiReturnSystemVa / MiSystemWsMetaPage/MmGetVirtualForPhysical/MmIsAddressValid 函数,硬编码得到

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值