Детальный проект конвейерного RISC процессора (Глава 5 "Обработка прерываний"), страница 4

Мы называем последовательность регистров

EHR = (ESR,ECA,EDPC,EPC,EDATA)

регистрами обработки исключений. Для каждого кадра Fстека прерывания и для любого регистра Rмы обозначим через F.Rчасть F, зарезервированную для R. Мы обозначим через F.EHRчасть кадра, зарезервированную для копий регистров обработки исключений. Мы обозначим через IS.EHRчасть всех кадров стека, зарезервированную для копий регистров обработки исключений.

Процедура обработки прерывания, которая стартует после JISR, имеет три фазы:

1. save (сохраняет состояние):

(a) Текущий уровень прерывания il= min{j | ECA[j] = 1}

является определенным. Для этого вычисления, ECAдолжен быть скопирован в какой ни будь регистр универсального назначения GPR[x]. Этот регистр, в свою очередь, должен сначала сохраниться на некую зарезервированную позицию в памяти. Эта операция записи, в свою очередь, делает лучше, не генерируя прерывание по отсутствию страницы.


(b) Если ilтипа abort, инициализируется пустой стек прерываний, иначе новый кадр помещается в стек вычисляя

ISP = ISP + frame_size.

(c) Регистры обработки исключений сохраняются: IS.TOP.EHR = EHR.

(d) Все маскируемые прерывания j < ilнемаскируются:

SR = 031-il lil.

Эта маска вычисляется заранее и присваивается SRодной специальной командой перемещения. После этой команды, процедура обработки прерываний может быть снова прервана определенными маскируемыми прерываниями.

2. Обработчик исключений H(il): Процедура обработки прерываний переходит к началу соответствующей подпрограммы для прерывания il. Этой подпрограмме обычно необходимы некоторые регистры общего назначения. Она сохраняет соответствующие регистры в ISOP. После выполнения соответствующей работы для прерывания il, регистры общего назначения, которые были сохранены, восстанавливаются. Видно, что все это может быть прервано (маскируемыми) прерываниями высшего приоритета. Наконец, обработчик маскирует все маскируемые прерывания одной специальной командой перемещения:

SR = GPR[0].                  

3. restore (восстановление состояния): следующие регистры восстанавливаются из стека:

EDPC   =   IS.TOP.EDPC

EPC   =   IS.ТOP.EPC

ESR   =   IS.ТOP.ESR

Верхний кадр извлекается из стека:

ISP = ISP - frame_size.

Процедура обработки прерывания заканчивается командой rfe.



5.4    Допустимые процедуры обработки прерываний

МЫ предназначаем прерываниям поведение, подобное вызовам процедур. Механизм предыдущего раздела определяет соответствующий механизм вызова и возврата. К сожалению, обработчики не генерируются компилятором, поэтому программист имеет много возможностей для хака, который создаст механизм, поведение которого не похоже на вызовы процедур. Очевидная точка атаки – поля IS.EHR. Очевидно, манипуляции с IS.TOP.EDPCдопускают переход куда угодно.

Если стек прерываний не на постоянной странице памяти, каждое прерывание, включая прерывание отсутствия страницы (page fault) , может привести к прерыванию отсутствия страницы, и т.д. Можно указать множество таких ловушек. Тогда очевиден интересный вопрос: мы все это проигнорировали?

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


5.4.1    Ряд ограничений

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

1. Структуры данных механизма прерывания должны использоваться ограниченным способом:

(a) Указатель стека прерываний ISPпишется только при save и restore.

(b) Сегменты кадра IS, которые зарезервированы для регистров EHR, обновляются только в save.

2. ISR должен писаться в соответствии со следующими ограничениями:

(a) Команда rfe используется только как последняя команда ISR.

(b) Кодовые сегменты save и restore избегают любых немаскируемых внутренних прерываний; в данной архитектуре DLX это прерывания jс 0 < j < 6.

(c) Каждый обработчик H(j) избегает любых немаскируемых внутренних прерываний iс приоритетом i >= j.

(d) Если обработчик H(j) использует специальное перемещение с исходным регистром Rдля обновления регистра состояния SR, тогда R[i] = 0 для любых i>= j.