 |
мер для перемещения кодового сегмента.
3.4.4. Защита страниц
Системы, которые широко не используют защиту сегментов,
вместо этого могут защищать страницы (защита старниц может
быть также приложима к отдельным чатям больших сегментов).
Аналогично дескриптору элемент страничной таблицы имеет набор
атрибутов защиты, процессор 80386 проверяет каждое обращение
к странице на соответствие этим атрибутам.
Элемент страничной таблицы может быть отмечен одним из
двух уровней привилегий: пользовательский или супервизорный.
Пользовательский уровень соответствует уровню привилегий 3, а
супервизорные страницы могут быть досатупны только задачам,
работающим с уровнями привилегий 0, 1 или 2, пользовательская
страница может быть отмечена как доступная только для чтения
или для чтения и записи.
Процессор 80386 проверяет атрибуты защиты страниц после
того, как он удостоверился, что доступ находится в соответст-
вии с атрибутами сегмента. Таким образом, защита старниц яв-
ляется удобным средством для операционной системы реализовать
дополнительную защиту частей сегментов. Например, операцион-
ная сиситема может базопасно заполнить данные операционной
системе, относящиеся к задачам, такие как страничные таблицы
и дескрипторы файлов, в сегменте данных задачи, обозначив
страницы, где расположены эти данные, как супервизорные.
3.5. Системные вызовы
Большинство операционных систем организуют свои функции
как набор процедур, которые могут быть вызваны задачами. Не-
защищенная операционная система процессора 80386 может помес-
тить свои процедуры и прикладной код в кодовой сегмент с
уровнем привилегии 0/ или в более чем один такой сегмент,
прикладная задача может затем вызвать функцию операционной
системы обычной командной вызова. Такой подход является быст-
рым, но требует от прикладных задач, чтобы в них не было оши-
бок и чтобы они выполнялись правильно (как это, например, ре-
ализуется во встроенных системах). Ничто не запрещает задаче,
работающей на уровне привилегии 0, вызывать процедуры, нахо-
дящиеся в адресе, который не является точкой входа в операци-
онную систему, ничто не запрещает такой задаче испортить дан-
ные операционной системы. Для защиты операционной системы
прикладные прогарммы и данные могут быть помещены в менее
привилегированные сегменты. Также как задача, работающая на
данном уровне привилегии, не может читать или писать данные в
сегмент с большим уровнем привилегии, задача также не может
непосредственно вызвать процедуру из более привилегированного
сегмента.
Для того, чтобы позволить задаче, исполняющей команды из
менее привилегированного сегмента, сделать вызов защищенной
системной процедуры, операционная система должна определить
одну или более входных точек. В процессоре 80386 эти входные
точки называются шлюзами (см.Рис.3-9).
атрибуты
счетчик двойных слов
тип
привилегия
ЙНННЛНННЛННННННЛННННННННННЛНННННННННННННННННННННН»
є є є є є бит наличия є
МНННКНННКННННННКННННННННННКНННННННННННННННННННННН№
є указатель точки входа є
ИННННННННННННННННННННННННННННННННННННННННННННННННј
Счетчик двойных слов относится только к шлюзам
Имеются два типа шлюзов, которые могут быть использованы
для реализации входных точек операционной системы: шлюзы ло-
вушек и шлюзы вызовов. Два типа шлюзов, вообще говоря, похо-
жи, однако шлюз вызова позволяет сделать интерфейс операцион-
ной системы идентичным с интерфейсом обычной процедуры. Ис-
пользуя шлюзы вызовов, программисты компиляторов и ассембле-
ров могут использовать общий набор соглашений для вызова лю-
бых процедур, оставляя за процессором 80386 заботы о дополни-
тельной обработке, необходимой для изменения уровней привиле-
гии.
Как показано на рис.3-9, шлюз содержит логический адрес
входной точки и набор атрибутов. Наиболее важный атрибут -
это уровень привилегии шлюза. Уровень привилегии шлюза опре-
деляет уровни привилегии, которые могут использовать шлюз,
для использования шлюза вызывающая процедура должна быть, как
минимум, также привилегирована как шлюз. На рис.3-10 Показан
пример. В этой гипотической системе программа пользователя
имеет уровень привилегии 3, в то время как операционная сис-
тема разделена на 2 уровня. Ядро операционной системы работа-
ет на уровне привилегии 0, а менее критичные функции операци-
онной системы работают на уровне привилегии 1. (Уровень при-
вилегии 2 не используется). В этой системе пользовательская
программа позволяет вызывать сервисные процедуры, но не ядро.
В соответствии с этим обеспечивает шлюз для сервисных проце-
дур. Уровень привилегий этого шлюза равен 3, так что програм-
ма пользователя может вызывать процедуры через него. Присваи-
вая шлюзу ядра уровень привилегиии 1, операционная система
позволяет сервисным процедурам вызывать ядро, но запрещает
доступ к программе пользователя, которая менее привилегирова-
на, чем шлюз ядра. Таким образом операционная система может
применять шлюзы для аккуратного определения своих точек вхо-
да, включая уровни привилегии, необходимые для использования
этих точек входа. Для того, чтобы сделать функции операцион-
ной системы вызываемыми из всех задач, операционная система,
обычно помещает их шлюзы вызовов в глобальную таблицу деск-
рипторов.
Для осуществления вызова через шлюз ловушки задача ис-
пользует команду прерывания, для осуществления вызова через
шлюз вызова задача исполняет команду обычного межсегментного
вызова. Обе команды изменяют уровень привилегии заадчи пере-
ходят к стеку, определенному (в TSS задаче) для старшего
уровня привилегии. (Определенная система должна иметь свой
собственный стек для того, чтобы гарантировать достаточно
стековое пространство для работы, нельзя верить прикладным
задачам, что они имеют достаточное стековое пространство).
Перед вызовом через стек вызова задача может заслать па-
раметры в свой стек, как она сделала бы это перед вызовом
другой процедуры. Процессор 80386 автоматически копирует па-
раметры в привилегированный стек (поле счетчика двойных слов
в шлюзе вызова говорит процессору 80386, сколько двойных слов
параметров необходимо скопирировать). Системы, которые осу-
ществляют вызовы через шлюзы ловушек, могут пересылать пара-
метры в регистрах.
3.6. Прерывания и особые ситуации
Устройства генерируют прерывания, когда они требуют вни-
мания, в то время как команды могут вызвать особые ситуации,
если при их использовании возникают особые условия, такие как
несуществующая страница. Типичное прерывание или особая ситу-
ация требуют быстрого вмешательства программного драйвера,
который отвечает на прерывание или особую ситуацию. После то-
го, как драйвер вернет управление, 80386 возобнавляет испол-
нение командного потока, который был прерван или который выз-
вал особую ситуацию. Поскольку прерывания и особые ситуации
весьма похожи, процессор 80386 рассматривает их унифицирован-
ным способом.
Каждый источник прерывания и каждый тип особой ситуации
имеет идентофикационных номер в диапазоне от 0 до 255, про-
цессор 80386 использует этот номер для того, чтобы вызвать
обработчик, связанный с прерыванием или особой ситуацией. При
возникновении особых ситуаций они распознаются процессором
80386, который определяет номера особых ситуаций, как это по-
казано в табл.3-1. Номера прерываний определяются операцион-
ной системой. Операционная система инициализирует программи-
руемый контроллер прерываний 8259а таким образом, что каждый
источник прерываний связывается со своим номером. При появле-
нии прерывания 8259а передает процессору 80386 номер прерыва-
ния. Команды прерываний указывают свои номера своих операн-
дах. Заметим, что для совместимости с существующим и будущим
оборудованием фирмы интел номера прерываний и особых ситуаций
от 0 до 71 не должны использоваться иначе, чем это указано в
табл.3-1. Все другие номера могут применяться без ограниче-
ний.
Таблица 3-1.
ЙННННННННННННННННЛНННННННННННННННННННННННННННННННННННННННННН»
є Номер є Описание є
МННННННННННННННННОНННННННННННННННННННННННННННННННННННННННННН№
є 0 є деление на 0 є
є 1 є особая ситуация отладки є
є 3 є контрольная точка программы є
є 4 є переполнение є
є 5 є нарушение гарниц массива є
є 6 є недопустимый код операции є
є 7 є сопроцессор отсутствует є
є 8 є двойная ошибка є
є 10 є неправильный TSS є
є 11 є сегментная ошибка є
є 12 є переполнение стека сверху или снизу є
є 13 є нарушение общей защиты є
є 14 є страничная ошибка є
є 16 є ошибка сопроцессора є
ИННННННННННННННННКННННННННННННННННННННННННННННННННННННННННННј
3.6.1. Таблица дескрипторов
Сгенерировав или получив номер прерывания или особой си-
туации, процессор 80386 использует его как индекс в таблице
дескрипторов прерываний (IDT). IDT Может быть расположена в
любом месте памяти, операционная система инициализирует IDT и
загружает ее адрес в регистр таблицы дескрипторов прерываний
(IDTR). Подобно GDT или LDT, IDT является вектором дескрипто-
ров, хотя шлюзы являются единственным типом дескрипторов, до-
пустимых в IDT. В IDT имеется один шлюз для каждого обработ-
чика прерывания и особой ситуации (IDT функционально подобна
таблице прерываний, имеющейся во многих архитектурах).
Обработчик прерываний или особых ситуаций процессора
80386 может быть реализован в виде процедуры или задачи, ниже
кратко обсуждаются достоинства этих двух способов. Процессор
80386 вызывает обработчик, организованный в виде процедуры
так, он выполняет системный вызов через шлюз. Для вызова об-
работчика, организованного в виде задачи, процессор 80386
осуществляет переключение задач. Тип шлюза IDT обработчика
говорит процессору, каким образом необходимо вызвать обработ-
чик (см. Табл.3-2). Как было указано, шлюзы прерываний и ло-
вушек функционально подобны шлюзам вызовов, за исключением
того что они заставляют 80386 запомнить регистр флагов в стек
обработчика. Они отличаются один от другого только состоянием
флага разрешения прерывания (IF) при входе в обработчик, в
обработчик прерываний входят с запрещенными прерываниями, в
то время как в обработчик ловушки, который обычно использует-
|