если я сделаю cli в драйвере, то прерывания запретятся только на 1 процессоре? или на всех? если только на одном, как тогда запретить прерывания на всех процессорах?
Здравствуйте, sergei_132, Вы писали:
_>если я сделаю cli в драйвере, то прерывания запретятся только на 1 процессоре? или на всех? если только на одном, как тогда запретить прерывания на всех процессорах?
Здравствуйте, sergei_132, Вы писали:
_>если я сделаю cli в драйвере, то прерывания запретятся только на 1 процессоре? или на всех? если только на одном, как тогда запретить прерывания на всех процессорах?
1. Главный вопрос: зачем? От этого будет зависеть ответ.
_>вернее вот так: _>KDPC Dpc[MAXIMUM_PROCESSORS]; _>ULONG n=NumberProcessors; _>for(CCHAR i = 0; i < NumberProcessors; i++) _> { _> KeInitializeDpc(&Dpc[i], DpcRoutine, NULL); _> KeSetImportanceDpc(&Dpc[i], LowImportance); _> KeSetTargetProcessorDpc(&Dpc[i], i); _> } _>for(CCHAR i = NumberProcessors-1; i >= 0; i--) _>{ _> KeInsertQueueDpc(&Dpc[i], 0, 0); _>} _>VOID DpcRoutine(..) _>{ _>n--; _>cli _>if (n==0) {do something... when cli all processors...} _>}
Нет, нельзя. cli можно делать только после того как каждая DPC доставленна до выбранного процессора. Если это сделать раньше, то cli заблокирует IPI (Inter-Processor Interrupt) и в результате KeInsertQueueDpc() может зациклится на ожидании ответа от dpc-target-cpu.
_>VOID DpcRoutine(..) _>{ _>n--; _>cli _>if (n==0) {do something... when cli all processors...} _>}
--
А почему нужно именно запретить прерывания на процессорах? Может быть, можно обойтись маскированием внешних прерываний, поднимая IRDL до HIGH_LEVEL?
Здравствуйте, Andrew.W Worobow,
AWW>IRQL на каждом процессоре свой... Придётся также поднимать его для каждого процессора.
--
Безусловно; именно это я и имел в виду — поднять IRQL на каждом процессоре вместо выполнения специальной команды процессора.
, Вами, мне была присланна, ссылка.
которую с благодарностью вспоминаю
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Здравствуйте, Leo Yuriev, Вы писали:
_>>если я сделаю cli в драйвере, то прерывания запретятся только на 1 процессоре? или на всех? если только на одном, как тогда запретить прерывания на всех процессорах? LY>Конечно только на одном.
А если процессор один, но многоядерный, например core2duo?
Здравствуйте, CoolCmd, Вы писали:
CC>А если процессор один, но многоядерный, например core2duo?
Ядро многоядерного процессора можно отличить от процессора в отдельном корпусе только путем анализа идентификационных данных самого процессора или окружающего его железа.
Здравствуйте, sergei_132, Вы писали:
_>спасибо, но зачем же свой код давать ? просто бы сказали в чем ошибка... А то ведь так совсем можно облениться и ничего самому не делать...
кстати, когда я в отладчике пытался посмотреть как hotpatching в режиме ядра атомарно меняет исполняемый код, мне попались интересные функции:
KeGenericCallDpc(PKDPC Dpc, PVOID) и
(вызываются внтури dpc) KeSignalCallDpcSynchronize, KeSignalCallDpcDone
насколько я понял, это встроенная в ОС реализация барьеров, dpc шедулится на каждый из процессоров, внутри dpc синхронищация с помощью KeSignalCallDpcSynchronize, кому-то одному KeSignalCallDpcSynchronize вернет TRUE, остальным FALSE, т.е. псевдокод dpc выглядит как-то так:
Здравствуйте, Unmanaged, Вы писали:
U>К сожалению, все перечисленные функции, как и сам Hot-Patching, доступны начиная только с Windows Server 2003.
Это не важно. Теперь есть "документированный правильный способ" (обрати внимание на выравнивание заглушек для hot-patching) и — все остальные .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подскажите, пожалуйста, что за функция __Crt::ProcessorPause() и что она делает, или хотя бы где её искать.
А так же для чего:
PERFORMANCE_AUTO_COUNT;
ENABLE_COLLECT_PERFORMANCE;
__asm pushfd;