x86 Переход в защищенный режим из реального режима CPL (Current Privilege Level)

В x86 после того, как мы установили PE-бит CR0, мы выполняем дальний JMP, чтобы гарантировать изменение CS / EIP. Когда я смотрю на логический поток в руководстве программиста x86, соответствующий этой далекой инструкции JMP (защищенный режим), я вижу что-то вроде этого:

Set RPL field of CS register to CPL;

Я хочу убедиться, что уровень привилегий равен 0. Предположим, DPL также равен 0 в дескрипторе, а RPL в селекторе в дальнем JMP также равен 0. Бит C равен 0 в дескрипторе, так что это случай сегмента несоответствующего кода. В руководстве сказано, что CPL - это два последних бита в CS. Это означает, что перед дальним JMP CS должен содержать значение, последние два бита которого равны 00. Итак, когда я изначально нахожусь в реальном режиме, должен ли я убедиться, что CS имеет некоторое значение, которое соответствует этому условию, прежде чем я выполнить дальний JMP? Если бы я перефразировал это, каков CPL, когда мы переключаемся из реального режима в защищенный?


person Kamalakshi    schedule 20.10.2015    source источник
comment
Хороший вопрос, кстати. Когда я начал с этого, я много месяцев задавался вопросом о том же.   -  person cadaniluk    schedule 20.10.2015
comment
Спасибо, кадил. У меня голова кружится от такого количества вложенной информации, встроенной в ваш ответ. Думаю, мне тоже понадобится несколько месяцев, чтобы их усвоить. Но мне нужно многое понять перед этим, так как скоро я буду на подиуме для учителей.   -  person Kamalakshi    schedule 20.10.2015


Ответы (1)


[...] что такое CPL, когда мы переключаемся из реального режима в защищенный?

CPL установлен на некоторое значение, соответствующее «потребностям» реального режима (я полагаю, что оно равно нулю), пока активен реальный режим. При переходе в защищенный режим ему присваивается значение двух младших битов селектора сегмента.

[...] должен ли я убедиться, что CS имеет какое-то значение, которое соответствует этому условию, прежде чем я выполню дальний JMP?

Нет, это не имеет значения. Технически ЦП интересуют не значения из сегментных регистров, а их теневые регистры, «кэш дескриптора сегмента». Эти теневые регистры содержат RPL, DPL, CPL, базовый адрес и все, что есть в дескрипторе сегмента. Значения, которые не требуются в реальном режиме (например, RPL), устанавливаются на значения, подходящие для реального режима. При переключении из реального режима в защищенный режим значения, которые не требуются в реальном режиме, становятся необходимыми и инициализируются значениями, полученными из GDT. При переключении обратно в реальный режим значения, относящиеся к защищенному режиму, снова становятся неактуальными, и им присваиваются определенные значения 1.

В конце концов, ЦП читает непосредственно из кэшей дескрипторов сегмента, а не из регистров сегмента.

Для получения дополнительной информации по этой теме прочтите это и связанные с ним документы.


1 На самом деле это не совсем так. Прочтите о режиме Unreal.

person cadaniluk    schedule 20.10.2015