如何确定 x86-64 中的页表和 EPT 是否允许指令提取?

问题描述

Format of a Page-Table Entry that Maps a 4-KByte Page Bit

Format of an EPT Page-Table Entry that Maps a 4-KByte Page Bit

看来 EPT.bit2EPT.bit10 是用来判断是否取指令的 在主管模式\用户模式下允许与否。

但是我怎么知道 IPA 是管理模式线性地址还是用户模式线性地址? U/S 中的 page table 位?

如果我的理解是正确的,那就意味着我们必须结合page tableEPT来判断是否允许取指令,对吗?

Intel Manual Volume 3C,Chapter 27,2.3.2 EPT Violations中,手册描述了几种不允许提取的情况。我只关心 VM-execution control = 1 时的情况。


  • 访问是指令提取,EPT 分页结构阻止对任何正在提取的字节执行访问。这是否发生取决于“EPT基于模式的执行控制”VM-execution control的设置:

    • 如果控制为 0,并且在用于转换字节的来宾物理地址的任何 EPT 分页结构条目中清除了第 2 位(执行访问),则会阻止从字节中提取指令。
    • 如果 control is 1,则在以下任一情况下会阻止从字节中获取指令:
      • 分页映射 linear address of the byte as a supervisor-mode addressbit 2(EPT.bit2)(管理模式线性地址的执行访问)在用于转换访客物理地址的任何 EPT 分页结构条目中都很清楚字节。

        如果 linear address as a supervisor-mode address(位 2)在控制线性地址转换的至少一个分页结构条目中为 0,分页映射 U/S flag(of page table)

      • 分页映射 linear address of the byte as a user-mode addressbit 10 (EPT.bit10)用户模式线性地址的执行访问)在用于转换访客物理地址的任何 EPT 分页结构条目中都很清楚字节。

        如果控制线性地址转换的所有分页结构条目中的 linear address as a user-mode address 为 1,则分页映射 U/S flag(of page table)。如果禁用分页(CR0.PG = 0),则每个线性地址都是用户模式地址。


如何判断此处的地址是 supervisor-mode address 还是 user-mode address?通过地址的高位(0xffff...是管理模式地址,0x0000...是用户模式地址)?

对于Page-Table EntryEPT-entryEPT Violations,我们可以这样说吗:

  1. 如果 page tableU/S = 0all levels 中,则 EPT.bit2 = 1all levels 中,则允许提取
  2. 如果 page tableU/S = 1 中的 all levels,则 EPT.bit10 = 1all levels 中, 允许提取
  3. 其他情况下不允许

解决方法

使用为管理模式设置高位的地址是一种惯例,但它不会影响地址转换或保护的完成方式。 CPL(CS 寄存器的位 1:0)控制访问是管理员模式还是用户模式。 如果 CPL

如果“EPT基于模式的执行控制”为1:

  1. 如果在所有页表级别中禁用分页或 U/S = 1,并且在所有 EPT 级别中 EPT 位 10 = 1,则允许获取。
  2. 如果 CPL

如果“EPT基于模式的执行控制”为0:

  1. 如果在所有页表级别中禁用分页或 CPL

此外,如果 CR4.PAE 为 1,则所有页表级别的第 63 位(XD)必须为 0。