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

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

Общие поля-характеристики для обеих групп дескрипторов:

1.Наличие в ОЗУ [P - бит присутствия]

2.Уровень привилегий [DPL - 2 бита уровня доступа]

3.Расширенный тип* [ETYPE - 5 бит расширенного типа]

Расширенный тип введен для приведения всех типов дескрипторов разных групп к общему типу. Он учитывает значение поля S - системный бит.

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

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

Выделим общие поля-характеристики дескрипторов 1 группы:

1.Разрядность[D - бит разрядности, 16 бит/32 бита]

2.Гранулярность [G - бит дробности, 1 байт/4Кб]

3.Сегмент/системный объект [S - бит типа сегмент/объект]

4.Собственные нужды ОС[AVL - бит нужд ОС]

5.Базовый адрес [BASE - 32 бита базового адреса]

6. Предел сегмента

[LIMIT - 20 бит размера сегмента]

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

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

Выделим общие поля-характеристики дескрипторов 2 группы:

1.Смещение[OFFSET - 32 бита смещения]

2.Селектор [SELECTOR - 15 бит]

3.Константа [CONST - 3 бита = 000]

!Для 2 группы дескриптор типа A является ограниченно совместимым c другими дескрипторами этой группы из-за наличия поля COUNT - количество параметров 5 бит. В принципе, это поле в других сегментах можно выделить как резерв.

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

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

Таким образом, выделим две структуры данных для класса дескрипторов:

«дескриптор

«дескриптор системных

«вспомогательное

пространства» - группа 1:

объектов» - группа 2:

представление дескриптора»

struct s_DSpace

struct s_DSysObj

- группы 1 и 2:

{

 

struct s_DVector

word wLimit;

{

{

word wBase_I;

word wOffset_I;

dword dwVec_I;

byte bBase_II;

word wSelector;

dword dwVec_II;

byte bAttr_I;

byte bCount;

};

byte bAttr_II;

byte bAttr;

 

byte bBase_III;

 

word wOffset_II;

 

};

 

};

 

 

 

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

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

class c_Descriptor

{

private: union

{

s_DSpace s_Space; s_DSysObj s_SysObj; s_DVector s_Vector;

} u_Vector; public:

c_Descriptor(e_DPLevel e_Level, s_ExtType s_EType, e_SgmState e_State);

~c_Descriptor();

void Level_Set (e_DPLevel e_Level); void EType_Set (s_ExtType s_EType); void Addr16(void);

void Addr32(void); void Present (void); void UnPresent (void); bool IsSgmRAM (void);

};

 

 

 

class c_DSpace : private c_Descriptor

 

 

 

 

Соответственно,

 

{

 

должны существовать

 

public:

 

два класса

 

c_DSpace();

 

дескрипторов,

 

~c_DSpace ();

 

производных от

 

 

 

одного общего класса

 

void DSpace_Set (void *vBase,

 

дескрипторов,

 

s_SpcLimit s_Limit, s_SpcType s_Type);

 

включающего общие

 

void Base_Set (void *vBase);

 

методы работы со

 

void Limit_Set (s_SpcLimit s_Limit);

 

всеми типами

 

void Type_Set (s_SpcType s_Type);

 

дескрипторов.

 

};

 

 

 

 

 

 

 

 

Основная нагрузка для общего класса дескрипторов ляжет на создание дескриптора с заданным уровнем приоритета объекта, наличием в ОЗУ и расширенным типом, который описывается данным дескриптором и методами изменения этих параметров.

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

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

Разберемся с дополнительными типами. Рассмотрим тип s_SpcLimit - определяемый дескриптором размер сегмента:

Поскольку он неотделим от характеристики грануляции сегмента и его разрядности и никогда не превышает 20 байт, то есть смысл объединить их в структуру:

Значение типа уровня доступа находится в интервале 0..3, однако лучше всего будет сдвинуть его влево на 5 бит для удобства работы:

enum e_DPLevel

{

k_KLvl = 0, k_DLvl = 1 << 5, k_SLvl = 2 << 5, k_ALvl = 3 << 5

};

Точно так же поступаем с типом

enum e_SgmState

e_SgmState, подменяющим флаг

{

присутствия отождествляемого

k_Swap = 0,

дескриптором объекта в оперативной

k_RAM = 1 << 7

памяти компьютера:

};

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

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

Тип «дескриптора пространства» - это перечисление возможных типов сегментов, без учета бита ACCESSED. Так как установка этого бита - прерогатива процессора.

0.Пространство данных только для чтения с увеличением границы вверх

1.Пространства данных с возможностью записи с увеличением границы вверх

2.Пространство данных только для чтения с увеличением границы вниз

3.Пространство данных с возможностью записи с увеличением границы вниз

4.Пространство неподчиненного кода с запретом чтения

5.Пространство неподчиненного кода c возможностью чтения

6.Пространство подчиненного кода с запретом чтения

7.Пространство подчиненного кода c возможностью чтения

В этом случае преобразование e_SpcType -> s_SpcType будет выполняться сдвигом влево на один бит, с установкой бита 4,

S [Segment] = 1.

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

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

Необходимо отметить!, что дескрипторы, как элемент данных, имеют четкое местоположение в памяти - дескрипторные таблицы GDT, LDT, IDT. Потому создание дескриптора должно быть привязано по месту его «прописки». Обеспечить это можно обращением к дескриптору через метод выделения дескриптора в соответствующей ему таблице, инкапсулируемой классом. Создание дескриптора традиционным способом - оператором new, приведет лишь к созданию неработоспособной копии объекта.

Рассмотрим создание дескриптора в таблице GDT:

c_Descriptor *pc_DExample = GDT.DAlloc();

Вызов метода DAlloc (Allocate Descriptor) произведет необходимые действия с таблицей GDT:

1.Изменение части LIMIT регистра GDTR на длину дескриптора. 2.При необходимости, выделение дополнительной памяти под таблицу дескрипторов 3. Возвращение указателя на работоспособный дескриптор.

Далее, необходимо использовать конструктор дескриптора.

Случай 2 может потребовать манипуляций со страницами памяти, так как хотелось бы избавиться от излишнего перемещения данных из области GDT в новое место при нехватке памяти в заранее выделенной под GDT (при работе еще 16 битного кода загрузчика) куче, кратной размеру страницы [4Kb = 4096 байта].

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

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

Приступим к расширенному полю ETYPE.

Необходимо отметить!, что это достаточно синтетическое поле и его прямая задача объединить типы разных групп дескрипторов в одну, за счет выделения 5 бита - S (системный дескриптор).

Опять-таки, поле ETYPE является простейшим перечислением входящих комбинаций простых типов s_SpcType и s_SysType.

Рассмотрим системный набор дескрипторов s_SpcType:

1.

[0001] Свободный TSS - 16 бит

9. [1001] Свободный TSS - 32 бит

2.

[0010] Локальная таблица дескрипторов (LDT)

 

 

3.

[0011] Занятый TSS - 16 бит

11.

[1011] Занятый TSS - 32 бит

4.

[0100] Шлюз вызова - 16 бит

12. [1100] Шлюз вызова - 32 бит

5.

[0101] Шлюз задачи

 

 

6.

[0110] Шлюз прерывания - 16 бит

14.

[1110] Шлюз прерывания - 32 бит

7.

[0111] Шлюз ловушки - 16 бит

15.

[1111] Шлюз ловушки - 32 бит

Как видно из таблицы, системные дескрипторы за исключением 2, 5 определяются симметрично относительно 4-ого бита. Таким образом, можно свести системные объекты в перечисление:

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

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

Дескрипторы первой и второй группы сходны в определении разрядности (16/32) отождествляемых с ними объектов. Поэтому в c_Descriptor присутствуют методы Addr16 и Addr32. Методы по биту S [Segment] могут различить тип дескриптора и установить, соответственно, либо бит 4 поля ETYPE (за исключением LDT и TaskGate типов), либо бит D/B поля dwVec_II.

void c_Descriptor :: Addr16(void)

{

register s_ExtType s_EType = (s_ExtType) u_Vector.s_SysObj.bAttr;

if (s_EType.IsSystem()) s_EType.u_ExtType.s_SysObj.Addr16();

else

((s_SpcLimit) u_Vector.s_Vector.dwVec_II).Addr16();

}

void c_Descriptor :: Addr32(void)

{

register s_ExtType s_EType = (s_ExtType) u_Vector.s_SysObj.bAttr;

if(s_EType.IsSystem ()) if((s_EType.u_ExtType.s_SysObj.bValue != k_LDT) &&

(s_EType.u_ExtType.s_SysObj.bValue != k_TaskGate)) s_EType.u_ExtType.s_SysObj.Addr32();

else

((s_SpcLimit) u_Vector.s_Vector.dwVec_II).Addr32();

}

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