2012-04-29 93 views
14

我正在编写一个小内核,只是为了在低层次的东西上徘徊一下。现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存以及其他非常基本的东西。它是用C++编写的,有点asm。(编写内核)如何修改中断描述符表?

有一个问题我想探索的东西背后的多任务机制。据我所知,它是这样的:

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

所以,它在概念上看起来很简单,但我知道细节会变得更加多毛。我发现了一些在线的东西,但是术语差别很大,并且这些示例似乎来自我没有的上下文(例如来自Linux内核)。

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

  1. 一些数据发送到PIC(outb和什么,而不是)来初始化它。
  2. 准备中断表在内存中,与函数指针到你想要的,小心的功能是能够被信号处理程序例程。
  3. lidt加载表格。

但是,我无法找到很多具体的做这些事情,或者这是否是正确的。有没有人有困惑的内核作家资源?

+0

有趣的问题,这里是一个很酷的社区:http://www.osdever.net/不是它直接回答你的问题,但有一些有用的信息。 – 2012-04-29 04:51:29

+0

在osdev.org上可以找到更好的社区(包括论坛和wiki,以及种类相关的irc频道 - #osdev @ irc.freenode.net)。 – Griwes 2012-04-29 13:14:06

回答

6

当你的电脑开机时,BIOS程序的PIC在这样一种方式,通过IRQ0 IRQ15必然会通过INT的0Fh至中间体8,通过INT 77H 70H诠释。这对于实际地址模式而言是正常的,在该模式下BIOS运行并且MSDOS工作。

但你需要改变这种映射切换到保护模式时,因为一些重要的例外通过INT的0Fh(最值得注意的是,#GP,#SS,#PF)是在中间体8。您需要这样做,因为您希望能够轻松地区分这些异常和来自定时器和实时时钟,键盘和鼠标,磁盘和I/O端口(串行和并行)的硬件中断。

这可能是你已经列出的第一步。所以,在线查看“PIC中断重映射”或类似的东西。此外,请下载8259芯片(PIC)的一些规格,以更好地了解您正在做什么以及它的实际工作方式。 “HelpPC”是一个很好的旧参考资料,其中包含各种PC硬件上的一些信息。

还有“PCGPE”(PC游戏编程百科全书)和“RBIL”(Ralf Brown的中断列表),可能会有很大帮助。

英特尔和AMD CPU文档中介绍了IVT/IDT设置。它在那里。不是最愉快的阅读,但最详细和权威。

有许多家庭酿造操作系统爱好者等网站,你可以找到更多的细节和代码片段。

+0

我确实看到过一些重映射代码。所以,我可能会误解有关受保护和实模式的细节,但据我了解,内核以实模式运行,但可以在用户程序运行时切换到保护模式。但是,在上下文切换时不会切换到实模式吗?这是通过中断完成的,对吧?在受保护的程序运行之前,中断是否需要重新映射一次? – rovaughn 2012-04-29 16:22:26

+0

通常情况下,如果有任何切换,它是从真实到受保护的,并且只有在内核启动时才会执行一次。 – 2012-04-29 22:35:01

6

这个问题的答案太大了,不适合这里。我会建议两个资源,这将给你必要的知识:

  • JamesM's kernel development tutorial将引导你开发一个非常基本的内核,涵盖了这一点。你需要特别注意第4章和第5章。它带有完整的代码。
  • OSDev.org参考资料。包含您需要的所有技术信息。比教程更详细和更精确。

如果你真的想了解这些东西,我建议你阅读OSDev中的文章,试着自己写一切。从引导,屏幕输出,图片和irq处理开始。如果卡住了,请使用本教程。

+0

詹姆斯莫洛伊的教程非常好,但不应该推荐给新手,因为它让太多代码被复制粘贴,没有太多解释 - 当JamesM发布新系列时,它可能会改变。对于新手来说,www.brokenthorn.com上的教程要好得多。 – Griwes 2012-04-29 13:16:31