Irq例程导致一般保护错误

时间:2013-07-10 11:52:31

标签: c assembly kernel

在使用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

0 个答案:

没有答案