WIndows内核学习笔记:分页机制——PAE分页模式

本文详细介绍了Windows内核中的PAE(Physical Address Extension)分页模式,包括4种分页模式的特性,如32位、PAE、4-level和5-level模式。重点讨论了PAE模式,包括PDPTE寄存器和线性地址到物理地址转换的过程。此外,还提供了实验内容,实现了一个用于浏览页表的工具,涉及到MFC和驱动开发。
摘要由CSDN通过智能技术生成

前言

物理地址扩展 Physical Address Extension(缩写PAE)。
解释:正常情况32位CPU可以存取4G的物理内存,但在现实中,实际情况是内存的发展速度大于CPU的发展速度,所以才有了让32位CPU存取超过4G内存的需求。实现方式就是给CPU增加了4根地址线,达到36根,于是可寻址64G大小的内存。

Intel到目前为止设计了4种分页模式,分别是:32位、PAE、4-level、5-level这四种模式。本文主要讲了Intel是如何设计PAE模式的页表相关数据结构。

  • “Chapter 4 Paging”部分,是笔者在阅读Intel手册时做的翻译笔记,对应原文的 Volume3: Chapter 4 Paging。翻译有不准确的地方,以原文为准。可以在这里下载手册。Intel® 64 and IA-32 Architectures Software Developer Manuals
  • “实验题”部分,实现了一个可以浏览进程页表的小工具,可以在这里查看源码。github源码

Chapter 4 Paging

4.1 分页模式和控制位

分页控制有关的寄存器

  • CR0 标志位:WP(bit 16)、PG(bit 31)
  • CR4 标志位:PSE(bit 4)、PAE(bit 5)、PGE(bit 7)、PCIDE(bit 17)、SMEP(bit 20)、SMAP(bit 21)、PKE(bit 22)、CET(bit 23)、PKS(bit 24)
  • IA32_EFER MSR 标志位:LEM(bit 8)、NXE(bit 11)
  • EFLAGS 标志位:AC(bit 18)

软件(应该指操作系统)如何启用分页功能:确保CR3中是分页结构表的物理内存地址,然后使用MOV指令置CR0.PG位。


4.1.1 四种分页模式

本节内容:根据 CR0.PG、CR4.PAE、CR4.LA57和IA32_EFER.LME,判断是否启用分页,以及是开启的什么分页模式。

CR0.PG = 0 表示未启用分页模式,此时会把线性地址直接当作物理地址使用。

CR0.PG = 1 表示启用分页模式。 Paging can be enabled only if protection is enabled (CR0.PE = 1)。此时由CR4.PAE、CR4.LA57、和IA32_EFER.LME决定启用哪种分页模式。

  • 32-bit paging 模式 CR4.PAE = 0 (详见4.3节)
  • PAE paging 模式 CR4.PAE = 1 and IA32_EFER.LME = 0 (详见4.4节)
  • 4-level paging 模式 CR4.PAE = 1, IA32_EFER.LME = 1, and CR4.LA57 = 0 (4表示4层表寻找Pages页,详见4.5节)
  • 5-level paging 模式 CR4.PAE = 1, IA32_EFER.LME = 1, and CR4.LA57 = 1 (5表示5层表寻找Pages页,详见4.5节)
    32-bit 和PAG模式用于保护模式32位模式,IA32_EFER.LME = 0
    4-level和5-level模式用于64位模式(IA-32e表示64位模式),IA32_EFER.LME = 1

四种模式的区别:

  • 线性地址宽度
  • 物理地址宽度
  • 分页大小:4K、2M、4M、1G
  • 支持execute-disable,数据执行保护
  • 支持PCIDs,操作系统可以启用缓存线性地址的功能,不是很懂,先放放
  • 支持 protection keys,不知道干嘛的
    四种分页模式的差异
    4-level5-level模式还有两个子模式:
  • 兼容模式:兼容32位的模式
  • 64位模式:虽然是64位线性地址,但是实际上4-level只使用了低48位做线性地址,而5-level页只使用低57位,物理地址线都只有52根。

4.1.2 启用和切换分页模式

本节内容:根据 CR0.PG、CR4.PAE、CR4.LA57和IA32_EFER.LME,如何启用并且切换不同的分页模式
讲解在不同模式之间切换的规则,这部分不感兴趣,略过。


4.1.3 分页属性控制

本节内容:通过CR0.WP、CR4.PSE、CR4.PGE、CR4.PCIDE、CR4.SMEP、CR4.SMAP、CR4.PKE、CR4.CET、CR4.PKS和IA32_EFER.NXE控制在不同分页模式下Pages的属性

  • CR0.WP
    写入数据保护标志位:
    等于0, supervisor-mode(应该指0环应用程序)可以向具有只读属性的页写数据;等于1,则不可以操作。
    这个标志位对User-mode(应该时3环应用程序)没有影响,因为只要是只读属性的页,3环程序都不能写。
    (4.6节有更详细的介绍)

  • CR4.PSE
    是否启用4M分页:
    只对32-bit paging 模式作用,等于0,表示分页大小只能是4K;等于1,可以选择4K或4M分页。其它三种模式的分页大小可以自由选择,不受该位的控制。(4.3节有更详细的介绍)

  • CR4.PGE
    是否启用全局共享页:
    等于0,不同进程间不会共享物理内存;等于1,进程间可以共享物理内存。(可能翻译的不对,帖上原文)
    CR4.PGE enables global pages. If CR4.PGE = 0, no translations are shared across address spaces; if CR4.PGE = 1,
    specified translations may be shared across address spaces.(4.10.2.4节有更详细的介绍)

  • CR4.PCIDE
    启用process-context identifiers,对4-level5-level模式作用。
    PCIDs逻辑处理器缓存多个线性地址。(4.10.1节有更详细的介绍)

  • CR4.SMEP
    If CR4.SMEP = 1, software operating in supervisor mode cannot fetch instructions from linear addresses that are accessible in user mode.(4.6节有更详细的介绍)

  • CR4.SMAP
    If CR4.SMAP = 1, software operating in supervisor mode cannot access data at linear addresses that are accessible in user mode. Software can override this protection by setting EFLAGS.AC.

  • CR4.PKE and CR4.PKS
    4-level和5-level模式将每一个线性地址与保护key相关联。
    CR4.PKE=1时,PKRU寄存器表示,user-mode的线性地址所关联的保护key,是否可读或可写。
    CR4.PKS=1时, the IA32_PKRS MSR does the same for supervisor-mode linear addresses.

  • CR4.CET
    这个好难理解。
    If CR4.CET = 1, certain memory accesses are identified as shadow-stack accesses and certain linear addresses translate to
    shadow-stack pages.

  • IA32_EFER.NXE
    执行保护,对4-level5-level模式作用。如果设为1,则不能执行指令,但是可以读指令。


4.1.4 Enumeration of Paging Features by CPUID

这部分保护标志位的意义和用法。
PSE: page-size extensions for 32-bit paging.
PAE: physical-address extension.
PGE: global-page support.
PAT: page-attribute table.
PSE-36: page-size extensions with 40-bit physical-address extension.
PCID: process-context identifiers.
SMEP: supervisor-mode execution prevention.
SMAP: supervisor-mode access prevention.
PKU: protection keys for user-mode pages.
OSPKE: enabling of protection keys for user-mode pages.
CET: control-flow enforcement technology.
LA57: 57-bit linear addresses and 5-level paging.
PKS: protection keys for supervisor-mode pages.
NX: execute disable.
Page1GB: 1-GByte pages.
LM: IA-32e mode support.
CPUID.80000008H:EAX[7:0] reports the physical-address width supported by the processor.
CPUID.80000008H:EAX[15:8] reports the linear-address width supported by the processor.


4.2 分层页表结构概览

不同模式使用的页表结构是不一样的,有的只是用2张表,有的则更多。
每张表的大小都是4096字节,对于32-bit模式,每一项是4字节,共1024项;对于其它三种模式,每一项是8字节,每张表512项。PAE模式是个特例,它的第一张表只有4项。

不同模式对线性地址的处理是不一样的,详细章节会讲。

这里提出了两个名词:page frame 线性地址中用来寻址的部分;page offset 线性地址中用作偏移的部分。

每一项中的地址部分都是物理内存地址。

第一张表总是保存在CR3寄存器中。

四种模式解析线性地址(4K分页举例):

  • 32-bit模式:32:22(10位)表1下标,21:12(10位)表2下标,11:0(12位)用作分页内的偏移量。
  • PAE模式:31:30(2位)表1下标,29:21(9位)表2下标,20:12(9位)表3下标,11:0(12位)分页内的偏移量。
  • 4-level模式:每张表都是512项,总共4张表,所以47:39、38:30、29:21、20:12对应4张表的下标,11:0(12位)分页内的偏移量。
  • 5-level模式:使用5张表,56:48是第一张表下标,其余的根4-level模式的一样。

总结上面的解析线性地址过程,其实就是查表,查表,再查表。有些情况查表过程可能会中断,比如说遇到缺页异常时。
还有两种特殊的情况:

  • 查表过程中,剩余没有解析的线性地址宽度超过12位,如果当前表项的属性位bit 7(PS位—page size)等于1,当前项就是最后的页
  • 查表过程中,剩余没有解析的线性地址宽度等于12位,bit 7不再是PS位,另有它用,当前项则指向另一个表

对上述的第一种情况举例:
32-bit模式,如果分页大小是4M(CR4.P

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值