13

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

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

  1. 内核初始化中断描述符表,以便周期性地(例如毫秒)发出中断并调用内核中定义的例程。
  2. 当例程被调用时,它可以决定将代码/数据段和堆栈指针设置为另一个程序的上下文,即“上下文切换”。

所以,它在概念上似乎很简单,但我知道细节会变得更加复杂。我在网上找到了一些东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如来自 Linux 内核)。

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

  1. 将一些数据发送到 PIC(outb以及其他)以对其进行初始化。
  2. 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数能够成为信号处理程序。
  3. 用 加载表lidt

但是,我找不到太多关于专门做这些事情的信息,或者这是否正确。有没有人有困惑的内核编写者的资源?

4

1 回答 1

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”(Ralf Brown 的中断列表)可能会有很大帮助。

IVT/IDT 设置在 Intel 和 AMD CPU 文档中进行了描述。这一切都在那里。不是最愉快的阅读,而是最详细和最权威的。

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

于 2012-04-29T05:00:34.957 回答