Как вызывается GDT? - PullRequest
       87

Как вызывается GDT?

1 голос
/ 28 января 2020

Я знаю, как реализован GDT (Global Descriptor Table) и использование регистров сегментов и дескрипторов сегментов. Однако как / когда осуществляется доступ к записи GDT?

Доступ к ней осуществляется в базовых c инструкциях mov, таких как

mov [eax],ebx 

Не вызывает ли это неявный вызов регистра сегмента ds, а затем доступ к дескриптору сегмента GDT или есть какой-то другой способ, посредством которого происходит доступ к записи GDT?

1 Ответ

4 голосов
/ 28 января 2020

TL; DR : Глобальная таблица дескрипторов (GDT) или локальная таблица дескрипторов (LDT) доступны только тогда, когда в регистр сегмента загружается новый селектор (независимо от того, является ли он то же значение или другое значение) в защищенном режиме или в длинном режиме. Бит 2 загружаемого значения селектора определяет, будут ли использоваться GDT (бит 2 очищен) или LDT (бит 2 установлен), чтобы определить, откуда дескриптор считывается.


GDT ( или LDT) будет запрашиваться информация в записи дескриптора при загрузке регистра сегмента (CS / DS / ES / SS / FS / GS) (с новым значением или тем же значением), когда в 16/32-битном защищенном режиме или длинном режиме. Инструкции, которые могут загружать значение в регистр сегмента: POP, MOV, JMP (далеко), CALL (далеко), RET (далеко). ИРЭТ.

В реальном режиме GDT / LDT не напрямую обращается, когда регистр сегмента загружается с новым значением.

Загрузка регистра сегмента с помощью селектора будет вызвать соответствующий уровень привилегий и проверку прав доступа, чтобы определить, является ли он действительным в контексте, в котором он используется. База, лимит и права доступа дескриптора будут загружены в кэш дескриптора сегмента , связанный с каждым из регистров сегмента.

кэш дескриптора сегмента является скрытой частью ЦП, которая существует для ускорения доступа к памяти, так что информация дескриптора не должна перезагружаться из памяти для каждой инструкции, которая обращается к памяти. Когда вы делаете что-то вроде:

mov [eax], ebx

CPU запишет 32-битное значение в EBX в адрес памяти DS:[eax] (где EAX содержит смещение для чтения). Существует неявный сегмент (ы), связанный с каждым доступом к памяти, если он не переопределен. По умолчанию для инструкции MOV с адресом памяти используется DS (или SS, если адрес памяти использует EBP в качестве базы ). Поскольку информация, необходимая о селекторе в сегментном регистре, кэшируется в ЦП, GDT (или LDT) не запрашивается напрямую, когда инструкция имеет операнд (ы) памяти.

...