отмасштабирована (умножена) коэффициентом 1,2,4 или 8, что дает возможность делать ссылки на элементы массива или записи соответствующей длины. Величина отклонения может иметь разрядность 8 или 32 бит и интерпретируется процессором как величина со знаком в дополнительном коде. Разумные комбинации базы, индекса и отклонения дают следующие способы адресации памяти 80386: - прямая: используется только отклонение; - регистровая косвенная: используется только база; - базовая: используется база + отклонение; - индексная: используется индекс (в масштабе); - индексная с отклонением: используется индекс (в масштабе) + отклонение; - базовая индексная: используется база + индекс (в масштабе); - базовая индексная с отклонением: используется база + индекс (в масштабе) + отклонение; 2.3 Типы данных и команды В данном разделе будут рассмотрены команды, чаще всего используемые программистами. Поскольку большинство команд оперирует с конкретными типами данных (например, с целыми), эти типы и команды рассматриваются совместно. Привилегированные команды, включая те, которые осуществляют ввод/вывод и обработку прерываний будут рассмотрены в главе 3. 2.3.1 Главные типы данных В табл. 2-1 Перечислены типы данных и команды, обеспечиваемые процессором 80386. В этой таблице приведены только наиболее употребимые команды. Варианты команд, такие как (в случае циклического сдвига) циклический сдвиг вправо и циклический сдвиг через перенос, также опущены. Таблица 2-1 ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ +------------------------------------------------------------------------------+ | ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ 3 +--------------+----------------+----------------------------------------------| | ЦЕЛОЕ, | 8, 16, 32 БИТ | ПЕРЕСЫЛКА, ОБМЕН, ПРЕОБРАЗОВАНИЕ, ПРОВЕРКА, | | ПОРЯДКОВОЕ | | СРАВНЕНИЕ, ПЕРЕВОД, СДВИГ, ДВОЙНОЙ, СДВИГ, | | | | ЦИКЛИЧЕСКИЙ СДВИГ, ОТРИЦАНИЕ, ЛОГИЧЕСКОЕ "И",| | | | "ИЛИ", ИСКЛЮЧАЮЩЕЕ "ИЛИ". | | | | | | | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, | | | | УВЕЛИЧЕНИЕ НА 1, УМЕНЬШЕНИЕ НА 1, ПЕРЕВОД | | | | (ПЕРЕСЫЛКА С РАСШИРЕНИЕМ ЗНАКА/НОЛЯ) | +------------------------------------------------------------------------------+ +------------------------------------------------------------------------------+ |НЕУПАКОВАННОЕ | 1 ЦИФРА | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ, | | ДЕСЯТИЧНОЕ | | УМНОЖЕНИЯ, ДЕЛЕНИЯ | +--------------+----------------+----------------------------------------------| | УПАКОВАННОЕ | 2 ЦИФРЫ | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ | | ДЕСЯТИЧНОЕ | | | +--------------+----------------+----------------------------------------------| | СТРОКА | 0-4 ГБАЙТ СЛОВ | ПЕРЕСЫЛКА, ЗАГРУЗКА, ЗАПОМИНАНИЕ, | | БАЙТОВ, СЛОВ,| ДВОЙНЫХ СЛОВ | СРАВНЕНИЕ, ПРОСМОТР, ПОВТОР | | ДВОЙНЫХ СЛОВ | | | +--------------+----------------+----------------------------------------------| | СТРОКА БИТ | 1-4ГБИТ | ПРОВЕРКА, ПРОВЕРКА И УСТАНОВКА, | | | | ПРОВЕРКА И ГАШЕНИЕ, ПРОВЕРКА И ДОПОЛНЕНИЕ, | | | | ПРОСМОТР, ВСТАВЛЕНИЕ, ИЗЪЯТИЕ | +--------------+----------------+----------------------------------------------| | ЛОКАЛЬНЫЙ | 32 БИТ | (СМ. ПОРЯДКОВОЕ) | | УКАЗАТЕЛЬ | | | +--------------+----------------+----------------------------------------------| | ГЛОБАЛЬНЫЙ | 48 БИТ | ЗАГРУЗКА | | УКАЗАТЕЛЬ | | 3 +------------------------------------------------------------------------------+ Примечание: Локальный указатель - 32 битное смещение в сегменте, определенном одной из регистрированных пар сегмента/дескриптора. Глобальный указатель - это полный логический адрес, состоящий из селектора и смещения. На рис.2-7 показаны примеры того, как главные типы данных хранятся в памяти. Многобайтные элементы могут размещаться с любого адреса байта в зависимости от структуры магистрали, для обращения к операндам, размещенным по адресу, не кратным длине операнда в байтах, могут потребоваться дополнительные магистральные циклы. Поэтому для высокой производительности, не зависящей от структуры магистрали, большинство программ ориентируют словные операнды из двойных слов на границах двойных слов и т.п. | 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА-1 +------------------------------------------------------------ ---------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2 7 0 +-------+ | |3 | | БАЙТ ПОРЯДКОВОГО +-------+ +-----------+ 4 | ВЕЛИЧИНА -------- 31 0 +------------------------+ | | |5 | | | ДВОЙНОЕ СЛОВО ЦЕЛОГО +------------------------+ -------- ВЕЛИЧИНА - 4 - L------- ЗНАК 6 7 0 +-------+ | |7 | | НЕУПАКОВАННОЕ L-------- ДЕСЯТИЧНОЕ 7 3 0 +-------+ | | |8 | | | УПАКОВАННОЕ L---+---- ДЕСЯТИЧНОЕ +------- ------------------------+ | | | | | | | 9 | | | | | | | СТРОКА БАЙТОВ +------- ------------------------+ 10 МЛАДШИЙ БАЙТ ------- 31 0 +-----------------------+ | | 11 | | ЛОКАЛЬНЫЙ УКАЗАТЕЛЬ +-----------------------+ 47 31 0 +--------------------------------+ | | | 12 | 13 | 14 | ГЛОБАЛЬНЫЙ УКАЗАТЕЛЬ +--------------------------------+ +--------------------------------+ СЕЛЕКТОР СМЕЩЕНИЕ 2.3.2 Типы данных математического сопроцессора Математический сопроцессор 80287 или 80387 добавляют к типам данных и командам процессора 80386 свои, приведенные в табл.2-2. В большинстве прикладных задач входные величины и получаемые результаты хранятся в виде типов целых, действительных или упакованных десятичных, а для промежуточных величин имеется тип данных промежуточное действительное, расширенный диапазон и точность которого в сложных вычислениях сводят к минимуму ошибки округления, переполнения и исчезновения порядка. В соответствии с такой моделью математический сопроцессор производит большую часть вычислений над промежуточными величинами, хранящимися в его регистрах. При загрузке любого типа данных в регистровый стек, этот тип автоматически меняется на промежуточный действительный. Промежуточная действительная величина в регистре, в свою очередь, может быть переведена в любой другой тип с помощью команды запоминания. На рис.2-8 Показано, как типы данных математического сопроцессора хранятся в памяти. Таблица 2-2 ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ МАТЕМАТИЧЕСКОГО СОПРОЦЕССОРА +------------------------------------------------------------------------+ | ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ | ЦЕЛОЕ | 16,32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ, | | | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ | +--------------+--------------+------------------------------------------| | УПАКОВАННОЕ | 18 ЦИФР | ЗАГРУЗКА, ЗАПОМИНАНИЕ | | ДЕСЯТИЧНОЕ | | | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ |ДЕЙСТВИТЕЛЬНОЕ| 32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ | | | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ | +--------------+--------------+------------------------------------------| |ПРОМЕЖУТОЧНОЕ | 80 БИТ | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, | |ДЕЙСТВИТЕЛЬНОЕ| | ИЗВЛЕЧЕНИЕ, КВАДРАТНОГО КОРНЯ, | | | | МАСШТАБИРОВАНИЕ ОСТАТКА, ВЫЧИСЛЕНИЕ | | | | ЧАСТИ ЦЕЛОГО, СМЕНА ЗНАКА, ВЫЧИСЛЕНИЕ | | | | АБСОЛЮТНОЙ ВЕЛИЧИНЫ, ВЫДЕЛЕНИЕ ПОРЯДКА | | | | И МАНТИССЫ, СРАВНЕНИЕ, ОСМОТР, ПРОВЕРКА, | | | | ОБМЕН, АРКТАНГЕНС, 2-1,Y*LOG(X+1), | | | | Y*LOG(X), ЗАГРУЗКА КОНСТАНТЫ (0.0, П, И | | | | Т.Д.) (80387 ДОБАВЛЯЕТ СИНУС, КОСИНУС, | | | | СИНУС И КОСИНУС, НЕУПОРЯДОЧЕННОЕ | | | | СРАВНЕНИЕ). | +------------------------------------------------------------------------+ +-------------------------------------------------------------------+ | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА - 1 | +-------------------------------------------------------------------+ --------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2 79 71 3 0 --------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ УПАКОВОЧНОЕ | | | | | | | | | | | | | | | | | | | ДЕСЯТИЧНОЕ +-----------------------------------------+ 5 | L-------- 4 ВЕЛИЧИНА ---------------- L------- ЗНАК - 3 31 23 0 +----------------------+ 7 | | | | НЕПОЛНОЕ | | | | ДЕЙСТВИТЕЛЬНОЕ +----------------------+ |L---T---L- ВЕЛИЧИНА -- | L-------- СМЕЩЕННЫЙ ПОРЯДОК 6 L------------- ЗНАК 60 51 0 +--------------------------------------------+ 8 | | | | ПОЛНОЕ | | | | ДЕЙСТВИТЕЛЬНОЕ +--------------------------------------------+ | +-------------+ +------- ВЕЛИЧИНА --------- | L------ СМЕЩЕННЫЙ ПОРЯДОК L--------------- ЗНАК 79 62 0 --T-----------T--T---------------------------+ ПРОМЕЖУТОЧНОЕ | | | | | ДЕЙСТВИЕ +--------------------------------------------+ 9 | L-----T------ L------ 4 ВЕЛИЧИНА --------- | L------------------ СМЕЩЕННЫЙ ПОРЯДОК L------- ЗНАК - 3 Рис.2-8.Примеры хранения типов данных математического сопроцессора 2.3.3 Другие команды Не все команды процессора 80386 связаны с типами данных. Такие команды рассматриваются в нижеследующих параграфах. 2.3.3.1Команды операций со стеком Стек процессора 80386 является стеком двойных слов, основание и вершина которого определяются регистрами, соответственно, SS и ESP. Команда PUSH заносит двойное слово в стек, а команда POP извлекает с вершины стека двойное слово и хранит его в регистре памяти или в памяти. По команде PUSH ALL в стек заносятся все общие регистры, а по команде POP ALL производится обратная операция. Команда INTER (входа в процедуру) и LEAVE (выхода из процедуры) предназначены для языков высокого уровня с блочной структурой. По команде ENTER создается кадр и образ стека, которые компиляторы используют для связки вызовов процедур. По команде LEAVE кадр стека и образ удаляются из стека для подготовки возврата к процедуре, сделавшей вызов. 2.3.3.2Команды передачи управления Команда JUMP (переход) передает управление другой команде путем замены содержимого счетчика команд. Новая команда может быть в том же кодовом сегменте (со смещение до 2 байт) или совсем в другом. Операндом внутрисегментного перехода является локальный указатель, т.е. смещение новой команды в текущем кодовом сегменте; переход таким образом, может быть сделан к любой ячейке в максимально возможном сегменте. Операндом межсегментного перехода является глобальный указатель, что позволяет передавать управление в любую точку сегмента. (Поле селектора в глобальном указателе замещает величину в регистре CS, а поле смещение - величину в EIP). В системе команд также имеется полный набор команд условных переходов, ветвление которых основано на величине флага статуса; эти команды могут передавать управление ячейкам, которые также смещены на максимум 2 байта. Вызов процедур и функций (подпрограмм) производится по командам CALL (вызов), а возврат к вызывавшей подпрограмме осуществляется с помощью команды RETURN (возврат). Так же, как команды перехода, вызовы внутри сегмента имеют своими операндами локальный указатель, задающий новую величину в счетчике команд, а вызовы между сегментами используют в качестве операндов глобальный указатель, который кроме CS изменяет и величину EIP. По командам вызова адрес следующей команды заносится в стек, после чего производится загрузка счетчика команд (и регистра CS, если переход делается в другой сегмент). По команде возврата сохраненные величины извлекаются из стека в EIP и, если требуется, в CS. Вызовы могут иметь бесконечную вложенность и рекурсивность, ограниченные лишь размером стека. Для управления циклами, помимо условных переходов, 80386 обеспечивает выполнение команд LOOP (безусловно и условного цикла). Команды цикла в качестве счетчика циклов используют регистр ECX; в каждом цикле ECX уменьшается на 1 и выполнение *., -$k заканчивается, когда величина в ECX становится равной нулю. Команды условных циклов заканчиваются в том случае, если флаг содержит заданную величину. В то время как команды цикла предназначены для проверок "в конце цикла", команда "переход", если ECX=0 реализует проверку в начале цикла и позволяет выполнять цикл 0 раз. 2.3.3.3Дополнительные команды Команда BOUND (проверка границ) 80386 может быть использована для проверки того, что индекс массива находится в его границах. Процессор 80386 имеет также команды установки и гашения флагов, загрузки и запоминания байта статуса регистра флагов. Математический сопроцессор 80287 или 80387 добавляет команды, необходимые операционной системе для его инициализации, обработки особых случаев, а также для запоминания и восстановления статуса сопроцессора. Наконец, естественно, процессоре 80386 имеет команду "нет операции". СИСТЕМНАЯ АРХИТЕКТУРА Назначение системной архитектуры заключается в обеспечении операционных систем, однако операционные системы весьма различны по своим требованиям. Для решения этой проблемы, процессор 80386 обеспечивает набор ресурсов, которые разработчики операционных систем могут использовать по своему усмотрению. В результате системная архитектура 80386 может быть сконфигурирована так, чтобы удовлетворить всем требованиям разрабатываемой операционной системы. 3.1Системные регистры Кроме регистров, рассмотренных в предыдущей главе, операционная система иногда использует регистры 80386, показанные на рис.3-1. (Далее в этой главе эти регистры еще будут рассматриваться; здесь они показаны для справки). В основном этими регистрами пользуется сам 80386; операционная система лишь инициализирует системные регистры и игнорирует их при нормальной работе. Однако, операционная система может воспользоваться системным регистром при обработке особого случая. Например, при страничной ошибке процессор загружает ошибочный адрес в регистр CR2; обработчик страничных ошибок операционной системы использует этот адрес для поиска соответствующего элемента страничной таблицы. Системные регистры обычно недопустимы прикладным программам, поскольку оперировать с ними могут только привилегированные команды. (Особые случаи, страничные ошибки и привилегированные команды рассматриваются далее в этой главе). 47 15 0 +-----------------------------+ | БАЗОВЫЙ АДРЕС | ПР. РАЗМЕР | ГЛОБАЛЬНАЯ ТАБЛИЦА +----------------+------------+ ДЕСКРИПТОРОВ | | | ТАБЛИЦА ДЕСКРИПТОРОВ +-----------+----------------+------------+ ПРЕРЫВАНИЙ | СЕЛЕКТОР | | | ЛОКАЛЬНАЯ ТАБЛИЦА L-----------+----------------+------------- ДЕСКРИПТОРОВ +-----------------------------------------+ СИСТЕМНЫЕ АДРЕСНЫЕ РЕГИСТРЫ 31 0 +-------------------------+ | | ВСПОМОГАТЕЛЬНЫЙ +-------------------------| | | РЕЗЕРВНЫЙ +-------------------------| | | ЛИНЕЙНЫЙ АДРЕС СТР. ОШИБКИ +-------------------------| | | БАЗОВЫЙ АДРЕС СПРАВОЧНИКА | | СТРАНИЦ +-------------------------+ СИСТЕМНЫЕ УПРАВЛЯЮЩИЕ РЕГИСТРЫ 3.2Обеспечение многозадачных операционных систем Многие свойства системной архитектуры 80386 непосредственно обеспечивают многозадачные операционные системы, хотя, конечно, 80386 может быть использован и в однозадачных системах с повышенными требованиями. Многозадачная работа представляет собой способ управления работой вычислительной системой в тех случаях, когда работа системы состоит из нескольких видов деятельности; тремя видами деятельности могут быть например, редактирование одного файла, компиляция другого и передача третьего файла в другую машину. В многозадачной системе каждый вид деятельности, который может осуществляться одновременно с другими, называется задачей. (В данном материале термин "задача " эквивалентен термину "процесс"). Каждая задача выполняет программу, состоящую из команд и исходных данных. Одна и та же программа может выполнятся несколькими задачами; например, в многозадачной системе с разделением времени несколько задач (по числу пользователей) могут использоваться одним и тем же компилятором или редактором. Программы и задачи соотносятся друг с другом подобно партитуре музыкального произведения и его исполнению: программа - это текст, описывающий алгоритм, а задача - это однократное исполнение этого алгоритма. Программы, выполняемые задачами. Составлены так, как если бы они выполнялись на отдельных процессорах с общей памятью, т.е. Используя паузы, необходимые для связи или синхронизации с другими задачами, теоретически каждая задача выполняется непрерывно параллельно с другими задачами. На самом деле , однако, задачи выполняются поочередно одним процессором. Многозадачная операционная система моделирует несколько процессоров, предоставляя каждой задаче "виртуальный процессор". В каждый момент времени операционная система передает реальный процессор одному из виртуальных процессоров, выполняющему свою задачу. Для поддерживания впечатления, что каждая задача имеет свой процессор, операционная система часто переключает реальный процессор на различные виртуальные процессоры. В системной архитектуре 80386 для операции смены задачи предусмотрены сегменты состояния задачи и команды, выполняющие эту операцию. 3.2.1 Сегмент состояния задачи Сегмент состояния задачи (TSS) является одной из нескольких структур данных, определяемых системной архитектурой 80386. Фактически, эти структуры данных являются "типами данных" для операционных систем. Сегмент TSS(см.Рис.3-2) Соответствует тому, что в некоторых операционных системах называется блоком управления задачей; в этом сегменте хранится состояние виртуального процессора задачи. Каждая задача 80386 представлена своим TSS, который делится на две части. Младшая часть TSS определена системной архитектурой 80386 и содержит значения регистров процессора. Старшая часть TSS может быть определена операционной a(ab%,.) для хранения данных, связанных с задачей, например, приоритета выполнения, дескрипторов файлов и т.д. Для создания своей задачи операционная система формирует TSS и инициализирует его величинами, необходимыми задаче для начала ее выполнения. В результате 80386 поддерживает младшую часть TSS, а за его старшую часть несет ответственность операционная система. +--------------------------------------+ | (ОПРЕДЕЛЕННАЯ ОПЕРАЦИОННАЯ СИСТЕМА) | . . +--------------------------------------| | АДРЕС ЛОКАЛЬНОЙ ТАБЛИЦЫ ДЕСКРИПТОРОВ | +--------------------------------------| | СПРАВОЧНЫЙ АДРЕС СТРАНИЧНОЙ ТАБЛИЦЫ | +--------------------------------------| | ОБЩИЕ РЕГИСТРЫ | . . +--------------------------------------| | РЕГИСТР ФЛАГОВ | +--------------------------------------| +--------------------------------------| | СЕГМЕНТНЫЕ РЕГИСТРЫ | . . +--------------------------------------| | ПРИВИЛЕГИРОВАННЫЕ | . . +--------------------------------------+ 3.2.2 Смена задачи Операционная система разрешает выполнение ??????? в соответствии с планом. Этот план устанавливает время выполнения задач. Поскольку методы планирования ???????? различные, 80386 предоставляет это операционной системе. ???? Когда операционная система решает начать выполнение ????? задачи, она направляет процессор на выполнение еще одного ?????, иногда называемого сменой контекста. Процессор 80386 хранит селектор и дескриптор ????? текущей задачи в своем регистре задачи ?????? операционная система выдает команду перехода ???????? является селектор сегмента TSS новой задачи ?????? эту команду, занося вначале свои регистры в текущий TSS, а затем загружая TR селектором (и связанным с ним дескриптором), указанным в команде. Получив адрес нового TSS, процессор загружает свои регистры величинами из нового TSS. После чего выполнение программы продолжается с команды, на которую указывает счетчик команд новой задачи. Для возобновления старой задачи операционная система должна выдать команду перехода и TSS старой задачи, после этого выполнение старой задачи продолжается с командой, следующей после команды перехода TSS, прекратившей ее выполнение. Такая смена задачи занимает 17 мкс (при рабочей частоте 16 Мгц и отсутствии состояний ожидания). 3.3Адресация Физическое адресное пространство большинства вычислительных машин организовано просто как массив байтов. С появления блоков управления памятью (БУП), архитектура машин стала различать физическое адресное пространство, реализуемое, аппаратурой памяти и логическое адресное пространство, видимое программистом. Блок управления памятью транслирует логические адреса программ в физические адреса, выдаваемые на системную магистраль. В большинстве архитектур логическое адресное пространство задачи представляется как набор следующих вариантов: Логическое адресное пространство состоит из массива байтов, не имеющего определенной БАЙТЫ структуры (такое адресное пространство иногда называется "плоским" или "линейным"). Трансляция адреса в этом случае не требуется, поскольку логический адрес точно эквивалентен физическому. Логическое адресное пространство состоит из нескольких или большого числа сегментов, СЕГМЕНТ каждый из которых содержит переменное число байтов. Логический адрес разделен на две части, номера сегмента и смещения внутри сегмента. Буп производит трансляцию логического адреса в физический. Логическое адресное пространство состоит из большого числа страниц, каждая из которых СТРАНИЦЫ включает в себя фиксированное число байтов. Логический адрес состоит из номера страницы и смещения внутри страницы. Буп производит трансляцию логического адреса в физический. СТРАНИЧНЫЕ Логическое адресное пространство состоит из сегментов Сегменты в свою очередь, состоят из страниц. СЕГМЕНТЫ Логический адрес состоит из номера сегмента и смещения внутри сегмента. Буп производит трансляцию логического адреса в номер страницы и смещение в ней, которые затем транслируются в физический адрес. Каждый из этих вариантов хорошо подходит для одних систем и мало пригоден для других. Например, линейное пространство вполне подходит для систем с простыми ветвлениями, в то время как для систем, которые выполняют индивидуальное управление и защиту отдельных программных структур, больше подходит вариант с сегментацией памяти. В 80386 реализован вариант, представляющий память как набор сегментов, которые по желанию могут быть разделены на страницы. На практике архитектура 80386 обеспечивает операционные системы любым из четырех вариантов представления памяти. 3.3.1 Принцип трансляции адреса Принцип трансляции логического адреса в физический в процессоре 80386 иллюстрируется на рис.3-3. Последовательность операций, показанная на рис.3-3, является центральной как для адресации, так и для защиты. Здесь она рассматривается в схематичной форме с целью дать ясное общее представление о ней прежде, чем перейти к рассмотрению таких свойств, как виртуальная память и защита. В последующих разделах будут подробно рассмотрены различные этапы трансляции адреса и будет показано, как они могут быть приспособлены под требования конкретной системы. Как показано в предыдущей главе, способы адресации памяти 80386 дают 32-битное смещение искомого операнда. Совместно с селектором сегмента это смещение образует составной логический адрес: селектор этого адреса идентифицирует искомый сегмент, а смещение указывает на операнд в сегменте. В большинстве команд селектор задается неявно как содержимое сегментного регистра. +--------------+ | ТАБЛИЦЫ | | ДЕСКРИПТОРОВ | +--------------+ ЛОГИЧЕСКИЙ АДРЕС ---------+-+ ЛИНЕЙНЫЙ АДРЕС +-----------------+ | | +--------+ +--+ |СЕЛЕКТОР|СМЕЩЕНИЕ+->|ТРАНСЛЯЦИЯ+--->| +--+ +----T-+ L--------+--------- | СЕГМЕНТА | L--------- L--- | | 47 31 0 L----------- 31 0 ЗАПРЕТ | | СТРАНИЦ | | +-------------------------------------------+ | | +--------------+ | +-----------+ | 31 0 | | ТАБЛИЦЫ | |--------------------+ | | СТРАНИЦ | +--+ ФИЗИЧЕСКИЙ АДРЕС| | +-----------+ |-+------------------+ | |+--------------------------+ 31 | 0 | 31 0 | +----------------+ +---------------------++------------------+| | ЛИНЕЙНЫЙ АДРЕС +-->| ТРАНСЛЯЦИЯ СТРАНИЦЫ +-->|ФИЗИЧЕСКИЙ АДРЕС+-- +----------------+ +---------------------++------------------+ Селектор представляет собой индекс в таблице дескрипторов сегментов, т.е. это поле содержит номер сегмента. Каждый элемент таблицы дескрипторов сегментов содержит базовый адрес сегмента. Процессор добавляет к нему смещение и получает 32-битный линейный адрес. Если страницы не разрешены, процессор считает, что линейный адрес является физическим, и выдает его на адресные выводы. Если страницы разрешены, то 80386 транслирует линейный адрес в физический. Это делается с помощью страничных таблиц. Страничная таблица по своей организации аналогична таблице дескрипторов, за исключением того, что каждый элемент страничной таблицы содержит физический базовый адрес страницы 4кбайт. Поскольку способы адресации 80386 охватывают как традиционные элементы структурного деления адресного пространства (сегменты, и дополнительно, страницы) и поскольку сегменты могут быть очень большими (до 4 Гбайт), то эти способы адресации оказываются очень гибкими. Таким образом, операционная система может дать задаче одно линейное адресное пространство, линейное адресное пространство из страниц, адресное пространство из сегментов или сегментированное адресное пространство со страничным делением. По всей своей гибкости многоступенчатая трансляция адреса в 80386 выполняется достаточно быстро. Типичное время вычисления смещения и трансляции логического адреса в физический составляет 1,5 такта. Более того, время трансляции адреса незаметно для программы, поскольку внутренний БУП 80386 транслирует адрес параллельно с другими операциями процессора (кроме случаев, когда команды перехода или вызова временно прерывают совмещенное выполнение операций). 3.3.2 Сегменты Сегмент является единицей логического пространства, представляемого процессором задаче, т.е. логическое адресное пространство задачи состоит из одного или нескольких сегментов. Операционные системы существенно отличаются друг от друга по способу определения логического адресного пространства задачи. Например, система реального времени с ветвлениями может определить логическое адресное пространство как единое целое, совместно используемое всеми задачами и самой операционной системой, другими словами один сегмент коллективно используется всей системой. В другом крайнем случае система может распределить каждую структуру данных и процедуру по своим сегментам, в следствии чего логическое адресное пространство задачи предстанет в виде десятков или сотен адресных пространств, каждое из которых будет соответствовать своей структуре данных или процедуре. Между этими крайними случаями оказывается универсальная система с разделением времени, в которой задачи выполняются в отдельных логических адресных пространствах, и в которых программы задач отделены от их данных, а прикладные программы и данные отделены от программы и данных операционной системы. Свойство сегментации в процессоре 80386 достаточно гибкое, и может обеспечить каждый из этих примеров, как и любые другие. Как уже было показано в главе 2, команда 80386 ссылается на операнд в памяти с помощью составного логического адреса, a.ab.oi%#. из селектора сегмента и смещения внутри сегмента. В принципе 80386 транслирует логический адрес в линейный с помощью селектора, указывающего на дескриптор сегмента в таблице дескрипторов. Дескриптор содержит базовый адрес сегмента в линейном адресном пространстве, добавление смещения к базовому адресу дает линейный адрес операнда. На практике трансляция логического адреса в линейный оптимизирована с помощью неявного указания на селекторы и хранения дескрипторов в регистрах. Поэтому обращение к таблице дескрипторов производится только для тех команд, которые загружают новые селекторы в сегментные регистры (например, вызов процедуры из другого сегмента приводит к замене селектора в регистре CS). Хотя на практике это бывает редко, тем не менее удобнее представлять трансляцию процессором логического адреса как обращение к дескрипторам в таблицах дескрипторов сегментов, поскольку отсюда следует, что именно дескрипторы в таблицах дескрипторов сегментов задачи определяют логическое адресное пространство задачи. Без дескриптора задача не в состоянии сгенерировать линейные адреса. Таблица дескрипторов сегментов представляет собой массив дескрипторов, на рис.3-4 дан логический формат дескриптора. Поле базового адреса уже рассматривалось выше. Поле предельного размера определяет длину сегмента, 80386 использует поле предельного размера для проверки правильности величины смещения в логическом адресе, а именно, что оно попадает внутрь сегмента. Атрибуты сегмента, в основном, относятся к защите и будут рассмотрены далее в этой главе. АТРИБУТЫ ПРИЗНАК ПОСЛЕДНЕГО ОБРАЩЕНИЯ ---------------------+ ПРАВА -----------------------------------------+ | ТИП ----------------------------------------+ | | ПРИВИЛЕГИЯ ------------------------------+ | | | ПРИЗНАК ПРИСУТСТВИЯ ------------------+ | | | | | | | | | +--------------+ | | | | | | +------------------------------| | ПРЕДЕЛЬНЫЙ РАЗМЕР | +------------------------------| | БАЗОВЫЙ АДРЕС | +------------------------------+ Каждая задача может иметь системное и индивидуальное логическое адресное пространство. Эти пространства описываются, соответственно глобальной таблицей дескрипторов (GDT) и локальной таблицей дескрипторов (LTD). (В селекторе имеется бит, связывающий его с той или иной таблицей). Эти таблицы дескрипторов могут содержать максимум 8192 дескриптора и совместно они определяют логическое адресное пространство задачи. Это означает, что для того, чтобы новый сегмент мог адресоваться задачей, операционная система должна внести новый дескриптор этого сегмента либо в GDT, либо в LDT задачи. В системах с защитой GDT и LDT могут быть сделаны привилегированными структурами так, что изменения в них сможет производить только операционная система. Операционная система из ее названия, глобальная таблица дескрипторов доступна всем задачам, обычно операционные системы заносят дескрипторы системных сегментов в GDT. Кодовый сегмент (или сегменты) операционной системы является хорошим примером сегмента, который должен быть доступным всем задачам, и дескриптор которого обычно находится в GDT. В противоположность этому каждая ' $ g может иметь свою локальную таблицу дескрипторов. Процессор поддерживает адрес LDT текущей задачи в своем регистре локальной таблицы дескрипторов (LDTR), однако он перезагружает этот регистр (так же, как он перезагружает свои общие и сегментный регистры) новым значением TSS при смене задач. Задачи могут делить одни сегменты в следующих случаях (см. рис.3-5): 1. Сегмент, дескриптор которого находится в GDT, является общим для всех задач. 2. Задачи, имеющие общую LDT, имеют и общие сегменты, описываемые этой LDT, такой подход допустим в случае тесно взаимодействующих задач. 3. Дескрипторы в различных LDT могут указывать на один и тот же сегмент, такие дескрипторы называются псевдоименами. Использование псевдоимени позволяет задачам иметь общим только один сегмент, а не все сегменты, определенные таблицей дескрипторов. 3.3.3 Страницы Независимо от того, содержит ли логическое адресное пространство задачи один или много сегментов, операционная система может разделить линейное адресное пространство на страницы. С точки зрения операционной системы страницы являются удобными элементами для распределения и перераспределения памяти, поскольку они все имеют одинаковый размер. Страницы также являются средством защиты частей больших сегментов и, что особенно важно, обеспечивают удобный способ организации виртуальной памяти. Указанные применения страничной организации памяти обсуждаются ниже. Страница в 80386 имеет длину 4к байт. Этот размер находится в согласии с промышленной тенденцией к увеличению длины страниц и ведет к увеличению производительности по двум направлениям. Во-первых, он обеспечивает хорошее отношение показаний страниц в кэш при данном объеме кэш-памяти, которая может быть в настоящее время реально размещена на кристалле, исходя из достигнутого уровня технологии. (Кэш-память 80386, расположенная на кристалле, описывается кратко). Во-вторых, 4к байтов являются эффективным размером блока для дисковых передач. Большинство операционных систем, работающих на машинах с меньшей длиной страницы, должны группировать страницы в "кластеры", чтобы сократить количество дисковых передач. Операционная система 80386 включает страничный механизм, устанавливая бит PG в управляющем регистре 0 при помощи привилегированной команды. Когда страничный механизм включен, процессор транслирует линейный адрес в физический адрес, используя страничные таблицы. Страничные таблицы являются частью таблиц дескрипторов сегментов. Так же как таблицы дескрипторов сегментов задачи определяют ее логическое адресное пространство, страничные таблицы задачи определяют ее линейное адресное пространство. Аналогично супермини-ЭВМ и большим ЭВМ страничные таблицы 80386 организованы по принципу двухуровневой иерархии, как показано на рис.3-6. Каждая задача может иметь справочник системных таблиц. Системный регистр CR3 процессора 80386 (база справочника системных таблиц) указывает на справочник страничных таблиц работающей задачи. Процессор обновляет регистр CR3 при каждом переключении задачи, получая новый адрес задачи из TSS новой задачи. Справочник страничных таблиц имеет длину, равную одной странице и содержит элементы ab` -(g-.) таблицы описывают 1024 страницы. Таким образом, каждая страничная таблица описывает 4м байта, а оглавление может описать до 4г байт - максимальное адресное пространство. На рис.3-6 в функциональных обозначениях показано как 80386 транслирует линейный адрес в физический адрес, если страничная адресация включена. Процессор использует старшие 10 бит линейного адреса как индекс в оглавлении. Выбранный элемент оглавления содержит адрес страничной таблицы. Процессор добавляет средние 10 бит линейного адреса к адресу страничной таблицы, чтобы найти элемент страничной таблицы, который описывает необходимую страницу. Добавляя младшие 12 бит линейного адреса к адресу начала страницы, процессор получает 32-битный физический адрес. Для того, чтобы сократить накладные расходы, возникшие от поиска в страничных таблицах, 80386 помещает справочную информацию о 32-х последних страницах, использовавшихся им, в специальную быструю память (кэш), находящуюся внутри самого микропроцессора. Эта память называется перекодированным буфером просмотра исключений (TLB). Только в том случае, если процессор не находит справочной информации для страницы в TLB, он обращается к справочникам и страничным таблицам, находящимся в памяти. Как правило, 98-99% адресных ссылок попадают в TLB, не требуя обращений к основной п