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

时间:2015-10-09 10:29:07

标签: assembly x86 operating-system nasm osdev

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

我将2个PIC(x86)上的IRQ映射到IDT中的第32个及以后的入口。为了测试PIC中断,我将前31个例程放在同一个函数中。问题是,我无法获得第15个中断条目,因为它是根据Interrupt Vector Table保留的。也就是说,每当我进入保护模式时,在cr0中启用模式并跳转到内核空间中的第一条指令(stage2.asm中的最后一行,即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.incidt.inc。我的操作系统有一些基本功能:

  • 引导程序
  • 32位保护模式。
  • 系统调用(从用户空间到内核并返回)
  • 初始中断支持:到目前为止,我可以处理除0或显式中断调用(即int 1)。我已经激活了PIC(pic.inc),并且想要尝试一下,因为我将PIC中断映射到0x32。然而,在添加第15个IDT条目后,我得到了三重故障,而第14个和向下我没有这样的问题。

1 个答案:

答案 0 :(得分:1)

我知道出了什么问题。原因是,我只为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

我知道我应该开始编写一个文件系统,但是我会稍后再介绍它,因为内核对我来说更优先。