прерывания в многопроцессорной среде

Тема в разделе "WASM.WIN32", создана пользователем Wolfgang, 7 июн 2005.

  1. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    Доброе время суток!

    В многопроцессорной среде при срабатывании прерывания есть ли какая-то уверенность, что управление обработчиком не будет передано планировщиком другому процессору? И как можно этой уверенности добиться? Ясно, что в самом начале обработчика можно вызвать KeSetAffinityThread, но нет никакой гарантии, что до окончания выполнения этой функции управление не получит другой проц. Как это можно побороть?
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    вообще то на эту тему лучше почитать Рихтера. А вообще, привязка к процессору должна помочь. как так упраление не получит другой проц, конечно получит, в этом и смысл многопроцессорности, но есть такая фишка, как интерлоки, или как там это называется, сам я с ними дело неимел, с кучей процев, но, к примеру, если интересно, как это организовано в драйвере, распотроши sable драйвер, тот , что 1С обманывает, там есть код для этого дела, который #UD перехватывает, да и глянь.
     
  3. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    > вообще то на эту тему лучше почитать Рихтера.



    а что именно из Рихтера?



    Да именно такая технология и интересует. Нет ли способа проще - на уровне нескольких вызовов яункций ядра? Может, кто знает?
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Если в обработчике прерывания irql > DISPATCH_LEVEl, то во время его работы на другой проц нить переключиться не может. Если irql ниже, то можно просто его поднять.
     
  5. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    А в обработчике первого прерывания irql какой обычно по умолчанию?
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Если прерывание вызвано командой CD01 или F1, то irql=PASSIVE_LEVEL, если вызвано аппаратно (срабатыванием бряка на Dr регистрах, или флагом трассировки), то irql > DISPATCH_LEVEL
     
  7. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    А каким способом в обработчике можно определить, на каком проце произошло прерывание? В тек эта информация не помещается?
     
  8. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Wolfgang

    по логике вещей, прерывание может произойти в контексте какого либо процесса, а там дальше найти и глядеть в kprcb. там и будет видно :) Хотя, может могу и ошибаться.
     
  9. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    суть в том, что теоретически, пока я это делаю, управление может получить другой проц... в общем, пока я не придумал ничего более универсального, чем определение для каждого проца переходников типа



    push 000100b ; маска проца

    jmp my_handler



    с последующим извлечением из стека уже внутри общего обработчика и вызовом KeSetAffinityThread, но хочется как-то изящнее :)
     
  10. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Процедура ISR выполняется на уровне DIRQL, который больше DISPATCH_LEVEL => планировщик никоим образом не всплывает :)

    "Программирование драйверов Windows"

    Спин-блокировка является, по сути, объектом типа мьютекс, однако с более более широкими полномочиями. Когла фрагмент кода... собирается обратиться к одной из «охраняемых» структур данных, он должен сначала выполнить запрос на владение спин блокировкой. Так как только один из процессоров в каждый момент времени имеет право собственности на объект спин-блокировки, то таким образом и обеспечивается разделение доступа к охраняемым данным между потоками, работающими на разных процессорах... А это, что касаемо разделяемых ресурсов, только учти, что KeAcquireSpinLock вызывается при IRQL<=DISPATCH_LEVEL. И в ISR его лучше не использовать, иначе надо понижать IRQL. К тому же рекомендуется использовать DPC очередь для обработки IRP, когда IRQL понижается, а в ISR только эту очередь организовывать.

    Вообще, если хочешь узнать про работу с прерываниями возми книгу Солдатова, хоть на форуме о ней не очень лесно отозвались, IMHO отличное дополнение к знаменитым урокам Four-F