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 아키텍처: 메모리모델과 배리어
- udemy
- arm
- Kernel
- ARM 아키텍쳐: 메모리 모델과 배리어
- 코멘토실무PT
- Arm 아키텍처: 캐시
- 실무PT후기
- 코멘토
- 시스템 소프트웨어 개발을 위한 ARM 아키텍처의 구조와 원리
- Arm 아키텍처: 메모리 모델과 배리어
- BSP
- 인프런
- yocto
- 빌드 시스템
Archives
- Today
- Total
반도체 소프트웨어
요약 3. ARM 레지스터 본문
- 레지스터 세트: 태스크의 실행 흐름(데이터 저장)
- 컨텍스트: 범용 레지스터
- 컨텍스트 스위칭: ARM 코어에서 현재 실행 중인 레지스터 세트를 태스크 자료 구조에 저장하고, 다음에 실행할 태스크의 레지스터 세트를 ARM 코어의 레지스터에 로딩(cpu 아키텍처에 의존적인 작업)
- ARMv7 범용 레지스터
- 보통 어셈블리 연산 결과가 R0~R12에 저장됨
- 보통 어셈블리 연산 결과가 R0~R12에 저장됨
- SP(R13): 프로세스 스택 주소 저장
- LR(R14): 함수 호출 완료 후에 복귀할 주소를 저장(BL 시에 저장)
- PC(R15): 현재 패치하는 명령어 주소를 저장(현재 실행중인 명령어의 주소 저장)
- CPSR: 프로세스 상태 저장(익셉션 모드 저장)
- SPSR: CPSR의 복사본 레지스터
- 이전 동작 모드의 프로세서 상태 정보 저장
- 뱅크드 레지스터: 동작모드별 전용 레지스터
- 동작 모드에 따라 갱신되는 레지스터 ex) 현재 IRQ모드이면 범용레지스터인 SP와 SP_IRQ 뱅크드 레지스터가 같이 갱신됨
- 모드별로도 스위칭, 익셉션이 자주 일어나는데 중요한 데이터(R13~R14)를 매번 메모리에 넣고빼는건 비효율적이기에 레지스터로 사용하는 설계를 사용
- 뱅크드 레지스터: 주로 R13, R14
- CPSR 심화
- CPSR(Current Program Status Register): 프로세서 상태 정보 저장하는 레지스터
- CPSR은 중요하며 범용레지스터와 달리 비트필드가 정의되어짐
- 컨디션 플래그: 연산 실행 결과가 컨디션플래그에 저장됨(NZCV)
- 마스크 비트: 특정 익셉션, 인터럽트 모드 제외 설정 비트 (A,I,F 마스크 = 비활성화)
- M[4:0]: 동작 모드 저장 비트 설정
- 기타
- ADD, ADDS 차이: S붙은 명령어는 컨디션 플래그 등 업데이트함
- 보통 익셉션 발생하면 동작모드가 변경되는데, 이때 ARM 코어가 CPSR M비트에 실행될 동작 모드 값을 설정함
- r0, r1에 다른 레지스터 값을 cpy, ldr하는 어셈블리 코드는 보통 함수 호출시에 인자를 복사하는 것
- 함수 리턴값은 보통 r0에 저장됨. 함수 호출 종료 뒤에 그 값을 0x0값과 비교함(CMP)
- 부트로더, 커널 크래시 등 발생하면 당시 레지스터 정보를 커널 로그에 남김(메모리 덤프)
- SPSR 심화
- SPSR(Saved Program Status Register): CPSR 백업 용도로 사용하는 레지스터
- 익셉션 모드별로 존재
- 동작방식
- CPSR은 익셉션이 발생하여 스위칭될 SPSR 뱅크드 레지스터에 백업
- CPSR은 현재 프로세서 상태를 계속 실시간으로 유지해야하기에 백업 레지스터인 SPSR이 필요한 것
- 익셉션이 발생하기 전 동작모드정보가 담긴 cpsr을 익셉션이 발생한 spsr에 복사
- 현재 cpsr값을 발생한 익셉션 모드를 spsr에 저장한 뒤에 익셉션 핸들러 루틴을 마무리 한 뒤, 다시 익셉션 전으로 복귀할때 spsr값을 cpsr에 설정함으로써 이전 동작 모드로 리턴
- LR도 같은 방식으로 동작
- 사용 이유
- spsr을 사용해 다양한 시나리오로 익셉션 핸들러를 구현해 처리 가능
- 이전 동작 모드로 리턴 가능
- spsr_irq, spsr_svc, spsr_abt
- ARMv8 레지스터
- 범용 레지스터
- 64bit 크기 레지스터 제공
- w0 ~ w30: 32비트 범용 레지스터
- x0 ~ x30: 64비트 범용 레지스터(x30: LR 레지스터)
- 범용 레지스터는 연산 결과를 저장하고 인자를 받는 등 cpu내에서 지역변수처럼 사용됨
- 스페셜 레지스터
- ARMv7과 다르게 익셉션 레벨별로 존재 ex) SP_EL1, SPSR_EL3 등
- EL: 익셉션 레벨
- el0: 유저 모드 ex)카카오톡
- el1: 커널 모드
- 기타 등등
- SP 레지스터
- 보통 Stack Point 레지스터는 HANDLER 모드로 사용함(스레드 모드는 특정 테스트시에 사용) - SPSR_EL3h, SPSR_EL3t
- 위 모드를 설정하는 레지스터가 SPSel (위와 다르게 리눅스 커널과 XEN 하이퍼바이저에서는 SP_EL0만 사용하는 설정을 지원하지않음)
- PC(program counter) 레지스터
- ARMv8에서 pc는 스페셜 레지스터
- pc에 직접 접근 불가 (RET라는 명령어를 통해 간접적으로만 가능)
- ELR_ELx(Exception Link Register)
- 익셉션 리턴 주소를 저장
- 익셉션 완료후 복귀할 주소를 저장
- 인터럽트 유발 후 복귀시에 사용
- PSTATE(M[3:0] -> PSTATE 인터페이스 비트 필드)
- ARMv8에서는 PSTATE의 EL 비트 필드를 통해 익셉션 레벨을 저장
- ARM 코어에서 하드웨어적으로 처리되므로 커널 등 소스에서 확인 불가능
- 직접 접근 불가능
- CurrentEL: 익셉션 레벨을 비트필드에 저장하는 다른 레지스터
- 그래서 PSTATE말고 CurrentEL 레지스터를 통해 익셉션 레벨을 읽어야함
- MRS 명령어 사용해서 읽기 가능 ex) MRS <Xt> CurrentEL
- ARMv7과 다르게 익셉션 레벨별로 존재 ex) SP_EL1, SPSR_EL3 등
- 시스템 레지스터
- 시스템 속성을 설정하는 레지스터
- 시스템 레지스터는 _ELx 접미사 붙음
- 브링업 과정(부팅 등)에서 많이 설정
- 최소 접근 권한
- _EL1 -> EL1, EL2, EL3에서 접근 가능
- _EL2: -> EL2, EL3에서 접근 가능
- _EL3 -> EL3에서만 접근 가능(숫자클수록 더 특권 모드)
- 시스템 레지스터 읽기 ex) MRS x0, TTBR1_EL1 (오른쪽에서 왼쪽으로 명령어 진행)
- TTBR1_EL1 값을 x0 레지스터에 저장
- 시스템 레지스터는 MRS를 통해서만 읽기 가능(mov등으로 읽으면 unknown 익셉션 발생)
- 시스템 레지스터 쓰기 ex) MSR TTBR1_EL1, x0
- TTBR1_EL1에 x0레지스터값을 저장
- 실전에서는 MSR이후에 베리어 명령어를 사용해줘야 좋음 (3.3.4.2 7분 강의 다시 보셈, 파이프라인 및 FLUSH 관련된 사항)
- 베리어: 베리어 다음 코드가 베리어 이전으로 실행되지 않도록 막는 어셈블리 명령어
- dsb sy / isb sy
- 주요 시스템 속성 설정
- 인터럽트(GIC)
- 캐시
- 트랩 방식
- 변환 테이블
- MMU 설정
- 명령어 활성화(위 시스템 속성들을 아래와 같은 시스템 레지스터를 사용하여 설정 가능)
- 주요 시스템 레지스터 종류
- SCTLR_ELx(system control register): MMU, 캐시, alignment 검사와 같은 아키텍처의 주요 기능 제어
- ACTLR_ELx(Auxiliary control register): 프로세서 관련 주요 기능 제어
- SCR_EL3(Secure Configuration Register): 시큐어 상태와 EL3로 익셉션이 트랩되는 세부 동작 설정(중요)
- HCR_EL2(Hypervisor Configuration Register): Virtualization 동작과 EL2 트랩하는 방식 제어, 가상화 환경 개발시 반드시 설정해야함(중요)
- MIDR_EL1(Main ID register): SW가 실행될때 프로세서 관련 정보 얻어옴(revision, version 정보)
- MPIDER_EL1(Multiprocessof Affinity Register): core와 cluster ID를 멀티코어시스템에서 식별함
- 범용 레지스터
출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG
'CPU Architecture > ARM Architecture' 카테고리의 다른 글
요약 5. ARMv7 동작모드 (0) | 2023.12.30 |
---|---|
요약 4. ARM 어셈블리 명령어 (0) | 2023.12.30 |
요약 2. ARM 공부 이유 (0) | 2023.12.30 |
요약 1. ARM 프로세서 역사 (0) | 2023.12.28 |
시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 with 인프런 (0) | 2023.12.28 |