Как функция OUTB сборки может вызвать тройной сбой? - PullRequest
2 голосов
/ 20 мая 2009

В моем классе системного программирования мы работаем над небольшой, простой хобби ОС. Лично я работал над драйвером жесткого диска 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, которая является проблемой?

Я понимаю, что, не увидев код, на это невозможно ответить, но спасибо за просмотр!

Ответы [ 2 ]

3 голосов
/ 01 июня 2009

Тройные ошибки обычно указывают на переполнение стека или нечетный указатель стека. Когда происходит сбой или прерывание, система немедленно пытается вставить еще один мусор в стек (перед вызовом обработчика ошибок). Если стек подключен, это вызовет другую ошибку, которая затем попытается поместить больше материала в стек, что вызовет другую ошибку. В этот момент система разочаровывается и перезагружается.

Я знаю это, потому что на самом деле у меня есть глупый патент (когда я работал в Dell около 20 лет назад) на способ сброса процессора без внешнего оборудования (раньше это делалось через контроллер клавиатуры):

   MOV ESP,1
   PUSH EAX    ; triple fault and reset!

Инструкция OUTB не может сама по себе вызвать ошибку. Я предполагаю, что вы повторно активируете прерывание, и прерывание срабатывает, когда что-то не так с вашим стеком.

1 голос
/ 20 мая 2009

Когда вы повторно активируете PIC, вы делаете это с установленным флагом прерывания процессора или сбрасываете (то есть делаете ли вы это когда-нибудь после кода операции CLI или, иногда, после кода операции STI)?

Предполагая, что флаг прерывания ЦПУ включен, ваш акт повторного включения PIC позволяет любым ожидающим прерываниям достигать ЦП: что приведет к прерыванию вашего кода, передаче к вектору, указанному в IDT, и т. Д.

Таким образом, я ожидаю, что это не ваш код операции, который непосредственно вызывает ошибку: скорее, ошибкой является код, который запускается в результате прерывания, которое происходит в результате повторного включения PIC.

...