информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Все несколько сложнее, но уже работает 24.06.04 13:17  Число просмотров: 1742
Автор: 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-функция
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach