-
Notifications
You must be signed in to change notification settings - Fork 0
Прерывания. Обработка прерываний в реальном режиме работы процессора
Прерывание - особая ситуация, когда выполнение текущей программы приостанавливается, и управление передается программе-обработчику возникшего прерывания.
- аппаратные (асинхронные) - события от внешних устройств;
- внутренние (синхронные) - события в самом процессоре, например, деление на ноль;
- программные - вызванные командой int.
Вектор прерывания - номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний, содержащую адреса обработчиков прерываний. Располагается в самом начале памяти, начиная с адреса 0. Доступно 256 прерываний. Каждый вектор занимает 4 байта - полный адрес. Размер всей таблицы - 1 Кб.
- Сохранение в текущий стек регистра флагов и адреса возврата (адреса следующей команды)
- Передача управления по адресу обработчика из таблицы векторов
- Настройка стека (возможно, обработчику прерываний нужен свой стек, потому что стек остается связан с той программой, которая работала до срабатывания прерывания; если обработчик сложный, то иногда такие обработчики перенастраивают стек)
- Повторная входимость (реентерабельность), необходимость запрета прерываний (Кузнецов: "таймер тикает, срабатывают прерывания. В какой-то момент прерывание тика таймера не успевает отработать до след тика, вызывается еще раз тоже прерывание и нужно обеспечить корректную работу в такой ситуации"; запрет прерывания можно делать только на короткий срок, иначе можно потерять данные (переполнение буфера клавиатуры, например))
В реальном режиме на x86 архитектуре обработка прерываний осуществляется с использованием векторной таблицы прерываний. Таблица векторов прерывания - это структура данных, начинающаяся с адреса 0000:0000 и содержащая 256 векторов прерываний, каждый из которых занимает 4 байта (2 байта смещения и 2 байта сегмента). Каждый вектор указывает на процедуру обработчика прерываний (Interrupt Service Routine, ISR) для определенного типа прерывания.
Команда IRET (Interrupt Return) - возвращает управление из обработчика прерывания в прерванную программу.
Работает аналогично команде возврата из дальней функции RETF, тлько она возвращает регистр флагов.
- Используется для выхода из обработчика прерывания.
- Восстанавливает FLAGS, CS:IP из стека.
- При необходимости выставить значение флага, обработчик меняет его значение непосредственно в стеке.
Если обработчик хочет вернуть что-то через регистр флагов во внешнюю программу, ему придется восстанавливать значение не в регистре флагов, а напрямую, прямо в стеке изменять определенные биты.