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

13

我正在编写一个小内核,只是为了深入了解一些底层的东西。现在,它能够在虚拟盒子中启动,并且我可以向屏幕显示文本,分配一些内存以及其他非常基础的功能。这个内核是用C++和一些汇编语言编写的。

其中我想探索的之一就是多任务机制的原理。据我所知,它大致如下:

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

因此,概念上似乎很简单,但我知道细节会非常复杂。我在网上找到了一些资料,但术语差异很大,而且示例似乎来自我没有的上下文(比如从Linux内核中)。

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

  1. 向PIC发送一些数据(例如`outb`等)进行初始化。
  2. 在内存中准备一个中断表,其中包含指向要使用的例程的函数指针,同时确保这些函数能够成为信号处理程序。
  3. 使用`lidt`加载该表。

但是,我找不到有关具体执行这些操作的信息,或者这是否正确。有没有资源可以提供给一个困惑的内核编写者呢?


有趣的问题,这里有一个很酷的社区:http://www.osdever.net/ 虽然它并没有直接回答你的问题,但是那里有一些有用的信息。 - Austin Henley
更好的社区(带有论坛和维基,以及在 IRC 频道 #osdev@irc.freenode.net 上的联系)可以在 osdev.org 找到。 - Griwes
1个回答

6
当您的计算机启动时,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文档中有描述。所有内容都在那里。阅读起来可能不是很愉快,但最详细和权威的资料。

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


我之前确实看到过一些重映射代码。因此,我可能对保护模式和实模式的细节有所误解,但据我所知,内核在实模式下运行,但当用户程序运行时可以切换到保护模式。然而,在上下文切换时,它不是会切换到实模式吗?这是通过中断完成的,对吧?在受保护的程序运行之前,中断需要被重新映射一次吗? - rovaughn
通常情况下,如果有任何开关,它都是从实模式到保护模式,并且只在内核启动时进行一次。 - Alexey Frunze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接