윈도우 인터럽트 지연처리에 대해서

(무선)네트워크 2009. 9. 30. 01:34 Posted by 알 수 없는 사용자


IDT 후킹을 공부하다가 인터럽트 지연처리에 대해서 고찰해 보았다.

주변 기계장치에서 CPU에게 통지해야될 일이 생기면 인터럽트를 사용한다. 인터럽트가 발생하면 이를 처리하기 위하여 ISR(Interrupt Service Routine)이 수행된다. 

이 인터럽트에도 우선순위가 있어 우선순위 대로 실행된다. 이 우선순위를 IRQL이라고 하는데, 그럼 IRQL에 대하여 알고 넘어가보자


Passive Level은 평상시 쓰레드에서 루틴이 수행될 때의 상태이다. ACP Level ~ Dispatch Level은 소프트웨어 인터럽트에 해당하며, 그 이상의 레벨을 총칭 하드웨어 인터럽트라고 부른다. 참고로 Passive Level 에서 보통 루틴이 수행되며 코드로 코딩하여 올릴 수 있는 레벨은 Dispatch Level까지 이다.

IRQL은 인터럽트에 대한 우선권을 부여한 것으로 IRQL이 높은 인터럽트가 먼저 수행된다. 특정 ISR이 수행되던 중 현재 수행되는 ISR보다 IRQL이 높은 인터럽트가 발생한다면 당연히 현재 수행하던 ISR을 멈추고, IRQL이 높은 인터럽트를 수행할 것이다.

그러면 다시 인터럽트 지연처리로 돌아와 보자

만약 키보드와 같은 하드웨어에서 인터럽트가 발생했다고 생각해 보자 그럼 Device Level(DIRQL) 어딘가에서 인터럽트가 발생 할 것이고, 현재 수행되던 작업이 멈추게 될 것이다. 키보드에서 발생한 인터럽트 처리가 완료 된 후 다시 이전 작업을 수행하게 되는데 키보드에서 발생한 인터럽트가 오랜시간을 요구하는 작업이라면 그 작업을 처리하는 시간동안 다른 작업들은 지연될 것이다.  이러한 비효율성을 없애기 위해 인터럽트 지연처리가 존재한다.
 
리눅스에서는 이런 이유로 인터럽트를 Top Half와 Bottom Half로 나눠서 실행하며 윈도우에서는 DPC(Deferred Procedure Call)를 이용하여 가능하게 한다. 인터럽트가 발생했을 당시 즉시 처리해야될 작업은 미리 처리 해 놓고, 조금 나중에 처리해도 될 작업들을 DPC Queue에 넣어 둔다. 그리고 멈추었던 작업을 수행해서 시스템을 효율적으로 사용한다. 

DPC Queue에 있는 루틴들이 다시 호출되는 시점은 Dispatch Level이 되는 시점에 DPC Dispatcher(DPC 스케줄러)에 의해 다시 호출된다.

단순히 혼자 생각이지만 DPC루틴은 Dispatch Level에서 동작하는데 이것을 보고 예술이라고 생각한다. Dispatch Level이라면 소프트웨어 인터럽트의 최고 단계이다. 즉 조금나중에 처리해도 별 문제 될 작업이 아니지만 처리는 해야되기 때문에 하드웨어 인터럽트에는 선점당할 수 있으나, 소프트웨어 인터럽트에는 선점당할 수 없게 만들어 놓은것이 아닐까 생각해 보면 딱 맞아 떨어지 때문이다.





PS : 디바이스 드라이버에 대해서 공부 할 수 있는 문서


문서출처 : www.kosr.org