Система прерывания программ.

advertisement
1
ВМ и К. Лекция № 9. Реферат.
Система прерывания программ.
Одним из принципиальных отличий компьютера от любой другой машины, является то, что ПК способен реагировать на непредсказуемые события в
процессе работы. Эта способность обеспечивается с помощью особого свойства компьютера - аппарата прерываний,
Прерывание позволяет компьютеру приостановить любое свое действие и переключиться на другое в зависимости от того, что вызывает
это прерывание. Например, нажатие соответствующей клавиши на клавиатуре компьютера.
Способность к прерыванию разрешает, казалось бы, сложнейшую
проблему эффективности работы нашего компьютера. С одной стороны ,
мы хотим, чтобы компьютер занимался той работой , которую мы ему дали
. С другой стороны , нам нужно , чтобы он реагировал на любую нашу
команду, подаваемую , например, с помощью клавиатуры. Если бы компьютер был способен только на то, чтобы не отвлекаясь выполнять то , что
ему заранее было задано, он бы не смог ответить на наши запросы своевременно, не следя постоянно за деятельностью клавиатуры . Реагировать на
сигналы, посылаемые клавиатурой, равно как и на другие сигналы, требующие внимания в то время, когда компьютер занят другой работой, позволяет ему система прерываний.
Микропроцессор нашего ПК имеет “ врожденную” способность прерывать выполнение операций, при этом у него существует надежное средство откладывать на хранение работу, выполнение которой было прервано.
Для этого используется стек микропроцессора. Когда происходит прерывание , запись того, что делал компьютер в этот момент, хранится в стеке,
так что по завершении прерывания мы можем вернуться к тому месту, от
которого нам пришлось отвлечься. Это один из нескольких способов применения стека, но он является самым важным. Без стека, куда мы можем
положить на хранение информацию о выполняемой работе, не могла бы
реализоваться сама идея прерывания.
Каждая часть компьютера, которой может потребоваться внимание
микропроцессора, получает свой собственный номер, так что всякий раз,
когда мы нажимаем клавишу, (а вернее, когда мы её отпускаем после
нажатия), микропроцессор узнает об этом благодаря появлению прерываний. Внутренний таймер ПК также обладает способностью прерываться
для того, чтобы дать возможность хронометрирующей программе “ слышать” каждый “удар” часов - таймера, который повторяется 18 раз/с. Все
это кажется нам сплошным прерыванием, особенно эти 18 прерываний за
секунду, которые, как может показаться, способны “до смерти” загнать наш
бедный компьютер. Однако микропроцессор может выполнить десятки тысяч команд за промежуток времени между двумя ударами часов, так что
прерывания таймера не отнимают у него много времени. Дисководы и
принтеры также имеют присвоенные им собственные номера прерываний.
Дисководы пользуются ими, чтобы сообщить о завершении определенной
работы, порученной им программой; принтеры сигнализируют о том, что у
них кончилась бумага.
2
Может показаться любопытным, что прерывания вначале не входили в
замысел конструкции компьютера. В самом деле, компьютеры использовались на протяжении нескольких десятилетий до того, как стал широко
использоваться эффект прерываний. Сегодня трудно представить себе компьютер, который не обладал бы этим необходимым свойством, позволяющим ему реагировать на внешние воздействия. Хотя прерывания дают
компьютеру возможность реагировать на сигналы извне, например, на сигнал принтера о том, что у него кончилась бумага, это не единственное, для
чего применяется данный эффект. Понятие прерывания оказалось настолько
полезным, что его приспособили для внутреннего пользования самого компьютера. Внутри наших ПК используются три основных вида прерываний.
Первый из них, о котором мы уже говорили, это прерывание, исходящее
от любой части компьютера и сообщающее о чём-то, требующем немедленного внимания микропроцессора. Этот вид называется аппаратным прерыванием. Два других вида относятся к программному обеспечению.
Иногда при выполнении программы может что-нибудь случиться или
с самой программой, или с содержащимися в ней данными. Это происходит примерно так же, как если бы вы, читая эти строки, натолкнулись на
бессмысленный набор букв, абсолютно ничего не означающий - “ксеьптръу
фмуохэь ъый”. То же самое может, хотя и не должно, случиться с компьютером. Микропроцессор может наткнуться на абсолютно бессмысленные
для него команды, или данные, от которых ему просто “стало бы плохо”
(например, попытка разделить число на нуль). Когда это всё-таки происходит, микропроцессор осуществляет так называемое прерывание в особой
ситуации.
Последняя категория прерываний в отличие от других не возникает
неожиданно. Вся идея прерываний настолько эффективна, что позволяет
программам посылать сигнал о том, что им нужна помощь со стороны
другой программы. Такой вид прерывания называется программным прерыванием. Мы уже упоминали, что наши ПК оснащены встроенными программами ПЗУ - базовой системой ввода - вывода. Выполнение нашим
компьютером любой программы требует возможности запросить услуги
базовой системы ввода - вывода, и программное прерывание обеспечивает
такую возможность. Программные прерывания функционируют точно так
же, как другие виды прерываний. Единственное, что отличает их, - это
причина прерываний. В данном случае вместо неожиданной остановки
программное прерывание умышленно вызывается нашими программами. В
языке ассемблера существует специальная команда с именем INT, которая
используется в программах для реализации прерывания.
Для того чтобы связать адрес обработчика прерывания с номером
прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адреса от 0000:0000 до 0000: 03FF.
Таблица состоит из 256 элементов - FAR - адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове
элемента таблицы записано смещение, а во втором - адрес сегмента обработчика прерывания.
Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию
с номером 1 - 0000:0004 и т.д.
3
Инициализация таблицы происходит частично BIOS после тестирования аппаратуры и перед началом загрузки операционной системой, частично при загрузке DOS. DOS может переключить на себя некоторые прерывания BIOS.
Займемся теперь содержимым таблицы векторов прерываний. Приведём назначение некоторых наиболее важных векторов:
Таблица векторов прерываний.
Номер
Описание
0
1
2
3
4
5
6
7
Ошибка деления. Вызывается автоматически после выполнения
команд DIY или IDIY, если в результате деления происходит переполнение (например, при делении на 0). DOS обычно при обработке
этого прерывания выводит сообщение об ошибке и останавливает
выполнение программы. Для процессора 8086 при этом адрес возврата указывает на следующую после команды деления команду, а
в процессоре 80286 - на первый байт команды, вызвавшей прерывание.
Прерывание пошагового режима. Вырабатывается после выполнения
каждой машиной команды, если в слове флагов установлен, бит
пошаговой трассировки TF. Используется для отладки программ.
Это прерывание не вырабатывается после выполнения команды
MOY в сегментные регистры или после
загрузки сегментных
регистров командой POP .
Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора.
Прерывание для трассировки. Генерируется при выполнении однобайтовой машиной команды с кодом CCh и обычно используется
отладчиками для установки точки прерывания
Переполнение. Генерируется машинной командой INTO при флаге
OF. Если флаг не установлен, то команда INTO выполняется как
NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций
Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для печати образа экрана. Для
процессора 80286 генерируется при выполнении машинной команды
BOUND, если проверяемое значение вышло за пределы заданного
диапазона
Неопределенный код операции или длина команды больше 10 байт
(для процессора 80286)
Особый
случай
отсутствия
математического
сопроцессора
4
8
9
А
В
С
D
Е
F
10
11
12
13
14
15
16
17
18
19
1А
1В
1С
1D
1Е
1F
20-5F
60-67
68-6F
70
71
72
73
74
75
(процессор 80286)
IRQO - прерывание интервального таймера, возникает 18,2 раза в
секунду
IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и
при отжатии клавиши. Используется для чтения данных от клавиатуры
IRQ2 - используется для каскадирования аппаратных прерываний в
машинах класса АТ
IRQ3 - прерывание асинхронного порта СОМ2. Это и следующее
прерывания особенно важны для нас, т.к. они используются при
работе последовательными портами (модемами)
IRQ4 - прерывание асинхронного порта СОМ1
IRQ5 - прерывание от контроллера жесткого диска для ХТ
IRQ6 - прерывание генерируется контроллером флоппи-диска после
завершения операции
IRQ7 - прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера
не используют это прерывание. В некоторых случаях можно использовать это прерывание для работы с последовательными портами
Обслуживание видеоадаптера
Определение конфигурации устройств в системе
Определение размера оперативной памяти в системе
Обслуживание дисковой системы
Последовательный ввод - вывод
Расширенный сервис для АТ - компьютеров
Обслуживание клавиатуры
Обслуживание принтера
Запуск BASIC в ПЗУ, если он есть
Загрузка операционной системы
Обслуживание часов
Обработчик прерывания Сtr1 - Break
Прерывание возникает 18,2 раза в секунду, вызывается программно
обработчиком прерывания таймера
Адрес видео таблицы для контроллера видеоадаптера 6845
Указатель на таблицу параметров дискеты
Указатель на графическую таблицу символов с кодами ASCII 128255
Используется DOS или зарезервировано для DOS
Прерывания, зарезервированные для пользователя
Не используются
IRQ8 - прерывание от часов реального времени
IRQ9 - прерывание от контроллера ЕGА
IRQ10 - зарезервировано
IRQ11 - зарезервировано
IRQ12 - зарезервировано
IRQ13 - прерывание от математического сопроцессора
5
76
77
78-7F
80-85
86-F0
F1-FF
IRQOIRQ15
IRQ14 - прерывание от контроллера жесткого диска
IRQ15 - зарезервировано
Не используются
Зарезервированы для BASIC
Используются интерпретатором BASIC
Не используются
Это аппаратные прерывания, о них будет рассказано позже.
Работа механизма прерывания.
Каждое определённое прерывание идентифицируется своим номером
(смотри таблицу). Например, таймер и клавиатура и принтер имеют каждый
свой собственный номер прерывания. Что касается базовой системы ввода/вывода, то её сервисные программы подразделяются на группы, причём за
всеми программами группы закрепляется один номер прерывания.
Когда происходит прерывание, его номер из таблицы используется для
включения соответствующей программы обработки прерываний. Перед тем как
такая программа начнёт свою работу, механизм микропроцессора , отвечающий
за обработку прерываний, оставляет запись в стеке о том , какая работа производилась до прерывания. После этого выполняется программа обработки прерывания.
Программа обработки прерываний начинает работу, приняв предохранительные меры против возможных дальнейших прерываний, в случае, если
должны выполняться очень важные или сложные операции, которые нельзя
прерывать. Обычно такие программы включают смену сегментного регистра,
управляющего доступом в память, а также запись в стек дальнейшей информации о состоянии, которую необходимо сохранить в добавление к той, которая
была автоматически записана в начале прерывания.
После завершения своих операций программа обработки прерываний может снова привести в действие другие типы прерываний и выполнять необходимую работу. Когда операции прерывания заканчиваются, программа обработки прерываний восстанавливает исходное состояние машины, в котором она
находилась до прерывания, и компьютер продолжает прерванную работу.
Маскирование прерываний.
Часто при выполнении критических участков программы для того, чтобы
гарантировать выполнение определённой последовательности команд целиком,
приходится запрещать прерывания. Это можно сделать командой CLI. Её надо
поместить в начало критической последовательности команд, а в конце расположить команду STI, разрешающую процессору воспринимать прерывания. Команда CLI запрещает только маскируемые прерывания, немаскируемые всегда
обрабатываются процессором.
Если необходимо замаскировать не все прерывания, а только некоторые,
например, от асинхронного адаптера, то для этого необходимо воспользоваться
услугами контроллера прерываний. Подробно об этом ниже, сейчас только отметим, что выдачей в этот контроллер определённой управляющей информации
можно замаскировать прерывания от отдельных устройств.
6
Особенности обработки аппаратных прерываний.
В отличие от программных прерываний, вызываемых запланировано самой прикладной программой, аппаратные прерывания всегда происходят асинхронно по отношению к выполняемой программе. Кроме того, может одновременно возникнуть несколько прерываний! Для того чтобы система знала, в какой последовательности необходимо обрабатывать запросы на прерывание, существует специальная схема приоритетов.
Система приоритетов реализуется на микросхемах Intel 8259. Каждая
микросхема обслуживает до восьми приоритетов. Для увеличения количества
уровней приоритетов микросхемы объединяются (каскадируются). Приоритеты
аппаратных прерываний, получаемых в результате каскадирования двух микросхем для машин AT, представлены последовательностью номеров векторов
прерываний (смотри таблицу), записанных в порядке возрастания приоритета
обслуживания: 8; 9; А; 70...77; B: C: D: E: F. Из этой записи видно, что самый
высокий приоритет у прерываний от интервального таймера, затем идёт прерывание от клавиатуры.
Для управления схемами приоритетов необходимо знать внутреннее
устройство контроллера прерываний 8259. Поступающие прерывания запоминаются в регистре запроса на прерывание IRR. Каждый бит из восьми в этом
регистре соответствует прерыванию. После проверки на обработку в настоящий
момент другого прерывания запрашивается информация из регистра обслуживания ISR. Перед выдачей запроса на прерывание в процессор проверяется содержимое восьмибитового регистра маски прерываний IMR. Если прерывание
данного уровня не замаскировано, то выдаётся запрос на прерывание.
Наиболее интересными, с точки зрения программирования контроллера
прерывания, являются регистры маски прерываний IMR и управляющий регистр прерываний.
В машинах AT регистры маски первого и второго контроллеров имеют
адреса 21h, A1h соответственно, а адреса управляющих регистров имеют значения: 20h; A0h.
Разряды регистра маски прерываний соответствуют номерам IRQ. Для того чтобы замаскировать аппаратные прерывания какого-либо уровня, надо заслать в регистр маски байт, в котором бит, соответствующий этому уровню,
установлен в 1. Например, для маскирования прерываний от НГМД в порт 21h
надо заслать двоичное число 01000000. При этом все остальные устройства будут продолжать нормально работать. В случае использования машинной команды CLI были бы отключены все аппаратные прерывания, включая клавиатуру.
Контроллер прерываний 8259 (отечественный аналог RH1810BH59A)
допускает каскадирование, обеспечивающее до 64 уровней прерываний. Контроллер имеет несколько режимов работы, которые устанавливаются программным способом. За первоначальную установку режимов контроллера отвечает
BIOS. Однако часто возникает необходимость изменения текущего режима работы (запрет или разрешение прерываний определённого, или всех уровней,
обработка кода прерывания) или опроса состояния внутренних регистров контроллера.
Если контроллеры каскадированы, то ведомой микросхеме присваивается
код (выдачей в микросхему соответствующего командного слова). Этот код равен номеру входа IRQ ведущей микросхемы, с которой связан выход запроса
7
прерывания INT ведомой микросхемы. Внутри микросхемы приоритет зависит
от номера IRQ . Самым высоким приоритетом внутри группы, обслуживаемой
каждым контроллером, обладает вход IRQ0. Однако, возможно программное
изменение приоритетов в рамках так называемого приоритетного кольца. При
этом дно кольца имеет самый низкий приоритет. Возможные варианты задания
приоритетов приведены в таблице.
Вход
IRQ0
IRQ1
IRQ2
TRQ3
Уровни приоритета
76543210
07654321
10765432
21076543
Вход
IRQ4
IRQ5
IRQ6
IRQ7
Уровни приоритета
32107654
43210765
54321076
65432107
Наибольший приоритет у входа IRQ с обозначением 0 приоритетного
кольца, наиболее низкий - с обозначением 7.
Как уже рассматривалось выше, контроллер имеет регистры: IRR - запросов прерываний; ISR - обслуживания прерываний: IMR - маски прерываний.
После выработки сигнала в процессор соответствующий разряд регистра ISR
устанавливается в единичное состояние, что блокирует обслуживание всех запросов с равным и более низким приоритетом. Устранить эту блокировку либо
сбросом соответствующего бита в ISR, либо командой специального маскирования.
Имеются два типа команд, посылаемых программой в контроллер 8259, инициализации и операции. Так как инициализация производится программой
BIOS, рассмотрим более подробно команды операции. Существует три типа
команд операций:
1. Маскирование запросов прерывания;
2. Команды обработки конца прерывания;
3. Опрос регистров и специальное маскирование.
Байты команды маскирования вводятся соответственно в порты 21h, A1h
для первого и второго контроллера соответственно.
Команды операций второго и третьего типа используют порты с адресами
20h, A0h.
Команды обработки конца прерываний приведены в таблице.
Биты байта команды
Описание
D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 0 0 0 0 0 Обычный конец операции
0 1 1 0 0 В2 В1 В0 Специальный конец операции, В0...В2 - двоично-десятичный код
1
0
1
0
0
х х
х
1
1
1
0
0
В2 В1 В0
1
0
1
0
0
1
0 0
0 0
0 0
0 х х х
0 х х х
0 В2 В1 В0
сбрасываемого разряда в регистре ISR.
Циклический сдвиг уровней приоритета с обычным концом прерывания, дно приоритетного кольца устанавливается по обслуженному
запросу.
Циклический сдвиг уровней приоритета со специальным концом
прерывания. дно приоритетного кольца устанавливается по коду В2
...В0.
Разрешение вращения уровней приоритета
Сброс разрешения вращения уровней приоритета.
Циклический сдвиг уровней приоритета без завершения прерывания, В2...В0 - двоично- десятичный код для приоритетного кольца.
8
Команды третьего типа имеют формат:
Биты байта команды
Описание
D7 D6 D5 D4 D3 D2 D1 D0
Установка режима опроса
0 0 0 0 1 1 х х
Разрешение чтения регистра ISR.
0 0 0 0 1 0 1 1
Разрешение чтения регистра IRR..
0 0 0 0 1 0 1 0
Разрешение триггера специального маскирования.
0 1 1 0 1 0 0 0
Сброс триггера специального маскирования.
0 1 0 0 1 0 0 0
По команде обычного конца прерывания устанавливается в нулевое
состояние разряд ISR, соответствующий последнему обслуженному запросу.
Команда специального конца прерывания устанавливает в нулевое состояние тот разряд ISR, номер которого указан в разрядах ВО...В2 команды.
Команда циклического сдвига уровней приоритета с обычным концом
прерывания устанавливает в ноль разряд ISR , соответствующий последнему обслуженному запросу и ему же присваивается низший уровень приоритета.
Аналогично работает команда циклического сдвига уровней приоритета со специальным концом прерывания, только низший уровень приоритета
присваивается тому входу IRQ, номер которого указан в разрядах ВО...В2
команды.
Команда циклического сдвига уровней приоритета устанавливает статус уровней приоритета без выполнения операции конца прерывания. Разряды ВО...В2 указывают дно приоритетного кольца.
После выполнения команд разрешения чтения регистров ISR или IRR
при выполнении команды ввода из порта 20h и A0h. считывается соответственно содержимое регистров ISR и IRR. Для получения содержимого
регистра IMR необходимо выполнить чтение портов с адресами соответственно 21h и A1h.
Команда разрешения триггера специального маскирования блокирует
действие тех разрядов ISR, которые замаскированы командой типа 1 (маскирования индивидуальных приоритетных уровней запроса прерывания).
Чтение регистров ISR и IRR может использоваться резидентными программами при проверке возможности своей активизации - можно проверить, не выполняется ли в настоящий момент обработка какого-нибудь прерывания, которая может конфликтовать с действиями резидентной программы.
Механизм прерываний IBM 370.
9
PSW содержит биты, которые могут быть использованы для маскирования
прерываний определенных типов. Будучи замаскированными, прерывания
ввода-вывода, внешние прерывания и прерывания от схем контроля машины
временно запрещаются, но не сбрасываются, а остаются в ожидании последующей обработки. Маска программных прерываний может вызвать игнорирование 4 из 15 типов программных прерываний. Программные прерывания
других типов и прерывание при обращении к супервизору не могут быть замаскированы.
В распоряжение программиста предоставлены команды, с помощью которых он может изменить состояние CPU. Среди них отметим следующие:
ЗАГРУЗКА PSW(LPSW), УСТАНОВИТЬ МАСКУ ПРОГРАММЫ(SPM),
УСТАНОВИТЬ МАСКУ СИСТЕbl (SSM), ОБРАЩЕНИЕ К СУПЕРВИЗОРУ (SVC) и УСТАНОВИТЬ КЛЮЧ ПАМЯТИ (SSK). Большинство из этих
команд являются привилегированными командами и могут быть выполнены
только в режиме супервизора (т. е. бит Р в поле флажков текущего PSW равен
0).
С каждым из пяти классов прерываний (ввода-вывода, программных, обращений к супервизору, внешних и от схем контроля машины) связаны два
двойных слова, называемые «старым» и «новым» PSW, которые расположены в постоянно распределенных ячейках основной памяти. При возникновении прерывания аппаратно реализованный механизм прерывания 1) записывает текущее PSW на место старого PSW и 2) загружает новое PSW в качестве текущего, Таким образом, управление передается программе обработки
прерывания, адрес которой задан в новом PSW; остальные поля в новом PSW
также могут отличаться от соответствующих полей в старом PSW.
10
Последней командой в программе обработки прерывания
обычно является
3)
команда
LPSW, которая загружает старое
PSW на место текущего. Система
тем самым восстанавливает предшествующее прерыванию состояние и продолжает выполнение
прерванной программы. На рис. 1
показаны расположение в памяти
ячеек, используемых аппаратно
реализованным механизмом прерываний, и трехшаговая последовательность реализации обработки
прерываний.
Обработка прерываний
Рис. 1.
Программы обработки прерываний могут обращаться к информации,
содержащейся в старом PSW, чтобы проанализировать причину, вызвавшую прерывание.
Старое PSW содержит прерывания и адрес команды,
которая должна была выполнена следующей
Каждое программное и внешнее прерывание однозначно идентифицируется кодом прерывания; например, для программных прерываний 01 - недействительный код операции; 02 привилегированная операция; 08 - переполнение с фиксированной точкой и т. д. В случае прерываний ввода-вывода код
прерывания определяет адрес канала и устройства, вызвавшего прерывание.
Поле состояние CSW, заполняемое в момент прерывания, содержит информацию, объясняющую причину прерывания; например, бит 36 в CSW, равный
1, означает конец работы канала; бит 37 в CSW, равный 1, означает конец
работы устройства и т. д. В случае прерывания при обращении к супервизору
в поле «код прерывания» переносится однобайтовое поле данных из соответствующей команды SVC.
Существуют различные обстоятельства, при которых необходимо замаскироваться от прерываний. Например, если пришло прерывание ввода-вывода
от некоторого устройства (пусть это будет устройство чтения системного ввода), то информация о текущем состоянии запоминается в ячейке старого PSW
ввода-вывода. Если во время обработки этого прерывания придёт прерывание от другого устройства, например АЦПУ, то текущее состояние снова будет
записано в ячейку старого PSW ввода-вывода, уничтожив тем самым его
предыдущее содержимое.
В результате мы потеряем информацию о первоначальном состоянии и
не сможем восстановить начальные условия. Этой ситуации избегают обычно
с помощью 1) либо полного маскирования всех прерываний на все время
обработки прерывания, 2) либо временного маскирования прерываний для
копирования содержимого старого PSW в стек.
Download