Атомарность исключений.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Clerk, 17 фев 2009.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Такой вопрос возник. Если на двух процессорах одновременно возникнут два одинаковые исключения, вход в ISR выполняется атомарно или нет ?
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Clerk
    Код ISR может выполняться одновременно на нескольких процессорах.
     
  3. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    кстати одна и та же ISR может выполняться и на одном процессоре в разных ипостасях (можно сказать контекстах но не совсем в привычном смысле слова) при соблюдении некоторых условий
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    green
    Обоснуй пожалусто это.
    SashaTalakin
    Имхо бред, при входе в обработчик прерываний/исключений прерывания запрещаются, если они запрещены то планирование не происходит.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Обосную вопрос подробнее. Задача следующая. Допустим у нас в системе руткит или какойто ядерный перехватчик, он перенаправил один из 5 ядерных калбаков на какойто адрес. По причине того, что при возврате в юзермод взводится RF, трассироввочное исключение может быть сгенерировано только после исполнения первой инструкции каждого диспетчера, что не позволяет определить оригинальный адрес хэндлера([KeUserXX]). Я решил использовать весьма хитрый механизм. Если кратко, то установить для всех страниц модуля ntdll атрибут PAGE_GUARD, что позволяет избежать зацикливания диспетчера исключений. Когда поток на него возвратится(при вызове исключения) тутже генерируется STATUS_GUARD_PAGE_VIOLATION, со страницы в которой находится диспетчер исключений снимается атрибут PAGE_GUARD и происходит повторный вход в диспетчер исключений и его стековый фрейм содержит указатель на инструкцию вызвавшую исключение, а это и есть реальный адрес ядерного калбака. Но тут возникает проблема. Так как в ядре при обработке исклбючений не используются спин-блокировки и пр., до возврата в юзермод на диспетчер исключений никакие атомарные операции не выполняются. Поэтому если в процессе работают несколько потоков, причём на разных процессорах и они одновременно войдут в диспетчер исключений, то не понятно какой поток снимет со страницы атрибут PAGE_GUARD и вызовет это исключение. Решил установить аффинитет процесса в единицу, разрешив исполняться потокам только на одном процессоре, но этот механизм требует много времени, поэтому иной поток может изменять аффинитет, что приведёт к краху. Изза этого необходимо определить, является ли вход в хэндлер исключений атомарной операцией.
     
  6. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Во-первых это не так, обработчики прерываний могут отключать на входе прерывания а могут и не отключать. Во-вторых если посмотришь в дизассемблере некоторые Windowsовские ISR, вход в которые сопровождается запретом прерываний то сможешь заметить что там иногда встречается sti..cli фрагменты. В-третьих совершенно непонятно откуда вообще взялась мысль о том что в одно и тоже прерывание нельзя влезать несколько раз тем более с разных процессоров
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Неужеле никто не знает :dntknw:
    Great хотелось бы твоё мнение услышать..
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Хорошо, заюзою аффинитет. Хотя уменьшит гибкость и внесёт возможность обхода в механизм, тоесть уязвимость, но это позволит избежать критических ошибок.