· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› банальный вопрос

Посл.отвђт Сообщенiе


Дата: Ноя 10, 2004 03:26:15

что будет при iret из ring0 в ring3 если страница куда идет возврат выгружена из памяти?


Дата: Ноя 10, 2004 05:35:14

Если я правельно помню, то зависет от ОС.
Проц тока сгенерирует исключение... а дальше ОС , например может загрузить страницу в память и передать туда управление, или выдать ошибку.


Дата: Ноя 10, 2004 07:56:00

Кроме того, способ передачи управления также может быть разным.

Например, если установлен флаг Nested Task, то iret будет переключать задачу по backlink в TSS.


Дата: Ноя 10, 2004 08:45:53

дело в том что я ось и пишу. потому стало интересно что будет при вызове ядром функции callback'а если его код не подгружен в память.


Дата: Ноя 10, 2004 15:34:22

Использовать iret для callback?
"Оригинально-с" (с) проучик Ржевский. ;)

Как известно, переход с одного уровня на другой - дело не простое. Для этого у процессора есть несколько механизмов. Какой именно будет использоваться?

И почему для совершения действия выбрана именно команда iret?


Дата: Ноя 10, 2004 20:12:14

потому что в книжке зубкова русским по белому написано - на третий уровень управление передается только по iret и не хочу я стек ядра трогать! пусть останется как есть на момент вызова.


Дата: Ноя 10, 2004 21:10:07

В доке INTEL написанно(в рамках моего знания английского :)) что и RET и IRET могут менять приоретет, тока ret извлекает из стека dw а IRET ещё и значения сегменто(вроде).


Дата: Ноя 11, 2004 00:32:22

флаги она извлекает!!


Дата: Ноя 11, 2004 06:48:28

Narkomanius, ладно флаги, не суть важно.


Дата: Ноя 11, 2004 09:55:11

дык все таки. call в немапаную память себя как ведет например? он выполнится, после чего последует #PF, или
#PF произойдет первее?


Дата: Ноя 11, 2004 22:52:55

Narkomanius

Вот смотри, первоначальный вопрос был типа: "я хочу написать ось, и хочу чтобы там были callback с помощью iret, как это сделать?". Трудно ответить что либо, кроме "так в чём проблема?".

В больших мануалах описание команды iret содержит одну страницу текста и ПЯТЬ страниц псевдокода формального описания её действия в самых различных ситуациях. В защищённом режиме эта команда может выполнять пять различных действий в зависимости от ситуации:
-- возврат из V86
-- возврат в V86
-- возврат в тот же уровень привилегий
-- возврат в другой уровень привелегий
-- переключение задачи из Nested Task.
Следовало бы уточнить какая именно ситуация подразумевается. ;)

Теперь вдруг выясняется, что вопрос в том, произойдёт #PF "до или после". Если собственно возврат произошёл успешно, то конечно же #PF произойдёт после него. Я сильно удивлюсь если кто-нибудь скажет (и докажет) обратное. Однако, ключевое слово здесь "возврат произошёл успешно". Если исключение возникает при попытке обращения к стеку для того, чтобы достать из него адрес возврата, то исключение, очевидно, произойдёт до того как совершится возврат...

Моя любимая глава в больших мануалах (и как раз по теме) это "Interrupt and Exception handling" из третьего тома. Каждый раз как я читаю её, всегда нахожу что-то новое (и говорю "ни фига себе", как мужик из анекдота, который читал орфографический словарь). Рекомендую.

Например, знаешь ли ты, что все прерывания и исключения делятся на три категории: benign, contributory, page fault?

Кстати, когда-то тому назад у меня был вопрос на похожую тему вот здесь:
http://www.wasm.ru/forum/index.php?action=vthread&forum=7&topic=5365
и мне тоже никто не ответил. :(
Поэтому мне кажется, что этот форум не очень подходит для оживлённых творческих дискуссий о тонкостях системной архитектуры IA-32. Поэтому остаётся только один путь - самостоятельные эксперименты. С помощью экспериментов затруднительно сделать только две вещи:
-- посмотреть как там в процессоре инструкции спариваются ;)
-- расколоть пропатчивание микрокода.
Всё остальное - решаемо. Нужно только чётко понимать цель и смысл своих действий...


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038