Как по-разному используются LDT и GDT в Intel x86?
Я понимаю, что обе таблицы содержат дескрипторы сегментов, которые предоставляют детали доступа для каждого сегмента, включая базовый адрес, тип, длину, права доступа и т. Д.
Глядя на этот блог описывает различия следующим образом:
1. У GDT есть только одна копия в системе, в то время как у LDT может быть много
2. GDT может не изменяться во время выполнения, которое часто изменяется при переключении задач
3. запись LDT сохраняется в GDT. Записи в GDT и LDT имеют одинаковую структуру.
Как система по-разному использует эти структуры в реальной программе?
1 ответ
GDT используется для хранения блоков памяти, содержащих код супервизора, таких как обработчики прерываний / исключений, и блоков, используемых самим ядром, поэтому они являются общесистемными.
OTOH, многозадачная ОС должна хранить, где в памяти находятся блоки памяти, которые составляют определенную задачу. Для этого для каждой задачи можно использовать отдельный LDT. Процесс переключения включает загрузку другого LDT в регистр LDTR.
Каждая задача может видеть блоки памяти, дескрипторы которых либо указаны в текущем LDT, либо в GDT. Для доступа к памяти в режиме пользователя будут использоваться локальные дескрипторы. Для системных вызовов он может использовать различные методы, например инструкцию INT. Эта инструкция эффективно переходит к резидентному коду в дескрипторе из GDT. Я не могу вспомнить, являются ли шлюзы вызовов специфичными для GDT, или они также могут использоваться в LDT.