블로그 이미지
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-22 20:29
1) 캐시의 목적 : 느린 메모리 때문에 발생되는, 프로세서 코어에 가해지는 메모리 액세스 병목 현상(bottleneck)의 감소
2) 쓰기 버퍼
  - 프로세서 코어와 주 메모리 사이에 놓여 있는 매우 작은 FIFO 메모리
  - 주메모리에 쓰는 것과 관련된 느린 쓰기 시간으로부터 프로세서 코어와 캐시 메모리를 자유롭게 하는데 있음.
3) 캐시의 단점 : 프로그램의 실행 시간을 결정하기가 어려워진다.

12.1 메모리 계층 구조와 캐시 메모리
  1) 메모리 계층 구조 : 주변의 기술에 의존해 있기 때문에 아키텍처 설계에 많이 의존
    - 칩 : 프로세서 코어 내 레지스터 파일
    - 보드 : 주메모리(TCM, SRAM, DRAM, 플래시와 다른 보드 레벨 비휘발성 메모리)
    - 디바이스 : 보조 기억 장치(디스크, 테이프, 네트워크 저장 장치)
  2) 캐시 메모리
    - 레벨(L1) 캐시(기본 캐시) : 가장 낮은 레벨에서부터 코드와 데이터를 임시로 저장하는 고속의 온칩 메모리
    - 레벨(L2) 캐시(보조 캐시) : L1 캐시와 더 느린 메모리 사이에 위치
    - 쓰기 버퍼 : 캐시로부터 주메모리에 쓰기를 지원하는 매우 작은 FIFO 버퍼
    - 캐시 라인 : 주메모리와 캐시의 관계에서 더 느린 주메모리 사이에 전송하는 데이터의 작은 블록

12.1.1 캐시와 메모리 관리 장치
  1) 논리 캐시(가상 캐시)
    - 가상 주소 공간 안에 데이터를 저장
    - 프로세서와 MMU 사이에 위치
    - StrongARM, XScale, 제품군 ARM7 ~ ARM10
  2) 물리 캐시
    - 물리 주소를 사용해서 메모리에 저장
    - MMU와 주메모리 사이에 위치
    - 프로세서가 메모리를 액세스하기 위해서는 MMU는 먼저 가상 주소를 물리 주소로 변경해야 함
    - ARM11 제품군
  3) 캐시의 의한 성능 향상
    - 가능 이유 : 컴퓨터 프로그램이 랜덤하지 않은 방식으로 실행되기 때문(예측 가능)
    - 참조의 지역성 : 컴퓨터 소프트웨어 프로그램은 데이터 메모리의 집약되어 있는 부분에서 작은 코드들이 반복적으로 실행
    - 시간과 공간에서의 반복적인 국부적 참조성을 사용 : 시간적 지역성(temporal locality), 공간적 지역성(spatial locality, 주소의 근접성에 의해 참조)

12.2 캐시 아키텍처
  1) 폰노이만 아키텍처 : 통합 캐시(uified cache)
  2) 하버드 아키텍처 : 분할 캐시(split cache)
  3) 캐시의 주요 요소
    - 캐시 컨트롤러 : 캐시 메모리의 일부분을 선택하기 위해 메모리를 요청하는 동안 프로세서에 의해 이슈되는 주소의 다른 부분을 사용
    - 캐시 메모리 : 캐시 라인이라는 장치 안에서 액세스되는 전용 메모리 열

12.2.1 캐시 메모리의 기본 아키텍처
  1) 캐시 라인의 구성
    - 디렉토리 저장소(directory store) : 주메모리에서 캐시 라인으로 복사된 주소를 구분하기 위해서 이용(디렉토리 엔트리는 캐시 태그(cache-tag))
    - 데이터 영역
    - 상태 정보 영역
  2) 캐시의 크기 : 캐시가 주메모리에서 저장할 수 있는 실제 코드나 데이터로 정의(캐시 태그와 상태 비트는 캐시 크기 안에 포함 안됨)
  3) 상태 비트
    - 유효 비트(valid bit) : 캐시 라인이 활성화되어 있음을 표시하기 위한 것
    - 더티 비트(dirty bit) : 캐시 라인이 주메모리 안에 저장되어 있는 값과 다른 데이터를 포함하고 있는지 아닌지를 결정

12.2.2 캐시 컨트롤러의 기본 동작
  1) 캐시 컨트롤러 : 주메모리에서 캐시 메모리로 코드나 데이터를 자동으로 복사해주는 하드웨어
    - 요청 처리 : 요청한 주소를 태그(tag), 세트 인덱스(set index), 데이터 인덱스(data index)를 나누어서 처리
    - 처리 과정
      ① 필요로 하는 캐시 메모리의 캐시 라인을 찾기 위해 세트 인덱스 이용
      ② 유효 비트 확인, 요청된 주소의 태그 영역과 캐시 태그 비교 → 모두 성공 시 캐시 적중(hit), 둘 중에 하나가 실패할 경우 캐시 미스(miss)
      ③ 캐시 미스시, 컨틀로러는 주메모리에서 모든 캐시 라인을 캐시 메모리로 복사하고 요청된 코드나 데이터를 프로세서에 보냄
        ※ 캐시 라인 채우기(cache line fill) : 캐시 라인을 주메모리에서 캐시 메모리로 복사하는 것
      ④ 캐시 적중시, 컨트롤러는 캐시 메모리에서 프로세서로 직접 코드 또는 데이터를 공급

12.2.3 캐시와 주메모리 사이의 관계
  1) 데이터 스트림 : 캐시 라인을 채우는 동안 캐시 컨트롤러가 이것을 캐시에 복사하면서 동시에 코어에 데이터를 로딩할 수 있는 것
  2) eviction : 캐시 미스가 발생하여 기존의 캐시 라인을 제거하는 과정
  3) 스래싱 : 캐시 메모리 안에 동일한 위치에 대한 소프트웨어 병목 현상

12.2.4 세트 연상
  1) 세트 연상 : 세트 인덱스가 가리키는 캐시 라인의 세트
  2) 세트 연상 증가
    - 연상이 증가할때마다 스래싱의 가능성이 감소, 대신 지원하는 하드웨어의 복잡도도 증가
    - 완전 연상 캐시(fully associative cache) : 캐시의 세트 연상을 최대화하여 설계된 캐시
    - CAM(content addressable memory) : 각각의 유효한 캐시 라인 안에 저장되어 있는 캐시 태그와 입력 태그 주소를 비교하는 비교기 세트를 사용 → 더 많은 캐시 태그를 동시에 비교할 수 있으므로 한 세트 안에 포함될 수 있는 캐시 라인의 수를 늘릴 수 있음

12.2.5 쓰기 버퍼 : 프로세서가 주메모리에 쓸 데이터를 임시로 저장하고 있는 작고 빠른 FIFO 메모리 버퍼
  - 실행되는 명령어 수에 대한 주메모리 쓰기 비율에 따라 효과가 달라짐
  - 쓰기 버퍼로 인한 캐시 성능 향상 : 더티 캐시 라인 제거시 주메모리 대신 쓰기 버퍼에 캐시 라인 쓰여짐 → 새로운 캐시 라인 데이터 사용이 빨라짐
  - 엄격한 FIFO 버퍼가 아닐 수 있음 ex) ARM 10 제품군 : 합성(coalescing) 방식 지원

12.2.6 캐시 효율성 측정
  1) 적중률
    - 적중률 = (캐시 적중 수 / 메모리 요청 수) x 100
    - 미스율 = 100 - 적중률
    - 읽거나 쓰거나 또는 둘 다를 측정하는데 사용될 수 있음
  2) 측정 관련된 다른 용어
    - 적중 시간(hit time) : 캐시에서 어떤 메모리 위치를 액세스하는 데 걸리는 시간
    - 미스 패널티 : 주메모리에서 캐시로 캐시 라인을 로드하는 데 걸리는 시간

12.3 캐시 정책
  1) 쓰기 정책(write policy) : 프로세서가 쓰기 동작을 할 때, 데이터를 어디에 저장할지를 결정
  2) 교체 정책(replacement policy) : 캐시 미스가 발생하였을 때, 다음 라인을 채우는 데 사용될 세트 안에 있는 캐시 라인을 선택
  3) 할당 정책(allocation policy) : 캐시 컨트롤러가 캐시 라인을 언제 할당할 지를 결정

12.3.1 쓰기 정책 : 후기입 방식 또는 연속기입 방식
  1) 연속기입 방식
    - 저장할 때 캐시가 적중이라면 캐시와 주메모리에 모두 값을 저장
  2) 후기입 방식
    - 유요한 캐시 데이터 메모리에만 저장하고 주메모리에는 저장하지 않는다.
    - 연속기입 방식보다 성능 우수 ex) 서브루틴에 의해 임시 지역 변수를 반복적으로 사용할 때

12.3.2 캐시 라인 교체 정책
  1) 캐시 라인 교체
    - victim : 교체를 위해 선택된 캐시 라인
    - eviction : victim 캐시 라인을 선택하고 교체하는 과정
  2) 교체 방식
    - 의사 랜덤 방식(pseudorandom) : 캐시 컨트롤러가 무작위로 증가값을 선택하고 이를 victim 카운터에 더해서 증가시킴
    - 라운드 로빈 방식 : 캐시 컨트롤러가 캐시 라인을 할당할 때마다 순차적으로 증가하는 victim 카운터 사용
    - LRU(Least Recently Used) 방식 : 캐시 라인의 사용에 대해 조사해본 다음, 가장 오랜 시간 동안 사용되지 않는 캐시 라인을 다음의 victim으로 선택

12.3.3 캐시 미스시의 할당 정책
  1) 할당 방식
    - read-allocate : 주메모리에 읽는 동안 캐시 라인을 할당
    - read-write-allocate : 메모리를 읽고 쓰기 위해서 캐시 라인을 할당

12.4 코프로세서 15와 캐시
  - CP15:c7(+ c5, c6, c7, c10, c13, c14): 쓰기만 가능, 캐시를 클린(clean)하고 플러시(flush)하는데 사용
  - CP15:c7(+ c10) : 드레인 쓰기 버퍼
  - CP15:c9(+ c0) : victim 포인터 베이스 주소를 정의, 캐시 안에서 락(lock)되어 있는 코드 또는 라인수를 결정
  - CP15:c15(+ c0) : 라운드 로빈 교체 정책

12.5 캐시 메모리의 플러시와 클린
  1) 캐시 플러시 : 유효한 캐시 라인 안에 있는 유효 비트를 0으로 클리어시키는 것
  2) 캐시 클린 : 캐시로부터의 더티 캐시 라인의 값을 강제로 주메모리에 쓴 다음, 캐시 라인 안에 있는 더티 비트를 0으로 초기화하는 것 → 캐시된 메모리와 주메모리 사이의 일관성 재정립
  3) 시스템의 메모리 설정을 변경하거나 불할 캐시 안에서 자체 수정 코드를 실행하기 전에 클린이나 플러시를 해줄 필요가 있다.

12.5.1 ARM 캐시 코어 플러시하기

12.5.2 ARM 캐시 코어 클린하기

12.5.3 D 캐시 클린

12.5.4 WAY 및 세트 인덱스 어드레싱을 사용해서 D 캐시 클린하기

12.5.5 테스트 클린 명령어를 사용해서 D 캐시 클린하기

12.5.6 인텔 XScale SA-110과 인텔 StrongARM 코어에서 D 캐시 클린하기

12.5.7 캐시의 일부분을 클린하고 플러시하기

12.6 캐시 락다운 : 프로그램이 시간에 민감한 코드와 데이터를 캐시 메모리에 로드하고, 이것을 eviction에서 면제되었음을 표시하는 것
  1) 목적 : 캐시 미스 문제를 피하기 위함
  2) 장단점
    - 장점 : 빠른 시스템 반응 제공
    - 단점 : 사용한 가능한 캐시 크기가 감소
  3) 캐시 안에서 락을 해주어야 하는 것들
    - 벡터 인터럽트 테이블
    - 인터럽트 서비스 루틴
    - 시스템이 배타적으로 사용하는 크리티컬한 알고리즘
    - 자주 사용되는 전역변수들
  4) 교체에서는 면제가 되지만 플러시에서는 면제가 안되어 캐시 메모리로 사용이 안되게 됨 → 캐시 락다운 루틴은 락다운 정보가 복원될 수 있도록 리턴이 필요

12.6.1 캐시 안에서 코드와 데이터 락하기

12.6.2 WAY 인덱스를 증가시켜 캐시 락하기

12.6.3 락비트를 사용하여 캐시 락하기

12.6.4 인텔 XScale SA-110에서 캐시 라인 락하기

12.7 캐시와 소프트웨어 성능
  1) 메모리 매핑된 주변 장치들은 캐시나 쓰기 버퍼를 사용하지 않도록 설정하는 것이 좋다.
  2) 자주 액세스하는 데이터는 메모리 안에 연속적으로 저장하려고 노력해야 한다.
  3) 코드 루틴을 작게 유지하고 관련된 데이터를 가까이에 함께 묶어두는 것이 좋다.
  4) 캐시를 효과적으로 활용하는 코드를 작성하는 것보다 시스템의 성능에 더 많은 영향을 끼치는 다른 요소들도 있다.
posted by lepoussin
- 폰노이만 아키텍처 : 데이터용 버스와 명령어용 버스가 통합
- 하버드 아키텍처 : 데이토용 버스와 명령어용 버스가 분리

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
1.1 RISC의 특징
  1) RISC
    - 매우 빠른 속도로 한 클럭 안에 실행될 수 있는 간결하면서도 막강한 명령어들을 가지고 있는 아키텍처
    - 하드웨어에 의해 수행되는 명령어들의 복잡도를 줄이는 것이 목표(S/W의 유연성과 복잡성 감소)
    - 컴파일러에 더욱 의존함
  2) 설계 방식
    - 명령어 : 상대적으로 적은 수의 명령어군, 일정한 길이 가짐
    - 파이프라인 : 병렬로 실행될 수 있는 작은 단계로 쪼개져 실행
    - 레지스터 : 거대한 레지스터군
    - Load-Store 아키텍쳐 : 레지스터 활용하여 메모리 액세스 감소
  3) 더욱 단순화되어 더 빠른 클럭으로 동작

1.2 ARM 프로세서의 특징
  - 배터리 전력 요구
  - 코드의 고집적도 : 비용이나 물리적인 크기의 제약으로 제한된 메모리를 가지고 있기 때문
  - 속도가 느린 저가격의 메모리 소자 사용
  - 프로세서 내분에 하드웨어 디버그 기술 포함
  - 순수한 RISC 아키텍처를 채택하고 있지는 않음(임베디드 시스템에 국한되어 있기 때문) : 속도가 아닌 전체적으로 효율적인 시스템 성능 및 전력 소모에 근원

1.2.1 임베디드 시스템을 위한 명령어 세트
  1) 가변 사이클로 실행되는 명령어
  2) 복잡한 명령어 처리를 위한 인라인 배럴 시프터(Inline Barrel Shifter) : 명령어에 의해 사용되기 전에 그 입력 레지스터 중의 하나를 미리 처리
  3) 16비트 Thumb 명령어 : 16비트 or 32비트 명령어로 실행
  4) 조건부 실행
  5) DSP 확장 명령어 : 빠른 16x16비트의 곱셈 처리를 지원하기 위해 디지털 신호 처리(DSP) 확장 명령어 추가
 
1.3 ARM 하드웨어 임베디드 시스템 아키텍쳐
  - ARM 프로세서 : 임베디드 디바이스 제어, 원하는 동작 특성에 맞게 선택하여 사용
  - 컨트롤러 : 주요 기능을 담담하는 블록(인터럽트 컨트롤러, 메모리 컨트롤러 등)
  - 주변 장치 : 칩 외부로 입출력 기능 제공
  - 버스 : 주변 장치간의 통신 담당

1.3.1 ARM 버스 기술 : 칩 내부 버스 사용
  1) 종류
    - 버스 마스터 : 다른 디바이스로 데이터를 전송할 수 있는 논리 장치
    - 버스 슬레이브 : 버스 마스터로부터 전송 요청이 있을 때에만 동작
  2) 버스 아키텍처 구성
    ① 전기적인 특성과 버스폭(16, 32, 64비트)을 담당하는 물리적인 단계
    ② 프로토콜 처리 단계

1.3.2 AMBA(Advanced Microcontroller Bus Architecture) 버스 프로토콜
  - ASB(ARM System Bus), APB(ARM Peripheral Bus), AHB(ARM High Performance Bus)
  - 사용성과 타임 투 마켓 향상
  - AHB : 한방향에 집중된 멀티플레스 버스 기반, 많은 데이터량 처리(64, 128비트폭 지원), 매우 빠른 속도
    1) 오리지날 AHB : 한번에 하나의 버스 마스터만 활성화
    2) Multi-layer AHB : 동시에 여러 개의 버스 마스터를 활성화 상태로 만듦, 멀티프로세서 시스템에 적합
    3) AHB-lite : AHB 버스의 하위셋으로 하나의 버스 마스터로 한정, 표준 AHB 버스의 모든 특성을 요구하지 않는 디자인
    ※ AHB와 Multi-layer AHB는 동일한 프로토콜을 지원하지만 연결 방식이 서로 다르다.

1.3.3 메모리
  1) 메모리 계층 구조
    - 캐시 : 일반적인 성능 향상은 가져오지만 실시간 시스템 응답에는 도움을 주지 못함(임베디드 포함)
    - 주메모리 : 별도 외부의 칩 사용
    - 보조 기억 장치 : 가장 크고 느린 메모리 형태
  2) 메모리폭 : 한 번에 액세스할 수 있는 비트의 수
    - 전체적인 성능 대 가격비에 직접적인 영향, Thumb 명령어 사용을 통해 개선 가능
  3) 메모리의 종류
    - ROM(Read-Only Memory)
    - 플래시롬
    - DRAM(Dynamic Random Access Memory) : 리프레시 작업을 해주어 데이터를 지속적으로 충전 필요
    - SRAM(Static Random Access Momory) : 리프레시 작업 필요 없음
    - SDRAM(Synchronous Dynamic Random Access Memory) :프로세서 버스와 동기화하여 동작

1.3.4 주변 장치
  1) 메모리 컨트롤러 : 다양한 유형의 메모리를 프로세서 버스에 연결해주는 역할
  2) 인터럽터 컨트롤러 : 주변 장치나 디바이스가 실행되려고 할 때, 프로세서에게 인터럽트를 발생
    - 표준 인터럽터 컨트롤러 : 서비스 요청 시, 그 인터럽트 신호를 프로세서 코어에 보냄, 디바이스 비트맵 레지스터 이용
    - 벡터 인터럽트 컨트롤러(VIC) : 인터럽트에 우선 순위 부여, 핸들러 주소 살펴본 후 높은 우선순위인 경우만 프로세서에게 인터럽트 신호 보냄

1.4 소프트웨어 계층 구조
  1) 초기화 코드 : 리셋 이후 운영체제가 실행될 수 있는 상태로 만들어주는 역할
    - 설정 코드 : OS 이미지를 부팅할 수 있도록 타겟 플랫폼을 설정하는 일 담당
    - 진단 코드 : 순서대로 처리하고 있는지 확인하기 위해 하드웨어 시스템 테스트, 문제 찾음
    - 부팅 코드 : 이미지를 로드한 후 그 이미지로 제어권을 넘겨주는 작업(PC를 이미지의 시작 위치로 이동)
    - 메모리 리매핑 : 전원이 공급되면 초기화 곧바로 실행되어야 하기 때문
  2) 운영체제
    - 시스템 리소스 조직(주변 장치, 메모리 처리 시간 등)
    - RTOS : 이벤트에 대한 반응 시간을 보장해야만 함, hard/soft 구분, 일반적으로 보조 저장 장치 불필요
    - 플랫폼 OS: 규모가 크고 실시간성을 요하지 않는 어플리케이션 관리 → MMU 필요, 보조 저장 장치 필요
  3) 어플리케이션 : 환경 제어(어플리케이션을 스케줄링)
posted by lepoussin