我可以更改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仍然存在 。不受影响"
答案 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才能执行此操作。