Архитектура 80386 с режимом защиты предохраняет против влияния
ошибок в программах и злонамеренного программирования.Эта защита
является настолько полной, что система, использующая средства
защиты в полной мере, может быть более сложной, чем это
необходимо или желательно для многих применений. Поэтому эта
часть посвящена ОСНОВАМ функционирования в 32-битовом режиме
защиты, которые легкораспространяются на все 32-битовые системы.
Эта часть включает информацию о простой модели
пользователь-супервизор в режиме защиты и пример программы
установки такой модели непосредственно с момента запуска
процессора.
Описываемые ОСНОВЫ обладают довольно большими возможностями.
Посмотрим, что они могут выполнить. Используя базовый набор
средств обеспечения защиты, программист может создать 32-битовую
систему с 32-битовой адресацией, 32-битовой обработкой данных,
страничной виртуальной памятью и 2-х уровневой системой
приоритетов: пользователя и супервизора.
Действительно: то что мы называем ОСНОВАМИ 80386 превосходит
всю архитектуру нескольких других 32-битовых процессоров, и эти
темы, сами по себе, содержат достаточно материала для
практической главы по режиму защиты. Вы найдете, что эта глава
полезна практически во всей вашей работе в 32-битовом режиме с
80386.
Следующие темы отложены до последних глав: виртуальный режим
8086, аппаратная мультизадачность и встроенные средства отладки в
80386.
Эта глава описывает систему адресации в 32-разрядном режиме, то
есть когда обрабатывается 32-битовое кодовое слово в режиме
защиты. 32-битовые адресные режимы отражают истинную мощь 80386.
Они обеспечивают гораздо большую общность и мощность средств для
выполнения программ, чем возможно в 16-разрядном адресном режиме.
Например, любой общий регистр можно использовать в 32-разрядном
адресном режиме и индексную компоненту адреса можно
масштабировать через 1, 2, 4, или 8.
Удобство, полученное благодаря общности 32-разрядных адресных
форм сильно облегчает разработку программ. Формирование
32-разрядного адреса часто может происходить без увеличения
времени исполнения инструкции. Аппаратные средства формирования
адреса - основное достижение 80386 по сравнению с некоторыми
другими сравнимыми с ним микропроцессорами. Даже режим
индексации-масштабирования не увеличивает времени выполнения
операции. Положительный эффект от такого представления весьма
ощутим, так как адресация памяти - часть почти каждой комманды.
Не принижая сравнительные аспекты других 32 - битных процессоров,
отметим как факт, что микропроцессоры 68020 или 32000 требуют еще
на 15 временных циклов больше для представления более сложных
адресных комбинаций. За 15 циклов 80386 исполняет, в среднем, 2
1/2 полных инструкций, включая вычисление адреса.
В 32-битовом режиме с защитой действительный адрес вычисляется
как сумма, максимум, 3-х 32-разрядных адресных компонент: базы,
смещения и индекса. Действительный адрес, поэтому, является
32-разрядным. Общий процесс 32-разрядной адресации, включая
масштабированную индексацию, показан на рис. 7.1.
32-разрядный адрес получен как смещение от базы текущего
сегмента памяти. Следовательно, в качестве второго шага любого
32-битового формирования адреса, базовый адрес сегмента
складывается с эффективным адресом, образуя 32-битовый линейный
адрес. Базовый адрес сегмента берется из дескриптора -
8-байтового блока данных, который описывает характеристики и
расположение каждого сегмента. Дескрипторы рассмотрены в гл. 8.
32-разрядный режим выполнения операций обеспечивает физическое
32
адресное пространство 2 байт, другими словами, 4 Гбайт. Это -
прямой результат 32-разрядной адресации, генерирующей
32-разрядныый линейный адрес.
В 80386 реализована аппаратная поддержка виртуальной памяти с
помощью страничной адресации. система адресации, котора
вычисляяяет эффективный адрес, не зависит от страничной
адресации. Страничная адресация, если угодно, - процесс
трансляции предшествующий вычислению линейного адреса,
предшествующий доступу в память. 32-битовая адресация со
страничной организацией иллюстрируется рис. 7.2. Как показано на
рисунке, страничная адресация затрагиваент верхние 20 бит
эффективного адреса, которые должны быть заменены другими
20-битовыми значениями. Замена, используя резидентную таблицу
страниц, предстает, как функция оригинального 20-битового
значения. Эта глава знакомит со страничной адресацией, так как
это связано со всем процессом трансляции адреса. Страничная
адресация подробнее будет раз`яснена в 9 главе. Эта глава
фокусируется на 32-разрядном формировании адреса.
Широкий диапазон адресных режимов допускает различные
комбинации 32-битных адресных компонент в эффективном адресе,
используя подмножество допустимых компонент. Более простые режимы
используют одну компоненту, в то время как более сложные - 2 или
более компонент и могут также масштабировать индексную компоненту
масштабным множителем 1, 2, 4, или 8.
Большинство адресных режимов являются регистровыми
косвенно-адресными. Кроме того, 80386 обеспечивает режим
косвенной адресации; однако, это применяется только к програмной
адресации. Ниже в этой работе описаны и проиллюстрированы все
32-битовые адресные режимы.
Режим прямой регистровой адресации
Прямой регистровый режим означает, что операнд расположен в
одном из 8 регистров общего назначения, в одном из 6 регистров
сегмента, или в одном из регистров системы.
Адресация общим регистром
Операнд в общем регистре определяется полем R/M. Используемые
размеры регистра могут быть 8, 16, или 32 бита, в зависимости от
размеров данных в операнде инструкции.
Адресация регистром сегмента
Операнд в регистре сегмента определен в поле регистра. Заметим,
что этот адресный режим не использует байт MOD R/M. Вместо него
исиспользуется поле инструкции SREG которое загружается или
запоминается в регистр сегмента.
Режим непосредственной адресации
Непосредственная адресация определяется тем, что операнд
включен в инструкцию, как таковую. Режим непосредственной
адресации может определять только операнд-источник, но не
операнд-приемник. Непосредственный операнд может быть байтом,
словом или двойным словом. Режим непосредственной адресации
определяется не байтом MOD R/M; вернее, определенные коды
операций полностью определяют использование непосредственной
адресации для операнда-источника. Инструкция такого типа,
поэтому, может включать байт MOD R/M для опрелеления ее операнда-
приемника.
Этот режим адресации определяет, что операнд - в сегменте
памяти, и что содержание одного или нескольких регистров
используется для вычисления эффективного адреса операнда в
пределах сегмента. Затем прибавляется базовый адрес сегмента для
формирования 32- битного линейного адреса операнда.
Косвенная адресация базовым регистром
Любой общий регистр кроме EBP может служить базовым регистром
операнда памяти.
Косвенная адресация
посредством базового регистра и смещения
Любой общий регистр может использоваться как базовый,
содержащий адрес, к которому добавляется 32-битное смещение, или
8-битное смещение со знако-расширением. Сумма формирует
эффективный адрес операнда памяти. Базовый адрес сегмента затем
добавляется к 32-битному линейному адресу операнда.
Косвенная адресация посредством
базового и индексного регистров
Пару любых общих регистров можно использовать в качестве
базового и индексного регистров, содержащих адреса, которые
складываются для формирования эффективного адреса операнда
памяти. Индексный регистр может быть масштабирован 1, 2, 4, или
8. Затем прибавляется базовый адрес сегмента для формирования
32-битного линейного адреса операнда.
Косвенная индексация посредством базового
и индексного регистра со смещением
Пару любых общих регистров можно использовать в качестве
базового и индексного регистров, содежащих адреса, которые затем
прибавляются к 32-битному смещению или знаковому расширению
8-битному смещения. Сумма образует эффективный адрес операнда в
памяти. Затем прибавляется базовый адрес сегмента для образования
32-битного линейного адреса.
Смещение
Зффективный адрес определен как абсолютное 32-битовое смещение
относительно базы сегмента. Величина смещения задана в самой
инструкции.
Преддекрементная косвенная адресация
с помощью ESP регистра
Для инструкций PUSH, PUSHA, CALL и INTn регистр ESP
используется как регистр, содержащий адрес операнда в памяти.
Перед использованием регистра ESP его содержимое уменьшается на
размер поля данных операнда, заносимого в стек.
Постинкрементная косвенная адресация
с помощью регистра ESP
Для инструкций POP, POPA, RET и IRET регистр ESP используется
как регистр, содержащий адрес операнда памяти. После того как
регистр ESP использован, его содержимое увеличивается на длину
поля данных операнда, извлеченного из стека.
Косвенные формы инструкций JMP и CALL используют косвенную
адресацию памяти. Режим косвенной адресации памяти дает
возможность использования удобств регистровых косвенных режимов,
перечисленных в предыдущем разделе.
Косвенная адресация для JMP и CALL с косвенным обращением к
памяти в пределах програмного сегмента функционирует следующим
образом: компоненты адреса складываются для образования
32-битного смещения и затем прибавляется базовый адрес сегмента
для образования 32-битного линейного адреса. Эта область памяти
содержит 32-битный эффективный адрес инструкции-приемника в
пределах текущего сегмента.
Косвенная адресация памяти для JMP или CALL с косвенным
обращением к памяти в другой програмный сегмент происходит
следующим образом: компоненты адреса складываются для образования
32-битного смещения и затем прибавляется базовый адрес сегмента
для образования 32-битного линейного адреса. Эта область памяти
содержит полный адрес (32-битный зффективный адрес
инструкции-приемника и 16-битовай селектор для програмного
сегмента-приемника). Все 48 бит полного адреса загружены и
использованы для вызова инструкции-приемника.
32-битные адресные режимы закодированы в байте MOD R/M и байте
S-I-B (масштаб-индекс-база). Для 32-битной адресации, в которой
задействовано либо только смещение, либо и базовый регистр и
смещение, требуется для кодирования только байт MOD R/M. Для
32-битной адресации, в которой задействован базовый и индексный
регистры, для кодирования требуется также байт S-I-B.
Как операнд-источник, так и операнд-приемник - общие регистры.
Второй операнд, к тому же, может быть как общим регистром, так и
областью памяти. Если второй операнд - область памяти, то
адресный режим определен. Для определения обоих операндов в байте
MOD R/M содержится три поля.
Байт кодирования MOD R/M
Байт MOD R/M следует за байтом(и) кода операци инструкций
80386. Байт MOD R/M разделен на 3
поля, как показано на рисунке. Трехбитное поле REG определяет
регистровый операнд. Двухбитное поле MOD определяет, является ли
второй операнд также регистровым; если - да, то трехбитное поле
R/M определяет второй операнд. Если, однако, поле MOD
свидетельствует, что операнд в памяти, то поля MOD и R/M, вместе,
указывают адресный режим, которым нужно пользоваться. Наконец,
если поле MOD указывает на операнд в памяти и поле R/M содержит
100, то следующий байт - S-I-B, который указывает режим
адресации.
Кодирующий байт S-I-B
При кодировании более сложных адресных форм, в которых
используется индексный регистр с масштабированием, за байтом MOD
R/M следует байт S-I-B (Масштаб-Индекс-База). Этот байт
подразделен на 3 поля. Поля изображены на рис.7.4: масштаб (SS),
индекс (INDEX) и базу (BASE). Поле SS содержит масштабный
множитель 1, 2, 4, или 8 для индексной компоненты. Общий регистр
(любой регистр кроме ESP) определен в поле INDEX. Поле BASE
указывает на общий регистр (когда не используется смещение - то
любой регистр кроме EBP) используемый в качестве базы.
32-битная таблица кодировки MOD R/M и S-I-B
(Подрузамевается, что ESP использован для адресации памяти
инструкциями PUSH, POP, PUSHA, POPA, CALL и INT n).Смещение
можно определить как 32-битное значение или как 8-битное значение
(знак-расширенное до 32 бит).
Содержание
Вперед