使用x86 VIF和VIP标志?

x86 emulation interrupt x86-16

163 观看

1回复

113 作者的声誉

我已经通读了《英特尔软件开发人员手册》第3卷第20节,其中解释了虚拟8086模式的工作原理,包括VIF和VIP标志的使用。但是,我仍然对某些事情感到困惑。

VIF标志用作IF标志的替代,因此8086仿真器(可能是一些用户空间程序)可以接收可屏蔽的硬件中断,即使它所仿真的实模式程序不想这样做。

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

VIP用作在接收到中断时进行标记的空间。根据手册,如果处理器接收到可屏蔽的中断,但被仿真的程序不想接收它们(因此VIF标志将被清除),则仿真器应设置VIP标志,等待仿真的程序将其设置为0。 IF标志,然后处理中断。

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

  2. 另一个问题是:当设置了VIP时,处理器会生成一个#GP,并且程序会允许中断(通过STI等)。但是,通过多种方式(例如,通过无效的内存访问)设置VIP标志时,可能会生成一个#GP。该手册没有提及检查#GP的原因,因此无论是否设置了IF,程序都应处理待处理的中断吗?

编辑:好的,所以我看到了部分困惑-它是需要保持IF设置的内核。在那种情况下,我宁愿要求#2 —为什么我们要等待处理中断而不是完全忽略它?

作者: ObsequiousNewt 的来源 发布者: 2017 年 9 月 15 日

回应 1


3

6453 作者的声誉

决定
  1. 其原因在第20.3.2节中介绍:“现有的8086程序通常设置并清除EFLAGS寄存器中的IF标志,以启用和禁用可屏蔽的硬件中断。” 在现代操作系统下以virtual-8086模式运行此类应用程序时,该操作系统将不允许8086程序禁用系统中的中断。因此,IF标志需要保持在OS的控制之下,并且必须代表virtual-8086程序对其进行虚拟化。使用VIF和VIP标志“消除了所有与IF相关的操作(例如PUSHF,POPF,CLI和STI指令)的陷阱,以捕获到virtual-8086监视器。”

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

  3. 这是个好问题。在我看来,处理器应该在生成#GP之前设置VIF。那么virtual-8086监视器中的GP处理程序就可以轻松地看到VIP和VIF都已设置。这是通过POPF或IRET设置VIF时的描述行为。我不知道为什么STI表现不同。

作者: prl 发布者: 2017 年 9 月 15 日
32x32