【发布时间】:2012-05-09 07:37:21
【问题描述】:
我正在编写一个小内核,只是为了稍微了解一下底层的东西。现在,它在 Virtual Box 中启动,我可以在屏幕上显示文本、分配一些内存以及其他非常基本的事情。它是用 C++ 和一点 asm 编写的。
我想探索的一件事是多任务处理背后的机制。据我了解,它是这样的:
- 内核初始化中断描述符表,以便定期(例如一毫秒)发出中断并调用内核中定义的例程。
- 当例程被调用时,它可以决定将代码/数据段和堆栈指针设置为另一个程序的上下文,即“上下文切换”。
所以,它在概念上似乎很简单,但我知道细节会更加复杂。我在网上找到了一些东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如来自 Linux 内核)。
但是,设置描述符表的方式似乎是这样的:
- 向 PIC(
outb等)发送一些数据以对其进行初始化。 - 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数能够成为信号处理程序。
- 使用
lidt加载表。
但是,我找不到太多关于具体做这些事情的信息,或者这是否正确。有没有人为困惑的内核编写者提供资源?
【问题讨论】:
-
有趣的问题,这里有一个很酷的社区:osdever.net 不是直接回答你的问题,而是那里有一些有用的信息。
-
在 osdev.org 上可以找到更好的社区(包括论坛和 wiki,以及某种相关的 irc 频道 - #osdev @ irc.freenode.net)。
标签: x86 kernel interrupt-handling osdev context-switch