Разрешение прерывания

Также называется разрешением прерывания. Сигнал или действие, управляющее реакцией процессора на исключение. Необходим для предотвращения возникновения исключений в течение интервалов времени, предшествующих гарантированному сохранению процессором состоянии, необходимого для возобновления выполнения инструкции.

Исключения, связанные с отсутствием страницы при обращении к данным, довольно трудно правильно реализовать в процессоре из-за сочетания трех характеристик:

1. Они происходят в середине инструкции, в отличие от отсутствия страницы при обращении к инструкции.

2. Инструкция не может быть завершена до обработки исключения.

3. После обработки исключения инструкция должна быть перезапущена, как будто ничего не случилось.

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

Давайте более пристально взглянем на MIPS. Когда происходит промах при обращении к TLB, оборудование MIPS сохраняет номер страницы, к которой было обращение, в специальном регистре, который называется BadVAddr, и генерирует исключение.

Исключение вызывает операционную систему, которая обрабатывает исключение программным способом. Управление передается на адрес 8000 0000IS, в то место, где находится обработчик промахов при обращении к TL13. Чтобы определить физический адрес страницы, обращение к которой вызвало промах, подпрограмма обработки промаха при обращении к TLB индексирует таблицу страниц, используя номер страницы виртуального адреса и регистр таблицы страниц, который показывает начальный адрес таблицы страниц активного процесса. Для ускорения этой индексации оборудование MIPS помещает все необходимое в специальный регистр Context: старшие 12 разрядов содержат адрес базы таблицы страниц, а следующие 18 разрядов содержат виртуальный адрес ненайденной страницы. Каждая запись таблицы страниц является одним словом, поэтому последние два разряда содержат нули. Таким образом, первые две инструкции копируют содержимое регистра Context во временный регистр ядра ikl, а затем загружают запись таблицы страниц из этого адреса в регистр Ski.

Как показано выше, в MIPS имеется специальный набор системных инструкций для обновления TLB. Инструкция копирует значение из регистра управления EntryLc в TLB-запись, выбранную регистром управления Random. Этот последний регистр позволяет реализовать произвольную замену, поэтому по сути это автономный счетчик. Обработка промаха при обращении к TLB занимает около десятка тактовых циклов.

Заметьте, что обработчик промаха при обращении к TLB не проверяет, установлен ли в записи таблицы страниц бит достоверности. Поскольку исключение, связанное с промахом обращения к TLB, случается намного чаще, чем ошибка отсутствия страницы, операционная система загружает TLB из таблицы страниц без проверки записи и перезапускает инструкцию. Если запись недостоверна, возникает еще одно, другое исключение, и операционная система обнаруживает ошибку отсутствия страницы. Этот метод ускоряет обработку часто происходящих промахов при обращении к TLB при незначительной издержке производительности для нечастых случаев отсутствия страницы.

Как только процесс, генерирующий ошибку отсутствия страницы, будет прерван, управление будет передано на адрес 8000 0180|6, отличающийся от адреса обработчика промахов при обращении к TLB. Это общий адрес для исключений: у обработчика промахов при обращении к TLB имеется специальная точка входа для сокращения издержки при промахе. Операционная система использует регистр причины исключения Cause для определения причины исключения. Поскольку исключение связано с ошибкой отсутствия страницы, операционная система знает, что потребуется пространная обработка. Таким образом, в отличие от промаха при обращении к TLB, она сохраняет все состояние активного процесса. Это состояние включаег все регистры общего назначения и регистры с плавающей точкой, адрес таблицы страниц, ЕРС, и регистр причины исключения Cause. Поскольку обработчики исключений обычно не используют регистры с плавающей точкой, при передаче управления на общую точку входа их значения не сохраняются, оставляя это занятие лишь для некоторых обработчиков, которым это нужно.

Фрагмент MIPS-кода обработчика исключения. Обратите внимание на то, что в нем сохраняется и восстанавливается состояние, обращается внимание на разрешение и запрещение исключений, но для обработки конкретного исключения вызывается код на языке Си.

Виртуальный адрес, ставший причиной ошибки, зависит от того, была ли это ошибка при обращении к инструкции или при обращении к данным. Адрес инструкции, которая сгенерировала ошибку, находится в ЕРС. Если ошибка произошла при обращении к странице инструкций, ЕРС содержит виртуальный адрес страницы, вызвавшей ошибку; в противном случае виртуальный адрес, вызвавший ошибку, должен быть вычислен путем изучения инструкции (чей адрес находится в ЕРС), чтобы определить базовый регистр и поле смещения.

Уточнение. Эта упрощенная версия предполагает, что в указателе стека (sp) находится достоверное значение. Чтобы избежать ошибки отсутствия страницы при выполнении этого низкоуровневого кода обработки исключений, MIPS выделяет часть своего адресного пространства, которая не может иметь ошибок отсутствия страниц, эта часть называется неотображаемой. Операционная система помещает код точки входа в обработчик исключений и стек обработки исключений в неотображаемую память. Оборудование MIPS переводит виртуальные адреса с 8000 0000,6 по BFFF FFFFie в физические адреса путем простого игнорирования старших разрядов виртуального адреса, помещая тем самым эти адреса в нижнюю часть физической памяти. Таким образом, операционная система помещает код входа в обработчик исключений и стеки обработки исключений в неотображаемую память.

Уточнение. Для процессоров с более сложными инструкциями, которые могут касаться многих мест в памяти и записывать множество элементов данных, превращение инструкций в перезапускаемые дается значительно труднее. Обработка одной инструкции может сгенерировать в середине инструкции сразу несколько ошибок отсутствия страницы. Например, в процессоре х86 есть инструкция перемещения блока, затрагивающая тысячи слов данных. В таких процессорах инструкции часто не могут быть перезапущены с самого начала, как это делалось с инструкциями MIPS. Вместо этого инструкция должна быть прервана и чуть позже продолжена по ходу своего выполнения. Возобновление выполнения инструкции с середины обычно требует сохранения некоторого специального состояния, обработки исключения и восстановления этого специального состояния. Правильное выполнение этой задачи требует координации между кодом обработки исключения в операционной системе и оборудованием.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий