- •6. Модель прикладного выполнения в системной среде Intel® Itanium™
- •6.1. Режимы набора инструкций
- •6.1.1. Выполнение набора инструкций в среде Intel Itanium.
- •6.1.2. Выполнение набора инструкций ia-32
- •6.1.3. Переключения наборов инструкций
- •6.1.3.1. Инструкция jmpe
- •6.1.3.2. Инструкция перехода к ia
- •6.1.4. Переключения режимов работы ia-32
- •6.2. Модель состояния прикладных регистров ia-32
- •6.2.1. Регистры общего назначения ia-32
- •6.2.2. Указатель инструкций ia-32
- •6.2.3. Сегментные регистры ia-32
- •6.2.3.1. Сегменты данных и кода
- •6.2.3.2. Сегментный дескриптор и целостность среды
- •6.2.3.2.1. Защищенный режим.
- •6.2.3.2.2 Режим vm86
- •6.2.3.2.2 Реальный режим
- •6.2.3.3. Проверки целостности среды ia-32 во время выполнения
- •6.2.4. Прикладной ia-32 регистр eflag
- •6.2.5.2. Специальные случаи
- •6.2.5.3. Регистры управления с плавающей точкой ia-32.
- •6.3. Обзор моделей памяти
- •6.3.1. Упорядочивание памяти
- •6.3.2. Сегментация ia-32
- •6.3.3. Самомодифицирующийся код
- •6.3.4. Взаимодействия упорядочивания памяти.
- •6.4. Использование кодом ia-32, регистров Itanium
- •6.4.1. Механизм стека регистров
- •6.4.3. Влияние NaT/NaTVal на инструкции ia-32
6.2.1. Регистры общего назначения ia-32
Целочисленные регистры размещены в младших 32 битах основных Itanium регистров от GR8 до GR15. Значения старших 32 битов игнорируются при переходе к выполнению инструкций IA-32. После завершения выполнения набора инструкций IA-32, в каждом из регистров GR8-GR15, на старшие 32 бита расширяется знаковый бит 31.
Соглашения вызова IA-32 и Itanium требуют, чтобы до входа в набор инструкций IA-32, код типа Itanium загрузил состояние IA-32 в память и регистры.
63 |
32 |
31 |
0 |
расширено знаком |
EAX … EDI{31:0} |
||
Рис. 6.4. Основные регистры IA-32 (от GR8 до GR15)
6.2.2. Указатель инструкций ia-32
Процессор поддерживает два указателя инструкций для ссылок на набор инструкций IA-32, EIP (32-битный эффективный адрес) и IP (64-битный адрес эквивалентный IP набора инструкций Itanium). IP генерируется путем сложения базы кодового сегмента и EIP, а затем расширяется нулем до 64 бит. Не следует путать IP с 16-разрядным эффективным указателем адреса инструкций для 8086. EIP – это смещение в текущем кодовом сегменте, в то время как, IP – это 64-битный виртуальный указатель, общий с набором инструкций Itanium.
При выполнении инструкций IA-32, определены следующие отношения между EIP и IP.
IP{61:32} = 0;
IP{31:0} = EIP{31:0} + CSD.Base;
Значение EIP прибавляется к базе кодового сегмента и расширяется нулями до 64-битного виртуального адреса при каждой выборке инструкции IA-32. Если в процессе выборки, EIP превысит границу кодового сегмента, то на указываемой инструкции вызывается ошибка GP. Эффективные адреса инструкций (как последовательные значения, так и адресаты переходов) превышающие 4GB, усекаются до 32-бит, т.е. в результате получается циклическая 4G-байтовая адресация.
6.2.3. Сегментные регистры ia-32
Селекторы и дескрипторы сегментов IA-32 размещены в регистрах GR16-GR29 и AR25-AR26. Дескрипторы поддерживаются в расшифрованном (unscrambled) формате и показаны на рис.6.6. Этот формат отличается от IA-32 формата шифрования памяти дескриптора. Расшифрованный формат регистра спроектирован для поддержания быстрого преобразования 16/32-битных сегментных указателей IA-32 в виртуальные адреса для кода типа Itanium. Инструкции, загружающие сегментный регистр IA-32, расшифровывают формат памяти GDT/LDT в регистровый формат дескриптора при загрузке сегментного регистра. Также, программы типа Itanium могут напрямую загружать дескрипторные регистры, если они правильно расшифровываются программой. Когда программы типа Itanium загружают эти регистры, то в это время, не выполняются никакие проверки целостности данных, даже если в любых полях были загружены незаконные значения. Для полного определения всех битовых полей семантик полей обратитесь к Intel Architecture Software Developer’s Manual.
63 |
48 |
47 |
32 |
31 |
16 |
15 |
0 |
|
GS |
FS |
ES |
DS |
GR16 |
||||
TSS |
LDT |
SS |
CS |
GR17 |
||||
Рис. 6.5. Формат селекторов сегментных регистров IA-32
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
52 |
51 |
32 |
31 |
0 |
g |
d/b |
ig |
av |
p |
dpl |
s |
type |
limit{19:0} |
base{31:0} |
||||
Рис. 6.6. Формат дескриптора регистра сегмента кода/данных IA-32
Табл. 6.2. Поля сегментного регистра IA-32
Поле |
Биты |
Описание |
selector |
15:0 |
Значение селектора сегмента (биты поля, описаны в Intel Architecture Software Developer’s Manual) |
base |
31:0 |
Значение базы сегмента. Это значение расширяется нулями до 64 бит, точка начала сегмента в 64-битном виртуальном адресном пространстве для обращений к памяти набора инструкций IA-32 |
limit |
51:32 |
Граница сегмента. Содержит максимальное значение эффективного адреса для расширяющихся вверх сегментов для обращений к памяти набора инструкций IA-32. Для сегментов расширяющихся вниз, это поле содержит минимальный эффективный адрес в сегменте. Детали условия нарушения границы сегмента см. в Intel Architecture Software Developer’s Manual. Если g-бит сегмента равен 1, то граница сегмента масштабируется ( (limit<<12) | 0xFFF ). |
type |
55:52 |
Идентификаторы сегментов данных/кода, включая бит доступа (бит 52). Толкования битов см. в Intel Architecture Software Developer’s Manual. |
s |
56 |
Бит несистемности. Если он 1, то это сегмент данных, если он 0, то это системный сегмент. |
dpl |
58-57 |
Уровень привилегий дескриптора. DPL проверяется для разрешения доступа к памяти для обращений к памяти набора инструкций IA-32 |
p |
59 |
Бит присутствия сегмента. Если 0, и обращение к памяти использует этот сегмент, то для сегментов данных (CS, DS, ES, FS, GS) генерируется IA-32 исключение GPFault, а для SS – генерируется IA-32 исключение StackFault |
av |
60 |
Игнорируется. Для дескрипторов CS, SS чтение этого поля возвращает нули. Для дескрипторов DS, ES, FS, GS чтение этого поля возвращает последнее значение, которое было записано кодом типа Itanium. Чтение этого поля возвращает 0, при записи дескрипторными загрузками IA-32. Это поле игнорируется процессором, во время выполнения набора инструкций IA-32. Доступно для программного использования, но не для будущего использования этого поля. |
ig |
61 |
Игнорируется. Для дескрипторов CS, SS чтение этого поля возвращает нули. Для дескрипторов DS, ES, FS, GS чтение этого поля возвращает последнее значение, которое было записано кодом типа Itanium. Чтение этого поля возвращает 0, при записи дескрипторными загрузками IA-32. Это поле игнорируется процессором, во время выполнения набора инструкций IA-32. Это поле может иметь будущее использование и должно быть программно установлено в ноль. |
d/b |
62 |
Размер сегмента. Если 0, то эффективные адреса набора инструкций IA-32 усекаются до 16 бит, в противном случае эффективные адреса имеют 32 бита. Кроме того, для кодового сегмента, в инструкциях IA-32, бит d/b управляет размером операнда по умолчанию. Если 1, то размер операнда по умолчанию – 32 бита, в противном случае – 16 бит. |
g |
63 |
Дробность границы сегмента. Если 1, то для обращений к памяти набора инструкций IA-32, граница сегмента масштабируется (limit<<12) | 0xFFF. Это поле игнорируется для обращений к памяти набора инструкций типа Itanium. |
