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



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

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

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

所以,这在概念上看起来很简单,但我知道细节会更毛茸茸的。 我在网上找到了一些东西,但术语差异很大,这些例子似乎来自我没有的上下文(比如来自 Linux 内核(。

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

  1. 向 PIC 发送一些数据(outb和不发送什么(来初始化它。
  2. 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数能够成为信号处理程序。
  3. lidt加载表。

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

当您的 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 设置在英特尔和 AMD CPU 文档中进行了描述。一切都在那里。不是最愉快的阅读,而是最详细和权威的。

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

最新更新