uawikipc.ru

Рівні запитів програмних переривань (irql)

Хоча контролери переривань встановлюють пріоритетність переривань, Windows встановлює свою власну схему пріоритетності переривань, відому як рівні запитів переривань (IRQL). В ядрі IRQL-рівні представлені у вигляді номерів від 0 до 31 на системах x86 і у вигляді номерів від 0 до 15 на системах x64 і IA64, де вищим номерами відповідають переривання з більш високим пріоритетом.

Хоча ядро визначає для програмних переривань стандартний набір IRQL-рівнів, HAL відображає номери апаратних переривань на IRQL-рівні. На малюнку показані IRQL-рівні для архітектури x86, а на наступному малюнку показані IRQL-рівні для архітектур x64 і IA64.

архітектура-86

Рівні запитів переривань (IRQL) для архітектури x86

архітектура-64

Рівні запитів переривань (IRQL) для архітектур x64 і IA64.

Відео: Код Помилки Driver Irql

Переривання обслуговуються в порядку їх пріоритету, і переривання з більш високим рівнем пріоритету отримують перевагу в обслуговуванні. При виникненні переривання з високим рівнем процесор зберігає стан перерваного потоку і запускає пов`язаний з перериванням диспетчер системних переривань. Той, в свою чергу, піднімає IRQL і викликає процедуру обробки переривання.

Після виконання цієї процедури диспетчер переривань знижує IRQL-рівень процесора до значення, на якому він був до виникнення переривання, а потім завантажує збережений стан машини.

Перерваний потік продовжує виконання з того місця, в якому воно було перервано. Коли ядро знижує IRQL, можуть реалізуватися ті переривання з більш низьким рівнем пріоритету, які були замасковані. Якщо так і відбувається, ядро повторює процес для обробки нових переривань.

Рівні пріоритетів IRQL мають зовсім інше значення, ніж пріоритети, які використовуються при плануванні потоків. Пріоритет планування є атрибутом потоку, а IRQL є атрибутом джерела переривання, такого як клавіатура або миша. Крім того, у кожного процесора є установка IRQL, яка змінюється при виконанні коду операційної системи.

Установка IRQL кожного процесора визначає, які переривання даний процесор може отримувати. IRQL-рівні також використовуються для синхронізації доступу до структури даних режиму ядра. Як тільки запускається потік режиму ядра, він підвищує або знижує IRQL процесора або безпосередньо, шляхом виклику функцій KeRaiseIrql і KeLowerIrql, або, що трапляється частіше, опосередковано, через виклики функцій, які запитують об`єкти ядра, використовувані для синхронізації. Як показано на малюнку, переривання, що надходять від джерела з IRQL, що перевищує поточний рівень, переривають роботу процесора, а переривання, що надходять від джерел з IRQL-рівнями рівними або нижче поточного рівня, маскуються до тих пір, поки виконується потік не знизить IRQL.

маскування-переривань

Маскування переривань.

Оскільки звернення до PIC є відносно повільної операцією, HAL-механізми, що вимагають доступу до шини введення-виведення для зміни IRQL-рівнів (наприклад, для PIC і 32-розрядних систем вдосконаленого інтерфейсу керування конфігурацією і енергоспоживанням - Advanced Configuration and Power Interface, ACPI), Реалізують оптимізацію продуктивності, яка називається «ледачою IRQL» (lazy IRQL) І дозволяє уникнути звернень до PIC.

При підвищенні IRQL HAL відзначає для себе новий IRQL, не змінюючи маски переривання. Якщо ж після цього відбудеться переривання з більш низьким рівнем, HAL встановлює маску переривання з настройками, відповідними першому переривання, і не заморожує переривання з більш низьким рівнем (зберігаючи його тим самим в відкладеному стані) до тих пір, поки IRQL НЕ буде знижений.

Таким чином, якщо переривань з більш низьким рівнем при підвищенні IRQL не відбувається, модифікувати PIC HAL-механізмам не потрібно.

Відео: ELON MUSK PRESENTS THE FALCON HEAVY - PRESS CONFERENCE SPACEX

ПРИМІТКА. Винятки з правила блокування переривань рівного або нижчого рівня при підвищенні IRQL стосуються переривань APC-рівня. Якщо потік підвищує IRQL до рівня APC, а потім його виконання піддається переплануванню через переривання dispatch / DPC-рівня, система може передати переривання APC-рівня заново спланованим потоку. Таким чином, рівень APC може вважатися IRQL, локальним для потоку, а не для всього процесора.

Потік режиму ядра підвищує або знижує IRQL того процесора, на якому він запущений, в залежності від того, що він намагається зробити. Наприклад, коли виникає переривання, обробник системних переривань (або, можливо, процесор) підвищує IRQL процесора до IRQL, встановленого для джерела переривання. Це підвищення маскує всі переривання з таким же і більш низьким IRQL (тільки на цьому процесорі), гарантуючи, що процесор, який обслуговує переривання, що не захоплюється перериваннями на тому ж або на більш низькому рівні.

Замасковані переривання або обробляються іншим процесором, або дотримуються доти, поки IRQL не впаде. Тому всі компоненти системи, включаючи ядро і драйвери пристроїв, намагаються тримати IRQL на пасивному рівні (який іноді називають низьким рівнем). Це зроблено для своєчасної реакції драйверів пристроїв на апаратні переривання за умови, що IRQL не тримається невиправдано високим протягом тривалих періодів часу.

Експеримент: перегляд IRQL



Переглянути збережені для процесора IRQL можна за допомогою команди відладчика! Irql. Збережено IRQL є IRQL на момент, що безпосередньо передує проникненню в відладчик, що підвищує IRQL до статичного, нічого не значущого значення:

kd>! irql

Debugger saved IRQL for processor 0x0 - 0 (LOW_LEVEL)

Врахуйте, що значення IRQL зберігається в двох місцях. Перше місце, в якому представлений поточний IRQL, - це область управління процесором (processor control region, PCR), а друге - його розширення, блок управління областю процесора (processorregioncontrolblock, PRCB), який містить збережений IRQL в поле DebuggerSaveIrql. PCR і PRCB містять інформацію про стан кожного процесора в системі, в тому числі поточний IRQL, покажчик на апаратну IDT-таблицю, відомості про поточний потоці і наступному, обраному для запуску потоці.

Відео: Черга потоків c #. приклад програми

Ядро і HAL використовують цю інформацію для виконання дій, орієнтованих на конкретну архітектуру і конкретну машину. Частини структур PCR і PRCB відкрито визначені в заголовки Ntddk.h, що відноситься до інструментарію Windows Driver Kit (WDK).

Вміст PCR поточного процесора можна переглянути за допомогою відладчика ядра, використовуючи команду! Pcr. Для перегляду PCR конкретного процесора потрібно після команди додати номер процесора, відокремивши його від команди пропуском:

lkd>! pcr 0

KPCR for Processor 0 at fffff80001bfad00:

Major 1 Minor 1

NtTib.ExceptionList: fffff80001853000

NtTib.StackBase: fffff80001854080

NtTib.StackLimit: 000000000026ea28

NtTib.SubSystemTib: fffff80001bfad00

NtTib.Version: 0000000001bfae80

NtTib.UserPointer: fffff80001bfb4f0

Відео: 2302 - PHP - урок 6

NtTib.SelfTib: 000007fffffdb000

SelfPcr: 0000000000000000

Prcb: fffff80001bfae80

Irql: 0000000000000000

IRR: 0000000000000000

IDR: 0000000000000000

InterruptMode: 0000000000000000

IDT: 0000000000000000

GDT: 0000000000000000

TSS: 0000000000000000

CurrentThread: fffff80001c08c40

NextThread: 0000000000000000

IdleThread: fffff80001c08c40

DpcQueue:

Оскільки зміна IRQL процесора істотно впливає на роботу системи, це зміна має вноситися тільки в режимі ядра - потоки користувальницького режиму внести ці поправки не можуть. Це означає, що IRQL процесора при виконанні коду в призначеному для користувача режимі завжди знаходиться на пасивному рівні. Рівень IRQL може бути підвищений лише при виконанні коду в режимі ядра.

У кожного рівня переривання є своя конкретна мета. Наприклад, ядро видає межпроцессорной переривання (Interprocessor interrupt, IPI), Щоб запросити виконання дії на іншому процесорі, наприклад, диспетчеризацію конкретного потоку для виконання або поновлення кеш-пам`яті його буфера швидкого перетворення адреси (Translation look-aside buffer, TLB). Через певні періоди часу системний годинник генерують переривання, а ядро реагує на нього, оновлюючи значення годин і вимірюючи час виконання потоку.

Якщо апаратна платформа підтримує два годинники, ядро додає ще один рівень переривання від системного годинника для вимірювання продуктивності.

HAL надає відразу кілька рівнів переривань для використання пристроями, керованими за допомогою переривань. Конкретна кількість цих рівнів залежить від процесора і конфігурації системи. Ядро використовує програмні переривання (що розглядаються далі) для ініціації планування потоків і для асинхронного втручання у виконання потоку.

Поділитися в соц мережах:
Схожі
» » Рівні запитів програмних переривань (irql)