31 Байт 3 Байт 2 16 15 Байт 1 Байт 0 0
Рис. III.10 Формат дескриптора шлюза задачи.
Поскольку при переключении задач требуется информация, заключенная во всем сегменте TSS, то определяется только базовый адрес этого сегмента, и указывать смещение в сегменте не требуется.
Дескрипторы шлюзов различных типов отличаются друг от друга кодом типа в поле TYPE, расположенного в байте прав доступа на месте 0, 1, 2 и 3 битов.
0100 – шлюз вызова 80286 (Сall Gate).
1100 – шлюз вызова i386+ (Call Gate).
0101 – шлюз задачи 80286 (Task Gate).
1101 – шлюз задачи i386+ (Task Gate).
0110 – шлюз прерывания 80286 (Interrupt Gate).
1110 – шлюз прерывания i386+ (Interrupt Gate).
0111 – шлюз ловушки 80286 (Trap Gate).
1111 – шлюз ловушки i386+ (Trap Gate).
Остальные 4 бита байта прав доступа: P, DPL и S, имеют то же значение, что и в байте прав доступа дескрипторов любых сегментов.
В заключение, укажем возможное распределение дескрипторов различного вида по дескрипторным таблицам, используемых в МП семейства х86.
В глобальной дескрипторной таблице GDT могут находиться дескрипторы:
· сегментов кода и данных;
· системных сегментов LDT и TSS;
· шлюзов вызова;
· шлюзов задач.
В локальной дескрипторной таблице LDT могут находиться дескрипторы:
· сегментов кода и данных;
· шлюзов вызова;
· шлюзов задач.
В дескрипторной таблице прерываний IDT могут находиться дескрипторы:
· шлюзов задач;
· шлюзов прерываний;
· шлюзов ловушек.
5. Использование дескрипторных таблиц GDT и LDT
при формировании физических (линейных) адресов.
Основное отличие модели сегментации памяти в процессорах, функционирующих в защищенном режиме работы, от процессора 8086 заключается в том, что теперь пользовательская программа не может свободно обращаться по любому адресу в адресном пространстве памяти. Каждая программа, независимо от уровня ее привилегий, не может обращаться к сегменту до тех пор, пока он не «описан» для программы. Программе не разрешается обращаться по любому адресу, который она может сформировать. Кроме того, в задании атрибутов сегментов, которые зафиксированы в их дескрипторах, предоставляется довольно большая свобода. Например, базовый адрес может быть любым (не требуется его выравнивания на границу параграфа т.е. с градацией 16 байт), а размер сегмента варьируется от одного байта до всего адресуемого пространства в 4Гбайт (при страничной грануляции). Размер сегмента в 4Гбайта говорит о том, что с помощью эффективного 32 разрядного адреса инструкции, можно «пройти» все адресное пространство, не модифицируя содержимое сегментного регистра. Такая свобода определения сегментов предоставляет программисту полное управление использованием памяти и позволяет удовлетворить практически любые запросы памяти.
Схема формирования линейного адреса в защищенном режиме работы МП семейства х86 с привлечением селектора и смещения в сегменте (эффективного адреса), получаемого из текущей инструкции, приведена на рисунке III.12. Как уже упоминалось, совокупность селектора и эффективного адреса, которую иногда называют, также, указателем адреса, определяет логический или виртуальный адрес операнда.Селектор представляет собой 16 разрядный двоичный код, заносимый специальной инструкцией в соответствующий сегментный регистр. Селектор состоит из трех полей (см. рис.III.11).
15 2 1 0
Index |
TI |
RPL |
Рис. III.11 Формат селектора сегмента в МП 80286+
Младшие два бита образуют поле RPL (Requested Privilege Level) – уровень привилегий запросчика. Они используются при организации системы защиты от несанкционированного доступа к сегментам памяти. Следующий бит–TI (Table Indicator) - определяет тип дескрипторной таблицы, из которой должен выбираться дескриптор (TI = 0 ® из таблицы GDT, TI = 1® из таблицы LDT). Остальные 13 бит определяют номер запрашиваемого дескриптора в соответствующей дескрипторной таблице.
|
Рис.III.12. Формирование линейного адреса в МП семейства Х86
Физический же адрес дескриптора в общем адресном пространстве определяется путем суммирования базового (начального) адреса дескрипторной таблицы с номером этого дескриптора, умноженным на 8 (поскольку каждый дескриптор занимает адресное пространство, равное 8 байтам). Базовый же адрес дескрипторной таблицы извлекается из соответствующего системного регистра. При TI = 0, используется системный регистр GDTR, а именно, содержимое его поля базового адреса.
Выбрав из оперативной памяти по полученному физическому адресу дескриптор, процессор выделяет из него базовый адрес запрашиваемого сегмента, и суммирует его со смещением (эффективным адресом, либо значением IP, SP, SI или DI), получаемым непосредственно из инструкции (команды) выполняемой программы. Полученное значение адреса является линейным а, в случае выключенного режима страничного преобразования, одновременно и физическим адресом, выдаваемым процессором непосредственно на адресную шину компьютера.
Если TI = 1, то это означает, что запрашиваемый дескриптор находится в локальной дескрипторной таблице LDT. В этом случае надо предварительно определить, где находится сегмент самой LDT. Для этого процессор обращается к 16 разрядному системному регистру LDTR. В нем находится селектор, определяющий тот дескриптор в GDT, который описывает данный сегмент LDT. Выбрав по этому селектору, описанным выше способом, из GDT дескриптор сегмента LDT, процессор извлекает из него базовый адрес таблицы LDT. Затем он возвращается и анализирует селектор, который занесен в сегментный регистр. Считывает с него значение индекса, умножает на 8 и, суммируя его с базовым адресом таблицы LDT, находит базовый адрес сегмента, где находится адресуемый операнд. Нахождение искомого адреса самого операнда осуществляется так же, как и в случае нахождения сегмента в таблице GDT.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.