ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12167
Скачиваний: 10

Поток управления 413
шое допустимое число, срабатывает ловушка. Это значит, что поток управления
переходит в какую-то фиксированную ячейку памяти, а не продолжается последо-
вательно дальше. В этой фиксированной ячейке находится команда перехода к
специальной процедуре
(обработчику системных прерываний),
которая выпол-
няет какое-либо определенное действие, например печатает сообщение об ошиб-
ке. Если результат операции находится в пределах допустимого, ловушка не за-
действуется.
Важно то, что этот вид прерывания вызывается каким-то исключительным усло-
вием, вызванным самой программой и обнаруженным аппаратным обеспечением
или микропрограммой. Есть и другой способ определения переполнения. Нужно
иметь 1-битный регистр, который принимает значение всякий раз, когда происхо-
дит переполнение. Программист, который хочет проверить результат на перепол-
нение, должен включить в программу явную команду «переход в случае установки
бита переполнения» после каждой арифметической команды. Но это очень неудоб-
но. А ловушки экономят время и память по сравнению с открытой проверкой под
контролем программиста.
Ловушку можно реализовать путем открытой проверки, выполняемой микро-
программой (или аппаратным обеспечением). Если обнаружено переполнение,
адрес ловушки загружается в счетчик команд. То, что является ловушкой на од-
ном уровне, может находиться под контролем программы на более низком уровне.
Проверка на уровне микропрограммы требует меньше времени, чем проверка под
контролем программиста, поскольку она может выполняться одновременно с ка-
ким-либо другим действием. Кроме того, такая проверка экономит память, посколь-
ку она должна присутствовать только в одном месте, например в основном цикле
микропрограммы, независимо от того, сколько арифметических команд встреча-
ется в основной программе.
Наиболее распространенные условия, которые могут вызывать ловушки, — это
переполнение и исчезновение значащих разрядов при операциях с плавающей точ-
кой, переполнение при операциях с целыми числами, нарушения защиты, неопре-
деляемый код операции, переполнение стека, попытка запустить несуществующее
устройство ввода-вывода, попытка вызвать слово из ячейки с нечетным адресом и
деление на 0.
Прерывания
Прерывания
— это изменения в потоке управления, вызванные не самой програм-
мой, а чем-либо другим и обычно связанные с процессом ввода-вывода. Например,
программа может приказать диску начать передачу информации и заставить диск
произвести прерывание, как только передача данных завершится. Как и ловушка,
прерывание останавливает работу программы и передает управление программе
обработки прерываний, которая выполняет какое-то определенное действие. После
завершения этого действия программа обработки прерываний передает управле-
ние прерванной программе. Она должна заново начать прерванный процесс в том
же самом состоянии, в котором она находилась, когда произошло прерывание.
Это значит, что прежнее состояние всех внутренних регистров (то есть состояние,
которое было до прерывания) должно быть восстановлено.

4 1 4 Глава 5. Уровень архитектуры команд
Различие между ловушками и прерываниями в следующем: ловушки синхрон-
ны с программой, а прерывания асинхронны. Если программа перезапускается
много раз с одним и тем же материалом на входе, ловушки каждый раз будут про-
исходить в одном и том же месте, а прерывания могут меняться в зависимости от
того, в какой момент человек нажимает возврат каретки. Причина воспроизводи-
мости ловушек и невоспроизводимости прерываний состоит в том, что первые
вызываются непосредственно самой программой, а прерывания вызываются про-
граммой косвенно.
Чтобы понять, как происходят прерывания, рассмотрим обычный пример: ком-
пьютеру нужно вывести на терминал строку символов. Программное обеспечение
сначала собирает в буфер все символы, которые нужно вывести на экран, инициа-
лизирует глобальную переменную ptr, которая должна указывать на начало буфе-
ра, и устанавливает вторую глобальную переменную count, которая равна числу
символов, выводимых на экран. Затем программное обеспечение проверяет, готов
ли терминал, и если готов, то выводит на экран первый символ (например, исполь-
зуя регистры, которые показаны на рис. 5.30). Начав процесс ввода-вывода, цент-
ральный процессор освобождается и может запустить другую программу или сде-
лать что-либо еще.
Через некоторое время символ отображается на экране. Теперь может начаться
прерывание. Ниже перечислены основные шаги (в упрощенной форме).
Действия аппаратного обеспечения:
1. Контроллер устройства устанавливает линию прерывания на системной
шине.
2. Когда центральный процессор готов к обработке прерывания, он устанавли-
вает символ подтверждения прерывания на шине.
3. Когда контроллер устройства узнает, что сигнал прерывания был подтверж-
ден, он помещает небольшое целое число на информационные линии, чтобы
«представиться» (то есть показать, что это за устройство). Это число назы-
вается вектором прерываний
1
.
4. Центральный процессор удаляет вектор прерывания с шины и временно его
сохраняет.
5. Центральный процессор помещает в стек счетчик команд и слово состояния
программы.
6. Затем центральный процессор определяет местонахождение нового счетчика
команд, используя вектор прерывания в качестве индекса в таблице в нижней
части памяти. Если, например, размер счетчика команд составляет 4 байта,
тогда вектор прерываний п соответствует адресу 4п. Новый счетчик команд
указывает на начало программы обслуживания прерываний для устройства,
вызвавшего прерывание. Часто помимо этого загружается или изменяется
слово состояния программы (например, чтобы блокировать дальнейшие
прерывания).
1
Автор не совсем прав: здесь речь должна идти о номере прерывания. Каждому типу прерывания соот-
ветствует свой номер. Термин «вектор прерываний» используется в случае, когда по номеру прерыва-
ния находится адрес программы обработки прерывания и этот адрес представляется не одним значени-
ем, а несколькими, то есть необходимо проинициализировать более одного регистра. Другими словами,
адрес представляется не скалярной величиной, а многомерной, векторной. —
Примеч. научн. ред.

Поток управления 415
Действия программного обеспечения:
1. Первое, что делает программа обработки прерываний, — сохраняет все нуж-
ные ей регистры таким образом, чтобы их можно было восстановить позднее.
Их можно сохранить в стеке или в системной таблице.
2. Каждый вектор прерывания разделяется всеми устройствами данного типа,
поэтому в данный момент еще не известно, какой терминал вызвал преры-
вание. Номер терминала можно узнать, считав значение какого-нибудь
регистра.
3. Теперь можно считывать любую другую информацию о прерывании, напри-
мер коды состояния.
4. Если происходит ошибка ввода-вывода, ее нужно обработать здесь.
5. Глобальные переменные ptr и count обновляются. Первая увеличивается
на 1, чтобы показывать на следующий байт, а вторая уменьшается на 1, чтобы
указать, что осталось вывести на 1 байт меньше. Если count все еще больше О,
значит, еще не все символы выведены на экран. Тот символ, на который в дан-
ный момент указывает ptr, копируется в выходной буферный регистр.
6. В случае необходимости выдается специальный код, который сообщает
устройству или контроллеру прерывания, что прерывание обработано.
7. Восстанавливаются все сохраненные регистры.
8. Выполнение команды RETURN FROM INTERRUPT (выход из прерывания): возвра-
щение центрального процессора в то состояние, в котором он находился до
прерывания. После этого компьютер продолжает работу с того места, в ко-
тором ее приостановил.
С прерываниями связано важное понятие
прозрачности.
Когда происходит
прерывание, производятся какие-либо действия и запускаются какие-либо про-
граммы, но когда все закончено, компьютер должен вернуться точно в то же состо-
яние, в котором он находился до прерывания. Программа обработки прерываний,
обладающая таким свойством, называется прозрачной.
Если компьютер имеет только одно устройство ввода-вывода, тогда прерыва-
ния работают точно так, как мы только что описали. Однако большой компьютер
может содержать много устройств ввода-вывода, причем несколько устройств мо-
гут работать одновременно, возможно, у разных пользователей. Существует неко-
торая вероятность, что во время работы программы обработки прерывания другое
устройство ввода-вывода тоже захочет произвести свое прерывание.
Здесь существует два подхода. Первый подход — для всех программ обработ-
ки прерываний в первую очередь (даже до сохранения регистров) предотвратить
последующие прерывания. При этом прерывания будут совершаться в строгой по-
следовательности, но это может привести к проблемам с устройствами, которые не
могут долго простаивать. Например, на коммуникационной линии со скоростью
передачи 9600 битов в секунду символы поступают каждые 1042 микросекунды.
Если первый символ еще не обработан, когда поступает второй, то данные могут
потеряться.
Если компьютер имеет подобные устройства ввода-вывода, то лучше всего при-
писать каждому устройству определенный приоритет, высокий для более критич-

416
Глава 5. Уровень архитектуры команд
ных и низкий для менее критичных устройств. Центральный процессор тоже дол-
жен иметь приоритеты, которые определяются по одному из полей слова состоя-
ния программы. Если устройство с приоритетом п вызывает прерывание, програм-
ма обработки прерывания тоже должна работать с приоритетом п.
Если работает программа обработки прерываний с приоритетом п, любая по-
пытка другого устройства с более низким приоритетом будет игнорироваться, пока
программа обработки прерываний не завершится и пока центральный процессор
не возвратится к выполнению программы более низкого приоритета. С другой сто-
роны, прерывания, поступающие от устройств с более высоким приоритетом, долж-
ны происходить без задержек.
Поскольку сами программы обработки прерываний подвержены прерыванию,
лучший способ строгого управления — сделать так, чтобы все прерывания были
прозрачными. Рассмотрим простой пример с несколькими прерываниями. Компью-
тер имеет три устройства ввода-вывода: принтер, диск и линию RS232 с приорите-
тами 2,4 и 5 соответственно. Изначально (t=0; t — время) работает пользователь-
ская программа. Вдруг при t= 10 принтер совершает прерывание. Запускается
программа обработки прерывания принтера, как показано на рис. 5.30.
Прерывание диска,
приоритет 2
Прерывание RS232,
приоритет 5
Прерывание принтера,
приоритет 2
Окончание работы RS232,
прерывание диска принято
Окончание обработки
прерывания диска
Окончание обработки
прерывания принтера
I
О 1 0
I
15
20
25
35
40
Программа
пользователя:
Работа
RS232
Обработка
прерывания
диска
Программа
пользователя
Время -
•[Пользователь! Пользователь
Принтер
Пользователь
Принтер
[Пользователь!"
Стек
Рис.
5.30. Пример с несколькими прерываниями. Последовательность действий
При t=15 линия RS232 порождает сигнал прерывания. Так как линия RS232
имеет более высокий приоритет (5), чем принтер (2), прерывание происходит.
Состояние машины, при котором работает программа обработки прерывания прин-
тера, сохраняется в стеке, и начинается выполнение программы обработки преры-
вания RS232.
Немного позже, при t=20, диск завершает свою работу. Однако его приоритет (4)
ниже, чем приоритет работающей в данный момент программы обработки прерыва-

Ханойская башня 417
ний (5), поэтому центральный процессор не подтверждает прием сигнала преры-
вания, и диск вынужден простаивать. При t=25 заканчивается программа RS232, и
машина возвращается в то состояние, в котором она находилась до прерывания
RS232, то есть в то состояние, когда работала программа обработки прерывания
принтера с приоритетом 2. Как только центральный процессор переключается на
приоритет 2, еще до того как будет выполнена первая команда, диск с приорите-
том 4 совершает прерывание и запускается программа обработки прерываний
диска. После ее завершения снова продолжается программа обработки прерываний
принтера. Наконец, при t=40 все программы обработки прерываний завершаются
и выполнение пользовательской программы начинается с того места, на котором
она прервалась.
Со времен процессора 8088 все процессоры Intel имеют два уровня (приори-
тета) прерываний: маскируемые и немаскируемые прерывания. Немаскируемые
прерывания обычно используются только для сообщения об очень серьезных си-
туациях, например об ошибках четности в памяти. Все устройства ввода-вывода
используют одно маскируемое прерывание.
Когда устройство ввода-вывода вызывает прерывание, центральный процессор
использует вектор прерывания при индексировании таблицы из 256 элементов,
чтобы найти адрес программы обработки прерываний. Элементы таблицы представ-
ляют собой 8-байтные дескрипторы сегмента. Таблица может начинаться в любом
месте памяти. Глобальный регистр указывает на ее начало.
При наличии только одного уровня прерываний центральный процессор не
может сделать так, чтобы устройство с более высоким приоритетом прерывало
работу программы обработки прерываний с более низким приоритетом и чтобы
устройство с более низким приоритетом не смогло прерывать выполнение про-
граммы обработки прерываний с более высоким приоритетом. Для решения этой
проблемы центральные процессоры Intel обычно используют внешний контрол-
лер прерываний (например, 8259А). При первом прерывании (например, с при-
оритетом п) работа процессора приостанавливается. Если после этого происходит
еще одно прерывание с более высоким приоритетом, контроллер прерывания вы-
зывает прерывание во второй раз. Если второе прерывание обладает более низким
приоритетом, оно не реализуется до окончания первого. Чтобы эта система рабо-
тала, контроллер прерывания должен каким-либо образом узнавать о завершении
текущей программы обработки прерываний. Поэтому когда текущее прерывание
полностью обработано, центральный процессор должен посылать специальную
команду контроллеру прерываний.
Ханойская башня
Теперь, когда мы уже изучили уровень команд трех машин, нам нужно все обоб-
щить. Давайте подробно рассмотрим тот же пример программы («Ханойская баш-
ня») для всех трех машин. В листинге 5.6 приведена версия этой программы на
языке Java. В следующих разделах для решения этой задачи мы предложим про-
граммы на ассемблере.
Однако вместо того, чтобы давать трансляцию версии на языке Java, для ма-
шин Pentium II и UltraSPARC II мы представим трансляцию версии на языке С,