Обработка прерываний
5.1 Попытка строгой обработки прерываний
ПРЕРЫВАНИЯ - события, которые изменяют ход выполнения программы средствами отличными от команд перехода. Они запускаются активацией сигналов событий (event signals), которые мы обозначим ev[j], j = 0,1,.... Здесь мы рассмотрим прерывания показанные в таблице 5.1.
Проще говоря, активация сигнала события ev[j] должна привести к процедуре вызова подпрограммы H(j). Эта подпрограмма называется обработчик особых ситуаций (исключений) (exceptionhandler) прерывания jи и должна заботиться о проблеме сигнализируемой
Таблица 5.1 Прерывания, обрабатываемые нашей конструкцией DLX
index j |
название |
обозначение |
0 |
сброс |
reset |
1 |
неверная команда |
ill |
2 |
обращение к памяти по неверной границе |
mal |
3 |
отсутствие страницы при выборке |
pff |
4 |
отсутствие страницы при загрузке/сохранении |
pfls |
5 |
ловушка |
trap |
6 |
арифметическое переполнение |
ovf |
6 + i |
внешний I/O |
exi |
активацией ev[j]. Обработчик исключений для отсутствующих страниц, к примеру, должен переместить отсутствующую страницу из вторичной памяти в первичную. Прерывания могут быть классифицированы различными способами:
• Они могут быть внутренними, т.е., генерируемыми CPU или системой памяти, или внешними.
• Они могут быть маскируемыми,т.е., они могут быть игнорированы под управлением программы, или немаскируемыми.
• После прерывания команды I выполнение программы может быть продолжено тремя способами:
- повторить(repeat) команду I,
- продолжить (continue) с команды I+, которая следует за I при непрерывном выполнении программы,
- прервать (abort) программу.
Таблица 5.2 классифицирует прерывания рассматриваемые здесь.
Наконец, прерывания имеют приоритеты, определяемые индексом j. Активация ev[j] может вызвать программу обработки H(j') только если j < j'. Кроме того, если ev[j] и ev[j'] стали активными одновременно и j < j', тогда обработчик H(j') не должен вызываться. Таким образом, меньшие индексы соответствуют большему приоритету.1
Если мы хотим сконструировать механизм прерываний и доказать, что он работает, мы должны сделать обычные три вещи:
1. определить, что предполагается делать механизму прерываний,
2. сконструировать механизм,
3. показать, что он выполняет спецификации.
Первый шаг, оказывается, не настолько прост. Повторимся, что прерывания являются своего рода вызовом процедур и что вызов процедуры является концепцией языка высокого уровня. С другой стороны, пока что наш самый высокий уровень абстракции – уровень ассемблера/машинного языка. Это верный уровень для определения того, что должны делать аппаратные средства. В частности, он позволяет определить значение команд подобных jal, которые поддерживают вызов процедур. Однако, значение вызова и возврата из процедуры не могут быть определены подобно значению команд ассемблера.
Есть различные способы определить семантику вызова процедуры и возврата из нее в языках высокого уровня [LMW86, Win93]. Наиболее простой путь – называемый операционной семантикой – определить значение процедуры
1Приоритет 1 - срочен, приоритет 31 - нет.
Таблица 5.2 Классификация прерываний
index j |
обозначение |
внешнее |
маскируемое |
продолжение |
0 |
reset |
yes |
No |
abort |
1 |
ill |
no |
No |
abort |
2 |
mal |
no |
No |
abort |
3 |
pff |
no |
No |
repeat |
4 |
pfls |
no |
No |
repeat |
5 |
trap |
no |
No |
continue |
6 |
ovf |
no |
Yes |
continue/abort |
6 + i |
exi |
yes |
yes |
continue |
задающей, как определенная абстрактная машина должна интерпретировать вызовы и возвраты. Он использует стек кадров процедур. Вызов помещает новый кадр с параметрами и адресом возврата в стек и затем переходит к телу процедуры. Возврат извлекает кадр из стека и переходит по адресу возврата.
Очевидным выбором 'абстрактной машины' является абстрактная DLX машина с семантикой задержанных ветвлений/задержанного PC, определенная как набор команд DLXσи их семантика. Машина, однако, должна быть дополнена. Должно быть место, где хранятся маски прерываний и должен быть механизм, способный изменять PC в ответ на сигналы событий. Мы также добавим механизмы для связывания адресов возврата и параметров, которые видны на уровне языка ассемблера.
Мы будем использовать единственную программу обработки прерываний ISR, которая будет под управлением программы переходить к различным обработчикам исключений H (j). Мы обозначим через SISRначальный адрес программы обработки прерываний.
Наконец мы способны спланировать оставшуюся часть главы. В разделе 5.2 мы определим на уровне абстракций языка ассемблера
1. расширение машинного языка DLX,
2. механизм, связывающий адреса возврата и параметры,
3. механизм, способный поместить пару адресов (SISR, SISR + 4) в (DPC, PC) в ответ на активацию сигналов событий.
В разделе 5.3 мы определим программный протокол для процедуры обработки прерываний, которая тесно связана с обычными процедурами вызова и возврата в операционной семантике. На этом завершится определение механизма прерываний.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.