push ADATA ; usermode data/stack selector (RPL=3)
push UserModeStackPointer
push ACODE ; usermode code selector (RPL=3)
push UserModeInstructionPointer
retf
Передача управления непривилигированному коду
Как передать управление непривилигированному коду в защищённом режиме?
в защищённом режиме нельзя передать управление менее привилегированному коду, возможно только вернуться в менее привилегированный код.
Код:
То есть после retf процессор сам настроит SS и ESP? Насколько мне известно retf изменяет только CS и EIP
Насколько я знаю, при возврате из другого кольца, регистры ss,esp восстанавливаются из таблицы TSS
Твои знания в этом вопросе неверны. SS:ESP выбирается из TSS при передаче управления более привилегированному коду и как раз во время этой передачи в привилегированном стеке сохраняется SS:ESP исходного стека, а при возврате восстанавливается.
Я уже узнал про это. Но всё равно происходит ошибка. Я тестирую на вирутальной машине Bochs, он сообщяет об ошибке извлечения SS и ESP из TSS.
код покажи.
Код:
pushd 35 ; Селектор данных
pushd 0x1FFC ; База у сегмента 2 МБ
pushd 27 ; Селектор кода
pushd 0 ; База у сегмента 2 МБ
retf
pushd 0x1FFC ; База у сегмента 2 МБ
pushd 27 ; Селектор кода
pushd 0 ; База у сегмента 2 МБ
retf
Описание сегмента кода 3-его кольца
Код:
dw 0xFFFF,0
db 0x20,11111010b,0xCF,0
db 0x20,11111010b,0xCF,0
Описание сегмента данных 3-его кольца
Код:
dw 0xFFFF,0
db 0x20,11110010b,0xCF,0
db 0x20,11110010b,0xCF,0
Это при отключенной страничной адресации. При включенной происходит page fault (CR2 = 0x200000). При условии, что страница подключена к этому адресу. Может я что то напутал с флагами для этой страницы для установил 0-ой, 1-ый и 2-ой биты. Или для разрешения доступа пользователя к страницы используется не 2-ой бит (в других ошибки скорее всего нет - при доступе из привилигированного кода page fault не случается). Bochs пишет последнюю инструкцию. В случае со страничной адресацией она является первой инструкцией в пользовательском сегменте кода. Выполнится она не успевает (в режиме отладки это видно - retf и сразу же ошибка).
По тому, что ты показал, ошибку выявить трудно. Ты уверен, что дескрипторы прикладных сегментов находятся на нужном месте в GDT? Может, все-таки первая команда прикладного кода приводит к ошибке. Еще вариант... если у тебя прерывания не запрещены, а SS0:ESP0 в текущей TSS не настроен, то первое же прерывание при выполнении непривилегированного кода приведет к ошибке.
Я кое-что переделал и теперь page fault не происходит. Сегменты расположены правильно, это точно. Прерывания разрешены. Попробую настроить ss0:esp0.