我已阅读“英特尔软件开发人员手册”第3卷第20节,其中介绍了虚拟8086模式的工作原理,包括使用VIF和VIP标志。不过,我仍然对一些事情感到困惑。使用x86 VIF和VIP标志?
VIF标志用作IF标志的替代品,因此即使它仿真的实模式程序不希望8086仿真程序(可能是某些用户空间程序)可以接收可屏蔽的硬件中断至。
- 为什么模拟器想要这样做?
VIP被用作标记何时收到中断的空间。根据手册,如果处理器接收到一个可屏蔽的中断,但被仿真的程序不想接收它们(所以VIF标志将被清除),仿真器应该设置VIP标志,等待仿真程序设置IF标志,然后处理中断。
为什么我们要等待处理中断而不是立即处理呢?实模式8086上的中断是否被延迟而不是被忽略?
附加问题 - 处理器在VIP被设置并且程序启用中断(通过STI等)时生成#GP,但是可以在多种方式设置VIP标志时生成#GP,例如,通过无效的内存访问。该手册没有提及检查#GP的原因是什么,所以程序是否应该处理挂起的中断,而不管IF是否被设置?
编辑:好了,我看到了我的一部分混乱,它是内核这需要保持IF集。在这种情况下,我应该问#2,为什么我们要等待处理中断而不是完全忽略它?
虚拟8086模式运行16位代码本地*。它不模拟,它虚拟化。 ** vm86环境需要能够在不停止内核主机操作系统接收中断的情况下禁用中断**在Linux,IIRC上,vm86模式通过让内核与用户空间帮助程序协作来处理仿真部分不需要在内核中。(当然,这只适用于32位内核; vm86模式不适用于64位内核)。 –
@PeterCordes:啊,我明白了,所以问题不在于* emulator *接收中断,而是* kernel *。现在我意识到这一点,似乎这就是手册明确说的,但我没有足够的注意力去实现它。 – ObsequiousNewt