240211_예외적인 제어 흐름

추성결·2024년 2월 11일
0

참조: https://it-eldorado.tistory.com/51
참조: https://koyo.kr/post/csapp-ecf-signal-1/
참조: https://koyo.kr/post/csapp-ecf-signal-2/

예외적인 제어 흐름(exceptional Control Flow, ECF)

  • 시스템 상태 변화에 반응하여 (프로그램의 실행과 반드시 관련되어 있지 않은 변화에도 반응하여야한다.) 제어 흐름이 갑작스럽게 변화하는 것을 말한다.

  • 이런 ECF은 컴퓨터 시스템의 모든 수준(하드웨어, 운영체제, 응용 프로그램)에서 나타난다.

1. 예외 상황

  • 예외 상황은 어떤 프로세서 상태의 변화에 대한 대응으로 부분적으로 하드웨어와 운영체제에 의해서 구현된 예외적인 제어 흐름의 한 가지 형태이다.

  • 위 그림에서 프로세서는 현재 어떤 명렁어 Icurr을 실행하고 있을 때, 프로세서 상태에 중요한 변화가 일어나고 있다. 이러한 상태 변화를 이벤트라고 한다.

  • 이 이벤트는 인스트럭션 실행에 관련이 있을 수도 있고(ex. 가상 메모리 페이지 오류, 산술 오버플로우, divide by zero 등) 없을 수도 있다(ex. 시스템 타이머의 정지, I/O 요청 완료 등).

  • 예외 처리가 끝나면, 이벤트의 종류에 따라서 다음과 같은 세 가지 중의 한 가지 일이 발생한다.

    	1. Icurr 인스트럭션으로 되돌려준다.
    	2. Inext 인스트럭션으로 되돌려준다.
    	3. 프로그램을 종료한다.

1-1. 예외 처리

먼저 아래의 개념부터 살펴본 후 예외 처리 과정을 살펴보자.

예외 테이블: 예외를 처리하기 위해 특별한 데이터 구조를 저장한 테이블. 발생 가능한 예외와 처리 방법을 저장한다.

점프 테이블: 예외가 발생했을 때, 실행해야할 특별한 코드(예외 처리 핸들러)의 주소가 담겨있다.

  • 한 시스템 내에서 발생할 수 있는 모든 예외는 중복되지 않는 양의 정수를 가진다. 이 숫자들은 프로세서 설계자가 부여한 것과, 커널 설계자가 부여한다.

  • 이러한 예외 정수가 담긴 예외 테이블을 컴퓨터에 파워가 공급되어 시스템에 부팅되는 순간, 운영체제는 메모리에 할당 및 초기화를 한다.

  • 이 후 이벤트 발생 시, 해당 이벤트의 예외 번호를 결정하고 예외 테이블의 해당 예외 번호를 참조하여 예외 처리 핸들러의 주소를 가지고, 간접적으로 호출한다.

1-2. 일반적인 프로시저 호출과 예외 핸들러의 호출 차이

1. 두 개 모두 스택에 복귀 주소를 호출하는데, 예외 핸들러는 이벤트 종류에 따라 Icurr또는 Inext의 주소일 수 있다.
2. 또한, 핸들러의 경우 복귀 주소 뿐만 아니라 프로세서의 상태 정보(EFLAGS 레지스터)를 푸시한다.
3. 예외 핸들러는 커널 모드에서 실행되어, 일반적인 함수와 달리 시스템 자원들에 대한 접근 권한을 가진다. 즉 위 #2번의 데이터들을 유저 스택이 아닌 커널 스택에 저장된다.

1-3. 예외의 종류

  • 인터럽트(Interrupt)
    : 프로세서 외부에 있는 입출력 장치들로부터 받은 시그널의 결과로 발생되는 비동기적 예외이다.

  • 트랩(Trap)
    : 어떤 인스트럭션을 실행하여 의도적으로 예외를 발생시키는 동기적 예외이다.
    트랩의 중요한 용도는 일반적인 함수와 유사한 인터페이스로 커널의 서비스를 요청하는 것을 시스템 콜이라 한다.

  • 오류(Fault)
    : 핸들러가 정정할 수 있을 가능성이 있는 에러 조건으로부터 발생하는 동기적 예외이다.
    만약 에러를 정정할 수 있다면 현재 명령어로 되돌려 주고, 정정할 수 없다면, 커널 내부의 abort루틴으로 리턴해서 프로그램을 종료한다.

  • 중단(Abort)
    : 대개 DRAM/SRAM이 고장날 떄 발생하는 parity 에러나 하드웨어 에러들에 발생하는 예외 즉, 회복 불가능한 에러에 의해 발생하는 동기적 예외이다.
    절대로 응용 프로그램으로 제어를 리턴하지 않는다.


0개의 댓글