Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
31.05.2015
Размер:
1.2 Mб
Скачать

Дескрипторы и таблицы дескрипторов

При создании же дескриптора конструктором c_Descriptor бит D/B или бит 4 поля ETYPE уже установлен в 1. Это означает, что все дескрипторы пространств и системных объектов в системе создаются 32 битными по умолчанию.

А для принудительного их перевода в 16 битный вид необходимо запросить метод дескриптора Addr16().

inline c_Descriptor :: c_Descriptor(e_DPLevel e_Level,

 

s_ExtType s_EType, e_SgmState e_State)

 

Объединение типов s_SpcType и

{

s_SysType дает расширенный тип:

u_Vector.s_Dspace.bAttr_I = e_Level | s_EType | e_State;

 

}

 

 

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Дескрипторы и таблицы дескрипторов

Рассмотрим теперь путь исполнения, проделываемый в случае вызова одного из конструкторов c_DSpace или c_DSystem.

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Дескрипторы и таблицы дескрипторов

Процедура 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, а затем осуществляют необходимые изменения в нем.

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Дескрипторы и таблицы дескрипторов

Глобальная таблица дескрипторов начинает формироваться на самой ранней стадии загрузки ядра. Практически, ее содержимое (дескрипторы) сформировано еще на стадии компиляции исходного кода при помощи макрокоманд препроцессора С++ как массив константных значений типа 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) \\ Восстановим предыдущее значение выравнивания

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Дескрипторы и таблицы дескрипторов

Содержимое массива определяется нуждами ядра на момент его перехода в 32-разрядный защищенный режим процессора (далее просто PM). Проанализируем нужды ядра на момент перехода его в PM:

1.Код ядра, лежащий в ОЗУ в 32 р-р сегменте кода, с грануляцией в 1 байт и уровнем привилегий k_KLvl. Протяженность данного сегмента определяется длиной оставшегося участка кода от места исполнения процессором команды, являющейся первой после перехода в PM и очистки конвейера процессора межсегментным, длинным переходом (FAR JMP) на эту команду. Соответственно базовый адрес сегмента также должен начинаться с этой же команды. Таким образом, становится возможным избавиться от 16 р-р кода первичного загрузчика, освобождая участок ОЗУ. Тип сегмента - k_ERCode.

2.Данные ядра, совпадающие по базовому адресу с сегментом кода ядра, 32 р-р, грануляция в 1 байт, с уровнем привилегий k_KLvl. Протяженность сегмента до конца доступного 32 р-р адресного пространства процессора. Это необходимо для того, чтобы смещение, рассчитанное компилятором заранее для данных (глобальные переменные) оставалось тем же, а также для размещения за границей сегмента кода ядра, "кучи" ядра максимальной длины, в которой динамически будут распределяться объекты ядра. Тип сегмента - k_RWDataUp

3.Стек ядра 32р-р, с грануляцией 1 байт, являющийся простым сегментом данных (с увеличением границы сегмента в сторону увеличения 32 р-р адреса). Протяженность сегмента стека выбрана таким образом, чтобы он заканчивался непосредственно перед сегментом кода ядра, начинаясь со смещения 0x00000000 (базовый адрес). Тип сегмента - k_RWDataUp. Уровень доступа k_KLvl.

4.Плоский, 32 р-р, 4Гб сегмент данных, охватывающий все доступное 32 р-р адресное пространство процессора со смещения 0x00000000. Тип сегмента - k_RWDataUp. Данный сегмент необходим для превентивного доступа ядра к любой части адресного пространства, как к данным, поэтому уровень привилегий плоского сегмента k_KLvl.

Протяженность сегмента вынуждает использовать в его описание грануляцию k_4Kb, а при такой дробности сегмента предел будет составлять 0xFFFFF.

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Дескрипторы и таблицы дескрипторов

Во время загрузки 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;

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Используемые Интернет-ресурсы:

http://ru.wikipedia.org/wiki/Стек

http://sasm.narod.ru/docs/pm/pm_int/chap_2.htm

http://sasm.narod.ru/docs/pm/pm_int/chap_4.htm

http://web-protect.net/p442.htm

•http://www.3os.ru/old/3os.ru/oven/work/kernel/docs/0x86_part01.html

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю. Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Используемая литература:

Книга «Ассемблер. Учебник для ВУЗов», авторы Михаил Гук, Виктор Юров

Книга «Архитектура ЭВМ»,автор Мюллер

Книга «Процессоры Pentium4, Athlon и Duron», авторы Михаил Гук, Виктор Юров

Книга «Архитектура ЭВМ», автор Танненбаум

 

 

Физический факультет, ЭВУ и системы, 7 семестр,2010 Доцент Моховиков А..Ю.

Physics Faculty, Electronic Devices & Systems, 7th semester,2010 Dr. Mokhovikov

Alexander

Yurievich