Память. Верхний уровень

Память. Верхний уровень

Прерывания в защищенном режиме

Источниками запросов, "запускающих" процесс входа в прерывание могут быть события трех типов: аппаратные прерывания, исключения и программные прерывания (см. таблица ниже). В свою очередь, исключения подразделяются на: отказы (fault), ловушки (trap) и выходы из процесса (abort). Они различаются по способу реакции процессора.

Отказ регистрируется на границе (во времени) между командами до начала выполнения команды, вызвавшей прерывание (например, исключение по защите памяти или по делению на нуль). Это означает, что в стеке сохраняется адрес команды, вызвавшей исключение, а не адрес следущией команды. В ряде случаев после адекватной реакции на прерывание есть возможность снова вернуться к выполнению прерванной программы именно с команды, вызвавшей отказ. Например, по прерыванию "страничная ошибка", возникающему при обращении к странице, остутствующей в памяти, управление передается операционной системе. Она производит подгрузку в память отсутствующей страницы, после чего можно возобновить выполнение команды, вызвавшей страничную ошибку.

Ловушка регистрируется также на границе между командами, но после окончания команды, вызвавшей прерывание, в стеке сохраняется адрес следующей команды. Примеры ловушек - программные прерывания INTO или INT3.

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

 

 

Векторы прерываний в защищенном режиме

Таблица дескрипторов прерываний

Переход на обработчик происходит через дескрипторы, содержащиеся в таблице дескрипторов прерываний Interrupt Descriptor Table (IDT). Каждый дескриптор связывает источник прерывания или исключения с подпрограммой (шлюз подпрограммы-обработчика) или с задачей (шлюз задачи) которая будет вызвана в ответ на событие, связанное с прерыванием (см. рисунок ниже).

Схема вызова обработчика прерывания

Начало и предел IDT содержатся в регистре IDT (RIDT). Таким образом, таблица шлюзов прерываний может находиться в любом месте физической памяти (в отличие от реального режима, где таблица векторов находится в младших адресах). Более того, ничто не мешает иметь системе несколько IDT. Для переключения на новую IDT требуется всего лишь изменить значение RIDT, для чего имеются привилегированные команды LIDT и SIDT.

Далее приведен формат дескрипторов шлюзов, которые могут содержаться в IDT (см. рисунок ниже).

Формат дескрипторов шлюзов

Подобно тому, как команда CALL может вызвать подпрограмму или задачу, прерывание (или исключение) может вызвать обработчкик, оформленный в виде подпрограммы обработки прерывания или в виде задачи (см. рисунок ниже).

Схема вызова программы через шлюз прерывания
Яндекс.Метрика