
ЭВУ 2 семестр / Презентации ЭВУ в пдф / Дескрипторы 2
.pdf
Дескрипторы и таблицы дескрипторов
Общие поля-характеристики для обеих групп дескрипторов:
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