강좌 & 팁
글 수 2,412
2012.09.22 16:48:21 (*.52.177.29)
42337
ARM 은 입셉션(Exception) 테이블이라는 것이 있습니다.
입셉션은 예외 처리 라고도 하는데
정상적인 흐름 이외에 어떤 조건이 발생하면
정상적인 처리를 중단하고
조건에 해당하는 루틴을 실행하도록 하는 것이
예외처리입니다.
인터럽트도 이 부류에 포함됩니다.
ARM 은 공통적으로 총 7 개의 예외처리를 정의하고 있습니다.
리셋 (Reset)
알수없는 명령 (Undefined instruction)
소프트웨어 인터럽트 (Software interrupt - SWI)
명령 패치 에러 (Prefetch Abort - instruction fetch memory abort)
데이터 접근 에러 (Data Abort - data access memory abort)
인터럽트 (Interrupt)
빠른 인터럽트 (Fast Interrupt )
이런 예외상황이 발생하면 수행해야 하는 명령을 지정하기 위해서 입셉션 테이블이 있습니다.
입셉션 테이블의 주소는 전원이 켜지면 보통 0x00000000 으로 지정됩니다. 이것을 노멀(normal) 벡터 주소라고 합니다.
코프로세서 명령을 사용하면 0xFFFF0000 으로 지정 가능한데 이것을 하이(High) 벡터 주소라고 합니다.
입셉션은 총 7개지만 테이블은 예약 영역 한개를 추가하고 있어서 총 8개가 정의 되어 있습니다.
입셉션 테이블은 다음과 같이 정의됩니다.
---------- ---------- ---------- ----------------------------------------------------------------------
주소(노멀) 주소(하이) 모드 타입
---------- ---------- ---------- ----------------------------------------------------------------------
0x00000000 0xFFFF0000 SUPERVISOR 리셋 (Reset)
0x00000004 0xFFFF0004 UNDEFINDED 알수없는 명령 (Undefined instruction)
0x00000008 0xFFFF0008 SUPERVISOR 소프트웨어 인터럽트 (Software interrupt - SWI)
0x0000000C 0xFFFF000C ABORT 명령 패치 에러 (Prefetch Abort - instruction fetch memory abort)
0x00000010 0xFFFF0010 ABORT 데이터 접근 에러 (Data Abort - data access memory abort)
0x00000014 0xFFFF0014 - 예약 (Resevered)
0x00000018 0xFFFF0018 IRQ 인터럽트 (Interrupt)
0x0000001C 0xFFFF001C FIQ 빠른 인터럽트 (Fast Interrupt )
---------- ---------- ---------- ----------------------------------------------------------------------
다시 조심하라고 말씀 드리면
이 입셉션 테이블의 주소에 있는 데이터는 이동할 주소가 아니라 수행할 명령 코드입니다
ARM 명령 특성상 단일 이동 명령이 가능한 것은 b 명령인데
이 명령은 +/1 32M 바이트 영역 이내에만 이동할 수 있습니다.
보통 입셉션 테이블을 어셈블러로 다음과 같이 만듭니다.
.globl _exception_table
_exception_table:
b reset_handler
b undefined_handler
b swi_handler
b prefetch_abort_handler
b data_abort_handler
b .
b irq_handler
b fiq_handler
reset_handler:
리셋 처리 루틴
irq_handler:
인터럽트 처리 루틴
:
이런 방식은 입셉션 처리 루틴이 32M 이내에 있어야 하므로
입셉션 처리 루틴이 32M 범위를 넘어가게 하고 싶다면 다음과 같이 합니다.
.globl _exception_table
_exception_table:
ldr pc,_reset_handler
ldr pc,_undefined_handler
ldr pc,_swi_handler
ldr pc,_prefetch_abort_handler
ldr pc,_data_abort_handler
b .
ldr pc,_irq_handler
ldr pc,_fiq_handler
_reset_handler : .word reset_handler
_undefined_handler : .word undefined_handler
_swi_handler : .word swi_handler
_prefetch_abort_handler : .word prefetch_abort_handler
_data_abort_handler : .word data_abort_handler
_irq_handler : .word irq_handler
_fiq_handler : .word fiq_handler
reset_handler:
리셋 처리 루틴
irq_handler:
인터럽트 처리 루틴
자 이제 ARM 의 예외 처리(입셉션) 테이블에 대한 설명이 끝났습니다.
외 이 테이블을 언급했냐 하면 나중에 다 필요해서 이고
소프트웨어 입터럽트 처리 루틴은 이곳에 분기 되기 때문이지요
참고로 예외 처리가 동시에 발생했다면
우선 순위에 따라서
예외 처리 중에 또 다른 예외 처리가 가능한데
각 예외 처리 우선 순위는 다음과 같습니다.
---------- ----------------------------------------------------------------------
우선순위 예외 처리 종류
---------- ----------------------------------------------------------------------
1 리셋
2 데이터 접근 에러
3 빠른 인터럽트
4 인터럽트
5 명령 패치 에러
6 알수없는 명령
6 소프트웨어 인터럽트
---------- ----------------------------------------------------------------------
보셔서 아시겠지만 소프트웨어 인터럽트 우선 순위가 가장 낮죠?
또 한가지 주의 해서 보셔야 하겠지만
명령 패치 에러 우선 순위가
인터럽트 우선 순위보다 낮다는 점 역시 기억해 보세요
아...
이번 산책길은 시스템 콜 산책을 하고 있는지
암 입셉션 벡터 테이블 산책을 하고 있는지 잘 모르겠네요 ㅠㅠ
근디..
앞으로서 몇번 이런 귀찮은 산책길이 나올 예정이라는 것
아 싫다...
이런 구질 구질한 산책길을 싫어요..