Помимо дескрипторов для сегментов кода и данных прикладной программы, процессор i486 имеет дескрипторы для системных сегментов и шлюзов. Это структуры данных, используемые для организации выполнения задач (Глава 7), также исключений и прерываний (Глава 9). В Таблице 6-1 перечислены все типы, определенные для системных сегментов и шлюзов. Отметим, что не все дескрипторы определяют сегменты: дескрипторы шлюзов содержат точки входа в процедуры.
Поля Типа дескрипторов сегментов кода и данных включают в себя биты, более подробно определяющие назначение сегмента (см. Рисунок 6-1):
Бит "Доступный для записи" в дескрипторе сегмента данных управляет возможностью выполнения записи из программ в данный сегмент.
Бит "Доступный для чтения" дескриптора выполняемого сегмента задает возможность выполнения чтения программами из данного сегмента (например для доступа к константам, записанным непосредственно в область кода).
Доступный для чтения выполняемый сегмент может быть прочитан двумя способами:
С помощью регистра CS, используя префикс переопределения сегмента CS.
С помощью загрузки селектора для данного дескриптора в регистр сегмента данных (DS, ES, FS или GS).
Таблица 6-1. Типы системных сегментов и шлюзов ----------------------------------------------------------------- Тип Описание----------------------------------------------------------------- 0 Резервируется 1 Доступный сегмент состояния задачи (TSS) 80286 2 LDT 3 Занятый сегмент состояния задачи (TSS) 80286 4 Шлюз вызова 5 Шлюз задачи 6 Шлюз прерываний 80286 7 Шлюз ловушек 80286 8 Резервируется 9 Доступный TSS ЦПУ i486 10 Резервируется 11 Занятый TSS ЦПУ i486 12 Шлюз вызова ЦПУ i486 13 Резервируется 14 Шлюз прерываний ЦПУ i486 15 Шлюз задачи ЦПУ i486-----------------------------------------------------------------
Проверка типа может использоваться для определения программных ошибок, состоящих в попытке использования сегментов способом, не подразумевавшимся программистом. Процессор рассматривает информацию о типе в двух возможных случаях:
Когда селектор для дескриптора загружается в сегментный регистр. Конкретные сегментные регистры могут содержать только конкретные типы дескрипторов; например:
Регистр CS может быть загружен только селектором выполняемого сегмента.
Селекторы выполняемых сегментов, не являющиеся "Доступными для чтения", не могут быть загружены в регистры сегментов данных.
В регистр SS могут быть загружены только селекторы сегментов данных, "Доступных для записи".
Конкретные сегменты могут использоваться командами только конкретными, предопределенными способами; например:
Никакая команда не может выполнять запись в выполняемый сегмент.
Никакая команда не может выполнять запись в сегмент данных, если для него не установлен бит "Доступен для записи".
Никакая команда не может выполнять чтение выполняемого сегмента, если для него не установлен бит "Доступен для чтения".