Я изучал прерывания на x86 и то, как ядро обрабатывает различные прерывания с помощью обработчиков прерываний. Но одна вещь меня смущает.
Я знаю, что прерывания могут быть сгенерированы аппаратно, например прерывания диска и таймера, или они могут быть исключениями ЦП, такими как сбои страниц, деление на ноль исключений и т. Д. Что Меня смущает то, что некоторые коды int используются для обработки обоих (в частности, INT 08 - 0F). Например, в списке Ральфа Брауна сказано, что прерывание INT 09h удваивается как аппаратное прерывание KEYBOARD DATA READY
, так и исключение COPROCESSOR SEGMENT OVERRUN
.
Итак, мой вопрос, учитывая такие прерывания, как обработчик прерывания узнает, какое прерывание обрабатывать?
Как узнать, является ли прерывание аппаратным прерыванием или исключением процессора
Ответы (1)
x86 обычно не позволяет различать аппаратные и программные прерывания. Обработчик исключений должен запросить внешнее оборудование или другие средства для устранения неоднозначности двух случаев.
Чтобы избежать хаоса, системы могут предотвратить перегрузку одного и того же вектора, установив уровень привилегий в соответствующей записи таблицы дескрипторов прерываний. Инструкция INT пользовательского режима (CPL = 3) не может генерировать программную исключительную ситуацию для привилегированного вектора.
За некоторыми исключениями процессор помещает дополнительное слово кода ошибки в кадр стека исключений. В поле кода ошибки есть бит «EXT», указывающий, вызвано ли исключение внешним прерыванием. В разделе 6.13 руководства IA, том 3, говорится:
EXT Внешнее событие (бит 0) - если установлен, указывает, что исключение произошло во время доставки события, внешнего по отношению к программе, такого как прерывание или более раннее исключение.
Однако только несколько исключений подталкивают поле кода ошибки, и все они являются исключениями процессора ниже вектора 32.
-- РЕДАКТИРОВАТЬ --
Еще кое-что: не дайте себя обмануть «Воротам-ловушкам» и «Воротам прерывания». Прерывания могут проходить через ворота-ловушки, а INT - через ворота прерывания. Единственное отличие - это обработка состояния разрешения прерывания при входе в функцию-обработчик.