MmGetPhysicalAddress分析

MmGetPhysicalAddress是一个Windows内核函数,用于获取虚拟地址对应的物理地址。它首先判断输入的BaseAddress是否已经是物理地址,如果是则直接转换;否则,通过MiGetPteAddress获取PTE,并检查其有效性。如果PTE无效,则返回错误信息;有效时,从PTE中获取物理页框号并完成物理地址的计算。函数最后调整字节偏移。此函数对于理解Windows内存管理至关重要。
摘要由CSDN通过智能技术生成

代码如下:

PHYSICAL_ADDRESS
MmGetPhysicalAddress (
     IN PVOID BaseAddress
     )
{
    PMMPTE PointerPte;
    PHYSICAL_ADDRESS PhysicalAddress;

 //判断是否在[0x80000000,0xA0000000)中,如果是,这段内存被映射到物理内存中[0,20000000),这段内存采用4MB大小的分页。

    if (MI_IS_PHYSICAL_ADDRESS(BaseAddress)) {
        PhysicalAddress.QuadPart = MI_CONVERT_PHYSICAL_TO_PFN (BaseAddress);
    } else {

        PointerPte = MiGetPteAddress(BaseAddress);

  //如果PTE的内容为NULL,则不对应任何物理内存。

        if (PointerPte->u.Hard.Valid == 0) {
            KdPrint(("MM:MmGetPhysicalAddressFailed base address was %lx",
                      BaseAddress));
            ZERO_LARGE (PhysicalAddress);
            return PhysicalAddress;
        }

  //从PTE中读取物理内存地址。
        Physi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值