2008년 6월 11일 발표한 ARM MMU 세미나 자료
Posted by 강군님

댓글을 달아 주세요

아래의 내용들은 모두 exception ARM mode일 때 발생하였다고 가정한 것입니다.  Thumb mode에서 발생할 경우에 대해서는 LR에 저장되는 값이 차이가 있으니 염두에 두시고 참고하시면 될 것 같습니다.

 

1.     Reset exception handling

 

순서

동작

동작 설명

1

SPSR_svc = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] = 1

FIQ 비활성화

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b10011

SVC 모드로 전환

3

LR_svc = 알 수 없는 주소 (의미 없음)

 

4

PC = 0x00

Reset vector

 

-       Reset exception ARM으로 reset 신호가 입력되면 발생하며, reset 신호가 입력되는 경우는 전원이 인가되거나 reset 스위치를 누르는 경우입니다. 0x0번지는 ARM 시스템이 시작하는 번지로 이 위치에 부트스트랩 코드가 들어가게 됩니다따라서 전원이 인가되거나 reset을 눌렀을 때에 지정된 (ADS cc에서 Entry 지정어로 지정) 부트스트랩 코드가 실행되게 됩니다.

 

2.     Undefined Instruction exception handling

 

순서

동작

동작 설명

1

SPSR_undef = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] = 0

 

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b11011

Undefined 모드로 전환

3

LR_undef = 발생 당시의 PC - 4

 

4

PC = 0x04

Undefined vector

 

-       Undefined Instruction exception ARM에서 정의되지 않은 명령을 수행하려고 하거나 co-processor에서 응답이 없으면 발생합니다 (흔히 사용하는 co-processor로는 MMU cache를 제어하는 CP15를 들 수 있겠습니다).  명령을 수행하려고 하는 단계에서 발생한다는 것은 곧 파이프라인의 decode단계가 마무리된 직후에 인식된다는 의미입니다.  Handling이 끝난 후 돌아갈 지점은 그 다음 명령어가 위치한 지점이 되겠습니다

 

주소

명령

PC 위치

비고

0x8000

ADD R1, R0, R2

 

 

0x8004

MOV R0, R1

PC 12

 

0x8008

WHAT_INSTRUCTION

PC 8

인식되는 지점

0x800C

XOR R2, R0, R1

PC 4

LR_undef에 저장되는 위치, 되돌아올 위치

0x8010

AND R1, R2, R1

PC

 

 

-       만약 STB에서 Undefined Instruction exception이 발생하였다면 LR_undef에서 한 WORD를 뺀 주소, LR_undef 4 에 어떤 명령이 수행되고 있는지를 찾아가보면 해당 exception을 발생시킨 명령어 (해당 아키텍처에서 지원하지 않는 명령어라거나)를 찾을 수 있겠습니다.

-       리턴되어야 할 지점은 앞서 말씀드린 것과 같이 해당 exception을 발생시킨 다음 명령어이기 때문에 LR_undef PC를 맞춰주시면 됩니다.

 

3.     Software Interrupt (SWI) exception handling

 

순서

동작

동작 설명

1

SPSR_svc = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] =

 

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b10011

SVC 모드로 전환

3

LR_undef = 발생 당시의 PC - 4

 

4

PC = 0x08

SWI vector

 

-       SWI exception은 다른 exception들과는 다르게 사용자의 요청에 의해서 발생합니다흔히 사용자 응용프로그램 레벨 (USER)에서 운영체제의 레벨(SVC)로 진입하기 위한 용도로 쓰이게 되며, linux에서는 시스템 콜을 예로 들 수 있습니다.  Decode 단계가 마무리된 직후에 인식이 됩니다.  Handling이 끝난 후 돌아갈 지점은 그 다음 명령어가 위치한 지점이 되겠습니다

 

주소

명령

PC 위치

비고

0x8000

SWI 0x03

PC 8

인식되는 지점

0x8004

MOV R0, R1

PC 4

LR_svc에 저장되는 위치, 되돌아올 위치

0x8008

ADD R1, R0, R2

PC

 

0x800C

XOR R2, R0, R1

 

 

0x8010

AND R1, R2, R1

 

 

 

-       SWI exception은 사용자의 요청에 의해서만 발생하는 것이기 때문에 시점을 확인하는 것은 어렵지 않을 것이라고 생각이 됩니다.

-       리턴되어야 할 지점은 앞서 말씀드린 것과 같이 해당 exception을 발생시킨 다음 명령어이기 때문에 LR_svc PC를 맞춰주시면 됩니다.

 

4.     Prefetch Abort exception handling

 

순서

동작

동작 설명

1

SPSR_abort = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] = 0

 

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b10111

Abort 모드로 전환

3

LR_abort = 발생 당시의 PC 4

 

4

PC = 0x0C

Prefetch Abort vector

 

-       Prefetch Abort exception은 잘못된 address 공간에서 명령을 읽으려고 할 때 MMU나 기타 memory controller에 의해서 발생하게 됩니다여기서 말하는 잘못된 address 공간이 의미하는 것은 정렬이 잘못되었거나, 권한이 없거나, 해당 주소를 나타내는 디스크립터에 유효하지 않다는 flag set되어 있을 때를 나타냅니다.  Execute 단계에 인식하게 되며, handling이 끝난 후 돌아갈 지점은 실행중이던 명령의 위치가 있던 지점이 되겠습니다.

 

주소

명령

PC 위치

비고

0x8000

SUB R1, R1, #1

PC 8

인식되는 지점, 되돌아올 위치

0x8004

MOV R0, R1

PC 4

LR_abort에 저장되는 위치

0x8008

ADD R0, R1, R2

PC

 

0x800C

XOR R2, R0, R1

 

 

0x8010

AND R1, R2, R1

 

 

 

-       만약 STB에서 Prefetch Abort exception이 발생하였다면 LR_abort에서 한 WORD를 뺀 주소, LR_abort 4 에 어떤 명령이 수행되고 있는지를 찾아가보면 해당 exception을 발생시킨 명령어를 찾을 수 있겠습니다.

-       리턴되어야 할 지점은 앞서 말씀드린 것과 같이 해당 exception을 발생시킨 지점이 되므로 LR_abort 4 PC를 맞춰주면 되겠습니다.

 

5.     Data Abort exception handling

 

순서

동작

동작 설명

1

SPSR_abort = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] = 0

 

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b10111

Abort 모드로 전환

3

LR_abort = 발생 당시의 PC 4

 

4

PC = 0x10

Data Abort vector

 

-       Data Abort exception은 잘못된 address 공간에 데이터를 R/W 하려고 할 때 MMU나 기타 memory controller에 의해서 발생하게 됩니다여기서 말하는 잘못된 address 공간이 의미하는 것은 정렬이 잘못되었거나, 권한이 없거나, 해당 주소를 나타내는 디스크립터에 유효하지 않다는 flag set되어 있을 때를 나타냅니다.  (NULL pointer를 간접접근 한다던지 하는 경우) Memory access 단계에서 인식하게 되며, handling이 끝난 후 돌아갈 지점은 실행중이던 명령의 위치가 있던 지점이 되겠습니다.

 

주소

명령

PC 위치

비고

0x8000

LDR R0, [R3]

PC 12

인식되는 지점, 되돌아올 위치

0x8004

MOV R0, R1

PC 8

 

0x8008

ADD R0, R1, R2

PC 4

LR_abort에 저장되는 위치

0x800C

XOR R2, R0, R1

PC

 

0x8010

AND R1, R2, R1

 

 

 

-       만약 STB에서 Prefetch Abort exception이 발생하였다면 LR_abort에서 두 WORD를 뺀 주소, LR_abort 8 에 어떤 명령이 수행되었는지를 찾아가보면 해당 exception을 발생시킨 명령어를 찾을 수 있겠습니다.

-       리턴되어야 할 지점은 앞서 말씀드린 것과 같이 해당 exception을 발생시킨 지점이 되므로 LR_abort 8 PC를 맞춰주면 되겠습니다.

 

6.     Interrupt request (IRQ) exception handling

 

순서

동작

동작 설명

1

SPSR_irq = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] = 0

 

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b10010

IRQ 모드로 전환

3

LR_irq = 발생 당시의 PC 4

 

4

PC = 0x18

IRQ vector

 

-       IRQ exception은 외부의 장치에서 발생된 interrupt 신호가 ARM에 입력되면 발생합니다.  Execute 단계에서 인식하게 되며, handling이 끝난 후 돌아갈 지점은 실행중이던 명령의 다음 위치가 되겠습니다.

 

주소

명령

PC 위치

비고

0x8000

SUB R1, R1, #1

PC 12

인식되는 지점

0x8004

MOV R0, R1

PC 8

되돌아올 위치

0x8008

ADD R0, R1, R2

PC 4

LR_irq에 저장되는 위치

0x800C

XOR R2, R0, R1

PC

 

0x8010

AND R1, R2, R1

 

 

 

-       리턴되어야 할 지점은 앞서 말씀드린 것과 같이 해당 exception을 발생시킨 다음 명령어가 위치한 지점이 되므로 LR_irq 4 PC를 맞춰주면 되겠습니다.

 

7.     Fast Interrupt request (FIQ) exception handling

 

순서

동작

동작 설명

1

SPSR_fiq = CPSR

상태 레지스터 저장

2

CPSR 값 변경

CPSR[5] = 0

ARM 상태로 전환

CPSR[6] = 1

FIQ 비활성화

CPSR[7] = 1

IRQ 비활성화

CPSR[4:0] = 0b10001

FIQ 모드로 전환

3

LR_fiq = 발생 당시의 PC 4

 

4

PC = 0x1C

FIQ vector

 

-       FIQ exception은 외부의 장치에서 발생된 interrupt 신호가 ARM에 입력되면 발생합니다.  Execute 단계에서 인식하게 되며, handling이 끝난 후 돌아갈 지점은 실행중이던 명령의 다음 위치가 되겠습니다.

 

주소

명령

PC 위치

비고

0x8000

SUB R1, R1, #1

PC 12

인식되는 지점

0x8004

MOV R0, R1

PC 8

되돌아올 위치

0x8008

ADD R0, R1, R2

PC 4

LR_irq에 저장되는 위치

0x800C

XOR R2, R0, R1

PC

 

0x8010

AND R1, R2, R1

 

 

 

-       리턴되어야 할 지점은 앞서 말씀드린 것과 같이 해당 exception을 발생시킨 다음 명령어가 위치한 지점이 되므로 LR_irq 4 PC를 맞춰주면 되겠습니다.

 

그리고 제가 세미나에서 ARM un-aligned access를 지원하지 않는다고 하였는데, ARMv6부터는 un-aligned access support한다고 합니다.

Posted by 강군님

댓글을 달아 주세요

2008/06/04
Posted by 강군님

댓글을 달아 주세요

부트코드를 읽는데 다음과 같은 것들이 나왔다.

    mov r0, #BASE_ADDR
    ldr r3, [r0, #20]
    b %FT200
...


b는 branch라는 것을 알겠다.  근데 FT200이 뭐란말인가? 그것도 %가 붙은건 나머지를 구해내라는건가 -_-?

이따위 잡생각을 하다가 ADS v1.2 manual을 훑어보는데, %는 SPACE와 같은 의미라는 거다.  근데 말이 안된다 도저히...

결국 진리는 역시나 man page에 있었다.  존경하라 man page...
%{F|B}{A|T}n{routname}

인수 설명:

n

지역 레이블의 수입니다.

routname

현재 범위의 이름입니다.

%

참조를 추가합니다.

F

정방향으로만 검색하도록 어셈블러에 지시합니다.

B

역방향으로만 검색하도록 어셈블러에 지시합니다.

A

모든 매크로 수준을 검색하도록 어셈블러에 지시합니다.

T

현재 매크로 수준만 검색하도록 어셈블러에 지시합니다.

FB를 모두 지정하지 않으면 어셈블러에서는 먼저 역방향으로 검색한 다음 정방향으로 검색합니다.

AT를 모두 지정하지 않으면 어셈블러에서는 현재 수준에서 최상위까지 모든 매크로를 검색하지만 하위 수준 매크로는 검색하지 않습니다.

아.  진작 좀 찬찬히 찾아볼껄 ;; 알고보니 별거 아니었던거다... 젠장.

Posted by 강군님
TAG %, ARM, Branch, label

댓글을 달아 주세요

여기저기서 찾아보느라 삽질을 많이 했는데, 역시 구글신을 믿었어야 했다 -_-;

구글신께 빌어본 결과... http://www.mneuroth.de/privat/zaurus/madplay.html 을 보니 자세히 알게 됐다 -_-;

우선 madplay-0.15.2b.tar.gz와 libmad-0.15.1b.tar.gz, libid3tag-0.15.1b.tar.gz, zlib-1.1.4.tar.gz가 필요하다.

각각의 압축을 풀고 다음과 같이 설정한다.

$ export CC=arm-linux-gcc
$ export CXX=arm-linux-gcc
$ export CPPFLAGS='-I../libmad-0.15.1b -I../libid3tag-0.15.1b -I../zlib-1.1.4'
$ export LDFLAGS='-L../libmad-0.15.1b -L../libid3tag-0.15.1b -L../zlib-1.1.4'


먼저 zlib-1.1.4부터 compile 하도록 한다.

$ ./configure
$ make


다음은 libid3tag-0.15.1b

$ ./configure --host=arm
$ make


다음은 libmad-0.15.1b

$ ./configure --host=arm
$ make


마지막으로 madplay-0.15.2b (libesd, libaudiofile과 관련이 있다면 --without-esd를 빼도록 한다)

$ ./configure --host=arm --without-esd
$ make


마지막 madplay의 compile 결과물로 madplay가 생기는데, 이것을 다음과 같이 실행하면 재생된다.

# ./madplay a.mp3


이렇게 하면 완료.
Posted by 강군님

댓글을 달아 주세요

  1. rebis 2007.12.13 05:44  댓글주소  수정/삭제  댓글쓰기

    libmad configure 중 synth.c에서 오류가 발생하는데요..dct32 function에 관한

  2. Favicon of https://kangun.tistory.com 강군님 2007.12.19 15:40 신고  댓글주소  수정/삭제  댓글쓰기

    '') 이것만 가지고는... 뭐라 말씀드리기 그렇네요. 다만 디렉토리의 구조는 다음과 같아야 합니다.

    - madplay
    - libmad
    - libid3tag
    - zlib

    제가 사용한 크로스 컴파일러의 버전은 3.4입니다.