【发布时间】:2017-09-15 04:31:11
【问题描述】:
我已通读英特尔软件开发人员手册第 3 卷的第 20 节,其中解释了虚拟 8086 模式的工作原理,包括 VIF 和 VIP 标志的使用。但是,我仍然对一些事情感到困惑。
VIF 标志用作 IF 标志的代理,因此 8086 仿真器(可能是一些用户空间程序)可以接收可屏蔽的硬件中断,即使它正在仿真的实模式程序不想.
- 模拟器为什么要这样做?
VIP 用作空间来标记何时收到中断。根据手册,如果处理器接收到可屏蔽中断,但被仿真的程序不想接收它们(因此 VIF 标志将被清除),仿真器应设置 VIP 标志,等到仿真程序设置IF标志,然后处理中断。
为什么我们要等待处理中断而不是立即处理?实模式 8086 上的中断是延迟而不是忽略?
附加问题 — 当设置 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