minkylee

[컴퓨터구조] 프로세서 4. RISC-V Execption(예외 처리) 본문

CSE/컴퓨터구조

[컴퓨터구조] 프로세서 4. RISC-V Execption(예외 처리)

minkylee 2024. 6. 15. 17:39

Exception

 

Intterupts

 

외부 I/O 컨트롤러에서 발생하는 예기치 못한 사건이다.

 

예를 들면 키보드 입력, 네트워크 패킷 수신 등이 있다.

 

 

Exception

 

예외는 CPU 내부에서 발생하는 예기치 못한 사건이다.

 

그 원인으로는 잘못된 명령어 실행, 시스템 호출 등이 있다.

 

  • Undefined Opcode : CPU가 이해할 수 없는 명령어를 만났을 때
  • System Call (Syscall) : 운영체제가 제공하는 기능을 사용하기 위해 호출하는 명령어

 

 

예외나 인터럽트를 처리하기 위해서는 프로그램의 흐름을 변경해야 하므로 성능 저하가 발생할 수 있다.

 

현대의 CPU는 여러 명령어를 동시에 처리하는 파이프라인 구조를 사용하기 때문에, 예외나 인터럽트가 발생하면 파이프라인을 중단하고 재설정해야 하는 문제가 발생한다.

 

프로그램이 실행 중 intterupt 또는 exception을 만나면 우선 현재 명령어의 실행을 중단하고 예외 처리기 / intterupt 처리기로 점프하여 적절한 조치를 취한다. 처리가 완료되면 CPU는 원래 프로그램으로 돌아가서 실행을 계속한다.

 

예외 처리 방법

 

  1. 예외가 발생한 명령어의 PC 저장
    • 예외가 발생하거나 인터럽트 된 명령어의 프로그램 카운터(PC)를 저장한다.
    • RISC-V 에서는 이 값을 SEPC(Supervisor Exception Program Counter) 레지스터에 저장한다.
      • SEPC는 예외가 발생한 명령어의 주소를 보관하는 레지스터이다.
  2. 문제의 원인 저장
    • 예외의 원인을 나타내는 값을 저장한다.
    • RISC-V에서는 이 값을 SCAUSE(Supervisor Exception Cause Register) 레지스터에 저장한다.
      • 예외가 발생한 이유를 보관하는 레지스터
      • 이 레지스터는 64비트 크기이지만, 대부분의 비트는 사용되지 않는다.
      • 예외 코드 필드는 예외의 종류를 나타낸다.
        • 2: 정의 되지 않은 명령어
        • 12: 하드웨어 오작동
  3. 예외처리기로 점프
    • 예외가 발생하면 예외를 처리하기 위한 특수 코드 블록(예외 처리기)으로 점프한다.
    • 예외 처리기의 주소는 고정된 주소에 위치한다.
    • RISC-V에서 예외 처리기는 주소 0000 0000 1C09 0000hex 에 위치할 수 있다. 

 

예를 들어 100: lw x1, 0(x2) 라는 명령어에서 예외가 발생했다면 

  1. 이 명령어의 주소 100이 SEPC 레지스터에 저장된다.
  2. 메모리 접근 오류로 인해 발생했다고 가정하면 이 원인은 SCAUSE 레지스터에 저장된다.
  3. 프로그램 실행은 예외처리기로 점프하여 예외 처리기가 예외를 처리하고 시스템을 안정된 상태로 되돌린다. 

 

 

 

Vectored Interrupts

 

또 다른 방법으로는 Vectored Interrupts 이 있다. 

 

인터럽트가 발생했을 때 특정 인터럽트의 원인에 따라 적절한 처리기 주소를 결정하는 방법을 설명하고 있다.

 

  • Vectored Interrupts : 인터럽트가 발생했을 때, 인터럽트의 원인에 따라 특정한 주소로 점프하여 예외를 처리하는 방식
  • Handler Address : 인터럽트 처리기 주소는 인터럽트의 원인에 따라 결정된다.
    • 예외 벡터 테이블 베이스 레지스터와 예외 벡터 주소를 더하여 결정된다.
  • 인터럽트 처리기 : 인터럽트를 처리하거나 실제 처리기로 점프하는 코드를 실행한다.
    • 일부 예외 처리기는 단순히 인터럽트를 처리하고
    • 다른 예외 처리기는 더 복잡한 처리를 위해 실제 예외 처리기로 점프한다.

 

 

Handler Actions

예외는 복구 가능한 경우와 복구 불가능한 경우로 나누어 처리한다.

 

복구 가능한 예외

  1. 복구 조치 수행
    • 예외가 복구 가능하면, 시스템은 문제를 수정하기 위한 조치를 취한다.
    • 예를 들어, 잘못된 메모리 접근을 수정하거나, 필요한 자원을 할당한다.
  2. 프로그램으로 복귀
    • SEPC 레지스터를 사용하여 예외가 발생한 명령어로 되돌아간다.
    • SEPC 레지스터에는 예외가 발생한 명령어의 주소가 저장되어 있다.
    • 예외 처리 후, 프로그램은 예외가 발생한 명령어부터 다시 실행을 시작한다.

복구 불가능한 예외

  1. 프로그램 종료
    • 예외가 복구 불가능하면 프로그램을 종료한다.
    • 심각한 하드웨어 오류가 발생했을 때
  2. 오류 보고
    1. SEPC와 SCAUSE 레지스터를 사용하여 예외 정보를 보고한다.
    2. 예외가 발생한 명령어의 주소와 예외의 원인을 확인할 수 있다.

 

 

 

Exceptions in a Pipeline

예외는 파이프라인에서 control hazard의 다른 형태로 취급한다.

 

예를 들어 add x1, x2, x1 이라는 예시를 통해 EX 단계에서 add 명령어가 잘못된 동작을 할 경우 처리 과정을 알아보자

 

exception 처리가 포함된 pipeline

 

  1. x1 레지스터의 값 보호
    • 오작동으로 인해 x1 레지스터의 값이 손상되지 않도록 방지해야 한다.
    • 이를 위해, 명령어를 중단하고 이후 명령어를 모두 flush 한다.
  2. 이전 명령어 완료
    • 오작동이 발생하기 전에 실행 중인 명령어들은 정상적으로 완료되도록 한다.
  3. 문제가 발생한 명령어와 그 이후 명령어 모두 flush
    • 잘못된 add 명령어와 그 이후 명령어를 모두 flush 한다. 
    • 이를 통해 잘못된 명령어가 프로그램의 상태를 손상시키지 않도록 한다. 
  4. SEPC, SCAUSE 레지스터 설정
    • SEPC에 add 명령어의 주소를 저장하고 SCAUSE 에 오작동의 원인을 나타내는 값을 저장한다.
  5. 예외 처리기로 제어 전환
    • 제어를 예외 처리기로 전환하여 오작동을 처리한다.
    • 예외 처리기는 SEPC와 SCAUSE 레지스터의 정보를 사용하여 예외를 적절히 처리한다. 

 

다중 예외 처리

 

파이프라인은 여러 명령어를 동시에 실행하므로, 여러 예외가 동시에 발생할 수 있다.

 

가장 먼저 발생한 예외를 처리하고, 이후 명령어들은 모두 flush 한다. 이를 정확한 예외 처리 (Precise Exception) 이라고 한다.

 

예외가 발생하면 파이프라인을 중단하고 현재 상태와 예외 원인을 저장한다. 그리고 예외 처리기가 저장된 상태를 분석하여 예외를 발생시킨 명령어를 확인하고, 예외를 처리한다. 

 

이는 하드웨어가 복잡한 예외처리 로직을 구현할 필요가 없으므로, 하드웨어 구조가 단순해지지만

 

예외 처리기가 각 명령어의 상태를 분석하고, 어떤 명령어가 예외를 발생시켰는지 확인해야 하기 때문에 예외를 처리하고 필요한 조치를 취하는 소프트웨어 로직이 복잡해진다. 

 

복잡한 파이프라인에서는 한 사이클에 여러 명령어가 발생되고, 순서가 뒤바뀌어 완료될 수 있다. 이 경우, 정확한 예외 처리를 유지하는 것이 어렵다. 그러므로 이러한 파이프라인에서는 예외를 정확하게 처리하기 위해 더 정교한 하드웨어 지원이 필요하다.