Не совсем понятно, что имеется в виду, но предположу, что нужно выполнить код, находящийся в третьем кольце, причем сразу после перехода в защищенный режим. Если так, то должна помочь инструкция 'far ret' вместо первого 'jmp far'. Стек, соответственно, надо подготовить заранее.
Вообще после mov cr0, xxxxx, устанавливающей PE, проц уже в защищенном режиме и однозначно в нулевом кольце. А дальше far ret, iret, sysexit - как угодно, для передачи управления в 3 кольцо. Как сделать, чтобы после mov cr0, xxxxx проц был сразу 3 кольце - хз. Есть правда мысля - зайти в протмоду, вернуться обратно в реал, установив в атрибутах сегментов реального режима DPL = 3, т.е. по сути перейти в unreal mode. Вроде должно прокатить, но не факт, да и непонятно какая практическая ценнность подобного изврата.
Не уверен, что в таком случае проц позволит выполнить mov cr0,xxxxx. В анриалмоде вообще много странностей, надо посмотреть.
Medstrax А собственно почему однозначно в нулевом? ИМХО все зависит от дескриптора кода - если там DPL=0, то в нулевом, а если DPL=3, то в третьем... jmp far -то делается не в космос, а во вполне определенный сегмент...
После mov cr0,.... до команды jmp (ну или любой другой, вызывающей загрузку нового селектора) привилегии остаются теми же, что были и в реалмоде, т.е. DPL = 0. И сама команды jmp выполняется на этом же уровне привилегий.
Где то читал, что процессор, сразу после перехода в защищенный режим, хавает только одну инструкцию, это jmp far, так как эта инструкция попадает на конвеер вместе с коммандой mov cr0, ..., любая другая комманда попавшая на конвеер после мов и приводящая к чтению памяти выведет процессор в неопределенное состояние... я это ниразу не проверял, кто проверял поделитесь результатами...
Pushkoff Нет, процессор продолжает работать, как обычно. JMP не обязательно ставить сразу после переключения в защищённый режим, но надо хорошо представлять себе, что делаешь, поскольку переход нужен для занесения новых значений в теневые регистры селекторов и для очистки очереди предвыбранных команд -- в общем, для продолжения выполнения "с чистого листа" в соответствии с новым режимом. Поэтому обычно лучше перестраховаться и выполнить переход сразу после переключения режима.
Pushkoff, действительно ты ошибаешься. После включения защищенного режима мы обычно находимся в 16-разрядном кодовом сегменте для чтения/исполнения с базой, унаследованной из реального режима и лимитом 0xFFFF (на самом деле наследуются все эти параметры, просто в реальном режиме обычно они являются именно такими), CPL=0. Переход выполняют во-первых для того, чтобы оказаться в 32-разрядном кодовом сегменте, а во-вторых, чтобы избавиться от совершенно неактуального значения нетеневой части регистра CS.
Насчет CPL не уверен, поэтому и написал отдельно. К тому же я где-то читал, что на i386 лимит сегмента кода в реальном режиме принудительно устанавливается равным 0xFFFF, но кто их сейчас использует в ПК...