참고. ARM Processor Overview

원문 : http://kkamagui.springnote.com/pages/430849

 

들어가기 전에...

0.시작하면서...

 예전에 한번 StrongARM(ARM7)을 이용해서 간단한 OS를 만들어 본적이 있었다. 물론 아주 오래전 일이라 기억이 잘 안나지만 ARM 메뉴얼과 어셈블리어를 가지고 시름하여 결국 태스트 스위칭 기능까지 구현할 수 있었다.

 시간이 흘러... 이제 NDS에 커널을 올려볼까 하고 있는데... 다시 어셈블리어를 보고 프로세서에 대해서 볼려니 아주 눈물이 난다. ㅜ_ㅜ.... 그래도 일단 봐야지... 어찌하겠는가... 크윽.. ㅜ_ㅜ

 간단하게 프로그래밍하기위한 기능적인 부분만 보자.

 

1.ARM Architecture 소개

 ARM은 RISC 구조의 CPU로써 매우 간단한 명령에들로 구성되어있다. ARM이 하버드 아키텍쳐를 사용했으며 어쩌구 저쩌구 하는 내용은 일단 생략하고... 나의 입장에서 보는 ARM의 구조는 그냥 단순한 블랙박스인데... 레지스터가 굉장히 많고 여러가지 모드를 가진 32bit CPU라는 정도이다. ARM에 대한 자세한 내용은 첨부에 올린 ARM Architecture Manual을 참고하도록 하자.

 

1.1 ARM Register

1.1.1 Register Overview And General Register

 ARM은 여러모드를 가지고 있는데, 한 모드에서는 32bit R0 ~ R15까지 16개의 범용 레지스터 및 CPSR/SPSR의 상태 레지스터를 가진다.

 몇개의 레지스터는 특수한 이름과 의미를 가지고 있는데 아래와 같다.

  • R13 : Stack의 Top을 가리키는 sp 레지스터
  • R14 : 함수 호출 시 리턴 주소를 저장하는 용도의 Link Register(lr) 레지스터
  • R15 : 경우는 현재 수행중인 명령 위치를 가리키는 pc 레지스터

 

  몇개의 레지스터는 모드에 따라서 각 모드 전용의 레지스터를 가지는데, 일단 아래를 보자.

ARM_Register.PNG

<ARM의 Register들>

 

 위에서 보면 좌측 하단의 작은 삼각형이 있는 레지스터들이 있다. 이 레지스터들이 해당 모드의 전용 레지스터로써 R13(sp)와 R14(lr)의 경우는 거의 모든 모드에서 개별 모드의 레지스터를 사용한 다는 것을 알 수 있다. 그리고 User 모드와 System 모드는 레지스터를 그대로 공유한다. 일단 이 정도만 알아두자.

 

 PC에 대해서 잠깐 언급할 것이 있는데, 첨부에 포함된 ARM Architecture Manual에 의하면 ARM 명령어 모드 일때  PC는 현재 명령 주소 + 8의 위치를 가리키고 THUMB 모드 일때는 현재 명령 주소 + 4의 위치를 가리킨다고 되어있다. 이 부분은 PC를 Base로 주소 연산을 할때는 상당이 주의해야할 부분이므로 잘 알아두록 하자. 단 STR 명령에 의해서 값이 레지스터->메모리로 저장될 때 이때는 PC + 8 이 될 수 도 있고 PC + 12가 될 수 도 있는데... 일단 8이라고 알아두자.

 

1.1.2 PSR(Program Status Registers)

 PSR(Program Status Register) 레지스터는 현재 프로그램이 실행되는 모드를 나타내는 레지스터로써 현재 상태를 나타내는 CPSR과 이전의 상태를 나타내는 SPSR 레지스터가 존재한다. SPSR의 경우는 User 모드나 System 모드에서 실행중인 프로그램이 특정 Exception 모드로 변경되었을 때, User/System 모드의 CPSR을 저장하는 용도로 사용된다.

PSR.PNG

<PSR 레지스터의 구조>

 

 ARM Architecture Manual을 보면 각 플래그에 대해서 아래와 같이 설명해 놓았다.

 

PSR1.PNG

PSR2.PNG

PSR3.PNG

PSR4.PNG

<PSR 레지스터 설명>

  PSR의 아래 5bit는 Mode를 바꾸는데 사용된다. 직접 값을 CPSR이나 SPSR에 넣어서 모드를 바꾸는 것 또한 가능하므로 특정 모드로 전환할 수 있다. THUMB 모드의 경우 T Bit가 1로 설정된다는 정도만 알아두자.

 

2.ARM CPU Mode

 ARM은 총 7개의 Processor Mode를 가지고 있다.

ARM_Mode.PNG

<ARM Processor Mode>

 앞서 살펴봤듯이 User 모드를 제외한 모든 모드는 특권(Priviledge) 모드이고  User/System을 제외한 다른 모드는 Exception 모드이다.

 재미있는 사용법을 가진 모드를 몇가지 살펴보면 아래와 같다.

  • FIQ : ISR 중에 특별히 빨리 처리가 되어야 하는 인터럽트 처리 모드
  • IRQ : 일반적인 인터럽트 처리 모드
  • Undefined : 명령이나 코프로세서가 존재하지 않아서 발생한 Exception 모드. 여기서 특수한 처리를 해주면 명령을 Emulation 하는 것도 가능

 

 

3.ARM Exception Vector And Handling

3.1 Exception Vector

 Exception이 발생하면 당연히 Exception에 대한 처리를 해줘야 하는데 Exception에 따른 처리가 들어있는 곳이 바로 Exception Vector이다.

 Exceptoin Vector의 경우 0x000000000 의 주소에 위치하거나 설정에 따라서 0xFFFF0000 위치에 위치할 수 있다.

 Exception_Vector.PNG

<ARM Exception Vector Table>

 위에서 보면 0x14가 빠져있는데 이것은 Reserved 된 Vector 이기 때문에 사용되지 않는다. Exception Vector의 경우 단순히 4Byte의 크기를 가지므로 해당 Exception을 처리하는 루틴으로 jmp하는 명령이 일반적으로 들어있다.

 

3.2 Exception Handling

 Exception이 발생하면 어떤 일이 생길까? 단순히 모드만 변화되는 것일까? 실제로 Exception이 발생했을 때 일어나는 일은 아래와 같다.

  1. // R14(lr) 레지스터에는 Exception 처리를 끝내고 돌아갈 주소가 저장된다.
  2. R14_<exception_mode> = return link 
  3. SPSR_<exception_mode> = CPSR 
  4. CPSR[4:0] = excpetion mode number 
  5. // ARM 모드로 강제 전환
  6. CPSR[ 5 ] = 0 
  7. // 만약 reset 이나 FIQ 같은 경우이면 FIQ를 Disable 시킨다.
  8. if <exception_mode> == Reset or FIQ then 
  9.     CPSR[ 6 ] = 1
  10. // 인터럽트는 무조건 발생 불가
  11. CPSR[ 7 ] = 1 
  12. // PC에 exception vector의 주소가 입력 됨으로써 해당 주소의 코드가 실행되게 된다.
  13. PC = exception vector address 
  14. ...... Exception 처리 ......
  15. // 처리가 완전히 끝난 후 되돌아 간다.
  16. CPSR = SPSR
  17. PC = R14_<exception_mode>

 위의 굵은 부분이 처리 흐름 부분인데, 인터럽트를 불가하고 Exception을 처리한다음 다시 복구하는 것을 알 수 있다. CPSR의 값을 SPSR의 값으로 복원하고 PC를 변경하는 것은 이것을 자동으로 해주는 명령어를 통해 할 수 있는데 접미사로 "S'가 붙은 MOVS와 LDMS와 같은 명령으로 가능하다.

 아래는 Exception Handler의 Return 부분을 보여주는 예제이다.

  1. SUB R14, R14, #4 
  2. STMFD SP!, { XXXXX, R14 } 
  3. ...... 처리 ...... 
  4. LDMFD SP!, { XXXXX, PC }^ 
  5. or MOVS PC, R14
  6. or SUBS PC, R14, #4

 ARM 어셈블리에어 대해서는 참고. ARM 어셈블리(Assembly) 를 참고하도록 하고 접미사 S와 ^만 봐두고 넘어가자.

 Exception 처리에 대한 자세한 내용은 ARM Manual의 A2-14에 잘 나와있으므로 참고하자.

 

3.3 Exception Priority

 Exception이라도 우선 순위가 다른 데, 아래같은 순서를 가진다.

  • 1 (Highest) : Reset
  • 2 : Data Abort 
  • 3 : FIQ 
  • 4 : IRQ 
  • 5 : Prefetch Abort 
  • 6 (Lowest) : Undefined instruction SWI 

 

4.Memory Mapped I/O

 Memory Mapped I/O는 Port I/O 방식과 달리 메모리 주소에 IO와 통신하는 라인을 연결하여 Memory에 값을 쓰면 버스를 통해 컨트롤러에게 전달되는 방식이다. 따라서 메모리 주소를 공유해서 사용하므로 프로그래밍 시에 접근이 용이하다는 장점이 있으나 실제 사용가능한 메모리 공간이 줄어든다는 단점도 있다.

 Port I/O 같은 경우는 Intel CPU가 대표적으로써 I/O를 위한 별도의 주소공간이 존재하고 I/O를 위해 별도의 명령( IN/OUT )을 통해 데이터를 주고 받는 방식이다.

 == 여기 나중에 내용 더 체우기 ==

 

4.마치면서...

 ARM에서 프로그래밍을 하기위한 배경지식을 쌓기위해 ARM CPU에 대해서 간략하게 알아보았다. 이제 본격적으로 프로그래밍을 한번 해보자. @0@)/~

 

5.첨부

 

 

 

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts