编辑:对于源代码,您可以在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.inc和idt.inc。我的操作系统有一些基本功能:
int 1
)。我已经激活了PIC(pic.inc),并且想要尝试一下,因为我将PIC中断映射到0x32。然而,在添加第15个IDT条目后,我得到了三重故障,而第14个和向下我没有这样的问题。答案 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
我知道我应该开始编写一个文件系统,但是我会稍后再介绍它,因为内核对我来说更优先。