커널모드 프로그램밍에서 중요한 개념인 하드웨어 인터럽트 우선권에 대해서 알아보겠습니다. 윈도우 2000이상 커널에서는 HAL 개념을 이용해서 모든 플랫폼에 적용시키기 위한 추상적인 스키마를 제공합니다.
이러한 우선권 추상화에 대한 기본이 되는 것이 바로 인터럽트 요청 레벨(IRQL)이다. IRQL은 단순하게 우선순위를 정의한 값입니다. 그러나 가장 중요한 법칙이 하나 있습니다.
[주어진 IRQL에서 수행되는 코드는 그 보다 낮은 IRQL의 코드나 동일한 IRQL 코드에 의해 인터럽트 될 수 없다]

<표 IRQL 운선순위>
인터럽트 처리 과정
위 표와 같이 인터럽트가 CPU에 도달하면 프로세서는 요청된 인터럽트의 IRQL값을 현재 CPU를 점유하고 있는 IRQL값과 비교해서 요청한 IRQL이 현재의 IRQL보다 낮거나 같다면 요청에 대한 처리가 거부되고, IRQL 레벨이 보다 낮은 값으로 떨어질 때까지 지연된 상태로 남아 있는다.
반대로 요청된 IRQL이 현재 CPU가 사용하고 있는 CPU IRQL보다 크다면 프로세서는 아래와 같은 과정에 따라 수행됩니다.
1. 현재의 명령의 수행을 중지한다.
2. 인터럽트 된 코드를 나중에 수행하기 위해서 스택에 충분한 상태정보를 저장한다.
3. 요청된 IRQL값과 같도록 CPU의 IRQL을 상승시키고, 현재보다 낮은 권한의 인터럽트가 일어나지 않도록 한다.
4. 요청된 인터럽트에 적절한 인터럽트 서비스 루틴으로 제어권을 넘긴다.

<IRQL 작동 방식 그림>
위와 같은 IRQL의 동작방식은 보다 “높은 IRQL의 요청이 낮은 IRQL의 코드를 인터럽트 요청 할 수 있도록 한다.” 입니다. (인터럽트의 인터럽트) 이러한 매커니즘은 스택에 기반한 동작이기 때문에 동작에 혼동될 염려가 없는 장점이 있습니다. 그러나 동기화를 사용하는 쪽에서 처리해야 한다라는 조건이 있습니다.
소프트웨어 인터럽트
Posted by 혁쌈

