我已阅读英特尔软件开发人员手册第3卷第20节,其中解释了虚拟8086模式的工作原理,包括使用VIF和VIP标志。但是,我仍然对某些事情感到困惑。
VIF标志用作IF标志的代理,因此8086仿真器(可能是一些用户空间程序)可以接收可屏蔽的硬件中断,即使它模拟的实模式程序不希望
VIP用作接收中断时标记的空间。根据手册,如果处理器收到可屏蔽中断,但被仿真的程序不想接收它们(因此VIF标志将被清除),仿真器应设置VIP标志,等待仿真程序设置IF标志,然后处理中断。
为什么我们要等待处理中断而不是立即处理?实模式8086上的中断是否推迟而不是被忽略?
附加问题 - 当设置VIP并且程序启用中断(通过STI等)时,处理器生成#GP但是在以多种方式设置VIP标志时可以生成#GP,例如。通过无效的内存访问。手册没有提到检查#GP的原因是什么,所以程序是否应该处理挂起的中断,无论IF是否被设置?
编辑:好的,所以我看到了我的一些困惑 - 它是内核需要保持IF集。在这种情况下,我宁愿要求#2 - 为什么我们要等待处理中断而不是完全忽略它?
答案 0 :(得分:3)
第20.3.2节介绍了这一点:“现有8086程序通常设置并清除EFLAGS寄存器中的IF标志,以启用和禁用可屏蔽硬件中断。”在现代操作系统下以虚拟8086模式运行此类应用程序时,操作系统不允许8086程序禁用系统中的中断。因此,IF标志需要保持在OS的控制之下,并且必须代表virtual-8086程序进行虚拟化。使用VIF和VIP标志“消除了对所有IF相关操作(例如PUSHF,POPF,CLI和STI指令)的需求,以便陷入虚拟8086监视器。”
如果中断已执行CLI以清除IF(具有清除VIF的效果),则无法将中断传送到virtual-8086模式程序。
这是一个很好的问题。在我看来,处理器应该在生成#GP之前设置VIF;然后,virtual-8086监视器中的GP处理程序可以很容易地看到VIP和VIF都已设置。这是由POPF或IRET设置VIF时所描述的行为;我不知道为什么STI表现不同。
答案 1 :(得分:1)
问题1已经回答,让 处理2和3。
在实模式8086上的中断是否被推迟而不是被忽略了?
请务必注意 执行模式(真实或受保护) 与它无关。 CLI确实忽略了中断, 它不会推迟任何事情。但是 中断处理非常复杂, 并且在大多数配置中 中断装置和/或 中断控制器将确保 CPU的INT引脚保持活动状态 直到您进行性传播感染并为 打断。 因此,过度简化 您可以说CLI推迟了 打断。但是你不会找到这样的 CPU手册中的声明,因为 这是由外部逻辑完成的 并取决于许多可配置的东西。
但是在设置VIP标志时可以生成#GP 以多种方式-例如通过无效的内存访问。
在v86模式下,有很多 GPF源,例如端口IO指令, 当IOPL小于3时,唯一可靠的 区分它们的方法是查找 错误的操作码,并对其进行仿真。这是不可能的 例如,设置VIF并仅提高GPF 在那之后,作为例外应该不留下任何 错误指令的可观察效果, 允许软件完全模拟它。