- •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.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. Для сегментов расширяющихся вниз, это поле содержит минимальный эффективный адрес в сегменте. Детали условия нарушения границы сегмента см. вIntelArchitectureSoftwareDeveloper’sManual. Если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. |