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

rov*_*ghn 13 x86 kernel osdev context-switch interrupt-handling

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

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

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

因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).

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

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

但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?

Ale*_*nze 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"(拉尔夫布朗的中断列表)可能会有很大帮助.

英特尔和AMD CPU文档中描述了IVT/IDT设置.一切都在那里.不是最愉快的阅读,但最详细和权威.

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