EPT学习记录

扩展分页机制(EPT)

   扩展页表机制(EPT)是一项可用于支持物理内存虚拟化的功能。使用EPT时,通常会被视为物理地址(并用于访问内存)的某些地址将被视为来guest-physical addresses。通过遍历一组EPT分页结构来转换guest-physical addresses,以生成用于访问内存的物理地址。

EPT介绍

   EPT在“启用EPT” VM-execution control为1.时使用。它将转换VMX non-root operation中使用的guest-physical addresses以及VM Entry用于事件注入的guest-physical addresses

   从guest-physical addresses到物理地址的转换由一组EPT分页结构确定。 EPT分页结构类似于当处理器处于IA-32e模式时用于转换线性地址的分页结构。

   如果CR0.PG = 1,则通过控制寄存器CR3引用的分页结构转换线性地址。当“启用EPT” VM-execution control为1时,这些称为guest paging structures。如果CR0.PG = 0,则没有guest paging structures

   当“启用EPT”VM-execution control为1时,guest-physical addresses的标识取决于CR0.PG的值:
• 如果CR0.PG = 0,则每个线性地址均被视为guest-physical addresses。
• 如果CR0.PG = 1,则guest-physical addresses是从控制寄存器CR3和guest paging    structures的内容派生的地址。 (这包括PDPTE的值,逻辑处理器将这些值存储在内部非体系结构寄存器中。)后者包括(在页表项和其他位7-PS为1的页结构项中)地址guest paging structures将线性地址转换为该地址。

   如果CR0.PG = 1,则将线性地址转换为物理地址需要使用EPT进行的guest-physical addresses的多次转换。例如,假定CR4.PAE = CR4.PSE =0。然后,32位线性地址的转换如下:
   • 线性地址的位31:22是在来 guest page directory中的CR3 guest-physical addresses中选择一个条目。 guest page directory(PDE)的guest-physical addresses通过EPT转换,以确定guest PDE的物理地址。

   • 线性地址的位21:12在guest PDE中的guest-physical addresses的 guest page table中选择一个条目。page-table entry(PTE)的guest-physical addresses通过EPT转换,以确定guest PTE的物理地址。

   • 线性地址的位11:0是位于guest PTE中的guest-physical addresses处的页面框架中的偏移量。由该偏移量确定的guest-physical addresses通过EPT转换,以确定原始线性地址转换成的物理地址。

   除了将guest-physical addresses转换为物理地址外,EPT还指定访问该地址时允许软件的特权。尝试进行不允许的访问称为 EPT violations,并导致VM exit

   处理器仅在使用guest-physical addresses访问内存时才使用EPT转换这些物理地址。

   • MOV to CR3指令使用guest-physical addresses加载CR3。该地址是否通过EPT转换取决于是否使用PAE分页。

   — 如果未使用PAE分页,则指令不会使用该地址访问内存,也不会导致它通过EPT转换。 (如果CR0.PG = 1,则将在下一个使用线性地址访问的存储器上通过EPT转换地址。)

   — 如果正在使用PAE分页,则该指令从该地址加载四个页面目录指针表条目(PDPTE),并且确实导致该地址通过EPT转换。

   • 确定了从CR3中的guest-physical addresses加载PDPTE的MOV至CR0和MOV至CR4的执行。这样的执行使该地址通过EPT进行转换。

   • PDPTE包含guest-physical addresses。加载PDPTE的指令不使用这些地址访问内存,也不导致它们通过EPT转换。 PDPTE中的地址将在使用下一个使用该PDPTE的线性地址的下一次访问内存时通过EPT转换。

EPT转换机制

   除了将guest-physical addresses转换为物理地址外,EPT还指定访问该地址时允许软件的特权。 尝试进行不允许的访问称为EPT violation,并导致VM exit。

   EPT转换机制仅使用每个guest-physical addresses的位47:0。 它使用4级分页,这意味着最多可以访问4个EPT paging-structure条目来转换guest-physical addresses。

   逻辑处理器对这48位进行分区,以遍历EPT分页结构:

   • 一个4 KB自然对齐的EPT PML4表位于扩展页表指针(EPTP)的第51:12位中指定的物理地址,即VM-execution control 字段)。 EPT PML4表包括512个64位条目(EPT PML4E)。 使用如下定义的物理地址选择一个EPT PML4E:
— BIT 63:52均为0。
— BIT 51:12来自EPTP。
— BIT 11:3是guest-physical addresses的位47:39。
— BIT 2:0均为0。
   由于EPT PML4E是使用guest-physical addresses的位47:39标识的,因此它控制对guest-physical addresses空间的512 GB区域的访问。EPT PML4E的格式如图1所示
在这里插入图片描述
图1 Format of an EPT PML4 Entry (PML4E) that References an EPT Page-Directory-Pointer Table

   一个4 KB自然对齐的EPT页面目录指针表位于EPT PML4E的位51:12中指定的物理地址。一个EPT页面目录指针表包括512个64位条目(EPT PDPTE)。使用如下定义的物理地址选择一个EPT PDPTE:
—位63:52均为0。
—位51:12来自EPT PML4E。
—位11:3是guest-physical addresses的位38:30。
—位2:0均为0。

   因为EPT PDPTE是使用guest-physical addresses的47:30位标识的,所以它控制对guest-physical addresses空间的1 GB区域的访问。 EPT PDPTE的使用取决于该条目中位7的值:

   • 如果EPT PDPTE的第7位为1,则EPT PDPTE映射1 GB的页面。最终的物理地址计算如下:
—位63:52均为0。
—位51:30来自EPT PDPTE。
—位29:0来自原始guest-physical addresses。

下图2给出了映射1 GB页面的EPT PDPTE的格式。

   • 如果EPT PDPTE的位7为0,则4 KB自然对齐的EPT页目录位于EPT PDPTE的位51:12指定的物理地址处。图3 给出了引用EPT页面目录的EPT PDPTE格式。
在这里插入图片描述
图2 Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page
在这里插入图片描述
图3 Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that References an EPT Page Directory

   一个EPT页面目录包含512个64位条目(PDE)。使用如下定义的物理地址选择一个EPT PDE:

   — BIT 63:52均为0。
   — BIT 51:12来自EPT PDPTE。
   — BIT 11:3是guest-physical addresses的位29:21。
   — BIT 2:0均为0。

   因为EPT PDE是使用guest-physical addresses的位47:21标识的,所以它控制对guest-physical addresses空间的2 MB区域的访问。 EPT PDE的使用取决于该条目中位7的值:

• 如果EPT PDE的位7为1,则EPT PDE映射2 MB的页面。最终的物理地址计算如下:
   — BIT 63:52均为0。
   — BIT 51:21来自EPT PDE。
   — BIT 20:0来自原始guest-physical addresses。

图4 给出了映射2 MB页面的EPT PDE格式。

   • 如果EPT PDE的第7位为0,则4 KB自然对齐的EPT页表位于物理地址
在EPT PDE的位51:12中指定。引用了EPT页表的EPT PDE格式如下:
图5给出了引用EPT页表的EPT PDE格式。

   一个EPT页表包含512个64位条目(PTE)。使用定义的物理地址选择EPT PTE
如下:
   — BIT 63:52均为0。
在这里插入图片描述
图4 Format of an EPT Page-Directory Entry (PDE) that Maps a 2-MByte Page

   — BIT 51:12来自EPT PDE。
   — BIT 11:3是guest-physical addresses的位20:12。
   — BIT 2:0均为0。

   • 因为使用guest-physical addresses的47:12位标识了EPT PTE,所以每个EPT PTE都映射一个4 KB页面。最终的物理地址计算如下:

   — BIT 63:52均为0。
   — BIT 51:12来自EPT PTE。
   — BIT 11:0来自原始guest-physical addresses。

   EPT PTE的格式在图6中给出。

   如果2:0的任何一位为1,则存在EPT paging-structure 条目;否则,为0。否则,该条目不存在。处理器将忽略位62:3,并使用该条目既不引用另一个EPT paging-structure 条目,也不产生物理地址。使用guest-physical addresses的引用(其转换遇到不存在的EPT分页结构的引用)会导致 EPT violation。 (如果“ EPT violation #VE” VM-execution control 为1,则只有位63为0时,EPT violation才能转换为虚拟化例外;如果“ 如果“ EPT violation #VE” VM-execution control 为0,则忽略此位。)
在这里插入图片描述
图5 Format of an EPT Page-Directory Entry (PDE) that References an EPT Page Table

EPT-Induced VM Exits

   由于EPT misconfigurationEPT violation以及page-modification log-full事件,使用guest-physical addresses进行的访问可能会导致VM exit。 当在转换guest-physical addresses的过程中,逻辑处理器遇到包含不支持的值的EPTpage struceture条目时,就会发生EPT misconfiguration。 如果没有EPT misconfiguration,但EPT分页结构条目不允许使用guest-physical addresses进行访问,则发生EPT violation。 当逻辑处理器确定需要创建页面修改日志条目并且当前日志已满时,将发生页面修改日志已满事件。
在这里插入图片描述
图6 Format of an EPT Page-Directory Entry (PDE) that References an EPT Page Table

   这些事件仅由于尝试使用guest-physical address访问内存而发生。 在MOV to CR3指令中用guest-physical address加载CR3不会导致 EPT configuration或EPT violation ,直到该地址用于访问分页结构为止。

   如果“ EPT-violation #VE” VM-execution control 为1,则某些EPT violation可能会导致虚拟化异常,而不是VM exit。

EPT Misconfigurations

   如果 guest-physical address的转换遇到满足以下任一条件的EPT分页结构,则会发生EPT Misconfigurations:

   • 该条目的位0清除(指示不允许进行数据读取),并且将位1置1(指示允许进行数据写入)。

   • 如果处理器不支持以下任一操作,则仅执行translations :

   — 该条目的位0被清除(指示不允许进行数据读取),并且位2被置位(指示允许进行指令提取)。

   — “用于EPT的基于模式的执行控制” VM-execution control 为1,该条目的位0被清除(指示不允许进行数据读取),并且已设置位10(指示允许从用户提取指令)模式线性地址)。

   软件应阅读VMX功能MSR IA32_VMX_EPT_VPID_CAP,以确定是否支持仅执行转换。

   • 该条目存在,并且具有以下条件之一:

   — 保留位被置位。这包括设置超出逻辑处理器的物理地址宽度的范围为51:12的位。有关在哪些EPT page struceture条目中保留哪些位的详细信息。

   — 该条目是最后一个用于转换guest-physical address(第7位设置为1的EPT PDE或EPT PTE),而第5:3位(EPT存储器类型)的值是2、3或7 (这些值是保留的)。

   当为EPT paging-structure条目配置了保留用于将来功能的设置时,会导致EPT misconfigurations 。developer应注意,将来可能会使用此类设置,并且导致一个处理器上的EPT配置错误的EPT paging-structure条目将来可能不会使用。

EPT Violations

   在使用guest-physical address进行访问的过程中,可能会发生EPT violation,其转换不会引起EPT misconfigurations。 在以下任何一种情况下,都会发生EPT violation:

   • guest-physical address的转换遇到了一个不存在的EPT paging-structure条目。

   • 访问是读取的数据,对于要读取的任何字节,在用于转换字节的guest-physical address的任何EPT paging-structure条目中,位0(读取访问)均被清除。 guest paging structures的逻辑处理器读取的转换线性地址的内容被视为数据读取。
在这里插入图片描述
图 7. Formats of EPTP and EPT Paging-Structure Entries

   该访问是数据写操作,对于要写入的任何字节,在用于转换该字节的 guest-physical address 的任何EPT page-structure条目中,位1(写访问)均被清除。逻辑处理器对Guest page-structure进行的写操作以更新访问标志和脏标志被视为数据写操作。

   如果EPT指针(EPTP)的第6位为1(启用EPT的访问标志和脏标志),则处理器对Guest page-structure条目的访问将被视为关于EPT violation的写操作。因此,如果在用Guest page-structure条目的guest-physical address的任何EPT page-structure条目中清除了位1,则尝试使用该条目来转换线性地址都会导致EPT violation。

   (这不适用于MOV to CR指令对PAE分页的PDPTE寄存器的加载;这些 guest PDPTE的加载被视为读取,并且不会由于guest-physical address 而不引起EPT violation可写。)

   如果“执行EPT的sub-page的权限” VM-execution control 为1,则在某些情况下,不会将数据写入将导致EPT violation的guest-physical address(如上所述)。如果使用4 KB页面映射guest-physical address,并且用于映射页面的EPT PTE的位61(子页面写权限)为1,则可能允许写入某些128字节子页面。

   • 访问是一条指令提取,而EPT page-structure 条目会阻止对正在提取的任何字节进行执行访问。是否发生这种情况取决于“ EPT基于模式的执行控制” VM execution control的设置:
   — 如果控件为0,并且在用于转换字节的guest-physical address 的任何EPT page-structure 条目中清除了位2(执行访问),则阻止从字节取指令。

   — 如果控制为1,则在以下两种情况下均禁止从字节取指令:

   • 分页将字节的线性地址映射为超级用户模式地址,并且在用于转换字节的guest-physical address 的任何EPT page-structure 条目中,位2(超级用户模式线性地址的执行访问)均被清除。

   如果在控制线性地址转换的至少一个分页结构项中,U / S标志(位2)为0,则分页将线性地址映射为超级用户模式地址。

   • 分页将字节的线性地址映射为用户模式地址,并且在用于转换字节的guest-physical address 的任何EPT page-structure 条目中,位10(对用户模式线性地址的执行访问权限)均被清除。

   如果所有控制线性地址转换的分页结构条目中的U / S标志均为1,则分页将线性地址映射为用户模式地址。如果禁用分页(CR0.PG = 0),则每个线性地址均为用户模式地址。

Prioritization of EPT Misconfigurations and EPT Violations

   线性地址到物理地址的转换需要使用EPT进行 guest-physical addresses的一次或多次转换。EPT引起的VM exit相对于彼此以及相对于使用线性地址访问内存时可能遇到的其他事件的相对优先级。
对于访问 guest-physical addresses,是基于迭代过程来确定是发生EPT misconfiguration 还是 EPT violation :

步骤1. 读取一个EPT paging-structure条目(最初,​​这是一个EPT PML4条目):
 a。如果该条目不存在(请参阅第28.2.2节),则发生EPT violation。
 b。如果该条目存在但其内容配置不正确(请参阅第28.2.3.1节),则会发生EPT misconfiguration。
 c。如果该条目存在并且其内容已正确配置,则操作取决于该条目是否引用另一个EPT paging-structure(它是将第7位设置为1的EPT PDE还是EPT PTE):
  i)如果该条目确实引用了另一个EPT paging-structure,则访问该结构中的条目;针对该其他条目执行步骤1。
  ii)否则,该条目用于产生最终的物理地址(原始 guest-physical addresses的住转换);执行步骤2。

步骤2. 一旦确定了最终的物理地址,就将评估由EPT paging-structure条目确定的特权:

   a。 如果这些特权不允许访问guest-physical addresses(请参阅第28.2.3.2节),则会发生EPT violation。

   b。 如果这些特权允许访问guest-physical addresses,则使用最终物理地址访问内存。

   如果CR0.PG = 1,则线性地址的转换也是一个迭代过程,处理器首先访问由CR3中的guest-physical addresses 引用的guest paging-structure中的一项(或者,如果正在使用PAE分页, (适当的PDPTE寄存器中的访客物理地址),然后访问另一个guest paging-structure中的一个条目,该条目由第一个guest paging-structure条目中的guest-physical addresses引用,等等。每个guest-physical addresses本身都使用 EPT并可能导致EPT导致的VM exit。 以下各项详细说明了在此迭代过程中如何识别页面错误和EPT引起的VM exit:

步骤1. 尝试使用guest-physical addresses(最初是CR3或PDPTE寄存器中的地址)访问guest paging-structure条目。
   a。如果由于EPT misconfiguration 或 EPT violation而导致访问失败(请参见上文),则会发生EPT导致的VM exit。

   b。如果访问没有导致EPT导致的VM exit,请查询该条目的位0(当前标志):
  i)如果当前标志为0或设置了任何保留位,则会发生页面错误。
  ii)如果当前标志为1,则未设置保留位,则操作取决于该条目是否引用其他guest paging-structure(它是PS = 1的 guest PDE还是guest PTE):

   • 如果该条目确实引用了另一个guest paging-structure,则访问该结构中的条目;针对该其他条目执行步骤1。
   • 否则,该条目用于产生最终的guest-physical addresses(原始线性地址的转换);执行步骤2。

步骤2. 一旦确定了最终的guest-physical addresses,便会评估由guest paging-structure条目确定的特权:

   a。如果这些特权不允许访问线性地址(例如,这是对只读页面的写操作),则会发生页面错误。

   b。如果这些特权允许访问线性地址,则尝试访问最终guest-physical addresses处的内存:
  i)如果由于EPT misconfiguration或EPT violation而导致访问失败(请参见上文),则会发生EPT导致的VM exit。
  ii)如果访问未导致EPT导致的VM exit,则使用最终物理地址(使用EPT转换最终guest-physical addresses)来访问内存。

   如果CR0.PG = 0,则将线性地址视为guest-physical addresses,并使用EPT对其进行转换(请参见上文)。如果此过程在没有EPT violation或EPT misconfiguration的情况下完成,则会产生物理地址并确定EPT paging-structure条目所允许的特权。如果这些特权不允许访问物理地址(请参阅第28.2.3.2节),则会发生EPT violation。否则,将使用物理地址访问内存。

Sub-Page Write Permissions

   前面解释了EPT如何使用EPT violation来强制guest-physical addresses的访问权限。由于这些访问权限是使用用于转换guest-physical addresses的EPT paging-structure条目确定的,因此其粒度仅限于用于映射页面的粒度(1 GB,2 MB或4 KB)。

   sub-page写许可功能允许以更精细的粒度控制对guest-physical addresses的写访问。sub-page写权限允许以自然对齐的128字节子页面的粒度来控制写访问。特别是,该功能允许对4 KB页面的选定sub-page进行写操作,否则这些写操作将不可写。

   通过将“用于EPT的子页面写权限” VM-execution control 设置为1,可以启用sub-page写权限。

Write Accesses That Are Eligible for Sub-Page Write Permissions

   如果不允许对guest-physical addresses进行写操作时,则该guest-physical addresses有资格获得sub-page写权限:在用于转换guest-physical addresses的任何EPT分页结构条目中,位1(写访问权)均被清除。由于其他原因(例如,转换遇到不存在的EPT分页结构条目)而不允许向其写入的guest-physical addresses不符合子页面写权限。

   此外,只有使用4 KB页面映射guest-physical addresses且用于映射页面的EPT PTE的位61(子页面写许可权)为1时,该guest-physical addresses才具有sub-page写许可权。映射到较大页面的guest-physical addresses不具有sub-page写权限。)

   对于某些内存访问,处理器将忽略用于映射4 KB页面的EPT PTE中的位61,并且不对访问应用sub-page写入权限。sub-page写权限永远不适用于以下访问:
   • 在转换注册区域内执行的写访问。

   • 快速对快速ELRANGE中的地址的写访问。 (子页面写权限可能适用于安全区域对其ELRANGE外部地址的写访问。)

   • 通过英特尔SGX指令对安全区页面缓存(EPC)的写访问。

   • 对guest-page structure的写访问以更新已访问或脏标志。

   • 处理器在访问时启用了对guest-page structure条目的访问,并且启用了EPT的脏标志(对于EPT violation,此类访问被视为写操作。

   还有其他访问权限,可能无法对其应用子页面写权限(行为是特定于模型的)。以下各项列举了示例:

   • 跨两个4 KB页面的写访问。在这种情况下,子页面权限可能既不应用于页面也不能应用于页面之一。 (除非对两个页面都允许写入,否则不会写入任何页面。)

   • 通过执行多个写访问的指令进行写访问(子页面写权限主要用于基本指令,例如AND,MOV,OR,TEST,XCHG和XOR)。

   如果guest-physical addresses符合子页面写权限,则处理器上文中描述的过程确定是否允许对该地址进行写操作。

   如果guest-physical addresses符合sub-page写权限,并且该地址转换为APIC访问页面上的地址,则处理器可以将对该地址的写访问视为“虚拟化APIC访问” ” VM执行控制为0。因此,建议软件不要配置任何转换为​​APIC访问页面上的地址的guest-physical addresses,以符合sub-page写权限。

Determining an Access’s Sub-Page Write Permission

   sub-page写权限控制分别访问4 KB页面的32个128字节子页面中的每个sub-page。guest-physical addresses的位11:7标识子页面。

   对于每个具有sub-page写许可权的guest-physical addresses,都有一个64位sub-page许可权向量(SPP向量)。 4 KB页面上的所有地址都使用相同的SPP向量。如果地址的sub-page号(地址的位11:7)为S,则仅当sub-page许可的位2S设置为1时,才允许写入地址。(SPP中奇数位的位)向量不使用,并且必须为零。)

   每页的SPP向量位于内存中。对于对具有sub-page写许可权的guest-physical addresses的写操作,处理器使用以下过程找到该地址的SPP向量:

   1.SPPTP(sub-page权限表指针)VM执行控制字段包含4 KB根SPP表(SSPL4表)的物理地址。访客物理地址的位47:39标识该表中的一个64位条目,称为SPPL4E。

   2.一个4 KB SPPL3表位于所选SPPL4E中的物理地址。guest-physical addresses的位38:30标识该表中的64位条目,称为SPPL3E。

   3.一个4 KB SPPL2表位于所选SPPL3E中的物理地址。guest-physical addresses的位29:21标识该表中的64位条目,称为SPPL2E。

   4.一个4 KB SPP向量表(SSPL1表)位于所选SPPL2E中的物理地址上。guest-physical addresses的位20:12标识该地址的64位SPP向量。如前所述,sub-page允许向量的位2S确定是否可以写入地址,其中S是地址位11:7的值。

   (用于访问这些表的内存类型在IA32_VMX_BASIC MSR的第53:50位中)

   仅当页面的SPP向量中的每个sub-page的指示位为指定位时,才允许对单个4 KB页面上的多个128字节子页面进行写访问。以下各项适用于访问写入两个4 KB页面的情况:

   • 如果上文描述的不允许写入任一页面,则即使该页面的guest-physical addresses有资格获得sub-page写入权限,访问也可能被禁止。 (此行为是特定于模型的。)

   • 仅在以下情况下才允许访问:
(1)在允许对该页面进行写操作;
(2)两者
  (a)该页面的guest-physical addresses符合子页面写权限;
  (b)页面的子页面向量允许写入(如上所述)。

   每个条目(SPPL4E,SPPL3E或SPPL2E)的位0是该条目的有效位。如果以上过程访问该位为0的条目,则过程停止,逻辑处理器发生SPP未命中。

   在每个条目(SPPL4E,SPPL4E或SPPL2E)中,第11:1位和第63:N位都被保留,其中N是处理器的物理地址宽度。如果以上过程访问了其中有效位为1且其中设置了一些保留位的条目,则过程将停止并且逻辑处理器会导致SPP配置错误。 SPP向量中奇数位置的位也被保留; SPP配置错误也会发生,并且那些位中的任何一个都会在最终SPP向量中设置。

   SPP丢失和SPP配置错误称为与SPP相关的事件,并导致VM退出。

Accessed and Dirty Flags for EPT

   英特尔64体系结构支持普通分页结构条目中的已访问标志和脏标志。一些处理器还支持EPT寻呼结构条目中的相应标志。软件应阅读VMX功能MSR IA32_VMX_EPT_VPID_CAP,以确定处理器是否支持此功能。

   软件可以使用扩展页表指针(EPTP)的位6(VM执行控制字段)启用EPT的已访问标志和脏标志。如果该位为1,则处理器将如下所述设置EPT的访问标志和脏标志。另外,设置该标志会使处理器对访客分页结构条目的访问被视为写操作。

   对于在guest-physical addresses转换期间使用的任何EPT寻呼结构条目,位8是已访问标志。对于映射页面的EPT分页结构项(与引用另一个EPT分页结构相对),位9是脏标志。

   每当处理器使用EPT page structure条目作为guest-physical addresses转换的一部分时,它都会在该条目中设置访问标志(如果尚未设置)。

   每当写入guest-physical addresses时,处理器都会在EPT分页结构条目中设置脏标志(如果尚未设置),该脏标志标识guest-physical addresses的最终物理地址(可以是EPT PTE或7位为1的EPT page structure条目)。

   启用访问权限并启用EPT的脏标志后,处理器对guest page structure条目的访问将视为写操作。因此,这种访问将使处理器在EPT page structure条目中设置脏标志,该标志标识来guest page structure条目的最终物理地址。

   (这不适用于MOV to CR指令用于PAE分页的PDPTE寄存器的加载;这些 guest PDPTE的加载被视为读取,并且不会导致处理器在任何EPT中设置脏标志。page structure条目。)

   这些标志是“粘性”的,这意味着一旦置位,处理器就不会清除它们。只有软件可以清除它们。

   处理器可以在TLB和页面结构缓存中缓存来自EPT页面结构条目的信息。 这个事实意味着,如果软件将访问标志或脏标志从1更改为0,则处理器可能不会使用受影响的guest-physical addresses在后续访问中将内存中的相应位设置为1。

Page-Modification Logging

   启用访问权限并启用EPT的脏标志后,软件可以使用称为 page-modification logging.记录的功能来跟踪对guest-physical addresses的写入。

   软件可以通过设置“启用PML” VM执行控制来启用页面修改日志记录。 当此控件为1时,处理器如下所述将条目添加到页面修改日志中。 页修改日志是位于PML地址VM执行控制字段中物理地址处的4 KB内存区域。 页面修改日志由512个64位条目组成。 PML索引VM执行控制字段指示要使用的下一个条目。

   在允许guest-physical addresses访问之前,处理器可以确定它首先需要为EPT设置访问标志或脏标志。 发生这种情况时,处理器将检查PML索引。 如果PML索引不在0-511范围内,则将发生页面修改日志已满事件,并且VM退出。 在这种情况下,未设置访问标志或脏标志,并且不会发生触发事件的guest-physical addresses。

   相反,如果PML索引在0-511范围内,则处理器将按照第28.2.5节中的描述更新EPT的访问标志或脏标志。 如果处理器为EPT更新了脏标志(将其从0更改为1),则其操作如下:
   1.将访问的guest-physical addresses写入页面修改日志。 具体而言,将guest-physical addresses写入通过向PML地址加上8倍PML索引而确定的物理地址。 写入的值的位11:0始终为0(因此,写入的guest-physical addresses为4 KB对齐)。

   2.PML索引递减1(这可能导致该值从0过渡到FFFFH)。

   因为处理器随每个日志条目递减PML索引,所以该值可能从0过渡到FFFFH。 到那时,将不会再进行日志记录,因为处理器将确定PML索引不在0-511范围内,并会生成页面修改日志已满事件(请参见上文)。

EPT and Memory Typing

   在使用EPT时逻辑处理器如何确定用于存储器访问的存储器类型使用。 (有关Intel 64架构中的内存类型的详细信息,请参阅《英特尔®64和IA-32架构软件开发人员手册,第3A卷》的第11章,“内存缓存控制”。)第28.2.7.1节介绍了如何确定用于访问的内存类型 到EPT分页结构。 28.2.7.2节解释了如何使用通过EPT转换的guest-physical addresses来确定访问的存储器类型。

Memory Type Used for Accessing EPT Paging Structures

   如何确定用于访问EPT分页结构的内存类型。 确定首先基于控制寄存器CR0中的位30(高速缓存禁用—CD)的值:

   • 如果CR0.CD = 0,则用于任何此类引用的内存类型为EPT分页结构内存类型,该类型在VM执行控制扩展页表指针(EPTP)的位2:0中指定。 字段。 值0表示不可缓存类型(UC),而值6表示回写类型(WB)。 其他值保留。

   • 如果CR0.CD = 1,则用于任何此类引用的内存类型都是不可缓存的(UC)。

   MTRR对用于访问EPT分页结构的内存类型没有影响

Memory Type Used for Translated Guest-Physical Addresses

   使用来guest-physical addresses的内存访问的有效内存类型(使用EPT转换的访问)是用于访问内存的内存类型。有效的存储器类型基于控制寄存器CR0中的第30位(高速缓存禁用-CD)的值;最后一个用于转换guest-physical addresses的EPT分页结构条目(将第7位设置为1的EPT PDE或EPT PTE);和PAT内存类型(请参见下文):

   • PAT存储器类型取决于CR0.PG的值:
   —如果CR0.PG = 0,则PAT存储器类型为WB(写回)。1
   —如果CR0.PG = 1,则PAT存储器类型是第11.12.3节“从PAT中选择存储器类型”中指定的从IA32_PAT MSR中选择的存储器类型。

   • EPT存储器类型在最后一个EPT分页结构条目的位5:3中指定:0 = UC; 1 = WC; 4 = WT; 5 = WP;和6 =白平衡。其他值被保留,并导致EPT配置错误(请参阅第28.2.3节)。

   • 如果CR0.CD = 0,则有效的内存类型取决于最后一个EPT分页结构条目的位6的值:

   — 如果值为0,则有效存储器类型是EPT存储器类型和11.5.2.2节中表11-7中指定的PAT存储器类型的组合,使用EPT存储器类型代替MTRR存储器类型。

   — 如果该值为1,则用于访问的存储器类型为EPT存储器类型。 PAT存储器类型将被忽略。

   •如果CR0.CD = 1,则有效内存类型为UC。

   MTRR对用于访问访客物理地址的内存类型没有影响。

CACHING TRANSLATION INFORMATION

   VMX操作的体系结构的VPID和EPT功能增强了此缓存体系结构。 EPT定义了访客物理地址空间,并定义了到该地址空间(从线性地址空间)到从该地址空间(到物理地址空间)的转换。这两个功能都控制逻辑处理器创建和使用从分页结构缓存的信息的方式。

Information That May Be Cached

   英特尔®64和IA-32体系结构软件开发人员手册,卷3A中的第4.10节“缓存转换信息”确定了逻辑处理器可以缓存的两种与转换有关的信息:转换,即从线性页码到 物理页帧和分页结构缓存,它们将线性页号的高位映射到用于转换与那些高位匹配的线性地址的分页结构项中的信息。

   使用VPID和EPT时,可能会缓存相同类型的信息。 逻辑处理器可以基于其功能来缓存和使用此类信息。 具有不同功能的信息标识如下:
   • 线性映射。有两种:
   — 线性转换。这些中的每一个都是从线性页码到其转换为的物理页帧的映射,以及有关访问权限和内存类型的信息。

   — 线性分页结构缓存条目。这些中的每一个都是从线性地址的上部到分页结构的物理地址的映射,用于转换地址的相应区域。
线性地址空间,以及有关访问权限的信息。例如,线性地址的位47:39将映射到相关页面目录指针表的地址。线性映射不包含来自任何EPT分页结构的信息。

   • guest映射。有两种:
   — guest转换。这些中的每一个都是从guest-physical页号到其转换到的物理页框架的映射,以及有关访问权限和内存类型的信息。

   —guest-physical分页结构缓存条目。这些中的每一个都是从guest-physical addresses的上部到用于转换guest-physical addresses空间的对应区域以及用于访问特权的信息的EPT寻呼结构的物理地址的映射。

   guest-physical addresses映射中有关访问权限和内存类型的信息是从EPT分页结构派生的。

   • 组合映射。有两种:
   — 组合转换。这些中的每一个都是从线性页码到其转换为的物理页帧的映射,以及有关访问权限和内存类型的信息。

   — 合并的分页结构缓存条目。这些中的每一个都是从线性地址的上部到用于转换线性地址空间的相应区域的分页结构的物理地址以及有关访问特权的信息的映射。

   有关访问权限和内存类型的组合映射中的信息是从guest页面结构和EPT页面结构中派生的。

   访客物理映射和组合映射也可能包括SPP向量和有关用于定位SPP向量的数据结构的信息。

Creating and Using Cached Translation Information

以下各项详细说明了上一部分中描述的映射的创建:

   • 以下各项描述了不使用EPT时(包括在VMX非root用户操作之外执行)的映射的创建:
— 可以创建线性映射。它们是从CR3的当前值(直接或间接)引用的分页结构派生的,并与当前VPID和当前PCID关联。

   — 不使用从不存在的分页结构条目(位0为0)或设置保留位的信息中获得的信息来创建线性映射。例如,如果不存在PTE,则不会为其转换将使用该PTE的任何线性页码创建线性映射。

   — 不使用EPT时,不会创建guest-physical addresses映射或组合映射。

   • 以下各项描述了使用EPT时的映射创建:
   — 可以创建guest-physical addresses映射。它们是从当前EPTP的位51:12(直接或间接)引用的EPT分页结构中得出的。这40位包含EPT-PML4表的地址。 (符号EP4TA指的是这40位)。新创建的guest-physical addresses映射与当前的EP4TA相关联。

   — 可以创建组合映射。它们源自当前EP4TA(直接或间接)引用的EPT寻呼结构。如果CR0.PG = 1,则它们也从分页结构派生由CR3的当前值直接或间接引用。它们与当前的VPID,当前的PCID和当前的EP4TA相关联。1如果出现以下情况,则不会创建合并的分页结构缓存条目CR0.PG = 0

   — 没有使用从不存在或配置错误的EPT分页结构条目派生的信息来创建guest-physical addresses映射或组合映射。

   — 没有使用从不存在或设置了保留位的guest分页结构条目派生的信息来创建组合映射。

   — 使用EPT时不会创建线性映射。
   以下各项详细说明了各种映射的用法:
   • 如果未使用EPT(例如,在VMX以外的非root用户操作时),则逻辑处理器可以使用缓存的映射
如下:
   — 对于使用线性地址的访问,它可以使用与当前VPID和当前PCID关联的线性映射。它还可以使用与当前VPID和任何PCID关联的全局TLB条目(线性映射)。

   — 不使用EPT时,不使用guest-physical addresses映射或组合映射。

   • 如果正在使用EPT,则逻辑处理器可以按以下方式使用缓存的映射:
   — 对于使用线性地址的访问,它可以使用与当前VPID,当前PCID和当前EP4TA关联的组合映射。它还可以使用与当前VPID,当前EP4TA和任何PCID关联的全局TLB条目(组合映射)。

   — 对于使用guest-physical addresses的访问,它可以使用与以下内容关联的guest-physical addresses映射:当前的EP4TA。

   — 使用EPT时不使用线性映射

Invalidating Cached Translation Information

   分页结构(包括EPT分页结构)的软件修改可能会导致这些结构与逻辑处理器缓存的映射之间出现不一致。 某些操作会使逻辑处理器缓存的信息无效,并可用于消除此类不一致。

Operations that Invalidate Cached Mappings

   如下所示,以下操作会使缓存的映射无效:
   • 在架构上使TLB或分页结构缓存中的条目无效的操作(独立于VMX操作)(例如INVLPG和INVPCID指令)会使线性映射和组合映射无效。它们仅对于当前VPID(但对于组合VPID)是必需的。 映射,所有EP4TA)。 即使使用EPT,当前VPID的线性映射也会无效。 即使未使用EPT,当前VPID的组合映射也会无效。

   • EPT violation会使用于转换导致EPT violation的guest-physical addresses的任何guest-physical addresses映射(与当前EP4TA关联)无效。 如果该guest-physical addresses是线性地址的转换,则EPT violation还将使该线性地址与当前PCID,当前VPID和当前EP4TA关联的所有组合映射都无效。

   • 如果“启用VPID” VM执行控制为0,则VM条目和VM退出使与VPID 0000H关联的线性映射和组合映射无效(对于所有PCID)。 VPID 0000H的组合映射对于所有EP4TA都是无效的。

   • 执行INVVPID指令会使线性映射和组合映射无效。 无效基于指令操作数,称为INVVPID类型和INVVPID描述符。 当前定义了四种INVVPID类型:
— 单个地址。如果INVVPID类型为0,则逻辑处理器会使与INVVPID描述符中指定的VPID关联的线性映射和组合映射无效,并将其用于转换INVVPID描述符中指定的线性地址。该VPID和线性地址的线性映射和组合映射对于所有PCID都无效,对于组合映射,所有EP4TA都无效。 (该指令可能还会使与其他VPID和其他线性地址相关的映射无效。)

   — 单上下文。如果INVVPID类型为1,则逻辑处理器会使与INVVPID描述符中指定的VPID关联的所有线性映射和组合映射无效。该VPID的线性映射和组合映射对于所有PCID均无效,对于所有组合的映射,所有EP4TA均无效。 (该指令可能还会使与其他VPID关联的映射无效。)

   — 全上下文。如果INVVPID类型为2,则逻辑处理器会使与除VPID 0000H之外的所有VPID和所有PCID关联的线性映射和组合映射无效。 (该指令还可能使VPID 0000H的线性映射无效。)对于所有EP4TA,组合映射均无效。

   — 单个上下文保留全局变量。如果INVVPID类型为3,则逻辑处理器会使与INVVPID描述符中指定的VPID关联的线性映射和组合映射无效。线性的
VPID的映射和组合映射对于所有PCID都无效,对于组合映射,所有EP4TA都无效。逻辑处理器不需要使用于全局转换的信息无效(尽管可以这样做)。有关全局转换的详细信息。 (该指令可能还会使与其他VPID关联的映射无效。)

   有关INVVPID指令的详细信息。

   • 执行INVEPT指令会使guest-physical addresses映射和组合映射无效。无效基于指令操作数,称为INVEPT类型和INVEPT描述符。当前定义了两种INVEPT类型:

   — 单上下文。如果INVEPT类型为1,则逻辑处理器会使所有guest-physical addresses映射无效,并且与INVEPT描述符中指定的EP4TA关联的组合映射。的组合映射对于所有VPID和所有PCID,EP4TA都将失效。 (该指令可能会使关联的映射无效与其他EP4TA。)

   — 全上下文。如果INVEPT类型为2,则逻辑处理器会使与所有EP4TA关联的guest-physical addresses映射和组合映射(对于组合映射,对于所有VPID和PCID)无效。有关INVEPT指令的详细信息。

   • 加电或重置会使所有线性映射,guest-physical addresses映射和组合映射无效。

Operations that Need Not Invalidate Cached Mappings

   以下各项详细说明了使某些高速缓存的映射无效所需的操作情况:
   • 在架构上使TLB或分页结构缓存中的条目无效的操作独立于VMX操作,不需要使任何guest-physical addresses映射无效。

   • 不需要INVVPID指令即可使任何guest-physical addresses映射无效。

   • 不需要INVEPT指令可使任何线性映射无效。

   • 不需要VMX转换即可使任何guest-physical addresses映射无效。 如果“启用VPID” VM执行控件为1,则不需要VMX转换即可使任何线性映射或组合映射无效。

   • 不需要VMXOFF和VMXON指令即可使任何线性映射,guest-physical addresses映射或组合映射无效。

   逻辑处理器可以随时使任何缓存的映射无效。 出于这个原因,尽管实际上不需要进行上述操作,但可能会使指示的映射无效。

Guidelines for Use of the INVVPID Instruction

   VMM软件使用INVVPID指令的需要取决于该软件如何虚拟化内存(例如,请参见英特尔®64和IA-32体系结构第32.3节“内存虚拟化”)。

   如果未使用EPT,则VMM可能正在虚拟化Guest分页结构。 这样的VMM可以配置VMCS,使得使TLB和寻呼结构高速缓存的条目无效的全部或一些操作(例如,INVLPG指令)导致VM退出。 如果VMM软件正在模拟这些操作,则可能有必要使用INVVPID指令来确保逻辑处理器的TLB和分页结构缓存适当地无效。

   软件何时应使用INVVPID指令的要求取决于用于页表虚拟化的特定算法。 以下各项为软件开发人员提供指导:
    • INVLPG指令的仿真可能要求执行INVVPID指令,如下所示:
   — INVVPID类型为个人地址(0)。
   — INVVPID描述符中的VPID是分配给正在仿真其执行的虚拟处理器的VPID。
   — INVVPID描述符中的线性地址是被仿真的INVLPG指令的操作数的线性地址。

   • 一些指令使TLB和分页结构缓存中的所有条目无效(全局转换除外)。一个示例是MOV to CR3指令。此类指令的仿真可能需要执行以下INVVPID指令:
   — INVVPID类型为single-context-retaining-globals(3)。
   — INVVPID描述符中的VPID是分配给正在仿真其执行的虚拟处理器的VPID。

   • 某些指令会使TLB和分页结构缓存中的所有条目无效-包括全局转换。如果位4的值(页面全局启用-PGE)的值正在更改,则MOV to CR4指令就是一个示例。仿真这样的指令可能需要执行INVVPID指令,如下所示:
   — INVVPID类型为单上下文(1)。
   — INVVPID描述符中的VPID是分配给正在仿真其执行的虚拟处理器的VPID。

   如果未使用EPT,则逻辑处理器会将其创建的所有映射与当前VPID关联,并且它将使用此类映射来转换线性地址。因此,对于使用不同页表的不同非EPT guest,VMM不应使用相同的VPID。这样做可能会导致一位guest使用与另一个gurest有关的转换。

   如果正在使用EPT,则上面未列举的说明可能未配置为导致VM退出,并且VMM可能未在模拟它们。在这种情况下,guest软件执行指令会适当地使TLB和分页结构缓存中的所需条目无效;不需要执行INVVPID指令。

   如果正在使用EPT,则逻辑处理器会将其创建的所有映射与当前EPTP的位51:12的值相关联。如果VMM为不同的guest使用不同的EPTP值,则可以为这些guest使用相同的VPID。这样做不会导致一个guest使用与另一个guest有关的转换。

   以下准则更普遍地适用并且即使在使用EPT时也适用:

   • 如果软件没有适当地使可能从分页结构中缓存的信息无效,则对APIC访问页面的访问可能不会导致APIC访问VM退出。如果一次逻辑处理器上的当前VPID是非零值X,则建议软件在VM之前使用具有“单上下文” INVVPID类型和INVVPID描述符中的VPID X的INVVPID指令建立VPID X的同一逻辑处理器上的条目,并且(a)“虚拟化APIC访问” VM执行控制已从0更改为1;或(b)APIC访问地址的值已更改。

   •在执行VMXON指令之后或在执行VMXOFF指令之前,软件可以立即使用INVVPID指令和“全上下文” INVVPID类型。两种方法都可以防止在单独使用VMX操作之间保留从分页结构缓存的信息的潜在不良后果。

Guidelines for Use of the INVEPT Instruction

   下列各项提供使用INVEPT指令使从EPT分页结构缓存的信息无效的准则。

   •在对EPT分页结构项进行以下任何更改之后,软件应使用“单上下文” INVEPT类型的INVEPT指令(INVEPT描述符应包含一个EPTP值,该值直接或间接引用已修改的EPT分页结构体):

   —将任何特权位2:0从1更改为0.1

   —在位51:12中更改物理地址。

   —如果已访问,则清除位8(已访问标志),并启用EPT的脏标志。

   —对于EPT PDPTE或EPT PDE,更改位7(确定条目是否映射页面)。

   — 对于用于转换guest-physical addresses的最后一个EPT分页结构条目(将第7位设置为1的EPT PDPTE,将第7位设置为1的EPT PDE或EPT PTE),更改5:3位或第6位。(这些位确定使用该EPT分页结构条目的有效访问存储器类型;)

   —对于用于转换guest-physical addresses的最后一个EPT分页结构条目(将第7位设置为1的EPT PDPTE,将第7位设置为1的EPT PDE或EPT PTE),清除第9位(脏位)标记)(如果已访问),则将启用EPT的脏标记。

guest-physical addresses• 如果具有较早的逻辑处理器,则软件应在EPTP值为X的VM条目之前使用具有“单上下文” INVEPT类型的INVEPT指令,以便X [6] = 1(启用了EPT的访问标志和脏标志)。在VMX非根操作中,其EPTP值为Y,使得Y [6] = 0(未启用EPT的已访问标志和脏标志)且Y [51:12] = X [51:12]。

guest-physical addresses• 在修改当前的EPT分页结构条目以将2:0的任何特权位从0更改为1.2之后,软件可以使用INVEPT指令,否则可能会导致违反EPT的情况发生。由于EPT冲突会使导致EPT冲突的访问使用的任何映射无效,因此即使再次执行原始访问,即使未执行INVEPT指令,也不会再次发生EPT冲突。

guest-physical addresses• 因为逻辑处理器不会缓存从不存在或配置错误的EPT分页结构条目派生的任何信息,所以在修改EPT之后不必执行INVEPT分页结构条目不存在或配置错误。

guest-physical addresses• 如果软件没有正确地使可能从EPT分页结构缓存的信息无效,则对APIC-access页的访问可能不会导致APIC-access VM退出。如果EPTP X一次在逻辑处理器上使用了EPT,则建议软件在同一逻辑上的VM条目之前,使用具有“单上下文” INVEPT类型和INVEPT描述符中的EPTP X的INVEPT指令启用EPTP X的EPT的处理器,以及(a)将“虚拟化APIC访问” VM执行控制从0更改为1;或(b)APIC访问地址的值已更改。

guest-physical addresses• 在执行VMXON指令之后或在执行VMXOFF指令之前,软件可以立即使用INVEPT指令和“全上下文” INVEPT类型。两种方法都可以防止在VMX操作的单独使用之间从EPT分页结构缓存的信息的潜在不良保留。

guest-physical addresses在一个包含多个逻辑处理器的系统中,软件必须考虑以下事实:来自EPT寻呼结构条目的信息可能会缓存在除修改该条目的逻辑处理器之外的逻辑处理器上。将更改传播到分页结构条目的过程通常称为“ TLB shootdown”。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luke_Lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值