Дескриптор сегмента (:yvtjnhmkj vyibyumg)
Перейти к навигации
Перейти к поиску
Дескриптор сегмента (в архитектуре x86) — служебная структура в памяти, которая определяет сегмент. Длина дескриптора равна 8 байт.
- База (жёлтые поля, 32 бита) — начало сегмента в линейной памяти
- Лимит (красные поля, 20 бит) — (размер сегмента в байтах)-1 (База+Лимит = линейный адрес последнего байта)
- Права доступа (синие поля, 12 бит) — флаги, определяющие наличие сегмента в памяти, уровень защиты, тип, разрядность + один пользовательский флаг[1]
Байт прав доступа (AR, англ. Access Rights, биты 8-15 на рисунке):
- Бит P определяет доступность сегмента (0 — сегмента нет, 1 — есть). При обращении к сегменту со сброшенным битом P происходит исключение #NP, обработчик которого может загрузить/создать сегмент.
- Номер привилегий DPL содержит 2-битный номер (0-3), определяющий, к какому уровню (кольцу) защиты относится этот сегмент.
- Тип сегмента (биты 8-12 на рисунке). Старший бит (S) определяет сегмент как системный (S=0) или пользовательский (S=1). Значение прочих бит для системных и пользовательских сегментов описано в таблице:
№ | Биты AR | Описание | |||
---|---|---|---|---|---|
3 | 2 | 1 | 0 | ||
0 | 0 | 0 | 0 | 0 | Запрещенное значение |
1 | 0 | 0 | 0 | 1 | Свободный 16-битный TSS |
2 | 0 | 0 | 1 | 0 | LDT |
3 | 0 | 0 | 1 | 1 | Занятый 16-битный TSS |
4 | 0 | 1 | 0 | 0 | 16-битный шлюз вызова |
5 | 0 | 1 | 0 | 1 | Шлюз задачи |
6 | 0 | 1 | 1 | 0 | 16-битный шлюз прерывания |
7 | 0 | 1 | 1 | 1 | 16-битный шлюз ловушки |
8 | 1 | 0 | 0 | 0 | Запрещенное значение |
9 | 1 | 0 | 0 | 1 | Свободный 32-битный TSS |
A | 1 | 0 | 1 | 0 | Зарезервировано |
B | 1 | 0 | 1 | 1 | Занятый 32-битный TSS |
C | 1 | 1 | 0 | 0 | 32-битный шлюз вызова |
D | 1 | 1 | 0 | 1 | Зарезервировано |
E | 1 | 1 | 1 | 0 | 32-битный шлюз прерывания |
F | 1 | 1 | 1 | 1 | 32-битный шлюз ловушки |
№ | Биты AR | Описание | ||
---|---|---|---|---|
3 | 2 | 1 | ||
0 | 0 | 0 | 0 | Сегмент данных только для чтения |
2 | 0 | 0 | 1 | Сегмент данных для чтения/записи |
4 | 0 | 1 | 0 | Сегмент данных только для чтения, растёт вниз |
6 | 0 | 1 | 1 | Сегмент данных для чтения/записи, растёт вниз |
8 | 1 | 0 | 0 | Сегмент кода только для выполнения |
A | 1 | 0 | 1 | Сегмент кода для выполнения/чтения |
C | 1 | 1 | 0 | Подчинённый сегмент кода только для выполнения |
E | 1 | 1 | 1 | Подчинённый сегмент кода для выполнения/чтения |
Младший бит байта AR пользовательских сегментов (A, англ. Accessed, бит 8 на рисунке) можно использовать для сбора статистики о сегменте. При первом же обращении к сегменту (чтение, запись, выполнение) он устанавливается процессором в 1.
- Флаг гранулярности G определяет лимит сегмента: при G=0 лимит равен значению соответствующего поля в дескрипторе, а при G=1 лимит равен полю дескриптора, умноженному на (212 = 4096). Таким образом при G=0 максимальный размер сегмента 1 МБайт, а при G=1 4 ГБайт.
- Флаг разрядности DB (бит 22 на рисунке) актуален для пользовательских сегментов кода и стека. Определяет разрядность в 16 бит при нулевом и 32 бит при единичном значении.
- Зарезервированный флаг (серое поле) должен всегда равняться нулю в 32 битных дескрипторах и режиме совместимости, одному для 64 битного режима.
- Пользовательский флаг AVL (A, бит 20 на рисунке) отдан операционной системе. Его состояние никак не влияет на работу с сегментом.
См. также
[править | править код]Примечания
[править | править код]- ↑ Разорванность полей дескриптора объясняется эволюционированием процессоров.