2007. 3. 2. 00:27
Lecture/ARM System Developer's Guide
- 폰노이만 아키텍처 : 데이터용 버스와 명령어용 버스가 통합
- 하버드 아키텍처 : 데이토용 버스와 명령어용 버스가 분리
2.1 범용 레지스터(32비트) : 데이터나 주소 저장, 프로세서는 7개의 서로 다른 모드 상에서 동작(모드에 따라 r 다름), 한 번에 최대 18개 활성화 가능
1) 데이터 레지스터(16개)
- 특수 목적 레지스터
r13 : 스택 포인터(sp), 현재 프로세서 모드의 스택 맨 위 주소값을 저장
r14 : 링크 레지스터(lr), 코어가 서브루틴을 호출할 때마다 그 복귀 주소를 저장
r15 : 프로그램 카운터(pc), 프로세서가 읽어들인 다음 명령어의 주소를 저장
※ r13, r14 범용 레지스터로 사용될 수 있기 때문에 이것들은 모드 변경 시 뱅크되어 저장(단, r13은 범용 레지스터 사용하면 위험)
2) 프로그램 상태 레지스터(2개)
- cpsr : 현재의 프로그램 상태 레지스터
- spsr : 이전에 저장된 프로그램 상태 레지스터
3) 레지스터 파일은 프로그래머가 이용할 수 있는 모든 레지스터들을 포함
2.2 CPSR 레지스터(32비트) : 내부 동작을 모니터링하고 제어
1) 구분
- 플래그(Flag) : 상태 플래그 저장
- 상태(Status) : 미래에 사용할 목적으로 예약
- 확장(Extension) : 미래에 사용할 목적으로 예약
- 제어(Control) : 프로세서 모드와 상태, 인터럽트 마스크 비트
2) 추가로 할당된 비트도 있음 ex) Jazelle : 8비트 자바 명령어
2.2.1 프로세서 모드
1) 특권 모드(6개) : cpsr을 완전히 읽고 쓸 수 있는 모드
- abort : 프로세서는 메모리 액세스가 실패했을 경우, abort 모드로 진입
- FIQ, IRQ : 2가지 인터렙트 레벨을 위한 모드
- supervisor : 프로세서에 리셋이 걸렸을 때에 진입하는 모드, 일반적으로 OS 커널이 동작하는 모드
- system : user 모드의 특수 버전, cpsr을 완전히 읽고 쓸 수 있음
- undefined : 프로세서가 정의되지 않은 명령어나 지원되지 않은 명령어를 만났을 때에 진입하는 모드
2) 일반 모드 : 제어 필드만 읽기만 가능, 상태 플래그는 읽고 쓰기가 모두 가능
- user : 프로그램과 어플리케이션을 위해 사용되는 모드
2.2.2 뱅크 레지스터
1) 뱅크레지스터 : 레지스터 파일 내에 있는 37개의 레지스터 중 매번 프로그램에 따라 숨겨져 있는 20개
- user 모드를 제외한 모든 프로세서 모드 : cpsr의 모든 비트를 직접 제어하여 모드 변경 가능
- system 모드를 제외한 모든 모드 : 주요 16개 레지스터의 일부로 포함된 관련 뱅크 레지스터를 가짐
- 뱅크 레지스터는 user 모드 레지스터에 하나씩 대응
- 변경 시, old → new 대체
2) 모드 변경
- 해당 익셉션이나 인터럽트를 발생시키는 하드웨어에 의하거나 cpsr을 직접 제어
- 모드 변경 익셉션 : reset, data abort, prefetch abort, undefined instruction
- 익셉션과 인터럽트 : 현재 작업을 중단시키고 특정 위치로 분기, 이 경우에만 cpsr이 spsr에 저장(직접X)
3) cpsr이 하위 5비트의 영역 차지 : 전원이 코어에 공급되면 이것은 특권 모드인 supervisor 모드에서 시작, 이는 초기화 코드가 다른 모드들을 위한 스택 셋업할 수 있도록 cpsr을 완전 액세스할 수 있기 때문에 매우 유용
2.2.3 프로세서 상태 및 명령어 세트
1) 명령어 세트 종류(3가지) : 서로 섞어서 코딩할 수 없음
- ARM 명령어 세트
- Thumb 명령어 세트
- Jazelle 명령어 세트
2) 프로세서의 상태
- Jazelle J와 Thumb T가 반영 : 둘 다 0이면 ARM 상태를 뜻함
- 전원이 공급되는 순간은 항상 ARM 상태
- cpsr T = 1, J = 0 : Thumb 상태
- cpsr T = 0, J = 1 : Jazelle 상태
- Jazelle(8비트 명령어 실행) : Java 코드의 실행 속도를 높이기 위함, 이것의 하드웨어 일부분은 Java 코드를 지원해야 하고 나머지는 소프트웨어적으로 에뮬레이션됨
2.2.4 인터럽트 마스크
- 특정 인터럽트 소스가 프로세서에게 인터럽트 요청을 할 수 없도록 하기 위해 필요
- cpsr 인터럽트 마스크 비트 : 6번(F : FIQ), 7번(I - IRQ)
2.2.5 상태 플래그
1) 비교 명령어에 의해서 업데이트되거나 산술 명령어의 뒤에 s가 붙은 경우에 산술 처리 결과 업데이트됨
2) DSP 확장 명령어를 포함하고 있는 프로세서 코어의 경우, Q비트 : 오버플로우나 포화 발생 검사(하드웨어에 의해서만 1로, cpsr에 직접 값을 써야 0으로 설정 가능)
3) 종류
- Q(Saturation) : 오버플로우나 포화가 발생하는 경우
- V(oVerflow) : signed 오버플로우가 발생하는 경우
- C(Carry) : unsigned 캐리가 발생하는 경우
- Z(Zero) : 결과가 0인 경우, 종종 동일함을 표시하기 위해 사용
- N(Negative) : 결과의 31번째 비트가 1인 경우
2.2.6 조건부 실행 : 어떤 명령어를 실행할 지의 여부를 제어할 수 있음
1) 조건인자 : 코어가 대부분 명령어들의 실행할 지의 여부 결정하는데 사용
- cpsr의 상태 플래그와 비교(동일하면 명령어 실행, 아니면 명령어 무시)
- 명령어 니모닉 바로 뒤에 추가되어 명령어와 함께 인코드(만약 조건 인자가 없다면 AL(항상 실행)로 설정)
2.3 파이프라인
1) 파이프라인의 구조
- Fetch(메모리에서 명령어를 로드), Decode(실행한 명령어를 해독), Execute(명령어를 처리하고 그 결과를 레지스터에 저장)
- 코어가 매 사이클마다 하나의 명령어를 실행시킬 수 있도록 해줌
2) 파이프 라인 길이 ↑ : 각 단계에서 처리 가능한 일의 양 ↓(성능↑. but, 지연 ↑) → 명령어 스케줄링을 이용한 코드 작성 필요
3) 파이프라인 길이 증가 제품군
- ARM9(파이프라인 5단계) : Fetch → Decode → Execute → Memory → Write
- ARM10(파이프라인 6단계) : Fetch → Issue → Decode → Execute → Memory → Write
※ ARM7을 위해 작성된 코드는 ARM9이나 ARM10에서도 그대로 실행 가능
2.3.1 파이프라인 동작 특성
1) ARM7
- 어떤 명령어가 실행 단계로 넘어오기 전까지는 그 명령어를 처리하지 않음(실행 단계를 완료하고 나서야 해당 명령어가 활성화, ARM 파이프라인 공통)
- PC는 실행되고 있는 명령어의 주소보다 2단계(8) 앞선 주소를 가리킴
- Thumb 상태에서는 프로세서의 PC값 == 명령어 주소 + 4
2) 특징
- 분기 명령어로 실행되거나 pc값을 직접 수정하여 분기하는 경우에는 파이프라인이 깨짐
- ARM10은 분기 예측 방식 사용: 명령어를 실해하기 전에 가능한 분기를 미리 예측하여 새로운 분기 주소를 로드 → 파이프라인이 깨지는 상황 감소
- 실행 단계에 있는 명령어는 인터럽트가 발생하더라도 그 과정을 완료
2.4 ARM 프로세서에서의 익셉션
1) 벡터 테이블
- 익셉션이나 인터럽트가 발생하였을 때, 프로세서가 pc에 넣는 특정 메모리 주소값들이 포함된 특정 주소 영역
- 특정 루틴으로 분기하는 명령어들 존재
- 메모리맵 주소 0x00000000는 벡터 테이블들을 위해 32비트 워드값들로 예약(0xffff0000에서 시작도 가능)
2) 익셉션 테이블 엔트리
- Reset Vector : 전원이 공급될 때 프로세서에 의해 처음으로 실행되는 명령어의 위치
- Undefined Instruction vector : 프로세서가 명령어를 분석할 수 없을 때에 사용
- Software Interrupt vector : SWI 명령어를 실행시켰을 때에 호출
- Prefetch Abort vector : 프로세서가 정확한 접근권한 없이 어던 주소에서 명령어를 읽어들이려고 시도할 때 발생
- Data Abort vector : 명렁어가 정확한 접근권한 없이 데이터 메모리를 액세스하려고 시도할 때 발생
- Interrupt Request vector : 프로세서의 현재 흐름을 중단시키기 위해 외부 하드웨어 장치에 의해 사용
- Fast Interrupt Request vector : IRQ와 유사하나 더욱 빠른 응답 시간을 요구하는 하드웨어를 위해 할당
2.5 캐시 메모리와 코프로세서
- 하드웨어의 확장은 특정 어플리케이션을 다루는 데 있어서 유연성을 제공하기 위해 설계
- 각 제품군은 확장된 부분이 서로 다름
2.5.1 캐시와 TCM
1) 캐시 : 성능 향상시켜 주지만 예측성 감소 시킴(그래서 이것을 이용한 성능의 향상 필요로 하지 않음)
- 폰노이만 형태 : 명령어와 데이틀 통합 캐시에 함께 저장
- 하버드 형태 : 명령어와 데이터를 위한 캐시 분리
2) TCM : 코어 가까이에 위치한 빠른 SRAM으로, 명령어나 데이터를 읽어들이는 데 필요한 클럭 사이클(확정적 동작에 필요한 실시간 알고리즘을 위해 필수적)을 보장 → 코드 실행의 확정성(deterministic) 향상
3) 로직 제어 장치(logic and control) : 메모리 시스템을 AMBA 버스에 연결해주는 논리 장치
2.5.2 메모리 관리
1) 일반 관리 장치(no extensions providing no protection)
- 비보호 메모리(nonprotected memory): 고정적, 유연성 거의 없음
2) 메모리 보호 장치(MPU) : 제한된 수의 메모리 영역을 사용한 간단한 시스템에 적용
3) 메모리 관리 장치(MMU) : ARM에서 사용되는 가장 복잡한 메모리 관리 장치
- 변환 테이블(접근권한, 가상 메모리 매핑 기능) 세트 사용 : 세밀한 제어 가능
- 멀티태스킹을 지원하는 복잡한 플랫폼 OS를 위해 설계
2.5.3 코프로세서
- ARM 프로세서에 부착하여 사용
- 로드-스토어 타입의 인터페이스를 제공해주는 전용 ARM 명령어를 통해 액세스 가능
- 새로운 특정한 명령어들을 제공하여 명령어 세트를 확장 가능(새로운 명령어들은 디코드 단계(파이프라인)에서 처리)
2.6 아키텍처 버전
- 모든 ARM 프로세서는 특정 ISA(Instruction Set Architecture)로 구현
2.6.1 명명법
1) ARM 명명법
ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
x : 제품군
y : MMU/MPU
z : 캐시
T : Thumb 16비트 디코더
D : JTAG 디버그
M : 고속 곱셈기
I : EmbeddedICE macrocell
E : DSP 확장 명령어
J : Jazelle
F : VFP 장치
S : synthesizable 버전
2) 추가 사항
- ARM7TDMI 이후에 나온 모든 ARM 코어에는 자동적으로 TDMI 특징 포함
- 프로세서 제품군(family)은 동일한 하드웨어 특징을 보이는 프로세서 집합을 의미
- JTAG : 프로세서 코어와 테스트 장비간에 디버깅 정보를 전송하기 위해 ARM에서 적용한 시리얼 프로토콜
- EmbeddedICE macrocell : 프로세서에 내장되어 있는 디버그 하드웨어 장치, breakpoint와 watchpoint 설정 가능
- synthesizable : 프로세서 코어가 EDA 툴에 의해 쉽게 사용 가능한 형식, 컴파일될 수 있는 소스 코드로 공급된다는 것을 의미
2.6.2 아키텍처의 발전
- 1~v6
- ARMv4(ARM7TDMI)에서 Thumb 명령어 세트 지원
2.7 ARM 프로세서의 버전별 특징
- 제조 환경은 주파수(MHz)와 전력 소모(watts)에 직접적으로 영향을 주기 때문
2.7.1 ARM7 군
1) 특징
- 폰노이만 아키텍쳐
- 3단 파이프라인
- ARMv4T 명령어 세트
2) 종류
- ARM7TDMI : 가장 인기, Thumb 명령어 세트, 빠른 곱셈 명령어, EmbeddedICE 디버그 기술 포함
- ARM720T : 리눅스나 마이크로소프트 임베디드 OS 사용 가능
- ARM7EJ-S : 5단 파이프라인, MPU 내장X
2.7.2 ARM9 군
1) 특징
- 하버드 아키텍처
- 5단계 파이프라인
2) 종류
- ARM940T : MMU 내장, 가상 메모리의 지원이 필요한 운영체제를 위해 사용
- ARM9E-s : synthesizable, ETM(Embedded Trace Macrocell)
- ARM946E-S : TCMㆍ캐시(이 2개는 크기 조절 가능)ㆍMPU 포함, 확정적인 실시간 응답성을 요구하는데 임베디드 제어 어플리케이션에서 사용
- ARM966E : MPU와 캐시를 가지고 있지 않음, TCM은 조절 가능
- ARM926EJ-S : 3G 폰ㆍPDA와 같은 작고 휴대 가능한 java를 지원하는 장치를 위해 설계
2.7.3 ARM10 군
1) 특징
- 6단계 파이프라인
- VFP(Vector Floating-Point) 장치 지원 → 7번째 단계 추가 가능
2) 종류
- ARM1020E : 듀얼 64비트 버스 인터페이스를 지원
- ARM1026EJ-S : ARM926EJ-S와 유사하지만 MPU와 MMU 보유
2.7.4 ARM11 군
1) 종류
- ARM1136J-S : 고성능 저전력의 어플리케이션을 위해 설계, 8단 파이프라인, ARMv6(미디어 처리를 향상시킬 수 있는 SIMD(Single Instruction Multiple Data) 확장 명령어 포함) 명렁어
- ARM1136JF-S : ARM1136J-S에 VFP 장치 포함
2.7.5 이외의 특별한 제품군
- StrongARM : 저전력 소모와 고성능을 필요로 하는 PDA와 어플리케이션에 좋음, 하버드 아키텍처, 5단 파이프라인, Thumb 명령어 지원 안함
- XScale : 1GHz 속도(책 저자 집필 시점), v5TE 명령어, 하버드 아키텍처, MMU 내장
- SC100 : 저전력 보안 장치위해 설계, ARM7TDMI 기반, MPU 내장, 스마트카드 어플리케이션에 응용 가능
- 하버드 아키텍처 : 데이토용 버스와 명령어용 버스가 분리
2.1 범용 레지스터(32비트) : 데이터나 주소 저장, 프로세서는 7개의 서로 다른 모드 상에서 동작(모드에 따라 r 다름), 한 번에 최대 18개 활성화 가능
1) 데이터 레지스터(16개)
- 특수 목적 레지스터
r13 : 스택 포인터(sp), 현재 프로세서 모드의 스택 맨 위 주소값을 저장
r14 : 링크 레지스터(lr), 코어가 서브루틴을 호출할 때마다 그 복귀 주소를 저장
r15 : 프로그램 카운터(pc), 프로세서가 읽어들인 다음 명령어의 주소를 저장
※ r13, r14 범용 레지스터로 사용될 수 있기 때문에 이것들은 모드 변경 시 뱅크되어 저장(단, r13은 범용 레지스터 사용하면 위험)
2) 프로그램 상태 레지스터(2개)
- cpsr : 현재의 프로그램 상태 레지스터
- spsr : 이전에 저장된 프로그램 상태 레지스터
3) 레지스터 파일은 프로그래머가 이용할 수 있는 모든 레지스터들을 포함
2.2 CPSR 레지스터(32비트) : 내부 동작을 모니터링하고 제어
1) 구분
- 플래그(Flag) : 상태 플래그 저장
- 상태(Status) : 미래에 사용할 목적으로 예약
- 확장(Extension) : 미래에 사용할 목적으로 예약
- 제어(Control) : 프로세서 모드와 상태, 인터럽트 마스크 비트
2) 추가로 할당된 비트도 있음 ex) Jazelle : 8비트 자바 명령어
2.2.1 프로세서 모드
1) 특권 모드(6개) : cpsr을 완전히 읽고 쓸 수 있는 모드
- abort : 프로세서는 메모리 액세스가 실패했을 경우, abort 모드로 진입
- FIQ, IRQ : 2가지 인터렙트 레벨을 위한 모드
- supervisor : 프로세서에 리셋이 걸렸을 때에 진입하는 모드, 일반적으로 OS 커널이 동작하는 모드
- system : user 모드의 특수 버전, cpsr을 완전히 읽고 쓸 수 있음
- undefined : 프로세서가 정의되지 않은 명령어나 지원되지 않은 명령어를 만났을 때에 진입하는 모드
2) 일반 모드 : 제어 필드만 읽기만 가능, 상태 플래그는 읽고 쓰기가 모두 가능
- user : 프로그램과 어플리케이션을 위해 사용되는 모드
2.2.2 뱅크 레지스터
1) 뱅크레지스터 : 레지스터 파일 내에 있는 37개의 레지스터 중 매번 프로그램에 따라 숨겨져 있는 20개
- user 모드를 제외한 모든 프로세서 모드 : cpsr의 모든 비트를 직접 제어하여 모드 변경 가능
- system 모드를 제외한 모든 모드 : 주요 16개 레지스터의 일부로 포함된 관련 뱅크 레지스터를 가짐
- 뱅크 레지스터는 user 모드 레지스터에 하나씩 대응
- 변경 시, old → new 대체
2) 모드 변경
- 해당 익셉션이나 인터럽트를 발생시키는 하드웨어에 의하거나 cpsr을 직접 제어
- 모드 변경 익셉션 : reset, data abort, prefetch abort, undefined instruction
- 익셉션과 인터럽트 : 현재 작업을 중단시키고 특정 위치로 분기, 이 경우에만 cpsr이 spsr에 저장(직접X)
3) cpsr이 하위 5비트의 영역 차지 : 전원이 코어에 공급되면 이것은 특권 모드인 supervisor 모드에서 시작, 이는 초기화 코드가 다른 모드들을 위한 스택 셋업할 수 있도록 cpsr을 완전 액세스할 수 있기 때문에 매우 유용
2.2.3 프로세서 상태 및 명령어 세트
1) 명령어 세트 종류(3가지) : 서로 섞어서 코딩할 수 없음
- ARM 명령어 세트
- Thumb 명령어 세트
- Jazelle 명령어 세트
2) 프로세서의 상태
- Jazelle J와 Thumb T가 반영 : 둘 다 0이면 ARM 상태를 뜻함
- 전원이 공급되는 순간은 항상 ARM 상태
- cpsr T = 1, J = 0 : Thumb 상태
- cpsr T = 0, J = 1 : Jazelle 상태
- Jazelle(8비트 명령어 실행) : Java 코드의 실행 속도를 높이기 위함, 이것의 하드웨어 일부분은 Java 코드를 지원해야 하고 나머지는 소프트웨어적으로 에뮬레이션됨
2.2.4 인터럽트 마스크
- 특정 인터럽트 소스가 프로세서에게 인터럽트 요청을 할 수 없도록 하기 위해 필요
- cpsr 인터럽트 마스크 비트 : 6번(F : FIQ), 7번(I - IRQ)
2.2.5 상태 플래그
1) 비교 명령어에 의해서 업데이트되거나 산술 명령어의 뒤에 s가 붙은 경우에 산술 처리 결과 업데이트됨
2) DSP 확장 명령어를 포함하고 있는 프로세서 코어의 경우, Q비트 : 오버플로우나 포화 발생 검사(하드웨어에 의해서만 1로, cpsr에 직접 값을 써야 0으로 설정 가능)
3) 종류
- Q(Saturation) : 오버플로우나 포화가 발생하는 경우
- V(oVerflow) : signed 오버플로우가 발생하는 경우
- C(Carry) : unsigned 캐리가 발생하는 경우
- Z(Zero) : 결과가 0인 경우, 종종 동일함을 표시하기 위해 사용
- N(Negative) : 결과의 31번째 비트가 1인 경우
2.2.6 조건부 실행 : 어떤 명령어를 실행할 지의 여부를 제어할 수 있음
1) 조건인자 : 코어가 대부분 명령어들의 실행할 지의 여부 결정하는데 사용
- cpsr의 상태 플래그와 비교(동일하면 명령어 실행, 아니면 명령어 무시)
- 명령어 니모닉 바로 뒤에 추가되어 명령어와 함께 인코드(만약 조건 인자가 없다면 AL(항상 실행)로 설정)
2.3 파이프라인
1) 파이프라인의 구조
- Fetch(메모리에서 명령어를 로드), Decode(실행한 명령어를 해독), Execute(명령어를 처리하고 그 결과를 레지스터에 저장)
- 코어가 매 사이클마다 하나의 명령어를 실행시킬 수 있도록 해줌
2) 파이프 라인 길이 ↑ : 각 단계에서 처리 가능한 일의 양 ↓(성능↑. but, 지연 ↑) → 명령어 스케줄링을 이용한 코드 작성 필요
3) 파이프라인 길이 증가 제품군
- ARM9(파이프라인 5단계) : Fetch → Decode → Execute → Memory → Write
- ARM10(파이프라인 6단계) : Fetch → Issue → Decode → Execute → Memory → Write
※ ARM7을 위해 작성된 코드는 ARM9이나 ARM10에서도 그대로 실행 가능
2.3.1 파이프라인 동작 특성
1) ARM7
- 어떤 명령어가 실행 단계로 넘어오기 전까지는 그 명령어를 처리하지 않음(실행 단계를 완료하고 나서야 해당 명령어가 활성화, ARM 파이프라인 공통)
- PC는 실행되고 있는 명령어의 주소보다 2단계(8) 앞선 주소를 가리킴
- Thumb 상태에서는 프로세서의 PC값 == 명령어 주소 + 4
2) 특징
- 분기 명령어로 실행되거나 pc값을 직접 수정하여 분기하는 경우에는 파이프라인이 깨짐
- ARM10은 분기 예측 방식 사용: 명령어를 실해하기 전에 가능한 분기를 미리 예측하여 새로운 분기 주소를 로드 → 파이프라인이 깨지는 상황 감소
- 실행 단계에 있는 명령어는 인터럽트가 발생하더라도 그 과정을 완료
2.4 ARM 프로세서에서의 익셉션
1) 벡터 테이블
- 익셉션이나 인터럽트가 발생하였을 때, 프로세서가 pc에 넣는 특정 메모리 주소값들이 포함된 특정 주소 영역
- 특정 루틴으로 분기하는 명령어들 존재
- 메모리맵 주소 0x00000000는 벡터 테이블들을 위해 32비트 워드값들로 예약(0xffff0000에서 시작도 가능)
2) 익셉션 테이블 엔트리
- Reset Vector : 전원이 공급될 때 프로세서에 의해 처음으로 실행되는 명령어의 위치
- Undefined Instruction vector : 프로세서가 명령어를 분석할 수 없을 때에 사용
- Software Interrupt vector : SWI 명령어를 실행시켰을 때에 호출
- Prefetch Abort vector : 프로세서가 정확한 접근권한 없이 어던 주소에서 명령어를 읽어들이려고 시도할 때 발생
- Data Abort vector : 명렁어가 정확한 접근권한 없이 데이터 메모리를 액세스하려고 시도할 때 발생
- Interrupt Request vector : 프로세서의 현재 흐름을 중단시키기 위해 외부 하드웨어 장치에 의해 사용
- Fast Interrupt Request vector : IRQ와 유사하나 더욱 빠른 응답 시간을 요구하는 하드웨어를 위해 할당
2.5 캐시 메모리와 코프로세서
- 하드웨어의 확장은 특정 어플리케이션을 다루는 데 있어서 유연성을 제공하기 위해 설계
- 각 제품군은 확장된 부분이 서로 다름
2.5.1 캐시와 TCM
1) 캐시 : 성능 향상시켜 주지만 예측성 감소 시킴(그래서 이것을 이용한 성능의 향상 필요로 하지 않음)
- 폰노이만 형태 : 명령어와 데이틀 통합 캐시에 함께 저장
- 하버드 형태 : 명령어와 데이터를 위한 캐시 분리
2) TCM : 코어 가까이에 위치한 빠른 SRAM으로, 명령어나 데이터를 읽어들이는 데 필요한 클럭 사이클(확정적 동작에 필요한 실시간 알고리즘을 위해 필수적)을 보장 → 코드 실행의 확정성(deterministic) 향상
3) 로직 제어 장치(logic and control) : 메모리 시스템을 AMBA 버스에 연결해주는 논리 장치
2.5.2 메모리 관리
1) 일반 관리 장치(no extensions providing no protection)
- 비보호 메모리(nonprotected memory): 고정적, 유연성 거의 없음
2) 메모리 보호 장치(MPU) : 제한된 수의 메모리 영역을 사용한 간단한 시스템에 적용
3) 메모리 관리 장치(MMU) : ARM에서 사용되는 가장 복잡한 메모리 관리 장치
- 변환 테이블(접근권한, 가상 메모리 매핑 기능) 세트 사용 : 세밀한 제어 가능
- 멀티태스킹을 지원하는 복잡한 플랫폼 OS를 위해 설계
2.5.3 코프로세서
- ARM 프로세서에 부착하여 사용
- 로드-스토어 타입의 인터페이스를 제공해주는 전용 ARM 명령어를 통해 액세스 가능
- 새로운 특정한 명령어들을 제공하여 명령어 세트를 확장 가능(새로운 명령어들은 디코드 단계(파이프라인)에서 처리)
2.6 아키텍처 버전
- 모든 ARM 프로세서는 특정 ISA(Instruction Set Architecture)로 구현
2.6.1 명명법
1) ARM 명명법
ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
x : 제품군
y : MMU/MPU
z : 캐시
T : Thumb 16비트 디코더
D : JTAG 디버그
M : 고속 곱셈기
I : EmbeddedICE macrocell
E : DSP 확장 명령어
J : Jazelle
F : VFP 장치
S : synthesizable 버전
2) 추가 사항
- ARM7TDMI 이후에 나온 모든 ARM 코어에는 자동적으로 TDMI 특징 포함
- 프로세서 제품군(family)은 동일한 하드웨어 특징을 보이는 프로세서 집합을 의미
- JTAG : 프로세서 코어와 테스트 장비간에 디버깅 정보를 전송하기 위해 ARM에서 적용한 시리얼 프로토콜
- EmbeddedICE macrocell : 프로세서에 내장되어 있는 디버그 하드웨어 장치, breakpoint와 watchpoint 설정 가능
- synthesizable : 프로세서 코어가 EDA 툴에 의해 쉽게 사용 가능한 형식, 컴파일될 수 있는 소스 코드로 공급된다는 것을 의미
2.6.2 아키텍처의 발전
- 1~v6
- ARMv4(ARM7TDMI)에서 Thumb 명령어 세트 지원
2.7 ARM 프로세서의 버전별 특징
- 제조 환경은 주파수(MHz)와 전력 소모(watts)에 직접적으로 영향을 주기 때문
2.7.1 ARM7 군
1) 특징
- 폰노이만 아키텍쳐
- 3단 파이프라인
- ARMv4T 명령어 세트
2) 종류
- ARM7TDMI : 가장 인기, Thumb 명령어 세트, 빠른 곱셈 명령어, EmbeddedICE 디버그 기술 포함
- ARM720T : 리눅스나 마이크로소프트 임베디드 OS 사용 가능
- ARM7EJ-S : 5단 파이프라인, MPU 내장X
2.7.2 ARM9 군
1) 특징
- 하버드 아키텍처
- 5단계 파이프라인
2) 종류
- ARM940T : MMU 내장, 가상 메모리의 지원이 필요한 운영체제를 위해 사용
- ARM9E-s : synthesizable, ETM(Embedded Trace Macrocell)
- ARM946E-S : TCMㆍ캐시(이 2개는 크기 조절 가능)ㆍMPU 포함, 확정적인 실시간 응답성을 요구하는데 임베디드 제어 어플리케이션에서 사용
- ARM966E : MPU와 캐시를 가지고 있지 않음, TCM은 조절 가능
- ARM926EJ-S : 3G 폰ㆍPDA와 같은 작고 휴대 가능한 java를 지원하는 장치를 위해 설계
2.7.3 ARM10 군
1) 특징
- 6단계 파이프라인
- VFP(Vector Floating-Point) 장치 지원 → 7번째 단계 추가 가능
2) 종류
- ARM1020E : 듀얼 64비트 버스 인터페이스를 지원
- ARM1026EJ-S : ARM926EJ-S와 유사하지만 MPU와 MMU 보유
2.7.4 ARM11 군
1) 종류
- ARM1136J-S : 고성능 저전력의 어플리케이션을 위해 설계, 8단 파이프라인, ARMv6(미디어 처리를 향상시킬 수 있는 SIMD(Single Instruction Multiple Data) 확장 명령어 포함) 명렁어
- ARM1136JF-S : ARM1136J-S에 VFP 장치 포함
2.7.5 이외의 특별한 제품군
- StrongARM : 저전력 소모와 고성능을 필요로 하는 PDA와 어플리케이션에 좋음, 하버드 아키텍처, 5단 파이프라인, Thumb 명령어 지원 안함
- XScale : 1GHz 속도(책 저자 집필 시점), v5TE 명령어, 하버드 아키텍처, MMU 내장
- SC100 : 저전력 보안 장치위해 설계, ARM7TDMI 기반, MPU 내장, 스마트카드 어플리케이션에 응용 가능