모드란 것은
옛날 다이아몬드의 중요성을 모르는 사람이 다이아몬드로 구슬치기로 사용한다 한다 치면
이 모드는 헬로우 월드 라는 단순한 것을 찍으려 한다면 모드를 고민할 필요가 없다라는 소리이다.
명령어가 FF라는 명령어가 없다고 한다면 언디파인드,를 우리가 다 에러처리를 해줘야한다. 언디스트럭션 에
뭔가를 취소했을때 Abort 가 뜬다.
즉, ABT, UND 를 만나면 안 좋다.
커널이 아닌 모드는 USER 모드 즉, 어플리케이션 모드라는 것이다.
ARM에서 지원하는 7가지 동작모드
1. User 모드
태스크나 애플리케이션을 실행할 때의 동작모드이다.
비특권모드(Unprivileged)
메모리, I/O 장치와 같은 시스템 자원을 사용하는데 제한이 있다.
2. IRQ(Interrupt Request) 모드
인터럽트 요청에 대한 동작모드이다.
하 드웨어적인 외부장치의 요청에 의해 IRQ가 발생하면 IRQ 모드로 전환하고
인터럽트를 처리한다.
3. FIQ( Fast Interrupt Request) 모드
빠른 인터럽트 처리를 하는 모드이다.
하드웨어적인 외부장치의 요청에 FIQ가 발생하고 FIQ 모드로 전환하고
인터럽트를 처리한다.
4. SVC(Supervisor) 모드
대부분의 시스템 자원을 자유롭게 관리할 수 있는 동작모드이다.
운영체제의 커널이나 디바이스 드라이버를 처리할 때 사용되는 동작모드다.
ARM은 리셋신호가 입력되거나 소프트웨어 인터럽트(SWI)가 사용되면
SVC모드로 전환된다.
5. Abort 모드
메모리에서 명령을 읽거나 데이터를 읽고 쓸때 오류가 발생하면 Abort 모드로
전환하여 메모리 오류를 처리한다. MMU나 MPU, 기타 외부 메모리 제어기로부터
발생하는 Abort신호에서 동작한다.
6. Undefined 모드
명령어를 읽어 처리할 때 디코더에 정의되어 있지 않을 경우 발생하는 오류를
처리하기 위한 동작모드이다.
7. System 모드
특권(privilege) 모드라는 점을 제외하고는 User모드와 동일한 동작모드이다.
ARM은 User 모드와 System 모드는 소프트웨어적인 요청에 의해서만 전환이 되며
그외 다른 동작모드는 소프트웨어적인 요청이나 외부의 요청 혹은
오류에 의해 모드가 전환된다.
| User Mode
평상시 ARM의 동작 상태. 16개의 범용 레지스터와 1개의 상태 레지스터를 사용한다.
| IRQ Mode
일반적으로 I/O 장치로부터의 입력이 들어오면 반응을 하는 흔히 말하는 인터럽트 Exception 발생시 진입하게 되는 모드다. IRQ의 종류로는 내부 타이머나 시리얼, 혹은 외부 IRQ입력 등이 될 수 있다.
| FIQ Mode
개념적으로는 IRQ와 거의 유사한데, 다만 보다 빠른 처리를 할 수 있도록 제공되는 모드다. IRQ의 소스는 대부분 FIQ로도 매핑 될 수 있다. 즉, 타이머 인터럽트를 IRQ로 처리하거나, 혹은 FIQ로 처리할 수도 있다는 의미이다.
FIQ가 발생하면 FIQ Mode로 바뀌게 되는데 이때 R8 ~ R14(7개) 레지스터는 FIQ 전용 레지스터로 리매핑된다.
따라서 기존 R8 ~ R14의 내용을 보관하기 위해 스택 작업을 할 필요가 없기 때문에 속도가 빨라지는 것이다.
SPSR은 CPSR값을 저장해 두는 역할을 한다. 범용레지스터가 아예 맵핑이 바뀌는데 반해, 모드가 바뀔 경우, 예를 들어 IRQ가 발생했다면, 기존에 User모드에서 사용하는 CPSR값을 SPSR_irq에 저장을 합니다. 그리고 IRQ 모드에서는 CPSR과 SPSR_irq를 둘 다 볼 수 있다. 후에 IRQ가 끝나는 시점에서 SPSR_irq의 내용을 CPSR로 복구하면 원래의 CPSR값이 유지되는 것이다.
IRQ 처리루틴에서 수정이 된다고 해도, 복귀할 때 SPSR에서 CPSR값을 다시 가져오므로, 실행 중이던 환경은 그대로 유지가 되는 것이다. 이렇듯 ARM7에서는 Exception처리에 있어 되도록 스택 사용을 최소화하려는 노력을 엿볼 수 있다.
| Supervisor Mode
프로그램에서 임의로 인터럽트를 호출하는 경우이다. ARM Instruction SWI가 이에 해당한다. 이 Exception이 발생하면 CPU동작모드가 Supervisor 모드로 바뀌도록 되어 있고, 보통 OS의 시스템 Call을 구현하기 위해 사용된다.
Supervisor Mode에서는 R13 ~ R14는 전용 레지스터로 리매핑된다.
| Abort Mode
CPU가 메모리로부터 인스트럭션을 가져오거나, 혹은 인스트럭션을 동작시키면서 데이터를 가져오려고 할 경우, 해당 메모리를 access 할 수 없다면 Abort Exception이 발생한다. 위에 제시한 두 가지 경우에 대응하여 Prefetch Abort와 Data Abort로 구분할 수 있다.
| Undefined Mode
ARM7 에 정의되어 있지 않은 명령어를 만났을 경우 이 모드로 바뀐다.
ARM의 register 개수
- R0 ~ R15 (16개)
- CPSR (1개)
- FIQ의 R8 ~ R14, SPSR (8개)
- SVC의 R13, R14, SPSR (3개)
- ABT의 R13, R14, SPSR (3개)
- IRQ의 R13, R14, SPSR (3개)
- UND의 R13, R14, SPSR (3개)
- 총 37개
255 값을 넣는다고 했을 때 int 형을 사용하지 않고 char형을 사용해야 적절한 자료형을 이용하는 것이므로, 이 변수들은 밀도 가 높다고 표현한다.
즉, 이렇게 적절하게 메모리 용량을 잘 활용하기 위한 모드가 존재하는데 이것이 5번째 비트인 T 이다. Thumb mode 냐, ARM mode 냐 로 갈리게 되는데
Thumb mode : 16bit Instruction Set mode
ARM mode : 16bit Instruction Set mode
이렇게 갈리게 되는 것이다.
단, 유저모드 일 때는 0~4개의 비트 중 해당 모드를 사용하려고 1값을 넣어도 작동하지 않는다. 권한이 없다라는 것 같다.
Privileged mode
-SVC, SYS, IRQ, FIQ, ABT, UND
-IRQ나 FIQ 등의 Interrupt의 사용 가능 유무를 직접 설정 가능
-상호간의 Mode 변경이 가능 (USR Mode로 변경 가능)
Normal mode
-USER
-Normal Mode는 스스로 Privileged Mode로 변경 불가능
-즉, USR에서 Privileged Mode로 변경 불가능
ARM Default Mode ?
-SVC
ARM mode
-32bit mode
THUMB mode
-16bit mode
-ARM을 처음 개발 했을 때, memory는 16bit bus line이 주류
-Fetch를 2번 하면 16bit bus라도 ARM mode 사용가능 (대신 Performance는 하락)
-Performance를 위해 16bit로 압축한 instruction set 제공
즉, 정리하자면
ARM mode / THUMB mode
-ARM core가 몇 bit로 동작할지를 결정하는 상태 mode
Privileged mode / Normal mode
-ARM core의 동작 mode
혼돈하지 않도록 주의할 것!
reset_vector:
ldr pc, =reset_handler
pc에 reset_handler 라는 함수가 실행되게 된다. 전에 설명했음/
0번지를 실행하는데 이게 리셋핸들러를 넣으라고했으니까 ldr명령어가 실행되며 그 수행결과로 reset_handler 함수가 실행된다라는 소리다.
리셋을 했을때 어디로 점프되는지 나오는 라벨링이 되어있다.
rsvd_vector:
b rsvd_vector /* reserved */
점프 해올 일도 없다.
fiq_vector:
/*------------------------------------------------------------------------------
*- Function : fiq_handler
*- Treatments : FIQ Interrupt Handler.
*- Called Functions :
*------------------------------------------------------------------------------*/
fiq_handler:
b fiq_handler
빨리 처리해야하기 때문에 함수로 점프하지 않고 바로 밑에 붙어서 시작. 즉, 도착하자마자 바로 실행할 수 있도록 구조를 설계해놨다.
fiq가 동작하기에 최상의 상태가 되도록 벡터 설계를 해놓았다라는 소리다.
reset_vector:
ldr pc, =reset_handler
undef_vector:
b undef_vector /* Undefined Instruction */
0x0 은 ldr pc, =reset_handler
0x04 는 b undef_vector /* Undefined Instruction */
즉 4바이트 차이.
모든 mode가 공유하는 register
-CPSR
-PC
-R0 ~ R7
SYS와 USR은 완전히 같은 register 사용
-CPSR mode bit 값만 차이가 남
-SYS는 왜 SPSR이 없는가? (Exception 처리 때문)
CPSR
-Current Program Status Register
-32bit register
-NZCV는 Flag field 이며, 어떤 연산 후 setting
-N : Negative (연산의 결과가 마이너스인 경우 set)
-Z : Zero (연산의 결과가 0인 경우 set)
-C : Carry (연산의 결과가 carry가 발생한 경우 set)
-V : oVer flow (연산의 결과가 over flow 났을 경우 set)
-IF는 IRQ/FIQ가 걸릴 수 있는지를 나타냄
-7번째 bit는 IRQ
-6번째 bit은 FIQ
-1로 set이면 Disable, 0으로 set이면 Enable
CPSR
-T는 Thumb mode/ARM mode를 나타냄
-0 ~ 4의 5개 bit는 현재 동작 mode를 나타냄
-즉 CPSR의 하위 5bit를 조작하면 mode 전환 가능
SPSR
-Saved Program Status Register
-SPSR은 CPSR을 복사해 넣는 특수 register
-즉, CPSR을 backup 할 때 사용
-SPSR에 CPSR을 backup을 하고, 다시 CPSR에 집어 넣으면 이전 mode로 복귀
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151126 임현수 업무일지 ARM #1 ARM 기초 (6) | 2015.11.27 |
---|---|
20151126 윤재희 #1. ARM 레지스터, ARM mode, Exception (5) | 2015.11.26 |
20151126_김태현_ARM 어셈블리 (5) | 2015.11.26 |
20151126-김재홍-ARM_Assembly_1일차 (6) | 2015.11.26 |
20151126 - 강동조 개인업무일지 ARM (6) | 2015.11.26 |
20151126 수업 / ARM 어셈블리 - 남수진 (7) | 2015.11.26 |
20151126 - 권오민 - WinAPI 11일차 & ARM ASSEMBLY 1일차 (4) | 2015.11.26 |
20151125_일일업무보고서_박서연_WinAPI(10) (2) | 2015.11.26 |