2017-09-15 153 views
0

我已阅读“英特尔软件开发人员手册”第3卷第20节,其中介绍了虚拟8086模式的工作原理,包括使用VIF和VIP标志。不过,我仍然对一些事情感到困惑。使用x86 VIF和VIP标志?

VIF标志用作IF标志的替代品,因此即使它仿真的实模式程序不希望8086仿真程序(可能是某些用户空间程序)可以接收可屏蔽的硬件中断至。

  1. 为什么模拟器想要这样做?

VIP被用作标记何时收到中断的空间。根据手册,如果处理器接收到一个可屏蔽的中断,但被仿真的程序不想接收它们(所以VIF标志将被清除),仿真器应该设置VIP标志,等待仿真程序设置IF标志,然后处理中断。

  1. 为什么我们要等待处理中断而不是立即处理呢?实模式8086上的中断是否被延迟而不是被忽略?

  2. 附加问题 - 处理器在VIP被设置并且程序启用中断(通过STI等)时生成#GP,但是可以在多种方式设置VIP标志时生成#GP,例如,通过无效的内存访问。该手册没有提及检查#GP的原因是什么,所以程序是否应该处理挂起的中断,而不管IF是否被设置?

编辑:好了,我看到了我的一部分混乱,它是内核这需要保持IF集。在这种情况下,我应该问#2,为什么我们要等待处理中断而不是完全忽略它?

+0

虚拟8086模式运行16位代码本地*。它不模拟,它虚拟化。 ** vm86环境需要能够在不停止内核主机操作系统接收中断的情况下禁用中断**在Linux,IIRC上,vm86模式通过让内核与用户空间帮助程序协作来处理仿真部分不需要在内核中。(当然,这只适用于32位内核; vm86模式不适用于64位内核)。 –

+2

@PeterCordes:啊,我明白了,所以问题不在于* emulator *接收中断,而是* kernel *。现在我意识到这一点,似乎这就是手册明确说的,但我没有足够的注意力去实现它。 – ObsequiousNewt

回答

3
  1. 这样做的原因是覆盖在部分20.3.2:“现有的8086个方案通常设置和清除IF标志EFLAGS寄存器来启用和禁用可屏蔽硬件中断。”在现代操作系统下以virtual-8086模式运行这样的应用程序时,操作系统不会允许8086程序禁用系统中的中断。因此,IF标志需要保持在操作系统的控制之下,并且必须代表虚拟8086程序进行虚拟化。使用VIF和VIP标志“消除了所有与IF相关的操作(如PUSHF,POPF,CLI和STI指令)的需要,以便捕获到虚拟8086监视器。”

  2. 如果中断已经执行CLI来清除IF(具有清除VIF的效果),则无法将其传递给虚拟8086模式程序。

  3. 这是一个很好的问题。在我看来,处理器应该在生成#GP之前设置VIF;那么虚拟8086监视器中的GP处理程序可以很容易地看到VIP和VIF都已设置。这是描述当VIF由POPF或IRET设置时的行为;我不知道STI为什么会有不同的表现。

+0

Re#2:不是清除虚拟8086程序忽略中断的IF标志吗?或者“忽略”其实是否意味着“推迟”? – ObsequiousNewt

+0

是的,被屏蔽的中断被延期,而不是被丢弃。 – prl

+0

啊,我现在明白了。谢谢! – ObsequiousNewt