【发布时间】:2012-09-02 08:32:10
【问题描述】:
我正在开发一个操作系统,我正在尝试让 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
【问题讨论】:
-
什么是 GruntyOS.IO.Ports.Outb 实现类型?
-
它将一个字节输出到一个端口,相当于 C 中的 outb。我有几个使用它的驱动程序都可以正常工作。
-
它使用中断吗?还是只是类似“in src, dest”的指令?
-
C 中没有
outb()。您必须向我们提供更多信息,说明您在做什么、何时、如何以及为什么。网上有大量参考代码可用于使用 PIT 和 PIC。你有什么不同? -
清除掩码将很快让您获得定时器中断。中断处理程序是否正确安装并正常工作?否则,未处理的 IRQ0 将阻塞其他中断。
标签: assembly operating-system irq