컴퓨터구조

[컴퓨터 구조] 4.10 예외(Exception)

ima9ine4 2023. 12. 14. 23:58
728x90

'컴퓨터 구조 및 설계 MIPS edition 제 6판' 교재와 국민대학교 임은진 교수님의 강의를 바탕으로 정리 및 요약한 글입니다.
정리 과정에서의 오류 및 오타가 있을 수 있습니다 :)


프로그램을 수행하다보면 예상하지 못한 이벤트가 발생하여 명령어 실행의 정상적인 흐름을 바꿔주어야 하는 경우가 생긴다. 예외(Exception)과 인터럽트(Interupt)가 대표적이다. 예외는 프로세서 내부에서 발생한 것이고 인터럽트는 문제의 원인이 프로세서 외부에 있는 것이다. 하지만 예외와 인터럽트를 구분하지 않는 경우가 많다.


그렇다면 이 문제를 다루는 두 가지 방법에 대해서 더 알아보자.

MIPS 구조에서 예외는 System Control Coprocessor에 의해 관리된다. 문제가 생긴 명령어의 PC값을 EPC(Exception Program Counter)에 저장하고 문제의 종류를 Cause regiester에 저장한다. 그리고 핸들러(8000 0180)로 점프한다.

EPC에 주소를 저장하는 이유는 예외 처리 후 다시 돌아오기 위함이다. jal 명령어를 사용할 때 $31($ra)에 돌아와야 하는 명령어의 주소를 저장하는 것과 같은 이유이다. 

예외를 처리하는 더 좋은 방법은 벡터 인터럽트(Vector Interrupt)를 이용하는 것이다. 원인에 따라 handler주소가 다르게 정해져 있다. 따라서 이 방법에서는 제어를 넘길 주소가 예외의 원인에 의해 결정된다.

이러한 방법으로 handler로 점프한 뒤 어떤 동작을 수행할지 결정해야 한다. 만약 해당 명령어의 재시작이 가능하다면 적절한 동작으로 처리 후 EPC를 통해 프로그램으로 돌아간다. 재시작이 가능하지 않다면, 프로그램을 중지하고 에러를 보고한다. 

 

만약 위와 같은 명령어들의 나열을 수행하던 중 파란색으로 표시된 add instruction에서 오버플로우 예외가 발생했다고 해보자. add 명령어가 EX 단계에 있을 때 산술 연산을 하던 중 오버플로우 예외가 발생함을 알게 될 것이다. 그러면 오버플로우 예외를 처리해주는 control signal에 의해 add 명령어를 Flush한다. 즉, control signal을 모두 0으로 만든다. 이미 Fetch되고 Decode된 명령어 두 개(slt, lw)도 Flush해준다. 

Fetch 단계에서는 PC+4 대신 Exception handler의 주소를 넣어주어서 예외코드의 명령어가 수행될 수 있도록 한다.

 

하지만 Pipeline은 여러 개의 명령어를 한 번에 수행하므로 여러개의 exception이 한 사이클 내에서 동시에 발생할 수도 있다. 이를 해결하기 위한 간단한 방법은 처음 exception이 발생한 명령어부터 다루는 것이다. 하지만 복잡한 pipeline에서는 precise exception(어떤 명령어를 먼저 처리할지 규정되어 있는 것)이 매우 어렵다.

 

Inprecise Exception도 있는데 이는 하드웨어가 아닌 소프트웨어에서 처리하는 방식이다. 따라서 하드웨어는 더 간결해지지만, 소프트웨어는 복잡해진다. 처리 방식의 순서는 다음 과 같다.

1. 파이프라인을 멈추고 그 상태를 저장한다.
2. Handler코드를 수행한다. (어느 명령어가 exception를 발생시켰는지 파악, 어떤 것을 처리, 어떤 것을 flush할지 결정

반응형
LIST