블로그 이미지
No pain, no gain!
lepoussin

Tag

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
  • total
  • today
  • yesterday
11-26 04:02
- 폰노이만 아키텍처 : 데이터용 버스와 명령어용 버스가 통합
- 하버드 아키텍처 : 데이토용 버스와 명령어용 버스가 분리

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 내장, 스마트카드 어플리케이션에 응용 가능
posted by lepoussin