«STI», в защищенном режиме процессор перезагрузится - PullRequest
0 голосов
/ 23 марта 2010

Платформа INTEL X86. Моя программа запускается с абсолютного адреса 2M в защищенном режиме, все выглядит нормально, но когда я включаю прерывание с помощью «sti», процессор перезагружается. Зачем? есть ли необходимая инициализация перед "прерыванием enbale"? Я настроил idtptr, но, похоже, ничего не получается.

Ответы [ 4 ]

1 голос
/ 08 марта 2012

У вас либо не определена IDT, либо вы сделали это неправильно.Согласно одному из ваших комментариев », но я использовал« sidt », база и лимит правильные» ... SIDT - это «Таблица дескрипторов прерываний магазина».Вам нужно использовать LIDT для загрузки IDT и IDTR.

Кроме того, у вас должны быть определены обработчики для каждого исключения процессора Intel (например, GPF, PF и т. Д.).См. Руководства для программистов Intel 3A и 3B.

Также неплохо было бы маскировать любые IRQ на PIC или IO APIC, пока вы не напишите обработчики (драйверы) для них.

0 голосов
/ 12 марта 2014

С вероятностью 99% вы испытали явление, называемое тройной недостаток.Согласно архитектуре IA-32, в случае возникновения исключительной ситуации CPU автоматически пытается выполнить соответствующий обработчик исключений.Если эта попытка приводит к другому исключению (эта ситуация называется двойной ошибкой), тогда CPU пытается выполнить обработчик исключений двойной ошибки (0x08 в IDT).Если во время этой попытки сработает еще одно исключение, тогда CPU переходит в состояние тройного сбоя.Процессор отвечает на него циклом выключения, это обычно приводит к тому, что оборудование материнской платы инициирует сброс процессора, что, в свою очередь, приводит к перезагрузке всего компьютера.

В вашем случае вы выполняете следующую последовательность действий:

interrupt from some device -> exception -> exception    -> reset
normal execution           -> fault     -> double fault -> triple fault

Убедитесь, что вы правильно инициализировали IDT со всеми 256 установленными дескрипторами, каждый из которых указывает на правильный обработчик.Заметка!Вам разрешено загружать IDT с таблицей произвольного размера.Но это не означает, что процессор просто перестает получать прерывания и исключения с векторами, выходящими за пределы таблицы!Фактически каждое из этих прерываний приведет к общему исключению защиты!

0 голосов
/ 23 марта 2010

Процессор, вероятно, имеет три ошибки, что происходит, когда возникает исключение при обработке двойной ошибки. При трехкратном сбое ЦП он сбрасывается.

Вероятно, это связано с неправильной настройкой таблицы дескрипторов прерываний.

В OSDev Wiki есть хорошая статья, которая может вам помочь: http://wiki.osdev.org/Interrupt_Descriptor_Table

0 голосов
/ 23 марта 2010

Есть ли у вас обработчики прерываний, которые будут работать в защищенном режиме?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...