You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加硬件中断(IRQ)处理模块后操作系统崩溃、中断无法正常工作的问题求助

添加硬件中断(IRQ)处理模块后操作系统崩溃、中断无法正常工作的问题求助

大家好,我正在开发一个简易操作系统,之前已经成功搭建了IDT表,ISR(中断服务例程)部分也能正常运行。但当我加入IRQ(硬件中断)处理模块后,系统开始出现崩溃,中断也无法正确处理了。另外我原本预期IRQ0(连接到系统定时器)会持续被触发,但实际完全没看到这个现象。

先给大家贴一下相关代码:

isr.c 代码

ISR_handler ISR_handlerArray[256];

void CDECL ISR_regsHandler(Registers_t* regs){
    if (ISR_handlerArray[regs->interrupt] != 0){
        ISR_handlerArray[regs->interrupt](regs);
    } else if (regs->interrupt >= 32) {                                                         // this is a regular interrupt
        QemuPrintf("Unhandeled interrupt %d --> 0x%x\n", regs->interrupt, regs->interrupt);
    } else {                                                                                    // this is an exception
        QemuPrintf("Unhandeled exception %x: ", regs->interrupt);
        QemuPrintf("%s\n", g_Exceptions[regs->interrupt]);
        QemuPrintf("Registers values: \neax->%x ebx->%x ecx->%x edx->%x ebp->%x esi->%x edi->%x\n", regs->eax, regs->ebx, regs->ecx, regs->edx, regs->ebp, regs->esi, regs->edi);
        QemuPrintf("eip->%x cs->%x eflags->%x esp->%x ss->%x\n", regs->eip, regs->cs, regs->eflags, regs->esp, regs->ss);
        QemuPrintf("Interrupt->%x, error_code->%x\n", regs->interrupt, regs->error);
        QemuPrintf("KERNEL PANIC!!\n\n");
        CLI();
        HLT();
    }
}

void ISR_RegisterHandler(i32 isr, ISR_handler handler){
    ISR_handlerArray[isr] = handler;
}

irq.c 代码

#define PIC_OFFSET 0x20

IRQ_Handler g_IRQHandlers[16];

void IRQ_handler(Registers_t *regs){
    u8 irq = regs->interrupt - PIC_OFFSET;
    if (g_IRQHandlers[irq] != 0){
        g_IRQHandlers[irq](regs);
    } else {
        QemuPrintf("Unhandled IRQ %d\n", irq);
    }
    PIC_sendEOI(irq);
}

void IRQ_init(){
    pic_init(PIC_OFFSET, PIC_OFFSET + 8);
    // register each hardware interrupt
    for(u8 i=0; i<16; i++){
        ISR_RegisterHandler(PIC_OFFSET + i, IRQ_handler);
    }
}

void IRQ_RegisterHandler(i32 irq, IRQ_Handler handler){
    // register the handler for the specific IRQ
    g_IRQHandlers[irq] = handler;
}

之前只使用isr.c的时候系统运行一切正常,但加入irq.c后就开始出问题。我排查了半天,不确定是不是PIC初始化或者EOI发送的逻辑有问题,还是IRQ和ISR的注册环节存在冲突?有没有大佬能帮我看看哪里可能出问题了?

备注:内容来源于stack exchange,提问作者neta cohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:43:06