IRQL_NOT_LESS_OR_EQUAL tam olarak nedir?


15

IRQL_NOT_LESS_OR_EQUAL tam olarak nedir? IRQL nedir? IRQL ne kullanıyor? Neden daha az veya eşit olması gerekiyor? Daha az veya eşit olmamasına ne sebep olur? İşletim sistemi neden daha az veya eşit olmadığından kurtulamıyor? IRQL yalnızca Windows'u etkiler mi?

Bu hata oldukça yaygın görünüyor . Yardım istemiyorum, bir açıklama istiyorum.




IRQL_NOT_LESS_OR_EQUAL hata denetimi 0x0000000A değerine sahiptir. Bu, Microsoft Windows veya çekirdek modu sürücüsünün disk belleğine yükseltilmiş bir kesme isteği düzeyinde (IRQL) geçersiz bir adresten eriştiğini gösterir. IQL, çekirdeğin öncelikli bir sistemidir. çekirdekteki bazı IRQL'de sayfa dosyasında depolanan verilere erişemezsiniz. dmp'yi analiz edin ve 3. taraf kodunun dahil olup olmadığına bakın. değilse, belleğinizi sorunlar için test edin.
magicandre1981

1
Komik olan şey, mesajlara en pratik yanıtın, önemli olan tek şeyin, bu mesajı aldığınızda ne yapmanız gerektiğinin önemi olmamasıdır. Veya, önemli olan tek şey ilgili bir çeviri IRQL BSOD, genellikle "sürücü sorunu" olduğunu! bu yüzden hangi sürücüyü bulmaya çalışın ve sürücüleri kaldırın ve yeniden yükleyin, bu tür bir şey .. ama bu zaten ne hakkında konuştuğuna dair iyi bir soru ... Bir IRQ'nun ne olduğunu biliyorum ama IRQL'in ne kadar olduğunu bilmiyordum Jamie'nin cevabı!
barlop

Yanıtlar:


26

Karmaşık. ;)

Hayır, gerçekten öyle.

IRQL "Kesme İsteği Düzeyi" anlamına gelir. Windows x86 sistemlerinde 0 ile 31 ve x64 sistemlerinde 0 ile 15 arasında değişen bir sayıdır. Bir çekirdek modu görevinin diğer çekirdek modu görevlerine göre "önemini" temsil eder.

IRQL, işlemcinin Windows tarafından tanımlanan bir işlemidir - bir işlemin veya iş parçacığının değil - Windows'a bu işlemcinin yaptığı her şeyin diğer görevler tarafından kesilip kesilemeyeceğini gösterir. Yeni bir görev (bir kesme servisi rutini gibi) işlemcinin mevcut IRQL'inden daha yüksek bir IRQL'e sahipse, evet, mevcut görevi kesebilir; aksi halde hayır. Çok işlemcili bir sistemde her işlemcinin kendi IRQL'i vardır. Buna hiper iş parçacığı tarafından oluşturulan "Mantıksal İşlemciler" de dahildir.

(Windows'daki "öncelik" iş parçacığı önceliklerini ifade ettiği ve IRQL'ler farklı bir şey olduğu için "öncelik" yerine "önem" kelimesini kullanıyorum. İş parçacığı önceliklerinin aksine, aynı IRQL'deki çekirdek görevleri zaman dilimli değil ve IRQL'ler aren ' t Otomatik güçlendirme ve bozulmaya tabi.)

(Ayrıca burada "çekirdek görevi" teriminin resmi olmadığını da belirtmeliyim. Windows bu şeyleri gerçekten "çekirdek görevleri" olarak adlandırmaz, bunlar süreçler ve iş parçacıkları gibi yönetilmeyen nesneler değildir ve x86 ile ilgili bir ilişki yoktur. Ben (ve diğerleri) burada terimi kullandığım için, "çekirdek modu görevi" IRQL 2 veya çekirdek modunda yapılması gereken tanımlanmış bir başlangıç ​​ve bitiş içeren her şeyi gerçekten kapsar. "Kesme hizmeti yordamı" çekirdek modu görevi "nin bir örneğidir; DPC yordamıdır. Ancak başka bir örnek çekirdek modu iş parçacığında kod olabilir. Bu tür iş parçacıkları IRQL 0 ile başlar, ancak kodun bir parçasıysa yükseltmelerIRQL 2 veya üstü, bir şey yapar ve daha sonra önceki IRQL döner, kodun yüksek IRQL kısmı burada "çekirdek görevi" dediğim bir örneğidir. )

Performans İzleyicisi, IRQL 2'de geçirilen zamanı "% DPC süresi" ve IRQL> 2'deki zamanı "% kesinti süresi" olarak gösterir; sürenin gerçekten bir DPC yordamında veya ISR'de geçirilmiş olup olmadığına veya IRQL'in daha düşük bir değer. Her biri PerfMon'un "% ayrıcalıklı süre" olarak gösterdiği alt kümedir - "çekirdek modu süresi" olarak etiketlenmiş olmalıdır.

IRQL 2 veya üzeri bir çekirdek görevi başlatıldığında, aynı IRQL'de başka bir şey aynı işlemcide başlatılmadan önce tamamlanır . Daha yüksek bir IRQL görevi tarafından kesilebilir (bu da daha yüksek bir IRQL görevi vb. Tarafından kesilebilir), ancak daha yüksek IRQL görevleri tamamlandığında kontrol, kesintiye uğradığı göreve geri döner.

IRQL öncelikle bir serileştirme mekanizmasıdır. (Birçoğu "senkronizasyon" diyor, ancak sonucu daha iyi açıkladığı için bu kelimeyi tercih ediyorum.) Amacı, aynı CPU'da, paylaşılan çekirdek kaynaklara (çoğunlukla işletim sistemi çekirdek alanındaki paylaşılan veri yapılarına) erişen birden fazla görevin garanti edilmesine yardımcı olmaktır. bu yapıları bozabilecek şekilde birbirlerini kesmelerine izin verilmez.

Örneğin, Windows çekirdeğindeki büyük miktarda veri, özellikle bellek yönetimi verileri ve iş parçacığı zamanlayıcısı tarafından kullanılan veriler IRQL 2'de "serileştirilir" . Bu, bu tür verileri değiştirmek isteyen herhangi bir görevin şu anda çalıştırılması gerektiği anlamına gelir IRQL 2 bunu yaptığında. Daha yüksek bir IRQL görevi bu tür verileri yazmaya çalışırsa, bu yolsuzluğa neden olabilir, çünkü aynı veriler üzerinde bir okuma-değiştirme-yazma döngüsünün ortasında olabilecek bir IRQL 2 görevini kesmiş olabilir. Bu nedenle, daha yüksek IRQL görevlerinin bunu yapmasına izin verilmez.

Daha yüksek IRQL görevleri çoğunlukla aygıt sürücülerinin kesme hizmeti yordamlarıdır, çünkü tüm aygıtların kesmeleri IRQL> 2'de gerçekleşir. Bu, anakarttaki işletim sistemindeki zaman işleyişini ve zamana dayalı etkinliği çalıştıran zamanlayıcı yongasından kesmeyi içerir. IRQL, tüm "sıradan" donanım cihazlarının üzerindedir.

IRQL 2 ve üstü, donanım kesintileri tarafından tetiklenmeyen ancak normal iş parçacığı zamanlamasının (bekleme dahil) gerçekleşemediği çekirdek görevleri için kullanılır. Böylece bir işlemci IRQL 2 veya üzerinde olduğunda, IRQL 2'nin altına düşene kadar bu işlemcide iş parçacığı bağlam anahtarları olamaz.

Kullanıcı modu kodu her zaman IRQL 0'dadır. Çekirdek modu kodu 0'dan maksimum olana kadar herhangi bir IRQL'de çalışabilir. IRQL 1 özel bir durumdur; yalnızca çekirdek modudur, ancak zamanlama üzerinde hiçbir etkisi yoktur ve gerçekten bir iş parçacığının işlemciden çok bir durumudur - örneğin iş parçacığı bağlam anahtarları sırasında kaydedilir ve geri yüklenir.

Çeşitli serileştirme garantilerini korumak için, istisnaların çoğu (sıfıra bölme veya sayfa hataları gibi bellek erişimi ihlalleri) IRQL 2 veya daha üstte işlenemez. (IRQL 2 btw genellikle "dağıtım düzeyi" veya "DPC düzeyi" olarak adlandırılır.)

Ve şimdi bu hata kontrol kodunu açıklayabiliriz!

En yaygın IRQL_NOT_LESS_OR_EQUAL örneği, bir sayfa hatasından ("yerleşik olmayan" bir sanal adrese erişmeyi denemek) veya bir bellek erişim ihlali (salt okunur bir sayfaya yazma girişimi veya tanımlanmamış bir sayfaya erişmekten kaynaklanır) IRQL 2 veya üzerinde gerçekleşir).

Bu istisnalar IRQL 0 veya 1'de ortaya çıkarsa, sistem tarafından sağlanan kod (sayfa hatası işleyicisi gibi) veya geliştirici tarafından sağlanan bir istisna işleyicisi tarafından "işlenebilir". Bununla birlikte, çoğu istisna IRQL 2 veya üzerinde gerçekleşmişse hiç bir şekilde ele alınamaz.

Yani ... hata denetimi kodu "yalnızca IRQL 0 veya 1'de işlenebilen bir tür istisnası, IRQL 2 veya daha yüksek olduğunda gerçekleşti" anlamına gelir. yani "1'den küçük veya ona eşit değil". Garip ifadeler, ama işte burada.

Bu hata denetimini tetikleyebilecek birkaç şey daha vardır ve IRQL'in daha az veya eşit olmadığı değer her zaman 1 değildir, ancak bunlar nadiren görülür. WinDBG belgeleri bunları listeler.


Mükemmel cevap. 2'den büyük bir IRQL'de çalışan iyi bilinen herhangi bir şey biliyor musunuz?
Scott Chamberlain

1
Muhtemelen aygıt sürücüleri.
LawrenceC

1
@LawrenceC Evet. Tüm donanım kesintileri IRQL> 2'de.
Jamie Hanrahan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.