시스템 반도체의 핵심은 ARM Processor!
[용어]
BSP(Board Support Package) : 이름의 의미 그대로 보드를 사용할 수 있도록 하기 위한 SW 묶음
- 부트로더, 디바이스 드라이버 등
Arm사는 라이선스 비지니스 - 칩을 만들기 위한 설계도를 판다!
주요 IP(Intellectual Property - 재사용 가능하도록 기능을 모듈화해 설계한 Core Design)에 대한 라이선스 판매
Arm 아키텍처?
: 아키텍처는 Arm 프로세서를 설계하는 디자인을 의미한다!
Arm 프로세서를 제어하기 위한 소프트웨어 인터페이스를 의미!
→ 레지스터, 메모리 구조, Arm 어셈블리 명령어, 함수 호출 규약 등
Arm 프로세서?
: 디바이스를 뜻한다!
Arm 아키텍처에 의존적, 같은 아키텍처 버전 기반의 Arm 프로세서들은 같은 명령어를 사용한다!
[용어]
PE(Processing Element)
: Arm 아키텍처의 구현체를 나타내는 용어 ; Arm 코어 / Arm 프로세서
Arm에서의 PE(Processing Element)는 Arm 프로세서 아키텍처에서 사용되는 용어입니다. Arm 아키텍처는 다양한 디바이스 및 시스템에서 사용되며, 모바일 기기, 임베디드 시스템, 서버, 네트워크 장비 등 다양한 응용 분야에 사용됩니다. Arm 프로세서는 다양한 성능 수준과 구성 요소를 갖추고 있으며, 이 중 일부는 PE로 표현됩니다.
Arm 아키텍처에서의 PE(Processing Element)는 다음과 같은 특징을 갖습니다:
1. **코어(Core) 단위**:
Arm 프로세서의 각 코어는 PE로 간주됩니다. 이는 프로세서의 기본적인 계산 및 처리 단위입니다.
2. **실행 유닛(Execution Unit) 및 파이프라인(Pipeline)**:
PE는 명령어를 수행하기 위한 실행 유닛과 파이프라인을 포함합니다. 이를 통해 명령어를 해석하고 실행하는 데 필요한 계산과 연산을 수행합니다.
3. **레지스터 및 캐시**:
PE는 레지스터 파일과 캐시 메모리를 포함하여 데이터 및 명령어를 효율적으로 저장하고 액세스합니다.
4. **벡터 및 부동 소수점 연산 유닛**:
일부 Arm 프로세서에는 벡터 처리 및 부동 소수점 연산을 위한 특별한 실행 유닛이 포함될 수 있습니다. 이는 고성능 및 병렬 연산을 지원하는 데 사용됩니다.
Arm 프로세서의 PE는 다양한 응용 분야에서 사용되며, 효율적인 에너지 소비와 뛰어난 성능을 제공하여 다양한 디바이스 및 시스템에서 사용됩니다. Arm 아키텍처는 이러한 PE들을 조합하여 다양한 프로세서 및 시스템을 구축하는 데 사용됩니다.
Arm Processor 왜 배워야 할까?
1) 임베디드 시스템의 Bring-up을 잘 하기 위해
- 보드 브링업 : 부트로더에서 스타트업 코드를 작성, 메모리나 캐시 같은 시스템 자원 초기화, 주변 장치 초기화
→ 스타트업 코드를 프로젝트에서 정한 스펙에 맞게 프로그래밍하려면 Arm 어셈블리 명령어 알아야 함.
→ 동작 모드와 MMU 같은 Arm 아키텍처를 구성하는 주요 기능의 동작 원리도 잘 알아야 함.
Startup code는
임베디드 시스템에서 프로그램 실행이 시작되는 초기 단계에서 필요한 코드입니다.
이 코드는 프로세서가 전원을 켜거나 리셋될 때 실행되며, 프로그램의 진입점(entry point)으로서 동작합니다.
주요 기능 및 역할은 다음과 같습니다:
1. **하드웨어 초기화**:
시스템 리셋 이후에는 하드웨어 상태가 초기화되어야 합니다.
예를 들어, 메모리 컨트롤러, 타이머, 인터럽트 컨트롤러 등의 하드웨어 구성요소를 초기화할 수 있습니다.
2. **스택 및 데이터 세그먼트 설정**:
프로그램이 실행될 때 필요한 스택 메모리 영역과 데이터 세그먼트를 설정합니다.
이는 프로그램이 데이터를 저장하고 스택 프레임을 생성할 수 있도록 하는 데 사용됩니다.
3. **인터럽트 및 예외 처리 초기화**:
시스템이 인터럽트 또는 예외 상황에 대응할 수 있도록 인터럽트 및 예외 처리 루틴을 초기화합니다.
이는 시스템이 예상치 못한 상황에 대응하고 안정적으로 동작할 수 있도록 합니다.
4. **런타임 환경 설정**:
프로그램이 실행될 때 필요한 런타임 환경을 설정합니다.
예를 들어, 프로그램의 시작 주소를 설정하거나 초기화 코드를 실행합니다.
Startup code는 보통 어셈블리어로 작성되며, 특정 하드웨어 플랫폼 및 개발 환경에 맞게 커스터마이징됩니다. 임베디드 시스템에서는 주로 C 런타임 라이브러리 및 운영 체제의 초기화를 위해 startup code가 사용됩니다. 이 코드는 프로그램이 메인 함수로 이동하기 전에 시스템을 초기화하고 프로그램의 실행을 준비합니다.
2) 디바이스 드라이버 개발을 잘 하기 위해
- 성능을 최적화하는 프로그래밍 가능
- 디바이스를 세세하게 제어할 수 있음
- GIC(Generic Interrupt Controller)처럼 Arm 프로세서가 인터럽트를 어떤 방식으로 처리하는지 알고 있으면 인터럽트의 우선순위 및 IRQ 혹은 FIQ 설정 여부 같은 세부 속성 설정이 가능하다!
3) RTOS나 리눅스 커널을 깊이 있게 이해하기 위해
- 리눅스 커널이나 RTOS를 구성하는 세부 서브시스템의 핵심 루틴은 Arm 어셈블리 명령어로 구현
ex) 인터럽트 핸들러, 컨텍스트 스위칭, 선점 스케줄링, 시스템 콜 핸들러 호출
4) 디버깅을 통한 문제 해결 능력을 키우기 위해
동작 모드
- Exception이 유발되면 동작 모드가 바뀐다!
- 범용 레지스터를 제대로 이해하려면 동작 모드를 알아야 한다!
동작 모드를 선택할 때..
[1] PL0에서 실행되는 유저 모드에서는 SVC 명령어를 실행해 익셉션(트랩)이 유발되어야 PL1으로 진입 가능함
[2] 하드웨어적으로 시스템을 설정하는 동작(MMU, IRQ, FIQ 인터럽트 설정 등)은 PL1에서 수행 가능
[3] PL1으로 정의된 동작 모드에서는 SPSR 레지스터의 모드 필드에 변경하려는 모드 비트를 설정 / PL1에서는 익셉션 없이 동작 모드 스위칭 가능
[+] 프로젝트의 스펙에 맞게 동작 모드를 선택하면 된다. interrupt가 필요 없는 경우 SVC/USR 모드에서 모두 구현 가능할 수 있다, 소형 MP3 플레이어에서 블루투스를 연결할 때 인터럽트가 발생하는 경우 IRQ 모드에서 프로그램 반응해 동작하도록 시스템을 구성해야 한다. 이때, app을 설치할 수 없으므로 OS에서 처리되어야 한다. 다양한 유저 어플리케이션을 설치해 실행되는 범용 운영체제를 사용하는 경우 다양한 동작 모드를 복합적으로 이용해 시스템을 설계하는 게 좋다.
ARM 프로세서에서 동작 모드가 존재하는 이유는 다음과 같습니다:
1. **보안 및 권한 관리**:
동작 모드는 프로세서가 실행하는 코드의 보안 및 권한 수준을 제어합니다. 예를 들어, 사용자 모드에서는 사용자 애플리케이션 코드가 실행되며, 특권 명령에 접근할 수 없습니다. 반면에 슈퍼바이저 모드에서는 운영 체제와 같은 시스템 레벨 코드가 실행되며, 시스템 리소스에 대한 전체 액세스 권한을 가집니다.
2. **시스템 리소스 관리**:
각 동작 모드는 시스템 리소스의 특정 부분에 대한 액세스 권한을 부여하고, 시스템의 다양한 측면을 관리합니다. 예를 들어, 슈퍼바이저 모드에서는 인터럽트 처리, 메모리 매핑, 시스템 설정 및 초기화와 같은 시스템 관리 작업이 수행됩니다.
3. **성능 및 리소스 최적화**:
동작 모드는 프로세서의 성능과 리소스 사용을 최적화하는 데 도움을 줍니다. 각 모드는 특정 유형의 작업에 최적화되어 있으며, 이를 통해 프로세서가 효율적으로 작동할 수 있습니다. 예를 들어, 빠른 인터럽트 처리를 위해 FIQ 모드와 같은 특별한 모드가 제공됩니다.
4. **오류 처리 및 예외 관리**:
동작 모드는 프로세서가 예외적인 상황을 처리하고 오류를 관리하는 데 도움을 줍니다. 예를 들어, 데이터 액세스 오류가 발생하면 데이터 어보트 모드로 전환되어 해당 오류를 처리할 수 있습니다.
이러한 이유들로 인해 ARM 프로세서는 다양한 동작 모드를 제공하여 시스템의 안전성, 보안, 성능 및 효율성을 관리합니다.
-Privilege Level에 따라 분류-
(특권 레벨 PL0 - PL에서 실행되는 SW는 Unprivileged SW/시스템을 직접적으로 설정할 권한x/몇 가지 아키텍처 기능을 설정할 수 없음/MMU, cache, interrupt 설정 불가능/메모리 공간에 직접적으로 access하지 못함)
1) 유저 모드(USR)
: 유저 어플리케이션이 실행
(특권 레벨 PL1 - 보통 운영체제의 시스템(커널)이 실행됨)
1) 슈퍼바이저 모드(SVC)
: 슈퍼바이저 콜 명령어가 실행되면 진입, 운영체제의 커널(리눅스 커널)이 구동됨
: 유저 모드에 SVC 명령어를 실행하며 슈퍼바이저 모드에 진입
2) IRQ
: IRQ 인터럽트가 발생하면 진입
3) FIQ
: FIQ 인터럽트가 발생하면 진입
IRQ(Interrupt ReQuest)와 FIQ(Fast Interrupt ReQuest)는 ARM 아키텍처에서 사용되는 두 가지 주요한 인터럽트 유형입니다.
1. **IRQ (Interrupt ReQuest)**:
- IRQ는 일반적인 인터럽트 요청을 나타냅니다. 일반적으로 외부 장치 또는 내부 이벤트가 CPU에게 주의를 요청할 때 발생합니다. 예를 들어, 타이머가 만료되거나 입출력 장치에서 데이터가 도착했을 때 IRQ가 발생할 수 있습니다. IRQ는 일반적으로 사용자 모드에서 처리됩니다.
2. **FIQ (Fast Interrupt ReQuest)**:
- FIQ는 IRQ보다 더 높은 우선순위를 가지는 빠른 인터럽트 요청을 나타냅니다. FIQ는 IRQ보다 더 높은 전용 인터럽트 처리 매커니즘을 제공하여 인터럽트 처리 지연을 최소화합니다. 이는 일반적으로 매우 시간에 민감한 시스템에서 사용됩니다. 예를 들어, 실시간 제어 시스템에서 센서 데이터를 처리하거나 긴급한 통신 동작을 수행할 때 FIQ를 사용할 수 있습니다. FIQ는 IRQ보다 낮은 레벨에서 실행되는 특권 모드에서 처리됩니다.
IRQ와 FIQ는 ARM 프로세서의 특정 핀을 통해 인터럽트를 발생시키며, 인터럽트 발생 시에 CPU는 현재 실행 중인 작업을 일시 중단하고 해당 인터럽트를 처리하기 위해 인터럽트 서비스 루틴(Interrupt Service Routine, ISR)으로 이동합니다. 인터럽트 처리가 완료되면 CPU는 원래의 작업으로 복귀합니다.
4) Abort(ABT)
: 메모리 어보트 익셉션이 발생하면 진입
: Prefetch Abort나 Data Abort를 유발하는 명령어를 실행하면 진입
Ex) NullPointerException : null 값을 가진 객체/변수 호출할 때 발생하는 익셉션
ARM 아키텍처에서 Prefetch Abort와 Data Abort는 메모리 액세스 중 발생할 수 있는 두 가지 주요한 예외 상황을 나타냅니다.
1. **Prefetch Abort (프리페치 어보트)**:
- Prefetch Abort는 명령의 프리페치(미래 명령을 미리 읽어오는 작업) 중에 문제가 발생했을 때 발생합니다. 예를 들어, 명령을 가져오기 위해 메모리에 액세스하는 동안 메모리 오류가 발생하거나, 명령을 실행하기 전에 유효하지 않은 명령을 감지했을 때 발생할 수 있습니다. Prefetch Abort는 주로 명령 캐시나 분기 예측과 관련된 문제로 인해 발생합니다.
2. **Data Abort (데이터 어보트)**:
- Data Abort는 데이터 메모리에 액세스하는 동안 문제가 발생했을 때 발생합니다. 예를 들어, 데이터를 로드하거나 저장하는 중에 메모리 오류가 발생하거나, 메모리 보호 규칙을 위반하거나, 유효하지 않은 주소에 액세스하려고 할 때 발생할 수 있습니다. Data Abort는 주로 데이터 캐시 또는 외부 메모리와 관련된 문제로 인해 발생합니다.
이러한 예외 상황이 발생하면 프로세서는 현재 실행 중인 명령을 중단하고, 해당 예외를 처리하기 위해 예외 처리 루틴(Exception Handling Routine)으로 이동합니다. 예외 처리 루틴은 일반적으로 운영 체제 또는 예외 핸들러가 제공하는 코드입니다. 예외가 처리된 후에는 프로세서가 정상적인 동작을 계속할 수 있습니다.
5) Undef(UND)
: 정의되지 않은 명령어가 실행되면 진입
: Arm 코어가 디코딩할 수 없는 명령어가 실행되면 진입
: MMU가 초기화되지 않은 상태에서 명령어를 실행하면 진입
: 시스템을 브링업할 때 레지스터를 제대로 설정하지 않으면 진입
6) System(SYS)
: 유저 모드의 레지스터 뷰를 공유하는 모드
ARM 프로세서는 다양한 동작 모드를 가지고 있습니다. 이 모드들은 프로세서가 명령을 실행하는 방식과 권한 수준을 제어합니다. 주요한 ARM 프로세서 동작 모드에는 다음과 같은 것들이 있습니다:
1. **User Mode (사용자 모드)**:
- 일반적인 응용 프로그램이 실행되는 모드입니다. 사용자 프로세스는 이 모드에서 실행되며, 프로세서가 가장 일반적인 명령을 수행합니다. 사용자 모드는 가장 제한적인 모드로, 특권 명령어에 접근할 수 없습니다.
2. **Supervisor Mode (슈퍼바이저 모드)**:
- 운영 체제 커널이 실행되는 모드입니다. 이 모드에서는 특권 명령을 실행할 수 있으며, 시스템 리소스에 대한 접근 및 제어를 할 수 있습니다. 대부분의 운영 체제 서비스 및 커널 작업은 이 모드에서 수행됩니다.
3. **Abort Mode (어보트 모드)**:
- 메모리 액세스가 잘못되었거나, 또는 기타 예외적인 상황이 발생했을 때 실행되는 모드입니다. 일반적으로 메모리 액세스 오류가 감지되면 이 모드로 전환되어 해당 예외를 처리합니다.
4. **Undefined Mode (정의되지 않은 모드)**:
- ARM 아키텍처에서 정의되지 않은 명령이나 동작이 발생했을 때 실행되는 모드입니다. 예를 들어, 유효하지 않은 명령을 수행하거나 실행할 수 없는 상황이 발생하면 이 모드로 전환됩니다.
5. **Interrupt Mode (인터럽트 모드)**:
- 외부 인터럽트 또는 예외적인 이벤트가 발생했을 때 실행되는 모드입니다. 예를 들어, 타이머 인터럽트나 입출력 장치로부터의 인터럽트가 발생할 경우 이 모드로 전환되어 해당 인터럽트를 처리합니다.
6. **Fast Interrupt Mode (빠른 인터럽트 모드)**:
- 일부 ARM 프로세서에서는 빠른 응답이 필요한 인터럽트를 처리하기 위해 별도의 모드가 있습니다. 이 모드에서는 인터럽트 처리가 다른 모드보다 빠르게 이루어집니다.
이러한 동작 모드들은 ARM 아키텍처의 다양한 기능과 특성을 제공하며, 시스템의 안정성, 보안 및 성능을 관리하는 데 중요한 역할을 합니다.
+ System 모드
ARM 프로세서의 System 모드는 주로 ARM7 및 ARM9와 같은 이전 ARM 아키텍처에서 사용되는 개념입니다. System 모드는 프로세서가 부팅될 때 진입하는 기본 모드로, 이 모드에서는 전체 시스템의 제어를 담당합니다.
System 모드에서는 모든 시스템 리소스에 대한 액세스 권한이 있으며, 운영 체제의 초기화 및 시동, 인터럽트 관리, 메모리 매핑 등과 같은 기본적인 시스템 관리 작업이 이루어집니다. 또한 System 모드는 다른 모드로의 전환을 관리하고, 예외적인 상황에 대한 처리를 담당합니다.
최신 ARM 아키텍처에서는 System 모드 대신에 Supervisor 모드가 주로 사용되며, 보안 및 권한 관리가 개선되었습니다. 따라서 System 모드는 이전 ARM 아키텍처에서 사용되는 개념이며, 현재 ARMv8-A 및 이후의 아키텍처에서는 더 이상 사용되지 않을 수 있습니다.
레지스터
: CPU의 변수
: 속도 개선
· 범용 레지스터(R0~R15-PC)
- 어셈블리 명령어의 입력과 출력
- 프로세스의 실행 흐름을 나타냄
- R0~R3 : 함수 파라미터 ;함수에 넘겨줘야 하는 인자가 더 많은 경우 stack에 register spilling후 넘겨준다!
- R0 : 함수 리턴 값
- R13 : Stack Pointer(프로세스의 스택 주소)
- R14 : 리턴 주소(함수 끝나고 돌아올 때 / 함수가 실행될 때 그 다음 instruction의 주소가 stack에 push된다 - 이후 함수가 끝났을 때 pop해서 그 주소로 돌아간다)
- R15 : PC(프로그램 카운터)
· Bankied Registers
ex) 'xxx_동작모드' 꼴로 나타냄 : 뱅크드 된 레지스터(주로 실행흐름 및 상태 저장)
: 값이 복제되어 저장되는 꼴?
Q. Banked Register 왜 써야 하는데?
→ 동작 모드 스위칭이 자주 일어나는데, 동작 모드 스위칭 시 동작 모드 별로 실행된 레지스터를 특정 메모리 공간에 반복해 저장 / 소프트웨어 관점으로 오버헤드(주어진 작업을 수행하는 데 추가적으로 발생하는 비용이나 부)
소프트웨어 관점에서의 "오버헤드(overhead)"는 주어진 작업을 수행하는 데 추가적으로 발생하는 비용이나 부담을 의미합니다. 이것은 일반적으로 시간, 메모리, 프로세서 자원 등의 형태로 나타납니다. 소프트웨어에서 오버헤드는 주로 다음과 같은 세 가지 유형으로 구분됩니다:
1. **시간 오버헤드(Time Overhead)**:
시간 오버헤드는 주어진 작업을 수행하는 데 소요되는 추가적인 시간을 나타냅니다. 예를 들어, 어떤 작업을 수행하기 위해 추가적인 계산이나 데이터 전송이 필요하거나, 병렬 처리를 위해 스레드 간의 동기화를 수행하는 경우에 시간 오버헤드가 발생할 수 있습니다.
2. **메모리 오버헤드(Memory Overhead)**:
메모리 오버헤드는 프로그램 실행 중에 추가적으로 사용되는 메모리 공간을 의미합니다. 예를 들어, 데이터 구조를 유지하기 위해 추가적인 메모리가 필요하거나, 객체 지향 프로그래밍에서 객체의 생성 및 소멸로 인해 메모리 할당 및 해제에 따른 오버헤드가 발생할 수 있습니다.
3. **자원 오버헤드(Resource Overhead)**:
자원 오버헤드는 CPU, 디스크 공간, 네트워크 대역폭 등과 같은 시스템 자원을 추가로 소비하는 것을 의미합니다. 예를 들어, 무거운 암호화 알고리즘을 사용하는 보안 기능은 CPU 리소스를 많이 소모할 수 있으며, 네트워크 프로토콜의 오버헤드는 네트워크 대역폭을 추가로 소비할 수 있습니다.
이러한 오버헤드는 종종 성능 저하를 일으킬 수 있으며, 소프트웨어 설계 및 구현 시에 최소화해야 합니다. 종종 최적화나 효율성을 위해 오버헤드를 줄이는 방법을 고려하는 것이 중요합니다.
Banked register란 CPU에서 사용되는 레지스터의 한 종류로, 여러 모드나 상태를 지원하기 위해 중앙 처리 장치(CPU) 내부에 여러 개의 복제된 레지스터 세트를 갖는 것을 의미합니다. 이러한 banked register가 필요한 이유는 다음과 같습니다:
1. **다중 실행 모드 지원**:
일부 CPU 아키텍처에서는 사용자 모드, 커널 모드, 시스템 모드 등 다양한 실행 모드를 지원합니다. 각 모드에는 다른 레지스터 상태가 필요할 수 있습니다. Banked register를 사용하면 각 모드에 대해 별도의 레지스터 세트를 제공하여 모드 간 전환 시 레지스터 상태를 별도로 저장하고 복원할 수 있습니다.
2. **인터럽트 및 예외 처리**:
프로세서가 인터럽트나 예외를 처리할 때 현재 실행 중인 프로세스의 상태를 보호하기 위해 레지스터 값을 저장하고 복원해야 합니다. Banked register를 사용하면 인터럽트가 발생할 때 현재 실행 중인 프로세스의 레지스터 값을 저장하고 인터럽트 처리를 위해 필요한 레지스터 값을 새로운 세트로 로드할 수 있습니다.
3. **스레드 지원**:
멀티스레딩 환경에서 각 스레드는 독립적인 레지스터 상태를 가져야 합니다. Banked register를 사용하면 각 스레드가 고유한 레지스터 세트를 가질 수 있으므로 스레드 간 상태 전환이 더욱 효율적으로 이루어질 수 있습니다.
4. **빠른 컨텍스트 전환**:
Banked register를 사용하면 다양한 실행 모드나 상태 간의 컨텍스트 전환을 더욱 빠르게 수행할 수 있습니다. 각 모드나 상태에 대해 레지스터 값이 이미 저장되어 있기 때문에 저장 및 복원에 필요한 오버헤드가 줄어듭니다.
따라서 Banked register는 다양한 실행 모드 및 상태를 지원하고 프로세서의 효율성을 향상시키는 데 중요한 역할을 합니다.
· CPSR, SPSRs 레지스터
- 컨디션 플래그
- 인터럽트 관련 비트 마스크
- 동작 모드
- 익셉션의 실행 흐름
CPSR vs SPSR
: SPSR은 CPSR을 백업하는 용도로 사용된다. SPSRs는 익셉션이 발생하기 전 시점의 CPSR를 저장한다. 이 값을 활용해 Exception Handler는 다양한 방식으로 처리 가능하다. SPSRs는 동작 모드 별로 존재하며 Exception Return을 위해 사용된다. Exception이 발생하기 전 시점의 동작 모드로 복귀하고 싶은 용도이다.
*아래의 예시를 잘 알아두자!
CPSR(Current Program Status Register) 및 SPSRs(하위 프로그램 상태 레지스터)는 ARM 아키텍처에서 상태 및 제어 정보를 저장하는 데 사용되는 특수 레지스터입니다. 각 레지스터에는 다양한 기능이 포함되어 있습니다.
1. **컨디션 플래그 (Condition Flags)**:
- CPSR 및 SPSRs는 실행 중인 명령의 결과에 따라 컨디션 플래그를 설정합니다.
이러한 플래그는 이전 명령의 결과를 나타내며, 조건 분기 명령(Branch) 및 조건 부울 명령(Conditional Execution)과 함께 사용됩니다.
- N : 연산한 결과가 마이너스인 경우 1로 설정
- Z : 연산 결과가 0인 경우 1로 설정
- C : 연산 결과로 자리 올림이 일어난 경우 1로 설정(carry out of the MSB or a borrow into the MSB - unsigned num operation에서만 의미)
- V : 연산 결과로 오버플로우(원래 설정 범위보다 결과값이 큰 경우 해당 - sign bit has flipped - signed num operaion에서만 의)가 발생한 경우
→ ALU의 결과 설정된다
2. **인터럽트 관련 비트 마스크 (Interrupt-related Bit Masks)**:
- CPSR의 비트 중 일부는 인터럽트 관련 비트 마스크로 사용됩니다.
예를 들어, IRQ 비트와 FIQ 비트는 각각 IRQ 및 FIQ 인터럽트를 활성화 또는 비활성화하는 데 사용됩니다.
이러한 비트를 설정하거나 지우는 것을 통해 프로세서가 인터럽트를 처리하거나 무시할 수 있습니다.
3. **동작 모드 (Operating Mode)**:
- CPSR은 현재 ARM 프로세서가 실행 중인 동작 모드를 나타냅니다. 동작 모드는 사용자 모드, 슈퍼바이저 모드, IRQ 모드, FIQ 모드 등이 있으며, 각 모드는 특정 작업을 수행할 때 프로세서가 가질 수 있는 다른 권한 수준과 동작 방식을 정의합니다.
4. **익셉션의 실행 흐름 (Execution Flow of Exceptions)**:
- SPSRs는 예외 처리 과정에서 현재 실행 중인 프로그램 상태를 보존하는 데 사용됩니다.
예외가 발생하면 현재 상태가 CPSR에서 SPSR로 저장되고, 예외를 처리한 후에는 다시 CPSR로 복원됩니다.
이를 통해 프로세서는 예외 처리 중에도 이전 상태를 유지하고, 예외 처리가 완료되면 정확한 실행 흐름으로 복귀할 수 있습니다.
이러한 레지스터들은 ARM 프로세서가 프로그램을 실행하고 상태를 관리하는 데 중요한 역할을 합니다. 프로세서의 동작, 상태 및 예외 처리를 제어하고 모니터링하기 위해 이러한 레지스터를 사용합니다.
Armv8의 경우 차이점
- 범용 레지스터 : X0~X30
- 스페셜 레지스터 : 프로세스의 실행 흐름
- PSTATE (Armv7에서의 CPSR)
- 시스템 레지스터