我可以更改EFLAGS寄存器中的VM标志吗?如果是这样的话,是怎么做的?
请注意,我不能只使用pushf,操作堆栈上的值,然后是popf。根据英特尔手册
第2卷,第4.3章
当将整个EFLAGS寄存器复制到堆栈时,VM和RF标志(位16和17)不会被复制;相反,这些标志的值将在存储在堆栈上的EFLAGS映像中清除。
第2卷,第4.3章,方案纲要:
当在保护、兼容性或64位模式下操作时,除了RF1、VIP、VIF和VM之外,在特权级别0(或在实地址模式下,等于VIF到特权级别0)中的所有非保留标志都可能被修改。VIP、VIF和VM不受影响。
发布于 2016-08-28 21:14:19
不是的。
可以由用户模式程序更改的标志
用户应用程序(CF、PF、AF ZF、SF、TF、DF )只能设置12个最不重要的比特中的8个,在不能设置保留位的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指令的执行权限不足,则不会出现异常,但特权位不会更改。
请参阅:寄存器
do 我更改了VM标志,它到底是什么?
VM标志与虚拟机无关,但显示处理器是否在16位虚拟8086模式中运行。
为了设置VM标志,您需要进入Virtual8086模式。
例如,看这里代码。
所需的许多指令都是特权的,只能在环路0中执行。
此外,您只能进入真实模式从32位模式,而不是从64位模式。
从虚拟8086模式退出到保护模式是一个更复杂的事情(为工作代码向下滚动一点)。
同样,您需要在特权VME模式中运行才能做到这一点。
https://stackoverflow.com/questions/39194900
复制相似问题