Interrupt Request Level
IRQL - Interrupet Request Level์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ ํ์ ์ CPU ์ฒ๋ฆฌ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ ๋ฒจ์
๋๋ค.
CPU๊ฐ PASSIVE_LEVEL(0)๋ณด๋ค ๋์ IRQL์์ ์คํ๋๊ณ ์์ผ๋ฉด ํด๋น ์์
์ ๋ฌด์กฐ๊ฑด ๋ ๋์ IRQL์์ ์คํ๋๋ ์์
์๋ง ์ ์ ๋นํ ์ ์์ต๋๋ค.
wdm.h์ ์ ์๋์ด ์๋ IRQL ๋ฆฌ์คํธ๋ ์๋์ ๊ฐ์ต๋๋ค. ์ํคํ
์ฒ๋ง๋ค IRQL์ด ์กฐ๊ธ์ฉ ๋ค๋ฅธ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
//wdm.h
#if defined(_X86_)
//
// Interrupt Request Level definitions
//
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 // APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
#define CMCI_LEVEL 5 // CMCI handler level
#define PROFILE_LEVEL 27 // timer used for profiling.
#define CLOCK1_LEVEL 28 // Interval clock 1 level - Not used on x86
#define CLOCK2_LEVEL 28 // Interval clock 2 level
#define IPI_LEVEL 29 // Interprocessor interrupt level
#define POWER_LEVEL 30 // Power failure level
#define HIGH_LEVEL 31 // Highest interrupt level
#define CLOCK_LEVEL (CLOCK2_LEVEL)
#endif
#if defined(_AMD64_)
//
// Interrupt Request Level definitions
//
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 // APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
#define CMCI_LEVEL 5 // CMCI handler level
#define CLOCK_LEVEL 13 // Interval clock level
#define IPI_LEVEL 14 // Interprocessor interrupt level
#define DRS_LEVEL 14 // Deferred Recovery Service level
#define POWER_LEVEL 14 // Power failure level
#define PROFILE_LEVEL 15 // timer used for profiling.
#define HIGH_LEVEL 15 // Highest interrupt level
#endif
#if defined(_IA64_)
//
// Define Interrupt Request Levels.
//
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 // APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
#define CMC_LEVEL 3 // Correctable machine check level
#define DEVICE_LEVEL_BASE 4 // 4 - 11 - Device IRQLs
#define PC_LEVEL 12 // Performance Counter IRQL
#define IPI_LEVEL 14 // IPI IRQL
#define DRS_LEVEL 14 // Deferred Recovery Service level
#define CLOCK_LEVEL 13 // Clock Timer IRQL
#define POWER_LEVEL 15 // Power failure level
#define PROFILE_LEVEL 15 // Profiling level
#define HIGH_LEVEL 15 // Highest interrupt level
#endif
#define LOW_PRIORITY 0 // Lowest thread priority level
#define LOW_REALTIME_PRIORITY 16 // Lowest realtime priority level
#define HIGH_PRIORITY 31 // Highest thread priority level
#define MAXIMUM_PRIORITY 32 // Number of thread priority levels
#define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects
#define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended
C
๋ณต์ฌ
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ ์ ๋ ๋ฒจ๊ณผ ๋๋ถ๋ถ์ ์ปค๋ ๋ ๋ฒจ ๋๋ผ์ด๋ฒ๋ PASSIVE_LEVEL(0)์์ ๊ตฌ๋๋๋ฉฐ
ํน์ ๋ฃจํด์ ๊ฒฝ์ฐ ํน์ ์กฐ๊ฑด์ IRQL ๋ด์์ ๊ตฌ๋๋ฉ๋๋ค.
โข
0~2 : ์ผ๋ฐ์ ์ธ IRQL, ์ํํธ์จ์ด ์ธํฐ๋ฝํธ ๋ผ๊ณ ๋ ํฉ๋๋ค.
โข
3~26 / 3~12 : DIRQL - Device IRQL ์ ํ๋์จ์ด ๋๋ฐ์ด์ค์์ ์ฌ์ฉํ๋ IRQL ๋ ๋ฒจ์ด๋ฉฐ ํํ๋ค DIRQL์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
DIRQL_Numbering์ผ๋ก ๊ธฐ์
ํ ์ด์ ๋ ๋ฌธ์ ๋ง๋ค ์ซ์์ ์ด๋ฆ์ด ๋ฌ๋ผ ํผ๋์ ์ฌ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
โข
27~31 / 13~15 : ์ปดํจํฐ ์ ์, ๋ฒ๊ทธ ํธ๋ค๋ง, CPU ํด๋ญ ๋ฑ์ ๊ด๋ จ๋ ๋ถ๋ถ์ด๋ฉฐ HIGH_LEVEL์๋ ์ต๋ ์ ์ ๋ชจ๋ ์ ์ํ๋๋ ์์
๋ค์ด ํฌํจ๋์ด ์์ต๋๋ค.
Interrupt Service Routine
ISR - Interrupt Service Routine ๋๋ Interrupt Handler๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์ธํฐ๋ฝํธ ๋ฃจํด ์คํ ๋ฐ ๊ธฐ์กด ์คํ์ค์ธ ๋ฃจํด๊ณผ์ ๋น๊ต ๋ฑ์ ์ํํฉ๋๋ค.
ISR์ ์คํ ๋ก์ง ์๋์ ๊ฐ์ต๋๋ค.
1.
์ธํฐ๋ฝํธ ๋ฐ์ ์ ๋ฐ์ ์์ ์ ์ ๋ณด(Register) ์ ์ฅ
2.
์งํ์ค์ธ ์ธํฐ๋ฝํธ ๋ฃจํด๊ณผ IRQL์ ๋น๊ตํ์ฌ ์ํ ๋๋ ๋๊ธฐ
3.
๊ธฐ์กด์ ์งํ์ค์ด๋ ์ธํฐ๋ฝํธ ๋ฃจํด์ด ์์ ๊ฒฝ์ฐ ์ด๊ธฐํํ์ฌ ๋ฃจํด ์คํ ์ ์์ ์ผ๋ก ๋ณต๊ตฌ
4.
์๋ฃ ํ IRQL์ ๋ฐ๋ผ์ ์์ฐจ์ ์งํ
๊ทธ๋ฆผ1. IRQL์ ๋ฐ๋ฅธ ์คํ ์๊ฐ
IRQL ๊ณผ Paging
ํน์ IRQL์์๋ง ๊ตฌ๋ ๊ฐ๋ฅํ ํจ์๋ค์ด ์กด์ฌํฉ๋๋ค.
KeWaitForSingleObject ํจ์์ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ IRQL์ด ๋ฌ๋ผ์ง๋๋ค.
ํจ์์ ํ๋ผ๋ฏธํฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
NTSTATUS
KeWaitForSingleObject (
PVOID Object,
KWAIT_REASON WaitReason,
KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable,
PLARGE_INTEGER Timeout
);
C
๋ณต์ฌ
1.
๊ธฐ๋ณธ์ ์ผ๋ก KeWaitForSingleObject๋ IRQL โค DISPATCH_LEVEL์์๋ง ๊ตฌ๋๋ฉ๋๋ค.
2.
๊ทธ๋ฌ๋ Timeout ์ด NULL์ด๊ฑฐ๋ *Timeout์ด 0์ด ์๋๊ฒฝ์ฐ KeWaitForSingleObject๋ ๋๊ฐ์ง ์กฐ๊ฑด์ ๊ฐ์ง๋๋ค.
a.
IRQL โค APC_LEVEL
b.
ํน์ ์ค๋ ๋ ์ปจํ์คํธ์์ ํธ์ถํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ์ฒ๋ผ ํน์ IRQL์์๋ง ๊ตฌ๋ ๊ฐ๋ฅํ๊ณ , ํ๋ผ๋ฏธํฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ์๋ IRQL์ด ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๋ ์กด์ฌํฉ๋๋ค.
DIRQL์์ ์ ๊ทผํ๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ NonPagedPool์ ์กด์ฌํด์ผ ํฉ๋๋ค.
์ ํํ๋ DIRQL์์๋ ์ ๋ Page Fault๊ฐ ๋ฐ์ํ๋ฉด ์๋ฉ๋๋ค.