- •6. Модель прикладного выполнения в системной среде Intel®Itanium™
- •6.1. Режимы набора инструкций
- •6.1.1. Выполнение набора инструкций в среде IntelItanium.
- •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. Ia-32 регистры с плавающей точкой
- •6.2.5.1. Ia-32 стек регистров с плавающей точкой
- •6.2.5.2. Специальные случаи
- •6.2.5.3. Регистры управления с плавающей точкой ia-32.
- •6.2.5.4. Ia-32 среда с плавающей точкой
- •6.2.6. Ia-32 регистры ммх технологии
- •6.2.7. Ia-32 регистрыSse
- •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.2. Alat
- •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.