0%

Embedded Recipes_2_ARM을 파헤쳐 보자

  • ARM (Advanced RISC machine)
  • CISC(complex instruction set computer)
    Micro programming 방식 : 기계어 하나를 실행하기 위해 많은 양의 작은 micro instruction들이 숨어서 실행
  • RISC(Reduced Instruction set computer)
    Hard wired 방식 : 기계어 한줄을 실행하기 위하여, 그에 해당하는 노리회로를 구성하여 구현하는 방식.

CISC vs RISC

CISC (Complex Instruction Set Computer)

하나의 명령어당 최대한 많은 작업을 수행

image

  • 명령어의 길이가 가변적
  • 복잡한 기능이 많은 명령어로 구성된 프로세서
  • 복합 명령을 가짐으로써 하위 호환성을 충분히 확보
  • 전력소모가 큼, 속도가 느리고 가격이 비쌈
  • 호환성이 절대적으로 필요한 PC 환경에서 사용

RISC (Reduced Instruction Set Computer)

명령어 하나당 하나의 연산만을 수행

image

  • 명령어의 길이가 고정적
  • 하드웨어가 간단한 대신, 소프트웨어가 복잡함.
  • 전력소모가 적음, 속도가 빠르고 가격이 저렴
  • 하위 호환을 위해 에뮬레이션 방식을 채택, 호환성 부족

ARM mode and Thumb mode

Thumb mode

  • Thumb mode는 ARM mode의 반쪽으로 볼 수 있다.
  • 처음 32 bit ARM가 나왔을 때, 임베디드 시스템 메모리는 16비트 data line을 가진 메모리가 주 였다. 따라서 32 bit 코어라해도, 메모리를 효율적으로 사용하기 위해서는 16비트 처리가 필요하다.

ARM의 동작 mode

User (USR) : Normal Program execution mode
System (SYS) : Run privileged operating system tasks
Fast Interrupt Request (FIQ) : When a high priority (fast) interrupt is raised
Interrupt Request (IRQ) : When a low priority (normal) interrupt is raised
Supervisor (SVC) : A protected mode for the operatng system, entered when a SWI instruction is exectued
Abort (ABT) : Used to handle memory access violations
Undef (UND) : Used to handle undefined instructions

  • USR은 Application program을 실행하는 모드.
  • SYS는 USR와 비슷하지만, 특권을 가지고 있다는 차이가 있음.
  • SVC는 SWI 명령이 발생하면 전환된다. 대부분의 시스템 자원을 자유롭게 관리할 수 있는 모드.

Privileged Mode vs Normal mode

  • USR을 제외한 모든 모드는 특권 모드이다.
  1. 특권 모드는 IRQ, FIQ등의 인터럽트의 사용 가능 유무를 직접 설정 할 수 있다.
  2. 특권 모드는 서로 모드 변경이 자유롭게 가능하지만, 일반 모드에서 특권 모드의 변경은 불가능 하다.
  3. ARM의 기본적인 mode는 SVC모드이다. 부팅시 ARM에 대한 모든 권한을 행사하기 위함.

ARM Register

image

  • ARM core는 모드가 바뀌면서 사용하는 레지스터 셋도 바뀐다.

image

  • 모든 모드가 공유하는 레지스터는 CPSR, PC, R0~R7

특별한 용도의 레지스터

CPSR : Current Program Status Register

image

  • NZCV : 연산 후 결과 값에 따라 set 됨.
  • IF : IRQ나 FIQ가 걸릴 수 있는지에 관한 필드, 인터럽트에 대한 컨트롤이 가능하다.
  • T : Thunmb 모드 set
  • mode : 현재 mode를 나타냄.

SPSR : Saved Program Status Register

  • CPSR를 복사해 넣는 특수 레지스터.
  • CPSR를 백업하기 위함.
  • 모드 변경 시 사용.

R14 : Linked Register (RBP)

  • 리턴 주소를 담고 있다.

R13 : Stack Pointer (RSP)

  • 현재 스택의 꼭대가를 가리킴

R15 : Program Counter (RIP)

  • 다음 실행할 명령어를 가리킴.
  • 현재 Fetch 해 온 위치를 가리킴. (현재 까지 실행된거 X)

Context Switching

  • 문맥 전환,
  • 프로세스 실행 중, 인터럽트로 인해 다른 프로세스가 실행될 때
  • 레지스터 값을 교체하는 작업

ARM Exception

  • Exception은 Interrupt를 포함한 더 큰 사건,

  • 외부 요청, 오류에 관련된 사건.

  • Interrupt : 제어 흐름에서 예상치 못한 외부에서 전달되는 사건.

  • Exception : 프로세서 내부에서 발생하는 예상치 못한 사건.

내부 인터럽트 (exception)

  • SVC 인터럽트 : 외부의 프로그램이 의도적으로 호출.
  • 산술 오버플로우/언더플로우
  • 0 으로 나누기
  • 정의 안된 명령어 수행

외부 인터럽트 (interrupt)

  • I/O 인터럽트 : 입출력 요구가 있을 때 하드웨어가 발생
  • 전원 이상 인터럽트
  • 기계 착오 인터럽트 : CPU 등의 기능적 오류
  • 외부 신호 인터럽트 : Timer등으로 발생.

image

  • Exception이 발생하면, 그 Exception에 해당하는 미리 정해진 주소의 프로그램을 하드웨어적으로 수행함.
  • 이 주소를 Exception Vector라 한다.
  1. SVC mode : SVC 모드는 power on이나 reset이 일어난 경우에 진입한다.
  2. IRQ mode : 하드웨어적인 인터럽트가 발생하면 진입한다.
  3. FIQ mode : 인터럽트 중에 Fast 인터럽트가 발생하면 진입한다.
  4. ABT mode : Access하는 주소가 Access 할 수 없는 경우, 명령어를 Fetch를 못할 경우. 에 진입한다.
  5. UND mode : 명령어를 해석했는데 ARM이 모르는 명령어일 경우 진입한다. 보통 메모리 커럽션이 나면 발생, > 이를 응용하면 일부러 코드를 삽입하여 UND vector 주소로 jmp하도록 할 수 있음.

image

Exception 우선 순위

  1. Reset
  2. Data Abort
  3. FIQ
  4. IRQ
  5. Prefetch Abort
  6. Undefined Instruction
  7. SWI

Exception 처리 과정

  • Exception이 발생 한 후, 이전 모드로 돌아갈 수 있어야 한다.
  • Register 값을 다시 사용할 수 있어야 한다. 이전에 쓰던 Context를 다시 복원할 수 있어야 한다.
  • 이전 모드로 돌아갔을 때 원래 수행하던 곳으로 돌아갈 수 있어야 한다.

image

ARM Procedure Call Standard (함수 호출 규약)

  1. 함수를 부를 때 레지스터는 어떻게 사용 하는가.
  2. return 값은 어떻게 돌려 주는가.
  3. 스택은 어떨 때, 어떻게 사용되는가.
  4. 일반적인 레지스터들은 어떻게 사용되는가.

image

image

  • R4 ~ R11을 사용하려면, 스택에 저장 후 사용하고, return시 이전 값을 레지스터에 복원해야 한다.