它似乎EPT.bit2
并EPT.bit10
用于确定在主管模式\用户模式下是否允许取指。
但是我怎么知道 IPA 是主管模式线性地址还是用户模式线性地址?一点U/S
一点page table
?
如果我的理解是正确的,那就意味着我们必须结合page table
并EPT
判断是否允许取指,对吗?
在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
,则在以下任一情况下阻止从字节中提取指令:在用于转换字节的客户物理地址的任何 EPT 分页结构条目中,分页映射
linear address of the byte as a supervisor-mode address
和(对主管模式线性地址的执行访问)都是明确的。bit 2(EPT.bit2)
linear address as a supervisor-mode address
如果在U/S flag(of page table)
控制线性地址转换的至少一个分页结构条目中(位 2)为 0,则分页映射 a 。在用于转换字节的客户物理地址的任何 EPT 分页结构条目中,分页映射
linear address of the byte as a user-mode address
和(用户模式线性地址的执行访问)都是明确的。bit 10 (EPT.bit10)
linear address as a user-mode address
如果在U/S flag(of page table)
控制线性地址转换的所有分页结构条目中 为 1,则分页映射 a 。如果分页被禁用(CR0.PG = 0),每个线性地址都是用户模式地址。
我如何判断一个地址是supervisor-mode address
还是user-mode address
这里?通过地址的高位(0xffff ...是主管模式地址,0x0000 ...是用户模式地址)?
就和而言Page-Table Entry
,我们可以这样说:EPT-entry
EPT Violations
- if
page table
'sU/S = 0
inall levels
, thenEPT.bit2 = 1
inall levels
, 提取是允许的。 - if
page table
'sU/S = 1
inall levels
, thenEPT.bit10 = 1
inall levels
, 提取是允许的。 - 其他情况下不允许