+--------------------------------------|
| СЕГМЕНТНЫЕ РЕГИСТРЫ |
. .
+--------------------------------------|
| ПРИВИЛЕГИРОВАННЫЕ |
. .
+--------------------------------------+
3.2.2 Смена задачи
Операционная система разрешает выполнение ??????? в
соответствии с планом. Этот план устанавливает время выполнения
задач. Поскольку методы планирования ???????? различные, 80386
предоставляет это операционной системе. ???? Когда операционная
система решает начать выполнение ????? задачи, она направляет
процессор на выполнение еще одного ?????, иногда называемого
сменой контекста. Процессор 80386 хранит селектор и дескриптор
????? текущей задачи в своем регистре задачи ?????? операционная
система выдает команду перехода ???????? является селектор
сегмента TSS новой задачи ?????? эту команду, занося вначале свои
регистры в текущий TSS, а затем загружая TR селектором (и
связанным с ним дескриптором), указанным в команде. Получив адрес
нового TSS, процессор загружает свои регистры величинами из нового
TSS. После чего выполнение программы продолжается с команды, на
которую указывает счетчик команд новой задачи. Для возобновления
старой задачи операционная система должна выдать команду перехода
и TSS старой задачи, после этого выполнение старой задачи
продолжается с командой, следующей после команды перехода TSS,
прекратившей ее выполнение. Такая смена задачи занимает 17 мкс
(при рабочей частоте 16 Мгц и отсутствии состояний ожидания).
3.3Адресация
Физическое адресное пространство большинства вычислительных
машин организовано просто как массив байтов. С появления блоков
управления памятью (БУП), архитектура машин стала различать
физическое адресное пространство, реализуемое, аппаратурой памяти
и логическое адресное пространство, видимое программистом. Блок
управления памятью транслирует логические адреса программ в
физические адреса, выдаваемые на
системную магистраль. В большинстве архитектур логическое адресное
пространство задачи представляется как набор следующих вариантов:
Логическое адресное пространство состоит из
массива байтов, не имеющего определенной
БАЙТЫ структуры (такое адресное пространство иногда
называется "плоским" или "линейным").
Трансляция адреса в этом случае не требуется,
поскольку логический адрес точно эквивалентен
физическому.
Логическое адресное пространство состоит из
нескольких или большого числа сегментов,
СЕГМЕНТ каждый из которых содержит переменное число
байтов. Логический адрес разделен на две
части, номера сегмента и смещения внутри
сегмента. Буп производит трансляцию
логического адреса в физический.
Логическое адресное пространство состоит из
большого числа страниц, каждая из которых
СТРАНИЦЫ включает в себя фиксированное число байтов.
Логический адрес состоит из номера страницы и
смещения внутри страницы. Буп производит
трансляцию логического адреса в физический.
СТРАНИЧНЫЕ Логическое адресное пространство состоит из
сегментов
Сегменты в свою очередь, состоят из страниц.
СЕГМЕНТЫ Логический адрес состоит из номера сегмента и
смещения внутри сегмента. Буп производит
трансляцию логического адреса в номер страницы
и смещение в ней, которые затем транслируются
в физический адрес.
Каждый из этих вариантов хорошо подходит для одних систем и
мало пригоден для других. Например, линейное пространство вполне
подходит для систем с простыми ветвлениями, в то время как для
систем, которые выполняют индивидуальное управление и защиту
отдельных программных структур, больше подходит вариант с
сегментацией памяти. В 80386 реализован вариант, представляющий
память как набор сегментов, которые по желанию могут быть
разделены на страницы. На практике архитектура 80386 обеспечивает
операционные системы любым из четырех вариантов представления
памяти.
3.3.1 Принцип трансляции адреса
Принцип трансляции логического адреса в физический в
процессоре 80386 иллюстрируется на рис.3-3. Последовательность
операций, показанная на рис.3-3, является центральной как для
адресации, так и для защиты. Здесь она рассматривается в
схематичной форме с целью дать ясное общее представление о ней
прежде, чем перейти к рассмотрению таких свойств, как виртуальная
память и защита. В последующих разделах будут подробно рассмотрены
различные этапы трансляции адреса и будет показано, как они могут
быть приспособлены под требования конкретной системы.
Как показано в предыдущей главе, способы адресации памяти
80386 дают 32-битное смещение искомого операнда. Совместно с
селектором сегмента это смещение образует составной логический
адрес: селектор этого адреса идентифицирует искомый сегмент, а
смещение указывает на операнд в сегменте. В большинстве команд
селектор задается неявно как содержимое сегментного регистра.
+--------------+
| ТАБЛИЦЫ |
| ДЕСКРИПТОРОВ |
+--------------+
ЛОГИЧЕСКИЙ АДРЕС ---------+-+ ЛИНЕЙНЫЙ АДРЕС
+-----------------+ | | +--------+ +--+
|СЕЛЕКТОР|СМЕЩЕНИЕ+->|ТРАНСЛЯЦИЯ+--->| +--+ +----T-+
L--------+--------- | СЕГМЕНТА | L--------- L--- | |
47 31 0 L----------- 31 0 ЗАПРЕТ | |
СТРАНИЦ | |
+-------------------------------------------+ |
| +--------------+
| +-----------+ | 31
0
| | ТАБЛИЦЫ | |--------------------+
| | СТРАНИЦ | +--+ ФИЗИЧЕСКИЙ АДРЕС|
| +-----------+ |-+------------------+
| |+--------------------------+
31 | 0 | 31 0 |
+----------------+ +---------------------++------------------+|
| ЛИНЕЙНЫЙ АДРЕС +-->| ТРАНСЛЯЦИЯ СТРАНИЦЫ +-->|ФИЗИЧЕСКИЙ АДРЕС+--
+----------------+ +---------------------++------------------+
Селектор представляет собой индекс в таблице дескрипторов
сегментов, т.е. это поле содержит номер сегмента. Каждый элемент
таблицы дескрипторов сегментов содержит базовый адрес сегмента.
Процессор добавляет к нему смещение и получает 32-битный линейный
адрес. Если страницы не разрешены, процессор считает, что линейный
адрес является физическим, и выдает его на адресные выводы.
Если страницы разрешены, то 80386 транслирует линейный адрес в
физический. Это делается с помощью страничных таблиц. Страничная
таблица по своей организации аналогична таблице дескрипторов, за
исключением того, что каждый элемент страничной таблицы содержит
физический базовый адрес страницы 4кбайт. Поскольку способы
адресации 80386 охватывают как традиционные элементы структурного
деления адресного пространства (сегменты, и дополнительно,
страницы) и поскольку сегменты могут быть очень большими (до 4
Гбайт), то эти способы адресации оказываются очень гибкими. Таким
образом, операционная система может дать задаче одно линейное
адресное пространство, линейное адресное пространство из страниц,
адресное пространство из сегментов или сегментированное адресное
пространство со страничным делением.
По всей своей гибкости многоступенчатая трансляция адреса в
80386 выполняется достаточно быстро. Типичное время вычисления
смещения и трансляции логического адреса в физический составляет
1,5 такта. Более того, время трансляции адреса незаметно для
программы, поскольку внутренний БУП 80386 транслирует адрес
параллельно с другими операциями процессора (кроме случаев, когда
команды перехода или вызова временно прерывают совмещенное
выполнение операций).
3.3.2 Сегменты
Сегмент является единицей логического пространства,
представляемого процессором задаче, т.е. логическое адресное
пространство задачи состоит из одного или нескольких сегментов.
Операционные системы существенно отличаются друг от друга по
способу определения логического адресного пространства задачи.
Например, система реального времени с ветвлениями может определить
логическое адресное пространство как единое целое, совместно
используемое всеми задачами и самой операционной системой, другими
словами один сегмент коллективно используется всей системой. В
другом крайнем случае система может распределить каждую структуру
данных и процедуру по своим сегментам, в следствии чего логическое
адресное пространство задачи предстанет в виде десятков или сотен
адресных пространств, каждое из которых будет соответствовать
своей структуре данных или процедуре. Между этими крайними
случаями оказывается универсальная система с разделением времени,
в которой задачи выполняются в отдельных логических адресных
пространствах, и в которых программы задач отделены от их данных,
а прикладные программы и данные отделены от программы и данных
операционной системы. Свойство сегментации в процессоре 80386
достаточно гибкое, и может обеспечить каждый из этих примеров, как
и любые другие.
Как уже было показано в главе 2, команда 80386 ссылается на
операнд в памяти с помощью составного логического адреса,
a.ab.oi%#. из селектора сегмента и смещения внутри сегмента. В
принципе 80386 транслирует логический адрес в линейный с помощью
селектора, указывающего на дескриптор сегмента в таблице
дескрипторов. Дескриптор содержит базовый адрес сегмента в
линейном адресном пространстве, добавление смещения к базовому
адресу дает линейный адрес операнда. На практике трансляция
логического адреса в линейный оптимизирована с помощью неявного
указания на селекторы и хранения дескрипторов в регистрах. Поэтому
обращение к таблице дескрипторов производится только для тех
команд, которые загружают новые селекторы в сегментные регистры
(например, вызов процедуры из другого сегмента приводит к замене
селектора в регистре CS). Хотя на практике это бывает редко, тем
не менее удобнее представлять трансляцию процессором логического
адреса как обращение к дескрипторам в таблицах дескрипторов
сегментов, поскольку отсюда следует, что именно дескрипторы в
таблицах дескрипторов сегментов задачи определяют логическое
адресное пространство задачи. Без дескриптора задача не в
состоянии сгенерировать линейные адреса.
Таблица дескрипторов сегментов представляет собой массив
дескрипторов, на рис.3-4 дан логический формат дескриптора. Поле
базового адреса уже рассматривалось выше. Поле предельного размера
определяет длину сегмента, 80386 использует поле предельного
размера для проверки правильности величины смещения в логическом
адресе, а именно, что оно попадает внутрь сегмента. Атрибуты
сегмента, в основном, относятся к защите и будут рассмотрены далее
в этой главе.
АТРИБУТЫ
ПРИЗНАК ПОСЛЕДНЕГО ОБРАЩЕНИЯ ---------------------+
ПРАВА -----------------------------------------+ |
ТИП ----------------------------------------+ | |
ПРИВИЛЕГИЯ ------------------------------+ | | |
ПРИЗНАК ПРИСУТСТВИЯ ------------------+ | | | |
| | | | |
+--------------+
| | | | | |
+------------------------------|
| ПРЕДЕЛЬНЫЙ РАЗМЕР |
+------------------------------|
| БАЗОВЫЙ АДРЕС |
+------------------------------+
Каждая задача может иметь системное и индивидуальное
логическое адресное пространство. Эти пространства описываются,
соответственно глобальной таблицей дескрипторов (GDT) и локальной
таблицей дескрипторов (LTD). (В селекторе имеется
бит, связывающий его с той или иной таблицей). Эти таблицы
дескрипторов могут содержать максимум 8192 дескриптора и совместно
они определяют логическое адресное пространство задачи. Это
означает, что для того, чтобы новый сегмент мог адресоваться
задачей, операционная система должна внести новый дескриптор этого
сегмента либо в GDT, либо в LDT задачи. В системах с защитой GDT и
LDT могут быть сделаны привилегированными структурами так, что
изменения в них сможет производить только операционная система.
Операционная система из ее названия, глобальная таблица
дескрипторов доступна всем задачам, обычно операционные системы
заносят дескрипторы системных сегментов в GDT. Кодовый сегмент
(или сегменты) операционной системы является хорошим примером
сегмента, который должен быть доступным всем задачам, и дескриптор
которого обычно находится в GDT. В противоположность этому каждая
' $ g может иметь свою локальную таблицу дескрипторов. Процессор
поддерживает адрес LDT текущей задачи в своем регистре локальной
таблицы дескрипторов (LDTR), однако он перезагружает этот регистр
(так же, как он перезагружает свои общие и сегментный регистры)
новым значением TSS при смене задач.
Задачи могут делить одни сегменты в следующих случаях
(см. рис.3-5):
1. Сегмент, дескриптор которого находится в GDT, является общим
для всех задач.
2. Задачи, имеющие общую LDT, имеют и общие сегменты,
описываемые этой LDT, такой подход допустим в случае тесно
взаимодействующих задач.
3. Дескрипторы в различных LDT могут указывать на один и тот же
сегмент, такие дескрипторы называются псевдоименами. Использование
псевдоимени позволяет задачам иметь общим только один сегмент,
а не все сегменты, определенные таблицей дескрипторов.
3.3.3 Страницы
Независимо от того, содержит ли логическое адресное
пространство задачи один или много сегментов, операционная система
может разделить линейное адресное пространство на страницы. С
точки зрения операционной системы страницы являются удобными
элементами для распределения и перераспределения памяти, поскольку
они все имеют одинаковый размер. Страницы также являются средством
защиты частей больших сегментов и, что особенно важно,
обеспечивают удобный способ организации виртуальной памяти.
Указанные применения страничной организации памяти обсуждаются
ниже.
Страница в 80386 имеет длину 4к байт. Этот размер находится в
согласии с промышленной тенденцией к увеличению длины страниц и
ведет к увеличению производительности по двум направлениям.
Во-первых, он обеспечивает хорошее отношение показаний страниц
в кэш при данном объеме кэш-памяти, которая может быть в настоящее
время реально размещена на кристалле, исходя из достигнутого
уровня технологии. (Кэш-память 80386, расположенная на кристалле,
описывается кратко). Во-вторых, 4к байтов являются эффективным
размером блока для дисковых передач. Большинство операционных
систем, работающих на машинах с меньшей длиной страницы, должны
группировать страницы в "кластеры", чтобы сократить количество
дисковых передач.
Операционная система 80386 включает страничный механизм,
устанавливая бит PG в управляющем регистре 0 при помощи
привилегированной команды. Когда страничный механизм включен,
процессор транслирует линейный адрес в физический адрес, используя
страничные таблицы. Страничные таблицы являются частью таблиц
дескрипторов сегментов. Так же как таблицы дескрипторов сегментов
задачи определяют ее логическое адресное пространство, страничные
таблицы задачи определяют ее линейное адресное пространство.
Аналогично супермини-ЭВМ и большим ЭВМ страничные таблицы 80386
организованы по принципу
двухуровневой иерархии, как показано на рис.3-6. Каждая задача
может иметь справочник системных таблиц. Системный регистр CR3
процессора 80386 (база справочника системных таблиц) указывает на
справочник страничных таблиц работающей задачи. Процессор
обновляет регистр CR3 при каждом переключении задачи, получая
новый адрес задачи из TSS новой задачи. Справочник страничных
таблиц имеет длину, равную одной странице и содержит элементы
ab` -(g-.) таблицы описывают 1024 страницы. Таким образом, каждая
страничная таблица описывает 4м байта, а оглавление может описать
до 4г байт - максимальное адресное пространство.
На рис.3-6 в функциональных обозначениях показано как 80386
транслирует линейный адрес в физический адрес, если страничная
адресация включена. Процессор использует старшие 10 бит линейного
адреса как индекс в оглавлении. Выбранный элемент оглавления
содержит адрес страничной таблицы. Процессор добавляет средние 10
бит линейного адреса к адресу страничной таблицы, чтобы найти
элемент страничной таблицы, который описывает необходимую
страницу. Добавляя младшие 12 бит линейного адреса к адресу начала
страницы, процессор получает 32-битный физический адрес.
Для того, чтобы сократить накладные расходы, возникшие от
поиска в страничных таблицах, 80386 помещает справочную информацию
о 32-х последних страницах, использовавшихся им, в специальную
быструю память (кэш), находящуюся внутри самого микропроцессора.
Эта память называется перекодированным буфером просмотра
исключений (TLB). Только в том случае, если процессор не находит
справочной информации для страницы в TLB, он обращается к
справочникам и страничным таблицам, находящимся в памяти. Как
правило, 98-99% адресных ссылок попадают в TLB, не требуя
обращений к основной памяти для трансляции. Когда необходимой
информации в TLB не оказывается, процессор заменяет наиболее
старый элемент TLB новым элементом. Принцип локальности ссылок
предполагает, что новый элемент скорее всего будет использоваться
в будущем.
Поскольку включение страничного механизма не увеличивает
времени трансляции адреса, оно мало влияет на время исполнения
команды только при непопаданиях в TLB. На рис.3-7 показаны
основные поля элемента страничной таблицы (PTE). Элементы
справочника страничных таблиц идентичны показанному за тем
исключением, что поле адреса рассматривается как физический адрес
страничной таблицы, а не адрес страницы.
АТРИБУТЫ
ПРИСУТСТВИЕ -------------------------------------+
ПРАВА ---------------------------------------+ |
ПРИВИЛЕГИИ ------------------------------+ | |
БЫЛО ОБРАЩЕНИЕ ----------------------+ | | |
БЫЛА ЗАПИСЬ ---------------------+ | | | |
ОПРЕДЕЛЯЕТСЯ ПОЛЬЗОВАТЕЛЕМ --+ | | | | |
| | | | | |
+-----------------------------------------------------------+
| АДРЕС СТРАНИЦЫ | | | | | | |
+-----------------------------------------------------------+
Задачи могут совместно пользоваться отдельными страницами или
целыми страничными таблицами. Элементы 1 различных страничных
таблиц, указывающие на одну и ту же страницу , являются синонимами
один для другого, также как дескрипторы с теми же самыми адресами
являются синонимами друг для друга. В двух уровневой структуре
страничных таблиц процессора 80786 легче разделять страницы между
задачами путем разделения целой страничной таблицы. Поскольку
адрес разделяемой страницы в этом случае находится в одной
страничной таблице, операционной системы необходимо изменить
только один элемент страничной таблицы, когда она перемещает эту
страницу.
3.3.4 Виртуальная память
Виртуальная память позволяет очень большим программам или
#`c// , работать в значительно меньшем объеме физической памяти
без использования техники оверлеев. Системы с виртуальной могут
основываться или на сегментах, или на страницах. В обоих случаях
основная идея виртуальной памяти состоит в том, чтобы использовать
значительно более дешевую дисковую память вместо полупроводниковой
памяти. Операционная система в случае с виртуальной памятью
запоминает все сегменты или страницы в большой области дисковой
памяти, называемой часто "областью обмена". Значительно меньшая
физическая (реальная) память содержит только наиболее часто
используемые сегменты или страницы. До тех пор, пока сегменты или
страницы запомненные на диске, используются нечасто, система с
виртуальной памятью будет вести себя также хорошо, как и система
со значительно большей оперативной памятью, но за значительно
меньшую цену. Ключевые архитектурные свойства, необходимые для
эффективного использования виртуальной памяти, перечисляются ниже:
з бит для каждого сегмента или страницы, который говорит
процессору (или устройству управления памятью), имеется ли данный
сегмент или страница в памяти, или необходимо загрузить его (ее) с
диска;
з механизм ловушки или особого прерывания, при помощи которого
процессор может указать операционной системе о необходимости
загрузки в память отсутствующего сегмента или страницы;
з перезапускаемые команды, которые позволяют процессору выбирать
заново команду после того, как операционная система загрузила
только что не присутствующую страницу в память и пометила ее
присутствующей.
Процессор 80786 имеет все эти необходимые свойства, а также
другие, которые улучшают эффективность механизма управления
виртуальной памятью. Как дескрипторы, так и элементы страничных
таблиц имеют бит присутствия и поэтому могут быть использованы как
основа для построения виртуальной памятью. Обмен сегментами между
памятью и диском являются разумным подходом, когда сегменты
относительно малы, как это было в 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 имеет форму
регистров отладки, показанных на рис.3-11. Регистры отладки
поддерживают контрольные точки данных являются важным
нововведением, которое может сократить время отладки на многие
часы, т.К. Например, позволяет установить, когда происходит
непредусмотренная запись в структуры данных.
Регистры отладки также сокращают искажения в программах,
необходимые для записи команды точек останова в код, особенно для
программ, которые защищены от записи или разделены другими
задачами.
Отладчик 80386 реализует в виде обработчика особой ситуации с
номером 1. Процессор может непосредственно вызвать отладчик после
исполнения любой команды (путем установки флага TF - флага ловушки
пошагового исполнения), после переключения определенной задачи или
после появления условия точки останов, определенного одним из
`%#(ab`." отладки. Анализируя регистр статуса отладки, обработчик
отладочной особой ситуации может определить, какая из причин его
вызвала.
Будучи вызван при переключении задач, отладчик может
перезагрузить регистры отладки значениями, подходящими для новой
задачи.
80386 Может ожидать появления одновременно до четырех условий
контрольных точек, вызывая обработчик отладочной особой ситуации
про появлении одного из условий. Каждое условие контрольной точки
определяется содержимым регистра отладки, эти регистры могут быть
загружены и запомнены при помощи привилегированных форматов
команды MOVE. Условие контрольной точки содержит 32-битный
линейный адрес, 2-битное поле длины и поле доступа, последние два
элемента указываются в полях регистра управления отладкой DR7.
Адрес условия контрольной точкой и длина формируют адресный
диапазон, который контролируется процессором при каждой ссылке на
память. Поле доступа определяет тип доступа, для которого
процессор может вызвать особую ситуацию 1. Могут быть указаны 3
типа доступа:
1) исполнение команды по указанному адресу;
2) запись данных в диапазон адресов;
3) чтение или запись данных в диапазоне адресов.
3.7Ввод/вывод
Системы, базирующиеся на 80386, могут распределять устройства
ввода/вывода в пространство памяти процессора или в отдельное
пространство ввода/вывода. Устройствам ввода/вывода,
распределенным в пространство памяти, можно обращаться для чтения
или записи, используя такие команды обращения, как MOVE, OR или
аналогичные. Устройства, распределенные в памяти, могут быть
защищены с помощью стандартного механизма защиты сегмента и
страницы процессора 808386.
В дополнении к своему адресному пространству процессор 80386
имеет 64к-байтное адресное пространство ввода/вывода. Устройства,
распределенные в это пространство, управляются командами ввода,
вывода, ввода строки и вывода строки. Первые две команды передают
байт, слово, двойное слово в или из EAX-регистра. Последние две
команды передают строку байтов, слов или двойных слов в память или
из памяти.
Команды ввода-вывода 80386 чувствительны к уровню привилегий.
В регистре флагов имеется поле, называемое уровнем привилегий
ввода/вывода (IOPL), которое определяет минимальный уровень
привилегий , на котором работающая задача может исполнять команды
ввода/вывода (IOPL загружается из TSS, так что задачи могут иметь
различные IOPL). Например, если IOPL задачи равен 1, то задача не
может выдавать команды ввода-вывода, исключая случаи, когда она
работает на уровне привилегии 0 или 1. Механизм IOPL поддерживает
операционные системы с многоуровневой защитой, в которых,
например, критичные и стабильные процедуры ядра работают на уровне
привилегии 0, а более изменчивые процедуры ввода-вывода работают
на уровне привилегии 1, в этом случае операционная система должна
только установить IOPL равным 1, когда она создает задачу,
поскольку IOPL характерен для задачи, те задачи, которым можно
доверять, могут исполнять команды ввода-вывода на прикладном
уровне, позволяя тем самым непосредственно работать со
специальными устройствами, для которых не имеется драйвера
операционной системы.
Для того, чтобы реализовать прямой доступ к памяти (DMA) от
устройств вода/вывода, операционная система 80386 передает
d('(g%a*() адрес контроллеру DMA и должна гарантировать, что
сегменты и/или страницы, ко которым происходит обращение при DMA-
передачах , не будут перемещаться во время этой операции. Один из
способов пометить страницы "фиксированными на время ввода-вывода"
- это использование одного из трех битов пользователя в страничной
таблице.
АРХИТЕКТУРНАЯ СОВМЕСТИМОСТЬ
80386 совместим на уровне объектного кода с 80286 и с 8086.
Хотя можно просто использовать 80386 как быстрый 80286 или как
очень быстрый 8086, их совместимость обладает достаточно большой
гибкостью. Процессор 80386 может выполнять программы 80286 и 80386
параллельно, и, используя виртуальный режим 86 процессора 80386,
существующие программы 8086 могут также исполняться параллельно.
Таким образом при помощи 80386 становится возможным строить
системы, которые могут параллельно исполнять программы, написанные
для различных поколений семейства микропроцессоров.
4.1Совместимость с 80286
Архитектура 80286 является точным подмножеством архитектуры
80386. Так как процессор 80386 распознает все команды 80286,
регистры, дескрипторы и т.Д., То операционная система 80286 и
прикладные программы могут быть перенесены на аналогичное
оборудование, построенное на основе 80386 без изменения хотя бы
одного бита.
Прямой перенос, упомянутый выше, является наиболее быстрым
путем для того, чтобы запустить существующие программы, написанные
для 80286 на системе, построенной на 80386. С другой стороны
операционные системы для 80386 могут разрабатываться так, чтобы
они поддерживали существующие прикладные программы для 80286, и,
позволяя в то же время, новым прикладным программам полностью
использовать свойства архитектуры 80386 (например, 32-битные
параметры и длинные сегменты). В таких гибких разработках новые
прикладные программы вызывают операционную систему
непосредственно, передавая 32-битные параметры. Вызовы старых
прикладных программ, которые организованы в 16-битном формате
80286, перехватываются и преобразуются в 32-битный формат, а затем
передаются в операционную систему.
4.2Режимы реального и виртуального 8086
Процессор 80386 может выполнить объектные программы 80386
водном из 2 режимов: реальном режиме или виртуальном режиме 86.
80386 Входит в реальный режим при сбросе. В реальном режиме
процессор обеспечивает быстрое исполнение без защиты так, как на
8086. Многие операционные системы будут переключаться из реального
режима в режим защиты после инициализации, но также возможно
работать все время в реальном режиме 8086. Принципиальное различие
между реальным режимом 80386 и действительным режимом 8086
заключается в скорости: программы 8086, которые критичны по
скорости исполнения (например, использующие рассчитанные временные
циклы), могут потребовать небольших изменений для того, чтобы они
работали правильно в значительно более быстром реальном режиме
80386. Но основное множество программ 8086 будет работать без
каких-либо трудностей, т.к. они работают в реальном режиме 80286.
Виртуальный режим 86 устанавливает исполнительную среду 8086
внутри защищенной многозадачной среды 80386. В то время, как
реальный режим управляет всем, что делает процессор, виртуальный
режим 86 может применяться в избранных задачах 80386. Когда
процессор работает в виртуальном режиме 86, он ведет себя, как в
8086, но поле переключения к нормальной задаче, процессор
работает как 80386 (который, на самом деле, может интерпретировать
программы как для 80286, так и 80386). Таким образом виртуальный
режим 86 позволяет операционной системе поддерживать исполнение
программ 8086, 80286 и 80386 одновременно.
В разделе 3 было описано, как сегмент состояния задачи
отражает состояние своего виртуального процессора. Флаг VM86 в
регистре флагов, который загружается из TSS, определяет работающий
виртуальный процессор задачи как 8086 или 80386. Когда 80386
загружает свои регистры из TSS, у которого флаг VM86 установлен,
процессор входит в виртуальный режим 86. Когда при последующем
переключении задачи, процессор загружает значения в регистр из
TSS, у которого флаг VM86 сброшен, он выходит из виртуального
режима 86. Таким образом от задачи к задаче процессор эмулирует
80386 или 8086 согласно значению флага VM86. 80386 Также выходит
из виртуального режима 86, когда он выдает особую ситуацию или
возникает прерывание, и предоставляет полные ресурсы архитектуры
обработчику прерываний и особых ситуаций. При возврате из
обработчика, вызванного в виртуальном режиме 86,80386
автоматически возвращается в виртуальный режим 86. Так как
адресное пространство 8086 равно 1 мегабайту, логические адреса,
генерируемые задачей в виртуальном режиме 86, попадает в первый
мегабайт линейного адресного пространства 80386. Множество задач,
работающих в виртуальном режиме 86, могут пересекаться друг с
другом, поэтому они все должны разделять младший мегабайт
линейного адресного пространства. Операционная система может
использовать страничный механизм 80386 для перемещения линейных
адресных пространств задач, работающих в виртуальном режиме 86, в
различные области физического адресного пространства. Используя
страничный механизм таким способом, не только предотвращают
наложение задач, работающих в виртуальном режиме 86, но позволяют
операционной системе с виртуальной памятью обменивать страницы
задач, работающих в виртуальном режиме 86, как если бы они были
задачами 80386.
Задача, работающая в виртуальном режиме 86, может выполнять
программу, которая была написана для выполнения на однозадачном
персональном компьютере. Такая программа может содержать команды,
которые потенциально опасны, когда они выполняются в многозадачной
среде. Например позволяя задаче, работающей в виртуальном режиме
86, выполнять команду очистки флага прерываний, тем самым запрещая
прерывания, можно остановить всю систему. Для предотвращения таких
нарушений 80386 выдает особую ситуацию, когда задача, работающая в
виртуальном режиме 86, пытается исполнять команду ввода/вывода или
команду, относящуюся к прерываниям.
Запрещение исполнения таких команд защищает остальную часть
системы от задач, работающих в виртуальном режиме 86, но не
удовлетворяет потребности задач виртуального режима 86 в
исполнении команд. Решение заключается в моделировании опасных
команд в процедуре операционной системы, называемой монитором
виртуальной машины. Когда вызывается обработчик особых ситуаций,
он может проверить флаг VM86 в образе регистров флагов в стеке,
чтобы определить, является ли источник особой ситуации задачей
виртуального режима 86, в этом случае обработчик особых ситуаций
может вызвать монитор виртуальной машины, который может
промоделировать команду и вернуть управление задаче виртуального
режима 86. Следует заметить, что монитор виртуальной машины
моделирует только несколько команд 8086, и как моделируемые
команды, так и те команды, которые 80386 исполняет
непосредственно, выполняются значительно быстрее на 80386, чем на
8086.
Работая совместно, 80386 и монитор виртуальной машины
реализует полный набор команд 8086, и страничный механизм может
обеспечить каждую задачу виртуального режима 86 своим собственным
защищенным адресным пространством. Однако, большинство задач 8086
требуют дополнительных ресурсов, обеспечиваемых операционной
системой и периферийным оборудованием. В качестве примера первого
типа ресурсов можно привести файловую систему, в качестве второго
типа можно привести контроллер растрового дисплея, работающего
непосредственно под управлением прикладной программы. Эти ресурсы
могут присутствовать в системе, основанной на 80386 в форме,
отличной от топ, в которой они присутствовали ранее в системах,
для которых была создана программа 8086, чтобы упростить работу
для предоставления этих ресурсов в различных средах, 80386 может
реализовать ловушки при обращении к операционной системе и к
периферийным устройствам, которые делаются задачами виртуального
режима 86.
Например, большинство операционных систем 8086 используют
команду прерывания для реализации вызовов операционной системы.
80386 Выдает особую ситуацию, когда задача виртуального режима 86
пытается исполнить команду прерываний. Монитор виртуальной машины
может затем протранслировать вызов операционной системы в вызов
операционной системы 80386, как это показано на рис.4-1. Если IOPL
задачи виртуального режима 86 установлен равным значению, меньшему
3, то 80386 будет аналогичным образом создавать ловушки при
исполнении всех команд ввода/вывода программой 8086. Страничный
механизм 80386 может быть использован для перенаправления
обращений к устройствам ввода/вывода, распределенным в память, на
другие адреса, если это необходимо. Подобные обращения могут также
вызвать особые ситуации путем указания соответствующих страниц
памяти, как предназначенных только для чтения (чтобы быть
обнаруженным в случае записи) или как отсутствующих (для
обнаружения при
чтении или записи).
АППАРАТУРНАЯ РЕАЛИЗАЦИЯ
Архитектура процессора 80386, описанная в предыдущих разделах,
реализована более чем в 275000 транзисторах, использующих
технологический процесс CHMOS III фирмы ИНТЕЛ. В данном разделе
кратко рассматривается внутреннее устройство кристалла 80386 и
более подробно сигналы, при помощи которых 80386 взаимодействует с
другими компонентами.
5.1Внутренняя структура
На рис.5.1. приведена обобщенная функциональная структура
процессора 80386. Показанные 6 устройств организованы в
конвейерную структуру, которая позволяя им работать параллельно
над различными командами или над различными частями одной и то же