728x90
CSAPP
8.1 예외상황
- 예외 상황은 부분적으로는 하드웨어와 운영체제에 의해서 구현된 예외적인 제어흐름의 한 가지 형태다.
- 예외상황은 어떤 프로세서 상태의 변화에 대한 대응으로, 제어 흐름의 갑작스런 변화다. 예를 들어, 가상 메모리 페이지 오류, 산술 오버플로우가 발생하거나 어떤 인스트럭션이 divide by zero를 시도하는 경우다.
- 프로세서가 이벤트가 발생했다는 것을 감지하면, 예외 테이블 이라고 하는 점프 테이블을 통해서 이 특정 종류의 이벤트를 처리하기 위해 특별히 설계된 운영체제 서브루틴(예외처리 핸들러)으로 간접 프로시저 콜을 하게 된다.
- 예외 처리 핸들러가 처리를 끝 마치면, 예외상황을 발생 시킨 이벤트의 종류에 따라서 다음과 같은 세 가지 중의 한 가지 일이 발생한다.
- 핸들러는 제어를 현재 인스트럭션으로 돌려준다. 이 인스트럭션은 이벤트가 발생했을 때 실행되고 있는 인스트럭션을 말한다.
- 핸들러는 제어를 다음 인스트럭션으로 돌려주는데, 이 인스트럭션은 예외상황이 발생하지 않았더라면 다음에 실행되었을 인스트럭션이다.
- 핸들러는 중단 된 프로그램을 종료한다.
8.1.1 예외처리
- 한 시스템 내에서 가능한 예외상황의 종류마다 중복되지 않는 양의 정수를 예외번호로 할당하고 있다. 이 숫자들의 일부는 프로세서 설계자가 부여한 것이다. 나머지 번호는 운영체제 커널(운영체제 메모리가 상주하는 부분) 설계자가 할당한다. 전자의 예로는 divide by zero, 페이지 오류, 메모리 접근 위반, break point, 산술 연산 오버플로우가 포함된다. 후자의 예에는 시스템 콜 외부 I/O 디바이스로부터의 시그널이 포함된다.
- 시스템 부팅 시(컴퓨터가 리셋되거나 전원이 공급될 때), 운영체제는 예외테이블이라고 하는 점프테이블을 할당하고 초기화 해서 엔트리 k가 예외상황 k에 대한 핸들러의 주소를 갖는다.
- 런타임 C 시스템이 프로그램을 실행하고 있을때에 프로세서는 이벤트가 발생했다는 것을 감지하고, 대응되는 예외번호 k를 결정한다. 프로세서는 그 후에 예외테이블의 엔트리 k를 통해서 간접 프로세서가 예외 테이블을 이용해서 해당 예외 핸들러의 주소를 어떻게 만드는지를 보여준다. 예외 번호는 예외 테이블에서 인덱스이며, 이 테이블의 시작 주소는 예외 테이블 베이스 레지스터라는 특별한 CPU 레지스터에 저장되어있다.
- 예외상황은 프로시저 콜과 유사하지만 일부 중요한 차이점이 있다.
- 프로세서는 프로시저 콜을 사용해서 핸들러로 분기하기 전에 스택에 리턴주소를 푸시한다. 그렇지만, 예외의 종류에 따라 리턴주소는 현재 인스트럭션 (이벤트가 발생했을 때 실행하고 있던 인스트럭션) 이거나 다음 인스트럭션(이벤트가 일어나지 않았더라면 현재 인스트럭션 다음에 실행 되었을 인스트럭션)이 된다.
- 또한 프로세서는 핸들러가 리턴할 때 중단된 프로그램을 다시 시작하기 위해 필요하게 될 스택상에 추가적인 프로세서 상태를 푸시한다.
- 제어가 사용자 프로그램에서 커널로 전환하고 있을 때, 이 모든 아이템들은 사용자 스택위가 아니라 커널 스택상에 푸시된다.
- 예외 핸들러는 커널모드에서 돌아가는데, 이것은 이들이 모든 시스템 자원에 완전히 접근할 수 있는 것을 의미한다.
- 하드웨어가 예외상황을 촉발해서 남은 작업은 예외핸들러에 의해 소프트웨어로 진행된다. 핸들러는 예외처리로 인해 발생된 이벤트를 처리한 경우에 따라서는 ‘인터럽트에서 원래 위치로 복귀’ 라는 특별한 인스트럭션을 실행시켜서 인터럽트에 의해서 중단된 프로그램으로 돌아간다. 이 인스트럭션은 인터럽트가 발생되기 전의 원래 프로세서의 제어상태와 데이터 레지스터 상태를 스택으로 부터 팝해서 돌려주고, 만일 예외가 사용자 프로그램을 중단했으면 상태를 사용자 모드로 되돌리고, 최종적으로 제어를 중단되었던 프로그램으로 리턴해준다.
728x90
'책 > CSAPP' 카테고리의 다른 글
CSAPP 9.9, 9.11 (0) | 2024.02.07 |
---|---|
CSAPP 8.1.2 - 8.1.3, 8.5 - 8.5.4 (0) | 2024.02.04 |
CSAPP 7.4, 7.9, 8 (0) | 2024.02.03 |
CSAPP 7, 7.1, 7.4 (0) | 2024.02.02 |
CSAPP 9.9.4 - 9.9.7 (2) | 2024.01.31 |