Прерывания и исключительные ситуации
· Классификация прерываний
· Сохранение состояния при прерывании
· Приоритет исключений
· Обработка прерывания
· Внешние прерывания
Классификация прерываний
Прерывание (interruption) – это действие, при котором процессор автоматически прекращает выполнение текущего потока инструкций. Процессор сохраняет часть контекста потока (как минимум должен быть сохранен адрес команды с которой должно быть продолжено нормальное выполнение потока инструкций). Состояние машины изменяется на специальный режим обработки прерываний. Процессор начинает выполнение с предопределенного адреса подпрограммы – обработчика прерывания (interrupt handler). Закончив обработку прерывания, подпрограмма-обработчик восстанавливает прежнее состояние процессора (контекст прерванного потока) и дает возможность продолжить выполнение потока с адреса прерванной или следующей за ней команды (return from interrupt).
Исключение (exception) – это событие, которое, если ему это разрешено, заставляет процессор производить прерывание. Исключения генерируются сигналами от внутренних и внешних периферийных устройств, командами самого процессора, внутренним таймером, событиями отладчика, или условными ошибками. В общем случае исключения не совпадают с прерываниями: разные исключения могут порождать прерывание одного типа, одно исключение может породить несколько прерываний.
Все прерывания могут быть классифицированы согласно следующим независимым характеристикам: место обслуживания прерывания, синхронность контексту, синхронность потоку команд, критичность.
По месту обслуживания прерывания делятся на две группы. Прерывания первой группы зависят от конкретной реализации процессора и/или платформы. Это RESET (сброс питания), CHECK (тест процессора/памяти), POWER (снижение нагрузки), HALT (стоп). Способ обслуживания таких прерываний неизвестен операционной системе. Код обработки хранится в PAL-ROM. Продолжение прерванного контекста исполнения под вопросом – его либо ещё нет, или он не восстанавливается.
Прерывания второй группы определены архитектурой и не зависят от конкретной реализации процессора. Способ обслуживания таких прерываний выбирается операционной системой. Код обработки хранится в таблице прерываний ОС. После обработки прерывания происходит восстановление прерванного контекста. Эти прерывания ещё называют контекстно-синхронными. Это означает, что после окончания прерывания возможно продолжение выполнения прерванной последовательности инструкций (сохраняется/восстанавливается контекст исполнения). Машинная проверка (restart, reset) прерывает действия синхронизации контекста относительно последующих команд.
Асинхронные прерывания вызваны событиями, которые не зависят от выполняемых команд. Для асинхронных прерываний адрес, сообщенный подпрограмме обработки исключения, это адрес команды, которая выполнилась бы следующей, если бы асинхронное прерывание не произошло.
Синхронные прерывания вызваны непосредственно выполнением или попыткой выполнения команды. Синхронные прерывания обрабатываются строго в программном порядке, а при наличии нескольких прерываний для одной команды – в порядке приоритетности прерываний. Синхронные прерывания делятся на два класса: ошибки (faults) и ловушки (traps).
Ошибка (fault) – это прерывание, происходящее до завершения выполнения команды. Текущая команда не может (или не должна) быть выполнена, или требуется системное вмешательство, прежде чем команда будет выполнена. Ошибки синхронны относительно потока команд. Процессор завершает изменения состояния, которые произошли в командах до ошибочной команды. Ошибочная команда и последующие команды не имеют никакого эффекта на машинное состояние. Возможные промежуточные результаты выполнения команды при ошибке полностью отменяются, а после обработки прерывания команда перезапускается заново. Синхронные прерывания-ошибки точно указывают адрес команды, вызвавшей исключение, которое генерировало прерывание.
Ловушка (trap) – это прерывание, происходящие после завершения выполнения команды. Выполненная команда требует системного вмешательства. Ловушки синхронны относительно потока команды. Команда-ловушка и все предыдущие команды завершены. Последующие команды не имеют никакого эффекта на машинное состояние. Команда, породившая ловушку, не отменяется и не перезапускается заново. Синхронные прерывания-ловушки точно указывают адрес следующей команды за командой, вызвавшей исключение, которое генерировало прерывание.
Когда выполнение команды вызывает ловушку или попытка выполнения команды вызывает ошибку, следующие условия обязательно существуют в точке прерывания:
Все команды, предшествующие команде, породившей исключение, приняты как выполненные для прерванного процессора. Однако операции доступа к памяти, связанные с этими предшествующими командами, возможно еще не были выполнены с точки зрения других процессоров и механизмов памяти. Ни одна команда после команды, породившей исключение, еще не принята как выполненная.
Команда, породившая исключение, или не начинала выполнение (если бы не порождение исключения), или, завершила, в зависимости от типа прерывания. Регистр SRRA содержит адрес команды, породившей исключение-ошибку или команду немедленно после команды, породившей исключение-ловушку. Поскольку команда, породившая ошибку, будет запущена повторно, регистр SRRA всегда содержит адрес возврата из прерывания. По типу прерывания и битам состояния можно определить, какая это команда - прерванная или следующая.
Критичные прерывания. Некоторые типы прерывания требуют немедленного внимания, даже если другие типы прерываний обрабатываются в данный момент, и еще не было возможности сохранить состояние машины (адрес возврата и содержимое регистров состояния машины). Кроме того, обработчик прерывания сам может породить прерывание, для обработки которого может понадобиться новый обработчик. Например, при размещении таблицы страниц в виртуальной памяти при обработке промаха в DTLB или ITLB может произойти повторный промах DTLB.
В соответствии с этими требованиями прерывания могут быть классифицированы по уровню критичности. Чтобы допустить возможность более критического прерывания сразу после начала обработки менее критического прерывания (то есть прежде чем будет сохранено состояние машины), обеспечивается несколько наборов теневых регистров для сохранения состояния машины. Прерывания каждого класса критичности используют свой набор регистров.
Все прерывания, кроме машинной проверки, упорядочиваются по двум категориям прерываний, так что, только одно прерывание каждой категории одновременно обрабатывается, и пока оно обрабатывается, никакая часть состояния программы не будет потеряна. Поскольку группа регистров сохранения/восстановления состояния процесса SRR - последовательный ресурс многократного использования, используемый всеми прерываниями одного класса соответственно, состояние программы может быть потеряно, когда происходит неупорядоченное прерывание.
Процессор обнаружил Машинную Проверку (внутренний сбой), или сброс процессора. Аварийные прекращения работы могут быть или синхронны или асинхронные относительно потока команд. Аварийное прекращение работы может заставлять процессор приостанавливать поток команды в непредсказуемом расположении с частично модифицированными регистрами или состоянием памяти. Аварийные прекращения работы - PAL-основанные прерывания.
Машинные Проверки (MCA)
Процессор обнаружил аппаратную ошибку, которая требует немедленного действия. В зависимости от типа и серьезности ошибки процессор может быть способен исправить ошибку и продолжить выполнение. PALE_CHECK точка входа введена, чтобы пытаться исправить ошибку.
Процессор Сброс (RESET): процессор был включен или запрос сброса был послан. PALE_RESET точка входа, чтобы процессор выполнил системную самопроверку и инициализацию.
Прерывания
Внешний или независимый объект (например устройство ввода-вывода, таймер, или другой процессор) требует внимания. Прерывания асинхронные относительно потока команды. Все Предыдущие команды завершаются. Текущие и последующие команды не имеют никакого эффекта на машинное состояние. Прерывания разделены на Инициализацию, прерывает, Управление Платформы прерывает, и внешние прерывания. Инициализация и прерывания Управления Платформы – PAL-прерывания; внешние прерывания – IVA-прерывания.
Прерывания Инициализации (INIT) Процессор получил запрос инициализации. Точка входа PALE_INIT введена, и процессор помещен в известное состояние. Запрос управления платформой, чтобы исполнить функции типа обработки ошибок платформы, очищения памяти, или управления питанием был получен процессором. Точка входа PALE_PMI введена, чтобы обслужить запрос. Выполнение программы может быть продолжено в точке прерывания. Прерывания управления платформы отличаются уникальными векторными числами. Векторы 0 до 3 доступны для программируемого оборудования платформы, используют и присутствуют на каждой модели процессора. Векторы 4 и выше сохранены для использования программируемого оборудования процессора. Размер векторного пространства определен моделью.
Внешние Прерывания (INT) Процессор получил запрос, чтобы исполнить обслуживание от имени операционной системы. Типично эти запросы исходят из устройств ввода-вывода, хотя запросы могли исходить из любого процессора в системе включая самого себя. Внешний вектор Прерывания введен, чтобы обработать запрос. Внешние Прерывания различ уникальными векторными числами в диапазоне 0, 2, и 16 до 255. Эти векторные числа используются, чтобы расположить по приоритетам внешние прерывания. Два специальных случая Внешних Прерываний - Немаскируемые Прерывания и Внешние Прерывания Контроллера.
Немаскируемые Прерывания (NMI) Немаскируемые Прерывания используются, чтобы запросить критические услуги операционной системы. NMIs назначены внешний номер 2 вектора прерывания.
Внешний Контроллер Прерывает (ExtINT)
Внешние Прерывания Контроллера используются, чтобы обслужить внешние прерывания контроллера. ExtINT назначены в местном масштабе в пределах процессора на внешний номер 0 вектора прерывания.
Прерывание машинной проверки – специальный случай асинхронного прерывания. Они обычно вызываются некоторыми аппаратными средствами, или отказом подсистемы памяти, или попыткой обратиться к недопустимому адресу. Машинная проверка может быть вызвана косвенно выполнением команды, но не быть признано и/или сообщена, пока намного позже процессор не выполнит мимо команды, которая привела к машинной проверке. Также о прерываниях машинной проверки нельзя сказать как синхронных или асинхронных, как точных или неточных. Они, однако, обрабатываются как прерывания критического класса.
В случае машинной проверки, следующие общие правила применяются: 1. Никакая команда после той, чей адрес сообщен к машинной программе обработки прерывания проверки в регистре SRRA, не начала выполнение. 2. Команда, чей адрес сообщен к программе обработки прерывания машинной проверки в регистре SRRA, и все предшествующие команды, могут быть или не быть завершены успешно. Все те команды, которые когда-либо собираются завершать, кажется, сделают так уже, и сделали так в пределах контекста, существующего до Машинного прерывания Проверки. Никакое дальнейшее прерывание (другой чем возможные дополнительные Машинные прерывания Проверки) не произойдет в результате тех команд.