(编写内核)如何修改中断描述符表?

时间:2012-04-29 03:49:35

标签: x86 kernel interrupt-handling osdev context-switch

我正在编写一个小内核,只是为了解决一些低级别的问题。现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西。它是用C ++和一点点asm编写的。

我想探索的一件事是多任务背后的机制。据我了解,它是这样的:

  1. 内核初始化中断描述符表,以便定期发出中断(例如毫秒)并调用内核中定义的例程。
  2. 当调用例程时,它可以决定将代码/数据段和堆栈指针设置为另一个程序的上下文,即“上下文切换”。
  3. 所以,它在概念上似乎很简单,但我知道细节会更加毛茸茸。我发现了一些在线的东西,但是术语变化很大,而且这些例子似乎来自我没有的上下文(比如在Linux内核中)。

    但是,设置描述符表的方式似乎是这样的:

    1. 将一些数据发送到PIC(outb以及什么不是)以初始化它。
    2. 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数可以作为信号处理程序。
    3. 使用lidt
    4. 加载表格

      但是,我找不到具体做这些事情,或者这是否正确。有没有人为困惑的内核编写者提供资源?

2 个答案:

答案 0 :(得分:6)

当您的PC启动时,BIOS会对PIC进行编程,使IRQ0到IRQ15绑定到int 8到int 0Fh和int 70h到int 77h。这对于实际地址模式是可以的,其中BIOS运行并且MSDOS工作。

但是在切换到保护模式时需要更改此映射,因为一些重要的例外是在int 8到int 0Fh(最值得注意的是,#GP,#SS,#PF)。您希望这样,因为您希望能够轻松区分来自定时器和实时时钟,键盘和鼠标,磁盘和I / O端口(串行和并行)的这些异常和硬件中断。

这可能是您已经概述的第一步。因此,在线查看" PIC中断重映射"或类似的东西。此外,下载8259芯片(PIC)的一些规格,以更好地了解您正在做什么以及它实际如何工作。 " HelpPC"是一个很好的旧参考,包含有关各种PC硬件的一些信息。

还有" PCGPE" (PC游戏编程百科全书)和" RBIL" (拉尔夫·布朗的中断名单)可能会有很多帮助。

IVT / IDT设置在Intel和AMD CPU文档中有所描述。它就在那里。不是最愉快的阅读,但最详细和权威。

有许多家庭酿造操作系统爱好者等网站,您可以在其中找到更多详细信息和代码片段。

答案 1 :(得分:6)

这个问题的答案太大了,不适合这里。我将建议两种能为您提供必要知识的资源:

  • JamesM's kernel development tutorial将引导您完成一个涵盖此内容的基本内核的开发。您需要特别注意第4章和第5章。它附带完整的代码。
  • OSDev.org参考资料。包含您需要的所有技术信息。比教程更详细和精确。

如果您真的想了解这些内容,我建议您阅读OSDev中的文章,尝试自己编写所有内容。从启动,屏幕输出,pic和irq处理开始。如果您遇到困难,请使用本教程。