Структура процессора семейства IA-32 очень сложна, поскольку в них аппаратно реализована совокупность параллельных конвейеров (конвейерная и суперскалярная архитектура). На рисунке 7 процессор IA-32 представлен в виде набора основных блоков.
Блок интерфейса с магистралью управляет передачей команд и данных из памяти в процессор и результатов – обратно в оперативную память. Блок предвыборки команд отвечает за чтение последующих команд из сегмента кодов. Блок декодирования команд осуществляет расшифровку команды и формирование последовательности управляющих сигналов для ее выполнения (аналог УУ). Исполнительный блок согласно названию выполняет команду (аналог АЛУ).
Рисунок 7 – Структура процессора семейства IA-32
Блоки управления сегментами и страницами обеспечивают формирование физического адреса следующих команд и необходимых данных. При этом ограничение на нахождение не более одного операнда в оперативной памяти сохраняется.
Регистры общего назначения.Большинство регистров процессоров семейства IA‑32 – 32-х разрядные. Они включают 16-ти разрядные регистры адресов и данных, имевшиеся в прародителе i8086, как младшую часть (см. рисунок 8), и обеспечивают доступ к ним по указанным именам.
31 15 0 15 0
AH A
X AL
EAX
BH B
X BL
EBX
CH C
X CL
ECX
DH D
X DL
EDX
SI
ESI
DI
EDI
BP
EBP
SP
ESP
IP
EIP
FLAGS
EFLAGS
CS
DS
ES
SS
GS
FS
Рисунок 8 – Регистры адресов и данных и сегментные регистры IA-32
Сегментные регистры остались 16-ти разрядными, но их количество увеличилось до 6. Добавленные регистры позволяют адресовать еще два сегмента данных. В защищенном режиме IA-32 сегментные регистры хранят не адрес сегмента, а номер (индекс) специального дескриптора, который содержит базовый адрес сегмента, его размер и атрибуты (см. далее).
Кроме того было добавлено еще несколько специализированных регистров, используемых в защищенном режиме:
Режимы адресации.Процессоры IA-32 поддерживают три режима адресации:
1) реальный – в этом режиме адрес формируется аналогично i8086, т.е. при формировании адреса используются 16-ти разрядные смещения и 16-ти разрядные сегментные адреса, которые хранятся в сегментных регистрах. При их сложении по приведенной выше схеме получаются 20-ти разрядные физические адреса, поэтому в этом режиме доступен только первый мегабайт оперативной памяти;
2) защищенный – в этом режиме используется 32-х разрядная адресация, предусматривающая несколько вариантов защиты, откуда и появилось название этого режима;
3) виртуальный – в этом режиме процессор моделирует псевдоодновременную работу нескольких виртуальных процессоров i8086. В настоящее время режим устарел и практически не используется.
Схема 32-х разрядной адресации защищенного режима.Требование сохранить возможность выполнения программ, использующих 16-ти разрядную адресацию, привело к тому, что схема 32-х разрядной адресации является многокомпонентной (см. рисунок 9).
Рисунок 9 – Схема 32-х разрядной адресации в защищенном режиме
В этом режиме по-прежнему используется сегментная организация памяти, но размер сегмента уже не ограничивается 64 Кб, а теоретически может достигать 4 Гб. 32-х разрядный адрес базы сегмента хранится не в виде сегментного адреса в сегментном регистре, как при 16-ти разрядной адресации, а полностью в специальных внутренних регистрах процессора – дескрипторах. Номер дескриптора заносится в 14 бит сегментного регистра, который в этом режиме называется селектором. Один бит селектора из этих 14-ти отвечает за выбор таблицы локальных или глобальных дескрипторов.
Таблица локальных дескрипторов содержит дескрипторы сегментов приложения, а таблица глобальных – дескрипторы сегментов программ операционной системы. Оставшиеся два бита селектора содержат код уровня привилегий сегмента, который проверяется при обращениях из других программ. Таким образом, реализуется защита сегментов.
14 бит селектора и 32 бита эффективного или исполнительного адреса, формируемого на основе машинной команды, объединяются в 46-ти разрядный виртуальный адрес.
Сумма 32-х разрядного базового адреса сегмента и 32-х разрядного эффективного адреса образует 32-х разрядный линейный адрес. Физический же адрес определяется по таблице страниц на основе линейного.
Соответственно различают несколько адресных пространств: виртуальное – 64 Тб; линейное – 4 Гб; физическое – 4 Гб.
При создании приложений Windows в основном используется модель памяти Flat«плоская». Эта модель подразумевает, что каждому приложению отводится линейное адресное пространство объемом 2 Гб, а остальные 2 Гб предоставляются операционной системе. Базовый адрес в дескрипторах всех сегментов приложения устанавливается равным 0. В результате все сегменты приложения «перекрываются». Программа, данные и стек размещаются в разных местах памяти за счет различных смещений. Разделение памяти между приложениями осуществляется операционной системой, которая размещает страницы приложений с одинаковыми линейными адресами в разных местах оперативной памяти. Следовательно и защита сегментов при этой модели не работает.
Форматы машинных команд.Размер машинной команды процессора IA-32 колеблется от 1 до 15 байт. Структура команды представлена на рисунке 10. Помимо обязательного кода операции (КОП), иногда состоящего из двух частей, команда может включать от 0 до 4 однобайтовых префиксов, а также возможно байты адресации, непосредственного смещения (смещение, указанное в команде) и непосредственного операнда.
Префикс повторения – используется только для команд обработки строк и будет рассмотрен далее.
Префикс размера адреса (67h) – применяется для изменения размера смещения, например, если необходимо использовать смещение размером 16 бит при 32-х разрядной адресации.
Префикс размера операнда (66h) – указывается, есливместо 32-х разрядного регистра для хранения операнда используется 16-ти разрядный.
Префикс замены сегмента– используется при адресации данных любым сегментным регистром кроме DS.
Рисунок 10 – Структура машинной команды IA-32
На рисунке 10 использованы следующие обозначения:
d – бит направления обработки, например, пересылки данных: 1 – в регистр, 0 – из регистра; используется в арифметических командах и командах пересылки, если хотя бы один операнд находится в регистре;
w – размер операнда: 1 – операнды – двойные слова, 0 – операнды – байты;
mod – режим: 00 – Disp=0 – смещение в команде отсутствует (0 байт);
01 – Disp=1 – непосредственное смещение размером 1 байт;
10 – Disp=2 – непосредственное смещение размером 2 байта;
11 – оба операнда находятся в регистрах.
Регистры кодируются в зависимости от размера операнда (w):