[ARM] ARM V7 Architecture-1

개발 공부 블로그·2024년 2월 9일
0

ARM / THUMB

  • ARM 모드는 32bit Instruction
  • Thumb 모드는 16bit Instruction
  • ARM/THUMB 에 따라 레지스터의 개수도 달라진다.
  • ARM 과 THUMB 의 차이에서 가장 중요한 것은 THUMB 모드는 16비트로 Instruction 을 처리할 수 있으니 Code Size를 줄이는데 효율적이다.
  • 반면 ARM 모드는 Performace 관점에서 더 빠르다고 할 수 있다.
  • 적절히 배분하는 것이 필요..

ARM 의 동작 모드

ARM 의 6가지 동작 모드

  • ARM 에는 6가지의 동작모드가 있다.
    • User (usr)
    • System (sys)
    • Supervisor (svc)
    • IRQ (irq)
    • FIQ (fiq)
    • Abort (abt)
    • Undef (und)
  • Normal Mode vs Priviledged Mode
    • Normal Mode 는 User 모드 하나.
    • Priviledged Mode 는 나머지 전부 (sys, svc, irq, fiq, und, abt)
    • 그럼 이 두 모드의 차이는 뭘까?
      • Priviledged Mode는 IRQ, FIQ 와 같은 Interrupt 의 사용 가능 유무를 직접 선택할 수 있다.
      • Priviledged Mode는 어떠한 모드로든 다 변경할 수 있지만, Normal Mode는 Priviledged Mode 로의 변경이 불가능하다.
        • Priviledged -> Priviledged : 가능
        • Priviledged -> Normal : 가능
        • Normal -> Priviledged
  • 각각의 모드는 독립된 스택을 가지고 있다.
    • 당연한게, SVC 모드에서 프로그램이 돌아가다가 FIQ 로 바뀌면 SVC 모드에서 동작하던 프로그램의 정보 (레지스터) 는 어딘가에 저장되어야 한다.
  • 그럼 이러한 Mode 들에는 어떻게 진입을 할까?
  • 자기 마음대로 CPSR의 mode bit를 변경하여 바꿀 수도 있지만, 보통 Excpetion 을 통해 하드웨어적으로 자동으로 특정모드에 진입한다.

Exception

  • Exception : 외부 요청이나, 오류와 관련된 사건 (인터럽트 포함)

  • Exception 을 통해 하드웨어적으로 정해진 특별한 reaction 이 발생한다.

  • 여기서 reaction 은 exception 이 발생하면 진행하던 동작을 멈추고 exception 의 종류에 해당하는 모드에 진입하고, exception 이 물려있는 주소로 pc를 점프한 후 exception 에 대한 처리를 하는 것.

    • SVC : 전원을 인가하거나 reset 을 시키면 SVC 모드로 진입하고 PC를 0x00 으로 점프시킨다.
    • IRQ/FIQ : Interrupt 발생하면 IRQ/FIQ 모드 진입 후 PC 를 0x1C 또는 0x18로 점프
    • ABT : Data Abort 시 0x10, Prefetch Abort 시 0x0C
    • UND : undef exception 발생 시 0x04 로 점프
  • Exception Vector 란 Exception 발생 시 그 Exception 에 해당하는 미리 정해진 address 로 점프하는데 이 address 를 Exception Vector 라 한다. 그리고 Excpetion Vector 를 모두 모아둔 테이블을 Exception Vector Table 이라 한다.

  • 각 mode 별 CPSR 의 모드 비트 값이다.

  • 각 모드 별로 어떤 Exception 이 발생했을 때 해당 모드로 진입하는지 알아보자.

    1. SVC : Power on / Reset
    2. IRQ : Hardware 적인 interrupt 발생 시
    3. FIQ : Interrupt 중 Fast Interrupt 발생 시
    4. ABT : Access 하려는 메모리 주소가 access 불가능한 주소이거나, instruction fetch 하려는데 못해온 경우. MPU 사용 시에는 Access Protection 이 걸려있는 주소를 함부로 접근하려 할 때
    5. UND : Instruction 을 decode 했는데 해석이 불가능한 모르는 명령어일 경우. 보통 Memory Corruption 이 발생하여 instruction을 망쳐놨을 때.
  • SVC -> IRQ 모드 변경 과정을 살펴보자.

    1. SVC 에서 실행 중이던 CPSR 값을 SPSR_IRQ 에 저장하자.
    2. CPSR 모드 비트를 IRQ로 변경. SP(R13) 도 R13_IRQ 로 변경
    3. IRQ disable, ARM mode on
    4. R14(LR)_IRQ에 현재 SVC 모드에서 실행중이던 PC 값을 저장
    5. R15(PC) 에 Exception Vector (IRQ는 0x18) 저장
    6. R0~R12 를 R13(SP)_IRQ 가 가리키는 값에 저장
    7. R14(LR)_IRQ 에 저장된 값을 보정. (-4)

ARM Register

  • 위 사진이 arm 의 레지스터들이다.
  • 레지스터의 개수 : 공통으로 사용되는 r0 ~ r15 레지스터 16개 + cpsr 1개 + fiq 전용 레지스터 5개 (r8 ~ r14) + r13 ~ 14 전용 레지스터 (fiq, irq, svc, abt, und) 10개 + spsr 5개 = 37개

CPSR (Current Program State Register)

  • NZCV
    • N(Negatvie) : 연산결과가 마이너스인 경우에 set 된다.
    • Z(Zero) : 연산결과가 0인 경우에 set 된다.
    • C(Carry) : 연산결과에 자리 올림이 발생한 경우 set 된다.
    • V(Overflow) : 연산결과가 overflow 났을 때 set 된다.
  • IF : (IRQ, FIQ)
    • 인터럽트가 걸릴 수 있는지에 대한 flag 정보
    • 0이면 on (인터럽트 O), 1이면 off (인터럽트 X)
  • T (Thumb, Arm)
    • Thumb 인지 ARM 모드인지.
  • mode
    • SVC 인지, FIQ 인지 등..
    • 이 값을 바꾸면 mode 변경이 가능하다.

Banked Register

  • SPSR (Saved Program State Register)
    • CPSR의 저장 용도
    • 모드가 바뀌면 CPSR 도 바뀐다. 이전 CPSR 의 상태를 SPSR 에 저장해놓는다.
  • R13 (Stack Pointer)
    • Stack 을 어디까지 쌓아뒀는지.
  • R14 (Linked Register)
    • 어디서 branch 되어서 왔는지 알려준다.
  • R15 (Program Counter)
    • 현재 instruction 의 위치.
    • 실행하는 위치가 아닌 Fetch 해 온 위치를 가리킨다.

기타 Register

  • 레지스터는 AAPCS(Procedure Call Standard for ARM Architecture) 규약을 따른다.
  • R0 ~ R3 (Argument/Result/Scratch)
    1. Argument
    • 함수 호출 시 파라미터 값으로 사용
    • int function(int a, int b, int c, int d) -> a,b,c,d 가 각각 r0 ~ r3 까지 저장
    • 파라미터 개수가 4개가 넘어가면 나머지 파라미터는 stack 에 저장.
    1. Result
    • R0 에 보통 result 를 넣는다. 위에 예시에서는 int 형 return 값이 r0에 저장된다.
    • 포인터와 같이 함수 밖에서도 사용되는 상황에서 result 로 쓰이거나, 4바이트 이상의 크기를 전달할 때도 r0~r3까지 사용해서 전달한다.
    1. Scratch
    • 연습장으로서 사용 (중간 중간 계산을 위해)

0개의 댓글

관련 채용 정보