Search
๐ŸชŸ

IRQL - Interrupt Request Level

Date
Select
Tags

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๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.