OSDev
http://osdev.ru/

Переход в userspace
http://osdev.ru/viewtopic.php?f=6&t=3736
Страница 1 из 1

Автор:  Sebt [ 24 май 2019, 19:35 ]
Заголовок сообщения:  Переход в userspace

Добрый вечер!

Загрузил в память скомпилированную программу. Проверил все ли заголовки верные. Поместил загрузочный сегмент в 0x02000000. Пытаюсь сделать "скачок". Получаю ошибку страницы с адресом примерно 0x57f00000. Откуда он вообще взялся ума не приложу. location равен 0x02000000. Если указывать адрес тот, где ранее, так скажем, остановился ошибок уже не наблюдаю и переход успешен, ибо вызов системных вызовов проходит.
Код:
   asm volatile(   "mov $0x23, %%ax \n"
            "mov %%ax, %%ds \n"
            "mov %%ax, %%es \n"
            "mov %%ax, %%fs \n"
            "mov %%ax, %%gs \n"
            "mov %%esp, %%eax \n"
            "pushl $0x23 \n"
            "pushl %%esp \n"
            "pushf \n"
            "pushl $0x1B \n"
            "pushl %0 \n"
            "iret \n"
            : : "r"(location));


Заранее благодарю за помощь и советы!

Автор:  SII [ 25 май 2019, 03:21 ]
Заголовок сообщения:  Re: Переход в userspace

Особо не посоветую, ибо тонкости IA-32 давным-давно позабыл (работаю-то не с ними). Но помню, что при переключении "колец защиты" (как понимаю, Вы пытаетесь перейти с 0 на 3 -- обычно же их используют для кода ядра и кода пользователя соответственно) участвует TSS; соответственно, она должна быть правильно заполнена, а её адрес загружен в соответствующий регистр. В частности, в TSS лежат значения указателей стеков -- если не для всех четырёх "колец защиты", то, по меньшей мере, для 1-3.

Кроме того, я не уверен, что информация, которая должна быть восстановлена при возврате из "прерывания" с целью перехода с 0 в 3 кольцо (а точней, с любого кольца в любое другое менее привилегированное), должна лежать в стеке, из которого осуществляется переход (именно так обстоит дело в M-профиле процессоров ARM -- там при прерывании кое-какие регистры сохраняются в стеке прерванного кода, а не в стеке ядра, и лишь после их сохранения происходит переключение стеков; соответственно, при возврате из прерывания происходит переключение стеков, а затем уже восстановление регистров). Но это надо читать в документации на IA-32.

Автор:  abondarev [ 25 май 2019, 13:00 ]
Заголовок сообщения:  Re: Переход в userspace

Извините, не очень понял, что происходит, но по ассемблерной инструкции iret могу предположить, что это попытка выйти из прерывания? Тогда нужно смотреть откуда вы туда вошли, там должен быть настроен стекфрейм например.
Если Вы находитесь в защищенном режиме и требуется перейти в userspace, то это же делается просто установкой соотвествующих битов в psr?

Автор:  Sebt [ 25 май 2019, 17:31 ]
Заголовок сообщения:  Re: Переход в userspace

Спасибо большое за ваши ответы!
Как оказалось я все делал правильно, а результат не получал потому что перепутал номер системного вызова. Крайне глупо. Изначально считал, что переход вовсе не осуществлялся. Однако ошибка страницы никуда не ушла и адрес где то в ядре. Но это совсем другой вопрос. Спасибо еще раз!

Автор:  phantom-84 [ 06 июн 2019, 21:47 ]
Заголовок сообщения:  Re: Переход в userspace

abondarev писал(а):
Если Вы находитесь в защищенном режиме и требуется перейти в userspace, то это же делается просто установкой соотвествующих битов в psr?
iret - вполне обычный запуск прикладного кода.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/