【问题标题】:x86_64: Can I change the VM flag in the EFLAGS register? [duplicate]x86_64:我可以更改 EFLAGS 寄存器中的 VM 标志吗? [复制]
【发布时间】: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


【解决方案1】:

没有。

可由用户模式程序更改的标志
用户应用程序只能设置 12 个最低有效位中的 8 个(CF、PF、AF ZF、SF、TF、DF OF),在这 12 个位中您不能设置保留位,只剩下 9 个和其中一个(@ 987654327@) 享有特权。
大多数标志可以使用普通指令更改,用户应用程序只需要POPF 来设置TF 标志。
较高的标志是特权或只读的,只能由在环 0 中运行的进程更改。

见:http://www.felixcloutier.com/x86/POPF:POPFD:POPFQ.html

除了IF、IOPL、VIP、VIF、VM和RF之外的所有非保留位都可以修改; IF、IOPL、VIP、VIF、VM和所有保留位不受影响;射频被清除。
如果在特权不足的情况下执行 POPF/POPFD 指令,则不会发生异常,但特权位不会改变。

见:https://en.wikipedia.org/wiki/FLAGS_register

如何我更改 VM 标志以及它到底是什么?
VM 标志与虚拟机无关,但显示处理器是否在16-bit virtual 8086 mode 中运行。
为了设置 VM 标志,您需要进入虚拟 8086 模式。
See here 示例代码。
所需的许多指令都是特权指令,只能在 Ring 0 中执行。
此外,您只能从 32 位模式进入实模式,而不能从 64 位模式进入。

从虚拟 8086 模式退出回到保护模式是一个even more convoluted affair (scroll down a bit for working code)
同样,您需要在privileged VME mode 中运行才能执行此操作。

【讨论】:

  • 据我了解,vm86 模式在受保护模式操作系统下的适当虚拟 16 位机器。只是它不支持guest切换到32位保护模式。它确实让客人使用影响虚拟环境的特权指令。
  • 鉴于 OP 将 x86-64 列为标签这一事实,我认为他错误地假设 VM 标志会告诉程序它是否在 VMware 等下运行。实模式与此相距甚远。我猜如果你眯着眼睛恰到好处,实模式可以看作是一种虚拟机。
  • 是的,我同意你的一般观点,即它与现代虚拟机完全无关,现代虚拟机可以虚拟化 CPU 的全部功能以作为来宾运行“正常”操作系统。但是 vm86 模式确实虚拟化了实模式,允许 16 位代码以本机速度执行(硬件访问/系统调用除外)。不过,我不确定你最后一句话是什么意思。实际的实模式(不是 VM86 模式)根本不是 VM。 VM86 模式是 like 实模式,但我不会说“又名实模式”,因为实模式是一个单独的东西,例如用于引导加载程序。
  • 我误入歧途,因为 VMXON 指令在设置 VM 标志时具有未定义的行为。我以为我必须在进入 VMX 模式之前清除它,但由于我在长模式下运行,这可能不是我的问题。
  • 进入 v8086 模式(EFLAGS.VM=1, CR0.PE=1)和实模式是两个不同的东西。在实模式下 EFLAGS.VM = 0 且 CR0.PE=0。您链接到的代码/教程与进入 v8066 模式无关。当 CPL=0 时,只能在 x85-64 上从 32 位保护模式(传统模式,而非长模式)进入 v8086 模式。您不需要 VME 即可退出 v8086。在 v8086 模式下使处理器发生故障的任务切换或某些指令组合允许保护模式中断处理程序退出 v8086 模式并返回执行 32 位保护模式代码。
猜你喜欢
  • 2013-03-04
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2018-07-13
相关资源
最近更新 更多