Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Все несколько сложнее, но уже работает 24.06.04 13:17 Число просмотров: 1628
Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 24.06.04 17:24 Количество правок: 2
|
Все несколько сложнее. KeStallExecutionProcessor() просто старается приостановить текущий CPU на заданное количество микросекунд. А мне нужна пауза при запрещенных прерываниях, поэтому проше просто запретить прерывания и зациклить "не нужные" процессоры while(flag != done){DoCpuPause();}. Реализация самой паузы тривиальна, самое главное войти в режим паузы, тут и начинаются хитрости.
Сложность в том, что прерывания нужно запрещать синхронно и одновременно на всех процессорах, либо использовать IPI для взаимодействия между CPU. Само ядро конечно использует второй вариант, но мне IPI не доступен.
Одновременно запрещать прерывания (cli) нужно потому, что обработка прерывания на одном процессоре может потребовать IPI-обращения к другому. Например для постановки DPC в очередь или для вызова обработчита прерывания драйвера устройства. Кроме того, постановка моих "пусковых" DPC в очередь также требует IPI. Если при этом на "другом" процессоре прерывания уже запрещены, то IPI-запрос не будет обслуживаться, а первый процессор будет ждать сего факта (причем в это время на нём самом прерывания уже будут запрещены). В итоге cli на одном процессоре может легко остановить всё остальное.
Запретить прерывания на всех CPU одновременно конечно невозможно, но можно организовать кратковременное ожидание факта выполения всеми CPU нужного кода при cli. И соответственно повтор неудачных попыток. Вот так сейчас и работает, см. картинку.
Еще одна хитрость в том, что пользоваться штатным отладчиком нельзя. Даже просто вызов DbgPrint() может намертво завесить систему. Работать может только а-ля softice с аппаратным прицепом.
итоговая DPC-функция
|
|
|