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 아키텍처: 메모리모델과 배리어
- Kernel
- Arm 아키텍처: 캐시
- udemy
- 실무PT후기
- yocto
- 빌드 시스템
- arm
- 시스템 소프트웨어 개발을 위한 ARM 아키텍처의 구조와 원리
- 코멘토실무PT
- 인프런
- Arm 아키텍처: 메모리 모델과 배리어
- ARM 아키텍쳐: 메모리 모델과 배리어
- BSP
Archives
- Today
- Total
반도체 소프트웨어
요약 8. ARMv8 익셉션 본문
- 익셉션: ARM코어가 명령어를 처리하다가 예외 사항이 발생할때 이를 처리하는 방식 (익셉션을 통해서 실행 흐름을 바꾼다고 볼 수도있다, 모드 전환)
- 익셉션이 발생하면 익셉션 종류별로 지정된 익셉션 벡터로 프로그램 카운터가 분기
- 익셉션 벡터 주소가 0x80바이트 단위로 정렬되므로 ARMv7과는 다르게, 익셉션 벡터 주소에서 익셉션을 처리할 수 있는 여러 명령어를 실행
- 익셉션 종류를 계층구조로 변환
- Synchronous 와 asynchronous로 큰 카테고리를 분류하고, 하위 카테고리로 익셉션 유발 인자를 익셉션 클래스로 정의
- 익셉션 분류 체계
- synchronous 타입: 공통적으로 어셈블리 명령어 실행과정에서 발생
- asynchronous 타입: 외부 인터럽트, 외부 메모리 데이터 어보트가 원인
- ESR_ELx를 통해 익셉션 유발 인자를 읽을 수 있음
- 익셉션 잘 알아야하는 이유
- 디버깅 능력 키우기 위해: 실전 프로젝트, 크래시, 메모리 어보트가 발생했을때 ARM 아키텍처가 어떻게 처리하고 어떤 레지스터로 정보를 알려주는지 파악하면 더 효율적으로 디버깅 가능
- 트러스트존을 이해하기 위해
- 트러스트존: CPU내부 보안 수준이 높은 보안 애플리케이션이 실행될 수 있는 실행 영역을 확보
- 월드를 스위칭할때 익셉션이 유발되므로, 이해하기 위해서 필요
- 가상화 시스템을 이해하기 위해
- 운영체제 커널의 핵심 기능을 이해하기 위해
- 시스템콜, 인터럽트 서비스 루틴, 페이지폴트
- ARM의 익셉션 기능을 활용해서 만들어졌기에
- 익셉션 벡터 테이블
- SP_EL0 : 사실상 사용안함
- SP_ELx, x > 0: Current Exception Level에서 익셉션 발생했을 때 OFFSET
- 그 하위: Lower Exception Level에서 익셉션 발생했을 때 OFFSET
- synchronous 익셉션 실행 흐름
- Data Abort 처리 흐름
- MMU에서 가상주소 -> 물리주소 변환시에 오류 발생시 익셉션을 ARM 코어에게 유발시킴
- Data Abort 익셉션 핸들러 루틴
- ESR_ELx 레지스터의 [31:26]비트를 읽어서 세부 유발 인자 확인
- EL0(유저 애플리케이션): 유저 프로세스 종료
- EL1(커널 드라이버): 디버깅 정보 출력 후 시스템 종료
- SVC 처리 흐름
- SVC 익셉션 핸들러 루틴
- 레지스터로부터 시스템 콜 번호 획득
- 시스템 콜 번호에 해당하는 시스템 콜 루틴 실행
- SVC 익셉션 핸들러 루틴
- IRQ, FIQ 처리 흐름
- 비동기적으로 유발됨
- 다른 익셉션과 달리 기존 프로세스로 복귀해야하므로 인터럽트 루틴이 신속하게 처리되어야한다.
- 익셉션이 유발된 레벨별로 정의된 오프셋을 적용한 주소로 PC가 분기
- EL1에서 IRQ 인터럽트 익셉션 발생: VBAR_EL1 + 0x280
- EL0(Aarch64)에서 IRQ익셉션 발생: VBAR_EL1 + 0x480
- EL0(Aarch32)에서 IRQ익셉션 발생: VBAR_EL1 + 0x680 (VBAR_EL0 레지스터는 없음, 왜냐하면 익셉션 핸들러로 분기하는 시점은 최소 EL1은 되어야하기에)
- IRQ 인터럽트의 익셉션 핸들러 동작
- 인터럽트 발생한 시점의 레지스터 세트를 프로세스 스택에 푸시
- 인터럽트 서비스 루틴 실행해 인터럽트 핸들링 코드 실행
- 인터럽트 핸들러 함수 호출
- SError 익셉션
- 프로세스 흐름중(synchronous)에 발생하지 않고 비동기적(asynchronous)으로 외부 메모리에서 어보트가 발생하면 SError 익셉션 유발
- 가상 주소 영역: ARM 코어가 사용하는, 바라보는 주소(MMU: 가상 주소 -> 물리주소로 변환)
- 캐시(물리주소)에 접근하는 하드웨어 필터에서 메모리 어보트 발생 가능
- SError 발생 원인은 칩셋 업체마다 구현이 다를 수 있도록 설계됨
- 프로세스 흐름중(synchronous)에 발생하지 않고 비동기적(asynchronous)으로 외부 메모리에서 어보트가 발생하면 SError 익셉션 유발
- Data Abort 처리 흐름
- 익셉션 전체 처리 흐름
- 다양한 페리페럴 인터럽트를 ARM 코어가 직접 받는 것이 아닌 GIC를 통해서 건네받는다
- 그 다음에 익셉션 벡터(주소)를 통해 ARM 코어와 커널이 인터페이스하여 커널이 구현한 IRQ subsystem에 속하는 인터럽트 핸들러를 실행시켜 익셉션을 처리한다.
- IRQ subsystem: ARM 아키텍처와 무관하게 실행되는 소프트웨어 레이어
- 커널을 구성하는 기능 중 하나
- 디바이스 드라이버 및 커널 서브시스템으로 핸들러 코드가 구현됨
- GIC 쓰는게 편함
- 커널 드라이버에 GIC 소스 다 구현됨
- ARM이 기본적으로 GIC 초기화 코드 구현해놓음
- 익셉션 벡터 테이블 분석
- ARM은 커널, RTOS, XEN, 베어메탈 OS 등 다양한 시스템이 동작할 수 있도록 설계됨
- 익셉션 벡터 테이블
- CURRENT LEVEL
- LOWER LEVEL
- (위 두개를 잘 인지해야 익셉션 벡터 테이블을 제대로 해석할 수 있음) / (해석 당시에 CURRENT_LEVEL을 결정하고 테이블 봐야함)
- SP_ELx: 각 익셉션 레벨별로 지정된 스택 포인터 주소
- SP_EL0: 업계에서 사용 잘안함(리눅스, 하이퍼바이저에서 지원 안함)
- SP_Elx: 리눅스, 하이퍼바이저에서 지원함
- VBAR_Elx
- 익셉션 레벨마다 익셉션 핸들러를 독립적으로 설계 및 구현
- EL1 익셉션 벡터 엔트리 주소(EL1에 존재하는 익셉션 벡터 베이스 주소)
- 위 그림에서 익셉션 핸들러 위치를 잘 보자
- 익셉션 핸들러 코드 리뷰
- 어셈블리 명령어가 익셉션 핸들러 코드 부분, el1_irq가 분기하는 레이블이며 이 안에 인터럽트 서비스 루틴 코드가 있음
- EL마다 각각 SP를 설정해서 사용
- 메모리 어보트 익셉션 발생시 프로세스 관점(커널)에서 동작 방식 설명
- 익셉션 핸들러 실행 메모리 공간
- 결론적으로 익셉션 핸들러는 익셉션이 발생한 프로세스의 스택 공간에서 실행되는 것(커널 프로세스의 스택 공간)
- 유저공간에서는 익셉션 핸들러가 실행되지 않음
출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG
'CPU Architecture > ARM Architecture' 카테고리의 다른 글
요약 10. AAPCS ARMv7 (0) | 2024.01.03 |
---|---|
요약 9. GIC - 인터럽트 컨트롤러 (0) | 2024.01.02 |
요약 7. ARMv7 익셉션 (0) | 2023.12.31 |
요약 6. ARMv8 익셉션 레벨 (0) | 2023.12.31 |
요약 5. ARMv7 동작모드 (0) | 2023.12.30 |