Который день перечитываю стр.100 и 101 книги М.Руссиновича,Д.Соломона. Но так и не могу понять понятие "Отложенный IRQ". Также не понятны действия на след. ситуацию: К примеру произошло аппаратное прерывание, тогда ядро сохранило текущую ситуацию в стек ядра, передало управление на обработчик. Последний поднял IRQL, но как я понял не маскирует прерывания. После обработки он обратно восстанавливает IRQL, но тут между исходным и когда был повышенный IRQL возникает прерывание с более низким IRQL, все повторяется и для него. Но ведь проц может находиться в таком режими довольно долго! Как из этой ситуации выходят? То есть ли лимит на количество обработанный прерываний?
Ищи сатьи "Exploring Irql" и "Understanding IRQL" - читай. Потом читай пост "Device Interrupt priority - Reviewing Jose Flores" на http://www.osronline.com Там Jake Oshins ( дядька из "NT Kernel Team" ) разъясняет кое-что, в том числе и что такое "Lazy IRQL". На http://www.osronline.com, кстати есть как минимум две статьи по этой теме: "Interrupt Handling Changes in Windows" "Stop Interrupting Me -- Of PICs and APICs"
Four-F Я с горем пополам разобрался куда че жать и вроде доступны NTDEV,NTFSD, поиска не нашел поэтому вопрос - где искать топик?
Four-F Спасибо,разобрался! Код (Text): You asked for an evaluation.... I wish that Jose had talked to me, or somebody who actually works on the code, before he wrote that. He missed some pretty fundamental points. Это?
Four-F Разобрался вроде, проверь если не трудно: В IMR PIC8259A было: Маска0 и IRQL(0) 1.Произошло прерывание с более высоким приоритетом IRQ(1), тогда HAL повышает IRQL до IRQL(1) но не трогает IMR(регистр масок). 2. Пришло прерывание по IRQL(2) < IRQL(1) тогда HAL ставит маску2 в соответствии IRQL(1) и откладывает его обработку. Прерывание не теряется, т.к. пришедшие прерывания хранятся в регистре прерываний(не знаю какой регистр). Отсюда: Если не приходило прерываний ниже текущего IRQL, то и контроллеру 8259A не зачем обращаться! Так все происходит? И еще: для каждого прерывания в контроллере прерываний, регистре масок есть свой бит чтобы именно это прерывание запрещать, так?
EvilsInterrupt У тебя каша в голове... Обработчики этих прерываний должны оооочень быстро их обрабатывать, если не получается, то ставят эти задания в очередь, чё бы позже их обработать с пониженным IRQL. А за приоритетом следит не HAL.DLL, а сам контроллер, в зависимости от того, как запрограммирован и IRQL тут не причём. IRQL - это, если проще выразиться, уровень вытиснения потоков
<font color="gray][ EvilsInterrupt</font><!--color--><font color="gray]: Так все происходит? ]</font><!--color--> EvilsInterrupt, пост именно тот. Насчёт "к контроллеру 8259A не зачем обращаться!" по сути верно. Запись в его порты требует времени и lazy IRQL пытается это время сэкономить. IRQ и IRQL - это разные вещи. IRQL(1) - это вообще программное прерывание APC_LEVEL. Используется для синхронизации Asynchronous Procedure Calls. Насчет масок и "своих битов" - хрен знает.
Four-F А блин, каждый раз моргаю кнопку нижнего индекса IRQL(1) это IRQL<sub>1</sub> Еще почитаю, напишу подробный механизм, а ты проверишь, если конечно не влом. ЗЫ: За линки респект, так блин глаза открыли шустро, хотя и суп в голове сварили ))
EvilsInterrupt Ты же сам линк выложил "Микропроцессоры", там есть глава "Организация прерываний в микроЭВМ", вот и читай. На 59-ом контроллере ещё в прошлом веке делали компы И нового, практически, ничего не изобрели, только добавили второй, типа, не 8, а 15 (не 16) входов сделали ))
Вобщем механизм таков, в моем понимании: Есть Контроллер прерываний(PIC 8259A) или совместимый с ним, даже APIC и то работает так, как будто он 8259А ! Хоть и дает 256 штук прерываний. В дальнейшем КП. Для объяснения: IRQ - аппартное IRQL - "приритет прерывания", так выразился Руссинович и в принципе, довольно точно, если судить по другим ссылкам Номерами в нижнем индексе, буду обозначать состояние а не номер или значение! Исходная ситуция: IRQL<sub>0</sub> и Маска<sub>0</sub> 1. КП дает IRQ<sub>1</sub>, системный код не маскирует прерывания, то есть маска в IMR регистре КП, как была равно так и остается равной маска<sub>0</sub>! Но системный код повышает IRQL до уровня соответствующий аппаратному IRQ<sub>1</sub>. 2. Возникает аппаратное IRQ<sub>2</sub>, оно по рангу младше IRQ<sub>1</sub>, тогда, системный код, правит регистр IRM КП устанавливая значения с маски<sub>0</sub> на маску<sub>1</sub>, тем самым маскируя Это IRQ<sub>2</sub> прерывание, но в другом регистре КП,оно то запоминается! 3. Обработка IRQ<sub>2</sub>, начинается тогда, когда IRQL понизится. Выигрыш: Если во время ситуации п.2 не было, то системный код не будет обращаться к КП, а это выигрыш! Four-F прав?
Ты настолько мудрЁно выражаешься, что ввязываться, честно говоря, уже неохота Но поскольку вопрос адресован мне лично... Вобщем прав.
Four-F Спасибо, приму твои слова к сведению и постараюсь выражаться проще Вот еще наткнулся на: http://www.ntkernel.com/ тама форум, как на русском так и русском
Там заточка под сеть и посещать его имеет смысл не чаще одного раза в месяц. Иди лучше в "Низкоуровневое программирование" на rsdn.ru