Search

인터럽트에 대한 모든 것

class
운영체제 심화
상태
완료
날짜
목차

인터럽트

인터럽트에 대해서는 기본적으로 이전 운영체제에서 설명했습니다.
이번 페이지에서는 인터럽트 서비스 루틴과 인터럽트에 대한 세부적인 부분까지 다뤄보겠습니다.

인터럽트 서비스 루틴

인터럽트 서비스 루틴은 인터럽트 작업을 처리할 때 사용하는 특별한 함수입니다.
예를 들어 외부 장치에서 데이터를 받아야 할 때, 인터럽트 서비스 루틴이 활성화되어 그 상황을 처리합니다.
이는 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이 순차적으로 호출되어, 인터럽트의 원인을 찾을 때까지 반복됩니다.