ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [이론][컴퓨터구조][ARM] ARMv8 - 프로세서 상태
    공학/컴퓨터구조 2023. 8. 3. 02:35

    글의 참고

    - https://developer.arm.com/documentation/den0024/a/ARMv8-Registers/AArch64-special-registers/Saved-Process-Status-Register

    - https://developer.arm.com/documentation/den0024/a/ARMv8-Registers/Processor-state

     


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다. 나도 모르기 때문에 나중에 알아봐야 할 내용이라는 뜻이다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다. 그러므로, 밑 줄 처친 글이 이해가 안간다면 링크를 따라서 관련 내용을 공부하자.

    - `글의 참조`에서 빨간색 볼드체로 체크된 링크는 이 글을 작성하면 가장 많이 참조한 링크다.

    - 이 글은 글의 참조에 있는 링크들을 내 마음대로 번역한 것이다. 심지어 필요없다고 생각된 부분은 생략했음을 알린다.

     


    글의 내용

    1. ARMv8 프로세서 상태 소개

    - ARMv8의 프로세서 상태는 사실 ARMv7의 CPSR, SPSR의 방식과 크게 다르지 않다. 일단, ARMv8에서 프로세서 상태와 관련이 깊은 정보는 2가지가 있다.

    1) PSTATE
    2) SPSR_ELn 레지스터

     

     

    1.1) PSTATE(Processor state)

    - AArch64에서는 ARMv7에서 있었던 `Current Program Status Register(CPSR)` 레지스터 완전 동일한 기능을하는 레지스터를 갖고 있지는 않다. 그래서 ARMv8은 ARMv7의 CPSR의 각 비트들과 동일한 의미를 갖는 요소들을 제공한다. 이 요소들을 Processor State, 즉, `PSTATE` 라고 부른다. 

     

    - PSTATE 필드 구성은 아래와 같다.

    1) AArch32 실행 상태에서만 의미가 있는 필드

    2) AArch64 실행 상태에서만 의미가 있는 필드

    2) (1)과 (2)에 모두 적용된 필드

     

    - PSTATE의 요소들은 아래와 같다.

     

    1.1.2 PSTATE 필드에 액세스하기

    - 실행 상태가 AArch64라면 특정 레지스터(Special-purpose registers)들을 통해서 PSTATE 필드에 접근이 가능하다. PSTATE의 값을 가져오려면, PSTATE 해당 필드에 대응하는 레지스터를 통해서 값을 가져올 수 있다. 

     

    - 예를 들어, 아래의 명령어로 현재 프로세스 상태의 익셉션 레벨을 가져올 수 있다. 주의할 점은 위에 레지스터에 대응하지 않는 PSTATE 필드들은 내부적으로 관리되는 필드이기 때문에 직접 가져올 수 있는 방법이 없다.

    mrs x0, CurrentEL

     

    - 주의할 점은 ARMv8 문서에서는 PSTATE를 레지스터라고 정의하는 내용이 없기 때문에, 아래와 같은 명령어를 실행하면 에러가 발생한다.

     mrs x0, pstate

     

     

    - MSR (immediate) 명령어를 사용해서 직접 PSTATE.{D, A, I, F, SP, PAN, UAO} 에 값을 쓸 수 있다. 아래의 필드는 프로세서의 실행 상태가 AArch64일 때, MSR 명령어를 통해 직접 값을 쓸 수 있는 PSTATE 필드를 보여준다. 

    - PSTATE {N, Z, C, V}는 EL0에서 액세스 할 수 있다.

     

     

     

    1.2) SPSR_ELn 레지스터

    - SPSR은 `Svaed Program Status Registers`의 약자이다. 이 레지스터는 예외가 발생했을 때, PE state를 저장하는 역할을 한다. 

     

    - AArch64 실행 상태 예외가 발생하면, 각 예외별로 SPSR 레지스터를 하나씩 갖는다. 즉,

    >> AArch64 실행 상태에서 EL1 예외가 발생하면 SPSR_EL1 레지스터를 사용한다.

    >> EL2가 구현되어 있다면, AArch64 실행 상태에서 EL2 예외가 발생하면 SPSR_EL2 레지스터를 사용한다.

    >> EL3가 구현되어 있다면, AArch64 실행 상태에서 EL3 예외가 발생하면 SPSR_EL3 레지스터를 사용한다.

     

    - 주의할 점은 EL0은 예외를 처리할 수 없는 익셉션 레벨이므로, SPSR 레지스터가 없다.

     

    - PE는 예외 처리 시, 각 익셉션 레벨에 맞는 SPSR 레지스터에 현재 PSTATE의 내용을 저장한다. 예를 들어, EL1 예외가 발생하면 PSTATE는 SPSR_EL1 레지스터에 저장된다. 

     

    - PE state를 저장한다는 것은 익셉션 핸들러가 아래의 작업들을 수행한다는 의미다.

     1) 익셉션 핸들러는 예외 처리 후 복귀시점에, 현재 익셉션 레벨에 맞는 SPSR 레지스터를 통해서 PE state에 복구시켜야 한다. 예를 들어, EL1 예외를 처리하고 복귀 할 때, SPSR_EL1 레지스터의 값으로 PE state를 복구해야 한다.

    2) 익셉션 핸들러는 예외가 발생했을 때 PSTATE에 있었던 값을 검사해야 한다. 무슨 말이냐? 익셉션 핸들러는 예외를 발생시킨 명령어가 실행됬던 상황을 알 수 있어야 한다. 즉, 예외가 발생했었던 실행 상태 및 익셉션 레벨을 알아내려면, 예외가 발생했을 때 PSTATE에 있었던 값을 검사해야 한다.

     

    - SPSR 레지스터를 PSTATE에 저장할 때, 주의점이 있다.

    1) 직접 읽기 및 쓰기 액세스 권한이 없는 필드와 AArch32 상태에서만 의미 있는 필드를 포함하여 모든 PSTATE 필드가 SPSR 레지스터에 저장된다.

    2) 예외 발생 시, 실행 상태가 AArch32에서 AArch64로 변경되는 상황인데도 AArch32에서만 의미있는 PSTATE 필드까지 모두 SPSR 레지스터에 저장된다. -> 이게 올바른 해석인지 모르겠다..?(Those PSTATE fields that are meaningful only in AArch32 state are saved when an exception is taken from AArch32 state to AArch64 state)

    - SPSR 레지스터는 reset 되면, `UNKNOWN` 상태가 된다.

     

    1.2.1) SPSR_ELn 레지스터

    - 예외가 발생하여, 실행 상태가 AArch64로 변경될 때 SPSR 레지스터 포맷은 다음과 같다.

    참고로 SPSR은 2가지 동작에서 사용된다는 것을 기억해야 한다.

    1) 예외 발생 시, PSTATE 필드들을 `저장` 하는 역할.
    2) 예외 처리 후 복귀 시, PSTATE 필드들을 `복구`하는 역할.

    - 아래의 SPSR 포맷은 `예외가 발생했을 때, 실행 상태 변경(AArch32 -> AArch64) 및 유지(AArch64 -> AArch64)에 따른 SPSR 포맷`이라고 보면 될 듯 하다. 

     

    - 왜 ARMv8에서 SPSR 레지스터는 2개의 포맷이 존재할까? 그건 ARMv8이 ARMv7과의 호환성을 위해서 AArch32라는 실행 상태를 만들었기 때문이다. ARMv8 아키텍처를 지원하는 프로세서는 AArch32 실행 상태가 되면 SPSR 레지스터의 포맷을 ARMv7에 있었던 SPSR 레지스터와 동일한 포맷으로 맞춘다. 위 그림에서 2번째 그림의 SPSR 포맷이 ARMv7 아키텍처 사용하던 레지스터 포맷이다.

    '공학 > 컴퓨터구조' 카테고리의 다른 글

    [컴퓨터 구조] Data Alignment  (0) 2023.08.07
    VGA 텍스트 모드  (1) 2023.08.05
    [컴퓨터구조] 파이프라인  (0) 2023.08.04
    [컴퓨터구조] PC의 Enumeration  (0) 2023.08.03
    [컴퓨터구조] ARM - Exception Level  (0) 2023.02.20
Designed by Tistory.