- •Системное программное обеспечение
- •Разд. 1. Операционные системы и среды
- •Тема 1.1. Структура программного обеспечения вычислительной системы
- •Тема 1.2 Назначение, функции и структура операционной системы
- •1.2.1 Типы ос. Системы реального времени и операционные системы реального времени
- •Тема 1.3. Управление временем центрального процессора
- •Рекомендуется всегда проверять возвращаемое значение Res. Получение и использование процессом ссылок на себя
- •Использование потоков при разработке приложений
- •1.3.3 Синхронизация взаимодействующих потоков
- •Interlocked – функции.
- •Семафорные примитивы Дейкстры
- •Решение проблемы критических участков с помощью семафорных примитивов Дейкстры
- •1.3.4 Синхронизации потоков средствами операционной системы
- •Пример 2
- •Пример 3 Поток_1 Поток_2
- •1.3.5. Проблема тупиков и методы борьбы с тупиками
- •Взаимного исключения, при котором процессы имеют монопольный доступ к ресурсам;
- •Ожидания, при котором процесс, запрашивающий ресурс, ждет до тех пор, пока запрос не будет удовлетворен, удерживая ранее полученные ресурсы;
- •Методы борьбы с тупиками
- •Тема 1.4 Управление памятью
- •Защищенный режим процессоров Intel и его возможности
- •1.4.2. Реализация многозадачного режима в защищенном режиме процессоров фирмы Intel
- •Аппаратная поддержка многозадачности
- •Обработка прерываний в реальном режиме. Вектора прерываний.
- •Режимы работы мп 386
- •Системный режим
- •Особенности s – режима.
- •Организация виртуальной памяти
- •Управление страничной памятью в ос ms Windows
- •Линейный адрес
- •1.4.4. Разделы в виртуальном адресном пространстве процесса
- •Области применения dll
- •Основные dll ms Windows:
- •Создание dll
- •Использование dll (импорт функций из dll)
- •Неявная загрузка dll (неявное подключение)
- •Явная загрузка dll
- •Выполнение процедур инициализации и деинициализации Dll
- •Тема 1.6 Структура ms Windows и драйверы режима ядра
- •Тема 1.7 Управление вводом-выводом и файловые системы Win32
- •Эволюция файловых систем эвм
- •Раздел 2. Программирование в операционной среде
- •Тема 2.1. Ассемблеры и макроязыки
- •2.1.1. Этапы подготовки программы к выполнению
- •Операнды команд
- •Алгоритмы работы Ассемблеров
- •Двухпроходный Ассемблер - 1-й проход
- •2.1.2. Макроязыки
- •Заголовок макроопределения
- •Окончание макроопределения
- •Локальные переменные макроопределения
- •Присваивание значений переменным макроопределения
- •Оператор безусловного перехода и метки макроопределения
- •Тема 2.2.Трансляторы
- •2.3.1. Трансляторы. Компиляторы и интерпретаторы. Мобильность программного обеспечения
- •Тема 2.3 Формальные языки и грамматики
- •Синтаксический и лексический анализатор
- •Детерминированные и недетерминированные автоматы
- •Алгоритм синтаксического анализа
- •Пример 1
- •Пример 2
1.4.2. Реализация многозадачного режима в защищенном режиме процессоров фирмы Intel
Реализация защиты ОС от прикладных программ
Защита ОС от разрушения требует наложения на прикладные программы трех типов ограничений:
обычным программам запрещается выполнять некоторые команды;
обычным программам должны быть недоступны некоторые сегменты, досупные ОС;
получение привилегий ОС должно быть возможным только входом в нее в определенных точках входа.
Возможны 2 способа реализации защиты ОС :
работа процессора в состояниях супервизор-задача:
вызов процедур привилегированного кольца.
1 способ – при необходимости получения услуг от ОС(ввод-вывод) прикладная программа выполняет команду SVC . При этом процессор переключается в режим супервизор. Недостаток – время переключения задач в 7 раз больше врмени вызова процедуры, поэтому в МП Intel используется и второй метод – вызов процедур:
Шлюзы вызова
Для вызова процедур ОС в определенных точках применяются шлюзы вызова. Хранятся в GDT, имеют формат дескриптора
Рисунок 1 – 16 – формат шлюза вызова
Системные и прикладные программы имеют раздельные стеки, при вызове сист программы выполняется перепись n слов из стека прикладной программы в стек системной процедуры.
Вызовы из 0 кольца процедер 3 кольца(из более прив менее прив) запрещены.
Аппаратная поддержка многозадачности.
При переключении задач необходимо сохранение текущего состояния задачи – для этого служит TSS – Task Status Segment. (сохранение регистров ЦП…). Имеется регистр задачи TSS.
Для переключения на задачу необходимо в регистр TSS записать селектор TSS.
Шлюзы задач
Для переключения на задачу из более привилегированного кольца служат шлюзы задач. Их дескрипторы хранятся в GDT.
Рисунок 1-17 –формат шлюза задачи
Аппаратная поддержка многозадачности
Многозадачность поддерживается с помощью переключения с одной задачи на другую. (Задача - это поток, время выделяется потокам).
С каждым потоком связывается сегмент памяти, содержащий информацию для запуска и остановки. Сегмент TSS (Task Status Segment).
Регистр задачи – 16-ти разрядный регистр, в котором содержится сегмент TSS.
GDT
дескриптор
TSS
Селектор
TSS
Структура TSS:
Селектор вызвавшей задачи |
Стек кольца 0 (указатель начала) |
Стек кольца 1 |
Стек кольца 2 |
Регистры ЦП |
Регистры LTD |
Дополнительные параметры |
Рисунок 1-18 – структура TSS
Стек кольца 0,1,2- указатель на начало стека.
Регистр задачи: селектор текущей задачи (регистр TR)
Обработка прерываний в реальном режиме. Вектора прерываний.
Система прерываний. Прерывания делятся на программные и внешние. Номер прерывания формируется программно (int 21h) или контроллером прерываний. Система прерываний любого компьютера является его важнейшей частью, позволяющей быстро реагировать на события, обработка которых должна выполняться немедленно: сигналы от машинных таймеров, нажатия клавиш клавиатуры или мыши, фатальные ошибки, возникающие при выполнении программы и пр.
1024
CS:IP
Номер
Прерывания 0
Seg
off
Рисунок 1-19 схема обработки прерываний в реальном режиме
Пользователь легко может изменить содержимое таблицы векторов и прерываний – нарушение работы ОС (DOS). Серьёзный недостаток!
Обработка прерываний в защищенном режиме
В защищенном режиме – система прерываний имеет дело не с таблицей векторов прерываний, а с таблицей дескрипторов прерываний (IDT – interrupt descriptor table) – доступ к содержимому IDT из пользовательских программ невозможен.
47 IDTR 0
-
адрес
Размер
Рисунок 1-20 – структура регистра IDTR
Содержимое таблицы IDT:
шлюзы прерываний (interrupt gate)
шлюзы спец. прерываний (trap gate)
шлюзы задач (task gate)
При возникновении прерывания (если они разрешены) – действия ЦП определяются дескриптором; определяемым номером прерывания
Шлюз задачи – выполняет прерывание задач и смену TSS. Обработка выполняется медленнее.
Необходимость в подобном переключении возникает, если, например, разрушен TSS текущей задачи.
Так же как и в реальном режиме, все прерывания защищенного режима имеют свои номера, причем их общее количество не должно превышать 256. В реальном режиме процессор при регистрации прерывания обращается к таблице векторов прерываний, находящейся всегда в самом начале памяти и содержащей двухсловные адреса обработчиков прерываний. В защищенном режиме аналогом таблицы векторов прерывании является таблица дескрипторов прерываний (IDT от Interrupt Descriptor Table), которую создает операционная система защищенного режима. Таблица IDT содержит дескрипторы обработчиков прерываний, в которые, в частности, входят их адреса.
Если в таблицах дескрипторов памяти (LDT и GDT) находятся дескрипторы сегментов программы, то таблица дескрипторов прерываний 1DT состоит из дескрипторов другого вида, которые называются шлюзами (вентилями). Через шлюзы осуществляется доступ к обработчикам прерываний и исключений. Шлюз, как и дескриптор памяти, занимает 8 байт и в него входит полный адрес (16-разрядный селектор и 32-разрядное смещение) обработчика данного прерывания.
Процессор, зарегистрировав то или иное исключение, сохраняет в стеке содержимое расширенного регистра флагов, селектор сегмента команд, смешение точки возврата, а также (в некоторых случаях) 32-битовый код ошибки. Таким образом, в отличие от реального режима, где в результате прерывания стек смещается на 3 слова, в - защищенном режиме в стек заносятся 3 или даже 4 двойных слова. Код ошибки, если он есть, должен быть снят со стека обработчиком соответствующего исключения.
Сохранив вектор прерванного процесса, процессор по номеру вектора извлекает из IDT шлюз, определяет адрес обработчика и передает ему управление. Обработчик заканчивается командой iret, возвращающей управление в прерванную программу.
В состав этой процедуры входит, в частности, чтение номера вектора, устанавливаемого контроллером прерываний на шине данных компьютера. При этом контроллер прерываний формирует передаваемый в процессор номер вектора путем сложения базового номера, хранящегося п контроллере, с номером линии, по которой поступил запрос от устройства. Номер базового вектора (в принципе в диапазоне 0..255) устанавливается в процессе программной инициализации контроллера. Поскольку в защищенном режиме векторы 0...31 зарезервированы за исключениями, базовые векторы контроллеров прерываний должны быть расположены в диапазоне 32...255.
Нарушения в работе программы, приводящие к исключениям, могут иметь разную природу и разные возможности исправления в процессе выполнения программы. В соответствии с этим исключения подразделяются на 3 класса: нарушения, ловушки и аварии.
Нарушение, или отказ, (fault) - это исключение, фиксируемое еще до выполнения команды или в процессе ее выполнения. Типичными примерами нарушений являются адресация за установленной границей сегмента или обращение к отсутствующему дескриптору. При обработке нарушения процессор сохраняет в стеке адрес той команды, выполнение которой привело к исключению. При этом предполагается, что в обработчике нарушения его причина будет ликвидирована, после чего команда iret вернет управление на ту же, еще не выполненную команду. Таким образом, сам механизм обработки нарушений предполагает восстановление этого программного сбоя.
Ловушка (trap) обрабатывается процессором после выполнения команды, вызвавшей это исключение, и в стеке сохраняется адрес не этой, а следующей команды. Таким образом, после возврата из обработчика ловушки выполняется не команда, инициировавшая исключение, а следующая за ней команда программы. К ловушкам относятся все команды программных прерываний int.
Авария, или выход из процесса, (abort) является следствием серьезных невосстановимых ошибок, например обнаружение в системных таблицах неразрешенных или несовместимых значений. Адрес, сохраняемый в стеке, не позволяет локализовать вызвавшую исключение команду, и восстановление программы не предполагается. Обычно аварии требуют перезагрузки системы.
По-другому обстоит дело в 32-разрядных приложениях. В таких приложениях используется модель плоской памяти, в которой все сегменты имеют размер 4 Гбайт. В этом случае нельзя выйти за пределы сегмента; однако программе реально выделяется в оперативной памяти (в процессе отображения линейных адресов на физические) лишь столько места, сколько она фактически занимает. Выход за пределы объявленного в программе массива приведет к попытке обращения к ячейке оперативной памяти, находящейся за пределами адресов, отображенных на линейное пространство программы. В этом случае будет сформировано страничное нарушение.
