我正在学习如何使用 8259A PIC。然而,当我按下键盘时,页面错误处理程序被触发,正确的处理程序没有被调用。
下面是我的源代码片段和截图:
//file: main.c
void Start_Kernel(void) {
printf("kernel started, function %s running\n", __FUNCTION__);
RegisterHandlerIrq();
Register8259AIrq();
//int i=1/0;
while (1) {
;
}
return;
}
//file: 8259A_handler.c
extern void Register8259AIrq() {
printf("initializing 8259A controller\n");
//8259A master icw
SetMasterIcw(0x11, 0x20, 0x04, 0x01);
//8259A slave icw
SetSlaveIcw(0x11, 0x28, 0x02, 0x01);
//8259A ocw1
InitMasterOcw1(0xfd);
InitSlaveOcw1(0xff);
printf("registering irq for pic\n");
for (int i=0x20;i<0x30;i++) {
SetIdtEntry(i, Isr_8259A_General, 0x8, 0, 0xe, 1);
}
__asm__ __volatile__ ("sti":::);
printf("done\n");
return;
}
extern void PicHandlerGeneral(unsigned long RegTablePtr, unsigned long nr) {
printf("%s just got invoked\n", __PRETTY_FUNCTION__);
out_b(PORT0_8259A_MASTER,0x20);
return;
}
0xffff800000104087处的指令是一个
nop;jmp -3
循环
这是我已经查看过的一些网站
https://forum.osdev.org/viewtopic.php?f=1&t=27370
https://wiki.osdev.org/I_Can't_Get_Interrupts_Working
我不认为这是双重故障或与 GDT 相关的问题。该页面也正确映射。
CR2 持有一个可疑的线性地址,我不认为它与页面错误有关。
这可能是竞争条件还是什么?