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. В этом случае происходит переключение задачи.Продолжение: Исключения и прерывания
© Колесников Дмитрий Геннадьевич
Учебник по СайтоСтроению
-
Противотуманные фары для рестайлинга . Диодные лампы для авто Осрам |