Защищенный режим работы процессора

Защита, страничная адресация, виртуальная среда 8086

                          4.4. ЗАЩИТА

                         Принципы защиты

     80386 имеет 4  уровня защиты, обеспечивая тем самым требования
многозадачной ОС,  изолируя и  защищая  пользовательские  программы
друг  от  друга  и  от  ОС. Управление уровнями привилегированности
осуществляется  привилегированными  командами,  командами  ввода  -
вывода и доступом к сегментам и сегментным дескрипторам.
     В   отличие   от   традиционных   МП    систем,   где   защита
обеспечивается с помощью внешних аппаратных и программных  средств,
80386  обеспечивает  защиту  с помощью [внутреннего]  общего  блока
управления памятью. 80386 обеспечивает дополнительный  тип  защиты,
если включен режим страничной адресации.

                   4.4.3.Уровни привилегированности

                   4.4.3.1.Привилегированность задач

     В любой момент времени задача в 80386 выполняется на одном  из
4-х      уровней      привилегированности.      Текущий     уровень
привилегированности (CPL) задачи  может  быть  изменен  только  при
управлении   передачей  кодовых  сегментов  с  различными  уровнями
привилегированности  через   дескрипторы шлюзов.
     Таким образом, прикладная программа, выполняемая на уровне  3,
может вызываться программой ОС с  уровнем  1 (через шлюз),  которая
присвоит  задаче  уровень  CPL = 1 до тех пор, пока программа ОС не
кончит свою работу.


                 4.4.3.2.Привилегированность селектора (RPL)

      Уровень привилегированности селектора определяется полем RPL.
RPL - два младших значащих бита селектора. RPL используется  только
для  задания  менее  доверительного уровня привилегированности, чем
CPL используемого сегмента.  Этот  уровень  называется  эффективным
(действующим)   уровнем   привилегированности   задачи  (EPL).  EPL
определяет,  каково  будет  наименьшее   значение   (арифметическое
увеличенное)  уровня  привилегированности  из  уровня  задачи и RPL
селектора. Таким образом, если RPL селектора =  0,  то  CPL  всегда
определяет  уровень  привилегированности для предоставления доступа
используемому селектору.  С  другой  стороны,  если  RPL  =  3,  то
селектор   может  получать  доступ  только  к  сегментам  уровня  3
независимо от CPL задачи.
     В  общем  случае  RPL  используется  в качестве указателей для
процедур  ОС  о  недоступности  данных  с  более  высоким   уровнем
привилегированности, чем уровень процедуры.
     Таким образом, при формировании селектора можно задавать любые
значения RPL с помощью команды Adjust RPL (ARPL).

                4.4.3.3.Привилегированность ввода - вывода

     Уровню привилегированности ввода - вывода (IOPL) соответствует
CPL=0, задаваемый ОС. Прерывание 13 возникает в тех случаях,  когда
CPL задачи менее привилегирован, чем IOPL.
     IOPL  запоминается   (хранится)  в  битах  13  и  14  регистра
признаков.
     Команды, вызывающие прерывание 13 (если CPL больше, чем IOPL):
     IN, INS, OUT, OUTS, STI, CLI, префикс LOCK.

                4.4.3.4.Достоверность привилегированности

     80386 имеет несколько команд для быстрого контроля  указателей
и  помощи  системным  средствам  в  определении значения селектора,
соответствующего требуемому сегменту.
     В табл.4-2 приведены процедуры, удостоверяющие селекторы.

     Команды проверки указателей                       Табл.4-2

__________________________________________________________________
         |         |                                              |
 Команда |Операнды |Выполняемое действие                          |
_________|_________|______________________________________________|
         |         |                                              |
 ARPL    |Селектор,|Установка требуемого уровня привилегирован-   |
         |регистр  |ности: устанавливает RPL селектора в макси-   |
         |         |мальное значение из RPL текущего селектора и  |
         |         |RPL регистра. Устанавливает флаг нуля, если   |
         |         |RPL изменяется.                               |
_________|_________|______________________________________________|
         |         |                                              |
 VERR    |Селектор |Проверка на чтение: устанавливает флаг нуля,  |
         |         |если сегмент, на который указывает селектор,  |
         |         |может быть прочитан.                          |
_________|_________|______________________________________________|
         |         |                                              |
 VERW    |Селектор |То же самое по записи                         |
_________|_________|______________________________________________|
         |         |                                              |
 LSL     |Регистр, |Загрузка границы сегмента: читает границу сег-|
         |селектор |мента в регистр, если правила привилегирован- |
         |         |ности и типа дескриптора соблюдены. В этом    |
         |         |случае, устанавливает флаг нуля.              |
_________|_________|______________________________________________|
         |         |                                              |
 LAR     |Регистр, |Загрузка прав доступа:читает байт прав доступа|
         |селектор |дескриптора в регистр, если правила привилеги-|
         |         |рованности соблюдены. В этом случае устанавли-|
         |         |вает флаг нуля.                               |
_________|_________|______________________________________________|


     Такая  проверка  указателя  решает  общую   проблему   -   как
пользователю с PL = 3 вызвать программу операционной системы с PL=0
и  не  позволит  плохому  указателю  исказить   структуру   данных,
принадлежащих  операционной  системе.  Если программа ОС использует
ARPL команду, то гарантируется, что RPL селектора имеет не  больший
уровень  привилегированности,  чем  то,  что  вызывается и проблема
преодолевается.

                4.4.3.5.Доступ с помощью дескрипторов

     Существуют два основных вида доступа к  сегментам:  к  кодовым
сегментам   (при   передаче   управления)  и  к  сегментам  данных.
Доступность сегмента определяется его типом используемой  командой,
типом дескриптора и CPL, RPL и DPL (см. выше).

     При  выполнении  команд  загрузки  регистров  сегментов данных
(DS,ES, FS, GS) 80386 проверяет достоверность  защиты  в  следующей
последовательности:
     1)является ли вызываемый сегмент отсутствующим (в этом случае-
прерывание 11);
     2)правильно ли селектор указывает тип сегмента.

     Селекторы, загружаемые в DS,  ES,  FS  и  GS  регистры  должны
ссылаться  только  на  сегменты  данных  или разрешенные для чтения
сегменты кодов (команд). Правила доступа к данным приведены в 4.3.2.
     Единственное  исключение  из  этих   правил   -   согласование
разрешенные  для  чтения  кодовые  сегменты,  доступные  для любого
уровня привилегированности.
     В    заключение   проводится      проверка       достоверности
привилегированности. CPL сравнивается  с  EPL  и,  если  EPL  более
привилегирован, чем CPL, генерируется прерывание 13  (ошибка  общей
зашиты).
     Правила,    касающиеся   стекового   сегмента,   незначительно
отличаются  от  правил,  касающихся  сегментов   данных.   Команды,
загружающие  селекторы  в  SS,  должны соответствовать дескрипторам
сегментов  данных,  разрешенных  для  записи.  DPL  и  RPL   должны
равняться  CPL.  Все  другие типы дескрипторов или нарушение уровня
привилегированности вызывают прерывание 13.
     Отсутствие стека (стекового сегмента) вызывает прерывание  12.
Заметим,  что  прерывание  11  используется  при отсутствии кодовых
сегментов и сегментов данных.

                 4.4.4.Обмены с учетом уровня привилегированности

     Межсегментные  передачи  управления  происходят  тогда,  когда
селектор   загружается  в  CS  регистр.  В  обычной  системе  такие
переключения являются простым результатом  вызова  или  перехода  к
другой  программе.  Имеется  5  типов  передачи управления, которые
приведены в табл.4-3.
     Многие из этих передач  осуществляются  внутри  одного  уровня
привилегированности.  Изменение уровня привилегированности возможно
только для  передач  управления,  использующих  шлюзы  переключения
задач,    прерываний    или    трассировки.   Передачи   управления
осуществляются только  в  том  случае,  если  загружаемый  селектор
ссылается (указывает) на правильный тип дескриптора. Любая ошибка в
правилах использования дескриптора  будет  вызывать  прерывание  13
(например,  JMP  из  шлюза  вызова или IRET из обычной подпрограммы
вызова).

     Для обеспечения полной  секретности  в  системе  все  передачи
управления должны выполняться по следующим правилам:
     передачи  (переходы)   между  уровнями   могут  осуществляться
только через шлюзы;
     команды JMP должны выполняться в кодовом сегменте с  таким  же
уровнем привилегированности;
     команды  CALL  должны выполняться в кодовый сегмент с таким же
уровнем   привилегированности    или    через    шлюз    к    более
привилегированному уровню;
     прерывания,     обрабатываемые     внутри    задачи,    должны
соответствовать правилам привилегированности, аналагичным  командам
CALL;
     вызываемые кодовые сегменты доступны привилегированным уровням
с таким же или ниже уровнем, чем DPL вызываемого сегмента;
     RPL селектора входа в указывающего на шлюз и CPL задачи должны
быть равны или более привилегированны, чем DPL шлюза;
     кодовый  сегмент,  выбираемый  в шлюзе, должен быть с таким же
или более привилегированным, чем CPL задачи;
     команды возврата, не связанные с  переключением  задач,  могут
только  управлять  возвратом  к  кодовому   сегменту с таким же или
менее приоритетным  уровнем;
     переключение задач может реализоваться при помощи команд CALL,
JMP  или INT, которые указывают либо на шлюз задач, либо на сегмент
состояния задачи, DPL которых менее привилегирован или имеет тот же
уровень привилегированности, что и CPL старой задачи.
     Любая  передача  управления,  изменяющая  CPL  внутри  задачи,
вызывает    изменение   стеков   -   следствие   изменения   уровня
привилегированности. Первоначальные значения SS:  ESP  для  уровней
привилегированности  0, 1 и 2 храняться в сегменте состояния задачи
(см. 4.4.6). При передачах управления JMP или CALL новый  указатель
стека загружается в SS и ESP регистры, а предыдущий указатель стека
убирается в новый стек.
     При   возврате   к    первоначальному    (исходному)    уровню
привилегированности   происходит  перезапоминание  стека  на  менее
привилегированном уровне, как часть выполнения команд RET или IRET.
     При  вызовах  подпрограмм  между  предыдущим  и  новым  стеком
происходит  передача  параметров  фиксированным  количеством   слов
(указываемых в поле счетчика слов шлюза).
     Команды   межсегментного   возврата   (RET)   с  установленной
(фиксированной)  величиной  стека  будут  правильно  перезапоминать
предыдущий указатель стека до полного возврата.

                  4.4.5. Шлюзы вызовов

     Шлюзы  обеспечивают  защиту  при  помощи  косвенных   вызовов.
Основное   назначение   шлюзов  -  обеспечить  безопасный  механизм
изменения  уровней  привилегированности  внутри  задачи.  Т.к.   ОС
определяет  все  шлюзы в системе, то это гарантирует, что все шлюзы
обеспечат вход только в количество определенных (заданных) процедур
(таких как управление памятью или вводом/выводом).
     Дескрипторы  следят  за  соблюдением правил привилегированного
доступа к данным; шлюзы могут быть доступны задаче, если EPL  равен
или  более  привилегирован,  чем DPL дескриптора шлюза. Шлюзы также
следят   за   соблюдением   правил   привилегированности   передачи
управления  и  позволяют  передавать  управление  только  на  более
привилегированный уровень.
     Шлюзы  вызова  вызываются  командами  CALL   и   синтаксически
аналогичны вызову обычной подпрограммы.
     Когда активизируется  шлюз  вызова  для  межуровнего  перехода
в МП, выполняются следующие действия:
     1)загружаемые из шлюза CS: ESP проверяются на правильность;
     2)SS дополняется нулями до 32-х бит и убирается в стек;
     3)ESP убирается в стек;
     4)32-х битовые параметры ( WORD COUNT -  штук)  копируются  из
старого стека в новый;
     5)убирается в стек адреса возврата.
     Процедура идентификации  (реализации)  шлюзов  вызова  для  МП
80286  отличается от описанной выше тем, что работа происходит с 16
битовыми параметрами.
     Шлюзы прерываний и трассировки работают примерно также, но при
этом  не  копируются  параметры. Разница между шлюзами прерываний и
трассировок заключается в том, что при  передаче  управления  через
шлюз  прерываний  происходит  сброс  в  0  триггера  IF  в регистре
признаков, а для шлюза трассировки - нет.


                    4.4.6. Переключение задач

     Очень            важным            атрибутом             любых
многозадачных/многопользовательских    ОС    является   возможность
быстрого  переключения  между  задачами   или   процессами.   80386
непосредственно  поддерживает  такую работу, обеспечивая аппаратную
реализацию  команд   переключения   задач.   Переключение   задачи,
включающее  запоминание  текущего  состояния  машины (все регистры,
адресное пространство  и  связи  с  предыдущей  задачей),  загрузку
нового  состояния, проверку защиты и начало выполнения новой задачи
осуществляется за 17 мкс. Подобно передаче управления через  шлюзы,
операция   переключения   задач   вызывается   выполнением   команд
межсегментных переходов JMP и CALL, которые  указывают  на  сегмент
состояния  задачи  (TSS) или дескриптор шлюза задачи в GDT или LDT.
Команды INT n, особые ситуации, трассировка или запросы  прерывания
могут  также  вызывать  переключение  задач,  если дескриптор шлюза
задачи соответствует IDT дескриптору.

                                                      Рис.4-15
                                                      Рис.4-16

     TSS дескриптор указывает на сегмент (см. рис.4-15), содержащий
текущее состояние 80386, тогда как дескриптор шлюза задачи содержит
селектор TSS.
     80386 поддерживает TSS как для 80386 так и 80286 (на  рис.4-16
приведен  TSS  286).  Граница TSS 386 должна быть больше, чем 0064H
(002BH для 286 TSS), но  в  пределах  4  Гбайт.  В  дополнении  TSS
пространству  ОС  освобождает  место  для  хранения  дополнительной
информации, такой как причина выключения задачи, время,  выделенное
задаче, и открытия файлов требуемых задаче.
     Каждая  задача  должна  иметь  TSS.  Текущее  TSS   определяет
специальный регистр, называемый "Регистр сегмента состояния задачи"
(TR).  Этот  регистр  хранит  селектор,   указывающий   дескриптор,
соответствующий текущему TSS.
     Скрытые база и граница, связанные с  TR,  перезагружаются  при
перезагрузке TR.
     Возврат  из  задачи  осуществляется  командой  IRET,  при этом
передается управление ранее прерванной  задаче.  Состояние  текущей
выполняемой  задачи  заносится в TSS, а состояние предыдущей задачи
восстанавливается из TSS.
     Несколько бит регистра  признаков  и  слова  состояния  машины
(CRO)  используются  ОС  в  качестве  дополнительной  информации  о
состоянии  задачи.  "Гнездование  задачи"  (бит   14   в   регистре
признаков)  управляет  выполнением  команды IRET. Если NT = 0, IRET
обеспечивает нормальный возврат к предыдущей задаче (переключение с
задачи на задачу).
     Бит NT устанавливается и сбрасывается следующим образом:
     Когда команда CALL или INT инициализирует переключение задачи,
новый TSS будет заполняться и в поле возврата нового TSS  заносится
селектор  старого  TSS.  NT  бит  новой  задачи устанавливается в 1
командами CALL и INT, переключающими задачи.
     Прерывание,   не   осуществляющее  переключение  задач,  будет
сбрасывать NT в 0 (NT бит будет восстанавливаться после  выполнения
подпрограммы  обработки прерывания). NT может также быть установлен
или сброшен командами POPF или IRET.
     TSS в 386 запоминается при изменении поля типа дескриптора  от
9H  до  BH  (для  286  -  от  1  до  3).  Использование  селектора,
ссылающегося на занятый TSS, вызывает прерывание 13.
     Бит 17 (VM)  используется  для  указания  о  том,  что  задача
выполняется  в  режиме  виртуального  8086.  Если VM = 1, то задачи
используют механизм адресации RM. Среда виртуального 8086 создается
или  разрушается  только  при переключении задачи (см. раздел 4.6).
Состояние   сопроцессоров   автоматически   не   сохраняется    при
переключении задач, так как вызываемая задача может не использовать
сопроцессор.
     Бит переключения задачи TS (бит 3  в  регистре  CRO)  помогает
решать  вопрос  с  состоянием  сопроцессора  в многозадачной среде.
Переключая  задачу  386  устанавливает  TS  бит.  386   определяет
вначале, используются ли во включенной задаче команды сопроцессоров
и укажет на их недопустимость прерыванием 7. Подпрограмма обработки
прерывания  7  затем  решает,  каким  образом  сохранить  состояние
сопроцессора.
     Прерывание 7 не  будет  формироваться  при  выполнении  команд
ESCAPE   или  WAIT,  если  биты  TS  и  MP  (наличия  сопроцессора)
установлены в 1.
     T  бит  в  TSS  указывает  на  то,  что 386 должен формировать
прерывание в режиме отладки при переключении задач.
     При T = 1 при входе в новую задачу формируется прерывание 1.


               4.4.7.Инициализация и переход к режиму РМ

     Поскольку   386   начинает   функционировать   в   режиме   RM
непосредственно   после   сброса,  то  необходимо  инициализировать
(заполнить)   системные   таблицы   и   регистры   соответствующими
величинами.
     GDT и IDT регистры должны указывать правильные GDT и IDT.  IDT
должна  быть  длиной  не  менее  256 байтов, а GDT должна содержать
дескрипторы  для  начальных  сегментов  кодов  и  данных.  Рис.4-17
показывает  таблицы,  а  рис.4-18  -  дескрипторы,  необходимые для
типовой системы на 386 в режиме РМ. На рисунках показаны по  одному
сегменту  кодов  и данных/стека с размером 4 Гбайт каждый и уровнем
привилегированности PL = 0.
     Основной метод включения РМ режима - загрузка CRO с установкой
бита PE при помощи команд MOV CRO, R/M.
     После   включения   режима   РМ   должна   следовать   команда
межсегментного  перехода JMP, загружающая CS регистр и запоминающая
очередь дешифрируемых команд  (завершающий).  Окончательный  шаг  -
загрузка  всех  сегментов  регистров  данных  величинами  начальных
селекторов.
     Другой  подход включения режима РМ, специально предназначенный
для многозадачных ОС, заключается во введении в переключатель задач
загрузку всех регистров.
     В этом случае  GDT  будет  содержать  два  TSS  дескриптора  в
дополнение  к  дескрипторам  кода  и  данных,  требуемых для первой
задачи.
     Первая команда JMP в режиме РМ будет переходить к TSS, вызывая
переключение задачи и загружая все регистры величинами, хранимыми в
TSS.  Регистр  TSS  должен  быть  установлен   в   соответствии   с
дескриптором  действующего TSS, т.к. переключатель задачи сохраняет
состояние текущей задачи в TSS.

              4.4.8.Средства  для  построения   защищенных  систем

     Для    того,   чтобы   упростить   проектирование   защищенных
многозадачных систем, фирма Intel предоставляет  средство,  которое
обеспечивает  разработчику  системы простой метод создания структур
данных, необходимых для систем на основе 80386, работающих в режиме
РМ.  Этот  -  BLD-386. BLD-386 позволяет разработчику ОС определить
все дескрипторы сегментов, обсуждавшиеся в  предыдущих  разделах  с
помощью языков высокого уровня.


                    4.5.СТРАНИЧНАЯ АДРЕСАЦИЯ

          4.5.1. Принципы страничной адресации

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

          4.5.2.Страничная организация

          4.5.2.1.Страничный механизм

     80386    использует    два    уровня   таблиц,   преобразующих
исполнительный адрес (с  выхода  блока  сегментации)  в  физический
адрес. В 80386 используются три компонента страничного механизма:
     страничная директория;
     таблицы страниц;
     собственно страница (страничный кадр).

     Страницы  имеют  единый  размер  -  4  Кбайта.  Единый  размер
страницы  упрощает   управление   памятью   и   устраняет   явление
фрагментации.
     На   рис.4-19   показано,  как  работает  механизм  страничной
     адресации.

                 4.5.2.2.Регистр базы дескриптора страниц

     CR2 -  регистр  ошибки  исполнительного  адреса  страницы.
     CR3  -  регистр базы физического адреса директории страниц. Он
хранит начальный физический адрес директории  страниц.  Младшие  12
бит  CR3  всегда  в 0, что для директории страниц всегда определяет
размер страниц.
     При помощи команды MOV CR3, reg можно заполнять КЭШ  входов  в
таблицу  страниц при переключении задач через TSS, которая изменяет
величину CRO (см. 4.5.4).

                 4.5.2.3.Страничная директория

     Страничная директория размером 4 Кбайта позволяет  иметь  1024
входа  в  директорию  страниц.  Каждый  вход  страничной директории
содержит  адрес  таблиц  следующего  уровня,  таблицы   страниц   и
информацию   о   таблице   страниц.   Содержимое  входа  (элемента)
директории показано на рис.4-20.

     Старшие   10   бит   исполнительного   адреса   (А   22...А31)
используются   как   индекс  для  определения  требуемого  элемента
директории страниц.

                    4.5.2.4.Таблицы страниц

     Каждая  таблица  страниц  объемом 4 Кбайт хранит 1024 элемента
таблицы.  Элементы  таблицы  страниц   содержат   начальный   адрес
страничного кадра  и  статистическую  информацию  о  странице  (см.
рис.4-21).

     Адресные биты А 12...А21 являются индексом,  указывающим  один
из  1024  элементов  таблицы  страниц.  Старшие  20 разрядов адреса
страничного   кадра   объединяются   с   младшими   12    разрядами
исполнительного адреса и образуют физический адрес. Таблицы страниц
могут быть  использованы  несколькими  задачами  и  обмениваться  с
дисками.

               4.5.2.5.Элементы страничных директорий/таблиц

     Младшие   12  бит  элементов  страничных  таблиц  и  элементов
директорий  содержат  статистическую  информацию  о   страницах   и
страничных таблицах соответственно.
     Если бит представлен P=0, то элемент таблицы или директории не
может быть  использован  для  преобразования  адреса  (если  P=1  -
наоборот).  "Р"  и  все  другие  биты  доступны  для  использования
программным  обеспечением.  Например,  оставшиеся  31   бит   могут
использоваться для указания, где на диске храниться страница.
     Бит доступа  (А)  устанавливается  80386  для  всех  типов
элементов  перед  доступом  по  записи  или  считыванию  по адресу,
сопряженному с этим элементом. Бит занятости (D)  устанавливается
в  1  перед  записью  по  адресу  соответствующему элементу таблицы
страниц.                          --------------------------------
     D  бит не определяется для элементов директории страниц. Когда
биты P, A, D модифицируются (изменяются) 80386, процессор формирует
цикл  "чтение  -  модификация  -  запись", который блокирует шину и
устраняет конфликты с другими активными абонентами шины.
     Программное обеспечение, которое модифицирует эти биты, должно
использовать префикс LOCK для гарантирования целостности страничных
таблиц  в  многопользовательских  системах.  3  бита, помеченные OS
RESERVED на рис.4-20 и  4-21  (биты  9...11)  определяются  ПО.  ОС
свободно   используют   для  различных  целей  по  своему  желанию.
Например, использовать OS RES биты для  запоминания  информации  об
использовании  (устаревании)  страниц.  Имея  информацию о том, как
долго страница находится в памяти, ОС может  использовать  алгоритм
перемещения страниц подобно алгоритму " Замена наименее использ.".

     Бит    2   U/S   (пользователь/супервизор)   и   бит   1   R/W
(чтение/запись)  используются  как   атрибуты   защиты   конкретных
страниц.


             4.5.3.Защита на страничном уровне
                   (Биты R/W и U/S)

     80386  обеспечивает  атрибуты  защиты для систем со страничной
организацией. Механизм страничной адресации  различает  два  уровня
защиты:   пользователь,  который  соответствует  уровню  3  защиты,
основанной на сегментировании, и супервизор, который  включает  все
остальные  уровни  защиты  (0,  1,  2).  Программы,  выполняемые на
уровнях 0, 1. 2, обходят защиту страниц, хотя защита, основанная на
сегментировании, все - таки поддерживается аппаратурно.
     Биты   U/S   и   R/W   используется   для  обеспечения  защиты
пользователь/супервизор и чтение/запись для конкретных страниц  или
всех страниц, указываемых элементом директории таблиц страниц.
     Биты  U/S  и  R/W на втором уровне элемента страничной таблицы
используются для описания страниц, относящихся к данному элементу.
     На первом уровне таблицы директорий страниц  биты  U/S  и  R/W
описывают   все   страничные  таблицы,   соответствующие   элементу
директории.
     Биты  U/S  и  R/S  данной  страницы,  полученные  из элементов
директории страничных таблиц, используются в  качестве  ограничений
при адресации к странице.
     Например, если U/S и R/W биты для элемента директории  страниц
-  10,  а  эти  же биты для элемента таблицы страниц - 01, то права
доступа к страницы будут 01, т. е. наименьшее из двух.
     Таблица.4-4  показывает  влияние битов U/S и R/W на адресуемую
память.
     Однако  данный  сегмент  может  быть  легко  переведен в режим
только считывания (запрет записи) для уровней 0,  1,  2,  благодаря
использованию механизмов защиты сегментации (см. табл.4-4).

           4.5.4.Буфер предварительного преобразования TLB

     Аппаратура  страничной адресации 80386 спроектирована с учетом
требований систем  виртуальной  памяти  со  страничной  адресацией.
Однако,  производительность будет сильно снижаться, если процессору
будет требоваться доступ к двум уровням таблиц при каждом обращении
к  памяти.  Решение этой проблемы заключается в ведении в процессор
КЭШ - ЗУ для наиболее часто используемых страниц (TLB).
     TLB - это  4-х  входовой  набор  ассоциативных  регистров  для
хранения  32-х  элементных  страниц.  TLB автоматически подкачивает
большинство требуемых элементов страничных таблиц в процессор.
     32-х элементная TLB может одновременно  адресовать  128  Кбайт
памяти   (страница   размером  4  Кбайт  на  каждый  элемент).  Для
большинства  многозадачных  систем  коэффициент  попадания  98   %.
Рис.4-22   иллюстрирует,  как  TLB  реализует  механизм  страничной
адресации в 80386.

                4.5.5.Работа блока страничной адресации

     Работа   осуществляется  следующим  образом.  Блок  страничной
адресации принимает  32-х битовый  исполнительный  адрес  из  блока
сегментации.    Старшие    20   разрядов   исполнительного   адреса
сравнивается  со  всеми  32-мя  элементами  TLB.  Если  наблюдается
попадание   в   TLB  (имеется  соответствующий  элемент),  то  32-х
разрядный физический адрес формируется и выдается на адресную шину.
     Если элемент таблицы  страниц  отсутствует  в  TLB,  то  80386
предварительно обращается к элементу директории страниц. Если Р=1 в
элементе страничной директории, что указывает  на  наличие  таблицы
страниц в памяти, то 80386 предварительно считывает элемент таблицы
страниц и устанавливает бит доступа (A). Если в элементе страничной
таблицы  Р=1,  что указывает на наличие страницы в памяти, то 80386
устанавливает биты A и D так, как требуется, и  производит  выборку
операнда.
     Старшие  20  бит исполнительного адреса считываются из таблицы
страниц и запоминаются в TLB для  постоянного  использования.  Если
для  элемента страничной директории или элемента страничной таблицы
Р=0,  то  процессор  формирует  ошибку  страницы  (Прерывание  14).
Процессор также будет формировать прерывание 14, если при обращении
к памяти нарушаются атрибуты защиты U/S и R/W (например,  запись  в
страницу,   разрешенную   только   для   считывания).   CR2  хранит
исполнительный адрес, который вызывает ошибку страничной адресации.
При  возникновении  прерывания  14 CS: EIP будет указывать команду,
вызвающую ошибку страничной адресации.
     16-ти   битовый   код   ошибки    сохраняется  в    стеке  для
подпрограммы обслуживания ошибки и включает  биты,  указывающие  на
причину, вызвавшую ошибку.
     16-ти битовый код ошибки используется ОС для определения путей
исправления  ошибки.  Рис.4-23  А   показывает формат кода ошибки и
интерпретацию его битов.

                    Замечание
     Каждый   из   бит   кода  ошибки  U/S,  W/R,  P  имеют  имена,
соответствующие   названиям    аналогичным    бит    в    элементах
директории/таблицы  страниц,  но  интерпретируются биты кода ошибки
по-разному. Рис.4-23 В показывает, какой  тип  доступа  [к  памяти]
вызывает ошибку страничной адресации.

     U/S. Этот бит указывает, в каком режиме находился процессор: в
пользовательском  (U/S=1)  или  в  режиме  супервизора  (U/S=0) при
возникновении ошибки.
     W/R. Этот бит указывает, возникла ли ошибка при чтении (W/R=0)
или записи (W/R=1).
     P. Этот  бит  указывает,  возникла  ли  ошибка  по  отсутствию
страницы  (Р=0)  или нарушены правила защиты (Р=1).U не определены.

     4.5.6.Обязанности операционной системы

     80386  заботится  о   процессе   трансляции   адресов   блоком
страничной  адресации,  разгружая  ОС  от  этого. ОС вызывается при
начальной загрузке таблицы страниц и  управляет  обработкой  ошибок
страничной  адресации.  ОС  также  требуется при недействительности
(очистке) TLB, когда делаются  любые  изменения  в  любом  элементе
страничной таблицы.
     ОС  должна  перезагружать CR3 при очистке TLB. Переопределение
таблиц  -  просто  процесс  перезагрузки  CR3  адресом   страничной
директории   и   перемещение   пространства   (области)  страничной
директории и страничных таблиц.
     Основная ответственность ОС - реализация стратегии подкачки  и
управление   обработкой   всех   сбойных  ситуаций  при  страничной
адресации. Главная забота ОС - гарантировать, что информация в КЭШе
TLB  соответствует  информации  в страничных таблицах. В частности,
установка бита представления Р в ноль в любой момент времени должна
указывать  ОС на необходимость обновления. ОС может использовать то
преимущество,  что  CR3  запоминается  (хранится)  как  часть   TSS
конкретной  задачи  или  группы  задач,  имеющих  собственный набор
страничных таблиц.

              4.6. ВИРТУАЛЬНАЯ СРЕДА 8086

            4.6.1.Выполнение программ 8086

     80386 обеспечивает выполнение прикладных программ 8086  как  в
режиме  реальной  адресации  (RM),  так и в виртуальном режиме 8086
(VM). Из этих двух методов - VM - обеспечивает разработчику системы
большую гибкость.
     В частности, 80386 обеспечивает непосредственное выполнение ОС
и  пользовательских  программ  для  8086,  ОС  и   пользовательских
программ для 80286 и 80386.
     Таким  образом,  в  многопользовательском компьютере на основе
80386, один  пользователь  может  работать  с  MS-DOS  spreadsheet,
другой - с MS-DOS, а третий - с утилитами и прикладными программами
UNIX.
     При   этом,   у   каждого   пользователя   создается   иллюзия
монопольного владения ЭВМ.
     Рис.4-24 иллюстрирует этот принцип.

            4.6.2 Механизм адресации режима VM 8086.

     Одно   из   главных  отличий  RM  и  PM  режимов  8086  -  как
интерпретируются адресные селекторы.
     Когда процессор  работает  в  режиме  VM  8086, его сегментные
регистры используются идентично режиму RM.
     Содержимое  сегментного  регистра  сдвигается  влево  на  4  и
складывается со смещением, образуя исполнительный адрес.
     80386 позволяет самой ОС определить какие программы используют
механизм адресации как у 8086, а какие - адресацию режима PM.
     При  помощи  (благодаря)  страничной  адресации,  пространство
адресов в 1 Мбайт задачи,  исполняемой  в  VM  режиме,  может  быть
размещено  в  любом месте 4-х Гбайтного пространства исполнительных
адресов 80386.
     Подобно RM режиму, в VM  режиме  адреса  превышающие  1  Мбайт
будут вызывать прерывание 13.
     Однако  эти  ограничения  не  должны  быть очень важными, т.к.
большинство задач решаемых в VM 8086 режиме задач проще этого - они
преемницы пользовательских программ 8086.

             4.6.3 Страничная адресация в VM режиме.

     Аппаратура  страничной адресации разрешает параллельную работу
нескольких задач в VM режиме и обеспечивает защиту и  независимость
их операционных систем.
     Хотя   нет   обязательной   необходимости   использовать   эту
аппаратуру  в   режиме   VM,   это   необходимо   для   обеспечения
одновременного  выполнения  нескольких  задач  или  для перемещения
пространства адресов задачи в физическом пространстве адресов свыше
1 Мбайта.
     Аппаратура   страничной   адресации  позволяет  20-ти  битовые
исполнительные адреса VM программ разделить на 256 страниц.  Каждая
из  этих страниц может быть произвольно размещена в любом месте 4-х
Гбайтного пространства физических адресов 80386.
     Кроме того, т.к.  CR3  (регистр  базы  страничной  директории)
загружается  при  переключении  задач, то каждая задача в VM режиме
может  использовать  свою  схему  размещения  страниц  в  различных
пространствах физической памяти.
     В   довершение   ко  всему,  аппаратура  страничной  адресации
позволяет  разделять  коды   (программы)   ОС   между   несколькими
прикладными программами 8086.
     Рис.4-24  показывает как аппаратура страничной адресации 80386
подключает  несколько  программ  8086   под   управлением   системы
страничной адресации виртуальной памяти.


                           4.6.4 Защита

     Все  программы  в  режиме  VM выполняются на привилигированном
уровне 3. Для VM режима выполняются все проверки,  характерные  для
PM режима.
     В этом заключается отличие от RM режима, который безоговорочно
выполняется на  привилегированном  уровне  0.  Поэтому,  стремление
выполнить  привилегированную  команду в VM режиме будем приводить к
возникновению ошибки защиты (прерывание 13).
     Несколько команд чувствительны к IOPL, поэтому ОС может решать
выполнять  ли команды ввода-вывода (I/O), устанавливая IOPL=0, либо
выполнять эти команды обычным образом при IOPL=3.
     Т.К.   в   RM   режиме   программы   всегда   выполняются   на
привилегированном   уровне   0,   то   ошибок  при  получении  IOPL
чувствительных команд не формируется.
     Некоторые команды  используемые  только  в  режиме  PM,  будут
неопределенными (с точки зрения КОПа) в режимах RM и VM.
     В  режимах  RM  и  VM  прерывание  6  будет вызывать следующие
команды:
     ARPL, LAR, LSL, VERR, VERW, STR, LTR, SLDT и LLDT.

     Ниже следуют привилегированные команды. Они могут  выполняться
в  RM режиме, но будут вызывать прерывание 13 (ошибка общей защиты)
в VM режиме или, если CPL>0.
     LIDT, LGDT, LMSW, CTS, HLT, MOV, DRn, REG;
     MOV REG, DRn; MOV CRn, REG; MOV REG, CRn;
     MOV TRn, REG; MOV REG, TRn.

     Ниже приведенные команды формируют прерывание 13 (ошибка общей
защиты), когда CPL>IOPL.
     INS, IN, OUTS, OUT, STI, CLI, LOCK.

     Команды  INTn,  PUSH F, POP F, IRET становятся чувствительными
IOPL только, когда процессор работает в  режиме  VM  (заметим,  что
клманды INT3 и INT0 являются исключением из этого правила).


                  4.6.5 Управление прерываниями

     Для  обеспечения  полной  совместимости  с  машинами на основе
8086, прерывания в VM режиме обслуживаются своеобразно. При  работе
МП в режиме VM все прерывания и особые ситуации вызывают главную ОС
80386. ОС 80386 определяет поступило ли прерывание из PM режима или
из VM режима, анализируя бит VM в копии регистра признаков (EFLAG),
хранимой в стеке.
     Когда прерывается программа в режиме VM, происходит переход  к
программе обработки прерывания уровня 0 и VM бит сбрасывается. В то
же время, этот бит остается равным 1 в копии  содержимого  регистра
признаков, хранимой в стеке.
     ОС  80386  управляет обработкой прерываний и особых ситуаций и
возвращает управление программе 8086.
     ОС  80386  может  выбрать:  передать  ли управление обработкой
прерывания ОС 8086 или эмулировать  эту  обработку  самостоятельно.
Например, многие ОС для 8086 вызывают командой PUSH ввод параметров
в стек и затем выполняют команду INTn.
     Если IOPL=0, то команды INTn будут обращаться к ОС 80386.
     ОС 80386 может эмулировать системные вызрвы ОС 8086.  Рис.4-25
показывает, как ОС 80386 может воспринимать вызов "открыть файл" ОС
8086.
     ОС  80386  может  обеспечивать  окружение  виртуального  8086,
благодаря, восприятию и последующей интерпретации вызовов ОС 8086 и
восприятия команд IN и OUT.


           4.6.6 Инициализация и прекращение режима VM 8086

     Задача  режима VM инициализируется формированием крманд CALL и
JUMP к TSS, который  имеет  VM  бит  установленным  в  1  (в  копии
EFLAGS).
     При выходе из  подпрограммы  обработки  прерывания  на  уровне
[привилегированность]  0 установка VM бита также вызывает возврат к
VM режиму.
     Первый метод используется для начала выполнения  задачи  в  VM
режиме,   тогда   как   второй   -  для  возврата  из  подпрограммы
обслуживания прерывания в режиме VM.
     Переходы в и из VM  режима  сопровождаются  изменением  уровня
[привилегированного]  и  переключением  стека. Кроме того, значения
сегментных регистров убираются в стек и затем загружаются  нулевыми
селекторами.
     Это позволяет подпрограммам обработки прерываний обслуживать и
перезапоминать сегментные регистры,  как  селекторы  80286,  взамен
вида сегментных регистров 8086.
     Прерывающие  программы, которым необходимы значения сегментных
регистров будут иметь доступ к значениям (для их  просмотра)  через
стек.
     Прекращение   (выход  из)  режима  VM  соответствует  простому
переходу JUMP к TSS (на уровне 0), который не имеет  VM=1.  В  этом
случае происходит переключение задачи.


Продолжение: Исключения и прерывания
Оглавление


© Колесников Дмитрий Геннадьевич Rambler's Top100 Учебник по СайтоСтроению
Противотуманные фары для рестайлинга . Диодные лампы для авто Осрам