Как узнать, является ли прерывание аппаратным прерыванием или исключением процессора

Я изучал прерывания на x86 и то, как ядро ​​обрабатывает различные прерывания с помощью обработчиков прерываний. Но одна вещь меня смущает.

Я знаю, что прерывания могут быть сгенерированы аппаратно, например прерывания диска и таймера, или они могут быть исключениями ЦП, такими как сбои страниц, деление на ноль исключений и т. Д. Что Меня смущает то, что некоторые коды int используются для обработки обоих (в частности, INT 08 - 0F). Например, в списке Ральфа Брауна сказано, что прерывание INT 09h удваивается как аппаратное прерывание KEYBOARD DATA READY, так и исключение COPROCESSOR SEGMENT OVERRUN.

Итак, мой вопрос, учитывая такие прерывания, как обработчик прерывания узнает, какое прерывание обрабатывать?


person Leo Aso    schedule 24.03.2013    source источник
comment
Довольно больно отвечать на эти вопросы. То, что вы узнали о программировании на ассемблере, сильно устарело. Он действовал 28 лет назад и был разработан для машины без сопроцессора. Современные машины намного более продвинуты, они используют операционную систему защищенного режима и, прежде всего, гораздо более сложный контроллер прерываний.   -  person Hans Passant    schedule 24.03.2013
comment
@HansPassant, не могли бы вы добавить актуальную терминологию или ключевые слова для продолжения такого исследования в более актуальном направлении? (например, ссылки из словаря контроллера прерываний или сопроцессора)   -  person n611x007    schedule 08.07.2014


Ответы (1)


x86 обычно не позволяет различать аппаратные и программные прерывания. Обработчик исключений должен запросить внешнее оборудование или другие средства для устранения неоднозначности двух случаев.

Чтобы избежать хаоса, системы могут предотвратить перегрузку одного и того же вектора, установив уровень привилегий в соответствующей записи таблицы дескрипторов прерываний. Инструкция INT пользовательского режима (CPL = 3) не может генерировать программную исключительную ситуацию для привилегированного вектора.

За некоторыми исключениями процессор помещает дополнительное слово кода ошибки в кадр стека исключений. В поле кода ошибки есть бит «EXT», указывающий, вызвано ли исключение внешним прерыванием. В разделе 6.13 руководства IA, том 3, говорится:

EXT Внешнее событие (бит 0) - если установлен, указывает, что исключение произошло во время доставки события, внешнего по отношению к программе, такого как прерывание или более раннее исключение.

Однако только несколько исключений подталкивают поле кода ошибки, и все они являются исключениями процессора ниже вектора 32.

-- РЕДАКТИРОВАТЬ --

Еще кое-что: не дайте себя обмануть «Воротам-ловушкам» и «Воротам прерывания». Прерывания могут проходить через ворота-ловушки, а INT - через ворота прерывания. Единственное отличие - это обработка состояния разрешения прерывания при входе в функцию-обработчик.

person srking    schedule 24.03.2013