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 아키텍처: 캐시
- yocto
- 시스템 소프트웨어 개발을 위한 ARM 아키텍처의 구조와 원리
- Arm 아키텍처: 메모리 모델과 배리어
- ARM 아키텍처: 메모리모델과 배리어
- 빌드 시스템
- 실무PT후기
- ARM 아키텍쳐: 메모리 모델과 배리어
- 인프런
- 코멘토
- udemy
- BSP
- Kernel
- arm
- 코멘토실무PT
Archives
- Today
- Total
반도체 소프트웨어
요약 7. ARMv7 익셉션 본문
- 익셉션이란
- 익셉션은 프로세서가 외부에서 발생한 인터럽트나 정의되어있지 않은 명령어를 실행하려는 시도와 같은 이벤트를 처리하기 위해 프로세스의 실행을 멈추는 것
- cpu코어에서 기계어를 정상적으로 실행하지 못하는 상황에서 이를 처리하기 위한 방식
- 익셉션이 발생하면 익셉션의 종류별로 지정된 주소로 pc 바뀜
- cpu 아키텍처마다 익셉션 처리 세부 동작 방식이 다름
- ARM프로세서는 익셉션이 발생하면 익셉션을 처리하는 특정 모드로 진입
- 익셉션을 유발한 다양한 정보를 레지스터에 업데이트
- 익셉션 종류별로 이미 정해 놓은 주소로 분기
- 익셉션 벡터: 각 익셉션의 내용을 담은 주소
- ARM 아키텍처 관점에서 익셉션 종류
- 메모리 어보트 타입 익셉션: 소프트웨어 입장에서 치명적인 오류가 있는 상태 ex) 널포인터 엑세스
- IRQ 인터럽트 익셉션: 외부 I/O 디바이스(페리퍼럴)에서 인터럽트가 발생하면 유발되며 인터럽트 서비스 루틴이 실행
- 소프트웨어 인터럽트 타입 익셉션(트랩): SVC 같은 명령어를 실행하면 유발, 이 기능을 활용해 시스템 콜을 구현
- 상황별 익셉션
- 실무에서
- 소프트웨어 에러 발생(메모리 어보트, 크래시)
- 충분히 디버깅할 시간이 할당되지 않은 상황에서 압박을 받으면서 디버깅
- 소프트웨어 관점에서
- 치명적인 오류: 메모리 어보트 타입 익셉션
- 운영체제 커널에서 지원하는 기능: IRQ(인터럽트 서비스 루틴), 소프트웨어 인터럽트(시스템 콜)
- irq인터럽트도 익셉션으로 분류
- 외부 I/O 디바이스에서 인터럽트 신호 발생하면 ARM코어에서 이를 익셉션의 한 종류로 처리
- 센서, 키보드 같은 외부 I/O디바이스 인터럽트를 통해 하드웨어 변화를 ARM 코어에 알림
- 소프트웨어 인터럽트와 트랩: 특정 명령어를 실행하면 익셉션이 유발되며 이를 트랩으로 명시
- irq인터럽트도 익셉션으로 분류
- 실무에서
- 익셉션 동작 원리 잘 알아야하는 이유
- 실전 프로젝트에서 문제해결능력 키우기 위해 ex) null포인터접근, 프로세스 스택 오염 등
- 운영체제 깊게 이해하기 위해
- rtos, 리눅스 커널은 ARM 아키텍처 기능을 활용해 동작하며 핵심 루틴은 어셈블리 코드로 구현
- 핵심 기능이 ARM 익셉션 활용해 구현 ex) 시스템콜, IRQ(인터럽트 서브시스템), 메모리 관리, 시그널, 선점 스케줄링 등
- 트러스트존과 하이퍼바이저 동작원리 이해하기 위해
- 트러스트존이나 하이퍼바이저를 구성하는 소프트웨어 스택은 익셉션을 유발하는 트랩을 기반으로 구현
- 게스트 os에서 하이퍼바이저에게 서비스를 요청할 때는 익셉션을 통해 하이퍼바이저 모드로 진입
- 익셉션과 관련된 주요 개념
- 모드와 익셉션 레벨 변경
- 익셉션 종류별로 지정된 주소(익셉션 벡터 엔트리 주소 + 오프셋)로 pc 브랜치
- 익셉션은 동작 모드가 변경되는 유발 인자(v7) / 익셉션 레벨이 변경되는 요인(v8)
- 프로세스 입장에서 익셉션이 발생하면 프로시저 루틴에서 벗어나기에 실행이 잠시 멈췄다고 느낌
- 익셉션 벡터 테이블: 익셉션 벡터 정보를 모아놓은 테이블(오프셋, 종류 등)
- 익셉션 핸들러
- 익셉션을 핸들링(처리)하는 레이블이나 함수(어셈블리 명령어)
- ARM 프로세서가 익셉션을 감지하면 실행되는 코드로, 이를 익셉션 핸들러라고 명시
- 익셉션 벡터 테이블이 소프트웨어적으로 구현된 실체
- ARM아키텍처와 커널 간 인터페이스
- 익셉션 유발된 주소를 알려주는 레지스터 종류(익셉션 후 복귀할 주소)
- ARMv7: R14_<mode> 레지스터
- ARMv8: ELR_E1, ESR_EL1 레지스터
- 모드와 익셉션 레벨 변경
- 익셉션 종류(ARMv7)
- undefined instruction 익셉션: 어셈블리어를 디코딩못할때 주로 발생, 브링업 과정에서 보통 발생, 특정 시스템 레지스터가 활성화되지 않았을 때도 발생, 비트 플립 메모리 오염 등
- abort 익셉션
- data abort 익셉션
- prefetch abort 익셉션: 스택 메모리 깨져서 함수 호출 복귀못할때
- 외부 인터럽트(IRQ/FIQ)
- 소프트웨어 인터럽트: 소프트웨어적으로 익셉션을 발생시켜 유발된 인터럽트(SUPERVISOR CALL, 트랩)
- 유저모드 -> 커널 모드로 스위칭
- 익셉션 실행 사이클
- 유발요인
- 메모리 어보트: mmu가 처리하지 못하는 가상 주소 등 으로 발생
- 외부 디바이스 인터럽트
- 소프트웨어 인터럽트
- 익셉션 발생 후 레지스터 업데이트
- 익셉션이 발생한 시점의 cpsr 레지스터를 변경되는 모드의 SPSR_<mode> 레지스터에 백업
- 익셉션 마무리 후 복귀할 주소를 R14_<mode> 레지스터에 백업 -> 즉 변경될 익셉션 모드의 뱅크드 레지스터를 사용해서 익셉션 종료 후 복귀하는 것
- 동작 모드 변경
- ARM 코어는 CPSR레지스터 M비트를 업데이트해서 동작 모드를 변경
- OS는 익셉션 종류별로 실행 흐름 구분해서 처리
- 익셉션 벡터 엔트리 주소로 점프: 해당하는 익셉션 벡터 엔트리 주소로 pc 분기(벡터 베이스 주소 + 오프셋)
- 익셉션 벡터: 개념적인 용어
- 익셉션 벡터 엔트리: 해당 익셉션의 시작 주소
- 익셉션 핸들러 실행: 각 익셉션마다 처리하는 핸들러(어셈블리어 모음) 실행 (각 익셉션 벡터 주소로 가면 있는 레이블, 함수를 의미함)
- 메모리 어보트 익셉션 핸들러
- 유저 애플리케이션: 프로세스 종료
- 커널, 드라이버: 시스템 리셋
- IRQ 익셉션 핸들러
- 인터럽스 서비스 루틴 실행(디바이스 드라이버 등)
- 외부 하드웨어 변화를 알리기 위한 인터페이스로 동작
- 소프트웨어 인터럽트: 시스템 콜 핸들러로 분기 수행
- 메모리 어보트 익셉션 핸들러
- 유발요인
- 메모리 어보트 익셉션 처리 방식
- 익셉션 핸들러 실행시에 SPSR_abt를 통해 익셉션 유발전 상태를 읽어서, 유저프로세스를 실행시킬지 시스템 리셋을 할지를 정한다
- IRQ 인터럽트 익셉션 처리 흐름(관점별 인터럽트가 처리되는 실행 흐름)
- ARM 관점에서
- 인터럽트 타입 익셉션은 외부 I/O 디바이스에서 인터럽트가 발생하면 이를 소프트웨어적으로 처리하기 위한 인터페이스이자 운영체제 커널의 기능으로 동작
- 익셉션 핸들러: 벡터 테이블이 소프트웨어적으로 구현된 실체
- 인터럽트 전체 처리 관점에서
- 외부 디바이스에서 인터럽트 발생하면 GIC가 받아서 ARM 아키텍처에 보내준다.
- GIC: ARM사가 개발한 인터럽트 컨트롤러
- 프로세스 관점에서: 프로세스 실행이 중단되기에 인터럽트 서비스 루틴은 빠르게 처리되도록 설계되어야함
- 운영체제 커널이 인터럽트 처리하는 과정
- 프로세스 실행 도중 인터럽트 발생
- 익셉션 핸들러호출
- 인터럽트 처리하는 서비스 루틴 실행(익셉션의 서브루틴)
- 인터럽트가 발생한 시점으로 복귀
- ARM 관점에서
- 소프트웨어 인터럽트(supervisor call) / 소프트웨어 익셉션
- 특정 명령어를 실행해서 익셉션을 유발(IRQ, FIQ)
- 명령어 종류: svc, hvc, smc
- 시스템 콜 실행 흐름(시스템콜: os 에서 사용하는 용어, 유저 공간 -> 커널공간 전환하는 작업)
- svc명령어 실행하면 슈퍼바이저 콜(익셉션) 익셉션을 유발함
- svc명령 실행 = 유저 모드에서 슈퍼바이저 모드로 트랩되었다
- 익셉션 전체 흐름 정리: 익셉션은 ARM아키텍처 범주이고 다른 모든 용어에 대해서 추상적이라고 보면 이해가 편함. 즉 인터럽트 용어는 OS에서 쓰는거고 이는 익셉션과 비슷하지만 더 상위 개념이 익셉션이면서 교집합을 가지는 개념
- VBAR 레지스터는 ARM 코어에서 실행되는 커널 혹은 RTOS가 부팅되는 과정에서 설정되며 이를 통해 익셉션 핸들러 시작 주소를 알 수 있음(익셉션 벡터 엔트리 주소)
- 오류가 발생하면, data abort 익셉션을 유발하면서 익셉션 벡터로 분기
- 익셉션 핸들러는 프로세스 스택 공간에서 실행된다 ex) 널포인터엑세스로 인해 data abort가 발생하면 그 프로세스의 스택에 익셉션 핸들러가 push되면서 실행되는 것
- undefined instruction 익셉션: ARM코어가 어셈블리어를 해석하지 못해서 발생하는 오류
- 아래 그림에서 87dcb159 가 잘못되어진 것을 볼 수 있음
- 트러블슈팅
- 시스템 레지스터 등 정상적으로 시스템 설정이 되었는지
- undefined instruction이 발생하는 패턴이 일정한지
- 현재 실행되는 이미지가 제대로 빌드되었는지
- 메모리(DRAM)이나 저장 장치와 같은 부품에 문제가 없는지
- 메모리(DRAM)에 전달되는 전원에 이상이 없는지
- prefetch abort instruction 발생 사례(소스 코드가 없는, 명령어가 아닌 이상한 주소를 pc가 가리키고 있는 것이 문제)
- 명령어를 메모리에서 읽어들이다가 실패한 경우(스택 corruption 등)
- 스택이 깨진 상태에서는 디버깅프로그램이 스택콜 출력을 제대로 못함
- data abort instruction 발생 사례: mmu가 발생시킴
출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG
'CPU Architecture > ARM Architecture' 카테고리의 다른 글
요약 9. GIC - 인터럽트 컨트롤러 (0) | 2024.01.02 |
---|---|
요약 8. ARMv8 익셉션 (0) | 2023.12.31 |
요약 6. ARMv8 익셉션 레벨 (0) | 2023.12.31 |
요약 5. ARMv7 동작모드 (0) | 2023.12.30 |
요약 4. ARM 어셈블리 명령어 (0) | 2023.12.30 |