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

nt!MiInitializeSystemCache函数分析之PointerPte->u.List.NextEntry的由来

第一部分:
1: kd> dd 0xc0304200
c0304200  c10c0000 00000000 00000000 00000000
c0304210  00000000 00000000 00000000 00000000
c0304220  00000000 00000000 00000000 00000000
c0304230  00000000 00000000 00000000 00000000
c0304240  00000000 00000000 00000000 00000000
c0304250  00000000 00000000 00000000 00000000
c0304260  00000000 00000000 00000000 00000000
c0304270  00000000 00000000 00000000 00000000
1: kd> dd 0xc0304300
c0304300  c1100000 00000000 00000000 00000000
c0304310  00000000 00000000 00000000 00000000
c0304320  00000000 00000000 00000000 00000000
c0304330  00000000 00000000 00000000 00000000
c0304340  00000000 00000000 00000000 00000000
c0304350  00000000 00000000 00000000 00000000
c0304360  00000000 00000000 00000000 00000000
c0304370  00000000 00000000 00000000 00000000
1: kd> dd 0xc0304400
c0304400  c1140000 00000000 00000000 00000000
c0304410  00000000 00000000 00000000 00000000
c0304420  00000000 00000000 00000000 00000000
c0304430  00000000 00000000 00000000 00000000
c0304440  00000000 00000000 00000000 00000000


第二部分:
VOID
MiInitializeSystemCache (
    IN ULONG MinimumWorkingSet,
    IN ULONG MaximumWorkingSet
    )


    //
    // Build a free list structure in the PTEs for the system cache.
    //

    MmSystemCachePteBase = MI_PTE_BASE_FOR_LOWEST_KERNEL_ADDRESS;

    SizeOfSystemCacheInPages = MI_COMPUTE_PAGES_SPANNED (MmSystemCacheStart,
                                (PCHAR)MmSystemCacheEnd - (PCHAR)MmSystemCacheStart + 1);

    HunksOf256KInCache = SizeOfSystemCacheInPages / (X256K / PAGE_SIZE);

    PointerPte = MiGetPteAddress (MmSystemCacheStart);

    MmFirstFreeSystemCache = PointerPte;

    for (i = 0; i < HunksOf256KInCache; i += 1) {
        PointerPte->u.List.NextEntry = (PointerPte + (X256K / PAGE_SIZE)) - MmSystemCachePteBase;
        PointerPte += X256K / PAGE_SIZE;
    }

PointerPte->u.List.NextEntry = (PointerPte + (X256K / PAGE_SIZE)) - MmSystemCachePteBase;

(PointerPte + (X256K / PAGE_SIZE))表示指针,MmSystemCachePteBase表示指针
减完要除以4,表示个数,右移2位


第三部分:

#define PAGE_SIZE                   0x1000
#define X256K 0x40000

1: kd> ?0x40000/0x1000
Evaluate expression: 64 = 00000040

0100 0000
0100 0000 00
01    00 00    00 00    =    0x100

0xc0304000+0x100=0xc0304100
0xc0304100-0xc0000000=0x304100

304100

0011 00    00     0100     0001     0000 0000
11 00    00     0100     0001     0000 00
11 00    00     01    00     00    01     00    00 00
c1040

 

      +0x000 List             : _MMPTE_LIST
         +0x000 Valid            : Pos 0, 1 Bit
         +0x000 OneEntry         : Pos 1, 1 Bit
         +0x000 filler0          : Pos 2, 8 Bits
         +0x000 Prototype        : Pos 10, 1 Bit
         +0x000 filler1          : Pos 11, 1 Bit
         +0x000 NextEntry        : Pos 12, 20 Bits

1: kd> x nt!MmSystemCachePteBase
80b2358c          nt!MmSystemCachePteBase = 0xc0000000

1: kd> dd 0xc0304000
c0304000  c1040000

第四部分:

0xc0304200

0xc0304300

304300
0011 0000 0100 0011 0000 0000

11 0000 0100 0011 0000 0000 00

11 00    00 01    00 00    11 00    00 00    00 00
c10c0

1: kd> dd 0xc0304200
c0304200  c10c0000 00000000 00000000 00000000
c0304210  00000000 00000000 00000000 00000000
c0304220  00000000 00000000 00000000 00000000
c0304230  00000000 00000000 00000000 00000000
c0304240  00000000 00000000 00000000 00000000
c0304250  00000000 00000000 00000000 00000000
c0304260  00000000 00000000 00000000 00000000
c0304270  00000000 00000000 00000000 00000000
1: kd> dd 0xc0304300
c0304300  c1100000 00000000 00000000 00000000
c0304310  00000000 00000000 00000000 00000000
c0304320  00000000 00000000 00000000 00000000
c0304330  00000000 00000000 00000000 00000000
c0304340  00000000 00000000 00000000 00000000
c0304350  00000000 00000000 00000000 00000000
c0304360  00000000 00000000 00000000 00000000
c0304370  00000000 00000000 00000000 00000000
1: kd> dd 0xc0304400
c0304400  c1140000 00000000 00000000 00000000
c0304410  00000000 00000000 00000000 00000000
c0304420  00000000 00000000 00000000 00000000
c0304430  00000000 00000000 00000000 00000000
c0304440  00000000 00000000 00000000 00000000

第五部分:F:\srv03rtm\base\ntos/mm/mapcache.c:39:PMMPTE MmSystemCachePteBase;

MmSystemCachePteBase类型是指针,+1相当于+4,向左移两位。


    PointerPte = MmFirstFreeSystemCache;            0xc0304000

    //
    // Update next free entry.
    //

    ASSERT (PointerPte->u.Hard.Valid == 0);

    MmFirstFreeSystemCache = MmSystemCachePteBase + PointerPte->u.List.NextEntry;
    ASSERT (MmFirstFreeSystemCache <= MiGetPteAddress (MmSystemCacheEnd));

0xc1040+0xc0000000=0xc00c1040

1: kd> dd 0xc0304000
c0304000  c1040000


      +0x000 List             : _MMPTE_LIST
         +0x000 Valid            : Pos 0, 1 Bit
         +0x000 OneEntry         : Pos 1, 1 Bit
         +0x000 filler0          : Pos 2, 8 Bits
         +0x000 Prototype        : Pos 10, 1 Bit
         +0x000 filler1          : Pos 11, 1 Bit
         +0x000 NextEntry        : Pos 12, 20 Bits

c1040
1100 0001 0000 0100 0000  
11    00 00    01 00    00 01    00 00    00 00

304100
c0304100

http://www.lryc.cn/news/2393125.html

相关文章:

  • MQTT协议,EMQX部署,MQTTX安装学习
  • 如何理解UDP 和 TCP 区别 应用场景
  • 60天python训练计划----day40
  • 干泵,干式螺杆真空泵
  • Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(五):语音合成输出与交互增强
  • 职业本科院校无人机专业人才培养解决方案
  • 利用机器学习优化数据中心能效
  • 软件评测机构如何保障质量?检测资质、技术实力缺一不可
  • 微软开源bitnet b1.58大模型,应用效果测评(问答、知识、数学、逻辑、分析)
  • ubuntu 安装上传的 ffmpeg_7.1.1.orig.tar.xz并使用
  • Web3怎么开发类似MetaMask的钱包
  • Linux多线程(六)之线程控制4【线程ID及进程地址空间布局】
  • 1.什么是node.js、npm、vue
  • Xamarin入门笔记(Xamarin已经被MAUI取代)
  • 排查Oracle文件打开数过多
  • 应用层协议http(无代码版)
  • 8.5 Q1|广州医科大学CHARLS发文 甘油三酯葡萄糖指数累积变化与 0-3期心血管-肾脏-代谢综合征人群中风发生率的相关性
  • 交叉编译tcpdump工具
  • 【Python-Day 20】揭秘Python变量作用域:LEGB规则与global/nonlocal关键字详解
  • golang 柯里化(Currying)
  • 无人机停机坪运行技术分析!
  • comfyui 工作流中 视频长度和哪些参数有关? 生成15秒的视频,再加上RTX4060 8G显卡,尝试一下
  • 【Java Web】速通HTML
  • 在线制作幼教早教行业自适应网站教程
  • WSL 开发环境搭建指南:Java 11 + 中间件全家桶安装实战
  • matlab天线阵列及GUI框架,可用于相控阵,圆形阵,矩形阵
  • 在 Ubuntu 终端中配置网络代理:优化 npm、apt等的下载速度
  • Apptrace:APP安全加速解决方案
  • Dockerfile 构建优化的方法
  • Web攻防-SQL注入增删改查HTTP头UAXFFRefererCookie无回显报错