【问题标题】:x86 Clearing IRQ mask hangs OSx86 清除 IRQ 掩码挂起操作系统
【发布时间】: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


【解决方案1】:

您应该始终尽可能缩短中断子例程。与 x86 架构一起使用的 PIC 将使用它的掩码同时处理相同优先级的中断,但是当中断发生在 ISR 内时就会出现问题。我认为可能是更好的方法是简单地提高一个标志(将一个可从您的 ISR 访问的变量设置为 True 或其他),并且在您的操作系统分配的量子之间,您可以按照您所展示的那样刷新您的掩码。或者使用一个 quanta 来完成它,因为您的调度策略认为合适。如果您的操作系统不是抢占式的,您可能需要退出 ISR,进行刷新,然后返回到用户程序。

不过,您的问题似乎不是这个。您应该获得一个好的调试器或模拟器,以便能够了解您的情况发生了什么。

如果引发未初始化的中断,则可能会发生此行为。如果可以,您应该使用调试器检查操作系统崩溃时的执行位置。它是否进入了一个使 CPU 停止的通用 IRQ 函数?这是多个嵌入式芯片的默认行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2018-08-03
    • 2010-12-04
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多