OSDev
http://osdev.su/

Обработка прерываний.
http://osdev.su/viewtopic.php?f=6&t=501
Страница 1 из 1

Автор:  418ImATeapot [ 27 фев 2012, 13:33 ]
Заголовок сообщения:  Обработка прерываний.

У меня совершенно чайниковский вопрос. Сейчас начал переписывать и понял, что я не знаю:
Как правильно войти в ring3?

Сейчас я использую SYSEXIT, но прерывания так не обработать.

Автор:  pavia [ 27 фев 2012, 14:25 ]
Заголовок сообщения:  Re: Обработка прерываний.

Цитата:
Как правильно войти в ring3?

Надо установить CPL=3, других способов нет. А ещё лучше чтобы во всех сегментных регистрах DPL=3.

Цитата:
Сейчас я использую SYSEXIT, но прерывания так не обработать.

Кто сказал?

Цитата:
Чтобы вернуться из процедурного обработчика исключения или прерывания, обработчик должен использовать команду IRET (или IRETD). Команда IRET подобна команде RET за исключением того, что она восстанавливает сохраненные флаги в регистре EFLAGS. Поле IOPL регистра EFLAGS восстанавливается, только если текущий уровень привилегий - 0. Флаг IF изменяется, только если текущий уровень привилегий меньше или равен чем уровень привилегий ввода-вывода (IOPL). Чтобы получить полные описания операций выполняемых командой IRET, то см. Главу 3, “Справочная информация о системе команд A-M", из руководства разработчика программного обеспечения архитектур Intel® 64 и IA-32, Том 2A. Если при вызове процедурного обработчика произошло переключение стека, то команда IRET возвращает исходный стек на место по возвращению.

http://ru.osdev.wikia.com/wiki/IAM:Глава_5

Автор:  418ImATeapot [ 27 фев 2012, 14:40 ]
Заголовок сообщения:  Re: Обработка прерываний.

Как установить CPL? Ведь при ирете на сегмент с меньшими привилегиями - ГП!

Автор:  pavia [ 27 фев 2012, 15:40 ]
Заголовок сообщения:  Re: Обработка прерываний.

Цитата:
Ведь при ирете на сегмент с меньшими привилегиями - ГП!

Ошибаетесь. Правильная фраза звучит так

Цитата:
IF return code segment selector RPL < CPL
THEN #GP(selector); FI;

Для возврата требуемый уровень ставим RPL=3
Текущий уровень CPL=0.
Условие не выполняется никаких GP нет.

Автор:  418ImATeapot [ 27 фев 2012, 16:00 ]
Заголовок сообщения:  Re: Обработка прерываний.

00045748837e[CPU0 ] check_cs(0x0018): non-conforming code seg descriptor dpl != cpl, dpl=3, cpl=0

00045748837e[CPU0 ] check_cs(0x0018): conforming code seg descriptor dpl > cpl, dpl=3, cpl=0

И почему-то CS неправильно сохраняется в стеке (глюк sysexit)?

Автор:  418ImATeapot [ 27 фев 2012, 16:29 ]
Заголовок сообщения:  Re: Обработка прерываний.

Разобрался, спасибо большое.

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