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 아키텍처: 메모리모델과 배리어
- 실무PT후기
- udemy
- 시스템 소프트웨어 개발을 위한 ARM 아키텍처의 구조와 원리
- Arm 아키텍처: 캐시
- 코멘토실무PT
- BSP
- ARM 아키텍쳐: 메모리 모델과 배리어
- 인프런
- 코멘토
- yocto
- 빌드 시스템
- Kernel
- arm
- Arm 아키텍처: 메모리 모델과 배리어
Archives
- Today
- Total
반도체 소프트웨어
요약 5. ARMv7 동작모드 본문
- 익셉션, 트러스트존을 비롯한 ARMv7 아키텍처의 많은 기능은 동작 모드 기반 위에서 설계되어 있기에 동작모드 이해는 중요
- PL(priviliege level): 특권레벨
- 소프트웨어 실행시에 리소스(하드웨어, 메모리 등)에 접근하는 권한을 구분
- PL0
- 유저모드에서 애플리케이션 소프트웨어가 실행되는 모드
- unprivileged 소프트웨어 실행
- 몇가지 아키텍처 기능 설정 불가하기에 시스템콜로 대체해서 사용함
- 메모리 접근 제약 존재
- PL0에서 SVC 명령어를 실행해 익셉션(트랩)이 유발돼야 PL1으로 진입 가능
- PL1
- 루트 권한과 비슷한 개념
- 유저 모드와 HYP모드를 제외한 모든 모드가 PL1에서 실행
- 보통 OS 시스템(커널)이 PL1에서 실행
- SVC, IRQ, FIQ, ABT, UND, SYS 모드 등이 실행됨
- 하드웨어적으로 시스템 설정 동작 가능
- SUBS PC LR / MOVS PC LR 과 같은 명령어를 실행해서 PL1에서 정의된 동작 모드로 스위칭
- 변경시에는 SPSR 레지스터 모드 필드에 비트 설정
- 동작 모드 선택 방법
- ARM 관점과 리눅스 관점은 다름
- 따라서 동작모드는 프로젝트의 스펙에 맞게 동작모드를 선택하면 됨
- 간단한 프로젝트가 아니라면, 운영체제가 필요하다면 user 모드와 svc 모드 각각 코드를 작성해야하고 예외처리를 위한 어보트 익셉션 처리 루틴도 개발해줘야함(즉 각 동작 모드의 특성을 살리면 다양한 방식으로 시스템을 설계할 수 있음)
- 기타
- OS는 동작 모드 잘 모름. ARM이 관리하는 거임
- CPSR보다 SPSR 동작 제어를 더 많이함(이전 동작의 모드)
- 결론적으로 동작모드를 관리하기 위해서 ARMv7은 CPSR, SPSR을 사용
- cpsr 레지스터는 PL1권한에서 실행되는 svc, irq, fiq, abort모드에서 직접 접근가능(PL0은 직접 접근 불가능)(이렇게 cpsr 레지스터의 동작모드를 읽음으로써 프로그램 실행 흐름을 다양하게 처리할 수 있음)
- SPSR
- 익셉션이 유발돼 동작 모드가 변경되기 전의 CPSR 레지스터 값을 저장
- 익셉션 처리 후 이전 모드로 복귀하기 위해 주로 사용
- 즉 익셉션 유발되기 전 동작 모드를 SPSR로 알 수 있음
- 동작모드에 뱅크드된 레지스터
- 익셉션 핸들러에서는 spsr값 읽는 것이 필수
- SPSR 활용
- 익셉션 핸들러 구현 ex) IRQ 모드, ABT 모드
- 익셉션 핸들러 초반에 SPSR 값에 따라서 코드를 다르게 실행함
- 어보트 모드에서 SPSR이 유저모드이면 익셉션 서비스 루틴 끝에 해당 프로세스를 그냥 종료
- 어보트 모드에서 SPSR이 SVC모드이면 익셉션 서비스 루틴 끝에 커닐 패닉 발생
- 익셉션 핸들러 초반에 SPSR 값에 따라서 코드를 다르게 실행함
- 익셉션이 유발된 이전 동작 모드로 복귀(동작 모드를 다양한 방식으로 변경)
- 인터럽트 처리시에 보통 사용
- 익셉션 핸들러 구현 ex) IRQ 모드, ABT 모드
- 익셉션이 유발돼 동작 모드가 변경되기 전의 CPSR 레지스터 값을 저장
- 동작모드 변경 명령어
- 익셉션이 발생하면 해당 익셉션에 대응하는 동작 모드로 진입하지만, 가끔 임의로 진입할 상황 존재
- MSR CPSR_C 명령어
- PL1 동작 모드끼리는 위 명령어로 동작 모드 변경 가능 ex) MSR CPSR_C, #Mode_IFQ:OR:I_Bit:OR:F_Bit;
- SUBS / MOVS 명령어
- SUBS PC, LR, #4
- MOVS PC, LR (LR주소를 PC에 옮기기 + 동작 모드 변경을 모두 수행)
- 실행 과정
- spsr_현재모드 레지스터와 변경하려는 뱅크드레지스터에 변경할 동작 모드 비트값 저장
- LR 레지스터에 동작모드 변경 후, 분기할 주소를 업데이트
- 위 명령어 실행
- ARM 내부적 과정
- SPSR값 읽어서 CPSR에 동작 모드 복사
- PC에서 가리키는 주소로 분기
- spsr_현재모드에 명시된 동작 모드로 변경되면서 LR에 지정된 주소(ex.__irq_usr/__irq_svc 레이블)로 PC를 분기
- 기타
- 리눅스 커널은 ARM기반에서 구동되는 프로그램 예시를 많이 보유함
- 리눅스는 ARM동작 모드별로 스택을 개별적으로 저장한다.
- 인터럽트나 abort 익셉션 발생해서 각 모드로 진입해도 결국 리눅스커널에서는 그 모드들을 svc모드로 진입해서 처리를 진행한다(간결하게 시스템을 구성)
- 결론적으로 irq, abrt, pbrt, und 등 모드들은 익셉션 처리 핸들러 코드에서 svc모드로 전환된 후, 실제적인 익셉션 서비스 처리 루틴이 실행된다(MOVS PC, LR)
- ARMv7 익셉션 벡터 엔트리 주소: 0xFFFF0000
- 데이터 어보트: 페이지폴트, 널포인터 엑세스 등 으로 발생
- __asm__: 인라인 어셈블리
출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG
'CPU Architecture > ARM Architecture' 카테고리의 다른 글
요약 7. ARMv7 익셉션 (0) | 2023.12.31 |
---|---|
요약 6. ARMv8 익셉션 레벨 (0) | 2023.12.31 |
요약 4. ARM 어셈블리 명령어 (0) | 2023.12.30 |
요약 3. ARM 레지스터 (0) | 2023.12.30 |
요약 2. ARM 공부 이유 (0) | 2023.12.30 |