После перезагрузки компьютера компьютер перезагружается - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь реализовать прерывания в проекте операционной системы x86. Однако после загрузки таблицы дескрипторов прерываний с помощью lidt я выполняю команду sti, и эта команда "sti" перезагружает компьютер. А также я нахожусь в защищенном режиме. Есть идеи, что может произойти?

1 Ответ

0 голосов
/ 09 февраля 2020

Некоторые вещи вызывают исключения. Когда ЦП не может запустить соответствующий обработчик исключений, он возвращается к обобщенному исключению "двойной ошибки" c, а когда ЦП не может запустить этот обработчик исключений, ЦП возвращается к состоянию "тройной ошибки", которое в основном означает, что компьютер перезагружен.

Вероятно, имеются ожидающие IRQ (которые произошли, когда прерывания были замаскированы с помощью "cli" и ожидали, пока ЦП будет готов принять их); поэтому, когда вы делаете «sti», контроллер прерываний видит, что ЦПУ готов принять IRQ, и немедленно отправляет его в ЦП; и вероятно, что обработчик прерываний для любого IRQ, который получает ЦП, вызывает исключение (которое приводит к двойной ошибке, которая приводит к тройной ошибке / сбросу).

Самый простой способ выяснить, что происходит, - запустить это под эмулятором, который говорит вам, что произошло в его журналах. Альтернатива состоит в том, чтобы написать используемый обработчик исключений для любых задействованных исключений (наиболее вероятно, обработчик исключений общего сбоя защиты); так что обработчик исключений может дать вам информацию о том, что пошло не так (например, «код ошибки», предоставленный ЦП обработчику ошибок общей защиты, может указывать, какую запись IDT ЦП пытался использовать для IRQ).

Обратите внимание, что во время загрузки лучшая последовательность - замаскировать все IRQ в контроллере / прерываниях, а затем позволить микропрограмме обрабатывать любые ожидающие IRQ (например, с включенными прерываниями, выполнить некоторые инструкции "NOP"). Таким образом, не может быть никаких ожидающих IRQ, когда вы «sti» позже (и вы можете снять маску с отдельных источников IRQ, когда вы на самом деле хотите, чтобы они были не маскированы - например, при установке драйвера устройства, который использует указанный c IRQ). К сожалению, большинство людей (учебные пособия, GRUB и др. c) делают все неправильно и просто "cli", не маскируя IRQ в контроллере (-ах) прерываний (а затем делают такие вещи, как переназначение микросхем PI C и т. Д .; вещи еще более запутанные), а затем в конечном итоге приходится справляться с последствиями делать все неправильно. ; -)

...