如何处理中断描述符中的第 15 个条目 Table

How to handle 15th entry in Interrupt Descriptor Table

编辑:对于源代码,你可以在Github上查看我的repo:https://github.com/tuhdo/os-study.

我将 2 个 PIC (x86) 上的 IRQ 映射到 IDT 中的条目 32 及以后。为了测试 PIC 中断,我将前 31 个例程放在同一个函数中。问题是,我无法让第 15 个中断入口工作,因为它是根据 Interrupt Vector Table 保留的。也就是说,每当我进入保护模式时,在cr0中启用模式并跳转到内核中的第一条指令space([=13=中的最后一行],即jmp 08h:0xFF0),它崩溃了(在 Bochs 中,它跳转到地址 f000:fff0,当出现问题时会发生这种情况)。无需添加第 15 个条目,我可以执行所有代码并使用 hlt 指令正确终止。

既然条目是保留的,那么如何跳过15h条目呢?目前,我的通用 IDT 条目如下所示:

;; IRQ0
  dw   0
  dw   0x30        ; gdt selector 0x30
  db   0
  db   011001110b  ; interrupt gate callable from userspace
  dw   0

相关代码在gdt.inc and idt.inc。我的 OS 有一些基本特征:

我知道出了什么问题。原因是,我只为 stage2.asm 分配了一个扇区,但添加更多条目会使第 2 阶段引导加载程序超过 512 字节。因此,IDT在加载时出现畸形并发生故障。

我在 Makefile 中更改了仅分配 1 个扇区的这一行:

dd if=$(BUILD_DIR)/stage2.bin of=disk.dsk bs=512 count=1 seek=1

分配3个扇区:

dd if=$(BUILD_DIR)/stage2.bin of=disk.dsk bs=512 count=3 seek=1

我知道我应该开始写一个文件系统,但我会稍后再写,因为内核对我来说具有更高的优先级。