cereri de software Niveluri de întrerupere (ICCV)
Deși controlerul de întrerupere setează prioritatea întrerupere, Windows instalează propriul său sistem de prioritate de întrerupere cunoscut sub numele de nivelurile de cerere de întrerupere (ICCV). In nucleul ICCV-niveluri sunt reprezentate ca numere de la 0 la 31 de sisteme x86 și sub formă de numere 0 la 15 pe sistemele x64 și IA64, în cazul în care un număr mai mare corespund întreruperii cu o prioritate mai mare.
Deși kernel-ul determină pentru software-ul întrerupe ICCV-set standard de nivele, hardware-ul HAL întrerupe numerele afișează ICCV pe niveluri. Figura prezintă ICCV-niveluri pentru arhitectura x86, așa cum se arată în figura următoare ICCV-niveluri pentru arhitecturi x64 și IA64.
Nivelurile de cereri de întrerupere (ICCV) arhitectura x86
Nivelurile de cereri de întrerupere (ICCV) pentru x64 și arhitecturi IA64.
Întreruperile sunt deservite în ordinea priorității și întrerupere cu prioritate mai mare a obține avantajul de serviciu. În cazul unui nivel ridicat întrerupe procesorul stochează starea firului întrerupt și pornește controlerul de întrerupere asociat cu o capcană. Aceasta, la rândul său, ridică ICCV și provoacă rutina de întrerupere de servicii.
După efectuarea acestei proceduri controlerul de întrerupere scade procesor de nivel ICCV la valorile pe care a fost înainte de întrerupere, iar apoi încărcați starea salvată a mașinii.
firul Interrupted continua executia la punctul în care a fost întrerupt. Când kernel-ul scade ICCV, se poate realiza întreruperea nivel de prioritate inferior, care a fost ascuns. Dacă se întâmplă acest lucru, nucleul repetă procesul de prelucrare a unor noi întreruperi.
nivelurile de prioritate ICCV au un sens complet diferit față de prioritățile utilizate în planificarea fluxurilor. Prioritatea de programare este un atribut de flux, și o sursă de întrerupere atribut ICCV, cum ar fi o tastatură sau un mouse. În plus, fiecare procesor are setarea ICCV, care se schimbă în performanța codului sistemului de operare.
Instalarea IRQL fiecare procesor determină care întrerupe procesorul poate primi. ICCV niveluri sunt de asemenea folosite pentru a sincroniza accesul la structura de date modul nucleu. După ce a declanșat fluxul de modul nucleu, se ridică sau coboară procesorul ICCV, fie direct, prin apelarea KeRaiseIrql KeLowerIrql și funcții. sau, mai frecvent, în mod indirect, prin funcția solicită această cerere obiectele kernel folosite pentru sincronizare. După cum se arată în figură, o întrerupere care vine din ICCV sursă, mai mare decât nivelul actual, întreruperea procesorului și întrerupe din surse ICCV niveluri egale sau sub nivelul actual, sunt mascate atâta timp cât firul de executare IRQL nu este mai mică.
Având în vedere că referirea la PIC este o operație relativ lent, HAL-mecanisme care necesită acces la magistrala IO pentru a schimba ICCV niveluri (de exemplu, PIC pe 32 de biți de configurare sisteme de interfață de control avansat și putere - Configurare avansată și interfață de alimentare, ACPI) , punerea în aplicare a optimizarea performanței, care se numește „leneș ICCV» (ICCV leneș) și evită referirile la PIC.
Odată cu creșterea IRQL HAL note pentru un nou ICCV, fără a schimba masca de întrerupere. În cazul în care după aceea o întrerupere cu un nivel inferior, seturile HAL întrerup masca cu setările corespunzătoare primei întrerupere, și întrerupe ingheata la un nivel inferior (menținându-l astfel într-o stare de așteptare), atâta timp cât IRQL nu va fi retrogradat.
Astfel, în cazul în care are loc întreruperea cu un nivel mai scăzut, cu o creștere a ICCV, sunt necesare mecanisme PIC HAL modificate.
NOTĂ. Excepții de la regula de blocare a întrerupe sau egală cu un nivel mai scăzut, cu o preocupare în creștere întreruperi de nivel APC ICCV. În cazul în care crește fluxul de la nivelul APC ICCV și apoi punerea în aplicare a acestuia este supusă rescadențare întreruperi diligența / DPC-nivel, sistemul poate transmite de întrerupere nivel APC re-planificate a fluxului. Astfel, nivelurile APC pot fi considerate ICCV, fluxul local, nu pentru întregul procesor.
fluxul de modul de kernel ridică sau coboară ICCV procesorului pe care ruleaza, in functie de ceea ce încearcă să facă. De exemplu, atunci când se produce o întrerupere, capcane procesor (sau, eventual, procesorul) procesorul crește ICCV la ICCV, stabilit pentru sursa de întrerupere. Această creștere a măștilor toate întrerupe același și inferior ICCV (numai pe acel procesor), asigurându-se că un procesor care servește de întrerupere, o întrerupere nu este capturat în același timp sau la un nivel inferior.
întrerupe mascată sau manipulate de către un alt procesor, sau să adere la, atâta timp cât cade ICCV. Prin urmare, toate componentele sistemului, inclusiv kernel-ul și driverele de dispozitive, încercați să păstrați IRQL la nivelul pasiv (uneori se face referire la nivelul cel mai scăzut). Acest lucru se face pentru un timp de răspuns pentru drivere de dispozitiv hardware întreruperi, cu condiția ca ICCV nu este ținut în mod inutil de mare pentru perioade lungi de timp.
Debugger salvate IRQL pentru procesor 0x0 - 0 (LOW_LEVEL)
Rețineți că valoarea ICCV este stocată în două locuri. Prima locație în care prezintă ICCV curent, - un procesor de control regiune (regiune de control al procesorului, PCR), iar al doilea - extinderea acesteia, controlul domeniului unitate CPU (processorregioncontrolblock, PRCB), care conține un câmp IRQL DebuggerSaveIrql stocat. PCR și PRCB conțin informații despre starea fiecărui procesor din sistem, inclusiv curentul ICCV, un pointer la hardware-ul IDT-tabel, informații cu privire la fluxul de curent și următorul, alege pentru a rula fluxul.
Kernel și HAL folosi aceste informații pentru a efectua acțiuni care vizează arhitectura specifică și mașini specifice. Părți ale PCR și a structurilor PRCB în mod deschis Ntddk.h definite în fișierele antet legate de instrumente Windows Driver Kit (WDK).
KPCR pentru Procesor 0 la fffff80001bfad00:
Major Minor 1 1