[시스템] 예외처리① - Exception과 Vector Table

시리즈 글보기

[시스템] 예외처리① - Exception과 Vector Table

[시스템] 예외처리② - 예외처리 및 인터럽트 처리 과정

 

 


예외(Exception)

컴퓨터 시스템 동작 중 예기치 않은 상황

 

- 바운더리를 벗어나 스펙에 없는 상황을 일으킴

- 오류, 정전, 재시작, 입출력 요구 및 시스템 호출의 발생으로 인해 현재 수행 중인 프로그램을 중단하고 예외 처리 한 후 다시 복귀한다.

- 긍정적 사용 : 입출력 인터럽트, 시스템 호출, 디버그 등(의도적으로 컴퓨터 사양의 생산성을 높이기 위해 사용)

- 부정적 사용 : 정전, 하드웨어 오류, 메모리 접근 불가, 명령어 해독 불가 등

- 모든 컴퓨터 시스템은 예외 처리를 위해 Vector table을 갖는다.

- 인터럽트도 예외의 일종

 

 

* System call 할 수 없다면 스스로 코드를 짜서 써야 함 

* Debug디버그 : 버그제거, 작성한 프로그램이 의도대로 되는지 검사 

* Error오류 : 그냥 두면 시스템이 다운되므로 해당되는 오류를 정의해서 처리해 주어야 함 

*소프트웨어 관점에서는 긍정적인 면이 많고, 하드웨어 관점에서는 부정적인 부분이 많으나 인터럽트처럼 유용한 경우도 존재

 

 

 

Vector Table

- 모든 컴퓨터 시스템에는 예외 종류와 처리를 위한 정보(예외를 처리하는 시작주소)를 가짐

- 각 CPU마다 고유의 형식으로 정의해서 사용

- 외부 입출력 장치(HDD, Print, USB 등)와 시스템 간(CPU와 Memory)의 인터페이스

  * 외부 입출력 장치를 실행하려면 CPU의 명령이 있어야 처리가 가능

- 컴퓨터 시스템과 사용자간(Application Software)의 인터페이스

- 컴퓨터의 시작과 끝을 처리하는 프로그램의 주소를 가짐

 

* Table테이블 : 1차원 배열의 메모리로 구성

 

* 입출력 장치를 위한 인터럽트

  - System과 교류하려면 Interrupt가 있어야 함

  - 외부 입출력 장치를 실행하려면 드라이브가 있어야 하는데 CPU는 외부 입출력 장치에 관심이 없음

  → CPU가 인식할 수 있는 Signal신호을 보냄 → CPU는 그 신호에 대한 드라이브를 구동시킴

 

* Vector Table은 CPU제작자가 구성하므로 CPU마다 다름(스펙은 CPU제작자가, 프로그램은 엔지니어가)

 

* 예외처리 시작주소 

- PC ← Address , BR (BR address) : Address만큼 점프해서 프로그램을 실행

- 예 :  BR #$FFFF1010 : PC에 FFFF1010 주소를 넣음(BR #$FFFF1010 명령과 같음)

 

* 하드웨어적으로 예외1이 발생 → 무조건 Vector Table 예외1으로 감 → 예외1으로 가서 BR명령어 실행   후에 다시 예외처리 전의 위치로 복귀

 

* 다른 프로그램을 실행하다가 신호를 받으면 잠시 하던 일을 중단하고 Vector Table로 가서 예외 발생주소로 처리하러 다녀오는 과정이 반복되는데 사람이 자각하지 못할 정도로 빠르게 진행됨

 

* Interrupt Controller 장치 스케줄

  PIC : Programmable Interrupt Controller

 

 

ARM Core의 Vector Table

* ARM 코어 : ARM회사에서 만든 CPU이름, 기본적인 CPU모듈

 

o Reset(시작)

- 프로그램의 시작주소

- 부트로더가 소스코드를 로드하면 여기로 점프하여 시작

- PC ← 0 혹은 하드웨어적으로 Reset되는 경우(Watchdog/약 전류)

 

* 아키텍처에 따라 다름. 시작하자마자 BIOS 프로그램이 돌아가는 경우에는 PC에 BIOS 시작주소를 가리킴

 

 

o Prefetch Abort/Data Abort

- 실제로 존재하지 않는 주소를 읽거나 쓰는 우에 발생(Invalid Alignment)

- 캐시로부터 다음 소스코드와 데이터를 읽어오기 위해 Abort를 이용

*  실행 예상되는 명령어를 먼저 미리 인출하여 메모리 안에 Prefetch해 놓으면(캐시도 함께 빨라지므로) 성능 향상

* 예시) Address Error 등

 

 

o Undefined Instruction

- CPU(CU)가 IR에 있는 명령어를 해석할 수 없는 상황에 발생 

* 정의되지 않는 코드/포맷에 맞지 않은 코드

 

 

o SWI(Software Interrupt)

- 프로그램에서 의도적으로 인터럽트를 발생시키려고 할 때 사용.

* System Call, Soft-timer, Break Point, Single Step 등

 

 

o IRQ(Interrupt Request)

- 외부 장치들이 시스템 내로 입력하거나 신호를 보낼 때 인터럽트 요구

- 하드웨어 인터럽트

- 시스템은 IRQ를 받으면 해당되는 ISR로 처리하여 분기하여 처리함.

 

 

o FIQ(Fast Interrupt Request)

- 인터럽트를 빠르게 처리할 때 사용

 

 

 

* SOC – System On Chip

- 칩이 마치 시스템과 같은 SOC(Core + Module)

 

* Prefetch

- 캐시 메모리와 연결되어 있음

- Fetch와 같이 순차적으로 하나씩 인출하는 것이 아니고 여러 개 같이 인출할 수 있음

 

* Invalid Alignment

- 데이터 내용과 관계없이 주소에 문제 발생. Out of Bound

 

* Data Error

- MBR 레지스터에 오버플로우 혹은 언더플로우 등 데이터 에러 발생

- 이 자체로는 데이터 표현이 불가능

 

* 정의되지 않은 명령어

- Address Alignment가 맞지 않은 경우(명령어 중간에서부터 가져와 패턴이 안 맞음)

- Addressing이 잘못되어 데이터에 가서 명령어를 가져오는 경우

 

* Reset을 제외하고는 모두 클래스 처리

 

* Power button와 Reset 

- Power button : 테이블을 다시 깔아 테이블 자체 변경

- Reset : 테이블의 내용만을 바꿈

** 효과는 같고 Reset의 속도가 더 빠름

 

* Watchdog 감시견

- CPU가 잘 도는지  감시하는 것으로 CPU 오작동시 CPU를 죽임

 

 

 

Vector Table의 구성

 

Exception Low Vector

High Vector

Reset

0x00000000

0xFFFF0000

Undefined Instruction

0x00000004

0xFFFF0004

SWI(Software Interrupt)

0x00000008

0xFFFF0008

Abort(Prefetch)

0x0000000c

0xFFFF000c

Abort(Data)

0x00000010

0xFFFF0010

Reserved

0x00000014

0xFFFF0014

IRQ(Interrupt Request)

0x00000018

0xFFFF0018

FIQ

0x0000001c

0xFFFF001c

* 예외가 발생하면 각 예외를 처리하는 프로그램의 시작주소로 점프

* core를 작게 하려고 나머지는 소프트웨어적으로 처리

  → Exception Handler

 

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️