ia32(x86 : 486, 586, ...): команда - кандидат для условного исключения в ring3
void interrupt_point()
{
if (should_interrupt) syscall(USER_INTERRUPT_POINT);
}
Тогда соответствующая точка предпочтительного прерывания в коде будет помечаться вызовом:
Но хотелось бы более элегантного решения в виде:
Вопрос только в том: "Что написать вместо XOPCODE ?"
Примечание:
(1) Значение переменной should_interrupt устанавливается ядром операционной системы.
(1) Псевдокод в слиле C/C++ имеет ориентировочное значение - ищется именно ассемблерное решение, лучшее того, что описано в псевдокоде (другими словами - замена "CALL interrupt_point").
(2) Команда процессора "XOPCODE" (или серия команд)
- при одной комбинации флагов (управляющих регистров процессора, но в ring3) выполняться без исключений;
- при другой комбинации флагов (...) вызывает исключение.
P.S.
Кандидатурой может быть простое "MOV (0xf0000000), eax" :
- если к данному адресу подключена страница с правами write,то просто в начало будет записано значение eax;
- если страница не будет подключена - PAGE_FAULT (остаётся только отловить обращение именно к этому адресу)
Но опять таки хотелось бы чего-то более специализированного. Может быть "INT", "INTO"?
void interrupt_point()
{
if (should_interrupt) syscall(USER_INTERRUPT_POINT);
}
Тогда соответствующая точка предпочтительного прерывания в коде будет помечаться вызовом:
Но хотелось бы более элегантного решения в виде:
Вопрос только в том: "Что написать вместо XOPCODE ?"
Примечание:
(1) Значение переменной should_interrupt устанавливается ядром операционной системы.
Написан бред, ибо: прерывание и исключение две разные вещи, брякпоинты никто не отменял, да и вообще термин "точки предпочтительных прерываний" не существует. А вдруг автор говорит про реентерабильность?...
PS: Сформулируйте пожалуйста задачу, а не выдвигайте идей для решения абстрактного даже не коня в вакууме.
Ответ:
Существует ли (если существует, то какова (каковы))
Цитата:
"
(2) Команда процессора "XOPCODE" (или серия команд)
- при одной комбинации флагов (управляющих регистров процессора, но в ring3) выполняться без исключений;
- при другой комбинации флагов (...) вызывает исключение.
"
Цитата: "Неплохо бы вообще указать программное окружение"
Экспериментальная операционная система, например http://en.wikipedia.org/wiki/KolibriOS
Цитата: "прерывание и исключение две разные вещи, брякпоинты никто не отменял, да и вообще термин "точки предпочтительных прерываний" не существует"
Здесь Вы правы, терминологически в идентификаторе набор символов
"interrupt"
правильнее было бы заменить на "switch_context"
Для введения термина "точки предпочтительных прерываний" и ведётся поиск подходящего способа реализции.
В чём смысл этого термина? Например:
- точка вне критической секции,
- точка, переключение контекста в которой не требует сохранения (всех, или определённой части) регистров процессора,
- контрольная точка, по набору которых можно собирать статистику, контролировать тот факт, что процесс не зациклился,
...
P.S.
Вообще-то вопрос по системе команд процессоров линейки x86, при чём тут программное окружение, конкретная задача? Всё остальное я привёл просто для пояснения ...
- точка вне критической секции,
- точка, переключение контекста в которой не требует сохранения (всех, или определённой части) регистров процессора,
- контрольная точка, по набору которых можно собирать статистику, контролировать тот факт, что процесс не зациклился,
...
- Синхроннизация
- Частичное сохранение контекста, например без FPU, необходима аппарадная поддержка
- Детектирование дедлоков, вачдоги и иже с ними
Все это разные задачи с разными решениями.
Итого: Учим мат часть прежде чем заниматься "экспериментальными" операционными системами
PS: ну и как бонус "условный переход в правильное место", ну а если уж очень хочется access violation'а - CMOV по "правильному" адресу, остльные варианты можете и сами понапридумывать со всякими маджиками в регистрах у брекпоинта и тд.
Ну зачем же вы обламываете, это было задание на дом. =T_T=