2015-10-20 10 views
2

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

Set RPL field of CS register to CPL; 

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

+1

Хороший вопрос, BTW. Когда я начал с этого, я задавался вопросом точно так же в течение нескольких месяцев. – Downvoter

+0

Спасибо, cad. Моя голова закручивается, однако, с такой большой вложенной информацией, встроенной в ваш ответ. Думаю, мне понадобилось бы несколько месяцев, чтобы ассимилировать их. Но мне нужно многое понять до этого, поскольку я скоро буду на подиуме учителя. – Kamalakshi

ответ

3

[...] Что такое CPL при переходе из реального режима в защищенный режим?

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

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

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

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

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


На самом деле, это не совсем верно. Читайте перевод информации о Unreal Mode.