【问题标题】:How to handle 15th entry in Interrupt Descriptor Table如何处理中断描述符表中的第 15 个条目
【发布时间】: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


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2015-08-05
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2013-05-30
    • 2011-10-12
    • 2015-02-20
    相关资源
    最近更新 更多