Привет! Читаю книгу Соломона и Руссовича и не очень понял как работает механизм DPC и APC, а именно их посылка и назначение (объясните по-понятнее) И еще, как я понял IRQL это просто еще одна шкала приоритетов в которую включены аппаратные прерывания от контроллера прерываний и так называемые уровни приоритетов программ.
Не путай прерывания аппаратные и программные. Для примера есть два потока, которые должны выполняться, у них есть свои приоритеты (кто главнее) диспетчер памяти, н-р на уровне DISPATCH_LEVEL (DPL для краткости), другой может быть на уровне PASSIVE_LEVEL (PSL) система обнаружила, что поток PSL слишком долго ждал и должен проснуться, а в этот момент вмешивается диспетчер памяти -> поток с PSL не пробуждается до тех пор, пока поток с DPL не отработает свой квант или не вернёт квант потоку с PSL. За приоритетами следит ядро. Если н-р вызывать ExAllocatePool, то надо в DDK посмотреть на каком приоритете должна вызываться эта ф-ция "Callers of ExAllocatePool must be running at IRQL <= DISPATCH_LEVEL" DPC - очередь. н-р есть аппаратное прерывание от клавиатуры. Драйвер должен очень быстро считать код из порта и отложить обработку этого кода на потом, т.к. это очень высокий IRQL и долгая обработка может затормозить систему. При падении IRQL ниже DPL вызывается отложенная процедура, в которой он и обработает код. APC - тоже самое, только уровень ниже DPL Как-то несвязанно, но смысл может и дойдёт Лучше всего ответит Four-F возможно и я неверно понял
Спасибо! почти дошло. P.S. Я учусь на 3 курсе университета «Дубна», направление «Информатика и вычислительная техника». Интересуюсь системным программированием, работой ядра ОС Windows. Хочу найти интересную работу и товарищей по интересам. Куда можно обратиться?
>DPC - очередь Это не совсем так. DPC - Это функция , выполняющая системную задачу менее критичную по времени в сравнении с текущей. Но это всего лишь набор правил, разработчику никто не мешает написать всю работу DPC в ISR ! ТО что ты говорил об очереди, это очередь куда складываются все прерывания, которые должно выполнить ядро. В идеале должно работать так, срабатывает Аппаратное прерывание, тогда ISR инициализурует DPC объект куда сует адрес DPC-обработчика и в зависимости от приоритета, а его может указывать драйвер, DPC-объект помещается в очередь или же направляется конкретному процессору. to Four-F Если я не прав, то в чем?
Теримином DPC могут обозначаться функция, очередь и объект. При запуске инициализируется DPC-объект (структура _KDPC), т.е KeInitializeDpc пихает адрес DPC-функции в структуру _KDPC. IRS ставит этот DPC-объект в DPC-очередь, вызовом KeInsertQueueDpc. DPC-очередь - это просто двусвязный список в структуре _KPRCB. Кто-то там просматривает эту DPC-очередь, когда IRQL понизится, отвязывает _KDPC, смотрит в неё и вызывает DPC-функцию там прописанную. А если вообще, то DPC - это способ отложить обработку прерывания на время, когда IRQL упадёт ниже DISPATCH_LEVEL. См. "DPC Objects and DPCs" в DDK, а ещё лучше dpcobj.c