그간 정리해놓았던 것들을 blog로 옮겨보려고 한다. 차근차근...
ARM register는 37개임거의범용 register로 구성되어 있다.
User
|
System
|
FIQ
|
Supervisor
|
Abort
|
IRQ
|
Undef
|
R0
| ||||||
R1
| ||||||
R2
| ||||||
R3
| ||||||
R4
| ||||||
R5
| ||||||
R6
| ||||||
R7
| ||||||
R8
|
R8_fiq
| |||||
R9
|
R9_fiq
| |||||
R10
|
R10_fiq
| |||||
R11
|
R11_fiq
| |||||
R12
|
R12_fiq
| |||||
R13(SP)
|
R13_fiq
|
R13_svc
|
R13_abt
|
R13_irq
|
R13_und
| |
R14(LR)
|
R14_fiq
|
R14_svc
|
R14_abt
|
R14_irq
|
R14_und
| |
R15(PC)
| ||||||
CPSR
| ||||||
SPSR_fiq
|
SPSR_svc
|
SPSR_abt
|
SPSR_irq
|
SPSR_und
|
Current Program Status Register(CPSR)
- 31 ~ 28 (NZCV)
- N: Negative
- Z: Zero
- C: Carry
- V: oVerflow
- 27 ~ 8: unused
- 7: IRQ
- 6: FIQ enable(0)/disable(1), interrupt가 걸리지 않도록 control 가능함.
- 5: Thumb mode / ARM mode
- 4 ~ 0: 현재의 mode
Saved Program Status Register(SPSR)
- CPSR을 복사해 넣는 특수 Register. 백업용임.
- SPSR의 값을 CPSR에 다시 집어 넣으면 이전 mode로 곧바로 복귀 가능함.
R14: Linked Register(LR)
- 어딘가로 jump할 때 어디서 branch 해 왔는지 표시하는 것
R13: Stack Pointer(SP)
- 현재 Stack을 어디까지 쌓아두었는가.
R15: Program counter(PC)
- 현재 어디를 수행하고 있는지를 나타냄.
Context: Register set의 snapshot. 즉, R0 ~ R1, CPSR의 snapshot
Thumb / ARM mode 차이
- Thumb는 R0 ~ R7만 사용
- ARM은 R0 ~ R12까지 사용
FIQ에 banked register가 많은 이유는 stack에 backup하는 시간 절약...
Kernel 영역에서 행하는 것은 supervisor mode임.
User 영역에서 실행하는 것은 user mode임.
링 모델에서 0~3의 4개의 모드가 있는데 kernel은 0모드, user는 3 모드, 1, 2는 OS가 제공해줌.
user mode는 system call인 SWI(SW interrupt) 명령을 내리면 kernel 영역으로 진입함.
unistd.h에 system call에 정의 되어 있음
댓글 없음:
댓글 쓰기