3. Типы сегментов памяти задаваемых в процессорах
семейства х86 в защищенном режиме работы.
В защищенном режиме работы процессоров определены 10 типов сегментов: 6 сегментов кода и данных и 4 системных. К сегментам кода и данных относятся:
· Кодовый сегмент – CS, предназначенный для размещения программ.
· Сегмент стека – SS, предназначенный для выделения области памяти при стековых операциях.
· Сегмент данных – DS, предназначенный для размещения основного массива данных.
· Дополнительные сегменты данных – ES, FS, GS, используемые при операциях со строками и для размещения других массивов данных.
К системным сегментам относятся:
· Сегмент Глобальной Дескрипторной Таблицы (GDT), предназначенный для размещения дескрипторов сегментов кода, стека и данных, дескрипторов сегментов Локальных Дескрипторных Таблиц (LDT) и дескрипторов сегментов состояния задач (TSS), а также дескрипторов шлюзов вызова и шлюзов задач, которые будут рассмотрены в дальнейшем.
· Сегменты Локальных Дескрипторных Таблиц (LDT), в которых расположены дескрипторы кода, стека и данных, относящихся к одной какой-либо задаче, а также дескрипторы шлюзов вызова и шлюзов задач.
· Сегмент Дескрипторной Таблицы Прерываний (IDT), в котором расположены дескрипторы шлюзов задач, шлюзов прерываний и шлюзов ловушек.
· Сегменты Состояния Задач, в которых зафиксированы состояния основных регистров процессора и некоторых ячеек памяти, отображающие состояние процессора при выполнении некоторой задачи на момент переключения его на выполнение другой задачи. Эта информация необходима для корректного продолжения выполнения прерванной задачи при возвращении к ней снова.
Сегменты GDT и IDT имеют особый характер, поскольку их размер и расположение в адресном пространстве жестко задаются системными программистами в специальных системных регистрах GDTR и IDTR при инициализации системы и, как правило, не меняются в процессе ее эксплуатации. Все остальные описываются соответствующими дескрипторами, структура которых рассматривается ниже.
Здесь же заметим, что таблицы LDT, при необходимости создаются по одной для каждой задачи и служат расширением таблицы GDT при реализации мультизадачных систем. Наличие таблицы LDT увеличивает адресное пространство задачи, которое недоступно для других задач. Если задача не имеет таблицы LDT, что вполне допустимо, все требующиеся ей дескрипторы берутся из таблицы GDT (при этом необходимо избегать загрузки в сегментные регистры селекторов с битом TI = 1). В результате сегмент доступен либо одной задаче, либо всем задачам. В таблице LDT не могут находиться дескрипторы LDT, т.е. процессор не допускает дальнейшего «вложения косвенности». Таким образом, с помощью таблиц LDT можно разрешить доступ к критическим областям памяти, например видеобуферу или дисковому контроллеру, только отдельным задачам. Для небольших однопользовательских систем характерно отсутствие таблиц LDT.
4. Типы и структуры дескрипторов, используемых
в защищенном режиме работы процессоров Х86
Дескрипторы сегментов кода и данных.
Общий вид этих дескрипторов приведен на рисунке III.2.
63 Байт 7 55 52 Байт 6 48 47 Байт 5 Байт 4 32
Базовый адрес сегмента (биты 31…24) |
G D 0 U |
Предел сегмента (биты 19…16) |
Байт прав доступа |
Базовый адрес сегмента (биты 23…16) |
Базовый адрес сегмента (биты 15…0) |
Размер (предел) сегмента (биты 15…0) |
31 Байт 3 Байт 2 16 15 Байт 1 Байт 0 0
Рис III.2 Формат дескриптора кода и данных МП семейства х86
Здесь:
G (Granularity) - гранулярность размера сегмента (G = 0 ® в байтах, G = 1 ® в страницах по 4К).
D (Defaultsize) – разрядность, по умолчанию, адресов, операндов и указателя стека (D = 0 ® 16 бит, D = 1 ® 32 бита). Благодаря этому биту процессоры i386+, без специальных дополнительных мер, могут переключаться с выполнения 16 битного кода на 32 битный код и обратно. Для сегментов данных и стека справедлива аналогичная интерпретация. Когда бит D = 0, стековые операции производятся с 16 битными элементами и в качестве указателя стека привлекается регистр SP. Кроме того, максимальный размер стека ограничен 64 Кбайт. Когда бит D = 1, стековые операции производятся с 32 битными элементами и в качестве указателя стека привлекается регистр ESP, при этом максимальный размер стека может быть увеличен до 4 Гбайт.
U (Users) – бит пользователя, используется по его усмотрению. Процессор этот бит игнорирует.
AR (Accessrightsbyte) – байт прав доступа.
Байт прав доступа у дескрипторов кодового сегмента имеет структуру, приведенную на рисунке III.3, а у дескрипторов сегментов данных и стека структуру, приведенную на рисунке III.4.
7 6 5 4 3 2 1 0
P |
DPL |
S |
E |
C |
R |
A |
Рис.IV.3 Байт прав доступа дескрипторов сегментов кода.
7 6 5 4 3 2 1 0
P |
DPL |
S |
E |
ED |
W |
A |
Рис.III.4 Байт прав доступа дескрипторов сегментов данных и
стека.
Здесь:
DPL (DescriptorPrivilegeLevel) – уровень привилегий сегмента: (00, 01, 10, 11: при этом уровень 00 является высшим уровнем, а уровень 11- низшим).
S (System) – признак системного сегмента: (S=0 характеризует системный сегмент, а S=1 - сегмент кода, стека, или сегмент данных).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.