在使用PIT安装irqs并通过sti启用中断后,我将获得连续的GPF。
这是:
中的IRQ处理程序代码 void irq_handler(struct regs *r)
{
void (*handler)(struct regs *r);
handler = irq_routines[r->int_no - 32];
if (handler)
handler(r);
if (r->int_no >= 40)
{
outportb(0xA0, 0x20);
}
outportb(0x20, 0x20);
}
irq_rountine是一个函数指针数组。我相信我的IDT实现(结构)是正确的,并通过 idt_set_gate(32,(无符号)irq0,0x08,0x8E)设置IRQ。
main.asm中的IRQ公共处理程序代码:
irq_common_stub:
pusha
push %ds
push %es
push %fs
push %gs
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %esp, %eax
push %eax
mov $irq_handler, %eax
call *%eax
pop %eax
pop %gs
pop %fs
pop %es
pop %ds
popa
add $0x8, %esp
iret