В моем классе системного программирования мы работаем над небольшой, простой хобби ОС. Лично я работал над драйвером жесткого диска ATA. Я обнаружил, что одна строка кода, кажется, вызывает ошибку, которая немедленно перезагружает систему. Данный код находится в конце моей процедуры обработки прерываний для прерываний IDE. Поскольку я использовал каналы IDE, они отправляются через подчиненный 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 () - это оболочка для инструкции OUTB x86.
Что такого особенного в моей функции отправки EOI на главный PIC, которая является проблемой?
Я понимаю, что, не увидев код, на это невозможно ответить, но спасибо за просмотр!