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) не запрашивается напрямую, когда инструкция имеет операнд (ы) памяти.