【发布时间】:2016-01-07 06:21:32
【问题描述】:
编辑:对于源代码,您可以查看我在 Github 上的 repo: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中。我的操作系统有一些基本功能:
- 引导加载程序
- 32 位保护模式。
- 系统调用(从用户空间到内核再返回)
- 初始中断支持:到目前为止,我可以处理除以 0 或显式中断调用(即
int 1)。我已经激活了 PIC (pic.inc) 并想尝试一下,因为我在 0x32 处映射了 PIC 中断。但是,在添加第 15 个 IDT 条目后,我得到了三重错误,而第 14 个及以下则没有这样的问题。
【问题讨论】:
-
您应该提供更多代码(最好是完整的可运行代码)。您无需跳过 IDT 中的保留条目。
-
所以你从真实模式切换到保护模式,然后崩溃了?是什么让您认为这与中断描述符表及其特定条目有关?
-
@DanielJour 虽然很难判断某个特定条目是否是造成该问题的原因,但我认为 IDT 是值得关注的,尤其是因为处理器似乎出现了三重故障(这将是Bochs 跳到 f000:fff0) 的解释
-
@MichaelPetch 确实,IDT 是一个合理的东西,但 GDT 也是如此(如果它无效,或者 GDTR 中的大小错误,或者......)和许多其他东西那可能出错了。如果没有进一步的背景,这只是模糊的猜测。
-
@DanielJour 不,我在哪里说过你不应该看 GDT(或其他任何东西)。但我提到了 IDT,因为它是您讨论点(和 OP)的一部分。到目前为止,我似乎是唯一一个真正投票结束这个问题的人,因为没有足够的信息。
标签: assembly x86 operating-system nasm osdev