Глава 20. Особенности архитектуры IA-32/64
20.1. Типы и форматы данных
Предусмотрены все традиционные типы и форматы данных.
20.2. Организация регистров
Регистры делятся на следующие группы:
регистры общего назначения;
регистры сегментов;
регистр признаков (флагов);
регистр номера команды (программный счетчик или указатель команд);
управляющие регистры;
регистры системных адресов;
регистры отладки и тестирования;
регистры математического сопроцессора X87, выполняющего скалярные операции с плавающей точкой;
векторные регистры.
Регистры данных с фиксированной точкой
Регистры общего назначения. Имеется 16 скалярных 64-разрядных регистров общего назначения R0 – R15 (рис. 20.1).
-
Скалярные регистры общего
назначения
назначения
63 0 0 0
R0
R1
R2
R3
R4
R5
R6
R6
R7
R7
R8
R9
R10
R11
R12
R13
R14
R15
Рис. 20.1
8 первых регистров выполняют те же функции, что и в архитектуре IA-32. Четыре из них (RАХ, RВХ, RСХ, RDX) используются для временного хранения операндов арифметических, логических и других команд. Следующие четыре регистра общего назначения — RSI, RDI, RBP и RSP — предназначены для задания смещения адреса относительно начала некоторого сегмента данных. Эти регистры используются совместно с регистрами сегментов для задания виртуального адреса, который затем с помощью таблиц страниц отображается на физический адрес.
Регистры R8 – R15 универсальные регистры для хранения данных.
Адресное пространство 264 байт может быть непрерывным (плоским) или сегментированным.
Структура одного регистра общего назначения в архитектуре IA-32/64 приведена на рис. 20.2.
-
63 32
31 16
15 8
7 0
RAX
EAX
AH
AL
Рис. 20.2. Структура одного регистра общего назначения
Сегментные регистры. Имеется 6 16-ти разрядных сегментных регистра - CS, SS, DS, ES, FS и GS. Регистры сегментов ссылаются на дескрипторы сегментов оперативной памяти — описатели, в которых содержатся такие параметры сегментов, как базовый адрес, размер сегмента, атрибуты защиты и некоторые другие. Регистры сегментов хранят 16-разрядное число, называемое селектором, в котором;
12 старших разрядов представляют собой индекс в таблице дескрипторов сегментов;
1 разряд указывает, в какой из двух таблиц, GDT или LDT, находится дескриптор;
три разряда поля RPL хранят значение уровня привилегий объектов данного сегмента.
Регистры предназначены для хранения:
регистр CS (Code Segment) — индекса дескриптора программного сегмента;
регистр SS (Stack Segment) — дескриптора сегмента стека;
регистры DS, ES, FS и GS — для указания на дескрипторы сегментов данных.
Все регистры сегментов, кроме регистра CS, программно доступны, то есть, в них можно загрузить новое значение селектора соответствующей командой (например, LDS). Значение регистра CS изменяется при выполнении команд межсегментных вызовов CALL и переходов JMP, а также при переключении задач.
Регистр признаков (RFLAGS) – 64-х разрядный. Содержит признаки, характеризующие результат выполнения операции, например признак (флаг) знака, флаг нуля, флаг переполнения, флаг паритета, флаг переноса и некоторые другие. Кроме того, здесь хранятся некоторые признаки, устанавливаемые и анализируемые механизмом прерываний, в частности флаг разрешения аппаратных прерываний IF.
Регистр номера команды (RIP) - 64-х разрядный. Содержит смещение адреса текущей команды, которое используется совместно с регистром CS для получения соответствующего виртуального адреса.
Адресное пространство 264 байт может быть непрерывным (плоским) или сегментированным.
Регистр номера команды – 64-х разрядный (рис. 20.3).
-
0 31
32 63
РНК64 (RIP)
РНК32 (EIP)
Рис. 20.3
Управляющие регистры
Имеется пять управляющих регистров — CRO, CR1, CR2, CR3 и CR4, которые хранят признаки и данные, характеризующие общее состояния процессора.
Регистр CR0 содержит все основные признаки, существенно влияющие на работу процессора, такие как реальный/защищенный режим работы, включение/ выключение страничного механизма системы виртуальной памяти, а также признаки, влияющие на работу кэш-памяти и выполнение команд с плавающей точкой. Младшие два байта регистра CRO имеют название Mashine State Word, MSW — «слово состояния машины».
Регистр CR1 в настоящее время не используется (зарезервирован).
Регистры CR2 и CR3 предназначены для поддержки работы системы виртуальной памяти.
Регистр CR2 содержит линейный виртуальный адрес, который вызвал так называемый страничный отказ (отсутствие страницы в оперативной памяти или отказ из-за нарушения прав доступа).
Регистр CR3 содержит физический адрес таблицы разделов, используемой страничным механизмом процессора.
В регистре CR4 хранятся признаки, разрешающие работу так называемых архитектурных расширений, например возможности использования страниц размером 4 Мбайт и т. п.
Регистры системных адресов
Регистры системных адресов содержат адреса важных системных таблиц и структур, используемых при управлении процессами и оперативной памятью.
Регистр GDTR (Global Descriptor Table Register) содержит физический адрес глобальной таблицы дескрипторов GDT сегментов оперативной памяти, образующих общую часть виртуального адресного пространства всех процессов.
Регистр IDTR (Interrupt Descriptor Table Register) хранит физический адрес таблицы дескрипторов прерываний IDT, используемой для вызова процедур обработки прерываний в защищенном режиме работы процессора.
Кроме этих адресов в регистрах GDTR и IDTR хранятся 16-разрядные значения, задающие ограничения на размер соответствующих таблиц. Два 16-разрядных регистра хранят не физические адреса системных структур, а значения индексов дескрипторов этих структур в таблице GDT, что позволяет косвенно получить соответствующие физические адреса.
Регистр TR (Task Register) содержит индекс дескриптора сегмента состояния задачи TSS. Регистр LDTR (Local Descriptor Table Register) содержит индекс дескриптора сегмента локальной таблицы дескрипторов LDT сегментов оперативной памяти, образующих индивидуальную часть виртуального адресного пространства процесса.
Регистры отладки хранят значения точек останова, а регистры тестирования позволяют проверить корректность работы внутренних блоков процессора.
Регистры математического сопроцессора X87 и MMX
Регистры данных. Имеется 8 80-ти разрядных регистра STi. Регистры MMXi располагаются на месте регистров STi (рис. 20.4).
-
Скалярные регистры математического сопроцессора X87
сопро
79 0 79
ST0 (MMX0)
ST1 (MMX1)
ST2 (MMX2)
ST3 (MMX3)
ST4 (MMX4)
ST5 (MMX5)
ST6 (MMX6)
ST6
X877
ST7 (MMX7)
Рис. 20.4
Управляющий регистр -16-разрядный.
Регистр состояния -16-разрядный.
Регистр тэга – 16-разрядный.
Регистр кода операции – 11-разрядный.
Регистр адреса команды с плавающей точкой – 1 48-разрядный.
Регистр адреса операнда с плавающей точкой – 1 48-разрядный.
Универсальные векторные регистры
Регистры YMM (YMM0 – YMM15) - 16 256-разрядных.
Регистр состояния MXCSR – 1 32-разрядный.
Регистры XMM (XMM0 – XMM15) - 16 128-разрядных. Являются подмножеством регистров YMM и занимают младшие 128 разрядов.
В одном универсальном векторном регистре YMM может быть:
8 32-х разрядных данных с фиксированной или плавающей точкой;
4 64-х разрядных данных с фиксированной или плавающей точкой.
В одном универсальном векторном регистре XMM может быть:
4 32-х разрядных данных с фиксированной или плавающей точкой;
2 64-х разрядных данных с фиксированной или плавающей точкой.
20.3. Защита по привилегиям
20.1. Организация защиты по привилегиям
Основними системними объектами, которыми оперируют ядра процессоров с архитектурой IA-32/64, являются сегменты оперативной памяти. Поэтому не удивительно, что привилегии назначают сегментам. Каждому сегменту команд, данных или стека назначается определенный уровень привилегии. Всё, что находится внутри этого сегмента, имеет этот уровень привилегий. Другими словами, уровень привилегий относительно содержимого сегмента следует считать глобальным. Например, нельзя определить сегмент данных с двадцатью переменными так, чтобы половина из них была более привилегированной, чем другие.
В каждом дескрипторе сегмента имеется поле уровня привилегий дескриптора – DPL (Descriptor Privilege Level), которое определяет, каким программам разрешается доступ к объекту, описываемому дескриптором.
Если дескриптор описывает сегмент данных, то все данные внутри сегмента имеют уровень привилегий, содержащийся в поле DPL дескриптора. В случае сегментов команд все команды в сегменте также находится на уровне привилегий, определяемом полем DPL.
Уровень привилегий выполняющейся программы называется текущим уровнем привилегий CPL (Current Privilege Level или Code Privilege Level). Он задаётся полем RPL селектора в регистре CS. При передаче управления сегменту команд с другим уровнем привилегий процессор будет работать на новом уровне привилегий. Значение CPL при желании можно считать уровнем привилегий процессора.
При выполнении почти каждой машинной команды осуществляется проверка защиты по привилегиям. Процессор в защищенном режиме постоянно проверяет, достаточен ли уровень привилегии текущей программы для того, чтобы:
выполнять некоторые команды;
обращаться к данным других программ;
передавать управление внешней (по отношению к самой программе) программе командами передачи управления типа FAR.
Эти три ограничения образуют основу тех средств, которые процессор предоставляет в распоряжение разработчиков защищённых систем.
Пример количества и назначения уровней привилегий (колец защиты) в архитектуре IA-32/64 приведен на рис. 20.5.
Прикладные
Наименее привилегированный
уровень
(пользовательские)
программы 3
Системы
Операционная
система
Наиболее
привилегированный
уровень - гипервизор
Ядро операционной
системы
Рис. 20.5. Уровни привилегий или кольца защиты в архитектуре IA-32/64
Операционная система не обязательно должна поддерживать все уровни привилегий. Простую незащищенную систему можно целиком реализовать с одним уровнем привилегий. Традиционные системы супервизор/пользователь работают с двумя уровнями привилегий (кольцами): супервизору (т.е. операционной системе) назначается высший уровень привилегий, а пользователям – низший.
