таблиц имеют бит присутствия и поэтому могут быть использованы как
основа для построения виртуальной памятью. Обмен сегментами между
памятью и диском являются разумным подходом, когда сегменты
относительно малы, как это было в 16-битных архитектурах. Когда
сегменты могут быть очень велики, как это возможно в 80786, обмен
страницами обычно является более эффективным приемом благодаря
фиксированному размеру страниц. В страничных системах операционная
система распределяет и освобождает память элементами размером со
страницу, называемыми страничными кадрами; страница , загружаемая
с диска, будет подходить любому имеющемуся кадру. Поскольку
большинство из 32-битных систем с виртуальной памятью основывается
на механизме страниц, оставшаяся часть этого раздела описывает
страничный виртуальный механизм 80786.
В общем случае операционная система со страничной виртуальной
памятью пересылает отсутствующие страницы с диска в страничные
кадры по запросам, т.е. когда она будет оповещена процессором, что
команда обращается к отсутствующей странице. Когда количество
свободных кадров становится маленьким, операционная система также
передает страницы из страничных кадров на диск, пытаясь изъять те
страницы, которые вряд ли будут использованы в ближайшем будущем.
Путем такого "прозрачного" обмена страницами между страничными
кадрами и диском операционная система создает у прикладного
программного обеспечения иллюзию, что физическая память имеет
размер очень большой области обмена на диске. Ниже подробно
описывается этот механизм.
Когда в процессе трансляции логического адреса процессор
получает линейный адрес, который ссылается на элемент страничной
таблицы, чей бит присутствия сброшен, в процессоре возникает
особая ситуация, называемая, условно, страничной ошибкой. Особые
a(bc f(( рассматриваются ниже в этом разделе, но основным
следствием этой ошибки является вызов процессором процедуры
операционной системы, называемой обработчиком страничной ошибки.
При входе в обработчик страничной ошибки Управляющий регистр 2
содержит линейный адрес, связанный с отсутствующей страницей. По
этому адресу обработчик страничной ошибки может найти относящийся
к нему элемент страничной таблицы путем трансляции линейного
адреса, как это делает процессор. Отметим, что все остальные биты,
за исключением бита присутствия в элементе страничной таблицы,
определяются пользователем; они представляют для операционной
системы удобное место для запоминания дискового адреса
отсутствующей страницы. Определив дисковый адрес отсутствующей
страницы, обработчик страничной ошибки может найти свободный
страничный кадр и передать страницу с диска в этот кадр. Затем
обработчик страничной ошибки изменяет адресное поле в элементе
страничной таблицы и бит присутствия, после чего возвращает
управление программе, прерванной страничной ошибкой. После этого
процессор автоматически заново выбирает команду, в которой
произошла страничная ошибка, и результат будет таким же, как если
бы страница ранее находилась в памяти, когда команда начала
исполняться в первый раз.
Другие поля в элементе страничной таблицы процессора 80786
помогают операционной системе эффективно производить действия,
связанные с управлением виртуальной памятью. Кроме загрузки
страниц по запросам операционная система должна поддерживать набор
свободных страничных кадров, которые могут быть распределены
обработчиком страничных ошибок. Для увеличения набора свободных
страничных кадров операционная система должна знать, какой кадр
освободить. Прежде чем освободить кадр, операционная система
должна записать эту страницу на диск, если страница была
модифицирована с тех пор, когда она была загружена. Для того,
чтобы помочь операционной системе в этой длительности, архитектура
80786 имеет бит доступа и бит изменения в каждом элементе
страничной таблицы, процессор изменяет эти биты автоматически, для
всех имеющихся в памяти страниц 80786 устанавливает бит доступа
всегда, когда происходит чтение или запись в данной странице, и
устанавливает бит изменения, когда происходит запись в эту
страницу. Путем периодического просмотра и сброса битов доступа
операционная система может определить страницы, которые давно не
использовались. Кадры, содержащие такие страницы, являются
хорошими кандидатами на освобождение, поскольку страницы, которые
давно не использовались, вряд ли будут использованы в ближайшем
будущем. Когда операционная система выбрала страницу для
освобождения ее страничного кадра, страница не должна записываться
на диск за исключением случая, когда процессор установил ее бит
изменения.
Каждый элемент страничной таблицы также содержит 3-х битное
поле, которое операционная система может использовать по своему
усмотрению. Операционные системы обычно используют это поле для
маркировки страниц специальными знаками такими как, например,
"закрыто для ввода/вывода".
3.4Защита
Процессор 80786 обеспечивает несколько механизмов защиты,
которое операционная система может селективно выбирать для своих
нужд. Одна из форм защиты - отделение пространств адресов задач
при помощи таблиц дескрипторов сегментов и страничных таблиц,
обсуждалась выше. Это разделение эффективно предотвращает
наложение кодов и данных различных прикладных задач. В дополнение
к изоляции задач друг от друга 80386 обеспечивает возможность
' i(bk операционной системы от прикладных задач, защиту одной
части операционной системы от других частей и защиту задач от
некоторых их собственных ошибок. Кроме того, что система защиты
80386 делает операционные системы более надежными, она может
упростить процесс отладки, используя прерывания (ловушки) по
ошибкам для конкретных задач. Все свойства защиты процессора 80386
реализованы внутри кристалла, поэтому действия по проверке защиты
не влияют на производительность процессора.
3.4.1 Привилегии
Многие из свойств защиты процессора 80386 базируются на
понятии иерархии привилегий. В любой момент привилегии задачи
эквивалентна уровню привилегий исполняемого кодового сегмента. В
каждом дескрипторе сегмента имеется поле, которое определяет
уровень привилегии связанного с ним сегмента, поле может принимать
0 - это наиболее привилегированный уровень, а уровень привилегии 3
- наименее привилегированный.
На рис.3-8 Показано, как уровни привилегии процессора 80386
могут быть использованы для установки различных стратегий защиты.
Система без защиты может быть реализована путем простого помещения
всех процедур в сегмент (или сегменты), чей уровень привилегии
равен 0. Традиционное разделение на супервизора и пользователя
может быть реализовано путем помещения прикладной задачи в сегмент
с уровнем привилегии 3, а процедур супервизора - в сегмент чей
уровень привилегий равен 0. Операционная система может также
использовать уровни привилегии 1 и 2, если это необходимо.
Например, наиболее критические и наиболее изменяемые процедуры
операционной системы (иногда называемые ядром операционной
системы) могут иметь уровень привилегий 0. Уровень привилегий 0.
Уровень привилегий 1 может быть использован для функций
операционной системы , которые являются менее критическими и более
часто изменяются или расширяются, например, для драйверов
устройств. Уровень 2 может быть использован для использования
производителями оригинального оборудования, такие производители
оригинального оборудования должны затем присваивать уровень
привилегий 2 своим программам, оставляя уровень привилегий 3 для
конечных пользователей. В этом случае программы производителей
оригинального оборудования защищены от программ конечных
пользователей. Операционная система защищена как от программ
производителей оригинального оборудования и программ конечных
пользователей, а ядро операционной системы защищено от всех
остальных программ, включая ту часть операционной системы, которая
является предметом частных изменений. Как будет показано ниже,
уровень привилегий задачи определяет, какие команды можно
использовать и какое подмножество сегментов и/или страниц в их
адресном пространстве они могут обрабатывать (исполнять).
Процессор осуществляет проверку на допустимость работы согласно
уровню привилегии задачи и уровню привилегии сегментов или
страниц, которые являются операндами команд. Любая попытка задачи
использовать более привилегированный сегмент или страницу приводит
к остановке работы процессора над командой и возникновению особой
ситуации защиты. (Особые ситуации описываются в данном разделе
ниже как системные вызовы, которые обеспечивают управляемый путь
для вызова менее привилегированными процедурами более
привилегированных процедур).
3.4.2 Привилегированные команды
В дополнение к тому, какие сегменты и страницы могут быть
использованы, уровень привилегии задачи определяет команды,
которые задачей могут быть использованы. Процессор 80386 имеет
/.$,-.&%ab". команд, исполнение которых должно быть тщательно
проанализировано для того, чтобы предотвратить серьезные
разрушения системы. Все команды, которые загружают новые значения
в системные регистры, являются примерами привилегированных команд.
Только задача, работающая на уровне привилегий 0, может исполнять
привилегированные команды.
3.4.3 Защита сегментов
Дескрипторы в регистрах LDT и GDT - задач определяют логическое
адресное пространство задачи. Сегменты, определенные в этих
таблицах, теоретически адресуемы, поскольку таблицы дескрипторов
обеспечивают информацией, необходимой для вычисления адреса
сегмента. Однако адресуемый сегмент не может быть доступен для
некоторых операций, из-за дополнительных проверок защиты,
осуществляемых процессором 80386. Процессор проверяет каждое
обращение к сегменту (сгенерированное при исполнении команды или
при выборке команды), чтобы определить, что обращение согласуется
с атрибутами защиты сегмента, как это описано ниже.
Привилегия: Чтобы получить доступ к сегменту, программа должна
иметь, по крайней мере, такую же привилегию как сегмент. Например,
программа, работающая на уровне 3, может обращаться только к тем
сегментам, чей уровень привилегий также равен 3, в то время, как
программа, работающая на уровне 0, может обращаться ко всем
сегментам в своем адресном пространстве.
Граница: Обращение к сегменту должно находиться внутри границ
сегмента. Границы сегмента позволяют процессору обнаруживать
программные ошибки, такие как переполнение стека, неверные
указатели и индексы массивов, а также неправильные адреса вызовов
и переходов. В случаях, когда операционная система может
определить, что обращение за границы сегмента не является ошибкой
(переполнение стека является примером для некоторых систем),
операционная система может расширить сегмент (например, путем
добавления страницы к нему) и начать команду с начала.
Тип: Каждый дескриптор содержит поле типа, которое процессор
проверяет на соответствие команде, которую он исполняет. Обычные
сегменты имеют тип команд или данных , позволяя процессору,
например, обнаружить попытку записи в существующий код, например,
типы сегментов, непосредственно работающие в прикладных программах
- это команды и данные. Системные дескрипторы также имеют тип, так
что процессор может, например, проверить при переключении задач,
что сегмент, указанный в команде JUMP TSS, действительно является
сегментом состояния задачи.
Права: Дескриптор сегмента может быть помечен правами,
ограничивающими операции, которые можно производить со связанным с
ним сегментом. Сегменты команд могут быть помечены как исполняемый
или читаемый. Сегменты данных могут быть помечены как доступные
только для чтения или как доступные для чтения и записи.
Все проверки, описанные выше, зависят от целостности дескрипторов.
Если задача, исполняющая прикладную программу, могла бы изменять
дескриптор, проверка ничего бы не гарантировала. По этой причине
операционная система может ограничить доступ к таблицам
дескрипторов только для программ с уровнем привилегии 0.
Заметим, что в случае разделяемых сегментов различные
дескрипторы для одного и того же сегмента (т.е. синонимы) могут
иметь различные атрибуты защиты, позволяя, например, одной задаче
читать и писать сегмент, в то время, как другой только читать его.
Синонимы также позволяют операционной системе преодолеть механизм
защиты, если это необходимо, например для перемещения кодового
сегмента.
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
` aa, b`(" %b их унифицированным способом.
Каждый источник прерывания и каждый тип особой ситуации имеет
идентификационный номер в диапазоне от 0 до 255, процессор 80386
использует этот номер для того, чтобы вызвать обработчик,
связанный с прерыванием или особой ситуацией. При возникновении
особых ситуаций они распознаются процессором 80386, который
определяет номера особых ситуаций, как это показано в табл.3-1.
Номера прерываний определяются операционной системой. Операционная
система инициализирует программируемый контроллер прерываний 8259а
таким образом, что каждый источник прерываний связывается со своим
номером. При появлении прерывания 8259а передает процессору 80386
номер прерывания. Команды прерываний указывают свои номера своих
операндах. Заметим, что для совместимости с существующим и будущим
оборудованием фирмы INTEL номера прерываний и особых ситуаций от 0
до 71 не должны использоваться иначе, чем это указано в табл.3-1.
Все другие номера могут применяться без ограничений.

Таблица 3-1
+-----------------------------------------------------------+
| НОМЕР | ОПИСАНИЕ |
+----------------+------------------------------------------|
| 00 | ДЕЛЕНИЕ НА 0 |
| 01 | ОСОБАЯ СИТУАЦИЯ ОТЛАДКИ |
| 03 | КОНТРОЛЬНАЯ ТОЧКА ПРОГРАММЫ |
| 04 | ПЕРЕПОЛНЕНИЕ |
| 05 | НАРУШЕНИЕ ГРАНИЦ МАССИВА |
| 06 | НЕДОПУСТИМЫЙ КОД ОПЕРАЦИИ |
| 07 | СОПРОЦЕССОР ОТСУТСТВУЕТ |
| 08 | ДВОЙНАЯ ОШИБКА |
| 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) при
"e.$% в обработчик, в обработчик прерываний входят с запрещенными
прерываниями, в то время как в обработчик ловушки, который обычно
используется для обработки особых ситуаций, входят без изменения
запрета. В процессе входа в обработчик - задачу 80386 загружает
регистр флагов значением, запомненным в его TSS - задаче, разрешая
обработчику работать с разрешенными или запрещенными прерываниями.

Таблица 3-2

ХАРАКТЕРИСТИКИ ШЛЮЗОВ ПРЕРЫВАНИЙ И ОСОБЫХ СИТУАЦИЙ
+-----------------------------------------------------------+
| ТИП ШЛЮЗА | ОБРАБОТЧИК | ПРЕРЫВАНИЯ |
+------------+----------------------+-----------------------|
| ПРЕРЫВАНИЕ | ПРОЦЕДУРА | ЗАПРЕЩЕНЫ |
| ШЛЮЗ | ПРОЦЕДУРА | РАЗРЕШЕНЫ |
| ЗАДАЧА | ЗАДАЧА | (ФЛАГ IF ОБРАБОТЧИКА) |
+-----------------------------------------------------------+

Обработчики - процедуры являются подходящим средством для
программ, которые должны работать в контексте (т.е. использовать
адресное пространство и значения регистров) задачи, которая
прервана или вызвала особую ситуацию. При 16-мгц-синхросигнале
процедура входа в обработчик занимает 3,6 мкс. Подобно любой
другой процедура прерывания или особой ситуации имеет доступ ко
всем ресурсам работающей задачи: к ее данным и коду, ее регистрам
и стеку. Так и должно быть для большинства особых ситуаций,
поскольку в задаче возникла особая ситуация и может потребоваться
доступ к данным задачи, чтобы эту особую ситуацию разрешить.
Например, обработчику страничных ошибок необходимы страничные
таблицы работающей задачи для того, чтобы найти дисковый адрес
отсутствующей страницы. В идеале прерывания должны обрабатываться
задачами, а не процедурами, так как прерывание , вообще говоря, не
относится к задаче, которую оно прерывает. Более того, обработчик
прерываний должен иметь свои собственные ресурсы (например, свой
собственный стек), а не внедрять в стек какой-то задачи, которая
работала в момент появления прерывания. С другой стороны
переключение задач требует значительно большего времени чем вызов
процедуры (17 мкс вместо 3,6), поскольку процессор запоминает и
восстанавливает регистры при переключении задач. Системы, которые
чрезвычайно чувствительны ко времени реакции на прерывания, могут
обрабатывать прерывания при помощи процедур.
3.6.2 Особые случаи и регистры отладки
Подобно большинству процессоров 80386 имеет команду
контрольной точки, которую можно использовать для вызова
отладчика. Однако отладочная аппаратура 80386 имеет форму