ARM Exception Handler 이모저모. / 익셉션 핸들러.
2009/02/06
예전에도 비슷한 글을 쓴 적이 있는데. 기억 안 나니 넘어나고 -_-;
ARM에서 일반적인 익셉션 핸들러는 다음과 같다.
0x00 리셋
0x04 Undef.
0x08 슈퍼바이저
0x0C 프리패치 어보트
0x10 데이터 어보트
0x14 예비
0x18 IRQ
0x1C FIQ
익셉션이 발생하면 하드 와이어드 물리적으로 저 주소로 뛴다. 저 주소에 공간이 따로 없으므로 핸들러는 다음과 같이 실제 처리할 곳으로 점프한다.
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP
LDR PC, [PC,#-0xF20]
LDR PC, [PC,#-0xF20]
IRQ, FIQ에 이상한 주소를 쓴 이유는 일부 ARM7이 지원하는 인터럽트 벡터 테이블과 관계있다. 마이컴과 비슷한 이념으로 설계된 칩에서는 하드 와이어드하게 인터럽트 벡터 테이블을 쓰도록 되어있다. 표준 ARM이라면 핸들러 주소 레이블이 들어갈 것이다.
. . . .
요구사항은 다음과 같다.
- 부트로더를 쓴다.
- 2차 부트로더가 존재할 수 있다.
- MMU는 없다.
- 예외 핸들러를 부트로더가 아닌 어플리케이션 쪽에 붙이고 트랩을 만들어서 디버깅 하고자 한다.
. . .
솔루션 (XIP 의 경우)
- 어플리케이션은 0x0에서 시작하는 것과 똑같이 작성한다.
- 어플리케이션 시작번지는 다르다. (예: 0x4000)
- 0x0 부터 있는 예외 핸들러를 바로 0x4000 부터 1:1 대응시켜 점프 시킨다.
솔루션 (램 복사 실행의 경우)
- 부트로더는 어플을 램에 적재시키는 기능을 담고 있다.
- 어플 시작 번지에는 예외 핸들러가 0x0 번지와 같은 모양으로 담겨져 있다.
- 0x0 부터 있는 예외 핸들러를 바로 0x시작 번지부터 1:1 대응시켜 점프 시킨다.
부트로더 단계의 무한 리부팅을 지원해야 하는 경우
- 실제 엔드유저용 어플라이언스 장비라면 블루 스크린식의 디벅 화면 보다 리셋 재시동이 안전한 경우가 많다.
- 산업장비들은 주로 워치독을 사용한다.
- 프로그램이 잘못 뻗어서 워치독은 꼬이고 어플리케이션이 예외 모드로 들어가서 어딘가의 트랩에 갇혀 있는 것 같다.
해결 : 모든 예외 핸들러를 리셋으로 붙여서 빌드하는 버전을 만든다.
램 복사 부트로더의 예외 핸들러
- 0x0 부터 시작하는 예외 핸들러는 램시작 번지 0x300000 부터 1:1 매핑 점프 시켜놓는다.
- 부트로더의 램코드 쪽에는 0x300000 부터 모든 예외 핸들러를 리셋으로 묶어 놓는다. -> 어떤 예외든 리셋이 걸림.
- 어플은 롬 0x4000 에서 시작하여 자신을 램 시작 0x300000 부터 복사해 넣는다.
- 어플 부팅 후에는 0x0 부터 연결 된 예외 핸들러가 0x300000 부터 1:1 매핑된다.
- 어플의 0x300000 예외 핸들러는 정상 트랩으로 점프한다.
뭔 소리야 -_-; 그림 그리기는 귀찮고 설명은 불친절하니 전혀 도움이 안 되는 글이 되었음