首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86_64:我可以更改EFLAGS寄存器中的VM标志吗?

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

Stack Overflow用户
提问于 2016-08-28 19:16:03
回答 1查看 1.1K关注 0票数 4

我可以更改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不受影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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模式中运行才能做到这一点。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39194900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档