В этой главе излагается информация, которую нужно знать об
архитектуре 80386 в ЗАЩИЩЕННОМ режиме при проектировании или
использовании 32-разрядной системы 80386 с двухуровневой моделью
защиты пользователь/супервизор.
Она охватывает использование 80386 в 32-битном режиме с
базисной моделью защиты, использующей только 2 из 4-х имеющихся
уровней привиллегированности. Самый привилегированный и
наименьший уровни - использованы для простой двухуровневой
системы. 2 промежуточных уровня привилегированности
игнорируются.
Самый привилегированный уровень назначается операционной
системе. Как таковой, он называется уровнем супервизора. Он
включает в себя код управления системой - программу супервизора.
Младший уровень доступен для программ пользователя. Этот уровень
используется программами, спроектированными для специфических
применений, таких как база данных, компилятор, текстовый
процессор, или . Архитектура в режиме защиты 80386
защищает уровень супервизора от влияния любых програмных ошибок
уровня пользователя, даже злонамеренных. Адресное пространство
назначенное прграммам и данным супервизора, защищено от прямого
доступа чтение/запись из программы пользователя.
Структура прерываний в защищенном режиме тесно связана с
уровнями привилегированности. Она делает возможным передачи из
одного уровня привилегированности в другой. Она, конечно,
обеспечивает эту функцию для аппаратного прерывания по вектору,
но точно также может управлять програмными прерываниями.
Используя програмные прерывания и как механизм вызова, и как в
РС-ориентированных применениях, супервизор содержит служебные
программы, необходимые для уровня пользователя. Служебные
программы, запускаемые операциями програмного прерывания, могут
выполнять системные функции, такие как периферийный ввод/вывод,
распрелеление памяти и т.д. Програмное обеспечение пользователя
имеет простой доступ к служебным программам вызовом их командой
прерываня INT n. Кроме того, использование структуры прерываний
помогает защищать уровень супервизора ограничением точек входа в
супервизор только перичисленными в таблице прерываний.
ЗАМЕЧАНИЕ: вентили вызова, рассмотренные в главе 14 являются
отчасти более мощным механизмом связи пользователь-ОС, так как
они не ограничены количеством и позволяют делать копию параметров
в стек супервизора.
Эта глава посвящена, в основном, требованиям к сегментам в
простой 32-битной защищенной системе. Следует заметить, что
механизм страничной памяти в таких ситемах обеспечивает
необходимую защиту программ и данных супервизора.
В очень простых защищенных системах механизм страничной памяти
разделяет линейное адресное пространство на область пользователя
и область супервизора. Каждая страница оперативной памяти может
быть описана системой страничной памяти и как страница
пользователя, и как страница супервизора (см. главу 9).
Система страничной памяти может также обеспечивать возможности
по организации виртуальной памяти. Программы пользователя могут
частично размещаться на диске, и система страничной памяти
прозрачна для них (см. часть 9).
В ЗАЩИЩЕННОМ режиме сегментам памяти можно назначать атрибуты:
привилегированность, базовый адрес, размер и использование. В
простой ЗАЩИЩЕННОЙ системе нужно снабдить атрибутами весьма
небольшой набор сегментов, фактически 5. В двухуровневой системе
защиты требования архитектуры ЗАЩИЩЕННОГО режима реализуются
посредством 5 сегментов памяти. Эти 5 сегментов:
- Супервизорный програмный сегмент для программ уровня
супервизора.
- Супервизорный сегмент данных для стека и данных
супервизора.
- Пользовательский програмный сегмент для программ уровня
пользователя.
- Пользовательский сегмент данных для стека и данных
пользователя.
- Сегмент состояния задачи для хранения указателя стека
супервизора, когда выполняется программа на уровне пользователя.
Эти сегменты осуществляют требования ЗАЩИЩЕННОГО режима:
- Для каждого установленного уровня привилегированности
имеется, по крайней мере, 1 програмный сегмент. В нашем случае
этими уровнями оказываются уровень супервизора и уровень
пользователя, требующие 2 програмных сегмента.
- Для каждого установленного уровня привилегированности
имеется, по крайней мере, 1 стековый сегмент. В нашем случае
должны быть созданы 2 сегмента данных для хранения стеков. Эти
одинаковые сегменты можно также использовать для других данных
- Когда процессор выполняет программу на уровне пользователя,
для хранения начального указателя стека уровня
привилегированности супервизора нужен сегмент состояния задачи
Каждый из 4-х перечисленных сегментов следует объявить очень
большим по величине. Фактически их следует об`явить как 2 байта
(4 Гбайта), так чтобы каждый охватывал 32-битное линейное
адресное пространство, как показано на рис. 8.1. Установление
больших сегментов позволяет избежать ограничений по адресации
памяти внутри набора из 4-х сегментов, перечисленных выше и
исключает любую необходимость для программы пользователя
перегружать регистры сегмента в процессе своего выполнения.
Большое линейное адресное пространство сегментов обеспечивает
"квартиру" - 4-Гбайтную область, в которой исполняется программа
пользователя.
Сегмент состояния задачи - специальный сегмент размером ровно
104 байта, как описано ниже на стр. .Сегмент состояния задачи
может быть расположен в любом месте 4-х Гбайтного линейного
адресного пространства.
В режиме REAL (Главы 4 - 6) дескрипторов сегментов нет. В
режиме REAL у сегментов памяти есть только 1 атрибут - базовый
адрес. Отметим, однако, что базовый адрес в режиме REAL является
прямой функцией значения селектора сегмента, умноженного на 16
(сдвинутого на 4 бита влево). Селектор как таковой, таким
образом, полностью описывает сегмент памяти в режиме REAL.
Однако, в ЗАЩИЩЕННОМ режиме сегменты памяти сложнее. Каждый
обладает несколькими атрибутами: индивидуальным базовым адресом в
32-битном линейном адресном пространстве (не прямо, как функция
от значения селектора), индивидуальным размером и индивидуальными
правами доступа. Эти атрибуты содержатся в специальном типе
данных, дескрипторе сегмента, распознаваемом 80386 в ЗАЩИЩЕННОМ
режиме.
В ЗАЩИЩЕННОМ режиме сегменты описаны перечислением атрибутов в
дескрипторах, по одному дескриптору на сегмент, и группированием
дескрипторов вместе для образования в памяти резидентной таблицы,
называемой Таблица Глобального Дескриптора (GDT). Несколько
дескрипторов и GDT описаны ниже в этой главе. Другие дескрипторы
и таблицы, не нужные для простой 32-битной системы, обсуждены в
Гл.14.
Формат дескриптора сегмента
Каждый дескриптор состоит ровно из 8 байт - 2-х 32-битных
двойных слова, однако, содержит всю описательную информацию,
относящуюся к одному сегменту памяти: базовый адрес, размер и
права доступа.
Ниже приводятся определения дескрипторных полей:
1. Базовый адрес сегмента - это 32-битное значение, определяющее
базовый адрес сегмента в линейном адресном пространстве.
2. Граница сегмента - это 20-битное поле, определяющее
наибольшее смещение в сегменте. Граница может быть выражена в
байтах или в страницах (4096 б), что контролируется битом G
дескриптора.
3. G (градуировка) указывает, что граница сегмента задается или
в байтах, или в страницах.
4. D (неполнота) указывает какой сегмент 32-битный (D=1) или
16-битный (D=0). Если D=1, то формат дескриптора для
сегменттов программ и данных такой, как показано на рис. 8.2 и
8.3, соответственно. Если D=0, то формат дескриптора такой,
какой используется 80286 в ЗАЩИЩЕННОМ режиме для 16-битного
сегмента, как раз`яснено в гл. 14. 16-битный код обеспечивает
32-битный размер операнда данных и 32-битный размер адреса по
умолчанию (совместимый с 80286 в режиме защиты).
5. E (направление распространения), только для сегментов
данных,- указывет, где расположен сегмент или в области
адресов от базы сегмента вверх до его границы, включая E=0,
или от максимального смещения до границы, не включая ее
(E=1). Большинство сегментов данных, таких как B и D на стр.
имеют в этом бите 0 (вверх). Только для сегмента данных,
использующего для хранения стека данных, который растет вниз,
по направлению к меньшим адресам можно найти уместным иметь в
этом бите 1 (вниз).
6. B (большой) только для сегментов и учитывается только если
сегмент простирается вниз, обозначает максимальное смещение в
сегменте. Максимальное смещение простирающегося вниз сегмента
данных может быть указано как FFFFFFFF (B=1) или как
0000FFFF (B=0). B не отвечает за сегменты данных,
простирающиеся вверх.
7. Права доступа - это несколько бит, указывающих на разрешенные
формы доступа в сегмент, включая требование
привилегированности уровня и защиту по записи и чтению. Если
используемый операнд внутри сегмента использует запрещенную
форму доступа, то 80386 вырабатывает исключительную ситуацию
по общей защите (исключительная ситуация 13) или
исключительную ситуацию по стеку (исключительная ситуация 12),
если работа со стековым сегментом.
7а. P (представление) указывает, имеется ли сегмент в физической
памяти (P=1), или нет (P=0). Этот бит позволяет определять много
больших сегментов, из которых, возможно, только некоторые
частично или полностью могут быть одновременно в физической
памяти. Система страничной памяти позволяет любому сегменту
загружаться постранично; даже если P=1 сегменту не нужно быть
целиком в памяти.
7б. DPL (Уровень привилегированности дескриптора) указывает
уровень привилегированности, как число 0, 1, 2, или 3 следующим
образом
DPL текущего програмного сегмента указывает текущий уровень
привилегированности (CPL) операции. Например, если процессор
обрабатывает програмный сегмент с DPL 00, то он работает при CPL
0 - самом привилегированном уровне - уровне супервизора.
7в. A (Доступный) - указывает был ли сегмент доступен (A=1) или
нет (A=0) с того момента, как этот бит дескриптора был сброшен в
0. Если в системе происходит обмен сегментами между памятью и
диском, то этот бит можно использовать для определения
использования сегмента. Типовые простые системы обмена страницами
не используют сегментации и этот бит для таких систем интереса не
представляет.
7г. R (доступность для чтения), только для кодового сегмента -
указывает, доступен ли сегмент для чтения (R=1) или нет (R=0).
Програмные сегменты, конечно, всегда выполнимы. Атрибут R может
обеспечить сверхбезопасность запрещением програмному обеспечению
читать из сегмента, использующего префикс отвержения CS
7д. C (приспосабливаемость), только для кодового сегмента,
- указывает изменяется ли CPL, когда сегмент вызван из уровня
меньшей привилегированности (C=0) или нет (C=1). Если C=1, то
програмный сегмент называется приспосабливаемым програмным
сегментом, т.к. значение CPL не изменяется, когда вызывается этот
сегмент. Приспосабливаемые програмные сегменты очень употребимы
для библиотечных программ, позволяющих вызвать программу из
программы пользовательского уровня, но сохраняя у
пользовательской программы CPL пользователя. Особенность
приспособления - до некоторой степени абстрактное понятие
архитектуры в режмиме защиты и в 32-битных простых системах с
защитой все програмные сегменты - регулярны, т.е. не
приспосабливаемы.
7e. W (доступность для записи), только для сегментов данных, -
указывает доступен ли сегмент данных для записи (W=1) или нет
(W=0). Сегменты данных, конечно, всегда доступны для чтения.
Атрибут W может обеспечивать сверхбезопасность запрещением
програмному обеспечению писать в сегмент. К применений этой
специальной особенности относится резервирование сегмента для
информации о состоянии и защите общедоступных баз данных. В
простой 32-битной защищенной системе сегмент данных служит для
разных целей и, среди прочего, содержит стек; поэтому он должен
быть доступным для записи.
Глобальная таблица дескриптора содержит массив дескрипторов
сегментов. Как показано на рис. 8.4 эта резидентная в памяти
таблица с базой и границей внутри линейного адресного
пространства в области определенной системным регистром GDTR (см.
стр. 20 и рис. 2.8). GDTR принимает 48-битный операнд, состоящий
из 32-битной базы и 16-битной границы. Таким образом база GDT
может присутствовать в любом адресе в пределах линейного
адресного пространства; граница (максимальное смещение) может
простираться до FFFF, охватывая до 8192 дескрипторов,
пронумерованных от 0 до 8191. Дескриптор 0 - базовый адрес в GDT.
Дескриптор 0, специально определенный как пустой дескриптор,
не используется процессором. Он сохранен для заполнения нулевого
дескриптора 8 байтами 00 .
GDT может содержать только:
Дескрипторы сегментов программ стр.
Дескрипторы сегментов данных стр.
Вентили вызова гл. 14
Дескрипторы сегментов состояния задач гл. 14
Вентили задач гл. 14
Дескрипторы LDT гл. 14
В режиме защиты загрузка селектора регистр сегмента вызывает
доступ 80386 в сегмент n, описанный дескриптором n, где n -
верхние 13 бит селектора.Верхнии 11 бит селектора ведут себя как
индекс в таблице дескрипторов (GDT, где бит - 0). Все инструкции,
которые пересылают значение в регистр сегмента (CS, SS, DS, ES,
FS, GS) вызывают то, что 80386 автоматически ссылается в
дескриптор n, читает дескриптор и запоминает содержание внутри
кэша дескриптора. Внутри имеется по одному кэшу дескриптора для
каждого регистра сегмента.
Регистры кэш-дескриптора сохраняют копию дескриптора сегмента.
Эта копия использована во всех вычислениях адреса для получения
границы сегмента и прав доступа, использованных во время проверки
границ и прав доступа. Помещение регистров кэш-дескриптора в чип
существенно при реализации. они обеспечивают мнгновенный доступ
по всем текущим сегментам.
Несколько важных деталей можно уяснить из рис. 8.6 . Заметим,
что кэш дескриптора для CS и SS содержит CPL, в то время как
остальные содержат DPL. Это означает, что DPL програмных
сегментов устанавливает CPL и, также, что DPL стекового сегмента
должен всегда соответствовать CPL. Этот факт критичен даже для
простых ЗАЩИЩЕННЫХ систем.
В простых защищенных системах пользователь вызывает программы
супервизора, используя програмные прерывания - инструкции INT n .
Для этой цели зарезервированы номера от 32 до 255.
Структура прерываний, поэтому,- неотделимая часть простой
32-битной системы с защитой. Это раз`яснено в следующем
параграфе. Затем обсуждено проектирование многоуровневых систем.
Структура прерываний в режиме защиты - в высшей степени
аналогична структуре прерываний в режиме REAL, описанном в гл.6.
Сходство поразительно во всех отношениях
1. Как и в режиме REAL, програмные прерывания можно вызвать
инструкциями INT n. Сигналы аппаратных прерываний
направляются на входные контакты INTR (маскируемые) и NMI
(немаскируемые). После получения прерывания, управление
передается программе обслуживания с помощью резидентной
таблицы, содержащей соответствующую информацию о векторах.
2. Точки входа для супервизорных программ прерываний
содержатся среди вентилей прерываний и вентилей системных
прерываний. Эти вентили - аналоги векторов прерываний
режима REAL. Вентили прерываний особенно подходящи для
векторных аппаратных прерываний, в то время как вентили
системных прерываний - идеальны для векторных програмных
прерываний.
3. Вентили прерываний и вентили системных прерываний
перичислены вместе в резидентном массиве, называемом
Таблицей Дескрипторов Прерываний (IDT). IDT - аналог
таблицы векторов прерываний, рассмотренной в режиме REAL.
IDT дальше рассмотрена на стр.
Вентили прерываний
Векторный элемент, специально спроектированный для векторных
аппаратных прерываний в режиме защиты - это вентиль прерываний.
Как и его аналог в режиме REAL - вектор прерываний - вентиль
прерываний содержит селектор и смещение. Однако, селектор и
смещение заключены в 8-байтном дескриптороподобном элементе -
вентиле прерываний.
Каждый вентиль прерываний содержит ровно 8 байт - 2 32-битных
двойных слова, содержащих полную информацию про направление
передачи управления и защиту для одного прерывания
селектор (который должен быть селектором програмного сегмента) и
уровень привеллегированности, назначенный этому вентилю.
Определения полей вентиля прерываний
1. Селектор для програмного сегмента - приемника именует
програмный сегмент, содержащий программу обслуживания
прерываний. Этот селектор должен ссылаться на програмный
сегмент.
2. Смещение точки входа идентифицирует точку входа в программу
обслуживания прерывания.
3. Права доступа указывают на разрешенные формы доступа к
вентилю, включая требования присутствия и уровня
привилегированности. Если использование вентиля не
соответствует требованиям, то 80386 вырабатывает
исключительную ситуацию по общей защите (исключительную
ситуацию 13).
3а. P (присутствие) указывает доступен ли вентиль для
использования (P=1) или нет (P=0). Для успешной обработки
по вектору должен присутствовать вентиль.
3б. DPL (уровень привилегированности дескриптора) указывает
уровень привилегированности вентиля. Аппаратное прерывание
может всегда быть напроавлено по вектору с помощью вентиля
прерываний, если он помечен как присутствующий, независимо
от DPL вентиля. DPL применяется только для програмных
прерываний (инструкции INT n, INTO, BOUND и исключительные
ситуации). DPL указывает на уровень привилегированности
вентиля числом 0, 1, 2, или 3 по следующему принципу
Для програмных прерываний или исключительных ситуаций
инструкции, использующие прерывания должны иметь СPL по крайней
мере такого же уровня привилегированности, как и DPL вентиля.
Например, если процессор работает на текущем уровне
привилегированности 3, то програмные прерывания могут
использовать только вентили проерываний с DPL=3. Любое другое
значение DPL вентиля (т.е. 2, 1, или 0) будет указывать на более
привилегированное требование переход по вектору успешно не
осуществится. Вместо этого будет выработана исключительная
ситуация 13 (по общей защите).
Передача управления с помощью вентиля прерывания
Когда управление передается в программу обслуживания
прерываний через вентиль прерываний, в стек засылаются 3 двойных
слова копия EFLAG, копия CS с младшим СЛОВОМ 0000 и копия EIP.
Флаг IF в EIP затем очищается, исключая дальнейшие прерывания
до того, как IF снова не установится программным образом IF
обычно устанавливается в начале программы обслуживания Регистр
EIP затем загружается из поля смещения вентиля прерывания и CS
загружается из поля селектора вентиля прерываний. 80386 также
читает дескриптор, соответствующий полю селектора. В процессе
этой работы он загружает в свой кэш дескриптора программного
сегмента всю информацию дескриптора - база,границы и права
доступа. 80386 продолжает вызывать инструкцию со смещением EIP
-1ю инструкцию программы обслуживания.
Вентили системных прерываний
Векторный элемент, специально спроектированный для векторных
програмных прерываний в ЗАЩИЩЕННОМ режиме - вентиль системных
прерываний - очень похож на вентиль прерываний. Каждый вентиль
системных прерываний состоит из ровно 8 байт - 2-х 32-битных
двойных слова, содержащих полную информацию о векторе защиты для
одного прерывания: селектор (который должен быть селектором
програмного сегмента), смещение для точки входа програмного сегмента
и уровень привилегий, назначенный этому вентилю.
Определения для полей вентиля системных прерываний идентичны
соответствующим определениям вентиля прерываний.
Передача управления
с помощью вентиля системных прерываний
Передача управления через вентиль системных прерываний
идентична процессу передачи через вентиль прерываний, за
исключением того, что флаг IF в EFLAG не очищается. Это сохраняет
восприимчивость 80386 к маскируемым аппаратным прерываниям на
контакт INTR, что особенно удобно для програмных прерываний по
вектору.
IDT - это двойник таблицы прерываний по вектору, рассмотренной
в режиме REAL (см. Главу 6). IDT содержит только вентили, но не
дискрипторы. Кроме вентиля прерываний, и вентиля системных
прерываний, описанных в этой главе, может быть тип вентиля,
называемый вентилем задачи. Вентили задач, не нужные в простых
32-битных системах с защитой, рассмотрены в главе 14.
IDT содержит массив вентилей. Как показано на рис. 8.9, это -
резидентная таблица со своей базой и границей, размещенной в
линейном адресном пространстве, в области, определенной
посредством системного регистра IDTR (см. стр. и рис. 2.8).
IDTR принимает 48-битный операнд состоящий из 32-битнычй базы и
16-битной границы. Таким образом, база IDT может находится на
любом адресе в пределах линейного адресного пространства; граница
(максимальное смещение) может достигать 7FF16, охватывая до 256
вентилей, пронумерованных от 0 до 255. Вентиль 0 нахобится по
базовому адресу IDT.
IDT может содержать только
Вентили прерываний: стр.
Вентили системных прерываний: стр.
Вентили задач гл. 14
Очевидно, что для создания надежных систем для програмного
обеспечения большинства ответственных функций, таких как
ввод/вывод на диск например, - следует требовать гораздо большего
уровня привилегированности, чем для програмного обеспечения
шаблонных вычислений. Также очевидно, что некоторые данные,
содержащие, к примеру, ID-ы и ключи пользователя, следует
наделять высокими привилегиями. (т.е. сверхсекретные). В общем,
связь с супервизором надо контролировать. 80386 проектируется для
обеспечения необходимой защиты путем использования механизма
привеллегий.
В режиме защиты возможно до 4-х уровней привилегий. 4 уровня
обеспечивают подходящую грануллированность даже для самых сложных
систем. Однако, планирование минимальной системы делает возможным
использование 2-х уровней для реального двухуровневого
проектирования системы пользователь/супервизор. В определенных
системах вы можете пожелать использовать по крайней мере 3
уровня, посвящая низший уровень прикладному програмному
обеспечению пользователя и помещая супервизор среди 2-х или
большего числа более привилегированных уровней.
Никогда не оказывается случаев использования более одного
уровня привилегий. Вы можете найти применения, для которых и
один уровень привилегированности вполне достаточен. Вам может
требоваться только голая скорость вычислений 80386. Когда
используется только 1 уровень привилегированности, в любом
случае, он должен быть уровня 0 - самым привилегированным
уровнем, так чтобы могли выполняться все команды 80386.
Этот раздел описывает передачи между уровнями
привилегированности. Они возникают, когда 80386 передает
управление из одного програмного сегмента с уровнем
привилегированности n в другой програмный сегмент с уровнем
привилегированности m. Такие передачи легко завершить в одном
направлении и, затем, - в другом - отдельными инструкциями,
такими как CALL (в более высокий уровень привилегированности), и
RET (назад, в более низкий уровень привилегированности), или INT
n (в более высокий уровень привилегированности) или IRET (назад,
в более низкий). Архитектура 80386 в ЗАЩИЩЕННОМ режиме, как
описано в этой главе, легко выполняет эти передачи.
Когда управление передается из одного сегмента в другой, в
регистр програмного сегмента и счетчик команд 80386 загружаются
новые значения. В соответствии с этим, инструкции выполняются из
другой области. Передача управления в новый уровень
привилегированности расширяет понятие передачи управления еще на
шаг.
Межуровневой передаче новый поток инструкций и новый стек.
Помимо загрузки новых значений CS и EIP, как при обычной
передаче, также загружаются новыми значениями регистр стекового
сегмента и указатель стека. Загрузка CS:EIP и SS:EIP согласована
с каждым уровнем привилегированности, имеющим свой собственный
стек для обеспечения целостности стековой области при пользовании
уровнем супервизора.
Инструкции INT n, используемые для межуровневой
передачи в простых ЗАЩИЩЕННЫХ системах
Передачи на более привилегированные
уровни можно осуществлять в программы супервизора инструкциями
INT n. В конце программы инструкцией IRET достигается передача в
обратную сторону.
Пути к более привилегированным уровням
Когда в качестве вентиля n в IDT оказываются вентиль
прерываний или вентиль системных прерываний, инструкция INT n
направляет его селектор и смещение через вентиль в определенный
приемник. Вентиль системных прерываний, или вентиль прерываний
обеспечивает передачу управления в специальную точку входа,
которая может быть на более высоком, или на том же уровне
привилегированности как CPL инструкции INT n.
Так или иначе, передача на точку входа разрешается в
зависимости от сравнения CPL инструкции INT n c DPL - вентиля.
Применяется нормальное правило сравнения. Если CPL по крайней
мере того же уровня, что и DPL вентиля, то передача управления с
помощью вентиля проходит успешно. В противном случае
генерируется исключительная ситуация по общей защите
(исключительная ситуация 13)(см. главу 16 для дальнейшей
информации по исключительным ситуациям в режиме защиты).
Вентиль очевидно добавляет шаг косвенности к процессу
достижения программы на более высоком уровне
привилегированности. Однако, посредством этого вентиля защищает
более привилегированную программу разрешением доступа только в
том случае, если представлен вентиль и посредством определения
точной точки входа в привилегированную программу.
Прозрачность для пользователя
Перенос уровня привилегированности осуществляется простыми
инструкциями INT n и IRET. Они прозрачны для пользователя, так
как никаких специальных инструкций не требуется.
Примечание: инструкции CALL, которые ссылаются на вентили
вызова, также совершают перенос уровня привилегированности
прозрачным образом. Вентили вызова обсуждены в гл. 14. В этой
системе с защитой мы просто используем команды прерывания.
Программа супервизора знает, какие инструкции INT n
осуществляют уровневый перенос посредством контроллирования
содержания вентиля n, на который ссылается инструкция. Например,
если приемник - вентиль k, селектор которого определяет
програмный сегмент такой же привилегированности, как CPL, то
инструкция INT k только передает управление служебной программе
(CS:EIP загружаются новыми значениями). Однако, когда инструкция
INT q определяет вентиль q, селектор которого определяет
програмный сегмент более высокого уровня привилегированности, то
имеет место автоматический перенос уровня (CS:EIP и SS:ESP
загружаются новыми значениями).
Соответственно, инструкция IRET проверяет содержание CS в
стеке супервизора для определения DPL приемника возврата. Если
DPL совпадает с CPL, имеет место передача без переноса уровня
(CS:EIP загружаются новыми значениями.) Если DPL ниже, чем CPL,
то происходит снижение уровня. (CS:EIP и SS:ESP загружаются
новыми значениями).
Сегмент состояния задачи - TSS первоначально использовался в
мультизадачных системах, как рассмотрено в части 5. В таких
системах, где 80386 обеспечивает аппаратную поддержку для
большого количества задач, 32-битный сегмент состояния задачи
создается для каждой 32-битной задачи для сохранения содержимого
регистров задачи, когда задача не активна. По этим причинам,
32-битный сегмент состояния задачи должен быть достаточно
большим, чтобы вместить всю необходимую информацию, относящуюся к
одной задаче. Для 32-битной задачи 32-битный TSS должен иметь, по
крайней мере, 104 байта в длину.
Програмные замечания: Для простой 32-битной системы с
защитой TSS служит только местом хранения указателя стека
супервизора - SS:ESP. Это - как раз тот сегмент, который надо
об`являть вместе с дескриптором в GDT, похожим образом, как 2
сегмента данных и 2 програмных сегмента, необходимых для простой
системы.
Для простой 32-битной системы с защитой в 32-битном TSS почти
все нули, поскольку относятся к полям, не нужным для простой
системы с защитой. Тем не менее, TSS должен иметь, по крайней
мере, 104 байта в длину, как показано на рис. 8.11. У него
относятся к делу поля SS и ESP для уровня 0. Эти 2 поля должны
указывать на начальные SS:ESP, используемые для стека
супервизора.
Дескриптор TSS
32-битный сегмент состояния задачи из рис. 8.11 об`является,
как лежащий в специальном дескрипторе GDT. Такой дескриптор TSS
изображен на рис. 8.12. Определения полей, лежащих в дескрипторе
TSS идентичны определениям в дескрипторе програмного сегмента, за
исключением:
B (занято), который указывает - занята ли текущая задача (B=1)
или нет (B=0). Для простой системы с защитой этот бит должен быть
установлен в 1. Дальнейшие детали относительно поля B можно найти
в главе 14.
Инициализация TR (Регистра Задачи)
Наконец, для запуска 32-битного TSS нужно загрузить селектор
дескриптора TSS в регистр ЗАЩИЩЕННОГО режима, спроектированный
специально для этой цели - Регистр Задачи (TR).
TR инициализируется загрузкой значения селектора в регистр с
помощью комманды LTR. Используемый селектор должен ссылаться на
дескриптор TSS, такой как на рис. 8.12, который содержит
необходимый базовый адрес и информацию о границе. Регистр кэша
дескриптора, связанный с регистром TR сохраняет внутреннюю копию
дескрипторного поля TSS, как показано на рис. 8.13. Используя
инструкции LTR для загрузки дескриптора LDT, TSS можно
расположить в любом месте линейного адресного пространства, и он
может занимать до 64 К.
16-разрядный ТSS содержит следующую информацию:
фиксированную часть,описывающую содержимое регистров,дополни-
тельную необязательную зону памяти за фиксированной частью,но
внутри зоны,обозначенной ограничителем ТSS.
32-разрядный ТSS содержит следующую информацию:
фиксированную часть,описывающую содержимое регистров,необязатель-
ную битовую карту разрещенного ввода/вывода,но внутри зоны
обозначенной ТSS
Содержание
Вперед