【问题标题】:How are BIOS interrupts deconflicted with reserved hardware interrupts?BIOS 中断如何与保留的硬件中断解除冲突?
【发布时间】:2020-09-19 03:40:58
【问题描述】:

我正在阅读一段内核引导加载程序代码(来自斯坦福的 CS140 Pintos OS):

# Configure serial port so we can report progress without connected VGA.
# See [IntrList] for details.
        sub %dx, %dx                    # Serial port 0.
        mov $0xe3, %al                  # 9600 bps, N-8-1.
                                        # AH is already 0 (Initialize Port).
        int $0x14                       # Destroys AX.

处理器以实地址模式执行这些指令。推测中断是通过找到中断向量表的第 21 个(索引=0x14)条目并在那里执行处理程序来处理的。根据this source,中断表是由BIOS在实模式下初始化的。 This Wikipedia page 列出了可用的 BIOS 中断,包括上面使用的中断。

我的困惑是因为列出的中断异常编号与Intel reference(第 20-6 页)中对实模式保留中断的描述大相径庭(在this Wikipedia page 中也有重复)

这些中断号是如何消除冲突的?

【问题讨论】:

  • 它们没有“消除冲突”。 Intel 为 CPU 使用保留了高达 1Fh 的中断,但 IBM 忽略了这一点,并为其中的大多数分配了其他用途。 Int 0, 1, 3, 6 仅用于与 CPU 相关的含义。特别是int 0Ch "stack fault"int 0Dh "general protection fault" 是有问题的,并且在ROM-BIOS 的默认设置中也用于IRQ 硬件中断。如果需要,处理程序必须特别检查它被调用的原因。 Example
  • 最后到达的人获胜...

标签: assembly x86 serial-port interrupt bios


【解决方案1】:

我认为传奇可以追溯到 IBM 在制造 PC 时没有费心阅读英特尔架构手册。 Intel 从最初的 8086 起,保留了前 32 个向量供硬件使用; IBM 指定 PC BIOS 忽略了这一点,并在 16 开始服务(0x10 - 视频服务);在矢量 5 处有一个奇怪的用于打印视频屏幕的当前页面。向量 5 被边界检查指令使用。

中断 0x10 作为“协处理器错误”继续存在;浮点处理器是可选辅助芯片时的残余。

您关心的中断 0x14 是由 bios 定义的,用于串行端口处理;并被 CPU 作为虚拟化异常。

当您处于实模式时,没有虚拟化;因此不存在冲突。如果您处于虚拟执行模式,并执行 int $0x14,则 cpu 只是跟随 idt;因为 real 虚拟异常是由虚拟机中的访问冲突引起的,并导致 exit 到虚拟机监视器。 [ exit 是管理程序人员使用的术语,用于表示导致虚拟机停止执行的条件]。

所以,没有歧义,只是有点愚蠢地坚持一个糟糕的界面。

【讨论】:

  • 那么存在的“解冲突”是BIOS加载的IVT被内核稍后加载的中断表所取代(并且大概符合Intel的规范)?
  • 是的;目前bios仅用于实模式引导;之后目标操作系统用自己的替换 IVT。
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 2014-12-14
  • 2015-04-07
  • 2012-03-24
  • 2012-07-07
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
相关资源
最近更新 更多