我想知道,如何在我自己用 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 的 0x020
和 0x21
处找到,以及 0xA0
和 0xA1 处
用于从 PIC。有四种不同的 ICW 或初始化命令字可用于对这两个 PIC 进行编程。为了设置级联,您需要在端口 0x20
上向主 PIC 发送 ICW1,并将第二位设置为 1
以告诉 PIC处于级联模式。然后,您需要将 ICW3 值 0x02
写入端口 0x21
,以告诉主 pic 它将在第二个引脚上从从 PIC 接收从 INT 信号。最后,您需要在 0xA0
和 0xA1
处对第二个从 PIC 编程正确的 ICW,以便取消屏蔽并启用 IRQ8 上的 RTC(即从 PIC 的第一个中断)别针)。此时您还可以对从 PIC 进行编程,以将适当的中断值偏移请求到中断处理程序所在的 IDT 中。
有相当多的文档介绍如何将 ICW(初始化命令字)和 OCW(操作命令字)正确发送到每个 PIC 各自的端口。其中许多命令都是连续的,这意味着您需要按照特定的顺序执行几个步骤,因为有 4 个 ICW 和 3 个 OCW,但您只需将它们写入每个 PIC 的两个 8 位端口。有关每种类型的位掩码的快速引用,您可以引用 http://stanislavs.org/helppc/8259.html ,但如果您不熟悉编程端口等,我建议您也寻找一些额外的文档。例如,编程端口需要一些汇编...如果您愿意,您可以制作一些包装器,但您将需要 x86 IN
和 OUT
汇编命令,以及特定寄存器的控制,例如 AX
、AL
和 DX
读取和写入端口。
最后,如果上述方法均不起作用,您可能需要实际解析英特尔 MP 表,以弄清楚您的平台是如何连接的......
关于c++ - 如何在我的操作系统内核中启用 IRQ8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7243683/