【问题标题】:Use of x86 VIF and VIP flags?使用 x86 VIF 和 VIP 标志?
【发布时间】:2017-09-15 04:31:11
【问题描述】:

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

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

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

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

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

  2. 附加问题 — 当设置 VIP 并且程序启用中断(通过 STI 等)时,处理器会生成 #GP。但是,当 VIP 标志以多种方式设置时,可能会生成 #GP,例如通过无效的内存访问。手册没有提到检查#GP 的原因是什么,那么无论是否设置了 IF,程序都应该处理挂起的中断吗?

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

【问题讨论】:

  • virtual-8086 模式本机运行 16 位代码。它不模拟,它虚拟化。 vm86 环境需要能够在不停止主机操作系统内核接收中断的情况下禁用中断。 在 Linux、IIRC 上,vm86 模式是通过让内核与用户空间助手合作来实现的处理不需要在内核中的仿真部分。 (当然这只适用于 32 位内核;vm86 模式不适用于 64 位内核)。
  • @PeterCordes:啊,我明白了,所以重点不是 emulator 接收中断,而是 kernel 接收中断。现在我意识到这一点,这似乎是手册明确所说的,但我没有足够的注意力去意识到它。

标签: x86 emulation interrupt x86-16


【解决方案1】:
  1. 第 20.3.2 节介绍了其原因:“现有 8086 程序通常设置和清除 EFLAGS 寄存器中的 IF 标志以启用和禁用可屏蔽硬件中断。”在现代操作系统下以虚拟 8086 模式运行此类应用程序时,操作系统不会允许 8086 程序禁用系统中的中断。因此,IF 标志需要保持在操作系统的控制之下,并且必须代表 virtual-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 的行为会有所不同。

【讨论】:

  • Re #2:清除虚拟8086程序忽略中断的IF标志不是重点吗?还是“忽略”实际上意味着“推迟”?
  • 是的,被屏蔽的中断被延迟,而不是被丢弃。
  • 啊,我明白了。谢谢!
【解决方案2】:

由于问题 1 已经回答,让我们 稍微处理一下 2 和 3。

实模式 8086 上的中断是延迟而不是忽略?

需要注意的是 执行模式(真实或受保护) 与它没有太大关系。 CLI 确实忽略中断, 它不会推迟任何事情。但是 中断处理非常复杂, 并且,在大多数配置中, 中断设备和/或 中断控制器将确保 CPU 的 INT 引脚保持活动状态 直到您进行了 STI 并维修了 打断。 因此,通过极大的过度简化, 你可以说 CLI 推迟了 打断。但你不会找到这样的 CPU 手册中的声明,因为 它是用外部逻辑完成的, 并且依赖于许多可配置的东西。

但是在设置 VIP 标志时可能会生成 #GP 以多种方式——例如通过无效的内存访问。

在 v86 模式下,有很多 GPF 源,例如端口 IO 指令, 当 IOPL 小于 3 时。唯一可靠的 区分它们的方法是查找 错误的操作码,并模拟它。这是不可能的 例如,仅设置 VIF 并提高 GPF 之后,因为例外应该不留下 错误指令的可观察到的影响, 允许软件干净地模拟它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2019-06-27
    • 2012-05-09
    • 2011-04-24
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多