Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- ARM 아키텍쳐: 메모리 모델과 배리어
- 시스템 소프트웨어 개발을 위한 ARM 아키텍처의 구조와 원리
- Arm 아키텍처: 캐시
- 실무PT후기
- yocto
- 빌드 시스템
- Arm 아키텍처: 메모리 모델과 배리어
- 인프런
- 코멘토실무PT
- BSP
- ARM 아키텍처: 메모리모델과 배리어
- arm
- Kernel
- udemy
- 코멘토
Archives
- Today
- Total
반도체 소프트웨어
요약 9. GIC - 인터럽트 컨트롤러 본문
- 인터럽트 컨트롤러 개요
- 인터럽트를 통합해서 CPU에게 전달하는 모듈
- 외부 I/O 디바이스는 인터럽트를 통해 CPU와 인터페이싱
- 외부 I/O장치(센서, 키보드, USB)를 CPU가 다양한 방식으로 제어하는데 이 중 인터럽트가 가장 많이 활용됨
- soc, mcu 업체는 제품개발업체가 다양한 외부 디바이스가 인터럽트를 통해 mcu, soc와 통신할 수 있도록 인터럽트 컨트롤러를 구성해 칩을 설계!!
- 너는 그러한 soc, mcu가 들어간 타겟 보드나 그런 보드와 센서를 통해서 어떤 결과물을 만들어보는게 좋겠다. 아두이노 라즈베리파이 이런거 말고
- 인터럽트 컨트롤러 기본 구조
- 여러 I/O 디바이스가 올려준 인터럽트를 받아 IRQ, FIQ로 CPU에 전달하는 역할 수행
- 설정된 인터럽트의 우선순위를 기준으로 적절한 ARM 코어에 인터럽트를 라우팅
- 여러 I/O 디바이스가 올려준 인터럽트를 받아 IRQ, FIQ로 CPU에 전달하는 역할 수행
- GIC(Generic Interrupt Controller): ARM사가 설계한 인터럽트 컨트롤러
- 리눅스 커널, XEN 등은 이미 GIC를 사용할 수 있는 소스가 포함되어있으므로 바로 사용 가능
- GIC 배우는 이유
- 인터럽트가 처리되는 방식을 세세하게 파악하기 위해서
- FIQ 설정 방법
- 시큐어 인터럽트 설정 방법
- 운영체제 주요 기능 이해하기 위해서
- IPI 세부 동작 원리(inter processof interrupt call)
- 인터럽트 Affinity 지정(특정 코어가 특정 인터럽트만을 처리하도록 설정)
- 인터럽트가 처리되는 방식을 세세하게 파악하기 위해서
- GIC 관점에서 본 인터럽트 처리 흐름
- 인터럽트를 SPI, PPI, SGI 세 종류로 구분해서 처리
- 리디스트리뷰터, 디스크리뷰터, cpu interface 하드웨어 블록(컴포넌트)을 가짐
- 시스템 레지스터를 통해서 활성화 가능
- GIC는 CPU interface 블록을 통해 인터럽트 발생을 ARM 코어에게 전달한다.
- 수신한 ARM 코어는 IRQ 익셉션을 유발시키고 익셉션 핸들러를 실행시킨다.
- GIC 버전
- PE: ARM 코어 개수
- GIC의 인터럽트 분류 체계
- SPI: 임의의 여러 CPU코어가 I/O디바이스에서 전달되는 인터럽트를 처리
- PPI: 특정 ARM 코어 전용으로 I/O 디바이스의 인터럽트를 받아 처리 (최적화를 위해서 EX. CPU 캐시 사용)
- SGI
- 외부 I/O디바이스가 아닌 소프트웨어적으로 발생하는 인터럽트
- 슈퍼바이저 콜 같은 소프트웨어 인터럽트와 구별되는 하드웨어 인터럽트
- SGI 인터럽트 신호는 IRQ 혹은 FIQ를 통해 전달
- 운영체제 커널에서 SGI를 사용해 CPU 코어 간 인터럽트 전달(IPI)
- IPI를 사용해 다양한 방식으로 운영체제 커널 기능을 구현 EX) 네트워크 패킷 분산, CPU코어별 정상 여부 확인
- 인터럽트 아이디: ID별로 각 인터럽트 타입을 처리하도록 커널에서 구현되어있음
- GIC 프로그래머 모델: GIC를 이루는 아키텍처
- cpu 코어 개수만큼 cpu interface가 존재
- GIC 물리적 구조(하드웨어 컴포넌트)
- distributor: SPIs 받아서 관리 및 처리
- 1개만 존재
- 관련된 시스템 레지스터
- redistributor: PPIs와 SGIs 받아서 관리 및 처리
- 관련된 시스템 레지스터
- 관련된 시스템 레지스터
- cpu interface: 인터럽트 우선순위, 활성화 여부 등 처리해서 cpu에 전달
- 인터럽트 처리에 대한 기본 설정
- 인터럽트에 ACK 응답
- 우선 순위 드랍 및 인터럽트 처리 마스킹(필터링)
- 관련된 시스템 레지스터
- distributor: SPIs 받아서 관리 및 처리
- 디스트리뷰터
- 다음과 같은 설정을 할 수 있도록 시스템 레지스터를 제공한다
- 역할
- SPI를 리디스트리뷰터에 라우팅
- 각각 SPI 인터럽트의 우선순위를 설정하고 분배
- 각각 SPI 인터럽트를 비활성화 및 활성화
- 각각 SPI 인터럽트를 라우팅하는 정보 설정
- SPI에 대한 레벨 센서티브 또는 에지 트리거 방식 설정
- SPI를 리디스트리뷰터에 라우팅
- 디스트리뷰터의 프로그래머 모델이란? 시스템 레지스터를 사용해서 SPIs를 설정하고 제어하는 것
- 시스템 레지스터들은 memory-mapped I/O 인터페이스로 접근한다
- 접근하려는 I/O 디바이스나 하드웨어의 베이스 주소를 설정한 다음, 베이스 주소에서 오프셋을 더한 주소에 접근해 레지스터에 접근하는 방식
- mmio는 디바이스 드라이버가 사용하는 대표적인 인터페이스 방식
- 다음과 같은 설정을 할 수 있도록 시스템 레지스터를 제공한다
- Cpu interface
- 인터럽트를 통합 관리해 제어하는 기능을 수행
- 디스트리뷰터와 리디스트리뷰터를 통해 라우팅 되는 인터럽트에 대한 전반적인 제어 및 관리
- 관련된 시스템 레지스터: 강의 5분 30초 확인하기
- 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
- (GIC의 기능)인터럽트 그룹
- GIC에서 정의된 SGI, PPI, SGI 인터럽트는 논시큐어와 시큐어 인터럽트로 설정
- 일반적으로
- Group0: secure interrupt 처리 및 관리
- Group1: non-secure interrupt 처리 및 관리
- 인터럽트 그룹을 나눠서 어디에 사용하는거지?
- 익셉션 모델
- 익셉션 레벨별로 익셉션 핸들러가 존재(즉 EL1에서 유발된 익셉션을 처리하는 핸들러는 리눅스 커널에서 구현되어있다는 의미)
- 인터럽트 익셉션 유발되면,
- 시스템 레지스터 백업
- GIC핸들러 호출(익셉션 핸들러)
- IRQ 서브시스템 호출
- 인터럽트 핸들러 호출
- GIC 핸들러 예시 코드(리눅스 커널), (페리페럴 인터럽트(IRQ)가 발생할 때마다, 위 코드(GIC 핸들러)가 실행되어 인터럽트ID로 타입을 구분해서 핸들러 처리를 진행)
- 익셉션 레벨별로 익셉션 핸들러가 존재(즉 EL1에서 유발된 익셉션을 처리하는 핸들러는 리눅스 커널에서 구현되어있다는 의미)
출처: 인프런, "시스템 소프트웨어 개발을 위한 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 |