1. 概述
10-10-12分页方式最多可达4GB的物理地址,但是随着硬件的发展,4GB的物理地址无法满足要求,因此出现了2-9-9-12分页,这种分布方式又被称为PAE分页。
为什么会出现2-9-9-12分页?
我们知道10-10-12最后的12是物理页偏移,页的大小是4KB是不能变的,所以12是定下来了。
那么要想表示更多的物理内存就必须增大物理页范围,而物理页是由PTE保存的,原来的PTE是4字节,PAE中增加到8字节,物理页范围由原来的4GB,扩大到了一个大到非常离谱的值。因为PTT占用大小是固定的4KB,所以PTE的个数由原来的1024个减少到512个,也就是上面的9。
PDE是一种特殊的PTE,它是用来索引PTE的,所以也是9。
第1个2被用作PDPTE,也就是页目录指针表项,每项占8个字节,共有4个PDPTE,如下图所示:
2. PAE下的PDPTE、PDE、PTE结构体
PDPTE是一个占8个字节的结构体,它的结构如下:
0位:p位,永远是1
PWT:跟TLB表相关
PCD:跟TLB表相关
Avail:给系统使用的
12-35位:页目录表的基址
PDE变成8个字节以后结构也发生了变化:
PAT:Page Attribute Table,针对大页
PTE结构:
在PDE和PTE结构的最高位有一个XD硬件保护位(在AMD中称为NX位)
段的属性有可读、可写、可执行,页的属性有可读、可写,所有的漏洞利用都是把数据当代码来执行,因此Intel做了一个硬件保护位,也就是不可执行位XD。
3. TLB
3.1 TLB概述
通过一个线性地址访问一个物理页要通过PDE和PTE的转换才能读到,而在PAE模式下访问一个物理页要读至少24个字节,如果跨页会读更多,因此效率是一个问题。
CPU内部有一个表叫TLB(Translation Lookaside Buffer),TLB中保存了线性地址和它对应的物理地址,这样访问物理地址的效率就大大提高了。因为TLB是CPU内部的,因此一核一个TLB,多核就有多个TLB。
只要CR3改变了,TLB立刻会进行刷新。
不同的CPU,TLB表的大小是不一样的。
通过INVLPG指令可以删除TLB表中的某一条记录。
3.2 TLB结构
ATTR:如果是PAE模式,就是PDPE+PDE+PTE属性&之后的值,如果是10-10-12就是PDE&PTE
LRU:TLB的空间是有限的,这个字段用来记录已经使用的数量,如果空间已满,系统根据LRU,会将读写次数较少的不常用地址废弃。
3.3 TLB种类
TLB最早在Intel的486CPU开始使用,在x86体系的CPU里面,一般有4组TLB,分别是:
- 缓存一般页表的指令页表缓存
- 缓存一般页表的数据页表缓存
- 缓存大尺寸页表的指令页表缓存
- 缓存大尺寸页表的数据页表缓存