Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Архитектура часть 6..doc
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
480 Кб
Скачать

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

  1. Селекторы должны быть установлены в значение 16* base, для нормальной работы реального режима.

  2. База сегмента должна быть установлена в значение selector/16, для нормальной работы реального режима.

  3. Если не задан соответствующий кодовый сегмент.

  4. Размер сегмента должен быть установлен в 16 бит, для нормальной работы реального режима.

  5. Граница сегмента должна быть установлена в 0xFFFF, для нормальной работы реального режима.

  6. Для действительных сегментов p-бит должен быть установлен в 1, для нулевых сегментов p-бит должен быть установлен в 0.