Такой вопрос возник. Если на двух процессорах одновременно возникнут два одинаковые исключения, вход в ISR выполняется атомарно или нет ?
кстати одна и та же ISR может выполняться и на одном процессоре в разных ипостасях (можно сказать контекстах но не совсем в привычном смысле слова) при соблюдении некоторых условий
green Обоснуй пожалусто это. SashaTalakin Имхо бред, при входе в обработчик прерываний/исключений прерывания запрещаются, если они запрещены то планирование не происходит.
Обосную вопрос подробнее. Задача следующая. Допустим у нас в системе руткит или какойто ядерный перехватчик, он перенаправил один из 5 ядерных калбаков на какойто адрес. По причине того, что при возврате в юзермод взводится RF, трассироввочное исключение может быть сгенерировано только после исполнения первой инструкции каждого диспетчера, что не позволяет определить оригинальный адрес хэндлера([KeUserXX]). Я решил использовать весьма хитрый механизм. Если кратко, то установить для всех страниц модуля ntdll атрибут PAGE_GUARD, что позволяет избежать зацикливания диспетчера исключений. Когда поток на него возвратится(при вызове исключения) тутже генерируется STATUS_GUARD_PAGE_VIOLATION, со страницы в которой находится диспетчер исключений снимается атрибут PAGE_GUARD и происходит повторный вход в диспетчер исключений и его стековый фрейм содержит указатель на инструкцию вызвавшую исключение, а это и есть реальный адрес ядерного калбака. Но тут возникает проблема. Так как в ядре при обработке исклбючений не используются спин-блокировки и пр., до возврата в юзермод на диспетчер исключений никакие атомарные операции не выполняются. Поэтому если в процессе работают несколько потоков, причём на разных процессорах и они одновременно войдут в диспетчер исключений, то не понятно какой поток снимет со страницы атрибут PAGE_GUARD и вызовет это исключение. Решил установить аффинитет процесса в единицу, разрешив исполняться потокам только на одном процессоре, но этот механизм требует много времени, поэтому иной поток может изменять аффинитет, что приведёт к краху. Изза этого необходимо определить, является ли вход в хэндлер исключений атомарной операцией.
Во-первых это не так, обработчики прерываний могут отключать на входе прерывания а могут и не отключать. Во-вторых если посмотришь в дизассемблере некоторые Windowsовские ISR, вход в которые сопровождается запретом прерываний то сможешь заметить что там иногда встречается sti..cli фрагменты. В-третьих совершенно непонятно откуда вообще взялась мысль о том что в одно и тоже прерывание нельзя влезать несколько раз тем более с разных процессоров
Хорошо, заюзою аффинитет. Хотя уменьшит гибкость и внесёт возможность обхода в механизм, тоесть уязвимость, но это позволит избежать критических ошибок.