zoukankan      html  css  js  c++  java
  • 操作系统学习笔记(二) 页式映射及windbg验证方式

    页式映射

    本系列截图来自网络搜索及以下基本书籍:

    《Windows内核设计思想》

    《Windows内核情景分析》

    《WINDOWS内核原理与实现》

    一个32位虚拟地址,该地址其实分为三个部分:页目录表偏移、页表偏移和页偏移。其22-31位表示页目录表偏移,12-21位表示页表偏移,剩下的0-11位表示页面内偏移。

    映射过程如下:

    以最常见的物理页面为4K规格为例。

    首先我们获得一个32位虚拟地址,然后查询CR3寄存器,确认页目录表(PDT)的位置,根据虚拟地址22-31位的偏移值找到该页面目录项(PDE),该页面目录项指向一个页表(PT),再根据虚拟地址12-21位的偏移值找到该页面项(PTE),该页面项指向一个4K大小的内存页,根据虚拟地址的0-11位的页面内偏移找到物理地址。

    页面目录表的偏移和页面表的偏移之所以是10位

    是因为2的10次方=1024

    也就是页面目录表和页面表的中包含有1024个选项

    每个选项保存的是一个32位地址(指向页表或者物理内存页) 也就4字节

    1024*4 = 4K

    刚好就是一个物理页面的长度

    而虚拟地址中的页偏移是0-11位 刚好12位

    2的12次方式4096 也就是4K

    刚好描述一个物理内存页的小大。

     //==============================

    使用windbg来验证分页机制

    参考:http://www.cnblogs.com/winston/archive/2009/04/12/1434225.html

    实验环境: 32位windows操作系统 未开启PAE地址扩展

    安装了windbg调试器

    首先开启计算器 在其中输入9999几个数字

    使用windbg 附加到这个计算器进程上

    输入 x calc!gpsz*

    如下:

    0:002> x calc!gpsz*
    01014dc4 calc!gpszNum = <no type information>

    再看看 01014dc4  这个地址包含了什么

    0:002> dd 01014dc4
    01014dc4 000b11d8 00000008 00000000 00000001
    01014dd4 00000000 00000000 ffffffff 00000000
    01014de4 00000000 00000006 00330032 00320034

    再看看地址000b11d8 存储的什么数字

    0:002> du 000b11d8
    000b11d8 "9999."

    到这里我们就可以确认 进程 calc.exe 中地址000b11d8 存储内容为"9999.";

    我们再开启一个windbg 进入本地内核调试模式 kernel debug->local

    先获取所有进程信息

    kd> !process 0 0 

    PROCESS 84a5c278 SessionId: 0 Cid: 0b0c Peb: 7ffd4000 ParentCid: 00a8
    DirBase: 0d69a000 ObjectTable: e1fba560 HandleCount: 44.
    Image: calc.exe

    PROCESS 845ed400 SessionId: 0 Cid: 0be0 Peb: 7ffdd000 ParentCid: 00a8
    DirBase: 17b94000 ObjectTable: e1ee9ac0 HandleCount: 108.
    Image: windbg.exe

    PROCESS 8454da10 SessionId: 0 Cid: 0f68 Peb: 7ffdf000 ParentCid: 041c
    DirBase: 0c5f7000 ObjectTable: e1e739b8 HandleCount: 112.
    Image: wuauclt.exe

    PROCESS 84a5fc00 SessionId: 0 Cid: 059c Peb: 7ffd3000 ParentCid: 0330
    DirBase: 0c13d000 ObjectTable: e1f9d820 HandleCount: 155.
    Image: wmiprvse.exe

    得到calc.exe进程信息 其中DirBase: 0d69a000即是指向页面目录表的物理页面

    而在页面目录表的偏移就是虚拟地址000b11d8 的高10位 就是0(0000 0000 00)

    使用!dd 查看物理地址内容 页面目录表加偏移的内容

    kd> !dd 0d69a000 +0
    # d69a000 0d881867 0d667867 0d443867 00000000
    # d69a010 0d834867 00000000 00000000 00000000
    # d69a020 00000000 00000000 00000000 00000000
    # d69a030 00000000 00000000 00000000 00000000
    # d69a040 00000000 00000000 00000000 00000000
    # d69a050 00000000 00000000 00000000 00000000
    # d69a060 00000000 00000000 00000000 00000000
    # d69a070 00000000 00000000 00000000 00000000

    0d881867即使页面表的物理地址,同样我们只取高20位,低12位是该物理页面的属性记录

    页面表的偏移是虚拟地址000b11d8 中间10位 也就是 0b1 (00 1011 0001)

    读取页面表加偏移的内容

    kd> !dd 0d881000 +b1*4 l1
    # d8812c4 0d75e867

    最后获得了页面 页面同样只取高20位,低12位是该物理页面的属性记录

    偏移是虚拟地址000b11d8 低12位也就是1d8

    kd> !dd 0d881000 +b1*4 l1
    # d8812c4 0d75e867

    使用!du 指令来读取物理页面的内容

    kd> !du 0d75e000+1d8
    # d75e1d8 "234234."

    与虚拟地址000b11d8  内容一致

    即 calc.exe进程中  虚拟地址000b11d8转化为物理地址0d75e000+1d8

  • 相关阅读:
    读取.robot文件写入excel文件中示例
    提示框、滚动条处理与JS的应用
    下拉框
    切换框架ifame
    层级定位
    定位一组元素
    Appium元素定位方法
    python+appium基本启动配置
    adb命令使用
    Python接口测试框架搭建
  • 原文地址:https://www.cnblogs.com/itdef/p/5832195.html
Copyright © 2011-2022 走看看