목차
인터럽트
인터럽트에 대해서는 기본적으로 이전 운영체제에서 설명했습니다.
이번 페이지에서는 인터럽트 서비스 루틴과 인터럽트에 대한 세부적인 부분까지 다뤄보겠습니다.
인터럽트 서비스 루틴
인터럽트 서비스 루틴은 인터럽트 작업을 처리할 때 사용하는 특별한 함수입니다.
예를 들어 외부 장치에서 데이터를 받아야 할 때, 인터럽트 서비스 루틴이 활성화되어 그 상황을 처리합니다.
이는 CPU가 일반 작업을 잠시 중단하고 긴급한 작업을 먼저 처리한 다음 일반 작업으로 돌아가는 방식으로 작동합니다.
인터럽트 처리 과정
1.
인터럽트 발생 : 하드웨어 장치나 소프트웨어 프로세스로부터 인터럽트 신호가 발생합니다.
2.
인터럽트 요청 식별 : CPU는 현재 진행 중인 작업을 일시 중지하고 인터럽트 요청을 식별합니다.
3.
인터럽트 벡터 사용 : 인터럽트 벡터를 사용하여 해당 인터럽트에 대응하는 ISR(인터럽트 서비스 루틴)을 찾습니다.
4.
ISR 실행 : ISR은 인터럽트를 처리합니다.
5.
작업 복귀 : ISR 실행 후, 시스템은 중단된 작업으로 복귀하거나 새로운 작업을 시작할 수 있습니다.
ISR의 특징
•
속도가 중요 : ISR은 가능한 한 빨리 실행되어야 합니다. 이는 인터럽트 처리 지연을 최소화하여 시스템 성능에 미치는 영향을 줄이기 위함입니다.
•
원자성 : ISR은 보통 '원자적'으로 실행되어야 하며, 중간에 다른 인터럽트에 의해 중단되어서는 안 됩니다.
인터럽트 벡터
인터럽트 벡터는 인터럽트 서비스 루틴의 주소를 나타냅니다.
인터럽트가 발생하면, CPU는 이 인터럽트 벡터를 참조하여 해당 인터럽트에 대응하는 ISR을 찾고 실행합니다.
인터럽트 벡터 테이블의 기본 구조
1.
인덱스 : 각 인터럽트 소스는 인터럽트 벡터 테이블 내에서 고유한 위치를 가집니다.
2.
ISR 주소 : 각 인덱스에는 인터럽트가 발생했을 때 호출되어야 하는 ISR의 메모리 주소가 저장됩니다.
3.
저장 형식 : 인터럽트 벡터 테이블은 고정된 메모리 주소에 위치하거나, 특정 레지스터에 설정된 기준 주소를 통해 참조될 수 있습니다.
인덱스 예시
•
0 ~ 31: 이 범위의 인터럽트는 프로세서가 내부적으로 사용하는 예외에 할당됩니다. 예를 들어, 0은 'Divide by Zero' 예외, 6은 'Invalid Opcode' 예외를 처리합니다.
•
32 ~ 255: 이 범위는 사용자 정의 인터럽트에 사용되며, 주로 하드웨어 인터럽트(IRQ)를 처리하는데 사용됩니다. 예를 들어, 32번은 타이머 인터럽트, 33번은 키보드 인터럽트 등을 처리합니다.
인터럽트 요청 라인
인터럽트 요청라인은 하드웨어 장치가 인터럽트를 요청할 수 있는 수단입니다.
인터럽트 요청라인의 구조와 작동 원리
1.
하드웨어 연결 : 각 IRQ는 하나 이상의 하드웨어 장치에 연결됩니다. 예를 들어, IRQ0은 시스템 타이머에, IRQ1은 키보드에 할당되어 있습니다.
2.
신호 발생 : 하드웨어 장치에서 처리가 필요한 상황이 발생하면, 해당 장치는 연결된 IRQ 라인을 통해 인터럽트 신호를 CPU에 전송합니다.
3.
인터럽트 핸들러 호출 : CPU는 인터럽트 벡터 테이블을 사용하여 해당 IRQ에 할당된 인터럽트 서비스 루틴의 주소를 찾고, ISR을 실행하여 인터럽트를 처리합니다.
IRQ의 특징
•
우선 순위 : IRQ 라인은 일반적으로 우선 순위가 지정되어 있어, 동시에 여러 인터럽트 요청이 발생했을 때 처리 순서를 결정합니다. 낮은 번호의 IRQ가 높은 우선 순위를 갖는 경우가 일반적입니다.
인터럽트 서비스 루틴은 원자성이 보장되어야 하기 때문에, 일반적으로 인터럽트의 우선순위는 이 인터럽트 요청 라인을 통해 조정합니다.
•
공유 가능성 : 특정 시스템에서는 여러 장치가 동일한 IRQ를 공유할 수 있습니다. 이 경우, ISR은 각 장치를 체크하여 실제 인터럽트를 발생시킨 장치를 정확히 식별해야 합니다.
•
인터럽트 마스킹 : 일부 IRQ는 '마스킹'이 가능하여, 필요하지 않은 경우 인터럽트 요청을 일시적으로 무시할 수 있습니다. 이는 인터럽트 처리 중에 발생할 수 있는 성능 저하를 방지하기 위해 사용됩니다.
보통 마스킹을 하면 해당 요청을 무시한다고 표현하지만, 좀 더 정확하게는 해당 요청을 일시적으로 무시, 즉 지연시키는 것입니다.
인터럽트 마스킹
인터럽트 마스킹은 특정 인터럽트 라인을 일시적으로 비활성화하는 기능입니다.
마스크 가능 인터럽
마스크 가능 인터럽트는 활성화 또는 비활성화할 수 있는 인터럽트입니다.
특징
•
활성화/비활성화 제어 : 소프트웨어를 통해 이러한 인터럽트의 활성화 상태를 제어할 수 있습니다.
•
우선 순위 설정: 마스크 가능 인터럽트는 종종 우선 순위가 매겨져 있으며, 높은 우선 순위의 인터럽트가 낮은 우선 순위의 인터럽트를 잠시 중단시킬 수 있습니다.
마스크 불가능 인터럽트
마스크 불가능 인터럽트는 이름에서 알 수 있듯이 비활성화할 수 없는 인터럽트입니다.
특징
•
항상 활성화 : 시스템의 안정성과 보안을 위해 언제나 활성화되어 있습니다. 이러한 인터럽트는 시스템의 중대한 오류를 처리하거나 예기치 않은 상황에 대응하기 위해 필요합니다.
•
높은 우선 순위 : 거의 모든 다른 인터럽트보다 높은 처리 우선 순위를 갖습니다.
인터럽트 체인
여러 장치가 동일한 인터럽트 요청 라인을 공유할 때 사용되는 인터럽트 처리 기법입니다.
인터럽트 체인의 상세한 작동 원리
1.
인터럽트 발생 : 공유 IRQ 라인을 사용하는 장치 중 하나가 인터럽트를 발생시킵니다.
2.
ISR 호출 : CPU는 인터럽트 벡터 테이블에서 해당 IRQ에 등록된 첫 번째 ISR의 주소를 찾아 호출합니다.
3.
장치 확인 : 호출된 ISR은 자신에 연결된 하드웨어 장치가 인터럽트를 발생시켰는지 확인합니다.
4.
인터럽트 처리 : 해당 장치에서 인터럽트가 발생했다면, ISR은 필요한 처리를 수행하고 인터럽트를 "확인" 처리합니다. 이 처리 후, ISR은 더 이상의 ISR 호출 없이 종료됩니다.
5.
체인 순회 : 만약 첫 번째 ISR에서 인터럽트가 처리되지 않았다면, 다음 연결된 ISR로 넘어갑니다. 이 과정은 모든 연결된 ISR이 순차적으로 호출되어, 인터럽트의 원인을 찾을 때까지 반복됩니다.