소프트웨어 인터럽트 요청 레벨(IRQL)

By 01/11/2018Windows Internal

소프트웨어 인터럽트 요청 레벨(IRQL)

  • Windows Server 2008

 

인터럽트 컨트롤러는 인터럽트 우선순위 레벨로 동작하긴 하지만 윈도우 역시 인터럽트 요청 레벨(Interrupt Request Level)로 불리는 자신만의 인터럽트 순위 방식을 사용한다. 커널은 내부적으로 IRQL을 x86(0 ~31의 값), x64, IA64(0~15값)를 가지고 있다.

 

커널이 소프트웨어 인터럽트에 대한 표준 IRQL 값을 정의하더라도 HAL은 하드웨어 인터럽트 값을 IRQL에 매핑한다.

 

 

인터럽트는 우선순위에 따라 서비스 된다. 좀더 높은 우선순위의 인터럽트가 서비스 중인 낮은 우선순위의 인터럽트를 선점한다. 높은 우선순위의 인터럽트가 발생할 때 프로세서는 인터럽트된 스레드의 상태를 저장하고 발생된 인터럽트와 연관된 트랩 디스패처를 호출 한다. 트랩 디스패처는 IRQL을 상승시키고 인터럽트 서비스 루틴을 호출 한다. 서비스 루틴이 실행하고 나면 인터럽트 디스패처는 인터럽트가 발생하기 이전의 IRQL로 프로세서의 IRQL을 낮춘다. 그리고 저장된 머신의 상태를 복구 한다. 인터럽트된 스레드는 실행을 멈춘 지정에서부터 실행을 재개한다. 커널이 IRQL을 낮출 때 마스크되었던 좀 더 낮은 우선순위의 인터럽트가 실행 된다. 이 상황이 발생한다면 커널은 새로운 인터럽트를 처리하기 위해 인터럽트 처리과정을 반복 한다.

 

각 프로세서의 IRQL 설정은 프로세서가 받을 수 있는 인터럽트를 결정한다. IRQL은 또한 커널모드 데이터 구조체 접근을 동기화 하는데 사용되기도 한다.

 

 

PIC 접근은 상대적으로 느린 동작이기 때문에 PIC와 32비트 APIC 시스템의 경우 IRQL을 변경하기 위해 I/O 버스의 접근을 필요로 하는 HAL은 PIC 접근을 피하는 레이지(lazy) IRQL로 불리는 성능 최적화를 구현한다. IRQL이 상승될 때 HAL은 인터럽트 마스크를 변경하는 대신 내부적으로 새로운 IRQL을 기록해 둔다. 좀더 낮은 우선순위의 인터럽트가 바로 이어서 발생 한다면 HAL은 첫 번째 인터럽트에 알맞게끔 적절한 설정으로 인터럽트 마스크를 설정하고 IRQL이 낮아질 때 까지 좀더 낮은 우선순위의 인터럽트를 지연 시킨다.

 

커널모드 스레드는 하려는 일에 따라 자신이 실행되는 프로세서의 IRQL을 상승시키고 낮춘다. 이것은 인터럽트를 서비스하고 있는 프로세서가 동일하거나 좀더 낮은 레벨의 인터럽트에 의해 중단 되지 않게 보장한다. 따라서 커널과 디바이스 드라이버를 포함한 시스템의 모든 구성 요소는 IRQL을 패시브 레벨로 유지하려고 한다. IRQL이 불필요하게 오랜 기간 동안 상승된 채로 있지 않다면 디바이스 드라이버는 하드웨어 인터럽트를 적시에 처리할 수 있기 때문에 IRQL을 패시브 레벨로 유지하려고 한다.

 

 

[인터럽트를 IRQL에 매핑하기]

IRQL은 인터럽트 컨트롤러에 의해 정의된 인터럽트 요청(IRQ)과는 다르다. 윈도우가 실행되는 아키텍처는 하드웨어에 있어 IRQL 개념을 구현하지 않는다. 윈도우는 디바이스 드라이버의 한 유형인 버스 드라이버가 자신의 버스에 존재하는 디바이스와 이들 디바이스에 할당 할 수 있는 인터럽트를 결정한다. 버스 드라이버는 이 정보를 플러그앤플레이 관리자에 보고 한다. 플러그앤플레이 관리자는 여타 모든 여러 디바이스에 대해 수용 가능한 인터럽트 할당을 고려해 각 디바이스에 어떤 인터럽트를 할당 할 것인지 결정한다. 그런 다음에 버스 드라이버는 플래그엔 플레이 인터럽트를 IRQL로 매핑하는 인터럽트 중재자를 호출한다.

 

 

 

[인터럽트 객체]

커널은 디바이스 드라이버가 자신의 디바이스에 대해 ISR을 등록할 수 있게 해주는 간편한 메커니즘을 제공한다. 인터럽트 객체에는 ISR의 주소와 디바이스 인터럽트의 IRQL, ISR과 관계있는 모든 정보가 있다. 인터럽트 객체가 초기화될 때 디스패치 코드로 불리는 어셈블리 언어로 된 일부 명령 코드가 인터럽트 핸들링 템플릿으로부터 복사돼 인터럽트 객체에 저장된다. 인터럽트가 발생할 때 이 코드가 실행 된다. 이 인터럽트 객체에 존재하는 코드가 실제 인터럽트 디스패처를 호출하면서 인터럽트 객체의 포인터를 인자로 전달한다.

 

다음 그림은 인터럽트 객체와 연관된 전형적인 제어 흐름을 보여 준다.

 

[참고자료]

Windows Internals

 

OS, Windows, 윈도우아키텍처, Windowsinternals, OS아키텍처, 윈도우서버, WindowsServer, IRQL, 소프트웨어인터럽트요청레벨, sqlmvp, SQL Angeles

Leave a Reply

%d bloggers like this: