Управление памятью в микропроцессорах семейства Х86, страница 6

               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 бит определяют номер запрашиваемого дескриптора в соответствующей дескрипторной таблице.

Базовый адрес LDT(из дескриптора LDT)

 

Рис.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.