- ARM (Advanced RISC machine)
- CISC(complex instruction set computer)
Micro programming 방식 : 기계어 하나를 실행하기 위해 많은 양의 작은 micro instruction들이 숨어서 실행 - RISC(Reduced Instruction set computer)
Hard wired 방식 : 기계어 한줄을 실행하기 위하여, 그에 해당하는 노리회로를 구성하여 구현하는 방식.
CISC vs RISC
CISC (Complex Instruction Set Computer)
하나의 명령어당 최대한 많은 작업을 수행
- 명령어의 길이가 가변적
- 복잡한 기능이 많은 명령어로 구성된 프로세서
- 복합 명령을 가짐으로써 하위 호환성을 충분히 확보
- 전력소모가 큼, 속도가 느리고 가격이 비쌈
- 호환성이 절대적으로 필요한 PC 환경에서 사용
RISC (Reduced Instruction Set Computer)
명령어 하나당 하나의 연산만을 수행
- 명령어의 길이가 고정적
- 하드웨어가 간단한 대신, 소프트웨어가 복잡함.
- 전력소모가 적음, 속도가 빠르고 가격이 저렴
- 하위 호환을 위해 에뮬레이션 방식을 채택, 호환성 부족
ARM mode and Thumb mode
Thumb mode
- Thumb mode는 ARM mode의 반쪽으로 볼 수 있다.
- 처음 32 bit ARM가 나왔을 때, 임베디드 시스템 메모리는 16비트 data line을 가진 메모리가 주 였다. 따라서 32 bit 코어라해도, 메모리를 효율적으로 사용하기 위해서는 16비트 처리가 필요하다.
ARM의 동작 mode
User (USR) : Normal Program execution mode
System (SYS) : Run privileged operating system tasks
Fast Interrupt Request (FIQ) : When a high priority (fast) interrupt is raised
Interrupt Request (IRQ) : When a low priority (normal) interrupt is raised
Supervisor (SVC) : A protected mode for the operatng system, entered when a SWI instruction is exectued
Abort (ABT) : Used to handle memory access violations
Undef (UND) : Used to handle undefined instructions
- USR은 Application program을 실행하는 모드.
- SYS는 USR와 비슷하지만, 특권을 가지고 있다는 차이가 있음.
- SVC는 SWI 명령이 발생하면 전환된다. 대부분의 시스템 자원을 자유롭게 관리할 수 있는 모드.
Privileged Mode vs Normal mode
- USR을 제외한 모든 모드는 특권 모드이다.
- 특권 모드는 IRQ, FIQ등의 인터럽트의 사용 가능 유무를 직접 설정 할 수 있다.
- 특권 모드는 서로 모드 변경이 자유롭게 가능하지만, 일반 모드에서 특권 모드의 변경은 불가능 하다.
- ARM의 기본적인 mode는 SVC모드이다. 부팅시 ARM에 대한 모든 권한을 행사하기 위함.
ARM Register
- ARM core는 모드가 바뀌면서 사용하는 레지스터 셋도 바뀐다.
- 모든 모드가 공유하는 레지스터는 CPSR, PC, R0~R7
특별한 용도의 레지스터
CPSR : Current Program Status Register
- NZCV : 연산 후 결과 값에 따라 set 됨.
- IF : IRQ나 FIQ가 걸릴 수 있는지에 관한 필드, 인터럽트에 대한 컨트롤이 가능하다.
- T : Thunmb 모드 set
- mode : 현재 mode를 나타냄.
SPSR : Saved Program Status Register
- CPSR를 복사해 넣는 특수 레지스터.
- CPSR를 백업하기 위함.
- 모드 변경 시 사용.
R14 : Linked Register (RBP)
- 리턴 주소를 담고 있다.
R13 : Stack Pointer (RSP)
- 현재 스택의 꼭대가를 가리킴
R15 : Program Counter (RIP)
- 다음 실행할 명령어를 가리킴.
- 현재 Fetch 해 온 위치를 가리킴. (현재 까지 실행된거 X)
Context Switching
- 문맥 전환,
- 프로세스 실행 중, 인터럽트로 인해 다른 프로세스가 실행될 때
- 레지스터 값을 교체하는 작업
ARM Exception
Exception은 Interrupt를 포함한 더 큰 사건,
외부 요청, 오류에 관련된 사건.
Interrupt : 제어 흐름에서 예상치 못한 외부에서 전달되는 사건.
Exception : 프로세서 내부에서 발생하는 예상치 못한 사건.
내부 인터럽트 (exception)
- SVC 인터럽트 : 외부의 프로그램이 의도적으로 호출.
- 산술 오버플로우/언더플로우
- 0 으로 나누기
- 정의 안된 명령어 수행
외부 인터럽트 (interrupt)
- I/O 인터럽트 : 입출력 요구가 있을 때 하드웨어가 발생
- 전원 이상 인터럽트
- 기계 착오 인터럽트 : CPU 등의 기능적 오류
- 외부 신호 인터럽트 : Timer등으로 발생.
- Exception이 발생하면, 그 Exception에 해당하는 미리 정해진 주소의 프로그램을 하드웨어적으로 수행함.
- 이 주소를 Exception Vector라 한다.
- SVC mode : SVC 모드는 power on이나 reset이 일어난 경우에 진입한다.
- IRQ mode : 하드웨어적인 인터럽트가 발생하면 진입한다.
- FIQ mode : 인터럽트 중에 Fast 인터럽트가 발생하면 진입한다.
- ABT mode : Access하는 주소가 Access 할 수 없는 경우, 명령어를 Fetch를 못할 경우. 에 진입한다.
- UND mode : 명령어를 해석했는데 ARM이 모르는 명령어일 경우 진입한다. 보통 메모리 커럽션이 나면 발생, > 이를 응용하면 일부러 코드를 삽입하여 UND vector 주소로 jmp하도록 할 수 있음.
Exception 우선 순위
- Reset
- Data Abort
- FIQ
- IRQ
- Prefetch Abort
- Undefined Instruction
- SWI
Exception 처리 과정
- Exception이 발생 한 후, 이전 모드로 돌아갈 수 있어야 한다.
- Register 값을 다시 사용할 수 있어야 한다. 이전에 쓰던 Context를 다시 복원할 수 있어야 한다.
- 이전 모드로 돌아갔을 때 원래 수행하던 곳으로 돌아갈 수 있어야 한다.
ARM Procedure Call Standard (함수 호출 규약)
- 함수를 부를 때 레지스터는 어떻게 사용 하는가.
- return 값은 어떻게 돌려 주는가.
- 스택은 어떨 때, 어떻게 사용되는가.
- 일반적인 레지스터들은 어떻게 사용되는가.
- R4 ~ R11을 사용하려면, 스택에 저장 후 사용하고, return시 이전 값을 레지스터에 복원해야 한다.