Что именно такое IRQL_NOT_LESS_OR_EQUAL?

1101
Aaron Franke

Что именно такое IRQL_NOT_LESS_OR_EQUAL? Что такое IRQL? Какие вещи используют IRQL? Почему оно должно быть меньше или равно? Что заставило бы это не быть меньше или равным? Почему ОС не может восстановиться после того, как она не станет меньше или равна? IRQL влияет только на Windows?

Эта ошибка кажется довольно распространенной . Я не прошу помощи, я прошу объяснений.

11
Отправная точка для объяснения и примеров: ["* В компьютере запрос прерывания (или IRQ) - это аппаратный сигнал, отправляемый процессору, который временно останавливает работающую программу и позволяет вместо этого запускать специальную программу, обработчик прерываний. Аппаратные прерывания используются для обработки событий, таких как получение данных от модема или сетевой карты, нажатие клавиш или движения мыши * "] (https://en.wikipedia.org/wiki/Interrupt_request_ (PC_architecture)) Pimp Juice IT 6 лет назад 1
Для другой части (я полагаю, первая часть): ["* Это сообщение Stop указывает, что процесс или драйвер в режиме ядра пытался получить доступ к адресу памяти, к которому у него не было разрешения. Наиболее распространенная причина этой ошибки: неверный или поврежденный указатель, который ссылается на неправильное местоположение в памяти. Указатель - это переменная, используемая программой для обращения к блоку памяти. ... ~ Эта ошибка обычно возникает после установки неисправного драйвера устройства, системной службы, или BIOS. Чтобы быстро решить проблему, перезагрузите компьютер * "] (https://msdn.microsoft.com/en-us/library/ms854226.aspx) Pimp Juice IT 6 лет назад 1
** Проверка ошибки IRQL_NOT_LESS_OR_EQUAL имеет значение 0x0000000A. Это указывает на то, что Microsoft Windows или драйвер режима ядра обращались к выгружаемой памяти по недопустимому адресу, в то время как на повышенном уровне запроса прерывания (IRQL). ** IQL является приоритетной системой ядра. на некоторых IRQL в ядре вы не можете получить доступ к данным, которые хранятся в файле подкачки. проанализируйте DMP и посмотрите, не задействован ли сторонний код. Если нет, проверьте вашу память на наличие проблем. magicandre1981 6 лет назад 0
Забавно то, что наиболее практичный ответ на сообщения, это не имеет значения, что это значит, все, что имеет значение, это то, что делать, когда вы получаете это сообщение ..., или, все, что имеет значение, это соответствующий перевод, который в случае что IRQL BSOD, как правило, "проблема с драйверами"! поэтому постарайтесь выяснить, что это за драйвер, удалить и переустановить драйверы, что-то в этом роде ... но в любом случае это хороший вопрос о чем идет речь ... Я знаю, что такое IRQ, но я не знал, что такое IRQL, пока Ответ Джейми! barlop 6 лет назад 1

1 ответ на вопрос

17
Jamie Hanrahan

Это сложно. ;)

Нет, правда.

IRQL означает «Уровень запроса прерывания». Это число от 0 до 31 в системах Windows x86 и от 0 до 15 в системах x64. Он представляет «важность» задачи режима ядра относительно других задач режима ядра.

IRQL - это определяемое Windows состояние процессора, а не процесса или потока, которое указывает Windows, может ли то, что делает этот процессор, быть прервано другими задачами. Если новая задача (например, подпрограмма обработки прерываний) имеет более высокий IRQL, чем текущий IRQL процессора, то да, она может прервать текущую задачу; в противном случае нет. В многопроцессорной системе каждый процессор имеет свой собственный IRQL. Это включает в себя «логические процессоры», созданные с помощью гиперпоточности.

(Я использую слово «важность», а не «приоритет», потому что «приоритет» в Windows относится к приоритетам потоков, а IRQL - это нечто иное. В отличие от приоритетов потоков, задачи ядра в том же IRQL не разделены по времени, и IRQL не являются ' подвержены автоматическому увеличению и затуханию.)

(Я должен также упомянуть, что термин «задача ядра» здесь не является официальным. Windows на самом деле не называет эти вещи «задачами ядра», они не являются управляемыми объектами, как, например, процессы и потоки, и не имеют никакого отношения к задаче x86 » gates »и ни к чему, показанному в« Диспетчере задач ». Поскольку я (и другие) использую здесь термин,« задача режима ядра »действительно охватывает« все с определенным началом и концом, которое необходимо выполнить в режиме ядра на IRQL 2 или выше. "Подпрограмма обслуживания прерываний является одним примером" задачи режима ядра "; также как и подпрограмма DPC. Но другим примером может быть код в потоке режима ядра. Такие потоки начинаются с IRQL 0, но если часть кода повышениядля IRQL 2 или выше, что-то делает, а затем возвращается к предыдущему IRQL, часть кода с высоким IRQL является одним из примеров того, что я называю здесь «задачей ядра». )

Системный монитор отображает время, потраченное на IRQL 2 как «время% DPC», а время при IRQL> 2 как «время% прерывания», независимо от того, было ли время фактически потрачено в процедуре DPC или ISR или было результатом повышения IRQL из более низкое значение. Каждый из них является подмножеством того, что PerfMon показывает как «% привилегированное время», которое должно было быть помечено как «время режима ядра».

Как только задача ядра запускается на IRQL 2 или выше, она выполняется до завершения, прежде чем что-либо еще на том же IRQL будет запущено на том же процессоре. Она может быть прервана задачей с более высоким IRQL (которая, в свою очередь, может быть прервана задачей с более высоким IRQL и т. Д.), Но когда задачи с более высоким IRQL завершены, управление возвращается к задаче, которую оно прервало.

IRQL - это прежде всего механизм сериализации . (Многие говорят «синхронизация», но я предпочитаю это слово, поскольку оно более точно описывает результат.) Его цель - помочь гарантировать, что несколько задач на одном и том же ЦП, которые обращаются к определенным общим ресурсам - в основном, к общим структурам данных в пространстве ядра ОС - не разрешается прерывать друг друга таким образом, чтобы это могло повредить эти структуры.

Например, большое количество данных в ядре Windows, в частности данные управления памятью и данные, используемые планировщиком потоков, «сериализуются» на IRQL 2. Это означает, что любая задача, которая хочет изменить такие данные, должна выполняться на IRQL 2, когда это так. Если задача с более высоким IRQL пытается записать такие данные, это может привести к повреждению, поскольку оно могло прервать задачу IRQL 2, которая может находиться в середине цикла чтения-изменения-записи для тех же данных. Так что задачам с более высоким IRQL просто не разрешено это делать.

Задачи с более высоким IRQL - это в основном подпрограммы обслуживания прерываний драйверов устройств, поскольку прерывания всех устройств происходят при IRQL> 2. Это включает прерывание от микросхемы таймера на материнской плате, которая управляет хронометрированием и управляемой временем активностью в ОС. Его IRQL выше, чем у всех "обычных" аппаратных устройств.

IRQL 2 и выше используются для задач ядра, которые не запускаются аппаратными прерываниями, но во время которых не может происходить нормальное планирование потоков, включая ожидание. Таким образом, если процессор находится на уровне IRQL 2 или выше, переключение контекста потока на этом процессоре не может произойти, пока IRQL не опустится ниже 2.

Код режима пользователя всегда имеет значение IRQL 0. Код режима ядра может работать на любом уровне IRQL от 0 до максимального значения. IRQL 1 - особый случай; это только режим ядра, но он не влияет на планирование и в действительности является скорее состоянием потока, чем процессора - он сохраняется и восстанавливается, например, при переключении контекста потока.

Чтобы поддерживать различные гарантии сериализации, большинство исключений (такие как деление на ноль или нарушения доступа к памяти, такие как сбои страниц) просто не могут обрабатываться на IRQL 2 или выше. (Кстати, IRQL 2 обычно называют «уровнем диспетчеризации» или «уровнем DPC».)

И теперь мы можем наконец объяснить этот код проверки на ошибки!

Наиболее распространенный случай IRQL_NOT_LESS_OR_EQUAL связан с ошибкой страницы (попытка доступа к «нерезидентному» виртуальному адресу) или нарушением доступа к памяти (попытка записи на страницу только для чтения или на страницу, которая не определена). вообще), что происходит на IRQL 2 или выше.

Если такие исключения возникают при IRQL 0 или 1, они могут быть «обработаны» либо системным кодом (например, обработчиком ошибок страницы), либо обработчиком исключений, предоставленным разработчиком. Однако большинство исключений не могут быть обработаны вообще, если они произошли в IRQL 2 или выше.

Итак ... код проверки на наличие ошибок означает «исключение типа, которое может быть обработано только при IRQL 0 или 1, когда IRQL был на уровне 2 или выше». то есть "не меньше или равно 1". Странная формулировка, но она есть.

Есть несколько других вещей, которые могут вызвать эту проверку, и значение, которое IRQL не меньше или равно, не всегда 1, но они встречаются очень редко. Документация WinDBG перечисляет их.

Отличный ответ. Знаете ли вы о каких-либо известных вещах, которые работают на IRQL больше 2? Scott Chamberlain 6 лет назад 0
Вероятно, драйверы устройств. LawrenceC 6 лет назад 0
@LawrenceC Да. Все аппаратные прерывания имеют IRQL> 2. Jamie Hanrahan 6 лет назад 0