- •Раздел 2. Механизмы последовательного выполнения программ
- •2.1. Классификация методов замены контекста
- •2.2. Процедуры как синхронные методы замены контекста
- •2.3. Сопрограммы
- •2.4. Примеры реализации сопрограмм в Си, в защищенном режиме процессора и в Win32
- •2.4.1. Пример реализации сопрограмм в Си
- •2.4.2. Пример реализации сопрограмм в защищенном режиме
- •2.4.3. Пример реализации сопрограмм в Win32
- •2.5. Процедуры ос
- •2.6. Прерывания как асинхронный метод замены контекста
- •2.7. Исключения
- •2.7.1. Самая общая характеристика исключений
- •2.7.2 Исключения на низком уровне
- •2.7.3. Исключения в программных средах
- •2.7.4. Обработка исключений в Delphi
- •2.7.4.1. Защита ресурсов
- •2.7.4.2. Обработка исключений
2.6. Прерывания как асинхронный метод замены контекста
Мы сказали ранее, что к асинхронным методам замены контекста относятся такие методы, которые используются, когда момент замены контекста заранее неизвестен. Такая ситуация имеет место, когда инициатором замены контекста является внешняя по отношению к компьютеру среда.
Вопрос (
Вообще существует три способа преодоления асинхронности, т.е. неопределенности момента появления сигналов внешней среды:
активное ожидание;
периодический опрос;
прерывания.
)Вопрос
Приведем пример. Мы находимся, дома и знаем, что должен прийти гость. Чтобы не пропустить момент прихода гостя, надо:
сидеть у дверей и ждать его (активное ожидание) - недостаток этого метода в том, что много времени теряется зря;
делать свою работу, но периодически подходить к двери и проверять, не пришел ли гость (периодический опрос) – недостаток этого метода состоит в том, что можно пропустить момент прихода гостя;
установить звонок и спокойно заниматься своей работой, когда гость придет, он сам звонком сообщит о своем приходе (прерывания). Для реализации этого метода необходимы специальные средства - звонок.
В компьютере в качестве звонка от внешней среды и выступает система прерываний.
Система прерываний - это сложная система, представляющая собой совокупность программных и аппаратных средств. Кратко напомню содержание этих средств.
Вопрос (
Аппаратные компоненты:
сигналы от внешней среды
Микропроцессор
Контроллер прерываний
Память
Таймер
СШ
)Вопрос
При появлении сигнала от внешней среды контроллер выдает сигнал int на свой выход. Наличие этого сигнала процессор проверяет после выполнения каждой инструкции. По приему сигнала int процессор выдает сигнал подтверждения прерывания inta. По этому сигналу контроллер выдает номер прерывания на шину данных. По номеру прерывания процессор находит адрес обработчика прерывания с этим номером и передает ему управление. После обработки прерывания управление возвращается к прерванной программе.
Вопрос (
Таким образом, память содержит следующие структуры, поддерживающие систему прерываний:
таблицу векторов прерываний - таблицу соответствия номеров прерываний адресам точек входа в обработчики прерываний;
программы обработчиков прерываний.
В реальном режиме таблица векторов располагается с 0-го адреса памяти, в защищенном режиме на адрес таблицы указывает регистр IDTR - регистр таблицы дескрипторов прерываний.
Номер прерывания надо умножить на 4, чтобы узнать смещение в таблице векторов, по которому находится адрес обработчика прерывания с этим номером.
)Вопрос
Если прерывания могут вызываться несколькими причинами, используется один из двух механизмов различения причины прерывания:
обработчик на все причины один, но причина передается дополнительным параметром, например, вызов прерывания ДОС, когда номер функции передается в регистре;
с каждой причиной связывается свой обработчик, так обслуживаются аппаратные прерывания. В этом случае говорят о многоуровневой системе прерываний.
В многоуровневой системе появляются понятия приоритета уровней и маскирования уровней.
Проблемы приоритетов и маскирования решаются аппаратно на уровне контроллера. Приоритетность организуется следующим протоколом:
сигнал на входе с меньшим номером закрывает входы с большими номерами.
Маскирование - это программное закрытие некоторого входа контроллера прерываний. Для запоминания маски контроллер содержит специальный регистр.
Вообще контроллер представляется внешним устройством, доступ к которому осуществляется как к портам ввода/вывода с помощью инструкций in и out.
Программные средства доступа к системе прерываний
Ассемблер. Можно использовать функции ДОС 25h и 35h для установки и чтения векторов прерываний. Обработчик прерываний должен сохранять в стеке все регистры на входе, восстанавливать их на выходе, завершать свою работу командой конца прерывания (для аппаратного прерывания) и инструкцией iret.
Паскаль. Паскаль имеет библиотечные процедуры для чтения и установки векторов прерываний - GetIntVec и SetIntVec. Кроме того, присвоение специального атрибута "interrupt" процедуре автоматически обеспечивает ее оформление как обработчика прерываний с сохранением и восстановлением всех регистров и возвратом по iret.
Общая схема обработки прерывания
Вопрос (
Классический вариант:
Выполнение текущей программы приостанавливается;
Начинается выполнение программы-обработчика прерывания;
Обработка прерывания;
После завершения обработки процессор возвращается к прерванной программе.
Нас будет интересовать несколько иная последовательность действий. А именно:
Обработка прерывания заключается в определении, какую программу следует запустить или продолжить. Это не обязательно должна быть прерванная программа.
Установление контекста запускаемой программы
)Вопрос
Вопрос (
Логическая схема обработки прерывания
)Вопрос
Временная диаграмма обработки прерывания
Прерывания от таймера
P
Q
Обработчик
Каким образом можно вернуться в другую программу из прерывания?
Рассмотрим этот вопрос для сопрограмм. Чтобы вернуться в другую сопрограмму после прерывания одной из сопрограмм, необходимо в обработчик включить вызов процедуры Transfer, переключающей текущий стек на стек другой сопрограммы.
Посмотрим, как будут выглядеть стеки сопрограмм при прерываниях.
Стек Р Стек Q
BP |
|
BP |
IP |
точка в обработчике после Transfer |
IP* |
CS |
|
CS* |
Ofs Q |
|
Ofs P |
Seg Q |
|
Seg P |
Ofs P |
|
Ofs Q |
Seg P |
|
Seg Q |
AX BX CX DX SI DI DS ES BP |
|
AX BX … ES BP |
IP |
адрес возврата в сопрограмму |
IP# |
CS |
|
CS# |
FL |
|
FL |
у казатель до прерывания
Временная диаграмма переключения сопрограмм при прерываниях выглядит следующим образом:
В стеке возобновляемой сопрограммы символами * обозначен адрес возврата из процедуры Transfer в обработчик прерывания. Т. е. после выхода из процедуры Transfer продолжают выполняться коды обработчика. Последней инструкцией обработчика является инструкция iret, выталкивающая из стека адрес возврата в сопрограмму, обозначенный символами #.
Имеет особенность первый запуск сопрограммы из обработчика.
Из процедуры Transfer мы сразу попадаем в сопрограмму, а не возвращаемся в обработчик, т.к. стек сопрограммы инициализирован так, что на позициях, обозначенных *, установлен адрес точки входа в сопрограмму.
Если набор команд для контроллера, генерирующих сигнал окончания прерывания, будет помещен в обработчике после вызова Transfer, то многозадачная программа окажется неработоспособной, т. к. сигнал окончания прерывания EOI контроллеру при входе в сопрограмму, запущенную первый раз, передан не будет.
Дополнительной особенностью работы сопрограмм в условиях прерываний является необходимость выполнения функции Transfer в режиме с запрещенными прерываниями, т.к. переключение стека происходит за две инструкции mov ss,.. и mov sp, то есть опасность попадания прерывания на момент времени между этими инструкциями. Пара ss:sp в это время будет указывать неправильное положение.
Познакомившись с механизмами работы сопрограмм в сочетании с прерываниями, мы практически изучили механизм реализации временного разделения или многозадачности.
Зная этот механизм, можно будет переходить к изучению механизмов параллельного выполнения программ - разделу 3.

sp
перед переключением