
ЭВУ 2 семестр / Презентации ЭВУ в пдф / Дескрипторы новые 2
.pdf
Дескрипторы
Процедура Expand_ROR разводит верхнее слово базового адреса пространства, так как оно должно выглядеть в дескрипторе и представляет собой специфический для
Watcom asm макрос:
Схема «эволюции» базового адреса с помощью макроса Expand_ROR
extern Expand_ROR(dword dwBase);
#pragma aux Expand_ROR=\ "shr eax, 16"
"xchg ah, al" "ror eax, 8"
parm [eax] \ value [eax] \ modify [eax];
Таким образом, выделяются два вида владельцев дескрипторов: «системный объект» и «пространство». Они получают адрес дескриптора от объектов GDT, LDT, IDT, а затем осуществляют необходимые изменения в нем.
•Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich

Дескрипторы
Глобальная таблица дескрипторов начинает формироваться на самой ранней стадии загрузки ядра. Практически, ее содержимое (дескрипторы) сформировано еще на стадии компиляции исходного кода при помощи макрокоманд препроцессора С++ как массив константных значений типа s_DVector.
В макрокоманде m_DATA_DESCRIPTOR используются все те же типы переменных, что и для класса c_DSpace:
#define k_4Kb 0x00800000 \\ Гранулярность сегмента = 4 кБ
#define k_1Bt 0x00000000 \\ Гранулярность сегмента = 1 Байт
#define k_D32 0x00400000 \\ Разрядность сегмента = 32 бита #define k_D16 0x00000000 \\ Разрядность сегмента = 16 бит
#define m_DATA_DESCRIPTOR(dwLim, dwBAddr, e_State, e_Level, e_Type, dwGranulate, dwD)\
{\
(dwLimit & 0x0000FFFF) | (dwBAddr << 16),\
(dwBAddr & 0xFF000000) | ((dwBAddr & 0x00FF0000) >> 16) |\
((((dword)(e_State | e_Level | e_Type) << 8) | 0x00001000) & 0x0000FF00) |\
dwGranulate | dwD \
}
Сам массив GDT определяется обязательно с выравниванием на параграф следующим образом:
#pragma pack(16) |
\\ Установим выравнивание |
на параграф (= 16 байт) |
|
s_DVector GDT[M] = { |
|
…………………………………………………………………
…………………………………………………………………
};
#pragma pack(0) \\ Восстановим предыдущее значение выравнивания
•Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich

Дескрипторы и таблицы дескрипторов
Содержимое массива определяется нуждами ядра на момент его перехода в 32-разрядный защищенный режим процессора (далее просто PM).
Проанализируем нужды ядра на момент перехода его в PM:
1. Код ядра, лежащий в ОЗУ в 32 р-р сегменте кода, с грануляцией в 1 байт и уровнем привилегий k_KLvl. Протяженность данного сегмента определяется длиной оставшегося участка кода от места исполнения процессором команды, являющейся первой после перехода в PM и очистки конвейера процессора межсегментным, длинным переходом (FAR JMP) на эту команду. Соответственно базовый адрес сегмента также должен начинаться с этой же команды. Таким образом, становится возможным избавиться от 16 р-р кода первичного загрузчика, освобождая участок ОЗУ. Тип сегмента - k_ERCode.
•Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich

Дескрипторы и таблицы дескрипторов
Содержимое массива определяется нуждами ядра на момент его перехода в 32-разрядный защищенный режим процессора (далее просто PM).
Проанализируем нужды ядра на момент перехода его в PM:
2. Данные ядра, совпадающие по базовому адресу с сегментом кода ядра, 32 р-р, грануляция в 1 байт, с уровнем привилегий k_KLvl. Протяженность сегмента до конца доступного 32 р-р адресного пространства процессора. Это необходимо для того, чтобы смещение, рассчитанное компилятором заранее для данных (глобальные переменные) оставалось тем же, а также для размещения за границей сегмента кода ядра, "кучи" ядра максимальной длины, в которой динамически будут распределяться объекты ядра.
Тип сегмента - k_RWDataUp
•Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich

Дескрипторы и таблицы дескрипторов
Содержимое массива определяется нуждами ядра на момент его перехода в 32-разрядный защищенный режим процессора (далее просто PM).
Проанализируем нужды ядра на момент перехода его в PM:
3. Стек ядра 32р-р, с грануляцией 1 байт, являющийся простым сегментом данных (с увеличением границы сегмента в сторону увеличения 32 р-р адреса).
Протяженность сегмента стека выбрана таким образом, чтобы он заканчивался непосредственно перед сегментом кода ядра, начинаясь со смещения 0x00000000 (базовый адрес).
Тип сегмента - k_RWDataUp. Уровень доступа k_KLvl.
•Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Дескрипторы и таблицы дескрипторов
Содержимое массива определяется нуждами ядра на момент его перехода в 32-разрядный защищенный режим процессора (далее просто PM).
Проанализируем нужды ядра на момент перехода его в PM:
4. Плоский, 32 р-р, 4Гб сегмент данных, охватывающий все доступное 32 р-р адресное пространство процессора со смещения 0x00000000. Тип сегмента - k_RWDataUp. Данный сегмент необходим для превентивного доступа ядра к любой части адресного пространства, как к данным, поэтому уровень привилегий плоского сегмента k_KLvl. Протяженность сегмента вынуждает использовать в его описание грануляцию k_4Kb, а при такой дробности сегмента предел будет составлять 0xFFFFF.
•Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich

Дескрипторы
Во время загрузки 16-битной части ядра происходит инициализация регистра GDTR процессора значением 32-битного адреса начала таблицы дескрипторов в памяти. Стандартными средствами C++ сделать это невозможно. Для этого используется макрос Watcom:
extern void LoadGDTR(TVirtualGDTR *ps_VGDTR);
#pragma aux LoadGDTR = \ "LGDT [eax]" \
parm [eax];
И структура данных TVirtualGDTR, являющаяся виртуальным содержимым GDTR регистра в памяти:
struct
{
word wLim;
dword dwGDT_Addr; } TVirtualGDTR;
•Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich