c++ - 如何在我的操作系统内核中启用 IRQ8?

标签 c++ operating-system kernel

我想知道,如何在我自己用 C++ 编写的内核中启用 IRQ8 (RTC)。 我已经有了用于安装中断处理程序的模块。 但安装 IRQ8 中断处理程序后,它不会生成任何中断。 那么如何启用 IRQ8 呢?启用它后它会产生什么中断? 我知道 RTC 生成 INT 70h 中断,但我正在安装 RTC 中断处理程序 IDT 中的 int 29h。所以它不起作用。

请帮忙。

谢谢。

最佳答案

我假设您正在使用基于 x86 的架构,如果是这样,那么您也在使用 8259A 可编程中断 Controller 。如果是这种情况,IRQ8 位于第二个从 PIC 上,通常通过主 PIC 上的 IRQ2 连接。基本上,您必须在主 PIC 上对 IRQ2 进行编程,才能从从 PIC 接收级联 INT 信号。接下来,您必须取消屏蔽第二个从 PIC 上的任何屏蔽中断,在本例中为 IRQ8,RTC 中断通常在其中接线。

控制这两个 PIC 的端口可以在主 PIC 的 0x0200x21 处找到,以及 0xA00xA1 处 用于从 PIC。有四种不同的 ICW 或初始化命令字可用于对这两个 PIC 进行编程。为了设置级联,您需要在端口 0x20 上向主 PIC 发送 ICW1,并将第二位设置为 1 以告诉 PIC处于级联模式。然后,您需要将 ICW3 值 0x02 写入端口 0x21,以告诉主 pic 它将在第二个引脚上从从 PIC 接收从 INT 信号。最后,您需要在 0xA00xA1 处对第二个从 PIC 编程正确的 ICW,以便取消屏蔽并启用 IRQ8 上的 RTC(即从 PIC 的第一个中断)别针)。此时您还可以对从 PIC 进行编程,以将适当的中断值偏移请求到中断处理程序所在的 IDT 中。

有相当多的文档介绍如何将 ICW(初始化命令字)和 OCW(操作命令字)正确发送到每个 PIC 各自的端口。其中许多命令都是连续的,这意味着您需要按照特定的顺序执行几个步骤,因为有 4 个 ICW 和 3 个 OCW,但您只需将它们写入每个 PIC 的两个 8 位端口。有关每种类型的位掩码的快速引用,您可以引用 http://stanislavs.org/helppc/8259.html ,但如果您不熟悉编程端口等,我建议您也寻找一些额外的文档。例如,编程端口需要一些汇编...如果您愿意,您可以制作一些包装器,但您将需要 x86 INOUT 汇编命令,以及特定寄存器的控制,例如 AXALDX 读取和写入端口。

最后,如果上述方法均不起作用,您可能需要实际解析英特尔 MP 表,以弄清楚您的平台是如何连接的......

关于c++ - 如何在我的操作系统内核中启用 IRQ8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7243683/

相关文章:

process - 进程的程序计数器

linux - 内核不在 initrd 上调用/初始化脚本

C++ 简单模板递归

c++ - 在模板派生类中使用协变返回类型覆盖虚拟函数

c - Windows操作系统的C语言软件中断服务例程

linux - 为什么进程之间不能直接通信?

c - 在 Windows 和 Linux 下如何链接到 OS C 库?

linux - LL_ALLOCATED_SPACE 和其他注意事项

c++ - 使用 CMake、CUDA 9.0 RC 和 Visual Studio 2017 安装带有 contrib 模块的 OpenCV 3.3.0

c++ - 如何将托管值类型成员添加到非托管类?