要点回顾
物理页的属性 = PDE属性 &(与运算) PTE属性
U/S位
U/S = 0:该物理页只允许特权用户访问。
U/S = 1:该物理页普通用户也可以访问。
实验
修改一个高2G线性地址的PDE/PTE属性,实现R3可读,比如:0x8003F00C。
#include "stdafx.h"
#include <windows.h>
int main(int argc, char* argv[])
{
PDWORD p = (PDWORD)0x8003F00C;
getchar();
printf("读高2G内存地址:%x\n", *p);
return 0;
}
以上代码如果直接执行将会报错。
如果将0x8003F00C这个地址的PDE与PTE的U/S位修改掉,再执行,就不会出错:
说明当前以一个普通用户的身份,已经可以读写高2G的内存地址了。
也就是说纯粹是页的限制。
P/S位
PS(PageSize)位,只对PDE有意义。
PS = 0:无PTE。
PS = 1:PDE直接指向物理页,低22位不需要再拆分,直接就是物理页的页内偏移。
线性地址只能拆成2段,且大小为4MB,俗称大页。
实验
分析0x8043F00C线性地址的PDE属性。
A位
是否被访问过(读或者写),访问过置1,即使只访问一个字节也会导致PDE、PTE的A位置1。
D位
是否被写过。
D = 0:没有被写过。
D = 1:被写过。
关于G、PWT、PCD位
此处暂时不做介绍,需要拥有控制寄存器以及TLB的知识才能继续来了解。