x86_64:我可以更改EFLAGS寄存器中的VM标志吗?

时间:2016-08-28 19:16:03

标签: assembly virtual-machine x86-64

我可以更改EFLAGS寄存器中的VM标志吗?如果是这样,怎么样?

请注意,我无法使用pushf,操纵堆栈上的值,然后popf。根据{{​​3}}:

第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仍然存在   。不受影响"

1 个答案:

答案 0 :(得分:5)

没有

可以通过用户模式程序更改的标志
用户应用程序(CF,PF,AF ZF,SF,TF,DF OF)中只能设置12个最低有效位中的8个,在这12个位中,您无法设置保留位,只留下9个和其中一个({ {1}})有特权 大多数标志可以使用普通指令进行更改,用户应用程序只需要IF来设置POPF标志。 较高的标志是特权或只读的,只能由在环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标志,无论如何它都是什么?
TF标志与虚拟机无关,但会显示处理器是否在16-bit virtual 8086 mode中运行。
要设置VM标志,您需要进入Virtual 8086模式 See here例如代码。
许多所需的指令都是特权,只能在第0环中执行 此外,您只能从32位模式进入实模式,而不能从64位模式进入实模式。

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