首页
社区
课程
招聘
[翻译]Intel手册-VT部分 第29章 VMX SUPPORT FOR ADDRESS TRANSLATION
发表于: 2024-4-22 00:28 3013

[翻译]Intel手册-VT部分 第29章 VMX SUPPORT FOR ADDRESS TRANSLATION

2024-4-22 00:28
3013

目录

29 VMX 地址转换支持

VMX 操作的架构包括两个支持地址转换的功能:虚拟处理器标识符 (VPID) 和扩展页表机制 (EPT)。 VPID 是一种管理线性地址转换的机制。 EPT 定义了一个地址转换层,用于增强线性地址的转换。

第 29.1 节详细介绍了 VPID 的架构。第 29.3 节提供了 EPT 的详细信息。第 29.4 节解释了逻辑处理器如何缓存来自分页结构的信息、如何使用该缓存信息以及软件如何管理该缓存信息。

29.1 虚拟处理器标识符(VPIDS)

VMX 操作的原始架构需要 VMX 转换来刷新 TLB 和分页结构缓存。这确保了为旧线性地址空间缓存的translation在转换后不会被使用。

虚拟处理器标识符 (VPID) 向 VMX 操作引入了一种功能,逻辑处理器可以通过该功能缓存多个线性地址空间的信息。当使用 VPID 时,VMX 转换可能会保留缓存的信息,并且逻辑处理器会切换到不同的线性地址空间。

第 29.4 节详细介绍了逻辑处理器管理为多个地址空间缓存的信息的机制。逻辑处理器可以使用 16 位 VPID 来标记某些缓存信息。本节指定如何在任何时间点确定当前 VPID:

  • 以下情况当前VPID为0000H:
    • 外部 VMX 操作。 (这包括在 SMI 和 SMM 与 VMX 操作的默认处理下在系统管理模式下的操作;请参阅第 32.14 节。)
    • 在 VMX root 操作中。
    • 在 VMX 非 root 操作中,当“启用 VPID”VM 执行控制为 0 时
  • 如果逻辑处理器处于VMX非root operation并且“启用VPID”VM执行控制为1,则当前VPID是VMCS中的VPID VM执行控制字段的值。 (VM entries确保该值绝不是 0000H;请参阅第 27.2.1.1 节。)

VPID 和 PCID(请参阅第 4.10.1 节)可以同时使用。完成此操作后,处理器将缓存的信息与 VPID 和 PCID 相关联。仅当当前 VPID 和 PCID 均与与缓存信息相关联的信息匹配时,才使用此类信息。

29.2 管理程序管理的线性地址转换(HLAT)

虚拟机管理程序管理的线性地址转换 ( HLAT ) 是一项改变 VMX non-root operation中线性地址转换方式的功能。translation不是使用普通的分页,而是使用一种称为 HLAT 分页的修改过程。

仅当“启用 HLAT”VM 执行控制为 1 时才使用 HLAT 分页。HLAT 分页仅用于分页模式 4 级分页和 5 级分页。由于HLAT寻呼是普通寻呼的修改,因此该功能的详细信息在4.5节中给出,其中描述了4级寻呼和5级寻呼的操作。

29.3 扩展页表机制(EPT)

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

  • 第 29.3.1 节给出了 EPT 的概述。
  • 第 29.3.2 节描述了基于 EPT 的地址转换的操作。
  • 第29.3.3节讨论了可能由EPT引起的VM退出。
  • 第 29.3.7 节描述了 EPT 和记忆打字之间的交互。

29.3.1 EPT 概述

当“启用 EPT”VM 执行控制为 1.1 时使用 EPT。它转换 VMX non-root operation中使用的客户物理地址以及事件注入的 VM entries使用的地址。

从客户物理地址到物理地址的转换由一组EPT分页结构决定。 EPT 分页结构与处理器处于 IA-32e 模式时用于转换线性地址的结构类似。第 29.3.2 节给出了 EPT 分页结构的详细信息。

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

当“启用 EPT”VM 执行控制为 1 时,客户物理地址的标识取决于 CR0.PG 的值:

  • 如果 CR0.PG = 0,则每个线性地址被视为客户物理地址
  • 如果 CR0.PG = 1,则客户物理地址是从控制寄存器 CR3 和客户分页结构的内容派生的地址。 (这包括 PDPTE 的值,逻辑处理器将其存储在内部非架构寄存器中。)后者包括(在页表条目和其他分页结构条目中,其中第 7 位 - PS - 为 1)地址客户分页结构将线性地址转换为该线性地址。

如果 CR0.PG = 1,则线性地址到物理地址的转换需要使用 EPT 对客户物理地址进行多次转换。例如,假设 CR4.PAE = CR4.PSE = 0。32 位线性地址的转换操作如下:

  • 线性地址的位 31:22 选择位于 CR3 中的客户物理地址的客户页面目录中的条目。guest 页目录项 (PDE) 的guest 物理地址通过 EPT 进行转换,以确定guest PDE 的物理地址。
  • 线性地址的位 21:12 选择位于客户 PDE 中的客户物理地址的客户页表中的条目。客户页表项 (PTE) 的客户物理地址通过 EPT 进行转换,以确定客户 PTE 的物理地址。
  • 线性地址的位 11:0 是位于客户机 PTE 中的客户机物理地址处的页帧中的偏移量。由该偏移量确定的客户物理地址通过EPT进行转换,以确定原始线性地址转换到的物理地址。

除了将客户物理地址转换为物理地址之外,EPT 还指定软件在访问该地址时所允许的权限。尝试不允许的访问称为 EPT 违规并导致 VM Exits。参见第 29.3.3 节。

仅当这些地址用于访问内存时,处理器才使用 EPT 来转换客户物理地址。这一原则意味着以下内容:

  • MOV to CR3 指令向 CR3 加载客户物理地址。该地址是否通过 EPT 转换取决于是否使用 PAE 分页。
    • 如果未使用 PAE 分页,则指令不会使用该地址来访问内存,也不会导致其通过 EPT 进行转换。 (如果CR0.PG = 1,则下次使用线性地址访问内存时,将通过EPT转换地址。)
    • 如果使用 PAE 分页,该指令会从该地址加载四 (4) 个页目录指针表条目 (PDPTE),并且确实会导致通过 EPT 转换该地址。
  • 4.4.1 节标识了 MOV 到 CR0 和 MOV 到 CR4 的执行,这些执行从 CR3 中的客户物理地址加载 PDPTE。此类执行会导致该地址通过 EPT 进行转换。
  • PDPTE 包含guest 物理地址。加载 PDPTE(见上文)的指令不使用这些地址来访问内存,并且不会导致它们通过 EPT 进行转换。 PDPTE 中的地址将在下次内存访问时使用使用该 PDPTE 的线性地址通过 EPT 进行转换。

29.3.2 EPT translation机制

EPT 转换机制仅使用每个客户物理地址的第 47:0 位。1 它使用的页遍历长度为 4,这意味着最多访问 4 个 EPT 分页结构条目来转换客户物理地址。

这 48 位由逻辑处理器划分以遍历 EPT 分页结构:

  • 4 KB 自然对齐的 EPT PML4 表位于扩展页表指针(EPTP)的位 51:12 中指定的物理地址,这是一个 VM 执行控制字段(参见第 25.6.11 节中的表 25-9) )。 EPT PML4 表包含 512 个 64 位条目 (EPT PML4E)。使用定义如下的物理地址来选择 EPT PML4E:

    • 位 63:52 均为 0。

    • 位 51:12 来自 EPTP。

    • 位 11:3 是客户物理地址的位 47:39

    • 位 2:0 均为 0。

      由于 EPT PML4E 是使用客户物理地址的第 47:39 位来标识的,因此它控制对客户物理地址空间的 512 GB 区域的访问。表 29-1 给出了 EPT PML4E 的格式。

  • 4 KB 自然对齐的 EPT 页目录指针表位于 EPT PML4E 的位 51:12 中指定的物理地址。 EPT页目录指针表包括512个64位条目(EPT PDPTE)。使用定义如下的物理地址来选择 EPT PDPTE:

    • 位 63:52 均为 0。
    • 位 51:12 来自 EPT PML4E。
    • 位 11:3 是客户物理地址的位 38:30。
    • 位 2:0 均为 0。

由于 EPT PDPTE 使用guest 物理地址的位 47:30 进行标识,因此它控制对guest 物理地址空间的 1 GB 区域的访问。 EPT PDPTE 的使用取决于该条目中第 7 位的值:

  • 如果 EPT PDPTE 的位 7 为 1,则 EPT PDPTE 映射 1 GB 页。最终物理地址计算如下:
    • 位 63:52 均为 0
    • 位 51:30 来自 EPT PDPTE
  1. 支持 Intel 64 架构的处理器不支持超过 48 个物理地址位。因此,没有这样的处理器可以产生超过 48 位的客户物理地址。尝试使用此类地址会导致页面错误。尝试使用此类地址加载 CR3 会导致一般保护故障。如果正在使用 PAE 寻呼,则尝试加载 CR3(该 CR3 会加载具有此类地址的 PDPTE)会导致一般保护故障。
  2. 未来的处理器可能包括对其他 EPT 页行走长度的支持。软件应读取 VMX 功能 MSR IA32_VMX-_EPT_VPID_CAP(请参阅附录 A.10)以确定支持的 EPT 页行走长度。
  3. 并非所有处理器都允许将 EPT PDPTE 的位 7 设置为 1。软件应读取 VMX 功能 MSR IA32_VMX_EPT_VPID_CAP(请参阅附录 A.10)以确定是否允许这样做。

图片描述

笔记:

  1. N 是处理器支持的物理地址宽度。软件可以通过在 EAX 中执行 CPUID 和 80000008H 来确定处理器的物理地址宽度。物理地址宽度在 EAX 的位 7:0 中返回。

    • 位 29:0 来自原始客户物理地址。

    表 29-2 给出了映射 1 GB 页的 EPT PDPTE 格式。

  • 如果 EPT PDPTE 的位 7 为 0,则 4 KB 自然对齐的 EPT 页目录位于 EPT PDPTE 的位 51:12 中指定的物理地址。表 29-3 给出了引用 EPT 页目录的 EPT PDPTE 格式。

图片描述

笔记:

  1. N 是逻辑处理器支持的物理地址宽度。

图片描述

笔记:

  1. N 是逻辑处理器支持的物理地址宽度

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

    • 位 63:52 均为 0。
    • 位 51:12 来自 EPT PDPTE。
    • 位 11:3 是客户物理地址的位 29:21。
    • 位 2:0 均为 0。

由于 EPT PDE 是使用客户物理地址的第 47:21 位来标识的,因此它控制对客户物理地址空间的 2 MB 区域的访问。 EPT PDE 的使用取决于该条目中第 7 位的值:

  • 如果 EPT PDE 的位 7 为 1,则 EPT PDE 映射 2 MB 页。最终物理地址计算如下:

    • 位 63:52 均为 0。
    • 位 51:21 来自 EPT PDE
    • 位 20:0 来自原始客户物理地址。

    表 29-4 给出了映射 2 MB 页的 EPT PDE 格式。

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

    EPT 页表包含 512 个 64 位条目 (PTE)。使用如下定义的物理地址来选择 EPT PTE:

    • 位 63:52 均为 0。

    图片描述

    笔记:

    1. N 是逻辑处理器支持的物理地址宽度。
      • 位 51:12 来自 EPT PDE。
      • 位 11:3 是客户物理地址的位 20:12。
      • 位 2:0 均为 0。
  • 由于 EPT PTE 是使用客户物理地址的位 47:12 来标识的,因此每个 EPT PTE 映射一个 4 KB 页面。最终物理地址计算如下:

    • 位 63:52 均为 0。

    • 位 51:12 来自 EPT PTE。

    • 位 11:0 来自原始客户物理地址。

      EPT PTE 的格式在表 29-6 中给出。

如果位 2:0 中的任何一个为 1,则存在 EPT 分页结构条目;否则,该条目不存在。处理器忽略位 62:3,并且使用该条目既不引用另一个 EPT 分页结构条目也不产生物理地址。使用客户物理地址的引用,其转换遇到不存在的 EPT 分页结构,会导致 EPT 违规(请参阅第 29.3.3.2 节)。 (如果“EPT-violation #VE”VM 执行控制为 1,则仅当位 63 为 0 时,EPT 违规才可转换为虚拟化异常;请参阅第 26.5.7.1 节。如果“EPT-violation #VE”VM-执行控制为0,该位被忽略。)

图片描述

笔记:

  1. N 是逻辑处理器支持的物理地址宽度。

上面的讨论描述了 EPT 分页结构如何相互引用以及逻辑处理器在转换客户物理地址时如何遍历这些结构。它没有涵盖translation过程的所有细节。其他详细信息如下:

  • 转换过程可能导致 VM Exits的情况(有时在过程完成之前)在第 29.3.3 节中描述。
  • EPT translation机制和记忆打字之间的相互作用在第 29.3.7 节中描述。

图 29-1 总结了 EPTP 和 EPT 分页结构条目的格式。对于EPT分页结构条目,它分别标识映射页面的条目的格式、引用其他EPT分页结构的条目的格式以及因为不存在而两者都不做的条目的格式;位 2:0 和位 7 被突出显示,因为它们决定如何使用分页结构条目。 (图 29-1 没有理解这样一个事实:如果“EPT 的基于模式的执行控制”VM 执行控制为 1,则如果位 2:0 或位 10 中的任何一个为 1,则存在一个条目。)

29.3.3 EPT 引起的 VM Exits

使用guest 物理地址的访问可能会因 EPT 配置错误、EPT 违规和页面修改日志已满事件而导致 VM Exits。当在转换客户物理地址的过程中,逻辑处理器遇到包含不支持的值的EPT分页结构条目时,就会发生EPT错误配置(请参见第29.3.3.1节)。当没有 EPT 错误配置但 EPT 分页结构条目不允许使用guest 物理地址进行访问时,就会发生 EPT 违规(请参阅第 29.3.3.2 节)。当逻辑处理器确定需要创建页面修改日志条目并且当前日志已满时,就会发生页面修改日志已满事件(请参阅第 29.3.6 节)。

这些事件仅由于尝试使用客户物理地址访问内存而发生。使用 MOV to CR3 指令加载带有客户物理地址的 CR3 既不会导致 EPT 配置,也不会导致 EPT 违规,直到使用该地址访问分页结构为止。

如果“EPT-violation #VE”VM 执行控制为 1,则某些 EPT 违规可能会导致虚拟化异常,而不是 VM Exits。参见第 26.5.7.1 节。

29.3.3.1 EPT 错误配置

如果guest 物理地址的转换遇到满足以下任一条件的 EPT 分页结构条目,则会发生 EPT 错误配置:

  • 该条目的位 0 已清除(表示不允许读取数据)并且以下任意一项保持:

    • 位 1 被设置(表示允许数据写入)。

    • 处理器不支持只执行translation并且以下任一情况成立:

      • 位 2 被设置(表示允许指令读取)。

      • “EPT 的基于模式的执行控制”VM 执行控制为 1,并且设置了位 10(表示允许从用户模式线性地址获取指令)。

        软件应读取 VMX 功能 MSR IA32_VMX_EPT_VPID_CAP 以确定是否支持仅执行转换(请参阅附录 A.10)。

    • “EPT分页写入控制”VM执行控制为1,该条目映射一页,并且设置位58(表示允许分页写入)。

  • 该条目存在(参见第 29.3.2 节)并且包含以下内容:

图片描述

笔记:

  1. N 是逻辑处理器支持的物理地址宽度。
    • 设置保留位。这包括对超出逻辑处理器物理地址宽度的 51:12 范围内的位进行设置。1 有关在哪些 EPT 分页结构条目中保留哪些位的详细信息,请参见第 29.3.2 节。
    • 该条目是用于转换guest 物理地址的最后一个条目(位 7 设置为 1 的 EPT PDE 或 EPT PTE),位 5:3(EPT 内存类型)的值为 2、3 或 7(这些值被保留)。

当 EPT 分页结构条目配置了为未来功能保留的设置时,会导致 EPT 错误配置。软件开发人员应该意识到,将来可能会使用此类设置,并且导致一个处理器上的 EPT 错误配置的 EPT 分页结构条目将来可能不会这样做。

29.3.3.2 EPT 违规

在使用其转换不会导致 EPT 错误配置的guest 物理地址进行访问期间,可能会发生 EPT 违规。有下列情形之一的,视为 EPT 违规:

  • 客户物理地址的转换遇到不存在的 EPT 分页结构条目(参见第 29.3.2 节)。
  • 该访问是数据读取,并且对于要读取的任何字节,在用于转换该字节的客户物理地址的任何 EPT 分页结构条目中,位 0(读访问)被清除。逻辑处理器对客户分页结构进行的读取以转换线性地址被认为是数据读取。

图片描述

笔记:

  1. M 是 MAXPHYADDR 的缩写
  2. 主管影子堆栈控制。
  3. 有关 EPTP 的详细信息,请参见第 25.6.11 节。
  4. 对用户模式线性地址执行访问。如果“EPT 的基于模式的执行控制”VM 执行控制为 0,则忽略该位。
  5. 执行访问。如果“EPT 的基于模式的执行控制”VM 执行控制为 1,则该位控制对管理程序模式线性地址的执行访问。
  6. 如果“EPT 的基于模式的执行控制”VM 执行控制为 1,则如果位 2:0 或位 10 中的任何一个为 1,则存在 EPT 分页结构条目。该表不理解该事实
  7. 抑制#VE。如果“EPT-violation #VE”VM 执行控制为 0,则忽略该位
  8. 主管影子堆栈页面。如果 EPTP 的位 7 为 0,则忽略该位。
  9. 分页写入访问。如果“EPT分页写入控制”VM执行控制为0,则忽略该位
  10. 验证guest 寻呼。如果“guest 分页验证”VM 执行控制为 0,则忽略该位。
  11. 子页面写权限。如果“EPT的子页写权限”VM执行控制为0,则忽略该位。
  • 该访问是数据写入,并且对于要写入的任何字节,在用于转换该字节的客户物理地址的任何EPT分页结构条目中,位1(写访问)被清除。逻辑处理器向guest 分页结构写入以更新已访问标志和脏标志被视为数据写入。

    如果 EPT 指针 (EPTP) 的第 6 位为 1(启用 EPT 的已访问和脏标志),则处理器对客户分页结构条目的访问将被视为与 EPT 违规有关的写入。因此,如果用于转换guest 分页结构条目的guest 物理地址的任何 EPT 分页结构条目中的位 1 被清除,则尝试使用该条目来转换线性地址会导致 EPT 违规。

    (这不适用于 PAE 分页的 MOV 到 CR 指令对 PDPTE 寄存器的加载;请参阅第 4.4.1 节。客户 PDPTE 的这些加载被视为读取,并且不会因客户物理地址未被读取而导致 EPT 违规。可写。)

    处理器写入guest 分页结构以更新已访问标志和脏标志称为分页写入。 (当启用 EPT 的访问标志和脏标志时,对guest 分页结构的所有处理器访问都被视为分页写入。)如果“EPT 分页写入控制”VM 执行控制为 1,则清除 EPT 分页结构中的写入访问位如果映射页面的条目中的位 58(分页写访问)为 1,则该条目不会阻止分页写入。(引用其他 EPT 分页结构的 EPT 分页结构条目不使用位 58,并且它们仍然是这样的情况)必须设置写访问位以允许分页写入。)

    如果“EPT 的子页写入权限”VM 执行控制为 1,则在某些情况下不会执行会导致 EPT 违规(如上所述)的guest 物理地址的数据写入。如果使用 4 KB 页面映射客户物理地址,并且用于映射该页面的 EPT PTE 的位 61(子页面写入权限)为 1,则可以允许写入某些 128 字节子页面。详细信息请参见第 29.3.4 节。

  • 该访问是指令提取,并且 EPT 分页结构防止对正在提取的任何字节进行执行访问。是否发生这种情况取决于“EPT的基于模式的执行控制”VM执行控制的设置:

    • 如果控制为 0,则在用于转换字节的客户物理地址的任何 EPT 分页结构条目中清除位 2(执行访问)时,将阻止从字节中获取指令。

    • 如果控制为 1,则在以下任一情况下都会阻止从字节获取指令:

      • 分页将字节的线性地址映射为管理程序模式地址,并且在用于转换字节的客户物理地址的任何 EPT 分页结构条目中,第 2 位(管理程序模式线性地址的执行访问)被清除。

        如果控制线性地址转换的至少一个分页结构条目中的 U/S 标志(位 2)为 0,则分页将线性地址映射为管理员模式地址。

      • 分页将字节的线性地址映射为用户模式地址,并且在用于转换字节的客户物理地址的任何 EPT 分页结构条目中,第 10 位(用户模式线性地址的执行访问)被清除。

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

  • 如果启用了管理程序影子堆栈控制(通过设置 EPTP 的位 7),则该访问是管理程序影子堆栈访问,并且用于转换访问的guest 物理地址的 EPT 分页结构条目不允许管理程序影子堆栈访问。如果满足以下任何条件,则不允许此类访问:

    • 位 0(读访问)在用于转换访问的客户物理地址的任何 EPT 分页结构条目中都是清除的。

    • 位 1(写访问)在任何在客户物理地址转换中引用 EPT 分页结构的 EPT 分页结构条目中都是清除的。 (清除映射客户物理地址页面的 EPT 分页结构条目中的位 1 不会禁止影子堆栈读取和写入。)

    • 位 60(管理程序影子堆栈访问)在映射客户物理地址页面的 EPT 分页结构条目中是明确的。

      EPT 分页结构条目中的主管影子堆栈控制和主管影子堆栈访问位不会影响其他访问(包括用户影子堆栈访问)。

  • 如果“guest 分页验证”和“EPT分页写入控制”VM执行控制都为1,则对与线性地址转换相关的某些访问执行guest 分页验证。

    具体来说,guest 分页验证可以应用于使用guest 物理地址对映射线性地址的页面的guest 分页结构条目的访问(参见第4章“分页”)。如果在映射该客户物理地址的页面的 EPT 分页结构条目中设置了位 57(验证客户分页),则它适用。

    当发生guest 分页验证时,如果 EPT 分页结构条目中的第 58 位(分页写访问)被清除,该条目用于映射任何guest 分页结构条目的guest 物理地址的页面,则存在 EPT 违规。在原始线性地址的转换过程中使用。

    有关此类 EPT 违规相对于由于对正在转换的线性地址的原始引用而可能发生的任何页面错误的优先级的详细信息,请参阅第 29.3.3.3 节。

29.3.3.3 EPT 错误配置和 EPT 违规的优先级

将线性地址转换为物理地址需要使用 EPT 对客户物理地址进行一次或多次转换(请参见第 29.3.1 节)。本节指定 EPT 引起的 VM Exits相对于彼此以及使用线性地址访问内存时可能遇到的其他事件的相对优先级。

对于对guest 物理地址的访问,确定是否发生 EPT 错误配置或 EPT 违规是基于迭代过程:

  1. 读取 EPT 分页结构条目(最初,这是 EPT PML4 条目):
    • 如果该条目不存在(请参阅第 29.3.2 节),则会发生 EPT 违规。
    • 如果该条目存在但其内容未正确配置(请参阅第 29.3.3.1 节),则会发生 EPT 错误配置。
    • 如果该条目存在并且其内容配置正确,则操作取决于该条目是否引用另一个 EPT 分页结构(无论是位 7 设置为 1 的 EPT PDE 还是 EPT PTE):
      • 如果该条目确实引用了另一个 EPT 分页结构,则访问该结构中的条目;对其他条目执行步骤 1。
      • 否则,该条目用于产生最终物理地址(原始客户物理地址的转换);执行步骤2。
  2. 一旦确定了最终的物理地址,就会评估由 EPT 分页结构条目确定的权限:
    • 如果这些权限不允许访问guest 物理地址(请参阅第 29.3.3.2 节),则会发生 EPT 违规。
    • 如果这些权限允许对客户物理地址的访问,则使用最终物理地址来访问内存。

如果 CR0.PG = 1,则线性地址的转换也是一个迭代过程,处理器首先访问 CR3,3 中的客户物理地址引用的客户分页结构中的条目,然后访问另一个客户分页中的条目由第一个guest 分页结构条目中的guest 物理地址引用的结构,等等。每个guest 物理地址本身使用 EPT 进行转换,并可能导致 EPT 引起的 VM Exits。以下项目详细介绍了在此迭代过程中如何识别页面错误和 EPT 引起的 VM Exits:

  1. 尝试使用guest 物理地址(最初是 CR3 中的地址)访问guest 分页结构条目。
    • 如果访问由于 EPT 配置错误或 EPT 违规(见上文)而失败,则会发生 EPT 引起的 VM Exits。
    • 如果访问不会导致 EPT 引起的 VM Exits,则转换将继续。如果启用了guest 分页验证(请参阅第 29.3.3.2 节),处理器会记录 EPT 分页结构条目是否用于映射guest 物理地址的页面设置位 58(分页写入)。然后,查询guest 分页结构条目的位 0(当前标志):
      • 如果当前标志为 0 或设置了任何保留位,则会发生页错误。
      • 如果当前标志为 1,则未设置保留位,操作取决于条目是否引用另一个guest 分页结构(无论是 PS = 1 的guest PDE 还是guest PTE):
        • 如果该条目确实引用了另一个guest 分页结构,则访问该结构中的条目;对其他条目执行步骤 1。
        • 否则,该条目用于产生最终的客户物理地址(原始线性地址的转换);执行步骤2。
  2. 一旦确定了最终的客户物理地址,就会评估由客户分页结构条目确定的特权:
    • 如果这些特权不允许对线性地址的访问(例如,这是对只读页的写入),则会发生页错误。
    • 如果这些权限允许访问线性地址,则会尝试访问最终客户物理地址处的内存:
      • 如果访问由于 EPT 配置错误或 EPT 违规(见上文)而失败,则会发生 EPT 引起的 VM Exits。此时,使用在上述步骤 1b 中记录的分页写入位进行guest 分页验证(如果启用)(有关guest 分页验证的详细信息,请参阅第 29.3.3.2 节)。
      • 如果访问不会导致 EPT 引起的 VM Exits,则使用最终物理地址(使用 EPT 转换最终客户物理地址)来访问内存。

如果 CR0.PG = 0,则线性地址被视为客户物理地址并使用 EPT 进行转换(见上文)。如果此过程在没有 EPT 违规或 EPT 错误配置的情况下完成,则会生成物理地址并确定 EPT 分页结构条目允许的权限。如果这些权限不允许访问物理地址(请参阅第 29.3.3.2 节),则会发生 EPT 违规。否则,使用物理地址访问内存。

29.3.4 子页面写权限

第 29.3.3.2 节解释了 EPT 如何使用 EPT 违规来强制执行guest 物理地址的访问权限。由于这些访问权限是使用用于转换guest 物理地址的 EPT 分页结构条目确定的,因此它们的粒度仅限于用于映射页面的粒度(1 GB、2 MB 或 4 KByte)。

子页面写入权限功能允许以更精细的粒度控制对客户物理地址的写入访问。子页面写入权限允许以自然对齐的 128 字节子页面的粒度来控制写访问。具体来说,该功能允许写入 4 KB 页面的选定子页面,否则这些子页面将不可写。

将“EPT 的子页写入权限”VM 执行控制设置为 1 即可启用子页写入权限。本节的其余部分介绍了使用此控制设置对处理器操作进行的更改。

第 29.3.4.1 节标识了符合子页写入权限的数据访问。第 29.3.4.2 节解释了处理器如何确定是否允许此类访问。

29.3.4.1 符合子页面写权限的写访问

如果按照第 29.3.3.2 节:在用于转换guest 物理地址的任何 EPT 分页结构条目中清除位 1(写访问),则guest 物理地址有资格获得子页面写入权限。由于其他原因(例如,转换遇到不存在的 EPT 分页结构条目)而不允许写入的guest 物理地址不符合子页写入权限。

此外,仅当使用 4 KB 页面进行映射且用于映射该页面的 EPT PTE 的第 61 位(子页面写入权限)为 1 时,客户物理地址才有资格获得子页面写入权限。(与较大页面映射的guest 物理地址不符合子页面写入权限。)

对于某些内存访问,处理器会忽略用于映射 4 KB 页面的 EPT PTE 中的位 61,并且不会对访问应用子页面写入权限。 (在这种情况下,当第 29.3.3.2 节中给出的条件指示时,访问会导致 EPT 违规。)子页面写入权限永远不会应用于以下访问:

  • 在事务区域内执行的写访问。
  • 飞地对其 ELRANGE 内的地址进行写访问。 (子页面写入权限可能适用于飞地对其 ELRANGE 之外的地址的写入访问。)
  • 通过 Intel SGX 指令对 enclave 页缓存 (EPC) 进行写访问。
  • 对guest 分页结构的写访问以更新已访问或脏标志
  • 当启用 EPT 的访问和脏标志时,处理器对guest 分页结构条目进行访问(此类访问被视为与 EPT 违规有关的写入)。

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

  • 跨两个 4 KB 页的写访问。在这种情况下,子页面权限可以不应用于任何页面或仅应用于其中一个页面。 (除非允许对两个页面进行写入,否则不会对任一页面进行写入。)
  • 通过执行多个写访问的指令进行写访问(子页写权限主要针对 AND、MOV、OR、TEST、XCHG 和 XOR 等基本指令)。

如果客户物理地址符合子页面写入权限,则处理器使用第 29.3.4.2 节中描述的过程确定是否允许写入该地址。

如果guest 物理地址有资格获得子页面写入权限,并且该地址转换为

APIC 访问页(参见第 30.4 节),处理器可能会将对该地址的写访问视为“虚拟化 APIC 访问”VM 执行控制为 0。因此,建议软件不要配置任何guest 访问。物理地址,转换为 APIC 访问页面上的地址,以获得子页面写入权限。

29.3.4.2 确定访问的子页写权限

子页写入权限单独控制对 4 KB 页的 32 128 字节子页中每一个子页的写入访问。客户物理地址的位 11:7 标识子页面。

对于每个符合子页面写入权限的客户物理地址,都有一个64位的子页面权限向量(SPP向量)。 4 KB 页上的所有地址都使用相同的 SPP 向量。如果地址的子页编号(地址的位 11:7)为 S,当且仅当子页权限的位 2S 设置为 1 时,才允许写入地址。(SPP 中奇数位置的位未使用向量且必须为零。)

每个页面的 SPP 向量都位于内存中。对于对符合子页面写入权限的客户物理地址的写入,处理器使用以下过程来定位该地址的 SPP 向量:

  1. SPPTP(子页面权限表指针)VM 执行控制字段包含 4 KB 根 SPP 表(SSPL4 表)的物理地址。客户物理地址的位 47:39 标识该表中的一个 64 位条目,称为 SPPL4E。
  2. 4 KB SPPL3 表位于所选 SPPL4E 中的物理地址处。客户物理地址的位 38:30 标识该表中的一个 64 位条目,称为 SPPL3E。
  3. 4 KB SPPL2 表位于所选 SPPL3E 中的物理地址处。客户物理地址的位 29:21 标识该表中的一个 64 位条目,称为 SPPL2E。
  4. 4 KB SPP 向量表(SSPL1 表)位于所选 SPPL2E 中的物理地址处。客户物理地址的位 20:12 标识该地址的 64 位 SPP 向量。如前所述,子页权限向量的位 2S 确定该地址是否可以写入,其中 S 是地址位 11:7 的值。

(用于访问这些表的内存类型在 IA32_VMX_BASIC MSR 的位 53:50 中报告。请参阅附录 A.1。)

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

  • 如果根据第 29.3.3.2 节禁止对任一页面进行写入,则即使该页面的客户物理地址符合子页面写入权限,也可能会禁止访问。 (此行为特定于模型。)
  • 对于每个页面,仅当 (1) 按照第 29.3.3.2 节允许对该页面进行写入时,才允许访问; (2) (a) 该页面的guest 物理地址有资格获得子页面写入权限; (b)页面的子页面向量允许写入(如上所述)。

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

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

SPP 未命中和 SPP 错误配置称为 SPP 相关事件并导致 VM Exits。

29.3.5 EPT 的已访问和脏标志

Intel 64 架构支持普通分页结构条目中的已访问标志和脏标志(请参见第 4.8 节)。某些处理器还支持 EPT 分页结构条目中的相应标志。软件应读取 VMX 功能 MSR IA32_VMX_EPT_VPID_CAP(请参阅附录 A.10)以确定处理器是否支持此功能。

软件可以使用扩展页表指针(EPTP)的第 6 位(VM 执行控制字段)启用 EPT 的已访问和脏标志(请参见第 25.6.11 节中的表 25-9)。如果该位为 1,处理器将为 EPT 设置已访问和脏标志,如下所述。此外,设置此标志会导致处理器对guest 分页结构条目的访问被视为写入(请参见下文和第 29.3.3.2 节)。

对于在客户物理地址转换过程中使用的任何 EPT 分页结构条目,第 8 位是访问标志。对于映射页面的 EPT 分页结构条目(而不是引用另一个 EPT 分页结构),第 9 位是脏标志。

每当处理器使用 EPT 分页结构条目作为客户物理地址转换的一部分时,它就会在该条目中设置访问标志(如果尚未设置)。

每当对客户物理地址进行写入时,处理器都会在 EPT 分页结构条目中设置脏标志(如果尚未设置),该标志标识客户物理地址的最终物理地址(EPT PTE)或 EPT 分页结构条目,其中位 7 为 1)。

当启用 EPT 的访问标志和脏标志时,处理器对guest 分页结构条目的访问将被视为写入(请参见第 29.3.3.2 节)。因此,这样的访问将导致处理器在EPT分页结构条目中设置脏标志,该脏标志标识客户分页结构条目的最终物理地址。

(这不适用于通过 MOV 到 CR 指令进行 PAE 分页的 PDPTE 寄存器的加载;请参阅第 4.4.1 节。客户 PDPTE 的这些加载被视为读取,不会导致处理器在任何 EPT 中设置脏标志分页结构条目。)

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

处理器可以将来自 EPT 分页结构条目的信息缓存在 TLB 和分页结构缓存中(参见第 29.4 节)。这一事实意味着,如果软件将已访问标志或脏标志从 1 更改为 0,则处理器可能不会在使用受影响的客户物理地址进行后续访问时设置内存中的相应位。

29.3.6 页面修改日志记录

当启用 EPT 的访问标志和脏标志时,软件可以使用称为页面修改日志记录的功能跟踪对guest 物理地址的写入。

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

在允许guest 物理访问之前,处理器可能会确定它首先需要为 EPT 设置已访问或脏标志(请参阅第 29.3.5 节)。发生这种情况时,处理器会检查 PML 索引。如果 PML 索引不在 0–511 范围内,则存在页面修改日志已满事件并发生 VM Exits。在这种情况下,不会设置已访问或脏标志,并且不会发生触发该事件的guest 物理访问。

相反,如果 PML 索引在 0–511 范围内,处理器将继续更新 EPT 的已访问或脏标志,如第 29.3.5 节所述。如果处理器更新了 EPT 的脏标志(将其从 0 更改为 1),则其操作如下:

  1. 访问的guest 物理地址被写入页面修改日志。具体地,将客户物理地址写入通过将PML索引添加到PML地址的8倍而确定的物理地址。写入值的位 11:0 始终为 0(因此写入的客户机物理地址是 4 KB 对齐的)。
  2. PML 索引减 1(这可能导致值从 0 转换为 FFFFH)。

由于处理器会随着每个日志条目递减 PML 索引,因此该值可能会从 0 转换为 FFFFH。此时,不会发生进一步的日志记录,因为处理器将确定 PML 索引不在 0-511 范围内,并将生成页面修改日志已满事件(见上文)。

29.3.7 EPT 和内存Typing

本节指定逻辑处理器如何在使用 EPT 时确定内存访问的内存类型。 (有关英特尔 64 架构中内存类型的详细信息,请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷第 12 章“内存高速缓存控制”。)第 29.3.7.1 节解释了内存类型是如何定义的。确定对 EPT 分页结构的访问。第 29.3.7.2 节解释了如何使用 EPT 转换的guest 物理地址来确定访问的内存类型。

29.3.7.1 用于访问 EPT 分页结构的存储器类型

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

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

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

29.3.7.2 用于转换的guest 物理地址的存储器类型

使用客户物理地址的内存访问(使用 EPT 转换的访问)的有效内存类型是用于访问内存的内存类型。有效内存类型基于控制寄存器 CR0 中第 30 位(高速缓存禁用 —CD)的值;用于转换客户物理地址的最后一个 EPT 分页结构条目(第 7 位设置为 1 的 EPT PDE 或 EPT PTE);和 PAT 内存类型(见下文):

  • PAT 内存类型取决于 CR0.PG 的值:
    • 如果 CR0.PG = 0,则 PAT 存储器类型为 WB(回写)。
    • 如果 CR0.PG = 1,则 PAT 存储器类型是从 IA32_PAT MSR 选择的存储器类型,如第 12.12.3 节“从 PAT 选择存储器类型”中指定。
  • EPT 内存类型在最后一个 EPT 分页结构条目的位 5:3 中指定:0 = UC; 1 = 厕所; 4=WT; 5=WP; 6 = WB。其他值被保留并导致 EPT 错误配置(参见第 29.3.3 节)。
  • 如果 CR0.CD = 0,则有效内存类型取决于最后一个 EPT 分页结构条目的第 6 位的值:
    • 如果值为 0,则有效内存类型是 EPT 内存类型和第 12.5.2.2 节表 12-7 中指定的 PAT 内存类型的组合,使用 EPT 内存类型代替 MTRR 内存类型。
    • 如果值为1,则访问的内存类型为EPT内存类型。 PAT 内存类型被忽略。
  • 如果 CR0.CD = 1,则有效存储器类型为 UC。

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

29.4 缓存translation信息

支持 Intel® 64 和 IA-32 架构的处理器可以通过在处理器上缓存控制该过程的内存结构中的数据来加速地址转换过程。此类缓存在《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷第 4.10 节“缓存转换信息”中进行了讨论。本节介绍此缓存如何与 VMX 架构交互。

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

第 29.4.1 节描述了可以缓存的不同类型的信息。第 29.4.2 节指定了何时可以缓存此类信息以及如何使用它。第 29.4.3 节详细介绍了软件如何使缓存信息无效。

29.4.1 可能被缓存的信息

《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷中的第 4.10 节“缓存translation信息”确定了逻辑处理器可以缓存的两种与translation相关的信息: translation ,它们是线性映射页号到物理页帧,以及分页结构高速缓存,它将线性页号的高位映射到分页结构条目中的信息,用于转换与这些高位匹配的线性地址。

当使用 VPID 和 EPT 时,可以缓存相同类型的信息。逻辑处理器可以根据其功能缓存并使用此类信息。不同功能的信息标识如下:

  • 线性映射。 2 有两种:
  • 线性translation。其中每一个都是从线性页号到它所转换的物理页帧的映射,以及有关访问权限和内存类型的信息。
  • 线性分页结构高速缓存条目。其中每一个都是从线性地址的上部到用于转换线性地址空间的相应区域的分页结构的物理地址的映射,以及有关访问权限的信息。例如,线性地址的位 47:39 将映射到相关页目录指针表的地址。

线性映射不包含来自任何 EPT 分页结构的信息。

  • guest -物理映射。 1 有两种:
  • 客体translation。其中每一个都是从客户物理页号到其转换到的物理页帧的映射,以及有关访问权限和内存类型的信息。
  • guest 物理分页结构高速缓存条目。其中每一个都是从客户物理地址的上部到用于转换客户物理地址空间的相应区域的EPT分页结构的物理地址的映射,以及有关访问权限的信息。

guest 物理映射中有关访问权限和内存类型的信息源自 EPT 分页结构。

  • 组合映射。 2 有两种:
  • 合并translation。其中每一个都是从线性页号到它所转换的物理页帧的映射,以及有关访问权限和内存类型的信息。
  • 组合的分页结构缓存条目。其中每一个都是从线性地址的上部到用于转换线性地址空间的相应区域的分页结构的物理地址的映射,以及有关访问权限的信息。

组合映射中有关访问权限和内存类型的信息源自guest 分页结构和 EPT 分页结构。

guest 物理映射和组合映射还可以包括SPP向量和有关用于定位SPP向量的数据结构的信息(参见第29.3.4.2节)。

29.4.2 创建和使用缓存的translation信息

以下项目详细介绍了上一节中描述的映射的创建:

  • 以下各项描述了未使用 EPT 时映射的创建(包括在 VMX 非 root 操作之外执行):
    • 可以创建线性映射。它们源自由 CR3 的当前值(直接或间接)引用的分页结构,并且与当前 VPID 和当前 PCID 相关联。
    • 不会使用从不存在的分页结构条目(位 0 为 0)或设置保留位的信息创建线性映射。例如,如果 PTE 不存在,则不会为其translation将使用该 PTE 的任何线性页码创建线性映射。
    • 未使用 EPT 时,不会创建guest 物理映射或组合映射
  • 以下各项描述了使用 EPT 时映射的创建:
    • 可以创建guest -物理映射。它们源自当前 EPTP 的第 51:12 位(直接或间接)引用的 EPT 寻呼结构。这 40 位包含 EPT-PML4 表的地址。 (EP4TA 符号指的是这 40 位)。新创建的guest 物理映射与当前 EP4TA 关联。
    • 可以创建组合映射。它们源自当前 EP4TA(直接或间接)引用的 EPT 分页结构。如果 CR0.PG = 1,它们也源自 CR3 当前值引用(直接或间接)的分页结构。它们与当前 VPID、当前 PCID 和当前 EP4TA 相关联。1 如果 CR0.PG = 0,则不会创建组合分页结构缓存条目。
    • 不会使用从不存在(请参阅第 29.3.2 节)或配置错误(请参阅第 29.3.3.1 节)的 EPT 分页结构条目派生的信息创建guest 物理映射或组合映射。
    • 不会使用从不存在的或设置保留位的guest 分页结构条目导出的信息来创建组合映射。
    • 使用 EPT 时不会创建线性映射。

以下各项详细说明了各种映射的使用:

  • 如果未使用 EPT(例如,当在 VMX non-root operation之外时),逻辑处理器可以使用缓存的映射,如下所示:
    • 对于使用线性地址的访问,其可以使用与当前VPID和当前PCID相关联的线性映射。它还可以使用与当前 VPID 和任何 PCID 关联的全局 TLB 条目(线性映射)。
    • 不使用 EPT 时,不会使用任何guest 物理映射或组合映射。
  • 如果 EPT 正在使用,逻辑处理器可以使用缓存的映射,如下所示:
    • 对于使用线性地址的访问,其可以使用与当前VPID、当前PCID和当前EP4TA相关联的组合映射。它还可以使用与当前 VPID、当前 EP4TA 和任何 PCID 关联的全局 TLB 条目(组合映射)。
    • 对于使用guest 物理地址的访问,它可以使用与当前EP4TA相关联的guest 物理映射。
    • 使用 EPT 时不使用线性映射。

29.4.3 使缓存的translation信息失效

分页结构(包括EPT分页结构和用于定位SPP向量的数据结构)的软件修改可能会导致这些结构与逻辑处理器缓存的映射之间的不一致。某些操作使逻辑处理器缓存的信息无效,并且可以用来消除这种不一致。

29.4.3.1 使缓存映射无效的操作

以下操作使缓存的映射无效,如下所示:

  • 在架构上使 TLB 或分页结构缓存中的条目无效的操作与 VMX 操作无关(例如,INVLPG 和 INVPCID 指令),使线性映射和组合映射无效。3它们仅需要对当前 VPID 执行此操作(但是,对于组合映射) ,所有 EP4TA)。即使 EPT 正在使用,当前 VPID 的线性映射也会无效。4 即使 EPT 未使用,当前 VPID 的组合映射也会无效。

  • EPT 违规会使任何用于转换导致 EPT 违规的guest 物理地址的guest 物理映射(与当前 EP4TA 关联)无效。如果该客户物理地址是线性地址的转换,则EPT违规还会使与当前PCID、当前VPID和当前EP4TA关联的该线性地址的任何组合映射无效。

  • 如果“启用 VPID”VM 执行控制为 0,则 VM entry和 VM Exits使与 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 无效。逻辑处理器不需要使用于全局translation的信息无效(尽管它可能会这样做)。有关全局translation的详细信息,请参阅第 4.10 节“缓存translation信息”。 (该指令还可能使与其他 VPID 关联的映射无效。)

    有关 INVVPID 指令的详细信息,请参见第 31 章。有关使用本指令的指南,请参阅第 29.4.3.3 节。

  • INVEPT 指令的执行将使客户物理映射和组合映射无效。无效基于指令操作数,称为 INVEPT 类型和 INVEPT 描述符。当前定义了两种 INVEPT 类型:

    • 单一上下文。如果 INVEPT 类型为 1,则逻辑处理器将使与 INVEPT 描述符中指定的 EP4TA 关联的所有客户物理映射和组合映射无效。该 EP4TA 的组合映射对于所有 VPID 和所有 PCID 均无效。 (该指令可能会使与其他 EP4TA 关联的映射无效。)
    • 全上下文。如果 INVEPT 类型为 2,则逻辑处理器将使与所有 EP4TA 关联的客户物理映射和组合映射(以及对于组合映射,对于所有 VPID 和 PCID)无效。

    有关 INVEPT 指令的详细信息,请参见第 31 章。有关使用本指令的指南,请参阅第 29.4.3.4 节。

  • 上电或重置将使所有线性映射、客户物理映射和组合映射无效

29.4.3.2 不需要使缓存映射无效的操作

以下各项详细说明了不需要使某些缓存映射失效的操作的情况:

  • 在架构上使 TLB 或分页结构高速缓存中的条目无效的操作(独立于 VMX 操作)不需要使任何guest 物理映射无效。
  • 不需要 INVVPID 指令来使任何客户物理映射无效。
  • 不需要 INVEPT 指令来使任何线性映射无效
  • 不需要 VMX 转换来使任何guest 物理映射无效。如果“启用 VPID”VM 执行控制为 1,则不需要 VMX 转换来使任何线性映射或组合映射无效。
  • VMXOFF 和 VMXON 指令不需要使任何线性映射、客户物理映射或组合映射无效。

逻辑处理器可以随时使任何缓存的映射无效。因此,上面标识的操作可能会使指示的映射无效,尽管事实上不需要这样做。

29.4.3.3 INVVPID 指令的使用指南

VMM 软件是否需要使用 INVVPID 指令取决于该软件如何虚拟化内存。

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

软件何时应使用 INVVPID 指令的要求取决于用于页表虚拟化的特定算法。以下各项为软件开发人员提供了指南:

  • INVLPG 指令的仿真可能需要执行 INVVPID 指令,如下所示:
    • INVVPID 类型是单独地址 (0)。
    • INVVPID 描述符中的 VPID 是分配给正在模拟其执行的虚拟处理器的 VPID。
    • INVVPID 描述符中的线性地址是正在模拟的 INVLPG 指令的操作数的地址。
  • 某些指令会使 TLB 和分页结构高速缓存中的所有条目无效,全局转换除外。一个例子是 MOV 到 CR3 指令。 (有关全局转换的详细信息,请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷中的第 4.10 节“缓存转换信息”。)此类指令的仿真可能需要执行 INVVPID 指令,如下所示:
    • INVVPID 类型是单上下文保留全局 (3)。
    • INVVPID 描述符中的 VPID 是分配给正在模拟其执行的虚拟处理器的 VPID。
  • 某些指令会使 TLB 和分页结构高速缓存中的所有条目无效,包括全局转换。一个示例是 MOV 到 CR4 指令,如果位 4(页全局启用 - PGE)的值正在更改。此类指令的仿真可能需要执行 INVVPID 指令,如下所示:
    • INVVPID 类型是单上下文 (1)
    • INVVPID 描述符中的 VPID 是分配给正在模拟其执行的虚拟处理器的 VPID。

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

如果正在使用 EPT,则上面列举的指令可能不会配置为导致 VM Exits,并且 VMM 可能不会模拟它们。在这种情况下,客户软件执行指令会正确地使 TLB 和分页结构缓存中所需的条目无效(参见第 29.4.3.1 节);不需要执行 INVVPID 指令。

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

以下指南更普遍适用,即使正在使用 EPT,也同样适用:

  • 如第 30.4.5 节中详述的,如果软件没有正确地使可能从分页结构缓存的信息无效,则对 APIC 访问页面的访问可能不会导致 APIC 访问 VM Exits。如果逻辑处理器上的当前 VPID 曾一度为非零值 X,则建议软件在 VM 之前使用具有“单上下文”INVVPID 类型的 INVVPID 指令,并在 INVVPID 描述符中使用 VPID X建立 VPID X 的同一逻辑处理器上的条目以及 (a)“虚拟化 APIC 访问”VM 执行控制从 0 更改为 1; (b) APIC 访问地址的值已更改。
  • 软件可以在执行 VMXON 指令之后或在执行 VMXOFF 指令之前立即使用具有“全上下文”INVVPID 类型的 INVVPID 指令。要么防止在单独使用 VMX 操作之间潜在地保留从分页结构缓存的信息。

29.4.3.4 INVEPT 指令的使用指南

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

  • 对 EPT 分页结构条目进行以下任何更改后,软件应使用具有“单上下文”INVEPT 类型的 INVEPT 指令(INVEPT 描述符应包含直接或间接引用修改后的 EPT 分页结构的 EPTP 值) ):
    • 将任意特权位 2:0 从 1 更改为 0。
    • 更改位 51:12 中的物理地址。
    • 如果已访问,则清除第 8 位(已访问标志),并且将启用 EPT 的脏标志。
    • 对于 EPT PDPTE 或 EPT PDE,更改位 7(确定条目是否映射页面)。
    • 对于用于转换guest 物理地址的最后一个 EPT 分页结构条目(第 7 位设置为 1 的 EPT PDPTE、第 7 位设置为 1 的 EPT PDE 或 EPT PTE),更改位 5:3 或位 6。(这些位确定使用 EPT 分页结构条目访问的有效内存类型;请参见第 29.3.7 节。)
    • 对于用于转换客户物理地址的最后一个 EPT 分页结构条目(位 7 设置为 1 的 EPT PDPTE、位 7 设置为 1 的 EPT PDE 或 EPT PTE),清除位 9(脏标志) ) 如果被访问,EPT 的脏标志将被启用。
  • 如果逻辑处理器之前已进入,软件应在具有 EPTP 值 X 的 VM entries之前使用具有“单上下文”INVEPT 类型的 INVEPT 指令,使得 X[6] = 1(启用 EPT 的已访问标志和脏标志)具有 EPTP 值 Y 的 VMX non-root operation,使得 Y[6] = 0(未启用 EPT 的已访问标志和脏标志)并且 Y[51:12] = X[51:12]。
  • 软件可以在修改当前 EPT 分页结构条目(参见第 29.3.2 节)后使用 INVEPT 指令将任何特权位 2:0 从 0 更改为 1.2。如果不这样做,可能会导致 EPT 违规,否则不会发生这种情况。由于 EPT 违规会使导致 EPT 违规的访问所使用的任何映射无效(请参阅第 29.4.3.1 节),因此如果再次执行原始访问,即使不执行 INVEPT 指令,也不会再次发生 EPT 违规。
  • 由于逻辑处理器不会缓存从不存在(请参阅第 29.3.2 节)或错误配置(请参阅第 29.3.3.1 节)的 EPT 分页结构条目派生的任何信息,因此无需在修改 EPT 分页后执行 INVEPT - 不存在或配置错误的结构条目。
  • 如第 30.4.5 节中详述,如果软件未正确使可能从 EPT 分页结构缓存的信息无效,则对 APIC 访问页面的访问可能不会导致 APIC 访问 VM Exits。如果 EPT 与 EPTP X 同时在逻辑处理器上使用,建议软件使用具有“单上下文”INVEPT 类型的 INVEPT 指令,并在同一逻辑上的 VM entries之前在 INVEPT 描述符中使用 EPTP X启用带有 EPTP X 的 EPT 的处理器,并且 (a)“虚拟化 APIC 访问”VM 执行控制从 0 更改为 1; (b) APIC 访问地址的值已更改。
  • 软件可以在执行 VMXON 指令之后或在执行 VMXOFF 指令之前立即使用具有“全上下文”INVEPT 类型的 INVEPT 指令。要么防止在单独使用 VMX 操作之间潜在地保留从 EPT 分页结构缓存的信息。

在包含多个逻辑处理器的系统中,软件必须考虑这样一个事实:来自 EPT 分页结构条目的信息可能会缓存在逻辑处理器上,而不是修改该条目的逻辑处理器上。将更改传播到分页结构条目的过程通常称为“TLB 击落”。有关 TLB 关闭的讨论出现在《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷第 4.10.5 节“分页结构更改向多个处理器的传播”中。


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2024-4-22 00:43 被zhang_derek编辑 ,原因:
收藏
点赞1
支持
分享
最新回复 (3)
雪    币: 19613
活跃值: (29278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-4-22 13:56
1
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
6天前
0
雪    币: 760
活跃值: (647)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
THX
5天前
0
游客
登录 | 注册 方可回帖
返回