Глава 4. Дескриптор.
Прежде чем программа сможет обратиться по какому-либо адресу памяти, она должна определить набор сегментов, через которые она сможет получить доступ к памяти.
Сегмент определяется в виде структуры данных, которая называется дескриптор. Размер дескриптора - 8 байт, все дескрипторы хранятся последовательно в специально отведённой области памяти - глобальной дескрипторной таблице.
Далее приведен формат дескриптора:
биты: 0..15: предел, биты 0..15 16..31: адрес сегмента, биты 0..15 32..39: адрес сегмента, биты 16..23 40: бит A (Accessed) 41..43: Тип сегмента 44: бит S (System) 45,46: DPL (Descriptor Privilege Level) 47: бит P (Present) 48..51: предел, биты 16..19 52: бит U (User) 53: бит X (reserved) 54: бит D (Default size) 55: бит G (Granularity) 56..63: адрес сегмента, биты 24..31
Эта структура поясняется на рис. 4-1:
Как видите, значения предела и адреса сегмента "разбросаны" по всей структуре дескриптора. Это объясняется тем, что впервые защищённый режим появился в 16-разрядном процессоре 80286 и для совместимости с ним дескриптор не переделывали, а расширили дополнительными полями (биты с 49 по 63), благодаря чему программы, написанные для защищённого режима 286-го процессора работают и на 32-разрядных процессорах.
Практически, в программах формат дескриптора удобнее использовать в следующем виде:
descriptor: dw limit_low ; младшее слово предела dw address_low ; младшее слово адреса db address_hi ; 3-й (из четырёх) байт адреса db access_rights ; права доступа db limit_hi_and_flags ; старшая часть предела и флаги GDXU db address_hi ; 4-й байт адреса
Байт прав доступа имеет следующий формат:
биты: 0: бит A (Accessed) 1..3: тип сегмента 4: бит S (System) 5,6: поле DPL 7: бит P (Present)
Байт старшей части предела и флагов GDXU имеет формат:
биты: 0..3: старшая часть предела (биты 16..19) 4: бит U 5: бит X 6: бит D 7: бит G
Элементы дескриптора.
Адрес сегмента - также называется базовым адресом, - 32-разрядный адрес области памяти, с которой начинается сегмент.
| Предел сегмента - предельное значение смещения в сегменте; также можно рассматривать предел как размер сегмента минус один элемент размера - байт или страницу, смотря в чём измеряется сегмент.
| Бит A (Acessed) - бит доступа в сегмент. Этот бит показывает, был ли произведен доступ к сегменту, описываемому этим дескриптором, или нет. Если процессор обращался к сегменту для чтения или записи данных или для выполнения кода, размещённых в нём, то бит A будет установлен (равен 1), иначе - сброшен (0).
| С помощью бита A операционная система может определить, использовался ли за последнее время этот сегмент или нет и предпринять какие-либо действия. Бит A процессором только устанавливается, сбрасывать его должна операционная система. При создании нового дескриптора подразумевается, что бит A будет равен 0 (т.е. обращений к этому сегменту ещё не было). Тип сегмента - трёхбитовое поле, определяющее тип сегмента (см. таблицу 4-1). Каждый бит типа сегмента имеет следующие значения:
| Для сегмента кода значения битов W и E интерпретируются несколько иначе (см. таблицу 4-1) |
Бит # | 11 | 10 | 9 | Тип | |
Название | E | W | |||
0 | 0 | 0 | Данные | Только чтение | |
0 | 0 | 1 | Данные | Чтение и запись | |
0 | 1 | 0 | Данные | Только чтение, расширяется вниз | |
0 | 1 | 1 | Данные | Чтение и запись, расширяется вниз | |
1 | 0 | 0 | Код | Только выполнение | |
1 | 0 | 1 | Код | Только выполнение | |
1 | 1 | 0 | Код | Только выполнение, согласованный | |
1 | 1 | 1 | Код | Выполнение и считывание, согласованный |
Примечания:
1. | В защищённом режиме процессор запрещает запись в сегмент кода и, как видно из таблицы, не всегда разрешает даже простое считывание (хотя, запись в сегмент кода, конечно же, можно сделать, но не явно) |
2. | Согласованный сегмент кода будет обсуждаться в следующих главах. |
Создавать дескрипторы достаточно легко. Все биты и битовые поля находятся в байте прав доступа access_rights (P, DPL, S, Тип, A ) и в старших четырёх разрядах байта limit_hi_and_flags (G, D, X, U). Дескрипторы по типу отличаются значениями байта прав доступа, по свойствам - битами G и D, остальное - значения базового адреса и предела. Когда мы будем рассматривать пример перехода в защищённый режим, вы увидите один из вариантов конструирования дескрипторов.
Следующая глава | Оглавление | Вопросы? Замечания? Пишите: sasm@narod.ru |
Copyright © Александр Семенко. |