Intel 64架构5级分页和5级EPT白皮书

96
公子小水
2017.07.05 00:07* 字数 12714

5-Level Paging and 5-Level EPT white paper原文

修订版本1.1 2017年5月

注意:本文档包含有关开发设计阶段产品的信息。这里的信息如有更改,恕不另行通知。请勿使用此信息确定设计。

英特尔技术的功能和优点取决于系统配置,可能需要启用硬件,软件或激活服务。在intel.com或OEM或零售商处了解更多信息。

1 介绍

本文档描述了Intel 64架构的计划扩展,以扩展可通过处理器内存转换硬件转换的地址大小。

现代操作系统使用称为分页的地址转换支持。分页将软件使用的线性地址(也称为虚拟地址)转换为用于访问存储器(或存储器映射的I/O)的物理地址。1.1节描述了Intel 64处理器上的64位分页硬件。现有处理器将线性地址限制为48位。第2章描述了将扩展限制为57个线性地址位的分页扩展。

虚拟机监视器(VMM)使用虚拟机扩展(VMX)来支持在虚拟机中运行的客户机软件。VMX交换是VMM和客户软件之间的控制流传输。VMX转换涉及加载和存储各种处理器寄存器。这些寄存器中的一些被定义为包含线性地址。因此,VMX转换的操作部分取决于处理器支持的线性地址宽度。第1.2节描述了VMX转换对线性地址寄存器的现有处理,而第3章描述了支持较大线性地址所需的更改。

VMM还可以使用称为扩展页面表(extended page tables,EPT)的附加地址转换支持。当使用EPT时,分页产生客户机物理地址,EPT将转换为物理地址。1.3节描述了现有Intel 64处理器上的EPT硬件,将客户物理地址限制为48位。第4章描述EPT扩展以支持57个客户机物理地址位。

1.1 IA-32e模式中的现有分页

在支持Intel 64架构的处理器上,软件通常使用线性地址来引用内存。大多数现代操作系统将处理器配置为使用分页,将线性地址转换为物理地址。处理器使用生成的物理地址来访问内存。

IA-32e模式是一种处理器执行模式,可扩展旧的32位操作,称为传统模式。软件可以使用以下算法进入IA-32e模式。

1。使用MOV CR指令设置CR4.PAE [位5]。(必须启用物理地址扩展才能进入IA-32e模式)。
2。使用WRMSR指令设置IA32_EFER MSR(索引C0000080H)的位8(LME)。
3。使用MOV CR指令将CR3加载为PML4表的地址(见下文)。
4。使用MOV CR指令设置CR0.PG [位31]。

每当CR0.PG = 1且IA32_EFER.LME = 1时,逻辑处理器处于IA-32e模式。这个事实在IA32_EFER.LMA [位10]中报告。软件无法直接设置该位;它始终是CR0.PG和IA32_EFER.LME的逻辑AND。

在IA-32e模式中,线性地址的大小为64位。但是,相应的分页模式(当前称为I A-32e分页)不使用所有64个线性地址位。

IA-32e分页不使用所有64个线性地址位,因为处理器限制线性地址的大小。该限制由CPUID指令列举。具体来说,CPUID.80000008H:EAX [位15:8]列举处理器支持的线性地址位数(最大线性地址宽度)。现有的处理器将此值列举为48。

注意:处理器还限制物理地址的大小,并使用CPUID列举限制。CPUID.80000008H:EAX [位7:0]列举处理器支持的物理地址位数,最大物理地址宽度。现有的处理器列举了高达46的值。只有通过设置CR4.PAE(控制寄存器CR4的位5)启用了物理地址扩展,软件才能使用超过32个物理地址位。

对线性地址宽度的列举限制意味着分页仅转换每个64位线性地址的低48位。在生成线性地址但在转换之前,处理器确认地址仅使用处理器支持的48位。

对48个线性地址位的限制来自于IA-32e分页的性质,如图1-1所示。

图1-1 使用I-32e分页的线性地址转换

注1:IA-32e模式包括两种子模式:兼容模式和64位模式。在兼容模式下,软件使用32位地址,处理器零扩展到64位线性地址。在64位模式下,软件直接使用64位地址。

处理器通过遍历其根结构位于控制寄存器CR3中的物理地址的分页结构的4级层次来执行IA-32e分页。每个分页结构的大小为4 KB,包含512个8字节的条目。处理器使用线性地址(位47:12)的高36位,一次9位,从层次结构中选择分页结构条目。

注意:图1-1说明了将线性地址转换为4 KB的页面。可以配置分页过程,使得某些线性地址的转换可以更早地停止一个或两个级别,从而将其转换为2 MB或1 GB的页面。

通常,每个分页结构条目的位51:12包含一个4 KB对齐的物理地址。对于除最后一个以外的每个条目,该地址是下一个分页结构的地址;在最后一个条目中,它是4 KB的页面框架的物理地址。通过将该页面帧地址与原始线性地址的页面偏移量位11:0组合来获得最终物理地址。

因为在地址转换中仅使用线性地址的47:0,所以处理器将保留位63:48用于将来的扩展,这个概念被称为规范性(canonicality)。如果地址的位63:47相同,则线性地址是规范的。(换句话说,线性地址只有当位63:48是位47的符号扩展时才是规范的,位47是线性地址转换中使用的最高位)。

当生成访问存储器的64位线性地址时,处理器首先确认地址是规范的。如果地址不是规范的,则内存访问会导致故障,处理器不会尝试转换地址(注1)。

Intel 64架构包含许多定义为保持线性地址的寄存器。这些寄存器可以使用各种指令加载。在大多数情况下,如果尝试使用不是规范的值加载其中一个寄存器,这些指令将导致一般保护异常(general-protection exception,#GP)。

分页结构中超出列举物理地址宽度的物理地址位被保留。如果尝试访问其转换,遇到设置任何这些位的分页结构条目的线性地址,则会导致页错误异常(page-fault exception,#PF)。

1.2 线性地址宽度和VMX转换

VM Entry和VM Exit处理包含线性地址的许多处理器寄存器。转换以基于规范性的方式尊重处理器的线性地址宽度。

VMCS中的某些字段对应于包含线性地址的寄存器。

VM Entry确认大多数这些字段包含规范的值。一些寄存器,如RIP和LDTR基地址,可以接受特殊处理。

VM Exit将某些寄存器的状态保存到VMCS中,其中一些寄存器包含线性地址。因为处理器通常确保这些寄存器中的值是规范的(参见第1.1节),这些寄存器的VM Exit保存的值通常是规范的。

注1:一般来说,使用不是规范的线性地址访问内存的尝试会导致通用保护异常(#GP)。如果使用SS段进行存储器访问,则会发生堆栈故障异常 - #SS。

VM Exit还从VMCS加载某些寄存器,其中一些寄存器包含线性地址。每个VM Exit确保每个这些寄存器的值是规范的。具体来说,寄存器的位47:0从主机状态区域中的字段加载;然后位47的值被符号扩展到寄存器的位63:48。

1.3 现有扩展页表(EPT)

支持VMX的大多数Intel 64处理器还支持称为扩展页表(EPT)的附加地址转换层。

VM Entry可以配置为激活客户软件的EPT。当EPT处于活动状态时,由分页使用和产生的地址(第1.1节)不用作存储器中引用的物理地址。相反,处理器将它们解释为客户机物理地址,并以由VMM确定的方式将其转换为物理地址。 (这种从客户机到物理的转换不仅适用于分页的输出,还适用于处理器用于引用客户机分页结构的地址)。

如果EPT转换过程无法转换客户物理地址,则会导致EPT违规。(当客户物理地址的访问违反由客户物理地址的EPT建立的权限时,也可能发生EPT违规)。EPT违规是一个VMX特定的异常,通常导致VM Exit。

如第1.1节所述,现有的处理器将物理地址限制为46位。该限制也适用于客户机物理地址。因此,EPT不会转换超出此限制的客户物理地址。 (例如,如果线性地址转换遇到具有这种地址的分页结构条目,则会出现分页错误)。因此,现有的EPT仅限于转换48个物理地址位。

现有的EPT转换过程类似于前面图1-1所示的分页过程。像4级分页一样,处理器通过遍历4-KByte EPT分页结构的4级层次来实现EPT。最后一个EPT分页结构条目包含最后物理地址的较高位,而最低位来自原始客户机物理地址。

2 扩展线性地址:5级分页

2.1 5级分页:简介

5级分页是一种新的分页模式,将在IA-32e模式下可用。顾名思义,它将通过遍历分页结构的5级层次结构来转换线性地址。因为该过程是未修改的,所以5级分页将处理器的线性地址宽度扩展到57位。(附加的9位用于从层次结构的第五级中选择一个条目。)为了清楚起见,以前称为IA-32e分页的分页模式现在将被称为4级分页。

本章的其余部分规定了5级分页定义和所需的架构更改。第2.2节规定了CPU如何列举新功能以及如何通过软件启用。第2.3节描述了线性地址生成过程的变化,以及对规范概念的修订。

第2.4节详细介绍了5级分页如何转换线性地址。第2.5节阐明了处理器如何处理包含线性地址的寄存器的加载,而第2.6节到第2.8节考虑与各种其他功能的交互。(与虚拟机扩展的交互在第3章中指定)。

2.2 列举和启用

本节介绍处理器如何列举到5级分页和相关功能的软件支持,以及软件如何使处理器能够使用该支持。

2.2.1 CPUID的列举

支持Intel 64架构的处理器通常使用CPUID指令来列举特定于软件的处理器功能。那些支持5级分页的处理器通过新功能标志来列举这一事实,以及通过如何报告相关功能的变化:

  • CPUID.(EAX = 07H,ECX = 0):ECX [位16]是一个新的特征标志,将列举5级分页的基本支持。所有较旧的处理器清除这一位。当且仅当它支持5级分页时,处理器将设置此位。

  • 如第1.1节所述,CPUID.80000008H:EAX [位15:8]列举了处理器支持的最大线性地址宽度。所有支持Intel 64架构的旧处理器都将这个值列为48。支持5级分页的处理器将列举此值为57。

  • 如第1.1节所述,CPUID.80000008H:EAX [位7:0]列举了处理器支持的最大物理地址宽度。支持Intel 64架构的处理器最多列举了46个。支持5级分页的处理器预计将列举更高的值,最多52。

  • CPUID.(EAX = 07H,ECX = 0H):ECX.MAWAU [位21:17]是列举用户MPX地址宽度调整(MAWAU)的现有字段。该值指定当CPL = 3时,BNDLDX和BNDSTX指令在64位模式下工作的高于48的线性地址位数。

支持Intel MPX的较旧的处理器列举该值为0。支持5级分页的处理器可以列举0或9,具体取决于系统软件的配置。有关BNDLDX和BNDSTX如何使用MAWAU以及系统软件如何确定其值的更多详细信息,请参见第2.7节。

  • CPUID.(EAX = 12H,ECX = 0H):EDX [位15:8]是列举指定64位enclave最大支持大小的信息的现有字段。如果列举的值为n,则最大大小为2n。支持IntelSGX的较旧的处理器最多列举了47个。支持5级分页的处理器预计会将该值列举为56。

2.2.2 由软件启用

第1.1节确定了软件可以进入IA-32e模式的算法。在不支持5级分页的处理器上,该算法支持4级分页。在支持5级分页的处理器上,可以改为启用5级分页。

支持5级分页的处理器允许软件设置一个新的启用位CR4.LA57 [bit 12]。 IA-32e模式下的逻辑处理器(IA32_EFER.LMA = 1)如果CR4.LA57 = 1,使用5级分页。在IA-32e模式之外(IA32_EFER.LMA = 0),CR4.LA57的值不影响分页操作。

以下项目详细说明了逻辑处理器如何确定当前的分页模式。

  • 如果CR0.PG = 0,分页被禁用。
  • 如果IA32_EFER.LMA = 0,则使用传统32位分页模式之一(取决于CR4中传统分页模式位的值).
  • 如果IA32_EFER.LMA = 1和CR4.LA57 = 0,使用4级分页。
  • 如果IA32_EFER.LMA = 1和CR4.LA57 = 1,使用5级分页。

因此,软件可以使用以下算法进入具有5级分页的IA-32e模式。

1。使用MOV CR指令设置CR4.PAE和CR4.LA57。
2。使用WRMSR指令设置IA32_EFER.LME。
3。使用MOV CR指令将CR3加载到PML5表的地址(参见第2.4节)。
4。使用MOV CR指令设置CR0.PG。

处理器允许软件修改CR4.LA57只在IA-32e模式之外。在IA-32e模式下,尝试使用MOV CR指令修改CR4.LA57会导致通用保护异常(#GP)。

2.3 线性地址生成和规范性

如第1.1节所述,线性地址宽度为48位的处理器将保留线性地址位63:48以供将来扩展。仅使用位47:0的线性地址(因为位63:48是位47的符号扩展名)被称为规范的。

1。只有当CPUID.(EAX = 07H,ECX = 0):ECX [位16]被列举为1时软件才可以设置CR4.LA57。
2。回想一下,IA32_EFER.LMA是CR0.PG和IA32_EFER.LME的逻辑AND。

当生成访问存储器的64位线性地址时,处理器首先确认地址是规范的。如果地址不是规范的,则内存访问会导致故障,并且地址未被转换。

支持5级分页的处理器可以在启用5级分页时转换57位线性地址。但是,如果软件仅启用4级分页,则这样的处理器只能转换48位线性地址。这个事实激发了两种规范性的定义。

如果地址的位63:47相同,则线性地址是48位规范的。类似地,如果地址的位63:56相同,地址是57位规范的。任何48位规范的线性地址也是57位规范的。

当生成访问存储器的64位线性地址时,支持5级分页的处理器基于当前分页模式检查规范性:如果启用了4级分页,则该地址必须是48位规范的;如果启用了5级分页,则该地址只能是57位规范的。如果没有观察到适当的规范性,则存储器访问会导致故障。

2.4 5级分页:线性地址转换

如2.2.2节所述,如果IA32_EFER.LMA = 1且CR4.LA57 = 1,则逻辑处理器使用5级分页。

像4级分页一样,5级分页使用内存分页结构的层次结构来转换线性地址。因为5级分页将线性地址宽度增加到57位(从4级分页支持的48位),5级分页允许在任何给定时间访问多达128 PBytes的线性地址空间。

也像4级分页一样,5级分页使用CR3来定位层次结构中的第一个分页结构。(5级分页时CR3具有与4级分页相同的模式特定格式)。以下项目更详细地描述了5级分页对转换过程的变化。

  • 转换开始于识别4 KB自然对齐的PML5表。它位于CR3位51:12中指定的物理地址。PML5表包含512个64位条目(PML5E)。使用如下定义的物理地址选择PML5E。
  • 位51:12来自CR3。
  • 位11:3是线性地址的位56:48。
  • 位2:0都为0。

因为使用线性地址的位56:48来识别PML5E,所以它控制对线性地址空间的256-TByte区域的访问。表2-1给出了PML5E的格式。

表2-1。引用PML4表的PML5条目(PML5E)格式

比特位置 内容
0(P) 存在;必须为1以引用PML4表。
1(R/W) 读/写;如果为0,则可能不允许写入由此条目控制的256-TByte区域。
2(U/S) 用户/特权;如果为0,则不允许用户模式访问到由此条目控制的256-TByte区域。
3(PWT) 页级写通;间接确定用于访问此条目引用的PML4表的内存类型。
4(PCD) 页级缓存禁用;间接确定用于访问此条目引用的PML4表的内存类型。
5(A) 已访问;指示此条目是否已经被用于线性地址转换。
6 忽略。
7(PS) 保留(必须为0)。
11:8 忽略。
M-1:12 该条目引用的4 KB对齐的PML4表的物理地址。
51:M 保留(必须为0)。
62:52 忽略。
63 如果IA32_EFER.NXE = 1,则执行禁用(如果为1,则不允许从此条目控制的256-TByte区域执行指令读取);否则保留(必须为0)。
  • 转换过程的下一步确定一个4 KB的自然对齐的PML4表。它位于PML5E位51:12中指定的物理地址(见表2-1)。PML4表包括512个64位条目(PML4E)。使用如下定义的物理地址选择PML4E。

  • 位51:12来自PML5E。

  • 位11:3是线性地址的位47:39。

  • 位2:0都为0。

通常在访问分页结构条目时,用于访问PML4E的存储器类型部分地基于PML5E中的PCD和PWT位。

因为使用线性地址的位56:39来识别PML4E,所以它控制对线性地址空间的512GB字节区域的访问。

一旦识别了PML4E,线性地址的位38:0确定了转换过程的剩余部分,与4级分页完全一样。如表2-1所示,PML5E的位1,位2和位63的值被正常使用(与其他分页结构条目中的相应位组合使用)来确定访问权限。PML5E中的已访问标志(位5)按照其他分页结构条目进行更新。

5级分页的操作如图2-1所示。

图2-1 使用5级分页的线性地址转换

2.5 线性地址寄存器和规范性

Intel 64架构包含许多定义为保持线性地址的寄存器。这些寄存器可以使用各种指令加载。如第1.1节所述,如果试图加载一个不是规范的值的线性地址寄存器,则这些指令中的每一条通常会导致通用保护异常(#GP)。

如第2.3节所述,支持5级分页的处理器使用规范性的两种定义:48位规范性和57位规范性。本节介绍这种处理器如何检查正在加载到线性地址寄存器中的值的规范性。一种方法用于加载RIP(指令指针;参见第2.5.1节)的操作,另一种用于加载其他寄存器的操作(参见第2.5.2节)。

2.5.1 RIP加载的规范性检查

RIP寄存器包含CS段内当前指令指针的偏移量。由于处理器在64位模式下将CS基址视为零,所以该模式下的RIP寄存器的值是指令指针的线性地址。

加载RIP(包括JMP等指令以及通过IDT进行控制传输)的操作首先检查要加载的值是否相对于当前分页模式是规范的。如果处理器确定地址不是规范的,则不会执行RIP加载,并发生通用保护异常(#GP)。

注意:引起非规范地址故障的RIP加载指令,意味着故障处理程序的返回指令指针是故障指令的地址,而不是尝试加载的非规范地址。

当4级分页活动时,由这些操作执行的规范检查使用48位规范。当5级分页活动时,检查放宽,只需要57位规范。

SYSCALL和SYSENTER指令分别从IA32_LSTAR和IA32_SYSENTER_EIP MSRs加载RIP。在仅支持4级分页的处理器上,这些指令不会检查正在加载的值是否合法,因为WRMSR指令可确保每个MSR都包含一个48位规范的值。在支持5级分页的处理器上,WRMSR的检查放宽到57位规范(见第2.5.2节)。在这样的处理器上,执行具有4级分页的SYSCALL或SYSENTER会检查加载到RIP中的值是否为48位规范的。

指令指针正常前进到下一个指令边界可能导致RIP寄存器保持非规范地址。从非规范地址获取下一条指令将导致一般保护异常,如第2.3节所示。在这种情况下,故障处理程序的返回指令指针将是非规范地址。

2.5.2 其他加载的规范性检查

除了RIP之外,CPU还保留了许多其他保存线性地址的寄存器:

  • GDTR和IDTR(在它们的基地址部分)。
  • LDTR,TR,FS和GS(在其隐藏的描述符缓存的基址部分)。
  • 调试地址寄存器(DR0到DR3),它保存断点的线性地址。
  • 以下MSR:IA32_BNDCFGS,IA32_DS_AREA,IA32_KERNEL_GS_BASE,IA32_LSTAR,IA32_RTIT_ADDR0_A,IA32_RTIT_ADDR0_B,IA32_RTIT_ADDR1_A,IA32_RTIT_ADDR1_B,IA32_RTIT_ADDR2_A,IA32_RTIT_ADDR2_B,IA32_RTIT_ADDR3_A,IA32_RTIT_ADDR3_B,IA32_SYSENTER_EIP和IA32_SYSENTER_ESP。
  • x87 FPU指令指针(FIP)。
  • 由Intel MPX使用的用户模式配置寄存器BNDCFGU。

除了一些例外,处理器确保这些寄存器中的地址总是以以下方式规范化。

  • 尝试使用非规范地址加载线性地址寄存器时的某些指令错误。
  • 如果指令的存储器操作数中指定的基址不是规范的,则LGDT或LIDT指令的执行将导致通用保护异常(#GP)。
  • 如果从GDT加载基地址不是规范的,LLDT或LTR指令的执行将导致#GP。
  • 如果将加载FS或GS的基地址是非规范地址,WRMSR,WRFSBASE或WRGSBASE的执行会导致#GP。
  • 如果用非规范地址加载任何下面的MSR,WRMSR的执行导致#GP:IA32_BNDCFGS,IA32_DS_AREA,IA32_FS_BASE,IA32_GS_BASE,IA32_KERNEL_GS_BASE,IA32_LSTAR,IA32_RTIT_ADDR0_A,IA32_RTIT_ADDR0_B,IA32_RTIT_ADDR1_A,IA32_RTIT_ADDR1_B,IA32_RTIT_ADDR2_A,IA32_RTIT_ADDR2_B,IA32_RTIT_ADDR3_A ,IA32_RTIT_ADDR3_B,IA32_SYSENTER_EIP或
    IA32_SYSENTER_ESP(注2)。

注1。补充SYSCALL和SYSENTER的SYSRET和SYSEXIT指令分别从RCX和RDX加载RIP。即使在5级分页之前,这些指令检查要加载到RIP的值的规范性。与其他加载RIP的指令一样,此检查将基于当前的分页模式。

注2。当WRMSR指令用于加载一些保存线性地址的非架构MSR(此处未列出)时,也可以应用这种规范检查。

  • 如果使用非规范地址的加载以下任何MSR,XRSTORS的执行会导致#GP:IA32_RTIT_ADDR0_A,IA32_RTIT_ADDR0_B,IA32_RTIT_ADDR1_A,IA32_RTIT_ADDR1_B,IA32_RTIT_ADDR2_A,IA32_RTIT_ADDR2_B,IA32_RTIT_ADDR3_A和IA32_RTIT_ADDR3_B。

由于少数异常,这种执行总是使用列举的最大线性地址宽度,并且与当前的分页模式无关。

因此,支持5级分页的处理器将允许上述指令以57位规范但不是48位规范的地址加载这些寄存器,即使4级分页处于活动状态。(因此,存储这些值的指令(SGDT,SIDT,SLDT,STR,RDFSBASE,RDGSBASE,RDMSR,XSAVE,XSAVEC,XSAVEOPT和XSAVES)可以保存57位规范但不是48位规范的地址,即使4级分页处于活动状态。)

分别加载FS和GS基地址的WRFSBASE和WRGSBASE指令的运行方式不同。这些指令中的任何一个的执行将导致#GP,如果它将加载相对于当前分页模式的不是规范的地址的基址。因此,如果4级分页活动,则这些指令不允许加载57位规范但不是48位规范的地址。

  • FXRSTOR,XRSTOR和XRSTORS指令忽略了使用非规范地址加载其中某些寄存器的尝试:
  • FIP加载忽略存储器映像中除列举的最大线性地址宽度之外的任何位。处理器符号扩展到最高有效位(例如,支持5级分页的处理器上的位56),以确保FIP始终是规范的。
  • BNDCFGU的加载(由XRSTOR或XRSTORS)忽略存储器映像中除列举的最大线性地址宽度之外的任何位。处理器符号扩展到最高有效位(例如,支持5级分页的处理器上的位56),以确保BNDCFGU始终是规范的。
  • 每个非控制x87指令加载FIP。加载的值总是相对于当前分页模式是规范的:如果4级分页处于活动状态,则为48位规范,如果5级分页处于活动状态,则为57位规范。

DR0到DR3可以装载MOV到DR指令。该指令允许这些寄存器加载非规范地址。即使地址不是规范,MOV从DR指令的MOV将返回上次装载到MOV指令的值。断点地址匹配仅适用于规范线性地址。

2.6 与TLB无效指令的交互

Intel 64架构包括三个指令,可以使指令操作数的线性地址的TLB条目无效:INVLPG,INVPCID和INVVPID。以下项描述了它们如何受线性地址宽度的影响。

  • INVLPG指令需要一个内存操作数。它使逻辑处理器正在为当前线性地址空间的该操作数的线性地址缓存的任何TLB条目无效。如果该地址相对于当前分页模式不是规范的,则该指令不会发生故障(例如,当4级分页处于活动状态时,该指令不是48位规范的)。但是,由于处理器不缓存相对于当前分页模式不是规范的地址的TLB条目,因此不执行无效。
  • INVPCID指令采用寄存器操作数(INVPCID类型)和存储器操作数(INVPCID描述符)。如果INVPCID类型为0,则该指令使逻辑处理器对于INVPCID描述符中指定的线性地址和PCID缓存的任何TLB条目无效。如果线性地址与处理器支持的线性地址宽度相关,则该指令将导致一般保护异常(#GP)。如果处理器支持5级分页,则即使4级分页处于活动状态且地址不是48位规范,该指令也不会对于57位规范的地址造成这样的#GP,无论分页模式如何。
  • INVVPID指令采用寄存器操作数(INVVPID类型)和存储器操作数(INVVPID描述符)。如果INVPCID类型为0,则该指令使逻辑处理器正在为INVVPID描述符中指定的线性地址和VPID缓存的TLB条目无效。如果线性地址不符合处理器支持的线性地址宽度,那么指令将失败.1如果处理器支持5级分页,则对于57位规范的地址,无论分页如何,该指令都不会失败模式,即使4级分页处于活动状态,并且地址不是48位规范的。

2.7 与Intel MPX的交互

Intel内存保护扩展(Intel MPX)定义了一组4个绑定的寄存器,每个绑定的寄存器都可以与存储器中的特定指针相关联。英特尔MPX包含两个指令——BNDLDX和BNDSTX,允许软件从内存中加载或存储与内存中特定指针相关联的边界。

BNDLDX和BNDSTX指令每个都采用绑定寄存器和存储器操作数(相关联的指针)。每个都解析存储器操作数的线性地址以遍历存储器中的分层数据结构。在64位模式下,这些指令不一定使用所提供的64位地址中的所有位。

使用的位数为48加一个称为MPX地址宽度调整(MAWA)的值。

MAWA的价值取决于CPL;当前分页模式(4级分页或5级分页);并且,如果5级分页处于活动状态,则为新的MSR的值。支持Intel MPX和5级分页的处理器支持IA32_MPX_LAX MSR(MSR index 1000H)。只定义MSR的位0。

如果CPL <3,则使用特权MAWA(MAWAS)。MAWAS的值由CR4.LA57的设置决定。如果CR4.LA57 = 0(4级分页活动;调用MAWA仅在64位模式下相关),MAWAS的值为0。如果CR4.LA57 = 1(5级分页有效),MAWAS的值为9。CPUID指令未列举MAWAS的值。

如果CPL = 3,则使用用户MAWA(MAWAU)。MAWAU的值如下确定。如果CR4.LA57 = 0或IA32_MPX_LAX [位0] = 0,MAWAU的值为0。如果CR4.LA57 = 1,IA32_MPX_LAX [位0] = 1,MAWAU的值为9。列出了MAWAU的当前值CPUID.(EAX = 07H,ECX = 0H):ECX.MAWAU [位21:17]。

以下项目指定64位模式下BNDLDX和BNDSTX指令的执行方式如何解析线性地址以遍历分层数据结构。

1。INVVPID是一个VMX指令。为了响应某些条件,VMX的执行可能会失败,这意味着它不能完成其正常的操作。当VMX指令失败时,控制转到下一条指令(而不是故障处理程序),并设置一个标志来报告故障。

  • 绑定的目录位于BNDCFGx.1位63:12中指定的4 KB对齐的线性地址。使用LAp(指向缓冲区的指针的线性地址)选择BDE以构造64位偏移,如下所示:
  • 位63:31 + MAWA为0;
  • 位30 + MAWA:3是LAp [位47 + MAWA:20];和
  • 位2:0为0。

BDE的地址是绑定目录基址(从BNDCFGx)加上这个64位偏移量的总和。

如果BNDLDX或BNDSTX在一个enclave内执行,指令就像MAWAU = 0一样操作(不管CR4的值如何)。LA57和IA32_MPX_LAX [位0])。

  • 处理器使用BDE的位63:3作为绑定表(BT)的8字节对齐地址。使用LAp(指向缓冲区的指针的线性地址)来选择BTE来构造64位偏移,如下所示:
  • 位63:22为0;
  • 位21:5是LAp [位19:3];和
  • 位4:0为0。

BTE的地址是绑定表基地址(从BDE)加上这个64位偏移量的和。

绑定目录包括228 + MAWA 64位条目(BDE); 2因此,64位模式下绑定目录的大小为21 + MAWA GBytes。绑定表包含217个32字节条目(BTE);因此,64位模式下的绑定表的大小为4 MBytes(与MAWA无关)。

2.8 与Intel SGX的互动

Intel软件保护扩展(Intel SGX))定义了新的处理器功能,这些功能在ENCLS(特权)和ENCLU(用户)指令中被实现为SGX leaf功能。

SGX leaf功能包括正常使用线性地址的存储器访问。当以64位模式执行时,线性地址的宽度为64位,并且受到64位线性地址对存储器访问的正常处理(见第2.3节)。另外,一些leaf功能应用与线性地址宽度相关的特定架构检查。以下项目详细介绍了这些检查以及如何为支持5级分页的处理器定义它们。

  • ENCLS的ECREATE leaf功能通过创建新的SGX enclave控制结构(SECS)来创建新的enclave。对于64位的enclave,处理器检查enclave线性基地址(SECS中指定的)是否是规范的,如果不是,则产生通用保护异常(#GP)。在支持5级分页的处理器上,无论当前的分页模式如何,此检查均为57位规范。

除了检查enclave线性基地址的规范性外,ECREATE还确认了在SECS中指定的enclave大小不大于处理器支持的最大尺寸(如果enclave大小太大,ECREATE将生成#GP )。如第2.2.1节所述,较旧的处理器支持大小为247字节的64位enclave;支持5级分页的处理器预计将支持大小最多为256字节的enclave。

如果enclave的XSAVE特征请求掩码(XFRM)的位4:3被设置(指示在执行enclave期间将启用Intel MPX),则如果enclave的大小大于248字节,则ECREATE将生成#GP,即使处理器列举了对较大enclave的支持。

注1。如果CPL < 3,则使用BNDCFGS;如果CPL = 3,则使用BNDCFGU。
注2。在64位enclave中使用的绑定目录始终包含228个64位BDE,因此具有2 GBytes的大小。

  • ENCLU的EENTER和ERESUME leaf功能将控制流传送到指定enclave内的入口点。对于进入64位enclave,处理器检查某些线性地址是否是规范的,如果没有,则产生一般保护异常(#GP)。以下项目详细说明这些检查。
    • 指定入口点的线性地址必须是规范的。如果4级分页活动,则必须是48位规范;如果5级分页处于活动状态,则必须是57位规范。
    • 异步出口点的线性地址(AEP-处理器在异步enclave出口处传输控制的地址)必须是规范的。如果4级分页活动,则必须是48位规范;如果5级分页处于活动状态,则必须是57位规范。
    • FS和GS段的基址的enclave数值必须是规范的。在支持5级分页的处理器上,无论当前的分页模式如何,这些检查均为57位规范。
    • EEXIT leaf功能退出当前执行的enclave并分支到指定的地址。对于从64位enclave出口,处理器检查该目标线性地址是否是规范的,如果不是,则生成通用保护异常(#GP)。如果4级分页活动,则必须是48位规范;如果5级分页活动,则只需要57位规范。

如第2.7节所述,64位enclave中BNDLDX和BNDSTX的执行总是像MAWAU = 0一样运行。

3 线性地址扩展和VMX转换

如第1.2节所述,VM Entry和VM Exit会操作包含线性地址的许多处理器寄存器。转换以基于规范性的方式尊重处理器的线性地址宽度。

如第2章所述,支持5级分页的处理器将线性地址宽度从48位扩展到57位。该扩展更改了VMX转换的操作。VM Entry的更改在第3.1节中详细介绍,而VM Exit的更改在3.2节中给出。

3.1 线性地址扩展和VM Entry

VMCS中的某些字段对应于包含线性地址的寄存器。

VM Entry确认这些字段包含规范的值。该检查基于处理器支持的线性地址宽度(例如,如果处理器支持5级分页,则基于57位规范)。以下是适用于此的字段。

  • 在主机区域:
    • IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSR的字段。
    • FS,GS,TR,GDTR和IDTR的基地址字段。
  • 在客户机区域:
    • IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSR的字段。
    • FS,GS,TR,GDTR和IDTR的基地址字段。
    • LDTR的基地址字段(如果LDTR可用)。
    • IA32_BNDCFGS MSR的字段(如果VM Entry正在加载该MSR)。

到64位模式的虚拟机进入还对当前VMCS的客户状态区域中的RIP字段进行检查。如果VM Entry将导致4级分页,则会检查Guest RIP字段的位63:48是否相同;如果这将导致5级分页,该检查位63:57.1

3.2 线性地址扩展和虚拟机退出

VM Exit将某些寄存器的状态保存到VMCS的客户状态区域。这些寄存器中的一些包含线性地址。如第1.1节所述,CPU通常确保这些寄存器中的值与CPU的线性地址宽度相关。因此,这些寄存器的VM Exit保存的值也将一样。

注1。请注意,这些检查不会确认客户机RIP字段是否相对于输入的分页模式是规范的。例如,位63:47在48位规范地址中是相同的。然而,
VM Entry4级分页可能会加载一个值,比特47与位63:48的值不同。

LDTR基地址有一个特殊情况。如果在退出VM时LDTR不可用,则保存为基地址的值未定义。但是,在不支持5级分页的处理器上,这个未定义的值总是为48位,在支持5级分页的处理器上始终为57位规范。

VM Exit从VMCS的主机状态区域加载某些寄存器的状态。这些寄存器中的一些包含线性地址。每个VM Exit确保以下每个寄存器的值是规范的:IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSRs;以及FS,GS,TR,GDTR和IDTR的基址。这样做取决于处理器是否支持5级分页。

  • 如果处理器不支持5级分页,则寄存器中的位47:0将从主机状态区域中的字段加载;位47的值然后被符号扩展到寄存器的位63:48。
  • 如果处理器支持5级分页,则寄存器的位56:0将从主机状态区域中的字段加载;然后,位56的值被符号扩展到寄存器的位63:57。

再次,LDTR有一个特殊情况。在VM Exit后,LDTR始终不可用。它的基地址可以加载一个未定义的值。在不支持5级分页的处理器上,这个未定义的值始终是48位规范的,并且在支持5级分页的处理器上始终是57位规范的。

4 5级EPT

5级EPT是EPT的新模式。顾名思义,它将通过遍历EPT分页结构的5级层次结构来转换客户机物理地址。由于该过程是未经修改的,5级分页将处理器的客户物理地址宽度扩展到57位。(附加的9位用于从层次结构的第五级中选择一个条目。)为了清楚起见,原来的EPT模式现在称为4级EPT。

本章的其余部分规定了4级EPT的架构更改以及5级EPT所定义和引入的架构。第4.1节描述了客户物理地址宽度的扩展如何影响4级EPT。第4.2节规定了CPU如何列举5级EPT以及软件如何启用该功能。

第4.3节详细介绍了5级EPT如何转换客户机物理地址。

4.1 4级EPT:客户机地址

如1.3节所述,4级EPT仅限于转换48位客户机物理地址。

这在现有的处理器上不是问题,因为它们将物理地址宽度限制为46位(见第1.1节)。处理器的物理地址宽度也限制客户机物理地址。这意味着,在现有的处理器上,任何尝试使用设置低于低48位的客户机 - 物理地址将导致页错误异常(#PF)。

支持5级分页的处理器预计将支持52个物理地址位。这样的处理器允许使用设置在51:48范围内的位的客户机物理地址;不生成#PF。

设置51:48范围内的位的客户机物理地址无法通过4级EPT进行转换。当4级EPT处于活动状态时尝试访问此地址会导致EPT违规(参见第1.3节)。

EPT违规在称为退出资格的值中生成关于异常的信息。一般来说,尝试访问太宽的客户物理地址导致的EPT违规建立了目前为其他EPT违规执行的退出限定条件。退出限定的位6:3作出异常,它报告客户机物理地址的访问权限。新的EPT违规总是清除这些位。

4.2 5级EPT:启用和启用

本节介绍处理器如何列举到5级EPT的软件支持以及软件如何使处理器能够使用该支持。

4.2.1 列举

支持EPT的处理器列举了IA32_VMX_EPT_VPID_CAP MSR(索引48CH)中与EPT相关的详细信息。目前,IA32_VMX_EPT_VPID_CAP [bit 6]列举了4级EPT的支持。也支持5级EPT的处理器将通过设置IA32_VMX_EPT_VPID_CAP [bit 7]来列举该事实。

处理器支持的客户机物理地址宽度未使用IA32_VMX_EPT_VPID_CAP MSR列举。这是因为宽度总是与CPUID.80000008H列举的处理器的最大物理地址宽度相同:EAX [位7:0]。

4.2.2 由软件启用

通过在使用VMCS进行VM输入之前,通过在当前VMCS中设置 “启用EPT” VM执行控制,VMM启用EPT。

EPT操作的具体细节由VMCS中的扩展页表指针字段(EPTP)确定。特别地,EPTP [位5:3]包含比EPT使用的级别小1的值。在现有的处理器上,此值必须为3,表示4级EPT。 (如果使用不同的值,VM Entry将失败。)也支持5级EPT的处理器也将允许值4(表示5级EPT)。

总之,在支持5级检查EPTP的处理器上的VM Entry[位5:3]。如果值为3,VM Entry激活4级EPT。如果值为4,VM Entry激活5级EPT。使用任何其他值,VM Entry失败。

4.3 5级EPT:客户机物理地址转换

像4级EPT一样,5级EPT使用内存分页结构的层次结构来转换客户机物理地址。因为5级EPT将客户机物理地址宽度增加到57位(从4级EPT支持的48位),5级EPT允许访问物理地址空间最多128 PBy给定时间

以下项目更详细地描述了5级EPT对转换过程的变化。

  • 转换开始于识别4 KB自然对齐的EPT PML5表。它位于EPTP位51:12中指定的物理地址。 EPT PML5表包括512个64位条目(EPT PML5E)。使用如下定义的物理地址选择EPT PML5E。
  • 位63:52都是0。
  • 位51:12来自EPTP。
  • 位11:3是客户机物理地址的位56:48。
  • 位2:0都为0。

因为使用客户机物理地址的位56:48来识别EPT PML5E,所以它控制对线性地址空间的256-TByte区域的访问。EPT PML5E的格式如表4-1所示。

表4-1。EPT PML5条目(EPT PML5E)

比特位置 内容
0 读取权限指示是否允许从此条目控制的256-TByte区域读取。
1 写入访问;指示是否允许从此条目控制的256-TByte区域写入。
2 如果 “执行EPT的基于模式的执行控制” VM执行控制为0,则执行访问;指示是否允许从此条目控制的256 TByte区域执行指令读取。如果该控制为1,则执行监督模式线性地址的访问;指示是否允许从该条目控制的256-TByte区域中的监督模式线性地址进行指令读取。
7:3 保留(必须为0)。
8 如果EPTP的第6位为1,则EPT的访问标志;指示软件是否访问了由此条目控制的256-TByte区域。如果EPTP的第6位为0,则忽略。
9 忽略。
10 执行用户模式线性地址的访问。如果 “基于模式的EPT执行控制” VM执行控制为1,则指示是否允许从该条目控制的256-TByte区域中的用户模式线性地址进行指令读取。如果该控件为0,则忽略该位。
11 忽略。
M-1:12 本条引用的4 KB对齐EPT PML4表的物理地址。
51:M 保留(必须为0)。
63:52 忽略。
  • 转换过程的下一步确定一个4 KB自然对齐的EPT PML4表。它位于EPT PML5E的位51:12中指定的物理地址(见表4-1)。EPT PML4表包括512个64位条目(EPT PML4E)。使用如下定义的物理地址选择EPT PML4E。
  • 位51:12来自EPT PML5E。
  • 位11:3是客户机物理地址的位47:39。
  • 位2:0都为0。

因为使用客户机物理地址的位56:39来识别EPT PML4E,所以它控制访问物理地址空间的512 GB字节区域的访问。

一旦识别了EPT PML4E,客户机物理地址的位38:0确定了与4级EPT完全相同的转换过程的剩余部分。如表4-1所示,EPT PML5E的位2:0和位10的值正常使用(与其他EPT分页结构条目中的相应位组合使用)来确定是否发生EPT违规。EPT PML5E中的访问标志(位8)如对其他EPT分页结构条目所做的那样进行更新。

4.4 5级EPT和EPTP切换

可以通过调用在VMX非root操作中的VM功能0来修改EPTP的值
(EPTP切换)。这通过执行在EAX寄存器中值为0的VMFUNC指令来完成。VM功能的调用0使用从内存中的数据结构中选择的值加载EPTP。

在以这种方式加载EPTP之前,处理器首先确认要加载的值是有效的。有效EPTP值的定义取决于处理器是否支持5级EPT。

  • 如果处理器不支持5级EPT,如果不会导致VM Entry失败(例如,它不设置任何保留位),则内存中的EPTP值被认为是有效的。
  • 如果处理器支持5级EPT,则只有在不会导致VM Entry失败(如上),以及其5:3(控制EPT级别数量)的值与EPTP的当前值相同时,内存中的EPTP值才被视为有效。

这意味着VM功能0的调用不能改变4级EPT和5级EPT之间的EPT模式。

5 Intel虚拟化

Intel用于定向I/O的虚拟化技术包括称为DMA重映射(DMA remapping)的功能。

DMA重映射为隔离设备访问内存提供了硬件支持。当设备尝试访问系统内存时,DMA重映射硬件​​拦截访问并利用分页结构来确定访问是否被允许;它还决定了访问的实际位置。

DMA重映射硬件​​可能支持两级地址转换。一个级别可以将线性地址转换为客户机物理地址,而第二级可以将客户机物理地址重映射到物理地址。

第一级转换使用与普通分页相同格式的分页结构。第二级转换使用与EPT所用格式相同格式的分页结构。

预计在支持更宽的线性和客户机物理地址(分别使用5级分页和5级EPT)的平台上,DMA重新映射硬件将被类似地增强,以具有5级转换过程来支持那些更宽的地址。

这种对DMA重映射的增强支持将在未来对用于定向I/O架构规范的Intel虚拟化技术的修订版本中进行详细说明。

我爱读规范