- •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.3.1. Сегменты данных и кода
При переключении в код IA-32, регистры дескрипторов и селекторов сегментов IA-32 (GDT, LDT, DS, ES, CS, SS, FS и GS) должны быть инициализированы кодом типа Itanium, к требуемым значениям, основанным на соглашениях о вызовах IA-32 и Itanium и на используемой модели сегментации.
Код типа Itanium может вручную загрузить дескриптор, вызвав 8-байтый элемент из LDT/GDT, расшифровывая дескриптор и записывая базу, границу и атрибуты сегмента. Другой способ состоит в том, что программа типа Itanium может переключиться в набор инструкций IA-32 и выполнить требуемую загрузку IA-32 инструкцией типа Mov Sreg. Если код типа Itanium явно загружает сегментные дескрипторы, то он отвечает за целостность сегментного дескриптора.
Процессор не гарантирует когерентности между дескрипторами в памяти и дескрипторными регистрами, при этом, если сегментные регистры загружены Itanium инструкциями, то процессор не устанавливает биты доступности сегмента в LDT/GDT.
6.2.3.2. Сегментный дескриптор и целостность среды
При выполнении набора инструкций IA-32, большинство сегментных проверок защиты применяется процессором тогда, когда дескриптор сегмента загружается инструкциями IA-32 в сегментный регистр. Однако, загрузки сегментных дескрипторов из набора инструкций Itanium в файл универсальных регистров, не выполняют никаких таких проверок защиты и при этом сегментные биты доступа не обновляются процессором.
Если программа типа Itanium прямо загружает дескриптор, то она отвечает за правильность дескриптора и обеспечение целостности IA-32 среды соответствующего режима (защищенного, реального или VM86). Таблица 6.3 определяет программные рекомендации для инициализации среды IA-32. Процессор проверяет целостность среды IA-32 так, как это определено ниже в разделе 6.2.3.3 «Проверки целостности среды IA-32 во время выполнения». При переключении между кодами IA-32 и Itanium, процессор не изменяет значения базы, границы и атрибутов для любого дескриптора сегмента, и при этом нет изменений в уровне привилегий.
Табл. 6.3. Начальное состояние регистров среды IA-32
Регистр |
Поле |
Реальный режим |
Защищенный режим |
Режим VM86 |
PSR |
cpl |
0 |
уровень привилегий |
3 |
EFLAG |
vm |
0 |
0 |
1 |
CR0 |
pe |
0 |
1 |
1 |
CS |
selector |
base>>4A |
selector |
base>>4 |
base |
selector <<4B |
base |
selector <<4 |
|
dpl |
PSR.spl(0) |
PSR.splC |
PSR.spl(3) |
|
d-бит |
16 битD |
16/32 бит |
16 бит |
|
type |
R/W данных, расширяемость |
Выполняемый |
R/W данных, расширяемость |
|
s-бит |
1 |
1 |
1 |
|
p-бит |
1 |
1 |
1 |
|
a-бит |
1 |
1 |
1 |
|
g-бит/limit |
0xFFFFE |
limit |
0xFFFF |
|
SS |
selector |
base>>4A |
selector |
base>>4 |
base |
selector <<4B |
base |
selector <<4 |
|
dpl |
PSR.spl(0) |
PSR.spl |
PSR.spl(3) |
|
d-бит |
16 битD |
16/32 бит |
16 бит |
|
type |
R/W данных, расширяемость |
Типы данных |
R/W данных, расширяемость |
|
s-бит |
1 |
1 |
1 |
|
p-бит |
1 |
1 |
1 |
|
a-бит |
1 |
1 |
1 |
|
g-бит/limit |
0xFFFFE |
limit |
0xFFFF |
|
DS, ES, FS, GS |
selector |
base>>4A |
selector |
base>>4 |
base |
selector <<4B |
base |
selector <<4 |
|
dpl |
dpl>=PSR.spl(0) |
dpl>=PSR.spl |
dpl>=PSR.spl(3) |
|
d-бит |
16 битD |
16/32 бит |
16 бит |
|
type |
R/W данных, расширяемость |
Типы данных |
R/W данных, расширяемость |
|
s-бит |
1 |
1 |
1 |
|
p-бит |
1 |
1 |
1 |
|
a-бит |
1 |
1/0F |
1 |
|
g-бит/limit |
0xFFFFE |
limit |
0xFFFF |
|
LDT, GDT, TSS |
selector |
Не доступны |
selector |
|
base |
base |
|||
dpl |
dpl>=PSR.spl |
|||
d-бит |
0 |
|||
type |
Типы для ldt, gdt, tss |
|||
s-бит |
0 |
|||
p-бит |
1 |
|||
a-бит |
1 |
|||
g-бит/limit |
limit |
|||
Селекторы должны быть установлены в значение 16* base, для нормальной работы реального режима.
База сегмента должна быть установлена в значение selector/16, для нормальной работы реального режима.
Если не задан соответствующий кодовый сегмент.
Размер сегмента должен быть установлен в 16 бит, для нормальной работы реального режима.
Граница сегмента должна быть установлена в 0xFFFF, для нормальной работы реального режима.
Для действительных сегментов p-бит должен быть установлен в 1, для нулевых сегментов p-бит должен быть установлен в 0.
