Exception

김세영·2021년 5월 29일
0

Exception vs. Interrupt

Exception (Synchronous interrupt)

명령어 실행 중에, 예상하지 못한 event가 발생하는 현상 (즉시 처리해야 함)
보통 코드 상에서 예측 가능함
ex) 정의되지 않은 명령어 실행, Stack Overflow, System call, ...

Interrupt (Asynchronous interrupt)

전혀 예상치 못한 하드웨어의 결함 (유연하게 처리할 수 있음)
ex) I/O Controller의 오류, Network Card 오류, ...

Exception

사용자 프로그램에서 Exception이 발생하면, System Exception Handler가 호출되어 Exception을 처리 후 다시 사용자 프로그램으로 돌아가 기능을 수행 (처리하지 못하는 Exception이면 프로그램을 종료)

Handling Exception in Pipeline

MIPS에선 System Control Coprocessor (CP0)에서 exception을 관리

  • Exception Program Counter (EPC)에 해당 exception이 발생한 PC를 저장

EPC (CR14), Cause (CR13), Status (CR12) Register
각각 Exception Program Counter, Exception 발생 원인, 프로그램 상태가 담겨있다.

Vectored Interrupt

주소들을 테이블처럼 만들어, 해당되는 Exception을 테이블 형태로 모아놓고,
Exception이 발생하면 테이블을 참조해 해당되는 번지로 jump

Precise vs. Imprecise Exception

Imprecise Exception은 예외 처리 중에 프로그램을 종료시키는 것
해결이 매우 복잡하고, 자동화가 되지 않거나 전혀 해결이 되지 않아서 Delay를 시켜야 하는 경우도 종종 발생

Precise Exception은 예외 처리가 완료된 후 예외 발생 지점으로 돌아가 다시 프로그램을 동작하는 것
쉽게 해결 가능한 경우에 해당

  • add 후 overflow가 발생한 경우 / Devide by zero Exception
    Pipeline에 들어온 명령어들을 모두 무효화시켜야 함
  • Nullify로 해당 명령어들을 무효화시킬 수 있다.

Nullify
Pipeline에 들어온 명령어들을 무효화시키는 것

  • Control에 들어온 Enable 신호를 모두 0으로 만듦
  • 새로운 명령을 받아들여야 함
    • 여기서 새로운 명령이란 Exception Handler의 명령어 등을 말함

Handle Multiple Exception

하나의 명령어에서 여러 가지 Exception이 같이 발생할 수 있다.

IF (Instruction Fetch) 부분에서 page fault, misaligned memory access, memory protection violation 등이 한꺼번에 같이 발생할 수도 있고, EX (Execution) 부분에서 Divide by zero, ALU OverflowArithmetic Exception이 한꺼번에 같이 발생할 수도 있다.

위 사진처럼 EX의 Exception이 먼저 발생한 경우 문제가 될 수 있는데, 첫 번째 발생한 Exception인 IF부분의 Exception을 먼저 처리해 주어야 하지만 EX의 Exception이 먼저 발생한 경우 순서를 맞춰 이를 처리해주어야 한다.

Solution
모든 경우는 아니지만, 일반적으로 WB(Write Back)전 단계에서 Exception을 처리해준다고 통일해주면 순서대로 예외 처리를 할 수 있다.

profile
초보 iOS 개발자입니다ㅏ

0개의 댓글