Защищенный режим процессоров Intel


Детальное описание схемы преобразования адресов - часть 6


Так как дескриптор с адресом gdt_gdt описывает саму таблицу GDT (и формат этого дескриптора подходит для команды LGDT), его можно использовать для загрузки регистра GDTR:

lgdt [QWORD gdt_gdt]

Если вы создаёте программу на языке Си, глобальная таблица дескрипторов GDT может быть определена с помощью типа descriptor следующим образом:

descriptor gdt[5];

В этом примере создаётся таблица GDT, содержащая пять дескрипторов. Тип descriptor определяется так:

typedef struct descriptor { word limit; word base_lo; unsigned char base_hi; unsigned char access; unsigned reserved; } descriptor;

Инициализацию дескрипторов в таблице GDT можно выполнить, например, с помощью следующей функции:

void init_gdt_descriptor(descriptor *descr, // указатель // на инициализируемый // дескриптор unsigned long base, // базовый адрес сегмента word limit, // предел сегмента unsigned char acc_byte) // поле доступа { descr->base_lo = (word)base; descr->base_hi = (unsigned char)(base >> 16); descr->access = acc_byte; descr->limit = limit; descr->reserved = 0; }

Приведём пример использования этой функции для записи в третий по счёту элемент GDT информации о сегменте данных с сегментным адресом _DS и пределом 0xffff:

init_gdt_descriptor(&gdt[2], MK_LIN_ADDR(_DS, 0), 0xffffL, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE);

Преобразовать логический адрес реального режима (сегмент:смещение) в физический адрес можно с помощью следующей макрокоманды:

#define MK_LIN_ADDR(seg,off) (((unsigned long)(seg))<<4)+(word)(off)

Для формирования поля доступа в нашем примере используются такие определения:

#define TYPE_CODE_DESCR 0x18 #define TYPE_DATA_DESCR 0x10 #define SEG_WRITABLE 0x02 #define SEG_READABLE 0x02 #define SEG_PRESENT_BIT 0x80

К сожалению, встроенный в Borland C 3.0 Inline-ассемблер не позволяет использовать команду LGDT в программе, составленной на языке Си. Аналогичное ограничение имеется и в Microsoft Quick C. Поэтому для загрузки этого и некоторых других регистров приходится использовать отдельные модули, составленные полностью на языке ассемблера.




- Начало -  - Назад -  - Вперед -