트랩 디스패칭과 인터럽트 디스패칭 그리고 하드웨어 인터럽트 처리
- Windows Server 2008
[트랩 디스패칭]
인터럽트와 예외는 프로세서가 정상적인 제어 흐름을 벗어난 코드를 실행하게끔 하는 운영체제의 상태이다. 트랩이라는 용어는 예외나 인터럽트가 발생할 때 현재 실행 스레드를 캡처해 운영체제 내의 정해진 위치로 제어를 이행하는 프로세서 메커니즘을 말한다.
윈도우에서 프로세서는 특정 인터럽트나 예외를 처리하는 함수인 트랩 핸들러로 제어를 이행 한다.
커널에서 인터럽트는 프로세서가 실행중인 것과는 무관한 비동기 이벤트(어느 때나 발생 할 수 있는 것)이다. 주로 I/O 디바이스나 프로세서 클록이나 타이머에 의해 인터럽트가 발생되며 인터럽트는 활성화 되거나 비활성화 될 수 있다.
예외는 특정 명령의 실행으로 유발되는 동기적 조건이다. 동일한 조건에서 동일한 데이터로 어떤 프로그램을 두 번 실행해도 예외는 재현 된다. 커널은 시스템 서비스 호출도 예외로 간주 된다.
하드웨어와 소프트웨어 둘 다 예외와 인터럽트를 발생할 수 있다. 예를 들어 버스오류 예외는 하드웨어 문제로 인해 발생되며 0으로 나누기 예외는 소프트웨어 버그의 결과이다.
하드웨어 예외나 인터럽트가 발생할 때 프로세서는 인터럽트된 스레드의 커널 스택에 머신 상태를 기록해 마치 아무 일도 없었던 것처럼 제어 흐름상에 인터럽트가 발생한 지점으로 복귀해 실행을 계속 하게 한다. 스레드가 유저모드에서 실행하고 있었다면 윈도우는 스레드의 커널모드 스택으로 전환한 다음에 인터럽트된 스레드의 커널 스택에 트랩 프레임을 생성한다. 트랩 프레임은 완전한 스레드 컨텍스트의 서브셋이며 커널 디버거에서 dt nt!_ktrap_frame 명령으로 트랩 프레임의 정의를 볼 수 있다.
커널은 소프트웨어 인터럽트를 하드웨어 인터럽트 처리의 일부분으로 처리하거나 스레드가 소프트웨어 인터럽트와 연관된 커널 함수를 호출할 때 동기적으로 처리 한다.
[인터럽트 디스패칭]
하드웨어에 의해 발생되는 인터럽트는 일반적으로 I/O 디바이스가 서비스를 필요로 할 때 프로세서에 통지해야만 하는 I/O 디바이스에서 발생 한다. 인터럽트 방식으로 작동하는 디바이스 덕택에 운영체제는 I/O 동작과 중앙 처리를 함께 병행함으로써 프로세서를 최대한으로 사용할 수 있다.
포인팅 디바이스와 프린터, 키보드, 디스크 드라이브, 네트워크 카드는 일반적으로 인터럽트 방식으로 동작 한다.
시스템 소프트웨어 역시 인터럽트를 발생할 수 있다. 커널은 프로세서가 인터럽트 되지 않게 인터럽트를 비활성화 시킬 수도 있다. 인터럽트 비활성화는 프로세서가 인터럽트나 예외 디스패칭을 처리하는 것처럼 매우 긴급한 순간에만 이루어 진다.
커널은 디바이스 인터럽트에 응답하는 인터럽트 트랩 핸들러를 설치한다. 인터럽트 트랩 핸들러는 인터럽트를 처리하는 외부 루틴(ISR)이나 인터럽트에 응답하는 내부 커널 루틴으로 제어를 옮긴다. 디바이스 드라이버는 디바이스 인터럽트를 서비싱하는 ISR을 제공하고 커널은 그 이외의 인터럽트 유형에 대한 인터럽트 처리 루틴을 제공한다.
[하드웨어 인터럽트 처리]
윈도우가 지원하는 하드웨어 플랫폼에서 외부 I/O 인터럽트 컨트롤러에 있는 여러 라인 중에 한 라인을 통해 오며 이때 컨트롤러는 단일 라인으로 프로세서를 인터럽트 한다. 프로세서가 인터럽트 되면 프로세서는 인터럽트 요청(IRQ)을 구하기 위해 컨트롤러에게 질의를 한다. 인터럽트 컨트롤러는 IRQ를 인터럽트 번호로 변환해 인터럽트 디스패치 테이블 구조체의 인덱스로 사용하고 적절한 인터럽트 디스패치 루틴으로 제어를 넘긴다. 시스템 부팅 시에 윈도우는 각 인터럽트와 예외를 처리하는 커널 루틴의 포인터로 IDT를 채운다.
윈도우는 하드웨어 IRQ를 IDT 내의 인터럽트 번호에 매핑하며 시스템은 예외에 대한 트랩 핸들러를 구성하기 위해 IDT를 사용한다. 각 프로세서는 자신만의 IDT를 가지므로 서로 다른 프로세서는 다른 ISR을 실행할 수 있다.
[참고자료]
Windows Internals
'Windows , IIS' 카테고리의 다른 글
소프트웨어 인터럽트 요청 레벨(IRQL) (0) | 2015.07.16 |
---|---|
x86 x64 IA64 인터럽트 컨트롤러 (0) | 2015.07.16 |
시스템 프로세스 (0) | 2015.07.16 |
디바이스 드라이버 (0) | 2015.07.16 |
하드웨어 추상화 계층(HAL) (0) | 2015.07.16 |