반도체 소프트웨어

요약 9. GIC - 인터럽트 컨트롤러 본문

CPU Architecture/ARM Architecture

요약 9. GIC - 인터럽트 컨트롤러

반도체 소프트웨어 엔지니어 2024. 1. 2. 12:55
  1. 인터럽트 컨트롤러 개요
    • 인터럽트를 통합해서 CPU에게 전달하는 모듈
    • 외부 I/O 디바이스는 인터럽트를 통해 CPU와 인터페이싱
    • 외부 I/O장치(센서, 키보드, USB)를 CPU가 다양한 방식으로 제어하는데 이 중 인터럽트가 가장 많이 활용됨
    • soc, mcu 업체는 제품개발업체가 다양한 외부 디바이스가 인터럽트를 통해 mcu, soc와 통신할 수 있도록 인터럽트 컨트롤러를 구성해 칩을 설계!!
      • 너는 그러한 soc, mcu가 들어간 타겟 보드나 그런 보드와 센서를 통해서 어떤 결과물을 만들어보는게 좋겠다. 아두이노 라즈베리파이 이런거 말고
  2. 인터럽트 컨트롤러 기본 구조
    • 여러 I/O 디바이스가 올려준 인터럽트를 받아 IRQ, FIQ로 CPU에 전달하는 역할 수행
    • 설정된 인터럽트의 우선순위를 기준으로 적절한 ARM 코어에 인터럽트를 라우팅
  3. GIC(Generic Interrupt Controller): ARM사가 설계한 인터럽트 컨트롤러
    • 리눅스 커널, XEN 등은 이미 GIC를 사용할 수 있는 소스가 포함되어있으므로 바로 사용 가능
    • GIC 배우는 이유
      • 인터럽트가 처리되는 방식을 세세하게 파악하기 위해서
        1. FIQ 설정 방법
        2. 시큐어 인터럽트 설정 방법
      • 운영체제 주요 기능 이해하기 위해서
        1. IPI 세부 동작 원리(inter processof interrupt call)
        2. 인터럽트 Affinity 지정(특정 코어가 특정 인터럽트만을 처리하도록 설정)
  4. GIC 관점에서 본 인터럽트 처리 흐름

    • 인터럽트를 SPI, PPI, SGI 세 종류로 구분해서 처리
    • 리디스트리뷰터, 디스크리뷰터, cpu interface 하드웨어 블록(컴포넌트)을 가짐
      • 시스템 레지스터를 통해서 활성화 가능
    • GIC는 CPU interface 블록을 통해 인터럽트 발생을 ARM 코어에게 전달한다.
    • 수신한 ARM 코어는 IRQ 익셉션을 유발시키고 익셉션 핸들러를 실행시킨다.
  5. GIC 버전

    • PE: ARM 코어 개수
  6. GIC의 인터럽트 분류 체계

    • SPI: 임의의 여러 CPU코어가 I/O디바이스에서 전달되는 인터럽트를 처리
    • PPI: 특정 ARM 코어 전용으로 I/O 디바이스의 인터럽트를 받아 처리 (최적화를 위해서 EX. CPU 캐시 사용)
    • SGI
      • 외부 I/O디바이스가 아닌 소프트웨어적으로 발생하는 인터럽트
      • 슈퍼바이저 콜 같은 소프트웨어 인터럽트와 구별되는 하드웨어 인터럽트
      • SGI 인터럽트 신호는 IRQ 혹은 FIQ를 통해 전달
      • 운영체제 커널에서 SGI를 사용해 CPU 코어 간 인터럽트 전달(IPI)
      • IPI를 사용해 다양한 방식으로 운영체제 커널 기능을 구현 EX) 네트워크 패킷 분산, CPU코어별 정상 여부 확인
  7. 인터럽트 아이디: ID별로 각 인터럽트 타입을 처리하도록 커널에서 구현되어있음
  8. GIC 프로그래머 모델: GIC를 이루는 아키텍처

    • cpu 코어 개수만큼 cpu interface가 존재
    • GIC 물리적 구조(하드웨어 컴포넌트)
      • distributor: SPIs 받아서 관리 및 처리
        1. 1개만 존재
        2. 관련된 시스템 레지스터
      • redistributor: PPIs와 SGIs 받아서 관리 및 처리
        1. 관련된 시스템 레지스터
      • cpu interface: 인터럽트 우선순위, 활성화 여부 등 처리해서 cpu에 전달
        1. 인터럽트 처리에 대한 기본 설정
        2. 인터럽트에 ACK 응답
        3. 우선 순위 드랍 및 인터럽트 처리 마스킹(필터링)
        4. 관련된 시스템 레지스터
  9. 디스트리뷰터
    • 다음과 같은 설정을 할 수 있도록 시스템 레지스터를 제공한다
    • 역할
      • SPI를 리디스트리뷰터에 라우팅
      • 각각 SPI 인터럽트의 우선순위를 설정하고 분배
      • 각각 SPI 인터럽트를 비활성화 및 활성화
      • 각각 SPI 인터럽트를 라우팅하는 정보 설정
      • SPI에 대한 레벨 센서티브 또는 에지 트리거 방식 설정
    • 디스트리뷰터의 프로그래머 모델이란? 시스템 레지스터를 사용해서 SPIs를 설정하고 제어하는 것
    • 시스템 레지스터들은 memory-mapped I/O 인터페이스로 접근한다

      • 접근하려는 I/O 디바이스나 하드웨어의 베이스 주소를 설정한 다음, 베이스 주소에서 오프셋을 더한 주소에 접근해 레지스터에 접근하는 방식
      • mmio는 디바이스 드라이버가 사용하는 대표적인 인터페이스 방식
  10. Cpu interface

    • 인터럽트를 통합 관리해 제어하는 기능을 수행
    • 디스트리뷰터와 리디스트리뷰터를 통해 라우팅 되는 인터럽트에 대한 전반적인 제어 및 관리
    • 관련된 시스템 레지스터: 강의 5분 30초 확인하기
  11. IRQ, FIQ 소개 (여기부터 이해가 좀 안되네)

    • ARMv8되면서 IRQ는 NON-SECURE interrupt / FIQ는 SECURE interrupt로 명명
    • FIQ는 IRQ와 우선순위가 같음
    • IRQ: Non-secure world에서 유발되는 인터럽트
    • FIQ: secure world에서 유발되는 인터럽트 (non-secure world, 리눅스 커널에서는 fiq 유발 불가)
    • IRQ, FIQ 핸들링: FIQ는 Secure Monitor나 Trusted Kernel에서 받아서 처리함
    • ATF(ARM TRUSTED FIRMWARE): 시큐어 월드를 구현하기 위한 오픈소스 인터페이스 및 API
  12. (GIC의 기능)인터럽트 그룹
    • GIC에서 정의된 SGI, PPI, SGI 인터럽트는 논시큐어와 시큐어 인터럽트로 설정
    • 일반적으로
      • Group0: secure interrupt 처리 및 관리
      • Group1: non-secure interrupt 처리 및 관리
    • 인터럽트 그룹을 나눠서 어디에 사용하는거지?
  13. 익셉션 모델

    • 익셉션 레벨별로 익셉션 핸들러가 존재(즉 EL1에서 유발된 익셉션을 처리하는 핸들러는 리눅스 커널에서 구현되어있다는 의미)
    • 인터럽트 익셉션 유발되면,
      • 시스템 레지스터 백업
      • GIC핸들러 호출(익셉션 핸들러)
      • IRQ 서브시스템 호출
      • 인터럽트 핸들러 호출
    • GIC 핸들러 예시 코드(리눅스 커널), (페리페럴 인터럽트(IRQ)가 발생할 때마다, 위 코드(GIC 핸들러)가 실행되어 인터럽트ID로 타입을 구분해서 핸들러 처리를 진행)

 

출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG

'CPU Architecture > ARM Architecture' 카테고리의 다른 글

요약 11. AAPCS ARMv8  (0) 2024.01.04
요약 10. AAPCS ARMv7  (0) 2024.01.03
요약 8. ARMv8 익셉션  (0) 2023.12.31
요약 7. ARMv7 익셉션  (0) 2023.12.31
요약 6. ARMv8 익셉션 레벨  (0) 2023.12.31