Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000544.doc
Скачиваний:
26
Добавлен:
30.04.2022
Размер:
14.75 Mб
Скачать

11.1.4. Ввод и вывод

32-разрядные процессоры позволяют адресовать 64К однобайтных или 32 К двухбайтных регистров в пространстве ввода/вывода. Возможно обращение и к 32-битным портам. При операциях ввода/вывода линии А[16:31] не используются. Адрес порта задается либо в команде (только младший байт, а старший байт — нулевой) либо полный 16-битный адрес берется из регистра DX. Команды ввода/ вывода вызывают шинные циклы с активными сигналами IORD#, IOWR#. Строчные команды обеспечивают блочный ввод/вывод. В адресном пространстве ввода/вывода область 0F8-0FF зарезервирована для использования сопроцессором. При обращении к сопроцессору процессор 80386 выставляет единицу на самой старшей линии шины адреса, что используется для упрощения дешифрации адресов.

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

11.1.5. Прерывания и исключения

Прерывания и исключения нарушают нормальный ход выполнения программы для обработки внешних событий или сообщения о возникновении особых условий или ошибок. Прерывания подразделяются на аппаратные (маскируемые и немаскируемые), вызываемые сигналами на входах процессора и программные, выполняемые по команде INTxx. Программные прерывания – это вызов процедур с использованием механизма прерываний. Аппаратные прерывания подразделяются на маскируемые (вызываемые сигналами на входах INTR) и немаскируемые (вызванные сигналом на входе NMI).

Маскируемые прерывания вызываются переходом в высокий уровень сиг­нала на входе INTR (Interrupt Request) при установленном флаге разрешения (IF=l) в регистре состояния. В этом случае процессор сохраняет в стеке регистр флагов, сбрасы­вает флаг IF и вырабатывает два следующих друг за другом сигнала подтверждения прерывания INTA# (Interrupt Acknowledge). Высокий уровень сигнала INTR должен сохраняться по крайней мере до подтверждения прерывания. По второму импульсу внешний контроллер прерываний передает по шине номер вектора прерывания, обслуживающего устройство требующего прерывание. Обработка текущего прерывания может быть в свою очередь прервана немаскируемым прерыванием, или другим маскируемым аппаратным прерыванием, если обработчик установит флаг IF. Немаскируемые прерывания выполняются независимо от состояния флага IF. Высокий уровень на входе NMI (Non Mascable Interrupt) вызывает прерывание с вектором 2. Обработка немаскируемого прерывания не может прерываться другим немаскируемым прерыванием.

Исключения (Exceptions), или особые случаи, подразделяются на отказы, ловушки и аварийные завершения.

Отказ (fault) — это исключение, которое обнаруживается и обслуживается до выполнения инструкции, вызывающей ошибку. После обслуживания этого исключения управление возвращается снова на ту же инструкцию, которая вызвала отказ. Отказы, использующиеся в системе виртуальной памяти, позволяют, например, подкачать с диска в оперативную память требуемую страницу или сегмент.

Ловушка (trap) — это исключение, которое обнаруживается и обслуживается после выполнения инструкции, его вызывающей. После обслуживания этого исключения управление возвращается на инструкцию, следующую за вызвавшей ловушку. К классу ловушек относятся и программные прерывания.

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

Набор и обработка исключений реального и защищенного режимов различ­ны. Под исключения Intel резервирует векторы 0-31 в таблице прерываний, однако в PC часть из них перекрывается системными прерываниями BIOS и DOS.

Процедура, обслуживающая прерывание или исключение, определяется по таблице прерываний с помощью восьмибитного указателя (вектора) пре­рывания. Номер для программных прерываний задается командой, для маски­руемых аппаратных прерываний вводится от внешнего контроллера во втором цикле INTA# немаскируемое прерывание имеет фиксиро­ванный номер, а исключения генерируют и передают номер вектора внутри про­цессора.

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

Командой LIDT можно изменять положение таблицы в пределах первого мегабайта, а размер (0-3FFh) может быть уменьшен до 0-07Fh. При попытке обслуживания прерывания с номером, выходящим за размер таблицы, генери­руется исключение. В защищенном режиме дескрипторная таблица IDT содержит 8-байтные дескрипторы прерываний. Она может иметь размер от 32 до 256 дескрипторов и рас­полагаться в любом месте физической памяти.