【问题标题】:(Writing kernel) How do I modify the interrupt descriptor table?(写内核)如何修改中断描述符表?
【发布时间】:2012-05-09 07:37:21
【问题描述】:

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

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

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

所以,它在概念上似乎很简单,但我知道细节会更加复杂。我在网上找到了一些东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如来自 Linux 内核)。

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

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

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

【问题讨论】:

  • 有趣的问题,这里有一个很酷的社区:osdever.net 不是直接回答你的问题,而是那里有一些有用的信息。
  • 在 osdev.org 上可以找到更好的社区(包括论坛和 wiki,以及某种相关的 irc 频道 - #osdev @ irc.freenode.net)。

标签: x86 kernel interrupt-handling osdev context-switch


【解决方案1】:

当您的 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”(拉尔夫布朗的中断列表)可能会有很大帮助。

Intel 和 AMD CPU 文档中描述了 IVT/IDT 设置。这一切都在那里。不是最愉快的阅读,而是最详细和最权威的。

有很多自制操作系统爱好者之类的网站,您可以在其中找到更多详细信息和代码的sn-ps。

【讨论】:

  • 我之前确实看到过一些重映射代码。所以,我可能误解了保护模式和实模式的细节,但据我了解,内核以实模式运行,但可以在用户程序运行时切换到保护模式。但是,它不是在上下文切换时切换到实模式吗?那是由中断完成的,对吧?在受保护的程序运行之前,中断是否只需要重新映射一次?
  • 通常情况下,如果有任何开关,它是从真实到受保护的,并且只进行一次,很早,当内核启动时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2019-02-09
  • 2015-04-07
  • 2019-01-29
  • 2013-05-30
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多