Регистры дескрипторов чаще называют кешем дескрипторов.Вместо чтения соответствующего дескриптора из глобальных или локальных таблиц дескрипторов (GDT / LDT) в памяти каждый раз, когда регистр сегмента используется в операнде памяти, дескрипторы считываются из GDT / LDT только при загрузке регистра сегмента.(Обратите внимание, что все операнды памяти используют регистр сегмента, неявно или явно, поэтому, если бы он не работал таким образом, процессор будет намного, намного медленнее.)
Побочным эффектом этого является то, что возможнокэши дескрипторов не должны синхронизироваться с текущими значениями селекторов, загруженными в регистры сегментов.Например, если инструкция LGDT используется для изменения адреса GDT, кэш дескриптора не обновляется и все еще содержит значения дескриптора из старого GDT.
То же самое происходит при переключении режимов, например, из реальногоиз режима в защищенный режим или из защищенного режима в длительный режим (то, что Intel называет режимом IA-32e).После перехода из реального режима в защищенный режим кэш дескриптора все еще имеет старые основы реального режима, ограничения и права доступа.Это важно, потому что регистры сегментов также все еще содержат значения реального режима, которые вряд ли будут действительны в защищенном режиме.В частности, он позволяет получить следующую инструкцию в CS: EIP, даже если CS содержит недопустимый селектор.Кэш дескриптора CS по-прежнему содержит действительные значения, указывающие на то же место, что и до изменения режима.
Переход из защищенного режима в длинный режим работает аналогично, за исключением того, что большинство значений в кэше дескрипторов игнорируются в длинном режиме.Вместо этого фиксированное основание 0 используется для всех сегментов, кроме FS и GS, и проверки пределов не выполняются.Это означает, что код, который переключается в длинный режим, должен использовать сегмент кода с базой 0, чтобы эффективная база CS не изменилась.