ARM 아키텍처에서는 메모리 어보트 타입과 더불어 외부 인터럽트도 익셉션의 한 종류로 처리합니다. 외부 인터럽트는 메모리 어보트와 달리 하나의 기능으로 동작하므로, 외부 인터럽트의 익셉션 핸들러는 인터럽트 서비스 루틴을 실행합니다. 인터럽트 서비스 루틴을 통해 외부 하드웨어의 변화에 대해 소프트웨어적인 처리를 수행합니다.

그런데 인터럽트 타입 익셉션은 메모리 어보트 타입 익셉션과 어떤 차이점이 있을까요? 메모리 어보트 타입 익셉션은 ARM 코어가 명령어를 제대로 실행할 수 없는 상황에서 유발됩니다. 하지만, 인터럽트 타입 익셉션은 메모리 어보트 타입 익셉션과 달리 외부 하드웨어가 인터럽트라는 전기 신호를 발생시키면 ARM 코어가 이를 익셉션의 한 종류로 받아 처리하는 것입니다. 즉, 외부 하드웨어에서 어떤 변화를 알리기 위해 인터럽트라는 전기 신호를 발생하면 이를 소프트웨어적으로 처리하기 위한 인터페이스이자 운영체제 커널의 기능 중 하나인 것입니다.

인터럽트 타입 익셉션에 대해 소개했으니 다음 그림을 보면서 인터럽트 타입 익셉션의 전체 실행 흐름을 알아봅시다. 

 


그림 8.3 인터럽트 타입 익셉션의 전체 실행 흐름

익셉션의 전체 실행 흐름도는 5단계로 분류할 수 있는데, 각 단계 별로 어떤 동작을 수행하는지 알아봅시다. 

 


1단계: 프로세스가 실행하는 도중에 외부 인터럽트 발생 

 

먼저 ①로 표시된 부분을 따라가 봅시다. 프로세스가 실행하는 도중에 외부 하드웨어에서 인터럽트가 발생하는 부분을 나타냅니다. 소프트웨어 관점으로 보면, 프로세스가 실행 중에 인터럽트가 발생하면 프로세스의 실행 흐름이 멈추게 되는 것입니다.

 

2단계: ARM 프로세서가 익셉션을 감지 

 

② 로 표시된 부분은 ARM 프로세서가 인터럽트 타입 익셉션을 감지하는 동작입니다. 1단계에서 외부 하드웨어에서 인터럽트가 발생하면 ARM 코어는 다음과 같은 익셉션을 유발합니다.  

    ❑ IRQ interrupt
    ❑ FIQ interrupt

②~③으로 표기된 부분의 외곽에 보이는 테두리는 ARM 프로세서가 하드웨어적으로 처리하는 동작을 나타냅니다. 

 


3단계: ARM 프로세서가 익셉션에 대한 세부 처리 

 

③으로 표기된 박스를 보겠습니다. 익셉션을 감지한 ARM 프로세서(ARMv7 기준)는 다음과 같은 동작을 처리합니다.

    ❑ 익셉션이 발생한 모드를 나타내는 spsr_irq 레지스터에 저장한다. 
    ❑ ARM의 동작 모드를 IRQ 모드로 변경한다.
    ❑ 익셉션 벡터 베이스 주소를 먼저 찾은 다음에 0x18 주소를 더한 값을 프로그램 카운터로 브랜치한다.

ARM 코어는 외부 인터럽트를 감지하면 "인터럽트 익셉션을 유발해야 겠다"라고 판단하는데, 위와 같은 순서로 레지스터를 설정합니다. 3단계까지의 동작은 "하드웨어적으로" ARM 프로세서가 처리합니다.  


4단계: 익셉션 핸들러에서 인터럽트 서비스 루틴 실행 

 

3단계에서 인터럽트 익셉션을 유발하면 익셉션 벡터 베이스 주소 기준으로 0x18 주소 오프셋을 적용해 프로그램 카운터를 브랜치합니다. 즉, 익셉션 벡터 주소로 프로그램 카운터를 넣어주게 되는데, 익셉션 벡터 베이스 주소 기준으로 0x18 주소 오프셋에 위치한 명령어가 실행됩니다. 이 부분이 소프트웨어적으로 익셉션 핸들러 코드가 실행되는 부분인데, ④으로 표기된 박스에 해당됩니다.

 IRQ 익셉션 핸들러는 다음과 같은 동작을 수행합니다.

    ❑ 인터럽트가 발생한 시점의 레지스터 세트를 프로세스의 스택 공간에 푸시
    ❑ 인터럽트 서비스 루틴을 실행해 인터럽트를 핸들링하는 코드를 실행
    ❑ 인터럽트 핸들러 함수가 호출됨

IRQ 익셉션은 메모리 어보트 타입 익셉션과는 달리 운영체제에서 인터럽트를 처리하는 기능으로 동작합니다. 이 점이 메모리 어보트 타입 익셉션과는 다르다라는 점을 기억합시다.


5단계: 인터럽트 익셉션이 발생한 주소로 복귀 

 

인터럽트 서비스 루틴에서 인터럽트에 대한 처리를 마무리한 다음에 인터럽트가 발생할 시점의 명령어가 실행된 주소로 복귀하는 동작을 수행합니다. 인터럽트 익셉션이 발생했을 시점에 프로세스의 스택 공간에 푸시된 레지스터 세트를 ARM 코어의 레지스터에 다시 로딩하는 것입니다. 

여기까지 ARM 아키텍처 관점으로 인터럽트 벡터 핸들러가 수행하는 동작을 설명했습니다. 인터럽트 익셉션의 전체적인 실행 흐름에 대해 정확히 이해하려면, 인터럽트 익셉션을 운영체제의 관점으로 분석할 필요가 있습니다. 그러면 운영체제 관점으로 인터럽트 익셉션은 어떻게 볼 수 있을까요? 인터럽트 익셉션은 운영 체제에서 하나의 기능으로 동작합니다. 프로세스 관점으로 보면 프로세스가 실행하는 도중에 인터럽트 익셉션이 발생한 것으로 볼 수 있습니다. 따라서 인터럽트 익셉션이 발생한 후 처리되는 인터럽트 서비스 루틴의 코드는 빠르고 간결하게 처리되어야 합니다.

+ Recent posts