Search Results for 'risc'

1 POSTS

  1. 2006.09.23 ARM Thumb 모드

ARM Thumb 모드

Posted 2006.09.23 20:04

ARM(Advanced RISC machines) 프로세서의 Thumb 모드에 대한 글을 써야겠다고 마음 먹고 있다가 시간을 내어 글을 쓰게 되었습니다.

ARM
프로세서는 일반적인 32비트 인스트럭션 셋을 제공하는 ARM 모드와, 16비트 인스트럭션 셋을 제공하는 Thumb 모드가 있습니다. 모든ARM 프로세서가 Thumb 모드를 지원하진 않고 ARM7TDMI처럼 프로세서 이름에 T가 들어있는 제품군이 Thumb 모드를 지원합니다.

이 이야기는 하나의 프로세서가 두 가지 인스트럭션을 제공한다는 뜻인데, 그 이유가 무엇일까요?

RISC
머신은 복잡한 CISC 머신에 비해서, 칩 설계가 간단해지므로 보통 한 CPU 사이클에 하나의 인스트럭션을 수행할 수 있다는 장점이 있습니다. 부족한 부분은 컴파일러 최적화를 활용해서 성능을 개선하는 것이죠. 반대로 CISC처럼 복잡한 인스트럭션이 없다 보니 같은 기능을 구현하기 위해 드는 인스트럭션의 길이가 길어지는 문제점도 있습니다.

ARM
이 주로 조그마한 임베디드 시스템에 사용되는 프로세서임을 생각해 본다면 그런 기계들은 메모리도 무척 귀중한 자원임을 알수 있습니다. 하지만 ARM RISC 머신이기 때문에 바이너리 크기가 같은 기능을 하는 CISC 프로세서용 바이너리보다 커지는 것이죠.

이 문제를 해결하기 위해서 도입한 것이 Thumb 모드입니다. ARM 인스트럭션 중에 자주 쓰이는 수치 연산, 브랜치, load/store 등의 일부 명령을 16 비트로 표시할 수 있는모드를 만든 것이죠. ARM CSPR(Current Program Status Register)라는 현재 상태를 나타내는 레지스터가 있는데 여기 플래그를 하나 두고 현재 ARM 모드인지 Thumb모드인지 구분하게 됩니다.

하지만 하나의 CPU가 두 개의 인스트럭션 셋을 가진다는 것은 그만큼 프로세서가 복잡해진다는 것을 뜻합니다. 이러면 RISC의 기본 정신에 어긋나게 되겠죠. 실제로 Thumb 모드는 별도의 프로세서가 아닌 보조 하드웨어를 거쳐서 ARM 인스트럭션으로 변환되게 됩니다. 이 변환은 하드웨어에서 이루어지기 때문에 별도의 속도 저하가 일어나지 않는 것이죠.

물론 원래 32비트였던 인스트럭션을 16비트로 줄였기 때문에 몇 가지 제약 사항이 생깁니다. 원래 ARM 사용자모드에서는 16+1개 레지스터가 보이는데, 레지스터 어드레싱하는 비트를 줄이기 위해 이를 8+1개로 바꾸었습니다. 대신에 원래 ARM 모드에는 원래 PUSH, POP 명령은 암묵적으로 R13번을 사용하는 식으로 레지스터 어드레싱을 합니다.

ARM
Thumb 모드는 하나의 바이너리 내에서도 자유롭게 변환이 가능합니다. C 프로그램을 컴파일한다고 하면 일부 함수는 ARM 모드로, 일부 함수는Thumb 모드로 컴파일이 가능한 것이죠. 물론 디바이스 드라이버나 예외 처리(exception handling) 같이 모든 레지스터와 인스트럭션에 대한 접근이 필요한 경우는 ARM 모드로 해야 하고요. 이런 변환은 보통 BX(Branch, Exchange) BLX(Branch, Link and Exchange) 같은 명령으로 이루어지는데 브랜치 할 때 목적 주소(destination address) LSB 0인지 1인지에 따라 결정을 하게 됩니다.

Thumb
모드로 하면 한 가지 부수적인 장점은 데이터 버스를 16비트로 줄일 수 있다는 겁니다. 이 경우 Thumb 모드 인스트럭션은 16 비트로 버스로 보내고, 32비트 ARM 인스트럭션은 16비트 버스로2번 패치(fetch)해서 처리할 수 있죠. 실제데이터 버스는 16비트이지만 32비트로 RISC 머신을 쓸 수 있다는 장점이 있습니다. 대신에 비용을 낮추는 것이지요.

참고 문서
[1] Introduction to ARM thumb By Joe Lemieux, Courtesy of Embedded Systems Design
신고

티스토리 툴바