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/ |