当前位置: 首页 > news >正文

nt!MiInitializePfn函数分析之nt!MiPfPutPagesInTransition函数的关键一步

第一部分:
VOID
MiInitializePfn (
    IN PFN_NUMBER PageFrameIndex,
    IN PMMPTE PointerPte,
    IN ULONG ModifiedState
    )

1: kd> t
nt!MiInitializePfn:
80a8482e 55              push    ebp
1: kd> kc
 #
00 nt!MiInitializePfn
01 nt!MiPfPutPagesInTransition
02 nt!MmPrefetchPages
03 nt!CcPfPrefetchSections
04 nt!CcPfBootWorker
05 nt!PspSystemThreadStartup
06 nt!KiThreadStartup


1: kd> dv
 PageFrameIndex = 0x7b19b
     PointerPte = 0xe13a70a0
  ModifiedState = 0


1: kd> dd 0xe13a70a0
e13a70a0  f930e4d4

    Pfn1 = MI_PFN_ELEMENT (PageFrameIndex);
    Pfn1->PteAddress = PointerPte;            关键代码1:

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 001ec66c 00000000 00003000
81b8a698  0007b15b 03ffffff

1: kd> p
nt!MiInitializePfn+0x46:
80a84874 895e04          mov     dword ptr [esi+4],ebx
1: kd> r
eax=001714d1 ebx=e13a70a0 ecx=81000000 edx=81000000 esi=81b8a688 edi=00000000

    Pfn1->PteAddress = PointerPte;            之后:

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000000 00003000
81b8a698  0007b15b 03ffffff

第二部分:

    if (PointerPte->u.Hard.Valid == 1) {

    }
    else {
        Pfn1->OriginalPte = *PointerPte;                    关键代码2:
        ASSERT (!((Pfn1->OriginalPte.u.Soft.Prototype == 0) &&
                    (Pfn1->OriginalPte.u.Soft.Transition == 1)));
    }


1: kd> dd e13a70a0
e13a70a0  f930e4d4

        Pfn1->OriginalPte = *PointerPte;    之后:    
1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000000 00003000
81b8a698  f930e4d4 03ffffff


第三部分:

    ASSERT (Pfn1->u3.e2.ReferenceCount == 0);
    Pfn1->u3.e2.ReferenceCount += 1;

    Pfn1->u2.ShareCount += 1;
    Pfn1->u3.e1.PageLocation = ActiveAndValid;
    Pfn1->u3.e1.CacheAttribute = MiCached;        关键代码3:

typedef enum _MI_PFN_CACHE_ATTRIBUTE {
    MiNonCached,                    0
    MiCached,                    1
    MiWriteCombined,                2
    MiNotMapped                    3
} MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000000 00003000
81b8a698  f930e4d4 03ffffff

    Pfn1->u3.e1.CacheAttribute = MiCached;之后:

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00013000
81b8a698  f930e4d4 03ffffff

第四部分:


#define MI_SET_MODIFIED(_Pfn, _NewValue, _CallerId)             \
            ASSERT ((_Pfn)->u3.e1.Rom == 0);                    \
            MI_SNAP_DIRTY (_Pfn, _NewValue, _CallerId);         \
            if ((_NewValue) != 0) {                             \
                MI_STAMP_MODIFIED (_Pfn, _CallerId);            \
            }                                                   \
            (_Pfn)->u3.e1.Modified = (_NewValue);

#if 0
#define MI_STAMP_MODIFIED(Pfn,id)   (Pfn)->u4.Reserved = (id);
#else
#define MI_STAMP_MODIFIED(Pfn,id)            没有定义
#endif

1: kd> dv
 PageFrameIndex = 0x7b19b
     PointerPte = 0xe13a70a0
  ModifiedState = 0

    if (ModifiedState == 1) {
        MI_SET_MODIFIED (Pfn1, 1, 0xB);
    }
    else {
        MI_SET_MODIFIED (Pfn1, 0, 0x26);        
    }


1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00011600
81b8a698  f930e4d4 03ffffff

第五部分:

    //
    // Determine the page frame number of the page table page which
    // contains this PTE.
    确定包含此PTE的页表页的页帧号。

    PteFramePointer = MiGetPteAddress(PointerPte);


#define MiGetPteAddress(va) ((PMMPTE)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))


1: kd> !pte 0xe13a70a0
                 VA e13a70a0
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV


1: kd> dd C0384E9C
c0384e9c  007d8963

    PteFramePointer = MiGetPteAddress(PointerPte);    =edi=c0384e9c
    if (PteFramePointer->u.Hard.Valid == 0) {

1: kd> p
nt!MiInitializePfn+0x10d:
80a8493b f60701          test    byte ptr [edi],1
1: kd> r
eax=00011600 ebx=e13a70a0 ecx=81000000 edx=81000000 esi=81b8a688 edi=c0384e9c


第六部分:

#define MI_GET_PAGE_FRAME_FROM_PTE(PTE) ((PTE)->u.Hard.PageFrameNumber)


    PteFramePage = MI_GET_PAGE_FRAME_FROM_PTE (PteFramePointer);    007d8
    ASSERT (PteFramePage != 0);
    Pfn1->u4.PteFrame = PteFramePage;                    关键代码4:
    

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00011600
81b8a698  f930e4d4 03ffffff

1: kd> dd 0xe13a70a0
e13a70a0  f930e4d4


1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00011600
81b8a698  f930e4d4 000007d8                7d8的由来!!!

7d8的由来!!!    

1: kd> !pte 0xe13a70a0
                 VA e13a70a0
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV

1: kd> !dc 7d80a0
#  7d80a0 f930e4d4 00000000 0c020002 74536d4d ..0.........MmSt        


e13a70a0和f930e4d4和000007d8三者的密切关系


0xe13a70a0和C0384E9C的一致性:

1: kd> !pte 0xe13a70a0
                 VA e13a70a0
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV


1: kd> !pte c0384e9c
                 VA e13a7000
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV

第七部分:
    //
    // Increment the share count for the page table page containing
    // this PTE.
    //

    Pfn2 = MI_PFN_ELEMENT (PteFramePage);

    Pfn2->u2.ShareCount += 1;

1: kd> dd 81000000+7d8*18
8100bc40  00000371 c0384e9c 000000c5 00021601
8100bc50  00000080 a000a1c0


1: kd> dd 81000000+7d8*18
8100bc40  00000371 c0384e9c 000000c6 00021601
8100bc50  00000080 a000a1c0


1: kd> !dc 0x7b19b000
#7b19b000 00000000 00000000 00000000 00000000 ................
#7b19b010 00000000 00000000 00000000 00000000 ................
#7b19b020 00000000 00000000 00000000 00000000 ................
#7b19b030 00000000 00000000 00000000 00000000 ................

http://www.xdnf.cn/news/504865.html

相关文章:

  • Golang 范型
  • 编程日志5.10
  • QLoRA: Efficient Finetuning of Quantized LLMs
  • acwing5579 增加模数
  • 深入了解 VPC 端点类型 – 网关与接口
  • Stacking(堆叠):集成学习中的“超级英雄团队”
  • STM32+ESP8266连接onenet新平台
  • 【嵌入式DIY实例-Arduino篇】-OLED实现乒乓游戏
  • Seata源码—5.全局事务的创建与返回处理二
  • nodejs特性解读
  • 小刚说C语言刷题—1230蝴蝶结
  • 业务系统上线为什么这么难
  • 【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行项目配置并安装
  • 【RocketMQ Broker 相关源码】- 清除不活跃的 broker
  • JavaScript【6】事件
  • windows 11安装Python3.9、mujoco200、mujoco_py2.0.2.8、metaworld
  • 51单片机仿真突然出问题
  • 如何在 Windows 11 或 10 的 CMD 中检查固件
  • 元件伏安特性及基尔霍夫定理的相量形式
  • 【as 在长难句中有哪几种翻译?】
  • 北京市工程技术人才职称评价基本标准条件解读
  • PLC和变频器之间如何接线
  • 2020CCPC河南省赛题解
  • V型不锈钢对夹球阀:高性价比工业控制解决方案-耀圣
  • 项目复习(2)
  • 黑客帝国电子表html
  • java中的包机制
  • 信任的进阶:LEI与vLEI协同推进跨境支付体系变革
  • (面试)View相关知识
  • 【强化学习】#5 时序差分学习