[windows内核]2-9-9-12分页

回顾

之前我们解了10-10-12分页方式,在这种分页方式下物理地址最多可达4GB。但随着硬件的发展,4GB的物理地址范围已经无法满足要求
Intel在1996年就已经意识到这个问题了,所以设计了新的分页方式,也就是我们这次要说的2-9-9-12分页,又称为PAE(物理地址扩展)分页。

具体细节可以再手册第3卷中的4.4 PAE PAGING查看

10-10-12分页 原理

  1. Intel认为一张页的大小为4K是比较合理的,所以先确定页的大小为4K,4KB等于4096个字节,也就是2的12次方,所以32位的最后一部分就确定为了12位
  2. 当初的物理内存比较小,所以4个字节的PTE就够了,加上页的尺寸是4K,所以一个页能存储1024个 PTE,也就是2的10次方,第二个10也就确定了
    [windows内核]2-9-9-12分页_第1张图片
  3. 同理,PDT也需要10个比特位,10+10+12刚好32位

2-9-9-12分页 原理

2-9-9-12分页(PAE,物理地址扩展)

  1. 页的大小是确定的,4KB不能随便改,所以32位的最后一部分就确定为了12位。
  2. 如果想增大物理内存的访问范围,就需要增大PTE,增大了多少呢?考虑对齐的因素,增加到8个字节,由于PTE增大了,而PTT表的大小没变,依然是4KB,所以每张PTT表能放的PTE个数由原来的1024个减少到512个,512等于2的9次方,因此PTI=9

[windows内核]2-9-9-12分页_第2张图片

  1. 由于2的9次方个PDE就能找到所有的PTT表,因此PDI=9
  2. 分配到这里时,还剩下前2位未分配。
    与10-10-12不同,CR3不直接指向PDT表,而是指向一张新的表,叫做PDPT表(页目录指针表)
    PDPT表中的每一个成员叫做PDPTE(Page-Directory-Point-Table Entry,页目录指针表项),每项占8个字节
    PDPT表只有4个成员,因为2位比特位只能满足四种情况:00,01,10,11

下面的彩图也许能帮助你理解
[windows内核]2-9-9-12分页_第3张图片
下面是手册里的转换解释

4K页图解:
[windows内核]2-9-9-12分页_第4张图片
2M页图解:
[windows内核]2-9-9-12分页_第5张图片

这里如果还是不明白原理的话可以去看一下这个

PAE 分页模式详解
https://www.cnblogs.com/ck1020/p/6078214.html

其中关键就是PAE模式下,一个32位的线性地址(虚拟地址)被翻译成一个52位的物理地址
[windows内核]2-9-9-12分页_第6张图片
分页机制中有个重要的概念就是物理页框号,页表能够层层递进正是在页表项中记录了物理页框号
在PAE模式下,使用36根地址线,最大可以索引到64GB的物理内存。由于页表项中有52位可以作为页框号,所以其可以定位更多的物理页框。即使碍于虚拟地址宽度所限,一个进程只能访问4GB空间,但是放大格局。站在系统的角度,则是在其他的进程需要的时候,可以减少换出内存的次数。
如果还是不明白可以看这里

内存分页之PAE分页模式
https://blog.csdn.net/huangkangying/article/details/50740547

Linux内存寻址https://r00tk1ts.github.io/2017/08/18/Linux%E5%86%85%E5%AD%98%E5%AF%BB%E5%9D%80/
[windows内核]2-9-9-12分页_第7张图片
[windows内核]2-9-9-12分页_第8张图片

PDPTE

[windows内核]2-9-9-12分页_第9张图片
P位:第0位,有效位
Avail:这部分供操作系统软件随意使用,CPU不使用
Base Addr:指向PDT表地址,由两部分组成
第一部分:高四字节32~35位
第二部分:低4字节12~31位
这两部分加起来共24位,后12位补0
灰色部分:保留位
PWT位与PCD位不在此展开说,感兴趣可以去看看,在

Table 4-8. Format of a PAE Page-Directory-Pointer-Table Entry (PDPTE)

在这里插入图片描述

PDE

结构如下:

[windows内核]2-9-9-12分页_第10张图片
PAT位:页属性表
只有当PS=1时,PAT位才是有意义的(页属性表只针对页)
PCD位、PWT位不在这里展开说,其他属性位的含义和10-10-12分页一致
[windows内核]2-9-9-12分页_第11张图片

PTE

结构图如下:

[windows内核]2-9-9-12分页_第12张图片
注意:

  1. PTE中12~35位是物理页基址,低12位补0
  2. 物理页基址+12位页内偏移指向具体数据

[windows内核]2-9-9-12分页_第13张图片
[windows内核]2-9-9-12分页_第14张图片
G位这里也不展开说,感兴趣的可以去看看

XD/NX标志位

描述:
Intel中称为XD,AMD中称为NX,即No Excetion

  • 段的属性有可读、可写和可执行
  • 页的属性有可读、可写
  • 当RET执行返回的时候,如果把堆栈里面的数据指向一段提前准备好的数据(把数据当作代码来执行,漏洞都是依赖这点,比如SQL注入也是),那么就会产生任意代码执行的后果
  • 所以,Intel就在这方面做了硬件保护,设置了一个不可执行位 – XD/NX位。
  • 当XD=1时,软件产生了溢出也没有关系,即使EIP蹦到了危险的“数据区”,也是不可以执行的
  • 在PAE分页模式下,PDE与PTE的最高位为XD/NX位.
    PAE没有改变线性地址,只是扩展了物理地址

实验

在PAE模式下通过线性地址找到物理地址
PAE开启和关闭的方法之前有说过这里不再重复

找到字符串的线性地址0x0029DEA8
[windows内核]2-9-9-12分页_第15张图片

将线性地址拆分为2-9-9-12

0x0029DEA8
0000 0000 0010 1001 1101 1110 1010 1000

00				0x0
00 0000 001		0x1
0 1001 1101		0x9D
1110 1010 1000	0xEA8

查看进程CR3
在这里插入图片描述
寻址
[windows内核]2-9-9-12分页_第16张图片
测试成功。

你可能感兴趣的:(Windows内核编程)