我正在开发一个操作系统,我正在尝试让一个 PIC 计时器工作。它是一个在保护模式下运行的 32 位操作系统。这段代码挂起操作系统,(我不知道为什么,这就是我想要找出的)。我正在清除 IRQ0 掩码。这段代码有什么问题,还是 IDT 或 PIC 有问题?此外,我有几个软件中断处理程序工作得很好,所以我认为它与 IDT 无关。
public static void IRQ_clear_mask(byte IRQline)
{
ushort port;
byte value;
if (IRQline < 8)
{
port = 0x21;
}
else
{
port = 0xA1;
IRQline -= 8;
}
value = (byte)(GruntyOS.IO.Ports.Inb(port) & ~(1 << IRQline));
GruntyOS.IO.Ports.Outb(port, value);
}
mov byte [_NATIVE_IDT_Contents + 254], AL
mov byte [_NATIVE_IDT_Contents + 255], AH
mov dword EAX, irq_common_stub
mov byte [_NATIVE_IDT_Contents + 0x100], AL
mov byte [_NATIVE_IDT_Contents + 0x101], AH
mov byte [_NATIVE_IDT_Contents + 0x102], 0x8
mov byte [_NATIVE_IDT_Contents + 0x105], 0x8E