[t:/]$ 지식_

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이라면 핸들러 주소 레이블이 들어갈 것이다.

. . . .

요구사항은 다음과 같다.

  1. 부트로더를 쓴다.
  2. 2차 부트로더가 존재할 수 있다.
  3. MMU는 없다.
  4. 예외 핸들러를 부트로더가 아닌 어플리케이션 쪽에 붙이고 트랩을 만들어서 디버깅 하고자 한다.

. . .

솔루션 (XIP 의 경우)

  1. 어플리케이션은 0x0에서 시작하는 것과 똑같이 작성한다.
  2. 어플리케이션 시작번지는 다르다. (예: 0x4000)
  3. 0x0 부터 있는 예외 핸들러를 바로 0x4000 부터 1:1 대응시켜 점프 시킨다.

솔루션 (램 복사 실행의 경우)

  1. 부트로더는 어플을 램에 적재시키는 기능을 담고 있다.
  2. 어플 시작 번지에는 예외 핸들러가 0x0 번지와 같은 모양으로 담겨져 있다.
  3. 0x0 부터 있는 예외 핸들러를 바로 0x시작 번지부터 1:1 대응시켜 점프 시킨다.

부트로더 단계의 무한 리부팅을 지원해야 하는 경우

  1. 실제 엔드유저용 어플라이언스 장비라면 블루 스크린식의 디벅 화면 보다 리셋 재시동이 안전한 경우가 많다.
  2. 산업장비들은 주로 워치독을 사용한다.
  3. 프로그램이 잘못 뻗어서 워치독은 꼬이고 어플리케이션이 예외 모드로 들어가서 어딘가의 트랩에 갇혀 있는 것 같다.

해결 : 모든 예외 핸들러를 리셋으로 붙여서 빌드하는 버전을 만든다.

램 복사 부트로더의 예외 핸들러

  1. 0x0 부터 시작하는 예외 핸들러는 램시작 번지 0x300000 부터 1:1 매핑 점프 시켜놓는다.
  2. 부트로더의 램코드 쪽에는 0x300000 부터 모든 예외 핸들러를 리셋으로 묶어 놓는다. -> 어떤 예외든 리셋이 걸림.
  3. 어플은 롬 0x4000 에서 시작하여 자신을 램 시작 0x300000 부터 복사해 넣는다.
  4. 어플 부팅 후에는 0x0 부터 연결 된 예외 핸들러가 0x300000 부터 1:1 매핑된다.
  5. 어플의 0x300000 예외 핸들러는 정상 트랩으로 점프한다.

뭔 소리야 -_-; 그림 그리기는 귀찮고 설명은 불친절하니 전혀 도움이 안 되는 글이 되었음









[t:/] is not "technology - root". dawnsea, rss