Physics Faculty, Electronic Devices & Systems, 7th semester,2011
Dr. MokhovikovДескрипторы и таблицы(продолжение).
Lection №9
Дескрипторы и таблицы(продолжение).
Lection №9
Как работать в PM?
Дескрипторные таблицы
глобальная таблица дескрипторов
локальная таблица дескрипторов
таблица дескрипторов прерываний
Каждый дескриптор (элемент) таблицы описывает свой сегмент памяти.
Сегменты памяти не пересекаются!
Адрес начала каждой из таблиц (указатель на начало таблицы) хранится в специальных (программно доступных) регистрах процессора.
Указатели на таблицу глобальных дескрипторов (GDTR) и таблицу прерываний (IDTR) имеют размер 48 байт, 32 из которых указывают линейный адрес начала таблицы, а остальные 16 – ее размер (предел).
Дескрипторные таблицы — служебные структуры данных, содержащие дескрипторы сегментов
* - ограниченно совместим.
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
Локальная таблица (LDT) может быть собственной для каждой задачи и может содержать только дескрипторы сегментов, шлюзов задачи и вызовов. Сегмент недоступен задаче, если его дескриптора нет ни в LDT, ни в GDT.
Дескрипторные таблицы создаются и поддерживаются операционной системой.
Нулевой элемент этой таблицы процессором не используется.
Дескрипторные таблицы
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
D - бит разрядности выполняемых команд (для кодового сегмента):
0 – 16-разрядные;
1 – 32-разрядные
G - признак единицы измерения сегмента:
0 – в байтах;
1 – в страницах (по 4 Кб), при использовании страничной адресации памяти;
AVL - сегмент доступен для использования системным программным обеспечением (используются только ОС);
Дескрипторы
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
В байте управления доступом у этих дескрипторов бит Р определяет действительность (Р=1) или недействительность (Р=0) содержимого сегмента.
Поле уровня привилегий DPL используется только в дескрипторах сегментов состояния задач (TSS). Поскольку обращение к дескрипторам LDT возможно только по привилегированным командам, поле DPL для дескрипторов локальных таблиц не используется
. Поле ТYPE (1-3, 9-В) определяет тип сегмента.
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Расширенный тип введен для приведения всех типов дескрипторов разных групп к общему типу.
Он учитывает значение поля S - системный бит.
Дескрипторы
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
Для 2 группы дескриптор типа A является ограниченно совместимым c другими дескрипторами этой группы из-за наличия поля COUNT - количество параметров 5 бит. В принципе, это поле в других сегментах можно выделить как резерв.
!
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
«дескриптор системных объектов» - группа 2:
struct s_DSysObj
{
word wOffset_I;
word wSelector;
byte bCount;
byte bAttr;
word wOffset_II;
};
«вспомогательное представление дескриптора» - группы 1 и 2:
struct s_DVector
{
dword dwVec_I;
dword dwVec_II;
};
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
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);
};
Основная нагрузка для общего класса дескрипторов ляжет на создание дескриптора с заданным уровнем приоритета объекта, наличием в ОЗУ и расширенным типом, который описывается данным дескриптором и методами изменения этих параметров.
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
Значение типа уровня доступа находится в интервале 0..3, однако лучше всего будет сдвинуть его влево на 5 бит для удобства работы:
enum e_DPLevel
{
k_KLvl = 0,
k_DLvl = 1 << 5,
k_SLvl = 2 << 5,
k_ALvl = 3 << 5
};
Точно так же поступаем с типом e_SgmState, подменяющим флаг присутствия отождествляемого дескриптором объекта в оперативной памяти компьютера:
enum e_SgmState
{
k_Swap = 0,
k_RAM = 1 << 7
};
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
0. Пространство данных только для чтения с увеличением границы вверх
1. Пространства данных с возможностью записи с увеличением границы вверх
2. Пространство данных только для чтения с увеличением границы вниз
3. Пространство данных с возможностью записи с увеличением границы вниз
4. Пространство неподчиненного кода с запретом чтения
5. Пространство неподчиненного кода c возможностью чтения
6. Пространство подчиненного кода с запретом чтения
7. Пространство подчиненного кода c возможностью чтения
В этом случае преобразование e_SpcType -> s_SpcType будет выполняться сдвигом влево на один бит, с установкой бита 4,
S [Segment] = 1.
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
c_Descriptor *pc_DExample = GDT.DAlloc();
Вызов метода DAlloc (Allocate Descriptor) произведет необходимые действия с таблицей GDT:
1.Изменение части LIMIT регистра GDTR на длину дескриптора.
2.При необходимости, выделение дополнительной памяти под таблицу дескрипторов
3. Возвращение указателя на работоспособный дескриптор.
Далее, необходимо использовать конструктор дескриптора.
Случай 2 может потребовать манипуляций со страницами памяти, так как хотелось бы избавиться от излишнего перемещения данных из области GDT в новое место при нехватке памяти в заранее выделенной под GDT (при работе еще 16 битного кода загрузчика) куче, кратной размеру страницы [4Kb = 4096 байта].
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
Рассмотрим системный набор дескрипторов 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-ого бита. Таким образом, можно свести системные объекты в перечисление:
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
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();
}
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
inline c_Descriptor :: c_Descriptor(e_DPLevel e_Level, s_ExtType s_EType, e_SgmState e_State)
{
u_Vector.s_Dspace.bAttr_I = e_Level | s_EType | e_State;
}
Объединение типов s_SpcType и s_SysType дает расширенный тип:
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
Дескрипторы
extern Expand_ROR(dword dwBase);
#pragma aux Expand_ROR=\
"shr eax, 16"
"xchg ah, al"
"ror eax, 8"
parm [eax] \
value [eax] \
modify [eax];
Схема «эволюции» базового адреса с помощью макроса Expand_ROR
Таким образом, выделяются два вида владельцев дескрипторов: «системный объект» и «пространство». Они получают адрес дескриптора от объектов GDT, LDT, IDT, а затем осуществляют необходимые изменения в нем.
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы
#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
Дескрипторы
1. Код ядра, лежащий в ОЗУ в 32 р-р сегменте кода, с грануляцией в 1 байт и уровнем привилегий k_KLvl. Протяженность данного сегмента определяется длиной оставшегося участка кода от места исполнения процессором команды, являющейся первой после перехода в PM и очистки конвейера процессора межсегментным, длинным переходом (FAR JMP) на эту команду. Соответственно базовый адрес сегмента также должен начинаться с этой же команды. Таким образом, становится возможным избавиться от 16 р-р кода первичного загрузчика, освобождая участок ОЗУ. Тип сегмента - k_ERCode.
Дескрипторы и таблицы дескрипторов
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Дескрипторы и таблицы дескрипторов
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.
Дескрипторы и таблицы дескрипторов
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
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
Дескрипторы
Physics Faculty, Electronic Computing Devices & Systems, 7th semester,2012 Dr.Mokhovikov Alexander Yurievich
Используемая литература
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть