文章目录
- Overview
- References
- 4.1 PAGING MODES AND CONTROL BITS
- 4.1.1 three paging models
- 4.1.2 Paging-Mode Enabling
- 4.1.3 Paging-Mode Modifiers
- 4.1.4 Enumeration of Paging Features by CPUID
- 4.2 HIERARCHICAL PAGING STRUCTURES: AN OVERVIEW
- 4.3 32-bit paging
- 4.4 PAE paging
- 4.4.1 PDPTE Registers
- 4.4.2 Linear-Address Translation with PAE Paging
- 4.5 4-LEVEL PAGING
- 4.10 CACHING TRANSLATION INFORMATION
- 4.10.1 Process-Context Identifiers (PCIDs)
- 4.10.2 Translation Lookaside Buffers **(快表)**
- 4.10.2.1 Page Numbers, Page Frames, and Page Offsets
- 4.10.2.2 Caching Translations in TLBs
- 4.10.2.3 Details of TLB Use
- 4.10.2.4 Global Pages
- 4.10.3 Paging-Structure Caches**(分页结构缓存)**
- 4.10.3.1 Caches for Paging Structures
- 4.10.3.2 Using the Paging-Structure Caches to Translate Linear Addresses
- 4.10.3.3 Multiple Cached Entries for a Single Paging-structure Entry
- 4.10.4 Invalidation of TLBs and Paging-Structure Caches
- 4.10.4.1 Operations that Invalidate TLBs and Paging-Structure Caches
- 4.10.4.2 Recommended Invalidation
- 4.10.4.3 Optional Invalidation
- 4.10.4.4 Delayed Invalidation
- 4.10.5 Propagation of Paging-Structure Changes to Multiple Processors
- 4.11 INTERACTIONS WITH VIRTUAL-MACHINE EXTENSIONS(VMX)
- 4.11.1 VMX Transitions
- 4.11.2 VMX Support for Address Translation
- 4.12 USING PAGING FOR VIRTUAL MEMORY
- 4.13 MAPPING SEGMENTS TO PAGES
- Footnote
Overview
第一段:
- 分段可以将逻辑地址转化为线性地址(第3章)。
- 分页(线性地址转换)是线性地址的转换过程,该过程可以被用来访问内存或输入/输出设备。
- 分页机制将每个线性地址转化为物理地址,并且可以设置转换过程中的参数,比如限制==地址的访问权限(Section 4.6)以及访问地址的内存类型(Section 4.9)==等。
分页机制
第二段:
- 第 4.1 节中,英特尔 64 处理器支持三种不同的分页模式,这些模式在本节中进行了区分和定义。
- 第 4.2 节概述了所有模式中使用的映射机制。
- 第 4.3 节、第 4.4 节和第 4.5 节详细讨论了三种分页模式。
- 第 4.6 节详细说明了如何分页和如何定义访问权限。(x)
- 第 4.7 节讨论了分页可能产生的异常(页面错误异常)。(x)
- 第 4.8 节考虑了处理器如何在发生已访问和脏标志条件下,向线性地址写入数据。(x)
- 第 4.9 节描述了分页如何确定访问线性地址的内存类型。(x)
- 第 4.10 节详细介绍了处理器如何缓存线性地址转换时的信息(TLB)。
- 第 4.11 节概述了分页和某些 VMX 特征之间的相互作用。
- 第 4.12 节概述了如何使用分页来实现虚拟内存。
References
x64 结构体系下的内存寻址
内存管理(4)x86_32地址映射(扩展机制)分析
内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理
Linux X86在下面TLB机制
TLB 的作用及工作原理
CR[0-4] 寄存器
特殊位 | 含义 |
CR0.PG | 1:开启分页 |
CR0.WP | 页面保护,即使是 supervisor-mode |
CR4.PSE | (32-bit)0:4K/1:4K(M) |
CR4.PAE | PAE 分页模式 |
CR4.PGE | 页面跨地址空间共享 |
CR4.PCIDE | (4-level)启用进程上下文标识符 |
CR4.SMEP | 免受 supervisor 指令提取(execution) |
CR4.SMAP | 免受 supervisor 数据提取(access) |
CR4.PKE | 允许线性地址关联 PK |
CR4.CET | 控制流执行 shadow stack |
IA32_EFER 寄存器
PDPTE 寄存器
页面目录指针表(PDPT)中共有 4 个 64bit 项,称为 PDPTEs。每个 PDPTE 控制 1G 线性地址空间的访问。对应 PDPTE,逻辑处理器分别维护 4 个架构无关的内部 PDPTE 寄存器,分别为 PDPTE0、PDPTE1、PDPTE2、PDPTE3。说明内存中存在 PDPT,并且还有四个对应的寄存器?
eflags 寄存器
拓展位的影响
CR0.PG | CR4.PAE | CR4.PSE | PDE.PS | Page Size | Physical Address Size |
0 | X | X | X | - | Paging Disabled |
1 | 0 | 0 | X | 4 KB | 40 bits |
1 | 0 | 1 | 0 | 4 KB | 40 bits |
1 | 0 | 1 | 1 | 4 MB | 40 bits |
1 | 1 | X | 0 | 4 KB | 52 bits |
1 | 1 | X | 1 | 2 MB | 52 bits |
逻辑地址-线性地址-物理地址
4.1 PAGING MODES AND CONTROL BITS
第一段,分页过程相关的寄存器以及相应的位:
- The WP and PG flags in control register CR0 (bit 16 and bit 31, respectively).
- The PSE, PAE, PGE, PCIDE, SMEP, SMAP, PKE, and CET flags in control register CR4 (bit 4, bit 5, bit 7, bit 17, bit 20, bit 21, bit 22, and bit 23, respectively).
- The LME and NXE flags in the IA32_EFER MSR (bit 8 and bit 11, respectively).
- The AC flag in the EFLAGS register (bit 18).
第二段:
开启分页过程:首先设置 CR3 寄存器中的内容(线性地址转换过程中的第一个分页结构的物理地址),然后,再通过 MOV 命令,控制 CR0.PG 开启分页。三种不同的分页模式下, CR3 的使用详见 Table 4-3、Table 4-7、Table 4-12。
开启分页机制示例代码
movl %cr0, %eax
orl $0x80000000, %eax
movl %eax, %cr0
第三段:
- Section 4.1.1 介绍了 CR0.PG、CR4.PAE、IA32_EFER.LME 这三个变量决定是否开启分页,以及开启何种分页模式。
- Section 4.1.2 介绍了如何控制上述三个变量来建立或者更改分页模式。
- Section 4.1.3 介绍了这些 CR0.WP , CR4.PSE, CR4.PGE, CR4.PCIDE, CR4.SMEP , CR4.SMAP , CR4.PKE, CR4.CET , and IA32_EFER.NXE 控制器位如何再次细化每种分页模式中的不同功能。
4.1.1 three paging models
第一段:
- 如果 CR0.PG=0,则分页机制不可用,逻辑处理器将所有线性地址视为物理地址。
- 当分页机制不可用时,CR4.PAE, IA32_EFER.LME,CR0.WP, CR4.PSE, CR4.PGE, CR4.SMEP , CR4.SMAP, IA32_EFER.NXE, CR4.CET 被处理器忽略,因为它们会影响线性地址的访问权限。
第二段:
- 只有 CR0.PE = 1 1时,才能够将 CR0.PG 置位,从而开启分页只有保护模式开启了,才能开启分页?。
- 开启分页后,系统将处于三种分页模式下,而这些分页模式由 CR4.PAE 和 IA32_EFER.LME 来确定。
- 32-bit paging
- CR0.PG=1 & CR4.PAE=0 & IA32_EFER.LME=0,(Section 4.3)。
- 使用 CR0.WP、CR4.PSE、CR4.PGE、CR4.SMEP、CR4.SMAP、CR4.CET 寄存器中的控制位,(Section 4.1.3 & Section 4.6)。
- PAE paging
- CR0.PG=1 & CR4.PAE=1 & IA32_EFER.LME=0,(Section 4.4)。
- 使用 CR0.WP、CR4.PGE、CR4.SMEP、CR4.SMAP、CR4.CET、IA32_EFER.NXE 寄存器中的控制位,(Section 4.1.3 & Section 4.6)。
- 4-level paging23
- CR0.PG=1 & CR4.PAE=1 & IA32_EFER.LME=1,(Section 4.5)。
- 使用 CR0.WP、CR4.PGE、CR4.PCIDE、CR4.SMEP、CR4.SMAP、CR4.PKE、CR4.CET、IA32_EFER.NXE 寄存器中的控制位,(Section 4.1.3 & Section 4.6),该分页模式仅在支持 Intel64 架构的处理器上可用。
三种分页模式在以下细节方面不同:
- 线性地址宽度。可以转换的线性地址的大小。
- 物理地址宽度。分页产生的物理地址的大小。
- 页面尺寸。线性地址转换的粒度,同一页上的线性地址被转换成同一页上相应的物理地址。
- 支持执行禁用访问权限。在某些分页模式下,可以阻止程序从可读的页面中获取指令。
- 支持PCIDs。通过 4-level 模式,程序可以实现逻辑处理器为多个线性地址空间缓存信息的功能。当程序在不同的线性地址空间之间切换时,处理器可以保留缓存的信息。
- 支持保护键。通过4-level 模式,程序可以启用一种功能,通过这种功能,每个线性地址都与一个保护密钥相关联。程序可以使用新的控制寄存器来访问与保护密钥相关联的线性地址。
NOTES:
- 物理地址宽度受限于最大物理地址(MAXPHYADDR,Section 4.1.4)。
- 处理器会确保当 CR0.PG=1 & CR4.PAE=0 时,IA32_EFER.LME=0。
- 当对于 4MB 的页面 并且 支持 PSE-36(Page Size Extension,物理地址36位)40位? 机制时,32 位分页才支持超过 32 位的物理地址宽度(Section 4.1.4 & Section 4.3)。
- 在 32-bit 分页模式下,只有当 CR4.PSE=1 时,4MB 分页大小有效,Section 4.3。
- 当 IA32_EFER.NXE=1 时,禁用访问权限有效(Execute-disable access rights,Section 4.6)。
- 并不是所有的处理器都支持 4-level 以及 1GB 分页大小(Section 4.1.4)。
- 当 CR4.PCIDE=1 时,PCIDs 功能可被使用(Section 4.10.1);只有某些条件成立时,保护键功能可以使用(Section 4.6.2)。
- 当 IA32_EFER.LME=0 时,32-bit 分页模式和 PAE 模式被激活,因为保护模式下不能产生大于 32 位的线性地址,因此 32-bit 分页模式和 PAE 分页会转换为 32 位线性地址。当 IA32_EFER.LME=1 时,4-level 分页模式被启用(当然 CR4.PAE=1 以及 CR0.PG=1),该模式使用 IA-32E(Earlier versions of this manual used the term “IA-32e paging” to identify 4-level paging.) 模式(其实是 4-level 分页模式定义了 IA-32E 模式),IA-32E 模式具有两个子模式:
- 兼容模式。该模式仅使用 32 位线性地址,位 47:32 视为 0。
- 64-bit 模式。这种模式产生 64 位线性地址,处理器确保这种地址的位 63:47 是相同的4,4-level 分页模式并不会使用 48:63 位(高 16 位不用)。
4.1.2 Paging-Mode Enabling
如果 CR0.PG=1,根据 CR4.PAE 和 IA32_EFER.LME 两个值,逻辑处理器将处于三种分页模式中的一种,下图说明了如何启用这些模式并在它们之间进行转换。
- 三种模式下,都可以复位 PG 实现关闭分页功能。
- 32-bit、PAE 模式、no Paging 三种情况可以任意转换。
- 4-level 模式必须先置位 PAE 和 LME ,最后才能置位 PG 位。
- IA32_EFER.LME 不能在 CR0.PG=1 时被修改,如果使用 WRMSR 试图这样做,会导致一般保护异常(general-protection exception —— #GP(0))。
- 当 CR4.PAE=0 以及 IA32_EFER.LME=1 时,尝试置位 CR0.PG 会导致一般保护异常(#GP(0))。
- 当 4-level 分页模式启动时,尝试复位 CR4.PAE 位会导致一般保护异常(#GP(0))。
- 无论当前处于何种模式下,都可以复位 PG 位来实现分页禁用。
- 程序可以在 32-bit 模式以及 PAE 模式之间任意转换。
- 程序不能够在 4-level 和其它两种模式之间直接转换,它必须先复位 PG,然后再置位 CR4.PAE & IA32_EFER.LME,最后再置位 CR0.PG,该分页模式才能够被激活,否则会 #GP(0)。
- VMX 允许三种分页模式之间进行转换,但是不是通过使用 MOV 指令或者 WRMSR 改变 CR 实现,这是因为再 VMX 转换过程中,CR0,CR4 和 IA32_EFER 的值是一次加载完毕的,Section 4.11.1。
4.1.3 Paging-Mode Modifiers
每种分页模式下的不同功能细节由以下寄存器位来确定:
- ==CR0.WP 5==允许保护页面免受监管模式(supervisor-mode)的写入。如果 CR0.WP = 0,在监管模式下,可以对具有只读访问权限的线性地址进写访问;如果 CR0.WP = 1,则即使在监管模式下,对只读页面都不能够写访问。无论 CR0 的值如何,用户模式下,写访问永远不允许访问具有只读访问权限的线性地址,Section 4.6。
- 【32-bit】CR4.PSE(page-size extensions for 32-bit paging)支持 32 位分页模式的 4M 字节页面。如果 CR4.PSE = 0,32 位分页只能使用 4k 字节的页面;如果 CR4.PSE = 1,32 位分页可以使用 4k 字节的页面和 4M 字节的页面,Section 4.3,(该值与 PAE 模式和 4-level 模式能够使用的分页页面大小无关,仅与 32-bit 模式有关)。
- CR4.PGE(global-page support)启用全局页面。如果 CR4.PGE = 0,那么页面映射不能跨地址空间共享;如果 CR4.PGE = 1,指定的页映射可以跨地址空间共享(Section 4.10.2.4)。
- 【4-level】==CR4.PCIDE(process-context identifiers)为 4-level 分页模式启用进程上下文标识符(PCIDs)。==只有在使用 4-level,PCIDE才能为 1。PCIDs允许逻辑处理器为多个线性地址空间缓存信息。Section 4.10.1。
- CR4.SMEP(supervisor-mode execution prevention)允许页面受到保护,免受监视模式6中指令的提取。如果 CR4.SMEP=1,在监视模式下运行的程序不能从用户模式下获取可访问的线性地址的指令,Section 4.6。
- CR4.SMAP(supervisor-mode access prevention)允许保护页面免受监管模式的数据访问。如果 CR4.SMAP = 1,在管理模式下运行的软件不能访问在用户模式下可访问的线性地址上的数据,软件可以通过设置 EFLAGS.AC 来覆盖这种保护, Section 4.6。
- 【4-level】CR4.PKE 允许每个线性地址与一个保护密钥相关联。PKRU 寄存器决定程序是否可以读取或写入带有该保护密钥的线性地址,Section 4.6。
- CR4.CET(control-flow enforcement technology)支持控制流执行技术,包括影子堆栈功能(用于保护程序免受堆栈缓冲区溢出的影响?)。如果CR4.CET = 1,某些内存可以访问被识别为影子堆栈的地址空间,并且某些线性地址也能够被转换为影子堆栈,Section 4.6(只有在 CR0.WP=1时,才能设置该位。)
- 【PAE、4-level】IA32_EFER.NXE 启用 PAE 分页和 4-level 的执行禁用访问权限。如果 IA32_EFER.NXE = 1,可以防止从指定的线性地址提取数据即使允许从这些地址读取数据),希望使用此功能来限制从可读页面提取指令的程序必须使用 PAE 分页或 4-level 分页,Section 4.6。
CR0.WP、CR4.SMEP、CR4.SMEP 三种区别?
4.1.4 Enumeration of Paging Features by CPUID
CPUID 指令返回处理器标识(identification)和功能信息(feature information),返回值存放在EAX、EBX、ECX、EDX中。
CPUID 就是一条读取 CPU 各种信息的一条指令,允许软件发现处理器的详细信息,大概是从 80486 的某个版本开始就存在了。似乎是从 80386 开始,当 CPU 被 RESET 以 后,CPU 会在EDX寄存器中返回一个 32bits 的 CPU 签名(Processor Identification Signature),但这时候 CPU 还没有 CPUID 这条指令,后来出现了这条指令后,软件无需以来 CPU 复位就可以读出这个 CPU 签名,同时还可以读出很多 CPU 的相关信息。 CPUID 这条指令,除了用于识别 CPU(CPU的型号、家族、类型等),还可以读出 CPU 支持的功能(比如是否支持 MMX,是否支持 4MB 的页等等), 内容的确是十分丰富。
软件可以使用 CPUID 指令发现对不同分页功能的支持:
- PSE:32-bit 分页模式拓展位。
如果 CPUID.01H:EDX.PSE[bit 3]=1(01H:CPUID 命令功能号),则 CR4.PSE可以被置1,此时 32-bit 分页模式可支持 4MB 分页情况,(Section 4.3)。 - PAE:物理地址拓展。
如果 CPUID.01H:EDX.PAE[bit 6]=1,说明 CR4.PAE=1,此时 PAE 分页模式被激活。(4-level 分页模式也需要使用该位)。 - PGE:全局页支持位。
如果 CPUID.01H:EDX.PGE[bit 13]=1,说明 CR4.PGE=1,全局页功能被开启。(Section 4.10.2.4) - PAT:页面属性表。
如果 CPUID.01H:EDX.PAT[bit 16]=1,说明 PAT 功能开启,即能够支持 8 个表项的页面属性表功能被开启。当 PAT 功能开启时,某些分页结构中的三位(表示内存属性7)会从 PAT 中选取。 - 【32-bit】PSE-36:40-bit 物理地址拓展(非 36-bit 物理地址?)8。
如果 CPUID.01H:EDX.PSE-36[bit 17]=1,则支持 PSE-36 机制9,这表明在 32 bit 分页模式下,使用 4MB 页面的页映射可能会产生 40 位的物理地址,该技术允许 4MB 的页面与 4KB 物理页面共存。 - PCID:进程上下文标识符。
如果 CPUID.01H:ECX.PCID[bit 17]=1,那么说明 CR4.PCIDE=1,进程上下文转换功能开启,(Section 4.10.1)。 - SMEP:supervisor-mode execution prevention.
如果 CPUID.(EAX=07H,ECX=0H):EBX.SMEP[bit 7]=1,那么说明 CR4.SMEP=1, supervisor-mode execution prevention 功能激活,(Section 4.6)。 - SMAP:supervisor-mode access prevention.
如果 CPUID.(EAX=07H,ECX=0H):EBX.SMAP[bit 20]=1,那么说明 CR4.SMAP=1, supervisor-mode accessprevention 功能激活,(Section 4.6)。 - PKU: protection keys.
If CPUID.(EAX=07H,ECX=0H):ECX.PKU [bit 3] = 1, CR4.PKE=1, enabling protection keys (Section 4.6). - CET: control-flow enforcement technology.
If CPUID.(EAX=07H,ECX=0H):ECX.CET_SS [bit 7] = 1, CR4.CET=1, enabling shadow-stack pages (Section 4.6). - NX: execute disable.
If CPUID.80000001H:EDX.NX [bit 20] = 1, IA32_EFER.NXE=1, 允许 PAE 分页和 4-level 来禁止对所选页面的访问 (Section 4.6). (不支持功能号为 80000001H 的处理器不允许 IA32_EFER.NXE 置为 1)。 - 【4-level】Page1GB: 1-GByte pages.
如果 CPUID.80000001H:EDX.Page1GB [bit 26] = 1, 那么 1GB 分页大小被支持,1-GByte 在 4-level 分页模式中会使用到 (see Section 4.5)。 - 【4-level】LME: IA-32e mode support.
If CPUID.80000001H:EDX.LM [bit 29] = 1, IA32_EFER.LME=1(4-level 分页模式), 80000001H:最大功能拓展号,enabling 4-level paging. (不支持 80000001H 功能号的处理器不允许 IA32_EFER.LME=1). - CPUID.80000008H:EAX[7:0] 可以获取处理器支持的物理地址宽度(MAXPHYADDR)。(对于不支持 80000008H 功能号的处理器,如果 CPUID.01H:EDX.PAE [bit 6] = 1,那么物理地址宽度一般为 36(40/52?),否则为 32,MAXPHYADDR 最大为 52。
- CPUID.80000008H:EAX[15:8] 可以获取处理器支持的线性地址宽度。一般来说,如果 CPUID.80000001H:EDX.LM [bit 29] = 1 那么这个值是 48,否则是 32(如果不支持功能号为 80000008H 功能号的处理器,仅支持 32 位的线性地址宽度)。
4.2 HIERARCHICAL PAGING STRUCTURES: AN OVERVIEW
第一段:
三种分页模式均是由多级分页结构(页表)来实现线性地址到物理地址的转换,Section 4.3、4.4、4.5 分别介绍了三种分页模式的详细信息。
第二段:
- 每个页表的大小为 4096 字节,由多个表项组成。
- 32-bit 分页模式,每个表项为 4B,因此,每个页表中有 1024 个页表项。
- 对于 PAE 分页模式和 4-level 分页模式,每个页表项是 8B,因此,每个页表中有 512 个页表项。(PAE 分页模式包括一个例外,它具有一个 32 字节大小的页表(PDPT),包含 4 个 8B 页表项)。
第三段:
- 处理器使用线性地址的高端来实现一系列的分页结构(多级页表)。
- 这些结构中的最后一个来标识线性地址转换到的区域的物理地址(称为页面帧)。
- 线性地址的较低部分(页面偏移量)标识线性地址转换到的区域内的特定地址。
第四段:
每个分页结构(页表)项中都包含一个物理地址,它是另一个分页结构(页表)的地址,或者是一个页面帧(物理页)的地址。在第一种情况下,该分页结构(页表)被认为引用了另一个分页结构(页表);在后者中,被认为映射了一个页面。
第五段:
- 用于任何分页模式的第一个分页结构的物理地址均位于 CR3 中。
- 线性地址转换为物理地址的过程是一种迭代过程。
- 线性地址的一部分(最初是最高位)选择分页结构(页表)中的一个表项(最初是使用CR3定位的那个分页结构)。如果该页表项引用了另一个分页结构(页表),则该过程将继续使用下面的分页结构(页表),并使用刚刚使用的线性地址下面的部分。相反,如果页表项映射了一个页面,则该转换过程完成:页表项中的物理地址是页面框架的物理地址,线性地址的剩余下部是页面偏移量。
第六段:
以下给出了三种分页模式的示例(每个示例定位一个 4KB 的页面帧):
- 32-bit
- 对于 32-bit 模式,每个分页结构(页表)中包含 1K 个条目。
- 转换过程一次使用 32 位线性地址中的 10 位。
- 线性地址中,位 31:22(线性地址) 是标识第一个分页结构的划分,位(线性地址) 21:12 用来标识第二个分页结构的划分(页面帧的地址),线性地址最后的部分则是页内偏移量,Figure 4-2。
- PAE
- 对于 PAE 模式,第一个分页结构包含 4 项(31:30),即 PDPT 中包含 4 个 PDPTE。
- 第二个(29:21)、第三个(20:12、页面帧的地址)分页结构(页表)各含有 512 项,最后 12 位为页面帧,Figure 4-5。
- 4-level
- 使用 48 位线性地址。
- 有 4 个分页结构(页表),每个占据 9bit,最后 12 位为页内偏移,Figure 4-8。
第七段:
- 上述每个例子中的地址转换过程是通过借助识别出页面帧来完成的,页面帧是原始线性地址转换中的一部分。
- 在一些情况下,可以通过设置分页结构(页表),使得地址转换过程在转换到物理页面(页面帧)之前终止。
- 如果地址转换过程中遇到标记为“不存在”的分页结构页表项(因为其 P 标志为 0 ),或者其中保留位被置 1,在这种情况下,线性地址不会被转换;对该地址的访问会导致页面错误异常(#PF),Section 4.7。
第八段:
在之前的例子中,当线性地址中只剩下 12 位时,分页结构中的页表项用 4k 字节的页帧映射一页;前面识别出的页表项总是引用其他分页结构(页表)。这可能不适用于其他情况,以下情况说明了条目何时映射页面以及何时引用另一个页面结构:
- 如果线性地址中剩余 12 位以上(0~11 属性),则查询当前分页结构项(页表项)的第 7 位(PS-页面大小)。如果该位为 0,则该页表项引用另一个分页结构(页表);如果该位为 1,则页表项映射一页。
- 如果线性地址中只剩下 12 位,当前的页表项总是映射一个页面(第 7 位用于其他目的)。
第九段:
- 如果线性地址剩余 12 位以上,且分页结构映射一个页面,那么该页面大于 4KB。
- 比如,在 32-bit 分页模式中,使用高 10 位线性地址来定位第一个分页结构(PD),剩余了 22 位,如果在 32-bit 模式下且 CR4.PSE=1,那么映射的每个页面帧大小为 4MB。PAE 分页模式和 4-level 分页模式支持 2MB 的页面(与 CR4.PSE 位无关),4-level 模式还能够支持 1GB 页面,(Section 4.1.4)。
第十段:
- 各种分页结构在不同的分页模式下,名称不同,Table 4-2。
- Table 4-2 还展示了是谁提供了不同分页结构的物理地址。
- 线性地址被划分成不同的区段,不同的区段对应了不同的分页结构并且还包括了如何映射页面的详细信息。
Note:
- 并非所有的控制器都允许开启 PDPTE.PS,使之能够支持 1GB 页面,能否开启与 CPUID 命令有关系。
- 在 32-bit 模式下,除非 CR4.PSE=1,否则,32-bit 分页模式会忽略 PDE 中的 PS 标志。并不是所有的处理器都允许 CR4.PSE=1,Section 4.1.4 讲述了如何在 32-bit 模式下确定 4MB 的分页模式。
4.3 32-bit paging
第一段:
- 当 CR0.PG=1 & CR4.PAE=0,逻辑处理器使用 32-bit 分页模式,将 32 位线性地址转换为 40 位10的物理地址。
- 虽然 40 位物理地址对应 1TB 内存空间,但是线性地址仅有 32 位,在任何时候,最多也只能访问 4GB 的线性地址空间。
第二段:
- 32-bit 分页模式使用多级页表来进行线性地址和物理地址之间的转换。
- CR3 用于定位页目录表(第一个分页结构),Table 4-3 展示了 CR3 在 32-bit 分页模式中是如何使用的。Figure 4-2 说明了使用 4KB 页面时的转换过程,Figure 4-3 是使用 4MB 页面大小的转换过程。
- 以下细节更详细地描述了 32 位分页过程以及如何确定页面大小:
- 【PDE】4KB 对齐的页,其页目录表物理地址位于 CR3 第 31:12 位,Table 4-3,一个页目录表包含 1K 个 4B 大小的表项(PDE),将每个页表项(PDE)物理地址进行如下划分?( A PDE is selected using the physical address defined as follows):
- 4KB
- 39:32(PDE) 0
- 31:12 from CR3
- 11:2 are linear address[31:22]
- 1:0 0
因为 PDE 是使用线性地址高 10 位来确定表项位置的,所以它能够控制页表项是否指向 PTE(4KB) or Page(4MB),如果想要访问 4MB 地址空间,取决于 CR4.PSE=1 & PDE’s PS=1。
- 【4MB page】CR4.PSE=1 & PDE.PS=1(与 PSE-36机制有关),Table 4-4,The final physical address is computed as follows。
- 4MB
- 39:32(页面物理地址?) are 20:13(PDE)
- 31:22 are 31:22(PDE) (最终物理地址中的高位并不都来自PDE中的对应位置;PDE中的物理地址位并不都是连续的。)
- 21:0 are linear address
- 【PTE】CR4.PSE=0 | PDE.PS=0,Table 4-5,A PTE is selected using the physical address defined as follows。
- 4KB
- 39:32(PTE) 0
- 31:12 from PDE
- 11:2 from 21:12 linear address
- 1:0 0
- 【4KB page】因为使用线性地址 31:12 位来标识一个 PTE,所以每个 PTE 映射一个 4KB 的页面,Table 4-6,The final physical address is computed as follows。
- 4KB
- 39:32(页面物理地址) 0
- 31:12 from PTE
- 11:0 from linear address
如果在分页结构中 P 位为 0 或者该分页结构中置 1 了任何保留位?,则该页表项既不用于引用另一个分页结构,也不用于映射到一个页面,含有这种形式的分页结构不能够用于映射,故对这种线性地址的引用会引发一个页异常(#PF),Section 4.7。
对于 32-bit 分页模式,当 CR4.PSE=1 时,会有保留位==(指代哪一个分页结构?)==(PDE.PS 来决定 4MB or 4KB),如果 CR4.PSE=0,32-bit 分页模式下没有位被保留:
- PDE.P=1 & PDE.PS=1(bit 7),有无保留位又取决于 MAXPHADDR 以及 PSE-36 机制是否支持。
- PSE-36 机制不支持:21:13 位保留。
- PSE-36 机制支持:21:(M-19) 保留,M=min(MAXPHYADDR, 40)。
- PAT 不支持,Section 4.1.4,页面属性表:
- PTE.P=1,第 7 位保留(PTE)。
- PDE.PS=1 & PDE.P=1,第 12 位保留(PDE)。
只有在转换过程中,访问权限允许的情况下,才能正确映射页面,Section 4.6。
Figure 4-4 总结了 CR3 和 32 位分页模式下的分页结构。对于每一个分页结构,它分别标识了映射的页面、引用的其它分页结构,以及因为“不存在”而两者都不引用的页表项的格式。P 位和 PS 位突出显示,因为它们决定了如何使用这样的分页结构。
4.4 PAE paging
第一段:
如果 CR0.PG=1 & CR4.PAE=1 & IA32_EFER.LME=0,PAE 分页模式会将 32-bit 线性地址转化为 52-bit 物理地址(4 PB,如果 MAXPHYADDR<52,PAE 分页模式中,51:MAXPHYADDR 范围内的位将为 0)。但是受限于仅有 32 位的线性地址,所以最多可以访问 4GB 的线性地址空间。
这就意味着,我们在内存中不只保存了一套页表,而是保存了多套,进程根据需要,改变CR3的值,从而实现对当前4GB物理地址之外的访问。
第二段:
PAE 分页模式中,逻辑处理器维护了一组(4个)PDPTE 寄存器,这些寄存器的地址从 CR3 中加载(起始地址?),线性地址使用 4 个在内存中的分页结构进行线性地址到物理地址的转换,每个分页结构使用一个 PDPTE 寄存器进行定位。(这与其他分页模式不同,在其他分页模式中,CR3 指向了一个分页结构。)
4.4.1 PDPTE Registers
当使用 PAE 分页模式时,CR3 指向了 32(4x8B) 字节的 PDPT,Table 4-7。
第一段:
- PDPTEs(page-directory-pointer-table entries) 有 4 个 64bit 大小的项构成(顶级页目录表)。
- 每个 PDPTE 控制线性地址空间内 1GB 区域的访问。
- 对于 PDPTEs,逻辑处理器维护了一组(4个)内部非架构寄存器(PDPTE0、PDPTE1、PDPTE2、PDPTE3)。
- 逻辑处理器从内存中找到 PDPTEs,将其中数据加载到一组寄存器中,以实现某些操作(The logical processor loads these registers from the PDPTEs in memory as part of certain operations):
- 如果 PAE 分页模式下,使用 MOV 指令对 CR0 和 CR4 寄存器的 CR0.CD、CR0.NW、CR0.PG、CR4.PAE、CR4.PGE、CR4.PSE、CR4.SMEP 位进行了改变,将 PDPTEs 中的地址加载到 CR3 中。(then the PDPTEs are loaded from the address in CR3.)
- 当逻辑处理器正在处于 PAE 分页模式下,尝试使用 MOV 指令操作 CR3,将 PDPTEs 中的地址加载到 CR3 中。 (the PDPTEs are loaded from the address being loaded into CR3.)
- 由于进程任务切换时,导致 CR3 的值发生了变化,那么将 PDPTEs 中的新值加载到 CR3中。(If PAE paging is in use and a task switch changes the value of CR3, the PDPTEs are loaded from the address in the new CR3 value.)
- VMX 模式转换的时候。Section 4.11.1。(Certain VMX transitions load the PDPTE registers.)
从页目录指针表(PDPT)中加载值到这些寄存器的时机:1、PAE模式被启用时。2、进程任务切换时,即CR3的值改变的时候。3、在VMX模式转换的时候(虚拟化相关),本质上还是CR3值的变化。
- 根据 CR3 找到 Page Directory Pointer Table
- 根据一级索引在 Page Directory Pointer Table 中查询到 Page Directory
- 根据二级索引在 Page Directory 中查询到 Page Table
- 根据三级索引在 Page Table 中查询到普通 4KB 物理页
- 在物理页中查找第四段偏移。
第二段:
Table 4-8 给出了 PDPTE 的格式,如果其中任何 PDPTE 中的的 P 标志和保留位被置 1,那么 对 CR 寄存器使用 MOV 指令会导致一般保护异常(#GP(0)),并且 PDPTEs 不会被重新加载(在一些处理器中,即使 PDPTEs 中的 P 标志为 0,也会检查其是否存在保留位)。
4.4.2 Linear-Address Translation with PAE Paging
第一段:
- PAE 分页模式可将线性地址映射到 4KB 或者 2MB 的页面上。
- Figure 4-5 说明了转换成 4KB 页面的转换过程,Figure 4-6 说明了转换成 2MB 页面的过程。
- 以下更详细地描述了 PAE 分页过程以及如何确定页面大小:
- 线性地址的 31:30 位:选择一个 PDPTE 寄存器,作为 PDPTEi,这个 i 值是位 31:30 的值==(在 PAE 分页模式中,处理器在转换线性地址的过程中不使用 CR3)?。==
- PDPTE 寄存器中的每一项,可以映射 1GB 的线性地址空间,如果 PDPTEi 的 P 标志为 0,那么处理器会忽略该项的 1:63 位,并且该 PDPTEi 没有映射 1GB 的区域,使用该区域的线性地址会引发页面错误异常(#PF)。
- 【PDE】如果 PDPTEi 的 P 位为 1,4KB 自然对齐的页目录表位于 PDPTEi 的位 51:12(Table 4-8,Section 4.4.1),一个页面目录包含了 512 个 8B 项(PDEs),PDE 对于物理地址的划分如下(A PDE is selected using the physical address defined as follows):
- 位 51:12 from PDPTEi
- 位 11:3 are linear address 29:21
- 位 2:0 0
第二段:
因为 PDE 是使用线性地址 31:21 位来识别的,所以它控制对线性地址空间 2MB 区域的访问,使用 PDE 中的 PS 标志(位 7):
- 【2MB page】如果 PDE.PS=1,PDE 映射 2MB 页面(Table 4-9),物理起始地址(The final physical address is computed as follows):
- 位 51:21 from PDE
- 位 20:0 are linear address offset
- 【PTE】如果 PDE.PS=0,4KB 自然对齐的页表保存在 PDE 的位 51:12 中指定的物理地址(Table 4-10), 一个页表包含 512 个 64 位项(PTE),根据如下物理地址划分来选择对应的 PTE:
- 位 51:12 from PDE
- 位 11:3 are linear address 20:12
- 位 2:0 0
- 【4KB page】使用线性地址 31:12 位标识一个 PTE,每个 PTE 映射一个 4KB 的页面(Table 4-11),物理地址划分如下:
- 位 51:12 from PTE
- 位 11:0 from linear address
第三段:
如果 PDE 中 P=0 或者 PTE 中 P=0 亦或者 PDE、PTE 中对任何保留位置 1,该分页结构都不会去映射到下一级分页结构或者物理页,对于这种情况的线性地址的转换,会引发页面错误异常(#PF)(Section 4.7)。
第四段:
以下==这些位(那里的?)==在 PAE 模式中被保留:
- 如果 PDE 或者 PTE 中的 P 标志为 1,那么位 62:MAXPHYADDR 保留。
- 如果 PDE.P=1 & PDE.PS=1,那么位 20:13 保留。
- 如果 IA_32_EFER.NXE=0 & (PDE.P=1 or PTE.P=1),那么 XD 标志(位 63)保留。
- PAT 如果不支持:
- 如果 PTE.P=1,第 7 位保留(PTE)。
- 如果 PDE.P=1 & PDE.PS=1,位 12 保留(PDE)。
只有在转换的访问权限允许的情况下,才能够在线性地址和物理地址之间转换,Section 4.6。
Figure 4-7 给出了 CR3 以及 PAE 模式下,各级分页结构的概览。
4.5 4-LEVEL PAGING
第一段:
- 当 CR0.PG=1 & CR4.PAE=1 & IA32_FEER.LME=1,4-level 分页模式开启。
- 4-level 将 48 位线性地址转换为 52 位物理地址(如果 MAXPHYADDR<52,在 4-level 分页模式中的任何物理地址,51:MAXPHYADDR 范围内的位将为 0,Section 4.1.4)。
- 52 位物理地址对应 4PB 空间,但是线性地址仅为 48 位,在任意时间,线性地址最多可以访问 256 TB 空间。
第二段:
- 4-level 分页模式采用多级分页结构来对线性地址进行转换。
- CR3 被用来存储第一个分页结构(PML4 表)的物理地址。
- 4-level 分页模式下是否使用 CR3 与进程上下文描述符(processcontext)是否被使能(set CR4.PCIDE)有关:
- Table 4-12 描述了在 4-level 模式下,当 CR4.PCIDE=0 时,CR3 如何被使用。
- Table 4-13 描述了在 4-level 模式下,当 CR4.PCIDE=1 时,CR3 如何被使用。
- 当 CR4.PCIDE=0 时,CR3 的 bit3 标识 PWT(Page-level write-through),bit4 标识 PCD(Page-level cache)。
- 当 CR4.PCIDE=1时,CR3 的 11:0 位标识 PCID。
第三段:
- 当程序修改了 CR4.PCIDE 后,逻辑处理器会设置 CR3 中的新值(比如程序将 CR4.PCIDE 从 1 变为 0,当前的 PCID 立刻从 CR3[11:0] 中的值变为 000H,Section 4.10.4.1)。
- 逻辑处理器使用 CR3 中保存的 PCID 命令中的 4:3 位(CR3.PWT, CR3.PCD)来确定 PML4 表的存储类型。
第四段:
- 4-level 分页模式可以将线性地址转换为 4KB、2MB 或者 1GB 的页面大小。
- Figure 4-8 说明了产生 4KB 页面的转换过程,Figure 4-9 说明了产生 2MB 页面的转换过程,Figure 4-10 说明了产生 1GB 页面的情况。
第五段:
如果 CR4.PKE=1,4-level 分页模式下将会启动与每个线性地址相关联的保护密钥,Section 4.6 解释了处理器如何使用保护密钥来确定每个线性地址的访问权限。
第六段:
以下更加详细地介绍了 4-level 分页模式、如何确定页面大小和保护密钥。
- 【PML4E】一个 4KB 自然对齐的 PML4 的物理地址位于 CR3 的 51:12 位(Table 4-12)。PML4 表中有 512 个 64 位的表项,一个表项(PML4E)物理地址定义如下:
- 位 51:12 from CR3。
- 位 11:3 are 47:39 of linear address。
- 位 2:0 0
- 【】一个 4KB 自然对齐的页目录指针表的物理地址位于 PML4E 的位 51:12 中(Table 4-14),页目录指针表(PDPT)包含 512 个 64 位的表项,每个表项(PDPTE)的物理地址定义如下:
- 位 51:12 from PML4E。
- 位 11:3 from 48:30 of linear address。
- 位 2:0 0
第七段:
因为 PDPTE 是使用线性地址的 47:30 位来识别的,所以它控制对线性地址空间的 1GB 区域的访问,PDPTE 的使用取决于其 PS 标志(位7):
- 【1GB page】如果 PDPTE.PS=1,PDPTE 将映射 1G 页面(Table 4-15),页面物理地址将划分位如下几个部分:
- 位 51:30 from PDPTE
- 位 29:0 from linear address
如果 CR4.PKE=1,线性地址的 protection key 来自 PDPTE 的第 62:59 位。
- 【PDE】如果 PDPTE.PS=0,4KB 自然对齐的页面页目录地址位于 PDPTE 的位 51:12 中(Table 4-16),PD 中包含了 512 个 64位的表项,PDE 的物理地址定义如下:
- 位 51:12 from PDPTE
- 位 11:3 from 29:21 of linear address
- 位 2:0 0
第八段:
因为 PDE 是使用线性地址的第 47:21 位确定的,它能够控制对线性地址空间 2MB 区域的访问,PDE 的使用取决于 PS 标志。
- 【2MB page】如果 PDE.PS=1,PDE 可以映射 2MB 页面(Table 4-17),页面物理地址的划分如下:
- 位 51:21 from PDE
- 位 20:0 from linear address
如果 CR4.PKE=1,线性地址的保护密钥的值来自 PDE 第 62:59 位
- 【PTE】如果 PDE.PS=0,4KB 自然对齐的页面的物理地址位于 PDE 的第 51:12 中(Table 4-18),PT 中包含了 512 个 64 位的表项(PTE),每个 PTE 中的物理地址划分如下:
- 位 51:12 from PDE
- 位 11:3 from 20:12 of linear address
- 位 2:0 0
- 【4KB page】PTE 使用了线性地址 47:12 位,每个 PTE 都用来映射一个 4KB 页面(Table 4-19),最终物理地址的划分如下:
- 位 51:12 from PTE
- 位 11:0 from linear address
如果 CR4.PKE=1,线性地址的保护密钥的值来自 PTE 的第 62:59 位。
第九段:
- 如果一级分页结构的 P 标志为 0,或者对该级分页结构的保留位置为 1,那么,该分页结构不用于应用另一个分页结构或者页面。
- 这种情况下,线性地址不会被进一步转换,并且如果引用这种线性地址还会导致页面错误异常(Section 4.7)。
第十段:
在 4-level 中,以下这些位被保留:
- 如果分页结构中的 P 位为 1,第 51:MAXPHYADDR 位保留;
- 如果 PML4E 中的 P 标志为 1,PML4E 中的 PS 保留。
- 如果不支持 1GB 分页模式,并且 PDPTE.P=1,那么 PS 标志保留。
- 如果 PDPTE.P=1 & PDPTE.PS=1,那么 29:13 位保留。
- 如果 PDE.P=1 & PDE.PS=1,那么 20:13 位保留。
- 如果 IA32_EFER.NEX=0 & 分页结构的 P 标志为 1,那么 XD 标志(位 63)保留。
第十一段:
在地址转换过程中,只有在转换访问权限允许的情况下,才能够进行地址转换(Section 4.6)。Figure 4-11 总结了在 4-level 中 CR3 和各级分页结构的概述,对于分页结构的每一项,它分别标识映射页面的条目的格式、引用其他分页结构的条目的格式以及因为“不存在”而两者都不引用的条目的格式;第0位§和第7位(PS)突出显示,因为它们决定了如何使用分页结构条目。
4.10 CACHING TRANSLATION INFORMATION
第一段:
- Intel-64 和 IA-32 架构可以通过缓存处理器分页结构中的数据来加速地址转换过程。
- 因为处理器不能确保它缓存的数据总是与内存中的结构一致,所以软件(OS)开发人员了解处理器如何以及何时缓存这些数据是很重要的。
- 他们还应该了解软件(OS)可以采取什么措施来删除可能不一致的缓存数据,以及何时应该这样做。本节向软件开发人员提供有关相关处理器操作的信息。
第二段:
- Section 4.10.1:介绍进程上下文描述符(PCIDs),逻辑处理器用它来区分不同线性地址空间缓存的信息。
- Section 4.10.2 & Section 4.10.3:分别描述了处理器如何在 translation lookaside buffers(TLBs) 和 paging-structure caches(分页结构缓存) 中缓存信息。
- Section 4.10.4:程序如何通过使用 TLBs 和 paging-structure caches 来移除不一致的缓存信息。
- Section 4.10.5:介绍了多处理器系统的特殊要点。
4.10.1 Process-Context Identifiers (PCIDs)
第一段:
- 进程上下文标识符(PCIDs)是一种工具,通过它逻辑处理器可以为多个线性地址空间缓存信息。
- 当程序切换到具有不同的 PCID 的不同线性地址空间时(Section 4.10.4.1),处理器可以保留缓存信息。
PCID 区别了不同的线性地址空间,通过它为多个线性地址缓存信息。
第二段:
- PCID 是一个 12 位的标识符。
- CR4.PCIDE 来使能 PCID(非零)。
- 如果 CR4.PCIDE=0,当前 PCID=000H;CR4.PCIDE=1(PCID 使能),当前 PCID 是 CR3 的 [11:0] 位。
- 并非所有的处理器都支持 CR4.PCIDE=1。
CR4.PCIDE=1,使能 PCID 功能,PCID 值保存在 CR3[11:0]。
第三段:
- 处理器确保仅在 IA-32e 模式(32 位分页模式和 PAE 模式下,PCID=000H)下,CR4.PCIDE=1(即仅在 4-level 模式下使用)。
- 当 CR3[11:0]=000H 时,程序可以更改 CR4.PCIDE(从 0 到 1),使用 MOV CR 指令来实现的限制条件如下:
- 当使用 MOV to CR4 来改变 PCIDE 位(从0到1)并且当前 IA32_EFER.LMA=0(非 IA-32e 模式下) 或者 CR3[11:0]≠000H 时,该操作会引发 #GP(0) 异常。(开启 PCID 时,需要保证 CR3[11:0] 为 000H,且在 4-level 模式下)。
- 当 CR4.PCIDE=1 时,如果使用 MOV 指令清除 CR0.PG 那么就会导致 #GP(0) 异常。
- 处理器确保 PCID 功能仅在 4-level 模式下使用。
- PCID 还需要保证 CR3[11:0]=000H.
第四段:
- 当逻辑处理器在 TLB (Section 4.10.2)和分页结构缓存(Section 4.10.3)中创建项时,它会将这些项和当前 PCID 相关联。
- 当使用 TLB 和分页结构来进行线性地址转换时,逻辑处理器仅使用与当前 PCID 相关联的那些项目。
- 如果 CR4.PCIDE=0(PCID 不可用,也即缓存不可用),那么逻辑处理器就不会缓存除 000H 以外的任何 PCID 信息。(1. 如果 CR4.PCIDE=0,逻辑处理器将任何新缓存的信息与当前 PCID(000H) 相关联。2. 如果清除 CR4.PCIDE 位,所有缓存的信息都是无效的,Section 4.10.4.1)。
TLB:线性地址->物理页
分页结构缓存:高端分页结构->低端分页结构?
开启 PCID 步骤
Note:
- 在本手册的修订版中,当处理器不支持 CR4.PCIDE 置 1 时,Section 4.10 讨论了这种情况下的转换过程中的信息缓存。
- 虽然本节提到了 PCIDs,但是本文档的更改并不意味着处理器不能够对 CR4.PCIDE 置 1。
4.10.2 Translation Lookaside Buffers (快表)
- 处理器可以在 TLB(Translation Lookaside Buffe) 中缓存关于线性地址转换过程中的信息。
- 通常,TLB 中的每一项包含了从页号(page number)到页框(page frame)的映射。
- Section 4.10.2.1 定义了相关术语。
- Section 4.10.2.2 描述了信息如何缓存到 TLB 中。
- Section 4.10.2.3 给出了 TLB 的使用细节。
- Section 4.10.2.4 解释了全局页面特性,该特性允许程序在 TLB 中缓存时,指出了在映射过程中的特殊处理。
4.10.2.1 Page Numbers, Page Frames, and Page Offsets
- Section 4.3、Section 4.4.2 和 Section 4.5 详细介绍了不同分页模式下线性地址到物理地址的转换过程。
- 线性地址的高位(页号 page number)决定物理地址的高位(页框 page frame),线性地址的低位(页内偏移 page offset)决定物理地址的低位。
- 页号和页内偏移的边界由页面大小决定(线性地址分为两个部分:页码+页内偏移量):
- 32-bit 模式:
+ 如果不使用 PTE(因为 CR4.PSE=1 & PDE.PS=1),页面大小为 4MB ,并且页码即线性地址的 31:22 位。
+ 如果在页面转换过程中使用了 PTE,页面大小为 4KB,页码由线性地址的 31:12 位组成。 - PAE 模式:
+ 如果不使用 PTE(因为 PDE.PS=1),页面大小为 2MB,页号为线性地址的 31:21 位。
+ 如果在页面转换过程中使用了 PTE,页面大小为 4KB,页码由线性地址的 31:12 位组成。 - 4-level 模式:
+ 如果在页面转换过程中不使用 PDE(因为 PDPTE.PS=1),则页面大小为 1GB,页号为线性地址的 47:30 位。
+ 如果在页面转换过程中使用 PDE 但是不使用 PTE(PDE.PS=1),则页面大小为 2MB,页号为线性地址的 47:21 位。
+ 如果在页面转换过程中使用 PTE,则页面大小为 4KB,页号为线性地址的 47:12 位。
4.10.2.2 Caching Translations in TLBs
第一段:
- 处理器可以通过在 TLB 中缓存各个分页转换步骤来加速分页转换过程。
- TLB 中的每一项都是独立的分页转换步骤。
- 每次分页转换都取决于一个页号,它包含以下来自分页结构的信息,这些信息用于转换带有页号的线性地址:
- 与页号对应的物理地址。
- 来自分页结构中表项的访问权限,用于转换带有页号的线性地址,Section 4.6:
- The logical-AND of the R/W flags.
- The logical-AND of the U/S flags.
- The logical-OR of the XD flags (necessary only if IA32_EFER.NXE = 1).
- The protection key (necessary only with 4-level paging and CR4.PKE = 1).
- 分页结构中每一项的属性标识了该页号的最后一个页面帧(PTE 或者其它分页结构中的 PS 标志为 1):
- 脏标志,Section 4.8。
- 内存类型,Section 4.9。
第二段:
- TLB 中可能还包含有其它信息。
- 一个处理器可以实现多个 TLB,其中一些可能用于特殊目的,例如,仅用于指令提取。
- 如果没有必要,此类 TLB 可能不包含此类信息,例如,仅用于指令提取的 TLB 不需要包含读写和脏标志的信息。
TLB 在 X86 体系的 CPU 里的实际应用最早是从 Intel 的 486 CPU 开始的,在 X86 体系的 CPU 里边,一般都设有如下 4 组 LB:
第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);
第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);
第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);
第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Instruction-TLB);
第三段:
- 正如 Section 4.10.1 节所述,由逻辑处理器创建的任何 TLB 都与当前的 PCID 相关联。
- 处理器不需要使能所有 TLB,支持 TLB 的处理器能够在任何时刻让任何 TLB 项失效。
- 软件不应该依赖于 TLB 的存在或是 TLB 中的某些项的保留(可能 TLB 中存储的是失效的信息)。
- TLB 与当前 PCID 相关联。
- 每项 TLB 中包含有线性地址以及物理页的地址,还有辅助信息(属性、访问权限)。
4.10.2.3 Details of TLB Use
第一段:
- 因为 TLB 中的每一项仅用于线性地址的转换,所以只有当用于转换的每个分页结构中的表项的 P 标志为 1 且保留位为 0 时,TLB 中才会有对应的页号(线性地址高端)。
- 除非在页面映射过程中,每个分页结构中的表项其访问标志(accessed flags)为 1,不然处理器不会缓存页号。
- 在页面映射前,处理器会将 accessed flags 不为 1 的位置 1。
- TLB 参考分页结构来创建表项,需要分页结构存在。
- 对于分页结构中访问标志存在的页,TLB 会缓存该页。
第二段:
处理器可以缓存预取和访问所需要的转换,这些转换是推测执行的结果,而实际上不会在执行的代码路径中发生。(The processor may cache translations required for prefetches and for accesses that are a result of speculative execution that would never actually occur in the executed code path.)
第三段:
- 如果线性地址与当前 PCID 相关联的 TLB 有关,那么处理器可以使用 TLB 项中的内容来确定该线性地址的 page frame、访问权限以及其它属性。
- 处理器实际上可能不会查询内存中的分页结构,即使程序修改了存储器中的分页结构,处理器也保留了未修改的 TLB 项,Section 4.10.4.2 讲解了程序如何确保处理器使用修改后的分页结构。
TLB 不会自发地修改已经失效地分页结构信息,仍会保留错误的信息。
第四段:
- 如果分页结构指定使用大于 4KB 的页面进行映射,一些处理器可能会为这种转换过程缓存多个较小页面的 TLB 项(如果一个程序使用 512 个小页面,即 2MB 大小,那么至少需要 512 个TLB表项才能保证不会出现 TLB Miss 的情况)。
- 每个这样的 TLB 项与对应较小页面的页号相关联(例如,4-level 分页模式线性地址 47:12 位(9-9-9-9-12)),即使该页号的一部分(位 20:12)是相对于由分页结构指定的页面偏移的一部分。这样的 TLB 项中物理地址的高位来自于创建转换的 PDE 中的物理地址,而低位来自线性地址。
- 大页面是通过较小页面的多次转换实现的,这一过程对于程序透明。
- 例如,对较大页面上的线性地址执行 INVLPG 操作(该指令使对应于线性地址的页码以及与当前PCID相关联的任何TLB 项无效,它还使得具有该页号的任何全局 TLB 项无效,而不考虑 PCID。 INVLPG 还使与当前 PCID 相关联的所有分页结构缓存中的所有项无效,而不管它们对应的线性地址如何),会使该页面上任何线性地址转换的所有较小页面的 TLB 项无效。
第五段:
- 如果软件修改了分页结构,以便更改用于 4KB 线性地址范围的页面大小,则TLB可能随后包含该地址范围的多个转换(每个页面大小一个)。
- 对地址范围内的线性地址的引用可以使用这些转换中的任何一种, 使用哪种转换可能从一个执行到另一个执行而有所不同,并且选择可能是特定于实现的。
一个物理页面可以对应多个线性地址,比如 4KB 范围内的线性地址可能映射到了一个 2MB 物理页上,然后,改变分页结构,将 2MB 物理页变为 4KB,TLB 之前一个项就可以完成 4KB 范围内线性地址的映射,如今,只能为每个小页增加 TLB 项。
4.10.2.4 Global Pages
第一段:
- 当 CR4.PGE=1 时,Intel-64 和 IA-32 架构将支持全局页面。
- 在分页结构项中,G 标志如果为 1(或者 PTE,或者分页结构项中的 PS 标志为 1),那么使用该分页结构项为线性地址缓存的任何 TLB 项都是全局的页面。
CR4.PGE=1,并且分页结构中的 G 标志为 1,所映射的页面为全局页面。
第二段:
因为 G 标志仅用于映射页面的页面结构项,并且因为来自这些分页结构项的信息没有缓存在 paging-structure caches 中,所以全局页面特性不影响 paging-structure caches 的行为(paging-structure caches 缓存不映射页面的分页结构项)。
第三段:
逻辑处理器可以使用全局 TLB 项来进行线性地址的转换,即使与 TLB 关联的 PCID 不是当前的 PCID。
修改 CR3 可以 flush 除 global 外的所有的 TLB 项;
INVLPG 用来无效掉某个 TLB 项,包括标识为 gobal 的项;
4.10.3 Paging-Structure Caches**(分页结构缓存)**
除了 TLB 之外,处理器还可以在内存中缓存关于分页结构的其他信息。
4.10.3.1 Caches for Paging Structures
处理器可以支持以下任何或所有 paging-structre caches :
- PML4 cache(仅 4-level 模式使用)。每个 PML4-cache 项使用一个 9 位的值,即线性地址 47:39 位的值。(9-9-9-9-12)用于转换线性地址的 PML4-cache 项包含了来自 PML4E 中的以下信息:
- PDPT 的物理地址。
- PML4E 的 R/W 标志的值。
- PML4E 的 U/S 标志的值。
- PML4E 的 XD 标志的值。
- PML4E 的 PCD、PWT 标志的值。
以下这些详细说明了处理器如何使用 PML4-cache:
- 如果处理器有一个关于线性地址的 PML4-cache 项,它可以在转换线性地址时使用该项(而不是内存中的 PML4E)。
- 处理器不会创建 PML4-cache 项,除非内存中的 PML4E 中,P 标志为 1,并且所有保留位为 0。
- 处理器不会创建 PML4-cache 项,除非在存储器中的 PML4E 中 accessed flag 是 1;在使用缓存进行转换之前,如果访问标志不是 1,则处理器将该位置 1(缓存项的访问标志?)。
- 即使对于没有转换结构的线性地址,CPU 也可以创建 PML4-cache 项(例如,在引用的 PDPT 中的所有项中,P 标志都为 0)。
- 如果处理器创建了 PML4-cache 项,即使程序随后修改了内存中相应的 PML4E,处理器也会保留该项。
即使分页结构中没有对应该线性地址的转换结构,也可以创建 paging-structure cache 项。
- PDPTE cache(仅 4-level 分页模式)。每个 PDPTE-cache 中使用一个 18 位的值,即线性地址的 47:30 位(9-9-9-9-12)。用于转换该线性地址的 PDPTE-cache 包含了来自于 PML4E 和 PDPTE 的以下信息:
- PDT 的物理地址,(没有为映射 1 GB 页面的 PDPTE 创建 PDPTE-cache 项)。
- PML4E 和 PDPTE 的 R/W 位逻辑与。
- PML4E 和 PDPTE 的 U/S 位逻辑与。
- PML4E 和 PDPTE 的 XD 位逻辑或。
- PDPTE 的 PCD 和 PWT 标志。
以下内容详细说明了处理器如何使用 PDPTE-cache:
- 如果处理器有 PDPTE-cache 对应项,它可以在转换线性地址使用该项(而不是内存中的 PML4E 和 PDPTE)。
- 处理器不会创建 PDPTE-cache 项,除非在内存中 PML4E 和 PDPTE 中 P 标志为 1,PS 标志为 0,保留位为 0。
- 除非在内存中 PML4E 和 PDPTE 中被访问的标志为 1, 处理器不会创建 PDPTE-cache 项;在缓存分页结构之前,处理器对任何不是 1 的访问标志进行置 1。
- 处理器可以创建一个 PDPTE-cache 项,即使该线性地址还没有对应的分页结构来进行转换。
- 处理器创建了一个 PDPTE-cache 项,即使程序随后修改了内存中对应的 PML4E 或 PDPTE,处理器也会保留该缓存项。
- PDE cache。PDE cache 的使用取决于分页模式。
- 对于 32-bit 分页模式,每个 PDE cache 项使用一个 10 位的值,即线性地址的 31:22 位。(10-10-12)
- 对于 PAE 分页模式,每个 PDE cache 项使用一个 11 位的值,即线性地址的 31:21 位。(2-9-9-12)
- 对于 4-level 分页模式,每个 PDE cache 项使用一个 27 位的值,即线性地址的 47:21 位。(9-9-9-9-12)
PDE cache 项中包含了转换线性地址时 PML4E、PDPTE 和 PDE 中的相关信息(对于 32-bit 分页模式和 PAE 分页模式,仅适用于 PDE):
- PT 的物理地址(page table 的地址),(PDE cache 项没有为能够映射一个页面的 PDE 创建一个页)。
- PML4E、PDPTE 和 PDE 的 R/W 位逻辑与。
- PML4E、PDPTE 和 PDE 的 U/S 位逻辑与。
- PML4E、PDPTE 和 PDE 的 XD 位逻辑或。
- PDE 的 PCD 和 PWT 位。
以下内容说明了如何使用 PDE cache(以下对 PML4Es 和 PDPTEs 的使用仅限于 4-level 分页模式):
- 如果处理器有相关的 PDE cache 项,它可以在转换线性地址时使用该项(而不是内存中的 PML4E、PDPTE 和 PDE)。
- 处理器不会创建 PDE cache 项,除非在内存中的 PML4E、PDPTE 和 PDE 中,P 标志为 1,PS 标志为 0,保留位为 0。
- 除非内存中的 PML4E、PDPTE 和 PDE 中的访问标志为 1,否则处理器不创建 PDE cache 项;在缓存转换结构之前,处理器将不是 1 的访问标志置 1。
- 处理器可以创建一个 PDE cache 项,即使该线性地址还没有对应的分页结构来进行转换。
- 如果处理器创建了一个 PDE cache 项,即使程序随后修改了内存中相应的 PML4E、PDPTE 或 PDE,处理器也会保留该缓存项。
第一段:
- 来自分页结构项中的信息被包括在了由起始分页结构项使用的其它分页结构项的 paging-structre caches 的项中。(paging-structre caches 含有从起始分页结构项开始的,没有映射到物理页的分页结构项)。
- 例如:如果 PML4E 中的 R/W 标志为 0,则 PML4E 指向的 PDPT 中任何 PDPTE-cache 项的 R/W 标志将为 0。
- 这是因为每个这样的 PDPTE-cache 项的 R/W 标志是 PML4E 和 PDPTE 中的 R/W 标志的逻辑与。
第二段:
- paging-structre caches 只包含映射了其它分页结构(而不是映射页面的分页结构)的分页结构项信息。
- 因为在这样的分页结构项中没有使用 G 标志,所以分页特性也不会影响 paging-structre caches。
第三段:
- 处理器可以在 paging-structre caches 中为预取和访问所需要的地址转换创建项。
- 这些预取和访问是在执行的代码路径中永远不会实际发生的推测执行的结果。
第四段:
如第 4.10.1 节所述,逻辑处理器在 paging-structre caches 中创建的任何项都与当前的 PCID 相关联。
第五段:
- 处理器可以实现也可以不实现任何 paging-structre caches。
- 程序不应该依赖于它们的存在或不存在。
- 处理器可以随时使这些高速缓存中的项无效,因为处理器可以在转换时创建高速缓存项,并且在随后对存储器中的分页结构进行修改后不更新它们,所以当导致这种修改时,程序应该注意使高速缓存条目无效。
- 第 4.10.4 节描述了 TLBs 和 paging-structre caches 的失效。
4.10.3.2 Using the Paging-Structure Caches to Translate Linear Addresses
paging-structre caches 举例。
当一个线性地址被访问时,处理器使用如下过程来确定它所转换的物理地址以及是否允许访问:
- 如果处理器找到了用于线性地址转换的页号并且与当前 PCID(或者是全局的)相关联的 TLB 项,它可以使用该项的物理地址、访问权限和其他属性。
- 如果处理器没有找到相关的 TLB 项,它可以使用线性地址的高位来从 PDE-cache 中选择与当前 PCID 相关联的项(Section 4.10.3.1 暗含了在每个分页模式中使用哪些位),然后,它可以使用该项来完成转换过程(定位 PTE 等),就好像它已经遍历了对应于 PDE-cache 项的 PDE(对于 4-level 分页模式,还遍历了 PDPTE 和 PML4E)。
- 使用 4-level 分页模式时,举例使用 paging-structre caches :
- 如果处理器没有找到相关的 TLB 项或相关的 PDE-cache 项,它可以使用线性地址的位 47:30(9-9-9-9-12) 来从 PDPTE-cache 中选择与当前 PCID 相关联的项。然后,它可以使用该项来完成页面转换过程(定位 PDE 等),就好像它已经遍历了对应于 PDPTE cache 项的 PDPTE 和 PML4E。
- 如果处理器没有找到相关的 TLB 项、PDE cache 项或相关的 PDPTE cache 项,它可以使用线性地址的位 47:39 (9-9-9-9-12)来从 PML4-cache 中选择与当前 PCID 相关的项。然后,它可以使用该项来完成页面转换过程(定位 PDPTE 等),就好像它已经使用过了相应的 PML4E。
(如果处理器不支持缓存 in question,将跳过上述所有步骤)
如果处理器没有为线性地址找到 TLB 或 paging-structre cache ,它将使用线性地址遍历整个分页结构,如 Section 4.3、Section 4.4.2 和 Section 4.5 所述。
分页结构缓存查询顺序:PDE cache - PDPTE cache - PML4 cache
4.10.3.3 Multiple Cached Entries for a Single Paging-structure Entry
单个分页结构项对应了多个缓存项。
paging-structre caches 和 TLBs 可以包含与单个 PCID 相关联的多个项,以及从单个分页结构项中包含信息,以下内容是 4-level 分页模式的示例:
- 假设两个 PML4Es 包含相同的物理地址,因此指向相同的 PDPT。该表中任何 PDPTE 都可能导致两个 PDPTE-cache 项,每个项与一组不同的线性地址相关联。具体来说,假设 PML4 表中第 n1 和 第 n2 个项包含有相同的物理地址。这意味着 PDPT 中的第 m 个 PDPTE 项将出现在与 p1 和 p2 相关联的 PDPTE-cache 项中,其中 p1>>9=n1,p2>>9=n2,并且 p1&1FFH=p2&1FFH=m。这是因为两个 PDPTE-cache 项使用相同的 PDPTE,一个来自 PML4E 的第 n1 个,另一个来自 PML4E 的第 n2 项。
- 假设第一个 PML4E (第 0 个?均为 0?)包含 CR3 的内容(PML4 表的物理地址 X)(指向自身?),这意味着:
- 任何与第 47:39(9-9-9-9-12)位均为 0 的线性地址相关联的 PML4-cache 项都包含地址 X。
- 任何与第 47:30(9-9-9-9-12) 位均为 0 的线性地址相关联的 PDPTE-cache 项都包含地址 X。这是因为第 47:30 位的值为 0 的线性地址的转换使用第 47:39 (0)位的值来定位地址 PML4 表的地址)处的 PDPT。然后,它使用位 38:30 (也是0)的值再次找到地址 X,并将该地址存储在 PDPTE-cache 项中。
- 出于类似的原因,与位 47:21(9-9-9-9-12) 中均为 0 的线性地址相关联的任何 PDE-cache 项都包含地址 X。
- 出于类似的原因,页号 0 的任何 TLB 项(与位 47:12 中的 0 的线性地址相关联)转换为页帧 X>>12。
相同的 PML4E 将其地址 X 分配给所有这些高速缓存项,因为该项的自引用性质使它被用作 PML4E,PDPTE,PDE 和 PTE。
若两个 PML4E 的值相同,即指向相同 PDPT,那么需要有两个 PDPTE-cache。
4.10.4 Invalidation of TLBs and Paging-Structure Caches
- 如 Section 4.10.2 和 Section 4.10.3 所述,当线性地址被转换时,处理器可以在 TLBs 和 paging-structre caches 中创建内容,并且即使用于创建它们的分页结构已经被修改了,处理器仍然可以保留这些内容。
- 为了确保线性地址转换使用修改后的分页结构,程序应该采取一些行动,使得可能包含已经被修改过的信息的缓存项无效。
4.10.4.1 Operations that Invalidate TLBs and Paging-Structure Caches
整理能使 TLBs 和 paging-structure cache 无效的命令。
以下指令使 TLBs 和 paging-structre cache 中的缓存项无效:
- INVLPG。该指令有单个操作数,该操作数是一个线性地址。该指令使对应于线性地址的页码以及与当前 PCID 相关联的任何 TLB 项无效。它还使得具有该页号的任何 global TLB 项无效,而不考虑 PCID(Section 4.10.2.4). INVLPG 还使与当前 PCID 相关联的所有 paging-structre caches 中的所有项无效,而不管它们对应的线性地址如何。
- INVPCID。这个指令的操作是基于指令操作数的,称为 INVPCID 类型和 INVPCID 描述符,定义了四种 INVPCID 类型:
- Individual-address。如果 INVPCID 类型为 0,则逻辑处理器使与 INVPCID 描述符中指定的 PCID 相关联的映射(全局转换除外)无效,该映射将用于转换 INVPCID 描述符中指定的线性地址。(该指令还能使全局转换以及与其他 PCID 和其他线性地址相关联的映射无效)。
- Single-context。如果 INVPCID 类型为 1,逻辑处理器会使与 INVPCID 描述符中指定的 INVPCID 相关联的所有映射(全局转换除外)无效。(该指令还能使全局转换以及与其他 PCIDs 相关联的映射无效)。
- All-context,包括全局。如果 INVPCID 类型为 2,逻辑处理器将使与所有 PCID 相关联的映射(包括全局转换)无效。
- All-context. 如果 INVPCID 类型为 3,则逻辑处理器会使与 PCID 相关联的映射(全局转换除外)无效。(该指令也可能使全局转换无效)。
关于 INVPCID 命令的详细详见 Intel 64 and IA-32 Architecture Software Developer’s Manual,Ⅱ,Chapter 3。
- 使用 MOV 命令改变 CR0 的值,如果将 CR0.PG 的值从 1 变为 0,该 MOV 命令将所有 TLB 项(包括全局项)和所有 paging-structre cache (对于所有 PCIDs)无效。
- 使用 MOV 命令改变 CR3 的值,指令的作用取决于 CR4.PCIDE 的值:
- 如果 CR4.PCIDE=0,除了全局页面,该指令让所有与 PCID 000H 相关联的 TLB 项以及分页结构缓存项无效。
- 如果 CR4.PCIDE=1 并且指令的源操作数的位 63 为 0,则该指令使与指令的源操作数的位 11:0 中指定的 PCID 相关联的 TLB 项无效,但全局页面除外。它还会使与该 PCID 相关联的所有 paging-structre cache 中的项无效。不会将与其他 PCIDs 相关联的 TLBs 和 paging-structre cache 无效。
- 如果 CR4.PCIDE=1 并且指令的源操作数的位 63 为 1,该指令不会将任何 TLBs 和 paging-structre cache 无效。
- 使用 MOV 命令改变 CR4 的值。指令的作用取决于某些位的设置。
- 如果改变了 CR4.PGE 的值,或者,将 CR4.PCIDE 值从 1 置为 0,则该命令使得 TLB 项(包括全局项)和所有 paging-structre cache(对所有 PDIDs)无效。
- 如果改变了 CR4.PAE 的值,或者,将 CR4.SMEP 值从 0 置为 1,则该命令使得当前 PCID 的所有 TLB 项和所有 paging-structre cache 中的所有项无效。
- Task switch。如果 task switch 改变 CR3 的值,它将使与 PCID 000H 相关联的所有 TLB 项以及所有 paging-structre cache 中的项无效,但全局页面除外。
- VMX transitions,Section 4.11.1
处理器总是可以使 TLB 和 paging-structre cache 中的额外项无效,下面是一些例子:
- 除了对应于其线性地址操作数的页面之外,INCLPG 可能使页面的 TLB 项无效,它可能会使与当前 PCID 之外的 PCIDs 相关联的 TLB 项和 paging-structre cache 无效。
- 除了对应于其线性地址操作数的页面之外,INVPCID 可以使页面的 TLB 项目无效。它可能会使与指定 PCID 之外的 PCIDs 相关联的 TLB 项和分页结构缓存项无效。
- MOV 至 CR0 可能会导致 TLB 项无效,即使 CR0.PG 不变。举个例子,如果 CR0.CD 或 CR0.NW 被修改了,那么就可能导致这种情况。
- MOV 至 CR3 可能会使包含全局页面的 TLB 项无效。如果 CR4.PCIDE=1 并且指令源操作数的位 63 为 0,它可能会使 TLB 项和与 PCIDs 相关联的分页结构缓存中的项无效,而不是其它 PCID。如果 CR4.PCIDE=1 并且源操作数的第 63 位为 1,它会使项无效。
- 当 CR4.PSE 或者 CR4.SMEP 的值从 1 变为 0 时,MOV 至 CR4 可能会使得 TLB 中的项无效。
- 在支持超线程技术的处理器上,在一个逻辑处理器上执行的无效操作可能会使其它逻辑处理器执行的无效操作可能会使其它逻辑处理器使用的 TLBs 和 paging-structre cache 无效。
(其它指令和操作可能会使TLB 和 paging-structre cache 中的项无效,但建议使用上述命令。)
第一段:
- 除了上面的指令之外,页面错误还会使 TLB 和 paging-structre cache 中的项无效。
- 由于试图使用线性地址而导致的 page-fault 异常将使得所有 TLB 项无效,这些项对应于该线性地址的页号,并且与当前 PCID 相关联。
- 如果 page-fault 异常不是由内存中的分页结构的内容引起的(因此,如果它是由内存中的分页结构被修改后未被无效的缓存项引起),这些无效确保了 page-fault 不会再次发生(如果错误指令被重新执行)。
PF 如果是发生在未被无效的缓存项中,那么及时的无效可以保证 PF 不会再发生。
第二段:
- 参考 Section 4.10.2 节所述,某些处理器可能会选择缓存多个较小页面的 TLB 项,用于分页结构所指定的页面转换,以使用大于 4KB 的页面。
- 程序无法知道多次较小页面的转换已经用于了较大页面。INVLPG 指令和 page-fault 保证和使用单个 TLB 项一样:它们对应于由于分页结构指定的转换的所有 TLB 项无效。(命令保证能所有小项都无效)
4.10.4.2 Recommended Invalidation
以下内容提供了一些关于程序执行失效命令时机的建议:
- 如果程序修改了一个映射页面的页面转换结构(而不是映射了另一个页面转换结构),那么它应该对所有使用该转换结构的页的线性地址执行 INVLPG。(如果分页结构项用于了不同页号的转换(Section 4.10.3.3),程序应该对于这些页的线性地址执行 INVLPG 或者,它可以使用 MOV 至 CR3、CR4。)
- 如果程序修改了映射了另一个分页结构的分页结构项,它可以根据被修改项所决定的页面转换的类型和数量来使用下列方法之一:
- 对每个页所映射的线性地址执行 INVLPG 命令,并使用分页结构项进行地址转换,然而,如果没有能够将该页面进行映射的分页结构(比如,在由修改了的分页结构项所映射的所有分页结构中,P 标志都是 0),则仍然需要执行一次 INVLPG。
- 如果修改后的项不控制全局页面,则执行 MOV to CR3。
- 执行 MOV to CR4 以修改 CR4.PGE。
- 如果 CR4.PCIDE=1 并且程序修改了分页结构项,使得其不映射一个页面或者 G 标志为 0,如果该分页结构项可以用于除当前分页结构项之外的 PCIDs,需要一些其它的条件,下列任何一项满足就够了:
- 用 MOV 指令修改 CR4.PGE,立即或再次使用任何受影响的 PCIDs 之前。例如,程序可以为使用受 PCIDs 影响的进程使用不同的(以前未使用的)PCID。
- 对于每个受影响的 PCID,执行 MOV to CR3,使 PCID 成为当前的 PCID(并加载适当的 PML4 表的地址)。如果修改后的分页结构项不控制全局页面,并且 MOV to CR3 的源操作数的位 63 为 0,则不需要再进行其它步骤,否则,对每个页的线性地址执行 INVLPG,在页面转换过程中使用该分页结构项,如果有页面没有使用分页结构项来进行页面映射,则至少执行一次 INVLPG。
- 如果使用 PAE 分页模式的程序修改了 PDPTE,它应该使用寄存器的值重新加载 CR3,以确保修改后的 PDPTE 被加载到相应的 PDPTE 寄存器中,Section 4.4.1。
- 如果分页结构的属性可以使得单个分页结构项可以用于多种情况(Section 4.10.3.3),程序应该使得这些多种情况的执行无效。例如,如果一个分页结构项既可以作为 PDE,又可以作为 PTE,则可能需要使用两个(或多个)线性地址来执行 INVLPG,一个分页结构项用作 PDE,另一个作为 PTE。(或者,程序可以使用 MOV to CR3 或 CR4)
- 如 Section 4.10.2,如果程序修改了分页结构,使得用于 4KB 页面大小的线性地址范围发生了变化,则 TLB 随后可能会对该地址范围进行多次转换。对地址范围中线性地址的映射可以使用这些映射中的任何一种。希望避免这种不确定性的软件不应该对任何线性地址都将改变页面大小和页帧、访问权限或者其他属性的方式写入页面结构项。它可以改为使用以下算法:首先,清除相关分页结构项的 P 标志(例如 PDE);然后,使受影响的线性地址的任何页面转换无效;然后,修改相关的分页结构项以设置 P 标志来建立页面映射结构。
- 程序应该将源操作数的第 63 位置 0,以执行 MOV to CR3 指令,该指令建立了之前用于不同线性地址空间的 PCID(例如 CR3 的第 51:12 位具有不同的值)。这确保了可能已经为先前的线性地址空间缓存的任何信息的无效。假设两个线性地址空间使用相同的全局页面,因此没有必要使任何全局 TLB 项无效,如果不这么做,程序应该通过执行 MOV to CR4 来修改 CR4.PGE 来使这些项无效。
4.10.4.3 Optional Invalidation
以下内容描述了程序可能选择选择不使其无效的情况以及这种选择的后果:
- 如果一个分页结构项的 P 标志从 0 改为 1,则不需要失效。这是因为没有 TLB 项或分页结构缓存使用 P 标志为 0 的分页结构项的信息创建的。
- 如果分页结构项的访问标志从 0 改为了 1,则不需要无效(假设上次被访问标志从 1 改变为 0 时执行了无效)。这是因为没有使用来自分页结构项中的信息来创建 TLB 项或 paging-structre cache,其中所访问的标志是 0。
- 如果分页结构项的 R/W 标志从 0 更改为 1,则未能执行无效可能会导致“虚假”页面错误异常(例如,响应尝试写的访问),但不会导致其他不利行为。对于每个受影响的线性地址,这种例外最多出现一次 Section 4.10.4.1。
- 如果 CR4.SMEP= 0,并且分页结构项的 U/S 标志从 0 改变为 1,则未能执行无效可能导致“虚假”页面错误异常(例如,响应尝试用户模式的访问),但不会导致其他不利行为。对于每个受影响的线性地址,这种例外最多出现一次 Section 4.10.4.1。
- 如果分页结构项的 XD 标志从 1 改变为 0,则未能执行无效可能导致“虚假”页面错误异常(例如,响应于尝试的指令提取),但不会导致其他不利行为。对于每个受影响的线性地址,这种例外最多出现一次 Section 4.10.4.1。
- 如果分页结构项将被访问标志从 1 改为 0,则未能执行无效,可能导致导致处理器不设置该位来响应使用该映射结构的后续页面转换访问。程序不能将清除位解释为这种访问没有发生的指示。
- 如果程序修改了分页结构项中用于标识线性地址的最终物理地址的分页结构项(PTE 或其中 PS 标志为 1 的分页结构项),以将脏标志从 1 更改为 0,则执行无效的失败可能导致处理器不设置该位,以响应对其映射使用该条目的线性地址的后续写入。软件不能将该位被清除解释为这种写入没有发生的指示。
- 如果在写入和取指令之间没有串行化指令,则在映射用于取指令的地址时对分页结构条目的读取可能看起来是在对该分页结构条目的较早写入之前执行的。请注意,Section 4.10.4.1 中标识的无效指令都是序列化指令。
- Section 4.10.3.3 描述了单个页面结构条目可能包含缓存在 paging-structre cache 的多个条目中的信息的情况。因为这些高速缓存中的所有条目都被 INVLPG 的任何执行无效,所以没有必要仅仅为了使这些多个高速缓存条目无效而通过多次执行 INVLPG 来遵循这样的分页结构条目的修改。(可能需要这样做才能使多个TLB条目无效。)
4.10.4.4 Delayed Invalidation
在某些情况下,要求的无效可能会被延迟。软件开发人员应该理解,在分页结构项被修改和执行 Section 4.10.4.2 中讲述到的无效指令之间,处理器可以使用基于分页结构项的旧值或新值的映射,以下内容描述了延迟失效的一些潜在后果:
- 如果一个分页结构项的 P 标志从 1 更改为 0。那么对由该项控制的线性地址的页面映射可能会也可能不会导致页面错误异常。
- 如果页面映射结构项的 R/W 标志从 0 更改为 1,对线性地址的写访问(其映射由该项控制)可能会也可能不会导致页面错误异常。
- 如果一个分页结构项的 U/S 标志从 0 更改为 1,用户模式下对线性地址的访问(其转换由该项控制)可能会也可能不会导致页面错误异常。
- 如果一个分页结构项中的 XD 标志从 1 更改为 0,则由该项所映射的线性地址中提取指令可能会也可能不会导致页面错误异常。
如 Section 8.1.1 所述,访问大于四字的数据的 x87 指令或 SSE 指令可以使用多次存储器访问来实现。如果这样的指令存储到存储器并且失效已经被延迟,一些访问可能完成(写入存储器),而另一个导致页面错误异常。在这种情况下,完成的访问的效果可能对软件可见,即使整个指令导致了错误。
某些情况下,延迟失效的后果可能不会对程序产生不利影响。例如,当释放线性地址空间的一部分时(通过将分页结构项的存在位标记为不存在),如果程序不重新分配线性地址空间的该部分或与其相关联的存储器,则使用 INVLPG 的无效可能被延迟。然而,由于推测性执行(或错误的软件),在无效发生之前,可能存在对线性地址空间的已释放部分的访问。在这种情况下,可能会发生以下情况:
- 线性地址空间的空闲部分可以进行读取。因此,对于具有读取副作用的地址范围,不应延迟无效。
- 处理器可以在一段延长的时间内保留 TLB 和 paging-structre cache 中的项。软件不应该仅仅因为时间流逝就认为处理器不会使用与线性地址相关联的条目。
- 如 Section 4.10.3.1,处理器可以在 paging-structre cache 中创建一个项,即使对于任何可能使用该条目的线性地址没有映射。因此,如果软件已经将页表中的所有项标记为“不存在”,则处理器可能随后会创建一个 PDE-cache 项来缓存 PDE 对物理页的映射(假设 PDE 存在)。
- 如果软件试图写入线性地址空间的空闲部分,处理器可能不会产生页面错误。(这种尝试可能是软件错误的结果)。由于这个原因,先前与线性地址空间的空闲部分相关联的页面帧不应该被重新分配用于另一个,直到已经执行了适当的无效。
4.10.5 Propagation of Paging-Structure Changes to Multiple Processors
多处理器情况:
第一段:
- 如 Section 4.10.4,修改分页结构项的程序可能需要在修改前,使被修改项中对应的 TLB 和 paging-structre cache 中的项无效。在包含一个以上的逻辑处理器的系统中,程序必须考虑这样一个事实,即逻辑处理器的 TLB 和 paging-structre cache 中可能存在项,而不是用于修改分页结构的项。将对分页结构项的更改通常被称为 TLB shoot-down。
第二段:
- TLB shootdown 可以使用基于内存的信号量/处理器中断(IPI)来完成。
- 以下内容描述了一个支持 Intel-64 和 IA-32 架构的处理器的 TLB shootdown 算法的简单但是低效的例子:
- Begin barrier:停止除一个逻辑处理器以外的所有逻辑处理器;也就是说,使除了一个之外的所有指令执行 HLT 指令或进入死循环。
- 允许活动逻辑处理器更改必要的分页结构项。
- 允许所有逻辑处理器执行与对分页结构项的修改相适应的无效。
- 允许所有逻辑处理器恢复正常操作。
第三段:
可以开发替代的、性能优化的 TLB shootdown 算法;然而,软件开发人员必须注意确保满足以下条件:
- 所有正在使用被修改的分页结构的逻辑处理器必须参与,并在进行修改后执行适当的无效操作。
- 如果对分页结构条目的修改是在障碍之前进行的,或者如果没有障碍,操作系统必须确保下列之一:在修改时间和无效时间之间不使用受影响的线性地址范围;或者它准备好处理在此期间使用的受影响的线性地址范围的后果。例如,如果操作系统不允许释放的页面被重新分配用于其他目的,直到所需的无效之后,错误软件对这些页面的写入不会意外地修改正在使用的内存。
- 软件必须准备好处理对受影响的线性地址范围的读取、指令提取和预取请求,这些请求是在执行的代码路径中永远不会实际发生的推测性执行的结果。
第四段:
- 当多个逻辑处理器同时使用同一线性地址空间时,它们必须在任何修改控制该线性地址空间的分页结构条目的请求之前进行协调。
- 在这些情况下,可能不需要 TLB shootdown。例如,当释放一个线性地址范围时,一些其他机制可以确保在请求释放该范围之前,没有逻辑处理器正在使用该范围。
- 在这种情况下,释放该范围的逻辑处理器可以清除与该范围相关联的 PTE 中的 P 标志,释放与该范围相关联的物理页面帧,然后用信号通知使用该线性地址空间的其他逻辑处理器执行必要的无效。所有受影响的逻辑处理器必须在线性地址范围和先前与该范围相关联的物理页面帧可以被重新分配之前完成它们的无效。
4.11 INTERACTIONS WITH VIRTUAL-MACHINE EXTENSIONS(VMX)
- 虚拟机扩展(VMX)体系包括了分页交互的特性。
- Section 4.11.1 讨论了 VMX-specific 的控制转换,尤其是对于分页映射的控制。
- Section 4.11.2 概述了转为支持地址映射而设计的 VMX 功能。
4.11.1 VMX Transitions
第一段:
- VMX 体系结构定义了两种控制转移(control transfers),分别叫做 VM entries 和 VM exits,二者统称为 VMX transitions。
- VM entries 和 VM exits 的详细描述参考 Chapter 26 和 Chapter 27, Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3C。
- 以下内容标识了分页相关的细节:
- VMX transitions 同时修改了 CR0,CR4 和 IA32_EFER MSR 寄存器。因此,它们支持分页模式的相互转换,如果不同时修改这些寄存器,将无法支持这种相互转换:
- VM entries 允许 4-level 分页模式直接向 32-bit 分页模式或者 PAE 分页模式进行转换。
- VM exits 允许 32-bit 分页模式或者 PAE 分页模式直接向 4-level 分页模式进行转换。
- VMX transitions 会导致 PAE 分页模式加载 PDPTE 寄存器(Section 4.4.1):
- VM entries 要么从加载到 CR3 中的物理地址中加载 PDPTE 寄存器,要么从 VMCS 中加载 PDPTE 寄存器,Section 26.3.2.4。
- VM exits 从加载到 CR3 中的物理地址中加载 PDPTE 寄存器,Section 27.5.4。
- 对于某些特定的设置 VMX transitions 会使 TLBs 和 paging-structre caches 无效。See Section 26.3.2.5 and Section 27.5.5 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3C。
4.11.2 VMX Support for Address Translation
第一段:
- Chapter 28,Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3C 中, VMX 对于地址转换的支持描述了分页模式直接交互的两个特性—— virtual-processor identifiers(VPIDs) 和 extended page table mechanism**(EPT)**。
- VPIDs 为软件提供了一种方法以识别不同的“虚拟处理器”的地址空间,处理器可以使用该方法来同时维护 TLBs 和 paging-structre cache 中所包含的多个地址空间的信息,即使使用 PCIDs 为 0 也可以,Section 28.1。
第二段:
- 当使用 EPT 时,分页结构中的地址不被用作 access memory 和 memory-mapped I/O 物理地址。
- 相反,它们被视作 guest-physical addresses,并通过 EPT 分页结构进行转换,以生成物理地址。
- EPT 还可以指定自己的访问权限和内存类型,Section 28.2。
第三段:
- VPIDs 和 EPT 都可以改变处理器在 TLB 和 paging-structre cache 中维护信息的方式,以及软件管理信息的方式。
- Section 4.10 中的一些 behavior 可能会改变,Section 28.3。
4.12 USING PAGING FOR VIRTUAL MEMORY
第一段:
- 对于分页模式,部分线性地址不需要映射到物理地址空间。
- 未映射地址的数据可以存储在外部存储器上(例如,磁盘上)。
- 这种映射线性地址空间的方法称为 virtual memory 或者 demand-paged(按需分页) virtual memory。
第二段:
- 分页将线性地址空间划分为固定大小的页面,这些页面可以映射到物理地址空间/外部地址空间中。
- 当一个程序(任务)使用一个线性地址时,如果定义了一个相应的物理地址,处理器会使用分页将该线性地址转换成相应的物理地址。
第三段:
- 如果线性地址包含了未映射到物理地址空间的页面,处理器将生成 page-fault 异常,Section 4.7。
- page-fault 异常的处理程序通常指示操作系统或执行程序将未映射页面的数据从外部存储加载到物理内存中(可能在进程中将不同的页面从物理内存写入外部存储),并使用分页(通过更新分页结构)对其进行映射。
- 当页面加载到物理内存后,异常处理程序的返回会使生成异常的指令重新执行。
第四段:
- 分页不同于分段,它使用固定大小的页面。
- 与通常代码和数据结构大小相同的段不同,页面具有固定的大小。
- 如果分段使唯一使用的地址转换形式,那么物理内存中的数据结构的所有部分都在内存中。
- 如果使用分页,数据结构可能部分在内存中,部分在磁盘存储中。
4.13 MAPPING SEGMENTS TO PAGES
第一段:
- 分段和分页机制为多种内存管理方法提供了支持。
- 当分段和分页相结合时,分段可以通过多种方式映射到页面。为了实现 flat(非分段)寻址环境,例如,所有代码、数据和堆栈可以映射到一个或多个共享相同线性地址范围的大段(4GB),Figure 3-2,Section 3.2.2。
- 分段对于应用程序和操作系统不可见。
- 如果使用分页,分页机制可以将单个线性地址空间(包含在单个段中)映射到虚拟内存中。
- 或者,每个程序(或任务)可以有自己的大型线性地址空间(包含在自己的段中),通过分页结构映射到虚拟内存中。
第二段:
- 段可以用于小于页面的大小。如果这些段中的一个被放置在不与另一个段共享的页面中,则额外的内存被浪费了。
- 例如,一个小的数据结构,比如一个 1B 的信号量,如果它被单独放置在一个页面中,就会占用 4KB,如果使用许多信号量,将它们打包到一个页面中会更有效。
第三段:
- Intel-64 和 IA-32 架构不强制将页面和段边界对应起来。
- 一页可以包含一段的结尾和另一段的开头。同样,一个段可以包含一页的结尾和另一页的开头。
第四段:
- 如果内存管理程序在页面和段边界之间实施一些对齐措施,它可能会更简单和更有效。
- 例如,如果一个可以放入一页的段被放入两页,则支持对该段的访问可能会有两倍的分页开销。
第五段:
- 一种将分页和分段相结合的方法简化了内存管理,就是给每个分段一个自己的页表,Figure 4-13。
- 这个方法在页面目录中给段一个单独的项,这个项为分页整个段提供了访问控制信息。
Footnote
- PE(Protect Enable)位是保护模式允许位,主要决定对段寄存器得赋值时,描述符高速缓冲寄存器的刷新规则. ↩︎
- Earlier versions of this manual used the term “IA-32e paging” to identify 4-level paging. ↩︎
- IA32_EFER MSR 中的 LMA 标志是一个状态位,指示逻辑处理器是否处于 IA-32e 模式(4-level paging mode),处理器总是被置位(IA32_EFER.LMA & CR0.PG & IA32_EFER.LME);程序不可以直接修改 IA32_EFER.LMA;使用 WRMSR 操作去改变 IA32_EFER 会忽略 LMA 标志。 ↩︎
- 这样的地址称为规范地址。在64位模式下使用非规范线性地址会产生一般保护异常(#GP(0));处理器不试图使用4级分页来映射非规范的线性地址。 ↩︎
- WP位是Supervisor的写保护位 (CPL < 3是Supervisor);当WP = 1时,Supervisor不能写只读的页;WP = 0时,Supervisor可以写任何页。 ↩︎
- 通过PAT能够设置多种类型的内存属性,其中最常用的有4种:写回(Write-back),不缓存(Uncached),写联合(Write-combined)以及 Uncached Minus。 ↩︎
- https://baike.baidu.com/item/PSE36/8464396?fr=aladdin ↩︎
- 有没有能够保留IA32两层地址映射,同时又能实现到36位物理地址(64GB)映射的方法呢?PSE-36就是为这一特殊需要而制定的。在传统IA32中,无论是页目录项还是页表项,都是用高20位来存储它所指向的页表或物理页面的物理地址的。而在使用PSE寻址4MB大页面的时候,页目录项只使用了其中的高10位来存储物理页面的地址,而在PSE-36中,则使用了高14位,这样,使用PSE-36的页目录项的寻址达到了14+22=36位,从而能够管理到64GB的物理地址空间。 ↩︎
- 在 32-bit 分页模式中,除了 4MB 大小的页面,其它页面物理地址 39:32 位都是 0,但是如果处理机不支持 PSE-36 机制,那么用于映射 4MB 页面的物理地址高 39:32 位也为 0。如果处理机支持 PSE-36 机制,并且 MAXPHYADDR < 40,则用于映射 4MB 页面的物理地址中 39:MAXPHYADDR 都是 0。 ↩︎