Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os2.doc
Скачиваний:
0
Добавлен:
20.06.2023
Размер:
246.78 Кб
Скачать

2.5. Процедуры ос

Процедуры ОС - это средство синхронной передачи управления, которое приводит к перестановке контекста процессора. По своему внешнему виду вызов процедуры ОС очень похож на вызов обычной процедуры в программе.

Отличие процедуры ОС от обычной процедуры состоит в более глубокой модификации контекста.

Процедуры операционной системы – это процедуры с более высоким приоритетом, чем пользовательские.

Ранее рассматривали примитивы - базовые операции некоторого логического уровня среды, предоставляемые вышележащему уровню. Вызов такого примитива с этого вышележащего уровня и есть вызов процедуры ОС.

Пример. Вызов write(a) внешне очень похож на вызов обычной процедуры. Однако, это не обычный вызов, т. к. в нем идет обращение к функциям ОС.

Как и в обычных процедурах создается некоторый протокол передачи параметров в процедуры ОС, например, в рабочих регистрах передается номер запрашиваемых действий.

Процедуры ОС обычно предоставляются пользователю как уже готовые в форме API - интерфейса прикладного программирования.

Отличия процедур ОС от обычных процедур состоят в следующем:

  1. На входе в такую процедуру осуществляется проверка прав пользователя на ее вызов;

  1. Контекст переносится в область памяти, недоступную пользователю;

  1. После выполнения процедуры возврат не всегда осуществляется в точку вызова.

Вызовы процедур ОС в форме API можно трактовать как расширения языка программирования, но только более аппаратно-зависимые.

Как осуществлять с низкоприоритетного уровня вызов процедуры более высокого уровня приоритета? Для этого архитектура защищенного режима опять предоставляет специальное средство, называемое коммутатор или шлюз. Вспомним, что обращение к памяти в защищенном режиме осуществляется через дескрипторы, находящиеся в специальной таблице. Вместо адреса памяти в инструкцию помещается селектор – адрес дескриптора.

Селектор содержит поле RPL - запрашиваемый уровень привилегий.

Смещение в таблице дескрипторов

RPL

Дескриптор содержит поле DPL - уровень привилегий дескриптора. Если при запросе RPL = DPL, то запрос будет обслужен. Дескрипторы задач ОС - это дескрипторы с большим уровнем привилегий DPL, чем уровень RPL запросов пользователя.

Поэтому для согласования уровней существует специальное средство - шлюз.

Шлюз - это специальный дескриптор с уровнем привилегий DPL, низким, равным пользовательскому уровню, но содержащий в поле адреса новый селектор с уровнем RPL, более высоким, чем уровень пользователя. А этот новый селектор содержит RPL, соответствующий уровню привилегий дескриптора, указывающего на процедуру ОС.

RPL - запрашиваемый уровень привилегий

DPL - уровень привилегий дескриптора

Группа 1

Селектор пользователя с уровнем привилегий 2 обращается к шлюзу, имеющему уровень привилегий 2, но содержащему селектор с уровнем привилегий 1

Прямая соединительная линия 44 Прямая со стрелкой 45

2.6. Прерывания как асинхронный метод замены контекста

Мы сказали ранее, что к асинхронным методам замены контекста относятся такие методы, которые используются, когда момент замены контекста заранее неизвестен. Такая ситуация имеет место, когда инициатором замены контекста является внешняя по отношению к компьютеру среда.

Вообще существует три способа преодоления асинхронности, т.е. неопределенности момента появления сигналов внешней среды:

  1. Активное ожидание;

  2. Периодический опрос;

  3. Прерывания.

Приведем пример. Мы находимся, дома и знаем, что должен прийти гость. Чтобы не пропустить момент прихода гостя, надо:

  1. Сидеть у дверей и ждать его (активное ожидание) - недостаток этого метода в том, что много времени теряется зря;

  2. Делать свою работу, но периодически подходить к двери и проверять, не пришел ли гость (периодический опрос) – недостаток этого метода состоит в том, что можно пропустить момент прихода гостя;

  3. Установить звонок и спокойно заниматься своей работой, когда гость придет, он сам звонком сообщит о своем приходе (прерывания). Для реализации этого метода необходимы специальные средства - звонок.

В компьютере в качестве звонка от внешней среды и выступает система прерываний.

Система прерываний - это сложная система, представляющая собой совокупность программных и аппаратных средств. Кратко напомню содержание этих средств.

Аппаратные компоненты:

Сигналы от внешней среды

Микропроцессор

Контроллер прерываний

Память

Таймер

СШ

При появлении сигнала от внешней среды контроллер выдает сигнал int на свой выход. Наличие этого сигнала процессор проверяет после выполнения каждой инструкции. По приему сигнала int процессор выдает сигнал подтверждения прерывания inta. По этому сигналу контроллер выдает номер прерывания на шину данных. По номеру прерывания процессор находит адрес обработчика прерывания с этим номером и передает ему управление. После обработки прерывания управление возвращается к прерванной программе.

Таким образом, память содержит следующие структуры, поддерживающие систему прерываний:

  1. Таблицу векторов прерываний - таблицу соответствия номеров прерываний адресам точек входа в обработчики прерываний;

  2. Программы обработчиков прерываний.

В реальном режиме таблица векторов располагается с 0-го адреса памяти, в защищенном режиме на адрес таблицы указывает регистр IDTR - регистр таблицы дескрипторов прерываний.

Номер прерывания надо умножить на 4, чтобы узнать смещение в таблице векторов, по которому находится адрес обработчика прерывания с этим номером.

Если прерывания могут вызываться несколькими причинами, используется один из двух механизмов различения причины прерывания:

  1. Обработчик на все причины один, но причина передается дополнительным параметром, например, вызов прерывания ДОС, когда номер функции передается в регистре;

  2. С каждой причиной связывается свой обработчик, так обслуживаются аппаратные прерывания. В этом случае говорят о многоуровневой системе прерываний.

В многоуровневой системе появляются понятия приоритета уровней и маскирования уровней.

Проблемы приоритетов и маскирования решаются аппаратно на уровне контроллера. Приоритетность организуется следующим протоколом:

Сигнал на входе с меньшим номером закрывает входы с большими номерами.

Маскирование - это программное закрытие некоторого входа контроллера прерываний. Для запоминания маски контроллер содержит специальный регистр.

Вообще контроллер представляется внешним устройством, доступ к которому осуществляется как к портам ввода/вывода с помощью инструкций in и out.

Общая схема обработки прерывания

Классический вариант:

  1. Выполнение текущей программы приостанавливается;

  2. Начинается выполнение программы-обработчика прерывания;

  3. Обработка прерывания;

  4. После завершения обработки процессор возвращается к прерванной программе.

Нас будет интересовать несколько иная последовательность действий. А именно:

  1. Обработка прерывания заключается в определении, какую программу следует запустить или продолжить. Это не обязательно должна быть прерванная программа.

  2. Установление контекста запускаемой программы

Логическая схема обработки прерывания

Временная диаграмма обработки прерывания

Прерывания от таймера

P

Q

Обработчик

Каким образом можно вернуться в другую программу из прерывания?

Рассмотрим этот вопрос для сопрограмм. Чтобы вернуться в другую сопрограмму после прерывания одной из сопрограмм, необходимо в обработчик включить вызов процедуры Transfer, переключающей текущий стек на стек другой сопрограммы.

Посмотрим, как будут выглядеть стеки сопрограмм при прерываниях.

Стек Р Стек Q

BP

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

BP

IP

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.

Соседние файлы в предмете Операционные системы