예외상황(예외처리)에 관해서 알아보자
예외 상황 : Segmentation Fault, Hardware Interrupt 등을 예외 상황이라고 한다
CPU는 명령어 주소에 있는 레지스터에 적혀있는 메모리에 가서 명령을 수행하고, 다음 명령어를 받고 메모리에 가서 명령을 수행하는 반복적인 작업을 컴퓨터가 꺼질 때까지 반복한다. 이러한 시퀀스를 Control Flow라고 한다.
일반적으로 코드는 연속적으로 실행된다.
하지만 jump와 branch 같은 제어문(if, for loop)을 통해서 control flow를 바꿀 수 있다.
그리고 함수 호출을 통해서도 control flow를 제어할 수 있다.
하지만 위와 같이 일반적으로 제어할 수 없는 부분(system 상태의 변화)이 존재한다.
- 하드디스크, 네트워크 어댑터를 통한 데이터의 유입
- divides by zero
- user hits Ctrl-C
- system timer expires
컴퓨터 시스템에 있는 응용프로그램 레벨, OS레벨, 하드웨어 레벨 등의 모든 레벨에서 예외상황이 발생할 수 있고, 각각의 예외를 어떻게 처리할 것인가를 정의할 수 있다.
1. low level mechanisms
Exceptions : 가장 낮은 레벨에서 발생하는 예외 (일반적으로 하드웨어나 OS에서 처리)
2. high level mechanisms
Process context switch : 하드웨어 타이머와 OS를 통해서 처리
Signals : OS내부에서 다른 process로 메시지를 보내는 것 (OS에서 처리)
Nonlocal jumps : 함수 바깥의 코드로 점프를 할 때 사용
#1 에서는 Exceptions에 대해서 다루겠다.
Exceptions
OS Kernal에서 처리해야 하는 예외들이다. (User code에서 처리 불가)
- Divide by zero
- arithmetic overflow
- pagefault
- I/O request completes
- typing Ctrl-C
Kernal 외부에는 Exception을 처리하기 위한 Exception Table이 존재한다
각각의 event들은 exception number라는 것을 가지고 있다. 이는 exception table의 index가 될 것이고, table에는 각각의 exception들이 어떤 코드를 통해 처리해야 하는지 pointer로 가리키고 있다.
exception table은 trap table, interrupt table이라고도 불리곤 한다.
exception을 asynchronous exception과 synchronous exception으로 나누어서 알아보자
1. Asynchronous exception
CPU 외부에서 발생하는 예외상황이고 보통 Interrupt라고 불린다.
외부에서 event가 발생하면 CPU의 핀을 통해서 전기 신호를 보내 Interrupt가 발생함을 알린다
Timer interrupt : 주기적으로 발생, Kernal이 User programs로부터 cpu를 가져올 때 사용된다
I/O interrupt(from external device) : Ctrl-C, nertwork packet, disk read
2. synchronous exception
CPU에서 명령을 수행하다가 발생하는 예외적인 상황
Traps : Intentional(System call같은 의도적인 상황), user code가 수행할 수 없는 code
System call이란?
C 코딩할 때 사용하는 fopen, read, write는 실제로 open, read, write 작업을 수행하는 게 아니라, syscall이라는 trap을 발생시키는 함수이다. 실제로는 오른쪽과 같이 kernal이 파일을 read하고, write 하는 등의 작업을 수행한다.
%rax를 통해서 syscall number가 전달이 되고(다른 %rdi, %rsi등의 레지스터를 통해서도 전달이 됨), Kernal에서 레지스터를 읽고 어떤 syscall이 발생했는지 알아차려서 그에 알맞은 핸들러를 호출한다.
만약 에러가 발생한다면 음수를 리턴하게된다.
Faults : 의도적이진 않지만 복구가 가능한 문제(불가능할 수도 있음(protection fault))가 발생한 상황(pagefault, protection fault, floating point exceptions)
Page Fault란?
사용하고자 하는 page의 주소가 메모리에 있지 않고 디스크에 있는 경우에 발생한다. (OS가 처리)
예를 들어$0xd라는 값을 0x8049d10이라는 주소에 저장하고 싶지만
아직 해당 주소가 포함된 page가 disk에 있다면 page fault를 발생시키고,
디스크에서 메모리로 page를 복사해온다.
그리고 movl 명령을 재 실행하여 기존 작업을 마무리한다. (아래 그림 참조)
Ex > Invalid Memory Reference
왼쪽과 같은 코드는 a[5000]에 접근하려고 한다.
먼저 해당 page의 주소가 당연히 없으므로 pagefault가 발생한다.
Kernal이 해당 위치를 탐색해보고 invaild 한 위치라고 판단되면
process에게 segmentation fault 시그널을 보내게 되고 해당 process를 강제로 종료한다. (아래 그림 참조)
Aborts : 의도적이지도 않고 복구가 불가능한 상황(기계적인 결함, 불법적인 명령), 현재 프로그램을 강제 종료한다
'CS > SystemSoftware' 카테고리의 다른 글
SystemSoftware - Creating Processes #1 (0) | 2021.06.06 |
---|---|
SystemSoftware - Exceptional Control Flow #2 (0) | 2021.06.05 |
SystemSoftware - Linking #2 (0) | 2021.06.04 |
SystemSoftware - Linking #1 (0) | 2021.06.03 |
Attack Lab Solution Phase_1 ~ Phase_5 (3) | 2021.05.31 |