2016-12-09

近期想查看下系统分配了的页的页表项的标志位,但是发现资料较少,所以还是记录下,希望可以对某些朋友有所帮助!

系统:win7 32位虚拟机

平台:KVM虚拟化平台


win7 32位默认是开启了PAE分页模式的,PAE分页模式本质上和普通的32位分页并无区别,只是页表结构和虚拟地址的划分有所不同,这点就不单独讲述,感兴趣可参考另一篇博文:PAE 分页模式详解

首先写了一件简单的内核NT驱动,分配了一个页的内存,然后写入数据0xa1b2c3d4

加载驱动:

看到申请的内存的地址是0x85d55000,我们直接看下这块内存:

确实是我们写入的数据,然后开始查看页表,首先获取的是页表基地址,我们通过当前进程查看:

可以看到页基址是7ee47400,这正是当前CR3寄存器保存的页基址,该地址指向一个页目录指针表(page-directory-pointer-table),需要注意的是该表一共有4个表项,每个表项八个字节,并且在PAE模式下,地址转换不直接使用CR3寄存器,而是第一级的页目录指针分配了四个PDPTE寄存器,每个保存一个页目录指针,但是也目录指针寄存器的值却是来源于CR3指向的页目录指针表。所以我们仍然可以直接利用CR3来寻址。

我们先分解下目标虚拟地址:

按照 结构分成四部分:10    000101110      101010101     000000000000,对应16进制:0x2      0x2e       0x155        0x0

查看7ee47400内容,由于表项是8字节,所以使用dq(大小端模式问题)

根据虚拟地址,知道该地址对应表中第三项,即图中标记的表项,取物理页框号+偏移得:4595b000+0x2e*8=4595b170

查看该地址:

对应的表项内容为05e07863,同样取物理页框号+偏移得:05e07000+0x155*8=05e07aa8

查看地址内容:

得到表项内容为7fe95963 ,这个就是这个就是最终的PTE了,即指向一个4KB 页面,物理页框号为7fe95000,而由于我们是申请的就是一个页,即页内偏移为0,所以这里同样也是我们虚拟地址对应的物理地址

查看内容:

至此,整个查表过程就完成了。

windbg遍历进程页表查看内存的更多相关文章

  1. linux下对进程按照内存使用情况进行排序

    linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...

  2. 利用windbg探索进程和进程上下文

    1.列出所有活动进程 使用!process命令可以打印出活动进程的信息.第一个参数是要打印的EPROCESS的地址,如果指定为0则表示打印所有的进程.第二个参数用于说明打印进程信息的详细级别.指定0则 ...

  3. HBase 学习笔记---守护进程及内存调优

    1.HMaster           HMaster的任务前面已经说过了,两个大方向:一.管理Hbase Table的 DDL操作 二.region的分配工作,任务不是很艰巨,但是如果采用默认自动s ...

  4. 进程与线程(二) java进程的内存模型

    从我出生那天起,我就知道我有个兄弟,他桀骜不驯,但实力强悍 ,人家都叫它C+++            ----java 上回说到了,C进程的内存分配,那么一个java运行过程也是一个进程,java内 ...

  5. .NET(C#):获取进程的内存私有工作集

    当前.NET Framework(.NET 4.0)的Process仅提供进程的内存工作集的获取(通过WorkingSet64属性),而没有提供对私有工作集的获取.注意在Windows Vista之后 ...

  6. 通过WriteProcessMemory改写进程的内存

    http://www.cnblogs.com/feiyucq/archive/2009/10/21/1587628.html 以PROCESS_ALL_ACCESS权限打开进程以后既能够使用ReadP ...

  7. VC中遍历进程并获取进程信息

    代码如下: /***************************************************/ /* 函数: 遍历进程信息 /* 参数:进程名称 例如: aaa.exe /* ...

  8. Windows中进程的内存结构

    基础知识: 栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对栈的插入和删除操作被称为入栈和出栈. 有一组CPU指令可以实现对进程 ...

  9. Android进程的内存管理分析

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...

随机推荐

  1. nginx解析漏洞

    一个比较老的漏洞了,但是今天在一个交流群里大佬们有那么一个案例.就深入学习了一下其原理. Nginx当检查url最后的文件名为脚本的时候,他就会把整个程序当作脚本来执行,否则就当作非脚本执行. 正确上 ...

  2. git学习(一):git的版本库在哪儿

    查看版本 git --version # 查看git的版本 设置或者查看用户名和邮箱 git config --global user.name "tuhooo" // 如果后面没 ...

  3. Unix系统编程()信号类型和默认行为

    信号类型和默认行为 就是讲了有多少个信号类型 好多啊,后面用到了再看...

  4. [ucos]了解ucos

    1. uCosIII移植到STM32F10x http://www.cnblogs.com/hiker-blogs/archive/2012/06/13/2547176.html 2. uCosIII ...

  5. Android——Android Bundle详解(转)

    Android Bundle详解 1 Bundle介绍 Bundle主要用于传递数据:它保存的数据,是以key-value(键值对)的形式存在的. 我们经常使用Bundle在Activity之间传递数 ...

  6. mysql实现经纬度计算两个坐标之间的距离sql语句

    select *,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(111.86141967773438-latitude)/360),2)+COS(PI()*33.070 ...

  7. linux查看端口命令和kill

    1.查看  netstat -atunlp 2kill:kill -9 PID

  8. C语言错误 指针的类型错误

    //指针的类型错误 #include<stdio.h> #include<stdlib.h> #include<string.h> //用const来限制形参的指向 ...

  9. 下面哪些属于JSTL中的表达式操作标签。(选择1项)

    A.<c:out> B.<c:if> C.<c:url> D.<c:catch> 解答:A

  10. JVM与外界通过数据通道进行数据交换

    使用I/O流访问file中的内容. JVM与外界通过数据通道进行数据交换. 分类: 按流分为输入流和输出流: 按传输单位分为字节流和字符流: 还可以分为节点流和过滤流. 节点流:负责数据源和程序之间建 ...