Skip to content

Прерывания. Обработка прерываний в реальном режиме работы процессора

Ivan Bogatyrev edited this page Jun 12, 2023 · 1 revision

Прерывания. Обработка прерываний в реальном режиме работы процессора

Прерывания

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

Виды прерываний

  • аппаратные (асинхронные) - события от внешних устройств;
  • внутренние (синхронные) - события в самом процессоре, например, деление на ноль;
  • программные - вызванные командой int.

Вектор прерывания

Вектор прерывания - номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний, содержащую адреса обработчиков прерываний. Располагается в самом начале памяти, начиная с адреса 0. Доступно 256 прерываний. Каждый вектор занимает 4 байта - полный адрес. Размер всей таблицы - 1 Кб.

Срабатывание прерываний

  • Сохранение в текущий стек регистра флагов и адреса возврата (адреса следующей команды)
  • Передача управления по адресу обработчика из таблицы векторов
  • Настройка стека (возможно, обработчику прерываний нужен свой стек, потому что стек остается связан с той программой, которая работала до срабатывания прерывания; если обработчик сложный, то иногда такие обработчики перенастраивают стек)
  • Повторная входимость (реентерабельность), необходимость запрета прерываний (Кузнецов: "таймер тикает, срабатывают прерывания. В какой-то момент прерывание тика таймера не успевает отработать до след тика, вызывается еще раз тоже прерывание и нужно обеспечить корректную работу в такой ситуации"; запрет прерывания можно делать только на короткий срок, иначе можно потерять данные (переполнение буфера клавиатуры, например))

Обработка прерываний в реальном режиме

В реальном режиме на x86 архитектуре обработка прерываний осуществляется с использованием векторной таблицы прерываний. Таблица векторов прерывания - это структура данных, начинающаяся с адреса 0000:0000 и содержащая 256 векторов прерываний, каждый из которых занимает 4 байта (2 байта смещения и 2 байта сегмента). Каждый вектор указывает на процедуру обработчика прерываний (Interrupt Service Routine, ISR) для определенного типа прерывания.

Команда IRET

Команда IRET (Interrupt Return) - возвращает управление из обработчика прерывания в прерванную программу.

Работает аналогично команде возврата из дальней функции RETF, тлько она возвращает регистр флагов.

  1. Используется для выхода из обработчика прерывания.
  2. Восстанавливает FLAGS, CS:IP из стека.
  3. При необходимости выставить значение флага, обработчик меняет его значение непосредственно в стеке.

Если обработчик хочет вернуть что-то через регистр флагов во внешнюю программу, ему придется восстанавливать значение не в регистре флагов, а напрямую, прямо в стеке изменять определенные биты.

Clone this wiki locally