添加硬件中断(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
相关产品推荐
相关产品推荐

