Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

46107
469
422678


[Arm프로세서] 캐시의 검색 방법: 캐시 룩업(Cache Lookup) Arm: Cache and Barrier

캐시를 검색하는 방법을 설명하기 전에 재미있는 상상을 해봅시다. 4G 크기의 메인 메모리를 사용하는 32비트 시스템에서 4G를 모두 처리할 수 있는 캐시가 있다고 가정합시다. 메모리 주소 공간은 범위가 0x~0xffff_fff이고 캐시 데이터를 저장하는 캐시 라인의 사이즈가 128이면 캐시 라인의 갯수는 3천만개가 넘을 것입니다. 계산식은 다음과 같습니다.

225 = 232 / 27 = 0xffff_ffff / 128

그런데 캐시는 SDRAM으로 구현되므로 가격이 비쌉니다. 

만약 3천만개의 캐시 라인으로 구성된 컴퓨터의 가격은 매우 비쌀 겁니다. 실제 상용 CPU의 L1 캐시의 사이즈는 고작 32KB이고 L2/L3 캐시는 메가 바이트 사이즈입니다. 그래서 메인 메모리에 접근하려는 주소가 있으면 캐시를 이를 3가지 부분(태그, 인덱스, 오프셋)으로 나눠서 관리합니다.

캐시에 접근하기 위해 주소를 분류하는 방식

캐시는 주소에서 분류된 태그와 인덱스를 기준으로 주요 기능을 설계합니다. 캐시의 동작 원리를 파악하려면 먼저 캐시에서 주소를 분류하는 체계를 알아야 합니다. 다음 그림을 보면서 주소 분류 쳬계를 더 자세히 알아 봅시다.

 

그림 17.3 캐시에 접근하기 위해 주소를 분류하는 방식

위 그림을 보면 주소가 태그(tag), 인덱스(index), 오프셋(offset)으로 분류돼 있습니다. 

먼저 주소의 가운데 부분에 있는 인덱스를 봅시다. 인덱스는 캐시를 검색하는 동작(캐시 룩업)을 이해하는 첫 걸음입니다. 주소의 가운데 부분에 있는 인덱스를 읽어서 이 값에 해당되는 캐시 라인을 찾기 때문입니다. 여기서 인덱스의 전체 크기는 캐시 라인의 사이즈며 각각 인덱스는 캐시 라인에 매핑됩니다. 한 가지 예를 들까요? 9비트로 구성된 인덱스가 있으면 512 개의 캐시 라인으로 캐시를 구성할 수 있습니다. 

이어서 태그(tag)에 대해서 알아 봅시다. 최상위 비트 중 나머지 부분을 태그(tag)로 활용합니다. 태그(tag)는 인덱스로 찾은 캐시 라인에 찾고자 하는 값이 있는지 확인하는 용도로 사용됩니다. 수 많은 주소 값이 같은 인덱스를 가질 것이니 태그를 활용한 확인 작업이 필요합니다.

오프셋은 캐시 라인에서 원하는 데이터를 가리키는데 사용됩니다. 예를 들어 64 바이트 캐시 라인인 경우 6비트 만큼이 오프셋 영역이 됩니다. 
캐시의 동작 원리를 파악하려면 다음과 같은 사실을 먼저 알아야 합니다.

    “주소를 세 부분으로 나눠서 캐시 라인에 접근한다.”

여기서 한 가지 의문이 생깁니다.

    “인덱스를 가운데 영역, 태그를 최상위 영역으로 선택한 이유는 무엇일까?” 

실제 주소의 인덱스를 기준 삼아 캐시 라인의 인덱스를 매핑할 때 최상위 주소 근처의 숫자는 자주 바뀌지 않기 때문입니다. 그렇다면 수 많은 다른 메모리 주소가 같은 인덱스를 갖고 있어 충돌이 일어나 캐시의 성능이 저하됩니다.


#Reference Armv8: 캐시(Cache)

캐시 소개
캐시의 기본 동작 원리
   캐시의 검색 방법
   캐시 lookup 기본 동작 원리
       캐시 히트 동작  
       캐시 미스 동작  
캐시 제어 레지스터




핑백

덧글

댓글 입력 영역