在 8259A PIC 触发中断后收到页面错误

问题描述 投票:0回答:0

我正在学习如何使用 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 持有一个可疑的线性地址,我不认为它与页面错误有关。

这可能是竞争条件还是什么?

assembly x86-64 interrupt osdev page-fault
© www.soinside.com 2019 - 2024. All rights reserved.