효율적으로 인터럽트를 설정 및 처리하기 위해 GIC를 사용하는데, GIC의 가장 중요한 기능은 다음과 같이 요약할 수 있습니다.

 인터럽트의 우선순위를 각 I/O 장치에 적용해 설정
 입력으로 받은 인터럽트를 CPU에 전달

GIC는 인터럽트 컨트롤러이므로 GIC의 주된 기능은 다른 인터럽트 컨트롤러와 다르지 않습니다. 다른 인터럽트 컨트롤러와 다른 점은 GIC는 인터럽트를 4가지 종류로 분류해 관리한다는 점입니다. 이어서 GIC에서 정의된 4가지 인터럽트 소스를 소개하고 인터럽트 상태 머신을 설명합니다. 

GIC는 4가지 타입의 인터럽트 소스를 처리하며 다음 표에서 종류를 확인할 수 있습니다.


표 10.2 GIC를 구성하는 인터럽트 소스의 종류
 

이처럼 GIC는 페리페럴에서 전달된 4가지 인터럽트 입력을 처리하는데, 기능에 따라 다음과 같이 분류할 수 있습니다.

 PPI, SPI, LPI: 외부 I/O 디바이스에서 발생하는 하드웨어 인터럽트
 SGI: 외부 I/O 장치가 아닌 소프트웨어적으로 발생되는 인터럽트 

외부 I/O 장치에서 인터럽트가 발생하면 SPI나 PPI를 통해 CPU 코어로 전달됩니다. 먼저 SPI와 PPI에 대해 알아봅시다.

 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>

 

<강의 영상>

 

GIC는 Arm 사에서 디자인한 인터럽트 콘트롤러입니다. 다음 그림을 보면서 GIC의 구조를 배워봅시다.



그림 16.2 간략화한 GIC의 전체 구조

그림을 보면 가운데 박스에 GIC가 있습니다. 그림 왼쪽에 있는 ‘peripheral 1 ~ peripheral n’은 시스템을 구성하고 있는 외부 I/O 디바이스입니다. 예를 들어 peripheral이 3개인 경우 다음과 같은 peripheral로 구성될 수 있습니다.

   ● peripheral 1: 마우스
   ● peripheral 2: 키보드
   ● peripheral 3: 캠코더 센서

peripheral와 GIC 사이에 있는 화살표는 peripheral에서 GIC에게 전달되는 인터럽트를 나타냅니다. 그림 가장 오른쪽에 Processor가 있는데 이는 Arm 코어를 나타냅니다. 
 
정리하면 GIC는 n개로 구성된 peripheral에서 올려주는 인터럽트를 받아서 Arm 코어에게 분배하는 임무를 맡고 있습니다. GIC가 제공하는 가장 대표적인 기능은 다음과 같습니다.

   ● 각각 peripheral 디바이스들이 전달하는 인터럽트를 받는다.
   ● 설정된 인터럽트의 우선 순위를 기준으로 적절한 Arm 코어에 인터럽트를 라우팅한다.

GIC는 Cortex-A와 Cortex-R 계열의 Arm 프로세서와 함께 많이 사용됩니다. GIC는 싱글 코어에서부터 100개 이상의 멀티 코어로 구성된 환경에서 인터럽트를 효율적으로 관리할 수 있는 다양한 기능을 제공합니다. 또한 Arm 코어에서 GIC를 효율적으로 제어할 수 있어 많은 SoC 칩 벤더는 GIC를 활용합니다. 

GIC 버전 별로 주로 사용되는 프로세스 목록이 있습니다. 

 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>

 
 

인터럽트 콘트롤러가 필요한 이유를 알아봤으니 이어서 인터럽트 콘트롤러를 소개합니다. 다음 그림은 인터럽트 콘트롤러의 기본 구조도입니다.


그림 16.1 인터럽트 콘트롤러의 기본 구조

그림에서 가장 왼쪽에 있는 USB나 센서, 키보드는 외부 I/O 디바이스를 나타냅니다. 이와 같은 외부 I/O 디바이스에서 인터럽트 신호를 발생하면 인터럽트 콘트롤러가 받아서 처리합니다.

보다시피 인터럽트 콘트롤러는 CPU 옆에 달려 있습니다. 여러 외부 I/O 디바이스에서 올려준 인터럽트를 처리하는 일종의 창구로 다음과 같은 역할을 수행합니다. 

    “여러 외부 I/O 디바이스가 올려준 인터럽트를 받아 IRQ나 FIQ로 CPU에 전달”

이는 그림의 nIRQ나 nFIQ에 해당되며 인터럽트 콘트롤러와 CPU 사이의 인터페이스는 nIRQ나 nFIQ로 연결됩니다. 여기서 n은 IRQ나 FIQ가 다수 존재할 수 있다는 의미입니다.

이 밖에도 인터럽트 콘트롤러는 다음과 같은 기능을 수행합니다.

   ● 각각 인터럽트를 활성화 혹은 비활성화
   ● 각각 인터럽트의 우선 순위 레벨을 설정
   ● 각각 인터럽트를 처리한 타겟 프로세서 리스트 설정
   ● 각각 인터럽트를 논시큐어 혹은 시큐어로 설정
   ● peripheral 인터럽트를 level-sensitive 혹은 edge-triggered으로 설정

대부분 MCU나 SoC 업체에서 디자인한 인터럽트 콘트롤러는 위에서 언급한 기능을 지원합니다.

인터럽트 콘트롤러의 역할이 무엇인지 물어보면 다음과 같이 답할 수 있습니다. 

   ● CPU와 I/O 장치 사이에 존재
   ● I/O 장치가 유발한 인터럽트를 받아 CPU에게 전달

여기까지 인터럽트 콘트롤러를 소개했으니 다음 포스트에서는 Arm에서 제공하는 인터럽트 콘트롤러인 GIC를 배워 봅시다.

 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>

 
 

+ Recent posts