반도체 소프트웨어

요약 3. ARM 레지스터 본문

CPU Architecture/ARM Architecture

요약 3. ARM 레지스터

반도체 소프트웨어 엔지니어 2023. 12. 30. 16:29
  1. 레지스터 세트: 태스크의 실행 흐름(데이터 저장)
  2. 컨텍스트: 범용 레지스터
  3. 컨텍스트 스위칭: ARM 코어에서 현재 실행 중인 레지스터 세트를 태스크 자료 구조에 저장하고, 다음에 실행할 태스크의 레지스터 세트를 ARM 코어의 레지스터에 로딩(cpu 아키텍처에 의존적인 작업)
  4. ARMv7 범용 레지스터
    • 보통 어셈블리 연산 결과가 R0~R12에 저장됨
    • 보통 어셈블리 연산 결과가 R0~R12에 저장됨
    • SP(R13): 프로세스 스택 주소 저장
    • LR(R14): 함수 호출 완료 후에 복귀할 주소를 저장(BL 시에 저장)
    • PC(R15): 현재 패치하는 명령어 주소를 저장(현재 실행중인 명령어의 주소 저장)
    • CPSR: 프로세스 상태 저장(익셉션 모드 저장)
    • SPSR: CPSR의 복사본 레지스터
    • 이전 동작 모드의 프로세서 상태 정보 저장
  5. 뱅크드 레지스터: 동작모드별 전용 레지스터
    • 동작 모드에 따라 갱신되는 레지스터 ex) 현재 IRQ모드이면 범용레지스터인 SP와 SP_IRQ 뱅크드 레지스터가 같이 갱신됨
    • 모드별로도 스위칭, 익셉션이 자주 일어나는데 중요한 데이터(R13~R14)를 매번 메모리에 넣고빼는건 비효율적이기에 레지스터로 사용하는 설계를 사용
    • 뱅크드 레지스터: 주로 R13, R14
  6. 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)
      • 부트로더, 커널 크래시 등 발생하면 당시 레지스터 정보를 커널 로그에 남김(메모리 덤프)
  7. 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
  8. ARMv8 레지스터
    • 범용 레지스터
      • 64bit 크기 레지스터 제공
      • w0 ~ w30: 32비트 범용 레지스터
      • x0 ~ x30: 64비트 범용 레지스터(x30: LR 레지스터)
      • 범용 레지스터는 연산 결과를 저장하고 인자를 받는 등 cpu내에서 지역변수처럼 사용됨
    • 스페셜 레지스터
      • ARMv7과 다르게 익셉션 레벨별로 존재 ex) SP_EL1, SPSR_EL3 등
        1. EL: 익셉션 레벨
        2. el0: 유저 모드 ex)카카오톡
        3. el1: 커널 모드
        4. 기타 등등
      • SP 레지스터

        1. 보통 Stack Point 레지스터는 HANDLER 모드로 사용함(스레드 모드는 특정 테스트시에 사용) - SPSR_EL3h, SPSR_EL3t
        2. 위 모드를 설정하는 레지스터가 SPSel (위와 다르게 리눅스 커널과 XEN 하이퍼바이저에서는 SP_EL0만 사용하는 설정을 지원하지않음)
      • PC(program counter) 레지스터
        1. ARMv8에서 pc는 스페셜 레지스터
        2. pc에 직접 접근 불가 (RET라는 명령어를 통해 간접적으로만 가능)
      • ELR_ELx(Exception Link Register)
        1. 익셉션 리턴 주소를 저장
        2. 익셉션 완료후 복귀할 주소를 저장
        3. 인터럽트 유발 후 복귀시에 사용
      • PSTATE(M[3:0] -> PSTATE 인터페이스 비트 필드)

        1. ARMv8에서는 PSTATE의 EL 비트 필드를 통해 익셉션 레벨을 저장
        2. ARM 코어에서 하드웨어적으로 처리되므로 커널 등 소스에서 확인 불가능
        3. 직접 접근 불가능
      • CurrentEL: 익셉션 레벨을 비트필드에 저장하는 다른 레지스터
        1. 그래서 PSTATE말고 CurrentEL 레지스터를 통해 익셉션 레벨을 읽어야함
        2. MRS 명령어 사용해서 읽기 가능 ex) MRS <Xt> CurrentEL
    • 시스템 레지스터
      • 시스템 속성을 설정하는 레지스터
      • 시스템 레지스터는 _ELx 접미사 붙음
      • 브링업 과정(부팅 등)에서 많이 설정
      • 최소 접근 권한
        1. _EL1 -> EL1, EL2, EL3에서 접근 가능
        2. _EL2: -> EL2, EL3에서 접근 가능
        3. _EL3 -> EL3에서만 접근 가능(숫자클수록 더 특권 모드)
      • 시스템 레지스터 읽기 ex) MRS x0, TTBR1_EL1 (오른쪽에서 왼쪽으로 명령어 진행)
        1. TTBR1_EL1 값을 x0 레지스터에 저장
        2. 시스템 레지스터는 MRS를 통해서만 읽기 가능(mov등으로 읽으면 unknown 익셉션 발생)
      • 시스템 레지스터 쓰기 ex) MSR TTBR1_EL1, x0
        1. TTBR1_EL1에 x0레지스터값을 저장
        2. 실전에서는 MSR이후에 베리어 명령어를 사용해줘야 좋음 (3.3.4.2 7분 강의 다시 보셈, 파이프라인 및 FLUSH 관련된 사항)
          1. 베리어: 베리어 다음 코드가 베리어 이전으로 실행되지 않도록 막는 어셈블리 명령어 
          2. dsb sy / isb sy
      • 주요 시스템 속성 설정
        1. 인터럽트(GIC)
        2. 캐시
        3. 트랩 방식
        4. 변환 테이블
        5. MMU 설정
        6. 명령어 활성화(위 시스템 속성들을 아래와 같은 시스템 레지스터를 사용하여 설정 가능)
      • 주요 시스템 레지스터 종류
        1. SCTLR_ELx(system control register): MMU, 캐시, alignment 검사와 같은 아키텍처의 주요 기능 제어
        2. ACTLR_ELx(Auxiliary control register): 프로세서 관련 주요 기능 제어
        3. SCR_EL3(Secure Configuration Register): 시큐어 상태와 EL3로 익셉션이 트랩되는 세부 동작 설정(중요)
        4. HCR_EL2(Hypervisor Configuration Register): Virtualization 동작과 EL2 트랩하는 방식 제어, 가상화 환경 개발시 반드시 설정해야함(중요)
        5. MIDR_EL1(Main ID register): SW가 실행될때 프로세서 관련 정보 얻어옴(revision, version 정보)
        6. MPIDER_EL1(Multiprocessof Affinity Register): core와 cluster ID를 멀티코어시스템에서 식별함

 

출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG