如何处理中断描述符中的第 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 有一些基本特征:
- 引导程序
- 32位保护模式。
- 系统调用(从用户space 到内核再返回)
- 初始中断支持:到目前为止,我可以处理除以 0 或显式中断调用(即
int 1
)。我已经激活了 PIC (pic.inc) 并想尝试一下,因为我将 PIC 中断映射到 0x32。但是,在添加第 15 个 IDT 条目后,我出现了三重错误,而第 14 个及以下我没有这样的问题。
我知道出了什么问题。原因是,我只为 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
我知道我应该开始写一个文件系统,但我会稍后再写,因为内核对我来说具有更高的优先级。
编辑:对于源代码,你可以在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 有一些基本特征:
- 引导程序
- 32位保护模式。
- 系统调用(从用户space 到内核再返回)
- 初始中断支持:到目前为止,我可以处理除以 0 或显式中断调用(即
int 1
)。我已经激活了 PIC (pic.inc) 并想尝试一下,因为我将 PIC 中断映射到 0x32。但是,在添加第 15 个 IDT 条目后,我出现了三重错误,而第 14 个及以下我没有这样的问题。
我知道出了什么问题。原因是,我只为 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
我知道我应该开始写一个文件系统,但我会稍后再写,因为内核对我来说具有更高的优先级。