분야를 막론하고 C 언어나 파이썬으로 컴퓨터 프로그래밍을 하다보면 다음과 같은 의문점이 생깁니다.
 
   * 바로 컴퓨터의 전원 버튼을 누르면 가장 먼저 무엇을 실행할까?
   * 이 때 실행되는 어셈블리 명령어는 무엇일까?
   * 이 명령어는 메모리의 어느 위치에 있을까?
 
이런 의문을 해소하려면 먼저 ARM 코어 내부에 있는 레지스터 중에 PC라고 부르는 프로그램 카운터 레지스터에 대해 이해할 필요가 있습니다. 
 
PC(프로그램 카운터) 레지스터란
 
PC(프로그램 카운터 레지스터)의 역할은 무엇일까요? 실행할 명령어를 읽을 때 사용되며 PC는 ARM 코어가 실행할 명령어가 있는 위치를 저장합니다. 그런데 이름과 역할이 약간 다른 것 같습니다. PC라는 용어는 프로그램 카운터라고 부른다고 말씀드렸는데, "프로그램 + 카운터"라는 2가지 용어로 구성됐습니다. 용어 그대로 "프로그램을 센다"라고 해석할 수 있습니다. ARM 코어가 실행할 명령어가 있는 위치를 저장하는 레지스터를 PC라고 명시하는데, x86 아키텍처에서 같은 역할을 하는 레지스터를 IP(Instruction Pointer), 즉 명령어 포인터라고 합니다. x86 아키텍처에서 명시하는 IP가 ARM 아키텍처의 PC보다 조금 더 명확한 의미를 담고 있습니다. IP는 용어 그대로 메모리에 있는 명령어(Instruction)을 가리키는(Point) 동작을 의미하기 때문입니다.
 
정리하면, ARM 혹은 x86 아키텍처의 PC(Program Counter)와 IP(Instruction Point)는 둘다 다음과 같은 역할을 하는 레지스터입니다.
 
   * CPU 코어가 읽어 올 명령어(Instruction)의 주소 위치를 담고 있다.
 
PC의 주요 역할
 
ARM 코어는 먼저 PC가 가리키는 주소에 있는 명령어를 읽은 후, PC를 자동으로 증가시키는데,
32비트와 64비트 ARM 아키텍처에 따라 증가되는 바이트가 다릅니다.
 
   * 32비트: 4바이트
   * 64비트: 8바이트
 
32비트 ARM 아키텍처를 기준으로 설명하면 ARM 명령어는 모두 4바이트로 구성돼 있으므로 다음 명령어의 위치는 다음 공식으로 계산할 수 있습니다.
 
   * PC + 4바이트
 
이번에는 예제 코드를 보면서 PC의 동작에 대해 알아봅시다.
 
______addr/line|code_____|label__|mnemonic________________|
NSR:00000000|E10F9000          mrs     r9,cpsr
NSR:00000004|E229901A          eor     r9,r9,#0x1A      ; r9,r9,#26
NSR:00000008|E319001F          tst     r9,#0x1F         ; r9,#31
NSR:0000000C|E3C9901F          bic     r9,r9,#0x1F      ; r9,r9,#31
NSR:00000010|E38990D3          orr     r9,r9,#0xD3      ; r9,r9,#211
 
위 코드를 보면 0x0 주소에 "mrs     r9,cpsr" 명령어가 보입니다.
ARM 코어의 PC는 0x0에 있는 명령어를 읽어온 후, PC가 0x4로 자동으로 증가되게 설계돼 있습니다. 32비트 ARM 아키텍처에서 명령어의 크기는 4바이트이기 때문입니다. PC는 0x0에서 0x4, 0x8로 계속 증가하게 됩니다.
 
전원을 킬 때 PC의 위치
 
레지스터는 회로 설계 관점으로 보면 플립플롭으로 구성돼 있습니다. 디지틀 회로시간에 다룬 내용을 떠올리면 플립플롭은 reset과 set 입력이 있는데, 디바이스에 있는 리셋 버튼이 플립플롭의 reset 혹은 set 입력에 연결돼 처음 시작값을 설정할 수 있습니다. 이 기법을 PC 레지스터에 활용하면 PC의 초기값을 설정할 수 있는데, ARM 아키텍처의 경우 PC가 0x0으로 시작하도록 설계돼 있습니다.
 
이번 포스팅에서는 여러분이 사용하는 IT 기기(ARM 프로세서로 구성)에 전원을 입력할 때 가장 먼저 무엇이 실행되는지 알아봤습니다. 다음에는 이어서 부트로더에 대해 설명하겠습니다.

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>

 
 

+ Recent posts