在我的系统编程课上,我们正在研究一个小型、简单的爱好操作系统。我个人一直在研究 ATA 硬盘驱动程序。我发现一行代码似乎会导致错误,然后立即重新启动系统。有问题的代码位于我的 IDE 中断中断服务程序的末尾。由于我使用的是 IDE 通道,因此它们是通过从 PIC(通过主 PIC 级联)发送的。最初我的代码只是将中断结束字节发送到从站,但后来我的教授告诉我,我也应该将它发送到主 PIC。
所以这是我的问题,当我取消注释将 EOI 字节发送到主 PIC 的行时,系统会出现三重故障,然后重新启动。同样,如果我留下评论,系统将继续运行。
_outb( PIC_MASTER_CMD_PORT, PIC_EOI ); // this causes (or at least sets off) a triple fault reboot
_outb( PIC_SLAVE_CMD_PORT, PIC_EOI );
在没有看到系统的其余部分的情况下,是否有人可以解释这里可能发生的事情?
注意:就像在黑暗中拍摄一样,我用另一个 _outb() 调用替换了 _outb() 调用,这只是确保为 IDE 控制器启用了中断,但是,生成的程序集几乎是相同的。这并没有导致故障。
*_outb() 是 x86 OUTB 指令的包装器。
我将 EOI 发送给主 PIC 的功能有什么特别之处,这是一个问题?
我意识到如果没有看到代码,这可能无法回答,但感谢您的关注!