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

Mur*_*ula 4 assembly x86-64 virtual-machine

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

请注意,我不能只使用pushf,操纵堆栈上的值,然后popf.根据英特尔手册:

第2卷,第4.3章PUSHF:

"将整个EFLAGS寄存器复制到堆栈时,不会复制VM和RF标志(位16和17);而是在存储在堆栈中的EFLAGS映像中清除这些标志的值."

第2卷,第4.3章POPF:

"在特权级别0(或实地址模式,相当于特权级别0)的受保护,兼容性或64位模式下运行时,EFLAGS寄存器中的所有非保留标志(RF1,VIP,VIF除外) ,VM可能会被修改.VIP,VIF和VM不受影响."

Joh*_*ica 5

没有.

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

请参阅:http://www.felixcloutier.com/x86/POPF : POPFD : POPFQ.html

除IF,IOPL,VIP,VIF,VM和RF外的所有非保留位均可修改; IF,IOPL,VIP,VIF,VM和所有保留位不受影响; RF被清除.
如果在权限不足的情况下执行POPF/POPFD指令,则不会发生异常,但特权位不会更改.

请参阅:https://en.wikipedia.org/wiki/FLAGS_register

如何我更改虚拟机的标志又是什么呢?
VM标志与虚拟机无关,但显示处理器是否以16位虚拟8086模式运行.
要设置VM标志,您需要进入Virtual 8086模式.
请参阅此处以获取示例代码
所需的许多指令都是特权的,只能在Ring 0中执行.
此外,您只能从32位模式进入实模式,而不能从64位模式进入.

从虚拟8086模式退回到保护模式是一个更复杂的事情(向下滚动一点工作代码).
您需要再次运行特权VME模式才能执行此操作.