예외 처리: 명령어 처리 과정의 예외 사항(인터럽트, 예외: 트랩, 폴트, 중단)

Jin Hur·2021년 8월 20일
0

reference: "프로그래머가 몰랐던 멀티코어 CPU 이야기" / 김민장, "Computer System A Programmers'Perspective" / 랜달 E.브라이언트

(참고)
1. 인터럽트(1) 개념과 처리과정: https://velog.io/@jinh2352/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B81
2.인터럽트(2) 트랩의 분류: https://velog.io/@jinh2352/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B82-%ED%8A%B8%EB%9E%A9%EC%9D%98-%EB%B6%84%EB%A5%98

명령어를 처리하는 프로세서도 여러 예외사항이 벌어지고 이를 처리해야만 한다.
읽을 권한이 없는 엉뚱한 메모리 영역에 읽기를 시도하면 segment fault(트랩의 분류 中 fault) 오류나 윈도우의 오류 창(access violation)을 볼 수 있다. 이 오류는 프로세서가 가상 주소를 물리 주소로 변환하다 권한이 부족한 것을 인지하고 예외를 발생시켰기 때문이다. 이 예외를 운영체제가 받아 적절히 사용자에게 보여주는 것.

프로세서는 보통 예외(exception)인터럽트(interrupt)로 구분해서 예외적인 상황을 외부로 알린다.
예외는 다시 트랩(trap), 폴트(fault), 중단(abort)으로 세부적으로 나뉘기도 한다. 그러나 구체적인 정의는 프로세서마다 다를 수 있다. 여기서는 일반적인 인터럽트와 예외에 대해 언급한다.

인터럽트

인터럽트는 다시 소프트웨어 인터럽트하드웨어 인터럽트로 나뉜다. 하드웨어 인터럽트는 외부에서 일어나는 명령어 흐름 처리와 상관없는 비동기적인(asynchronous) 사건을 가리킨다. 예를 들어 키보드를 눌렀다는 신호가 하드웨어 인터럽트로 전달된다. 인터럽트가 발생되면 프로세서는 현재 실행중인 명령어 흐름을 잠시 멈춘다. 말 그대로 명령어 흐름이 방해 받는다. 프로세서는 인터럽트를 처리하는 함수 루틴으로 문맥을 전환한다. 인터럽트를 처리하는 루틴을 인터럽트 서비스 루틴(interrupt service routine), 또는 인터럽트 벡터(interrupt vector)라고 한다. 인터럽트 처리가 끝나면 다시 원래 프로그램으로 돌아가 실행이 재개된다. 멀티 태스킹의 구현도 타이머 장치가 발생하는 인터럽트로 구현된다. 하드웨어 인터럽트 중 일부는 무시될 수 있다.

소프트웨어 인터럽트는 명령어(x86의 경우 INT)로 발생되는 인터럽트이다.

예외

예외는 프로그램 실행 도중 동기적(synchronous)으로 발생하는 일. 예를 들어, 나눗셈을 수행하다 0으로 나누는 경우(division by zero)를 만나면 예외를 발생시킨다. 프로세서는 문맥을 전환해 이 예외를 처리하는 핸들러를 실행시킨다. 아마 가장 대표적인 프로그램 실행 도중의 예외 현상은 페이지 폴트(page fault)일 것이다. 프로세서가 명령어 캐시에서 명령어를 읽을 때 해당 PC(Program Counter)가 가리키는 가상 주소가 아직 처리되지 않았거나, 또 데이터를 읽는데 이 주소가 아직 페이지 테이블에 없을 떄, 프로세서는 예외를 발생시키고 운영체제는 이 페이지 폴트를 처리한다. 페이지 폴트가 무사히 완료되면 프로세서는 마치 페이지 폴트가 없었던 것처럼 느낄 것이다. 그 밖에도 여러 예외가 있다. 데이터 정렬이 어긋날 때, 알 수 없는 옵 코드일 때, 메모리 접근 권한이 없을 떄 예외(segment fault)가 발생한다.

앞서 말헀듯 예외에는 트랩, 폴트, 중단으로 다시 나눌 수 있는데 기본적인 개념은 동일하고 약간의 형태만 다르다. 인텔 IA-32 구조에서는 폴트와 트랩을 예외 처리 후 다시 시작되는 위치로 구분한다. 폴트는 문제를 일으킨 명령어부터 다시 시작되지만, 트랩은 그 명령어 이후부터 시작한다. 페이지 폴트를 생각하면, 문제 해결 후 그 폴트를 발생시킨 명령어부터 다시 시작하지만, 디버거 중단점 트랩(breakpoint trap)은 그 다음 명령어부터 시작된다.

반면 abort는 어디서 문제가 발생했는지 알려주지 않고 다시 프로그램을 시작하는 것도 허용하지 않으므로 심각한 하드웨어 문제일 때 발생한다. 반면 폴트나 트랩은 다시 고쳐질 수 있는 문제이다.

예외가 일어난 위치를 정확하게 알려주는 것(precise exception)은 프로세서와 운영체제 설계에 아주 중요하다. 만약 페이지 폴트가 일어났는데 어떤 명령어나 데이터 주소가 문제를 일으켰는지 알려주지 못한다면 운영체제 설계에 아주 큰 어려움이 있다. 그런데 프로세서 구조에 따라 예외 발생의 위치를 정확하게 알려주기 어려울 때가 있다.


각 프로세서마다 정의하는 정확한 예외/인터럽트는 다르고, 예외 처리 또한 다르다는 것을 상기.

0개의 댓글