BIOS 中断如何与保留的硬件中断冲突?

sou*_*ent 6 x86 assembly serial-port interrupt bios

我正在阅读一段内核引导加载程序代码(来自斯坦福大学的 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.
Run Code Online (Sandbox Code Playgroud)

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

我的困惑来自这样一个事实,即列出的中断异常编号与Intel 参考(第 20-6 页)中对实模式保留中断的描述实质上冲突(并且也在此维基百科页面中重复)

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

mev*_*ets 6

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

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

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

当您处于实模式时,没有虚拟化;因此不存在冲突。如果是虚拟执行模式,执行一个int $0x14,cpu就跟在idt后面;因为真正的虚拟异常是由虚拟机中的访问冲突引起的,并导致退出虚拟机监视器。[退出是管理程序人员用于导致虚拟机停止执行的条件的术语]。

因此,没有歧义,只是对构建不良的界面有点愚蠢的坚持。