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


Между прочим, условия b) и c) требуют, чтобы pages fault избегались в некоторых обработчиках. Это может быть обеспечено, только если стек прерываний IS и коды save и restore находятся на постоянных страницах, т.е., на страницах, которые не могут быть выгружены из основной памяти. Пусть jpозначает уровень приоритета отсутствия страницы (page fault) pff. Для любого j <= jp обработчик H(j) и все данные, к которым обращается H(j) также должны находиться на постоянных страницах.

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

3. Приоритеты прерываний назначаются так, что

(a) Не маскируемые внешние прерывания имеют тип abort и имеют наивысший приоритет j = 0.

(b) Маскируемые внешние прерывания имеют тип continue и имеют более низкий приоритет, чем любое внутреннее прерывание,

(c) Если команда может одновременно вызвать различные внутренние прерывания, наивысший приоритет из всех вызванных прерываний должен иметь тип repeat или abort.

Назначение приоритетов прерываний используемое нашей конструкцией DLX (таблица 5.2) удовлетворяет этим ограничениям.

Условия 1 и 2 должны выполняться независимо от того, прерывается или нет обработчик H(j). Этого трудно достигнуть, поскольку ISR другого прерывания могло исказить структуры данных и регистры используемые H(j). Как следствие, H(j) может вызвать обращение к памяти с нарушением границ или переписать поле EHR в стеке прерываний.

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


5.4.2    Скобочные структуры (bracket structures)

Кодовые сегменты save и restore могут быть интерпретированы как левая и правая скобка, соответственно. Прежде чем мы сможем установить, что допустимые процедуры обработки прерывания ведут себя подобно подпрограммам, мы должны рассмотреть концепцию скобочных структур.


Для последовательностей S = S1... Stскобок '(' и ')' мы определяем

l(S)    =   число левых скобок в S

r(S)    =   число правых скобок в S.


Последовательность Sназывается скобочной структурой если



т.е, число левых скобок равно числу правых скобок, и в префиксах Sправых скобок не больше чем левых.

Очевидно, если Sи Т - скобочные структуры, тогда (S) и STтакже скобочные структуры. В скобочных структурах Sможно объединять скобки по следующему алгоритму:

Для всех правых скобок Rслева направо делаем: { пара Rс левой скобкой Lнепосредственно левее R; отмена Rи Lиз S;}

Вышеупомянутый алгоритм выполняется по кругу k = 1,2,.... Пусть R(k) и L(k) - правая и левая скобка парные в круге k, и пусть S(k) - строка Sперед кругом k. Мы имеем S(1) = S. Индукцией по kпокажем


Лемма 5.1  >


LR(k) – самая левая правая скобка в S(k),

2. L(k) существует, и

3. часть Q принадлежащая S от L(k) до R(k) – скобочная структура.

Доказательство оставлено в качестве упражнения. Видно, что вплоть до круга k, вышеупомянутый алгоритм работает только с префиксом S1... R(k) строки S.


5.4.3    Свойства допустимых процедур обработки прерываний

2Мы покажем позже, что это всегда так


Мы начнем с некоторых определений. Сначала мы определим уровень прерывания ilв ситуации, когда последовательность save не прерывается:2