cpu는 한 번에 하나의 명령어만 수행할 수 있음
이 명령어의 순서를 Control Flow라고 한다.
Control Flow의 전환
프로그램 상태 changing
- branch로 점프
- return call
시스템 상태의 changing
- 디스크나 네트워크로부터 데이터가 왔을 때,
- 0으로 나눌 때
- 사용자가 커맨드에서 ctrl+c를 누를 때
- 시스템 타이머 만료(일정주기 마다 만료됨)
이런 예외를 처리하기 위해, 프로그램은 OS에 제어권을 넘긴다.
(시스템 상태 변화는 usermode에서 해결이 불가능하다.)
Exception
위에서 시스템 상태의 chaingin이 일어나는 상황을 예외(Exception)이라고 한다.
에러가 처리되고 나면, 원래 실행했던 다음 명령어로 이동시킨다.
Arm에서의 Exception
큰 범주에서 보면 Exception들은 다음과 같다.
- Reset
- Undefined Instruction
- SWI (Function call)
- abort (세그폴트, 페이지 폴트)
- 인터럽트 (IRQ : 인터럽트 요청 , FIQ : 빠른 인터럽트 요청(매우 급하다!))
Asynchronous Exception
CPU 외부에서 발생하는 이벤트들
- 프로세서의 Interupt 핀에 명시된 이벤트들
- 일반적으로 실행중인 프로세스의 상태에 영향을 주지 않음
- Exception 핸들러는 다음 명령어를 실행하라는 반환 값을 줌
비동기 예외는 다음과 같다.
- I/O 인터럽트 (네트워크, 디스크)
- Reset
Synchronous Exceptions
명령어를 실행하는 결과에서 발생하는 예외
1. Traps
- 의도적인 예외
- SWI, break point, undefined instruction이 그 예
- 다음 명령어를 실행하라는 반환값을 줌
2. Fault
- 의도하지는 않았으나, 복구 가능한 예외
- 페이지 폴트, 세그 폴트
- 현재, 또는 다음 명령어를 수행하란 반환값을 줌
- 보호 문제로 인한 프로세스 중단
Arm에서의 Exception 핸들링
1. 프로세스의 cpsr을 spsr_<mode> 란 곳에 복사한다.
2. cpsr 비트를 설정한다.
-> Arm State에 맞는 bit 설정 Ex) Thumb state
-> Mode filed bit 설정 Ex) FIQ인지
-> Interupt disable bit 설정을 꼭 해야 한다. (IRQ 비트 세팅)
3. return 주소를 계산해 lr_<mode> 에 저장한다.
4. pc를 vector address 주소로 설정
-> vector address란?
-> 각종 예외 처리에 대한 코드 entry를 담은 주소
5. 예외 처리가 끝나면, cpsr과 return address값을 복구한다.
IRQ vs FIQ
FIQ는 전용 레지스터 bank를 가지고 있어서, 레지스터 백업에 대한 시간을 줄일 수 있다.
vector table의 마지막 단에 위치하고 있어서,
실제 핸들러의 위치로 가능 브랜치 명령어가 필요하지 않다.
FIQ가 실행될 동안은 다른 IRQ를 받지 못한다. (IRQ are masked)
따라서, FIQ는 저엉말 긴급한 경우에만 써야 한다.
'학교 > 시스템 프로그래밍' 카테고리의 다른 글
Signal (0) | 2020.12.05 |
---|---|
PC, LR, SP (0) | 2020.11.17 |
LDR / STR Indexing (0) | 2020.11.17 |
section (0) | 2020.11.13 |
shift 연산자 (0) | 2020.11.11 |