ARM의 데이터 이동명령어는 크게 3가지로 나눌 수 있습니다.
  • 한 레지스터를 이동시키는 명령어
  • 여러개의 레지스터를 이동시키는 명령어
  • Swap 명령어

 첫번재의 move single register instruction이 가장 일반적입니다. 그리고 그렇게 크게 어려운 점은 없다고 봐도 될 것입니다. 그리고 세번째로 나와 있는 스왑(SWAP)명령어는 사용자로서는 잘 사용하지 않고 다중프로세서 시스템에서 공유 데이터 관리를 위해 주로 사용됩니다.
 하지만 이 챕터. 아니 명령어를 이해하는데 가장 걸림 돌이 되는 것은 무슨 프로그래밍이든 구조든지 메모리 access가 아닐까 생각됩니다. 특히 두번째에 언급했던 mutiple register road and store는 많은 데이터를 블럭단위(연속된 메모리주소)로 이동하는데 적합하고 ARM을 더욱 효율적으로 만들었습니다.
 이 Multiple Register Road and Store를 조금 더 부연설명을 하자면 최대 16개(레지스터의 가용갯수)까지 가능합니다.

 ARM에서의 이동명령어는 모두 레지스터를 이용한 간접 주소지정모드를 사용하게 된다. 레지스터 간접주소지정 방법은 한 레지스터에 메모리 주소값을 넣어두고 그 값을 주소로 이용하여 메모리에서 데이터를 읽어서 오퍼랜드를 가져오거나 메모리에 데이터를 써서 오퍼랜드를 저장합니다. 이때 메모리 주소값이 들어가 있던 레지스터를 베이스 레지스터(Base Register)라고 합니다.

 일단 ARM에서 유일안 메모리 접근 명령어인 LDR와 STR 명령어의 예를 살펴보도록 하겠습니다.

 LDR r1,[r2] ; r1 <- memory[r2]

 이 위의 예제는 r1에 다가 저장을 하는데 r2에 있는 값이 아니라 현재 r2에는 메모리의 주소값이 저장되어 있을 겁니다. 그 주소값이 가르키는 값을 r1에다가 저장하라는 것입니다. C 언어로 이야기 하자면 포인터 정도가 될 것 같습니다. 아, 그리고 STR도 한번 살펴보고 가도록 하겠습니다.

STR r1,[r2] ; memory[r2] <- r1

 이 위의 예제는 메모리에 값을 저장하는 예 입니다. LDR의 예제와 마찬가지로 r2가 가르키는 곳에 r1값을 저장하고 있습니다.  여기서 중요한 것은 데이터의 이동방향입니다. 이것을 헤깔리지 않도록 하는것이 중요합니다.

 
 이번에는 그렇다면 위의 예제에서 어떻게 r2에 memory 주소를 넣을 수 있을지 생각해보도록 하겠습니다. 첫번째로는 프로그램의 시작위치에서 계산하는 방법이있습니다. 이것이 가능한 이유는 r15가 pc, 즉 프로그램이 시작되는 부분을 가르키기 때문에 여기서 뺄셈을 해서 사용하면 됩니다.
 하지만 이 방법은 번거롭기도 하고 사용자가 하기에는 자칫잘못했다가는 엉키는 작업입니다. 그래서 생긴 명령어가 ADR 명령어 입니다.
 원래 명령어라는 것은 CPU가 처리하는 것 입니다. 하지만 이 ADR 이라는 명령어는 CPU에 명령하는 것이 아닙니다. 바로 컴파일러에게 알려주는 것입니다. 그래서 이 ADR명령어를 슈도(pseudo)명령어, 즉 가상명령어라고 합니다. 이 ADR 명령어 사용방법을 알아보기 위해 예제를 하나 제시하겠습니다.
 
ADR r1, TABLE1 ;

 r1에 TABLE1의 주소값을 대입합니다. 사용자는 TABLE1의 주소값을 모릅니다. 하지만 ARM은 알고 있습니다. 사실 사용자는 알 필요가 없습니다. 굳이 알고 싶다면 r1을 출력하면 되지만 컴퓨터가 알아서 해주는데 굳이 TABLE1의 주소를 알 필요는 없습니다. 이렇게 사용자가 사용가능한 메모리의 주소값을 얻었습니다.

 
그럼 이제는 이 r1의 다음 주소를 알아내는 방법입니다. 이것을 base plus offset 주소지정이라고 합니다.
 다음 중 r2에 r1의 다음주소에 있는 값을  저장 하는 코드는 무엇일까요? 

  1. LDR r2,[r1,#1]
  2. LDR r2,[r1,#4]
  3. LDR r2,[r1,#16]
  4. LDR r2,[r1,#32]

일단 생각을 해보도록하자. r1의 주소가 만약 0x1000 이라고 한다면 r1,#1은 0x1001이 될것입니다. 오, 이거 그럴사 합니다. 하지만 ARM에서 사용하는 값들은 32bit의 길이로 저장됩니다. 오! 그렇다면 정답은 4번 r1,#32 가 되어 0x1032? 땡! 아닙니다. 왜냐하면 일반적으로 주소값을 사용할때는 bit단위가 아닌 byte단위를 사용하게 때문에 답은 2번 r1,#4 즉 0x1000 번지의 다음번지는 0x1004가 됩니다.

 이렇게 base plus offset주소를 지정하는데 3가지 방법이 있습니. 지금 방금 사용한 방법이 pre-indexing이라고 합니다.

 pre-indexing이란 명령어를 실행하기 전에 base 에다가 Offset을 더해 주소에 있는 값을 레지스터에 더하는 것입니다.
 그다음은 Post-indexing 입니다. post-indexing이란 pre-indexing의 반대 개념으로 base 값만으로 명령어 실행후 base 값에 offset을 더해 base에 저장합니다. 그리고는 다음 실행시 반영합니다. 즉 저장후 base 값을 update 시키는 것 입니다. 예를 들어 보겠습니다.

 LDR r0,[r1],#4 ;
 
 이렇게 하면 r0에 r1의 값을 저장 한 후 r1의 값을 그 다음주소값으로 update 시켜 줍니다. 그래서 다음 실행시 반영이 됩니다. 

 그리고 마지막으로 auto-indexing이 있습니다. auto-indexing은 두개를 합쳐놓은 것인데 일단 pre-indexing으로 계산을 한 후에 base register를 update 합니다. 다시 정리 해 보자면

pre-indexing은 update하여 주소에 있는 값을 register에 저장하고
post-indexing은 주소에 있는 값은 register에 저장 한 후 base값을 update 합니다.
auto-indexing은 update하여 주소에 있는 값을 register에 저장하고 또 base 값을 update하게 됩니다.

이 auto-indexing을 사용하는 방법은 pre-indexing의 명령어 뒤에 '!'를 넣어주면 됩니다.

 LDR r2,[r1,#4]! ;



 


  


'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2.1 ARM 데이터 처리 명령어  (0) 2009.10.23
2 - ARM과 Assembly  (0) 2009.10.23
1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
 이번 절에서는 ARM 명령어중 데이터 처리 명령어를 알아보겠습니다.
 일단 ARM 데이터 처리 명령어에는 크게 1. 레지스터 오퍼랜드 명령어와 2.시프트(shift)된 레지스터 operand가 있습니다.
 또 레즈스터 오퍼랜드 명령어에는 
  • 산술 명령어
  • 비트논리연산 명령어
  • 레지스터이동 명령어
  • 비교명령어

가 있습니다.
 
 일단 산술명령어는 2진 덧셈, 뺄셈을 뜻합니다. 이때 오퍼랜드는 32bit를 사용하고 부호를 사용하지 않을수도 있고 부호를 사용한다면 2의 보수체계를 사용합니다.
 ADD : 덧셈, ADC : carry와 함께 덧셈
 SUB : 뺄셈 SBC : 케리와 함께 뺄샘
 RSB : 역순으로 뺄셈 RSC : 역순으로 케리와 함께 뺄셈

 비트논리 연산명령어는 두개의 오퍼랜드의 비트를 연산하는 명령어입니다. 예를 들어 11 곱하기 23을 일반적으로 하면 230+23이 되어 253입니다. 하지만 비트연산을 하면 11을 2진수로 표현하면
 01101(2), 23은 10111(2) 입니다. 이 둘을 AND 비트연산을 하면 00101(2)이 되어 5가 됩니다.

레지스터 이동 명령어는 두번재 오퍼랜드첫번재 오퍼랜드로 이동시키는 명령어 입니다. 예를 들어 
 MOV R0,R2 ; r0 := r2 
가 됩니다. 
 하지만 이 과정을 조금 더 정확히 보자고 한다면 이것은 연산명령어, 즉 ALU를 거쳐가야 하므로 사실은 R2에 0을 더하는 연산명령어 입니다.다시 말하면 MOV R0,R2 는 ADD R0,R2,#0 을 바꿔서 쓴 것이라고 생각해도 무방합니다.

 비교명령어는 연산을 하지만 결과값을 레지스터에 저장하는 것이 아니라 CPSR의 Condition flag만이 update된다.

 여기서 ARM CPU만의 특징이 하나 더 나오는데 그것은 바로 Default flag update가 안된다는 점이다. 보통 cpu들은 이런 연산을 할 경우 명령어에 특별한 명령을 더 하지 않아도 flag가 update된다 하지만 ARM CPU에서는 ADD를 하더라도 ADDEQ 와 같은 뒤에 명령어를 더 붙여줘야만 flag가 업데이트 된다.
 
 
이번에는 시프트된 오퍼랜드에 대해 살펴 보겠다.

이 ARM 명령어 세트 형식을 보면 두번재 소스의 코드 길이가 12bit나 된다. 왜 이렇게 많은 bit를 할당해놨을까? 그 이유는 ALU의 shifter에 있다.
 ARM의 ALU의 두번째 source operand쪽 회로에는 Shifter가 달려있다. 즉, 모든 2nd source가 ALU연산을 할 때 shifter를 거친다는 말이다. 이런 이유로 RSB같은 명령어가 존재한다.(뒤에 있는 오퍼랜드를 shift 연산하여 뺄 경우)
 사용 예는 이렇다.
 ADD r0,r1,r2,LSL #3 ; r0 = r1 + (r2 * 3)
이 shift는 한 사이클에 모두 해결되며 31bit까지 할 수 있다. 물론 이 shift의 방법에도 여러가지가 있다.
 

  • LSL : 왼쪽으로 쉬프트 후 LSB(1의 자리)의 빈자리를 0으로 채움
  • LSR : 오른쪽으로 쉬프트 후 MSB(부호비트)의 빈자리를 0으로 채움
  • ASL : LSL과 같음
  • ASR : 오른쪽으로 쉬프트 한 후 MSB(부호비트)의 빈자리가 양수인 경우에는 0 음수인 경우에는 1로 채운다.
  • ROR : 오른쪽으로 쉬프트 한 후 LSB에서 밖으로 나온 비트는 다시 MSB로 들어간다
  • RRX  : MSB가 비워지면 CCR의 C flag가 입력된다. 나머지는 ROR과 같음


또한 알아두어야 할 것은 Condition Code의 설정이다. 일반적으로 TST 또는 CMP와 같은 비교명령들을 제외한 일반 산술 및 논리 연산은 ARM CPU의 특성에 따라 Condition flag를 update시키지 못한다. 따라서 condition flag를 update시키려면 명령어 끝에 'S'를 붙여 주어야만한다.

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2.2 - ARM 데이터 이동 명령어 -1  (0) 2009.10.23
2 - ARM과 Assembly  (0) 2009.10.23
1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
 ARM의 기본적인 소개가 끝나고 이제 프로그래밍에대한 기반지식을 배울 차례입니다. 이번 챕터에서는 ARM에서 사용하는 명령어 형식과 메모리 접근방법등을 공부할 예정입니다.

 일단 ARM의 명령어 형식은 일반적으로 32-bit 워드로 이루어져 있습니다. 만약 메모리상에서 16-bit를 사용하는 것은 하프워드(Half-word) 그리고 8-bit는 바이트(byte)단위라고 부릅니다. 따라서 연산 결과들도 32비트이며 레지스터에 저장됩니다.
 또한 ARM의 명령어는 Operand와 Opcode로 이루어져 있습니다. 여기서 Opcode란 명령어가 어떤 명령어인지 즉 operation code란 말이고 operand는 피연산자 즉 opcode가 필요로하는 데이터를 가르키는 말입니다. 예를 들어
 
     ADD r1,r2,r3     ;   r1= r2 + r3

이 소스에서 Opcode는 ADD 이고 operand는 r1,r2,r3가 됩니다. 이 operand사이에서도 source operand와 destination operand가 있는데 위 소스에서 source operand는 r2와 r3이 되겠고 destination operand는 r1이 되는걸 볼수 있습니다.


 위 그림은 ARM 명령어 세트의 형식을 나타내 준다. 맨 앞 4 Bit는 Condition Bit로 챕터 1의 마지막 장에서 설명했던 ARM 명령어들의 특징에서 모든 명령어가 Condition을 포함한다는 것을 나타내 줍니다.
 그리고 그 다음 8bit가 opcode를 나타내 주는 bit로 어찌보면 위 그림에서 가장 복잡하게 보이는 부분입니다. 하지만 위의 비트들은 일일이 알필요가 없으니 그냥 넘어가도 좋습니다.
 그다음에 나오는 20bit가 모두다 operand를 표시하는 bit입니다. 이 bit들은 조금더 뜯어 보면 앞의 4bit가 sourse bit 1입니다. 즉, 첫번재 나오는 sourse bit 입니다. 그리고 그 다음 4bit가 destination bit입니다. 그리고 그 뒤에 나오는 12bit가 sourse bit 2 즉, 두번재 나오는 소스 비트 입니다.
 차례 대로 나열하자면
 Condition(4) OPcode(8)  Source1(4)  Destination(4)  Source2 
정도가 됩니다.

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2.2 - ARM 데이터 이동 명령어 -1  (0) 2009.10.23
2.1 ARM 데이터 처리 명령어  (0) 2009.10.23
1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23

 이제 ARM의 소개가 거의 끝나 갑니다. ARM의 특징들을 조금 더 살펴보게 될텐데요 일단 명령어들의 특징을 보겠습니다.

  • The Load-Store Architecture
  • 3-address data processing instructions
  • 모든 명령어가 Condition을 포함
  • Multi-access가 가능한 Load-Store 명령어
  • ALU연산에 포함된 Shift 연산(->single cycle 처리가 가능)
  • 보조 프로세서 명령어 세트(새로운 명령어 생성 가능)
  • 16-bit의 Thumb 명령어

물론 이 모든 특징들을 지금 알 필요는 없습니다. 하지만 이런 특징들이 있다는 것은 알아둘 필요가 있습니다. 특히 ARM의 Load-Store 명령어가 특징이 되는 이유는 ARM에서는 CPU에서 명령어를 처리 할때 명령어를 처리할 때 마다 Memory에 접근을 한다면 Memory에 갔다오기까지 pipeline가 멈춰 있어야 하므로 Memory의 접근 명령어를 무조건 Load 명령어와 Store명령어만으로 구성해 놓았습니다.

 또한 ARM 명령들은 다음의 세가지 범주로 나눌 수 있습니다. 

  1. 데이터 처리 (ALU)
  2. 데이터 전송 (Load-Store)
  3. 제어 명령 (branch, branch & link, trap)

  이렇게 나누어진 명령어들이 CISC보다는 적지만 ARM은 RISC의 구조적인 성능 저하를 막기 위해 명령어를 복잡하게 설계해 놓았습니다.

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2.1 ARM 데이터 처리 명령어  (0) 2009.10.23
2 - ARM과 Assembly  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23

 ARM의 레지스터는 r0부터 r15까지 총 16개의 user mode의 Register가 존재합니다. 거기에 system mode에서 사용하는 15개의 register와 각모드에 존재하는 CPSR, SPSR을 합쳐 총 37개의 레지스터가 존재 합니다.

 
<출처 : ARM Sysyem-On-chip Architecture>
 위 그림은 ARM Register를 그림으로 나타낸 것입니다. 일단 가장 왼쪽에 User Mode를 보면 하얀색으로 r0~r15(pc)와 CPSR이 있습니다. 일단 r0~r12까지는 일반적으로 cpu에서 load-store 명령어를 가지고 사용할 수 있는 Register들 입니다.
 그리고 r13부터가 조금 특이한 성격을 갖고 있는데 일단 r13은 SP(Stack Pointer)라고 불립니다. 이 스텍포인터는 다른 컴퓨터 구조와 마찬가지로 사용하는 프로그램의 메모리중 가장 위쪽(Top)을 가리킵니다.
 R14는 링크 레지스터로 예외처리(Excetpion Mode)를 하고 난 뒤 혹은 서브루틴 함수에서 다시 메인으로 돌아갈 주소를 저장하는 링크 주소를 저장하는 레지스터라고 생각하시면 도비니다.
 R15는 PC라고 불리는 Program Counter 입니다. 이 PC가 하는 역할은 실행할 프로그램을 잃어올 메모리의 위치를 가리킵니다. 따라서 PC는 user mode뿐만 아니라 system mode에서도 공유하여 사용합니다.

 위에 그림을 보면 의문점이 하나 생길 수 있습니다. 그것은 "위에 그림을 보니 FIQ라든가 SVC라든가 다른 system mode를 보면 register들이 usermode에 비해 현격히 적습니다. 특히 svc, abort, irq, undefined 같은 경우는 r13, 14. 두개의 register밖에 사용을 못하는겁니까?" 라고 물을 수 있습니다.
  결론을 먼저 말한다면 다행히도 아닙니다. 지금 위에 있는 것들은 유저모드의 레지스터와 '예외처리 및 에러처림의 전용레지스터'만 나타낸 것입니다. 따라서 어떤 모드 이던지 모든 모드에서 레지스터는 r0~r15+CPSR을 사용합니다. 그리고 전용레지스터가 아닌 레지스터는 공용(General)으로 사용합니다.
 다시말해서 일반 interrupt가 발생시 irq mode로 전환됩니다. 이때 사용되는 r0~r12까지는 user mode에서 사용하던 General register(범용레지스터)를 사용하게 됩니다. 물론 이 때 있던 값들은 메모리에 저장이 되어서  다시 되돌아갈 주소를 r14가 저장을 해주게 됩니다.

 그럼 이제 ARM register의 mode 들을 살펴보겠습니다.
 가장 일반적인 user mode는 일반적으로 응용프로그램들을 실행할때 사용됩니다. 이때 다른모드로 넘어가기 위해 svc(supervisor call)를 사용하여 넘어가게 됩니다.
 FiQ는 Fast IRQ로서 빠른 Interrupt 처리를 위해 만들어진 레지스터로써 ARM의 중요점인 interrupt처리를 위해 다른 예외처리보다 더 register를 설정해 두었습니다.
 IRQ는 일반적으로 사용되는 외부 Interrupt들을 처리하기 위해 만들어진 Register로서 대부분 하드웨어적인 입출력 장치들의 완료보고등을 처리한다고 보시면 됩니다.
 SVC는 Siperviser Call로서 일반 유저 모드가 아닌 다른 레지스터들. O/S에서의 커널이나 장치 드라이버등을 처리할때 작동됩니다. 이 Mode는 Reset신호가 입력이 되거나 SWI(software interrupt : 프로그래머의 임의적인 요청)가 발생하면 SVC모드로 넘어 갈 수 있습니다.
 Abort는 interrupt가 아닌 error처리모드로 데이터를 읽거나 쓸 때 오류가 발생할 경우 abort모드로 전환되어 처리됩니다.
 undefined는 처리하고자 하는 명령어가 ARM명령어가 아닌경우(디코더에 정의 되어있지 않은경우)에 발생하는 모드입니다.


그리고는 또 중요한 것이 각 모드마다 있는 CPSR(SPSR)이라는 Register입니다. 이 CPSR은 Current Program Statue Register의 약자로 즉, 현재의 프로그램 상태를 나타내 주는 레지스터 입니다.
 이 CPSR은 Condition Flag와 현재의 Mode를 나타내주는 값들이 들어 있습니다. 우선 중요한것은 Condition Flag인데 상위에 4bit(순서대로 N,Z,C,V)가 이것을 나타내 줍니다.

 N : Negative로 ALU operation의 결과가 음수인 경우 최상위 비트가 1로 Setting이 됩니다. 즉, CPSR의 최상위 비트가 1이 됩니다.
 Z : Zero로 ALU operation의 결가가 0인경우 set이 됩니다. 보통 비교연산중 같은지를 비교할 때 많이 사용됩니다.
(왜냐하면 컴퓨터에서 비교연산을 하는 방법은 a와 b가 같은지 볼 때 a에서 b를 빼서 0이 나오면 같다는 의미이므로 z flag를 사용합니다.)
 C : Carry로 ALU operation의 결과 혹은, shift operation의 결과가 carry출력이 발생하면 set이 됩니다.
 V : oVerflow로 산술연산시 sign bit를 넘어서면 V가 Set이 됩니다.

SPSR을 알아보자면 SPSR은 Saved Program Status Register로 지금 실행되고 있는 Mode를 실행하기 바로전의 CPSR을 저장하는 것으로 하는 역할은 같습니다.

이번 절은 다른분들의 블로그에서도 많이 참조하였습니다. 다른것들은 몰라도 이 내용은 여러군대서 소개되어 있더라구요. 

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2 - ARM과 Assembly  (0) 2009.10.23
1.4 - ARM의 Instructions  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23
1 - ARM 이란 무엇인가?  (0) 2009.10.23

 ARM이 Bekeley대학의 Bekeley RISC를 기반으로 만들었다고는 했지만 Bekeley RISC를 그대로 복사해서 놓은 것은 아닙니다. 물론 Bekeley RISC에서 많은 개념들을 빌려왔지요. ARM 프로세서가 Bekeley에서 빌려온 중요한 개념들을 보자면


  • Load-Store 구조
  • Fixed-length 32bit instruction
  • 3-address instruction 형식

 

 정도 입니다. 가만히 보자 하면 이 세가지는 ARM과 Bekeley RISC뿐만 아니라 다른 RISC구조에서도 찾아볼 수 있는 일반적인 RISC 구조라고 할 수 있습니다. 중요한 것은 채택하지 않은 기능들인데 ARM이 아래 기술할 것들을 채택하지 않은 가장 큰 이유는 사실 Bekeley RISC라는 프로세서는 Computer의 CPU를 고려해서 설계한 Chip입니다. 따라서 '비용'의 문제점이 나타나게 되고 비용을 줄이자면 또한 '속도'의 문제점이 나타나게 됩니다.
 ARM은 Embedded에 적용하기 위한 CPU입니다. 따라서 첫번째로 비용이 크게 들면 안됩니다. 두번째로는 현대의 컴퓨터처럼 그렇게 많이 빠를 필요는 없습니다. 적당한 속도만 내주어도 괜찮다는 이야기 입니다. 세번째로는 적은 비용을 위해 구조가 간단해야 합니다.

 이런 이유로 ARM이 Bekeley에서 적용하지 않은 개념들을 보자면

 

  • Register Windows(레지스터 윈도우)
  • Delayed Branch(지연 분기)
  • Single-cycle Execution(싱글사이클 실행)

 

이 있습니다.

 우선 Register Windows란 일반적인 컴퓨터는 복잡한 멀티미디어와 프로그램들을 실행하기 위해 중첩 프로시져(Procedure : ①특정 작업을 수행하도록 이름 붙여진 컴퓨터 프로그램의 일부, 정보통신용어사전제6판,한국정보통신기술협회)(역저 : 하나의 함수라고 생각하면 편함)를 사용하게 되는데 이때 바람직하지 않은 데이터 트래픽이 발생하게 됩니다.
 그래서 Register Windows에서는 이 트래픽을 감소하기 위해 CPU에 많은 수의 레지스터를 확보한 후에 레지스터를 한번에 이동시키면 더 빠르게 처리 할 수 있습니다. 하지만 이럴 경우 설계시 레지스터를 많이 사용하게 되고 그러면 비용이 많이들어가 임베디드의 지향점인 '저렴한 비용'에서 멀어지게 됩니다. 따라서 ARM에서는 Register Windows가 아닌 Shadow Register라는 것을 사용하여 예외상황(Exception)이 발생시 한 Register에 이 전의 상태값을 저장하여 Procedure가 아닌 Exception 처리에 비중을 두게 됩니다.

 두번째로 Delayed Branch(지연분기)는 말 그대로 Branch, 분기 명령어에 대한 처리 방법입니다. CPU의 설계 기술중 Pipe LIne 이라는 기술이 도입되면서부터 CPU의 처리 속도가 비약적으로 높아 졌습니다. 따라서 ARM도 Pipeline을 도입하였습니다. 하지만 이 Pipeline에는 고질적인 문제점이 있는데 그것을 Hazard라고 합니다. 그중 이 Branch Hazard는 이 Pipeline 구조에서 해결 할 수 없는 문제점중 하나입니다.
 예를 들어 Pipeline이 돌아가고 있는 중에 분기문이 발생했습니다. Pipeline의 첫번재인 IF(instruction fetch, 명령를 읽는것)를 수행하고 ID(instruction decode)를 하게되면 다음 명령어가 들어와야 되는데 다음 명령어가 분기 명령어에 영향을 받을 경우 cpu는 처리하지 못하게 되는 현상이 발생합니다. 이것이 Branch hazard입니다. 
 Bekeley RISC에서는 이를 해결하기 위해 지연분기를 사용하였는데 이 지연분기란 분기 명령어와 이 분기명령어가 사용될 혹은 사용이 취소될 명령어 사이에 지금 실행되고 있는 분기명령어의 영향을 받지 않은 다른 명령어를 집어넣어 실행하게 됩니다. 그리고 나서 분기의 영향을 받은 명령어가 실행이 되도록 하였습니다.
 하지만 이 방법은 파이프 라인이 하나일때는 문제가 없지만 슈퍼스칼라(super-scalar)구조 에서는 분기 예측회로를 복잡하게 만드는 단점이 있고 또한 HardWare적으로 부담이 되기도 했습니다. 그리고 Embedded에서 필요로 했던 Exception처리를 복잡하게 만들기 때문에 지연분기를 사용하지 않았습니다.
 따라서 ARM에서는 BTB(Branch Target Buffer:분기예측)란 방법을 사용하는데 분기 명령어 발생시 BTB에서 True와 False를 예측하여 True로 예측되었으면 True를 Pipeline에서 실행 한 후 분기 명령어 다음 명령을 실행을 하고 만약 틀리면 True명령어를 취소하고 바로 False명령어를 실행하게 됩니다.

 마지막으로 Single-cycle execution 입니다. 이 Single-cycle execution은 말그대로 모든 명령어를 한 clock cycle동안에 수행하는 구조입니다. 이것이 가능한 이유는 pipeline을 적용하기 때문이겠지요. 따라서 첫번재부터 총 stage-1만큼의 명령어는 제외입니다.
 거의 대부분의 ARM 명령어는 한 cycle에서 처리가 가능하지만 load나 store같은 명령어는 데이터를 갖고 올때와 데이터를 읽고 쓸때 이렇게 두번의 Cycle이 필요로 하게 됩니다. 따라서 이 Single-cycle execution을 구현하려면 명령어 메모리와 데이터 메모리가 따로 있어야 하는데 이것또한 ARM 프로세서의 초반에서는 가격의 문제로 이것을 사용하지 않았습니다. 그래서 이 Single-cycle execution대신 메모리 access를 최소화하도록 auto-indexing addressing mode에서처럼 cpu내부의 유휴 자원들을 활용함으로써 전체 프로그램의 처리 시간을 줄여보려고 최선을 다했습니다.


 위에서의 세가지 적용하지 않은 구조들을 보면 대충 ARM에서 지향하는 바를 알수 있습니다. 그것은 바로 Simple입니다. ARM에서도 역시 가장 중요하게 생각했던 것은 Simple design이였습니다. 이렇게 설계해 놓음으로 인해서 ARM은 싸고 가볍고 저전력의 Chip을 개발할 수 있었습니다.

요약

 Bekeley에서 적용한 것 적용하지 않은 것  대체 수단 
Load-Store 구조  Register Windows  Shadow register 
 Fixed-length 32bit instruction Delayed Branch   Branch Target Buffer
 3-address instruction 형식  Single-cycle Execution  Multi-Cycle Execution

 Bekeley RISC에서 ARM 프로세서에 적용하지 않은 공통적인 이유.
   비싼가격. Exception처리에 중점을 두기 위해.

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23
1 - ARM 이란 무엇인가?  (0) 2009.10.23
0 - 들어가는 말.  (0) 2009.10.23

 앞에서 ARM의 간단한 발생 배경을 알아보았습니다. 그렇다면 앞에서 말했던 RISC는 무엇일까요? 일단 RISC란 Reduced Instruction Set Computer의 약자 입니다. 말을 그대로 풀어보자면 줄어든 '명령어 세트' 컴퓨터 라는 것이지요. 즉, CPU 명령어의 개수를 줄여 하드웨어 CISC보다 구조를 조금 더 간단하게 만드는 방식이지요.

 RISC는 CISC와는 반대되는 개념입니다. 이 Arcon사가 BBC Microcomputer를 만드려는 1983년에는 16-bit의 CISC(Complex Instruction Set Computer)가 주류를 이루고 있었습니다. 하지만 이 CISC라는 것은 1. 명령어의 숫자가 많았고, 2. 명령어를 처리하는데 많은시간(clock cycle)이 들었고 따라서 3. Interrupt Latency(대기시간)도 길어지게 됩니다.
 하지만 ARM이라는 것은 멀티미디어와 같은 복잡한 성능을 요구하는 것이 아니라 기계와 기계를 컨트롤 할 수 있는, 즉 인터럽트를 잘 해결할수 있는 구조가 필요로 했습니다.

 따라서 Arcon사는 CISC로 CPU를 설계하는 것을 망설이던 때 Berkely 대학에서 내놓은 Berkely RISC I 의 논문이 발표되었습니다. 이 RISC I 은 몇명의 대학원생이 일년정도의 연구기간 동안 만들어 낸 것이였지만 그 당시의 어떠한 사용 CPU에서도 뒤지지 않았습니다.

 이런 배경에서 Arcon사에서는 이 Berkley RISC I을 변형하여  ARM CPU를 만들어 내었고 이것이 성공하게 되었습니다. 그리고 후에 Arcon Computers와 Apple computer가 합작을하여 ARM 유한회사라는 이름을 갖게 되었고 이때 ARM이 Arcon RISC Machin이 아닌 Advanced RISC Machins라는 이름을 사용하게 되었습니다.

 따라서 우리가 지금 사용하고 있는 ARM이라는 것은 Chip의 이름도 되겠지만 회사의 이름도 됩니다. 그리고 이때부터 ARM사는 CPU의 종류를 늘려가고 있습니다.


'ARM(Advanced RISC Machine)' 카테고리의 다른 글

1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
1 - ARM 이란 무엇인가?  (0) 2009.10.23
0 - 들어가는 말.  (0) 2009.10.23
  ARM 이란 무엇인가?
 ARM을 처음 접했을때는 Arm 이라는 단어 그대로 '팔' 이라는 뜻이 제 머리를 '팟'하고 스쳐갔지만 컴퓨터에서 '팔'이라는 것을 뜻할리가 없습니다.

 일단 ARM이란 Advanced RISC Machine 의 약자로서 그 뜻을 그대로 해석하자면 향상된 RISC 기계 라고 말할수 있겠습니다.
 그렇다면 도대체 RISC는 뭘까? 라는 의문이 생기지만 일단 이것은 조금 나중에 설명하도록하고 조금더 ARM이란 것의 추상적인 개념을 먼저 잡고 가고자 합니다.

 ARM. 정확히 ARM 아키텍쳐(architecture)는 임베디드 기기에 많이 사용되는 32-bit RISC 프로세서 입니다.(출처: 위키디피아) 여기서도 RISC라는 것이 나옵니다. RISC라는 것이 벌서 두번이 나왔습니다. 그만큼 중요하다는 거겠지요?

 이 ARM이라는 것은 1985년 4월 26일 영국의 캠브릿지에 있는 아콘 컴퓨터(Arcon Computer)사에서 처음으로 사용화 되었습니다. 이때에는 이 ARM이라는 것이 Arcon RISC Machine의 약자에서 ARM이라는 단어가 나왔었습니다.

 그리고 BBC방송과의 합작으로 BBC micro라는 8-bit 6502 CPU를 이용한 BBC Microcomputer라는 것을 만들어 그 이름을 알리기 시작했습니다.




요약 : ARM은 Advanced RISC Machine의 약자이다.





 


'ARM(Advanced RISC Machine)' 카테고리의 다른 글

1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23
0 - 들어가는 말.  (0) 2009.10.23
 학생으로서 아니 태어나서 인간으로서 처음으로 이렇게 전문적인 포스팅을 하게 됩니다. 부족한점도 많고 사람들이 봐주기 보다는 스스로 정리하고 이 정리한 것을 인터넷이라는 매체를 통해 불특정 다수에게 공개하고 싶다는 욕구가 일기도 해서 이렇게 포스팅을 합니다.
 사실 어떤 말 보다도 그저 요세 시대의 흐름에 따라 포스팅을 하고 싶었다고 해두도록 하죠.

 처음 시작하는 것은 제가 대학교 3학기 (2-2)때 듣고 있는 ARM 이란 놈에 대해서 써 볼 생각입니다. 우리나라 산업에 많은 기여를 하고 있음에도 불구하고 의외로 많이 소개가 되어있지 않은것같아 학교 도서관에 앉아서 이렇게 끄적여 봅니다.

 ARM에 대해서 포스팅하는 것의 출처는 일단 첫번째는 학교 수업 중 교수님에게 들었던 내용이 기본 베이스가 될 것입니다. 따라서 제 수업의 교재였던 ARM system-on-chip architecture(Steve furver,홍릉과학출판사)의 순서를 많이 따라갈 것 같습니다. 하지만 사실 최대의 자료 참고는 정보의 바다 인터넷인것만은 확실하겠지요?

 제 글은 소장용으로만 퍼가실 수 있습니다. 그 이외에 다른 용도로 얻으시려면 메일을 주세요(사실 티스토리도 너무 가끔 들어오거든요.). 자료 참고정도라면 티스토리 방명록에 말씀이라도 해주셨으면 감사하겠습니다. 

 

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23
1 - ARM 이란 무엇인가?  (0) 2009.10.23

+ Recent posts