Скачиваний:
46
Добавлен:
03.06.2014
Размер:
676.35 Кб
Скачать

7. Реализация механизма прерываний.

Программы обработки прерываний, или обработчики прерываний, относятся к важнейшим программным средствам современных вычислительных систем. Запросы на прерывания могут иметь различную природу. При поступлении такого запроса процессор автоматически прекращает выполнение текущей программы и передает управление обработчику прерывания. В этой работе все прерывания являются аппаратными. То есть они могут инициироваться либо самим процессором (внутренние), и тогда они называются исключениями, либо периферийными устройствами (внешними), и тогда они называются просто аппаратными прерываниями. Внешние прерывания могут вызываться, к примеру, сигналами от микросхемы таймера, контроллеров дисков, клавиатуры, мыши, принтера и многих других устройств. Независимо от источника, действия процессора по обслуживанию поступившего прерывания всегда выполняются одинаково для всех видов прерываний. Эти действия обычно называют процедурой прерывания. Необходимо отметить, что сейчас речь будет идти лишь о реакции самого процессора на сигнал прерывания, а об алгоритмах обработки прерывания, предусматриваемых ОС в обработчиках прерываний я чуть-чуть скажу немного позже.

Итак, как процессор реагирует на сигналы прерываний? Что касается аппаратных (внешних) прерываний, то запросы на них поступают в процессор асинхронно. Процессор заканчивает выполнение очередной команды. Затем проверяет, есть ли запрос. Если да, то проверяется специальный бит в регистре флагов (о флагах в следующем разделе), и если он установлен, то начинается процедура обработки прерывания. Процессор сохраняет счетчик команд PCR и регистр флагов FLG в специально предназначенных для этого регистрах IPC (Interrupt PCR) и IFL (Interrupt FLG), доступных только в режиме ядра. Далее процессор в регистре флагов меняет некоторые специальные биты, это запрещает дальнейшее прохождение запросов на прерывания, и включает режим ядра. Потом он обращается к внешнему контроллеру прерываний (кстати, запрос процессору на прерывания идет именно от контроллера, потому что все устройства, которым нужны прерывания, обращаются именно к контроллеру, чтобы он разрешил возможные конфликты между ними, да и управление этим процессом тогда будет сосредоточено в одном месте). Контроллер передает процессору так называемый вектор прерывания – целое, обычно 8-разрядное число (каждое устройство имеет свой вектор, какой именно – этим управляет контроллер прерываний). Вектор прерывания – это есть ни что иное как порядковый номер элемента в специальной таблице прерываний. Физический адрес, по которому хранится в ОЗУ эта таблица, находится в специальном системном регистре ITP (Interrupt Table Pointer). В этом смысле таблица прерываний похожа на таблицу страниц. Однако есть и отличия – элементы таблицы прерываний не кэшируются. Элемент таблицы страниц – 32-х разрядный адрес процедуры обработки прерывания для соответствующего вектора прерываний. Каков должен быть размер таблицы прерываний ? Максимум – 1 Кбайт, поскольку вектор прерывания – 8-разрядное число. Но обычно в системе нет какого количества периферийных устройств. Например, в IBM PC AT их максимально возможное число – 16, и там стоят два 8-разрядных контроллера прерываний. Запрограммировав эти контроллеры на диапазон векторов прерываний с 8-го по 23-й, размер таблицы прерываний можно существенно сократить. Итак, процессор после получения от контроллера прерываний вектора прерываний берет нужный элемент таблицы прерываний переходит на соответствующую процедуру обработки прерывания. (Не знаю, как написать так, чтобы слово "прерывание" так часто не повторялось.) На этом действия процессора на запрос прерывания закончены. Процедура обработки должна завершаться специальной командой (смотри список команд), которая восстановит сохраненные ранее процессором значения регистра флагов и счетчика команд, и, таким образом, выполнение прерванной программы продолжится. Понятно, что если обработчик прерываний использует какие-то регистры, то он сначала должен сохранить их где-то, а потом в конце восстановить. Что касается собственно действий, ради которых и вызываются процедуры прерываний, то в случае аппаратных (внутренних) прерываний все очень индивидуально, поскольку периферийных устройств великое множество, все они имеют свои особенности.

Напомню, что есть еще одна разновидность прерываний – внутренние, или исключения. Они вырабатываются самим процессором, им же и обрабатываются. То есть они синхронные. При выполнении очередной команды процессор может понять, что не может ее выполнить. Тогда он сообщает ОС об этом, вызывая процедуру обработки исключения. Важно отметить, что в этой работе все исключения являются отказами (fault). Это означает, что в регистре IPC сохраняется адрес именно "проблемной" команды, вызвавшей исключение, а не следующей. И потом по окончании процедуры обработки исключения процессор снова попытается ее выполнить. Если ОС не хочет повторного выполнения команды, или повторное ее выполнение просто бессмысленно (например, исключение обращения к ОС), то в соответствующей команде перехода, передающей управление назад к прерванной программе, нужно указать смещение "+4" (так как все команды 32-х разрядные – 4 байта). Каждое исключение имеет номер, по смыслу он аналогичен вектору прерывания – это индекс в таблице прерываний. Исключения полностью независимы от контроллера прерываний внешних устройств. Номер исключения жестко и однозначно связан с ситуацией, его вызвавшей. Кроме того, нельзя запретить возникновение исключений (в отличии от аппаратных прерываний).

Список исключений, возникающих в RISC-процессоре.

№ 0 : исключение "системный вызов".

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

№ 1 : исключение "отказ страницы".

Как только возникают какие-либо проблемы со страничной адресацией, процессор генерирует это исключение. При этом в регистре BVA будет адрес, обращение по которому вызвало проблему. Анализируя команду, вызвавшую исключение, виртуальный адрес, указанный в ней, элемент таблицы страниц, ОС может установить причину отказа. Вообще их может быть 3: страницы нет в ОЗУ, из режима пользователя происходит попытка обращения к странице ядра, происходит попытка обращения по записи к странице "только для чтения". Если в принципе одна команда создает сразу несколько ситуаций для вызова исключения №1, то только от ОС зависит, как обрабатывать данный случай. Она может попытаться либо сразу устранить все причины отказа, либо делать это по очереди (скажем, выделить под страницу место в ОЗУ, вернуть управление, потом эта же команда снова вызовет исключение и так далее), либо как-то еще.

№ 2 : исключение "недопустимая команда".

В процессоре есть множество команд (привилегированные), допускать выполнять которых прикладной программой никак нельзя. Примеры даже не буду приводить – делаю ссылку на список команд. При попытке выполнить эти команды в режиме пользователя, возникает рассматриваемое исключение. Если вдруг ОС захочет разрешить прикладным программам выполнять некоторые привилегированные команды, то ОС может их эмулировать, а именно: при возникновении исключения №2 ОС должна будет проверить, что за команда его вызвала, если ее надо эмулировать, то ОС ее выполняет, а затем возвращает управление прикладной программе, но указав в команде возврата смещение "+4" (то есть произойдет возврат к следующей команде).

№ 3 : исключение "трассировки (пошагового выполнения)".

Режим трассировки применяется в целях отладки. Если он включен, то перед каждой командой всегда вызывается данное исключение. Управляется режим трассировки специальным битом в регистре флагов. Если он установлен – трассировка включена. Кстати, при возникновении аппаратного прерывания или исключения не только запрещаются последующие аппаратные прерывания, но и автоматически выключается режим трассировки. Для отладки помимо трассировки используются еще и точки прерывания. В этом процессоре есть соответствующая команда, перед ней всегда вызывается исключение №3, независимо от статуса режима трассировки. Обычно отладчик запоминает команду, перед которой нужно выполнить останов и на ее место ставит команду вызова этого исключения, потом обработчик исключения возвращает назад запомненную ранее команду.

При обработке аппаратного прерывания или исключения процессор автоматически запрещает прохождение дальнейших аппаратных прерываний на время обработки. (Хотя ОС может и разрешить прохождение, если ей это надо.) А вот исключения запретить нельзя. В общем, может возникнуть проблема двойного отказа, когда при обработке исключения возникает другое или даже это же самое исключение. Тогда будет затерто содержимое регистров IPC и IFL, могут изменится и регистры BVA . Эти возможные проблемы целиком ложатся на ОС. Она либо может организовать что-то вроде стека и там сохранить указанные регистры, либо просто понадеяться на аккуратность программиста, возможны другие решения.

Соседние файлы в папке kurs