前置知识:

在 windows 中 保护模式 有两种模式: 段保护 和 页保护

段保护 主要体现在 段选择子上;但是数据段、代码段、栈段等采用的都是4GB平坦模式,段的特征并没有那样展现。所以具体的保护机制 采用的是页保护。

PAE和 非PAE:

页保护 有两种:

  • 非 PAE

  • PAE

开启 PAE:

在 boot.ini 中 设置:为 noexcute -- 即不可执行 ;激活 DEP 的功能 -在这个时候 使用的是 PAE(因为早期的非PAE 并不支持数据执行保护);

选择 为 execute -optin 后 这里的 数据执行保护 是灰色的 根本就不能设置。这时候 就是 非 PAE 模式下。相反 就是 PAE 模式下。

图解 非 PAE:

图解 PAE:

注意: 内核地址中 专门有一块却与用来存放 pte表、pde 表的 非pae 是 4MB , pae 由于每项是8byte 所以变为 8MB;

这里 假设一个虚拟地址 0x403018 则:

手动模拟 解析 PAE地址:

  1. 获取测试进程的cr3

    > !process 0 0 // 获取当前进程列表,找到测试进程的 dirbase = cr3

  2. 解析虚拟地址 0x403018

    > .formats 0x403018 // 查看二进制

    然后手动分解 pdpte pde pte offset :

    ---// 00 000000010 000000011 000000011000

    ---// 0 2 3 18

  3. 结合windbg 找对应的物理地址:

    1. 找 pdpte 中的项 pde 的地址

      cr3 + 8*0

    2. 找 pde 中的项 pte 的地址

      pde + 2*8

    3. 找 pte 中 页的地址

      pte + 3*8

    4. 页的 地址 + offset 即 是 目标物理地址

      p + 18

  4. 如图:

/i 进程调度的时候 切换 进程到指定进程:

g 运行起来 激活 调度;以至于到目标进程的时候停下来

查看 当前进程 的 cr3

使用 db 查看这时候进程空间 虚拟地址 数据

使用 windbg 解析 虚拟地址对应的物理地址:

!vtop 有两个参数

第一个对应的是 cr3

第二个参数 是 对应进程的虚拟地址。

使用 !pte 0xaddr 查看对应addr 中的页属性(前提:必须切换到当前进程,cr3也需要切换到,即 !process 0 0; .process /i xxxxx;g;)

通过下面这两个公式 解析出所在的 pde 、pte

修改pte 属性,关闭dep

10_PAE_非PAE的更多相关文章

  1. x86平台上的Windows页表映射机制

    首先,在x86架构的处理器上,一个正常页面大小为4KB,非PAE模式下,CR3持有页目录页面的物理地址,PDE和PTE格式相同大小为4字节.此时每个页表页面包含1024个PTE,可以映射1024个页面 ...

  2. 云计算大数据:Xen、KVM、VMware、hyper-v等虚拟化技术的比较

    1.Xen.KVM.VMware.hyper-v等虚拟化技术的比较,xen和kvm,是开源免费的虚拟化软件. vmware是付费的虚拟化软件. hyper-v比较特别,是微软windows 2008 ...

  3. Linux分页机制之概述--Linux内存管理(六)

    1 分页机制 在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的物理地址(phisical address). 很显然,这个页表是需要常驻内 ...

  4. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  5. Linux内核调试方法总结

    Linux内核调试方法总结 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2   ...

  6. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

  7. Linux-3.14.12内存管理笔记【建立内核页表(3)

    前面已经分析了内核页表的准备工作以及内核低端内存页表的建立,接着回到init_mem_mapping()中,低端内存页表建立后紧随着还有一个函数early_ioremap_page_table_ran ...

  8. 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)

    doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...

  9. Spring源码分析:非懒加载的单例Bean初始化过程(下)

    上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...

随机推荐

  1. 怎么在vue-cli中利用 :class去做一个底层背景或者文字的点击切换

    // html <div class="pusherLists" :class="{hidden: isHidden}"> <span @cl ...

  2. MySQL中orderby和limit分页数据重复的问题

    背景 读取规则是按照某表中sequence字段排序的,而这个字段是让人手工填写的.那么,可想而知,数据一多,难免会出现填写的值相同的情况. 综上所述,可能就会导致以下两条sql出现数据重叠的情况: s ...

  3. shell常见的返回状态码

  4. KiCAD差分布线

    KiCAD差分布线方法 KiCAD在进行差分布线的时候,会自动按照网路名称生成差分对,所以差分对的名称必须是以_P_N或+/-结束,这样才能找到一对差分对,比如说CAN网络,可以定义为CAN_P/CA ...

  5. 学习记录:@Transactional 事务不生效

    测试时使用spring boot2.2.0,在主类中调用,@Transactional 不起作用,原代码如下: @SpringBootApplication @Slf4j @Component pub ...

  6. day11 python名称空间 作用域

    day11 python   一.三元运算符 def func(a, b):     return a if a > b else b   print(func(44,66))     二:函数 ...

  7. leetcode-164周赛-1266-访问所有点的最小时间

    题目描述: 自己的解: class Solution: def minTimeToVisitAllPoints(self, points: List[List[int]]) -> int: re ...

  8. 谷歌浏览器srcoll时,控制台一直报错

    如果是使用betheme-child主题,在wp后台去掉这个srcoll插件 目录是wp后台的Betheme——Theme Options——Addons & Plugins——Addons— ...

  9. TreeSet集合在哪种情况下会报错

    1.自然排序中的元素对象,都必须实现了Comparable接口,否则会抛出异常,案例如下: public class MySetTree { public static void main(Strin ...

  10. Java——异常的基本概念

    1.异常的基本概念 1.1什么是异常 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格 ...