Какая польза от определения таблицы глобальных дескрипторов?
Я прочитал учебник по GDT (Global Descriptor Table), который определяет GDT как "тот, который определяет базовые привилегии доступа для определенных частей памяти". Это означает, что GDT используется для защиты памяти.
Выполняет ли он какие-либо другие задачи, кроме указанных выше?
Это необходимо для реализации GDT в операционной системе?
Короче говоря, было бы лучше, если бы кто-нибудь мог более подробно разобраться с ГРП.
Спасибо
2 ответа
Все изображения были взяты из Руководства Intel 3A, §5.1.
Для получения более подробной информации OP должен прочитать это руководство, здесь я приведу лишь некоторые концепции, упрощенные для краткости и во избежание ответа только по ссылке.
Как следует из названия, глобальная таблица дескрипторов представляет собой массив дескрипторов, доступных для указания и определения общесистемных ресурсов (следовательно, описывают эти ресурсы).
Чаще всего ресурс является областью непрерывной памяти, но есть и другие виды очень важных ресурсов.
Таксономия дескрипторов
Descriptors
Non system descriptors
Code segment descriptor
Data segment descriptor
Stack segment descriptor (Alias of the previous)
System descriptors
System segment descriptors
LDT segment descriptor
TSS segment descriptor
Gate descriptors
Call gate descriptor
Interrupt gate descriptor
Trap gate descriptor
Task gate descriptor
Помимо GDT, существует еще одна таблица - таблица локальных дескрипторов, которая описывает ресурсы, предоставляемые ОС только для определенных контекстов.
Дескриптор идентифицируется его таблицей (GDT или LDT) и его положением в таблице, его индексом.
Такой индекс записывается в специальные регистры, называемые регистрами селектора (ранее известные как регистры сегментов).
Каждая инструкция, которая обращается к памяти неявно или явно, использует один из селекторов.
xor eax, eax ;eax is zero
xor esp, esp ;esp is zero
xor ebx, ebx ;ebx is zero
mov ecx, DWORD [eax] ;Use DS selector (implicit)
mov ecx, DWORD [esp] ;Use SS selector (implicit)
mov ecx, DWORD [fs:ebx] ;Use FS selector (explicit)
Все эти инструкции читают логический адрес 0, но ЦП использует дескриптор для вычисления нового адреса, называемого линейным адресом, и проверки безопасности.
Таким образом, эти три инструкции могут в конечном итоге прочитать совершенно разные адреса.
Каждый селектор также определяет привилегию, которая должна использоваться при выполнении операции.cs
Селектор является особенным, потому что он не может быть изменен больше (это было некоторое время на самом деле) с mov
но только с инструкцией ветки (jmp
, ret
, call
...)
Его назначение не только для использования при извлечении кода, но и для уровня привилегий кода.
Этот уровень привилегий используется ЦП для проверки возможности доступа к ресурсу (с запрошенной привилегией), проверки не всегда тривиальны.
Как вы увидите, каждый дескриптор имеет поле DPL для установки своего уровня привилегий.
Таким образом, они являются формой защиты.
Несистемные дескрипторы
Несистемные дескрипторы используются для определения областей памяти, предназначенных для хранения кода или данных вместе с их атрибутами.
Как видите, цель такого рода дескрипторов состоит в том, чтобы обозначить область памяти и прикрепить к ней некоторые атрибуты.
В частности, базовый адрес, лимит (размер), привилегия, необходимая для доступа к нему (поле DPL, проверки на самом деле более сложны, чем эта), размер кода (только код), если чтение и запись разрешены и т. Д. на.
Длинный режим (64 бита) изменил способ интерпретации атрибутов, остерегайтесь этого.
Системные дескрипторы
Системные дескрипторы используются ОС для управления программами пользовательского режима.
Системные дескрипторы сегментов
Эти дескрипторы определяют область памяти, используемую для хранения LDT, и другую структуру, называемую сегментом состояния задачи (механизм, предоставленный Intel для облегчения переключения задач).
В системе может быть несколько таких структур, выбранные из которых обозначаются регистрами ldtr (регистр LDT) и tsr (регистр TS).
Дескрипторы ворот
Они используются для передачи управления другому (более или менее привилегированному) коду.
Вызов ворот
Если вы посмотрите на картинку, то увидите, что шлюз вызова по сути является метадескриптором, он указывает селектор и смещение в области, обозначенной этим дескриптором, а также привилегии.
Он используется для передачи управления привилегированным процедурам.
call fs:0badbabeh
Если предположить, fs
содержит индекс шлюза, процессор вообще не будет использовать непосредственный адрес 0badbabeh, вместо этого он будет использовать информацию о самом вентиле.
Ворота прерывания и ловушки
Они используются с прерываниями, разница между ними в том, что первый сбрасывает флаг if, а второй нет.
Они очень похожи на вызов ворот.
Эти дескрипторы фактически помещаются в другую таблицу, обычно в таблицу дескрипторов прерываний.
Эта другая таблица не индексируется селекторами, а номерами прерываний.
Если я правильно помню, их также можно поместить в GDT/LDT и использовать как другие ворота.
Ворота задач могут быть использованы для выполнения переключения задач.
Задача ворот
Они похожи на ворота вызова, но передают управление новой задаче (переключение задач).
Некоторые ресурсы не просто область памяти, они могут быть воротами
Позвольте мне дать вам два ответа на ваш вопрос:
Ответ № 1: В 64-разрядной системе Intel глобальная таблица дескрипторов не служит никакой полезной цели.
Ответ № 2: В 16-разрядной версии Intel глобальная таблица дескрипторов содержала дескрипторы для объектов, общих для всех процессов в системе. Локальные таблицы дескрипторов сделали то же самое для тех, которые используются отдельным процессом. Может быть несколько LDT (по одному на процесс), но только один GDT, совместно используемый всеми процессами (хотя в теории можно изменить GDT для разных процессов).
В 32-разрядной версии Intel GDT и LDT были необходимы для запуска устаревшего 16-разрядного кода в 32-разрядных системах.
Если вам не нужно иметь дело с 16-битными приложениями, изучение GDT и LDT так же полезно, как и изучение работы с перфокартами.