Каков теоретический пример использования GDT?

Я следую прохождению GDT. Я могу понять, как реализована структура данных и ее назначение.

Однако я не понимаю, как используется GDT. В каком сценарии ЦП необходимо загрузить сегмент и как это делает GDT? Если GDT участвует в прерывании, управляемом клавиатурой, это был бы отличный пример для объяснения.


person Elliot    schedule 28.04.2019    source источник


Ответы (2)


GDT или Global Descriptor Table содержит информацию о сегментах памяти. Адрес GDT хранится в одном из специальных регистров под названием GDTR. Каждый сегмент соответствует области памяти. Назначение сегмента — обеспечить аппаратную защиту памяти. ЦП на самом деле не загружает весь сегмент, поскольку сегмент обычно относится к области памяти. Скорее, когда вы используете один из сегментных регистров (CS, DS, SS и т. д.) со смещением для адресации области памяти, ЦП будет выполнять проверку информации, хранящейся в GDT. Например, если вы установили один из сегментов как доступный только для чтения, то позже вы попытаетесь записать в него, процессор предотвратит доступ. Для сегмента использования системы GDT задействуется каждый раз, когда кто-то обращается к памяти.

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

person PassingBy    schedule 08.05.2019

Для современной ОС, которая не использует сегментацию (много); вы, вероятно, обнаружите, что GDT содержит:

  • 2 или 3 дескриптора для кода «CPL=0» и «CPL=3» (если 64-битная ОС поддерживает более старые 32-битные процессы, то она, вероятно, будет иметь «32-битный код CPL=3» и «64-битный CPL). =3 код", в дополнение к "64-битный код CPL=0")
  • дескриптор стека "CPL=0"
  • дескриптор для стека и данных "CPL=3"
  • дескриптор для ЦП для ЦП TSS (сегмент состояния задачи)
  • для 32-разрядных (не так много для 64-разрядных, где вы можете использовать swapgs) один или два дескриптора на ЦП, которые используются для поиска «локальных данных ЦП» и/или «локальных данных потока»
  • (необязательно, менее вероятно); дескриптор, определяющий шлюз вызова для API ядра
  • (опционально, для специальных целей); один или несколько дескрипторов, описывающих LDT (иногда используются для эмуляции)

Для других операционных систем GDT может содержать что угодно.

person Brendan    schedule 08.05.2019