一、地址的划分
- 逻辑地址: 通过段寄存器+偏移的形式表示的地址
- 虚拟地址: 通过分段机制将逻辑地址转换成位于虚拟空间中的虚拟地址
- 物理地址: 通过分页机制将虚拟地址转换成物理地址
二、虚拟地址转物理地址(禁用 PAE 的情况)
win7 默认开启 PAE,需要通过下面的指令关闭
BCDEdit /set PAE ForceDisable
BCDEdit /set NX AlwaysOff
- x86 环境下每一个进程都拥有自己的 4GB 虚拟地址空间
- 并且每个进程都拥有自己的页目录表,通过 cr3 可以找到
- 页目录表拥有 1024 个元素的表,每个元素都是 4 字节,保存了页目录项
- 页目录表(PDT) 配合 页目录索引(第一个10) 可以找到页目录项[PDE]
- 页目录项的低 12 位保存的是属性位,去除低 12 位,每一个页目录项可以找到一个页表
- 通过0XC0300000线性地址可以找到PDT
- 页表拥有 1024 个元素的表,每个元素都是 4 字节,保存了页
- 页表(PTT) 配合 页表索引(第二个10) 可以找到 页表项[PTE]
- 页表项的低 12 位保存的是属性位,去除低 12 位,每一个页表项都是一个页基址
- 通过0XC0000000线性地址可以找到PTT
- 通过页基址+偏移(低12位)可以找到对应的物理地址
- 能够保存的最多页数 : 1024 * 1024 -> 0x100000 (0~0xfffff)
三、虚拟地址转物理地址(开启 PAE 的情况(默认))
- 2: 页目录表指针表 -> 4,9: 页目录表 -> 512,9: 页表 -> 512,12: 页基址
- 开启了 PAE 以后,多出了一个页目录表指针表 PDPT -> PDPE
- 即使开启了 PAE,每一个进程的虚拟地址最大仍然是 4 GB,但是在进行页转化的时候,其中的页表项变成了 64位,也就意味着能够映射到的物理地址最大就是 64 位。
物理页属性
P:当前页是否有效,内存紧张挪作他用的时候P位置为0,再次访问会走缺页异常,E号中断
RW:是否可读写
U/S:1为用户,0为系统
A:是否被访问过,访问过为1
D:有没有被写过,被写过为1
PS:1为大页,为大页,PTE没有意义
10-11位:根据这两位判断缺页异常是分配还是被转移
- 1-4位和12-32位有值,10-11位都为0表示被转移到文件中1-4位+12-32位的位置
- 5-9位有值,其他都为0,表示页没分配
- 0-32为全是0,表示分配了没挂或者地址无效,检测EPROCESS结构体中的VADROOT结构体是否有记录
- 5-9位有值。10位为0,11位为1表示当前物理页内容正在转移至文件