【发布时间】:2016-08-28 19:16:03
【问题描述】:
我可以更改 EFLAGS 寄存器中的 VM 标志吗?如果有,怎么做?
请注意,我不能只使用pushf,操作堆栈上的值,然后使用popf。根据Intel manual:
第 2 卷,第 4.3 章 PUSHF:
"将整个 EFLAGS 寄存器复制到堆栈时,VM 和 RF 不复制标志(位 16 和 17);相反,这些值 标记在存储在堆栈中的 EFLAGS 映像中被清除。"
第 2 卷,第 4.3 章 POPF:
"在受保护、兼容或 64 位模式下运行时 特权级别 0(或在实地址模式下,相当于 特权级别 0),EFLAGS 寄存器中的所有非保留标志 除了 RF1、VIP、VIF 和 VM 可以修改。 VIP、VIF 和 VM 保留 不受影响。”
【问题讨论】:
-
要设置 VM 标志,您需要使用 IRET 或通过任务更改从 TSS 加载它。两者都需要从 ring 0 开始并在 ring 3 结束。没有理由设置 VM 标志,除非作为操作系统实模式模拟器的一部分。
-
请注意,在长模式下(由
x86-64标签暗示),不支持虚拟8086模式(即使对于CPL=0),所以EFLAGS中的VM标志不能设置(除非你首先从长模式切换到保护模式,对于大多数实际用途而言,这可能是几种不同的疯狂)。
标签: assembly virtual-machine x86-64