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.