Cache – PoC vs PoU

ARM Cache Identification

  • CTR(Cache Type Register)를 읽어서 Level 1 명령어 캐시의 정책(VIPT)과 cache line을 알아온다.
  • CLIDR(Cache Level ID Register)를 통해 7개의 캐시 타입필드를 읽는다. 각 단계의 캐시의 종류(I, D, I+D)를 알아내고 LoU 및 LoC를 알아온다.
  • CCSSR(Cache Sizae Selection Register)를 사용해 요청받은 캐시레벨을 선택하고 캐시 종류를 선택한 후 CCSIDR(Cache Size ID Register)를 읽어 캐시 정보를 획득한다.
  • 참고: ARM 시스템 주요 레지스터

 

캐시 조작 명령 Flush

Flush라는 용어는 여러 아키텍처에서 다음 3가지 항목과 동일하게 혼용되어 사용되어 구현 의도를 파악하기 어렵게 만든다. 따라서 ARM 매뉴얼에서는 flush라는 용어를 사용하지 않고 다음 아래와 같은 표기를 사용한다.

  • Clean
    • 현재 레벨의 캐시 라인을 다음 레벨의 캐시나 메모리에 기록한다.
  • Invalidate
    • 현재 레벨의 캐시 라인을 비운다.
  • Clean & Invalidate
    • 현재 레벨의 캐시 라인을 다음 레벨의 캐시나 메모리에 기록한 후 비운다.

 

PoC(Point of Coherency)

특정한 MVA를 위해 PoC는 접근하는 모든 agent(cores, bus(dma, mmio))들이 메모리 위치의 동일한 사본 값을 access할 수 있게 보장하는 포인트이다.

  • ARMv7 아키텍처에는 CP15 레지스터를 사용하여 PoC를 지원하는 명령이 다음과 같이 3가지가 지원되며 이 명령을 사용하여 PoC 에서 Coherency를 만족하게 할 수 있다.
    • DCIMVAC (Data Cache Invalidate MVA to poC)
      • PoC 까지 하나의 Data 캐시 라인을 버림으로서 PoC 위치에서 동일한 메모리 데이터의 사본을 access할 수 있다.
    • DCCMVAC (Data Cache Clean VMA to poC)
      • PoC 까지 하나의 Data 캐시 라인을 저장하게 함으로서 PoC 위치에서 동일한 메모리 데이터의 사본을 access할 수 있다.
    • DCCIMVAC(Data Cache Clean & Invalidate VMA to poC)
      • PoC 까지 하나의 Data 캐시 라인을 저장하게 하고 버림으로서 PoC 위치에서 동일한 메모리 데이터의 사본을 access할 수 있다.
  • 메모리 데이터 사본
    • 캐시는 메모리 데이터의 사본을 보관하고 있다.
  • ARMv7 아키텍처에서는 특정 가상 주소 영역에 대해 PoC 까지 한꺼번에 처리하는 명령이 없어서 루프를 돌며 하나 하나 캐시 라인 별로 아래의 PoC 명령을 처리 해야 한다.
  • PoC는 대부분 BUS에 연결된 DRAM이 위치한 곳이다. 이 위치에서 Core, DSP 및 DMA 엔진 등이 같은 데이터를 access할 수 있도록 보장한다.
  • ARM v7 아키텍처는 최대 7단계 까지의 캐시를 지원하며 PoC 명령으로 처리할 수 있는 캐시 레벨은 다음 레지스터에 기록되어 있다.
    • CLIDR 레지스터의 LoC(Level of Coherency) 필드에 기록되어 있다.
    • 예) rpi2에서 사용된 BCM2709 SoC에는 LoC(PoC를 캐시 구현 레벨로 표현) 값이 2(L2 캐시)이다. 즉 PoC 명령을 사용 시 SoC가 캐시 레벨 2까지 처리한다.
  • Cache Coherency H/W Unit
    • SMP 시스템을 위해 Data 캐시들 끼리의 coherent를 보장하게 하는 하드웨어 장치이다.
      • Data 캐시와 메모리의 coherent는 자동으로 하지 않고 PoC 명령 등을 통해 수동으로 수행한다.
    • ARM사는 Cache Coherency를 하드웨어로 보장하게 하는 장치를 IP block으로 제공한다. (SCU, Corelink series… 등).
    • 보통 SoC 제조사들은 ARM사의 IP block 중 하나를 선택하여 cache coherent 장치를 구성하는데 일부 SoC 제조사는 자사가 가지고 있는 cache coherency 장치를 사용하는 경우도 있다.
    • Cache Coherency H/W 장치를 사용하는 cpu-캐시, GPU, ACP(Accelerator Coherency Port) 및 ACP-lite 에 연결된 장치들은 특별히 PoC 관련 명령을 수행하지 않아도 하드웨어가 지원하는 기능에 의해 자동적으로 coherency를 보장하게 한다. 그러나 이러한 cache coherent DMA(ACP, ACP-Lite 등) 하드웨어 장치를 사용하지 않는 구형 DMA 디바이스 등에서는 드라이버를 구현할 때에 반드시 PoC 명령 등을 사용하여야 한다.
  • 추가 캐시 컨트롤러
    • CP15를 통해 처리하지 못하는 캐시 컨트롤러에 대해서는 공급사가 관련 캐시 명령들을 제공하여야 한다.

cache4

PoU(Point of Unification)

Process에서의 PoU는 instruction 캐시와 data 캐시 그리고 TLB 캐시가 동일한 데이터를 바라보는 것을 보장하는 포인트이다.

  • ARMv7 아키텍처에서는 CP15 레지스터를 사용하여 PoU를 지원하는 명령이 다음과 같이 4가지가 제공된다.
    • DCCMVAU(Data Cache Clean MVA to poU)
      • PoU 직전까지 dirty된 하나의 data 캐시 라인을 PoU 위치로 기록하게 한다.

      ICIALLUIS(Instruction Cache Invalidate ALL to poU Inner Shareable)

      • Inner shareable 캐시 중 PoU 직전 캐시까지 전체 instruction 캐시를 비운다.
    • ICIALLU(Instruction Cache Invalidate ALL to poU)
      • PoU 직전까지 전체 instruction 캐시를 비운다.
    • ICIMVAU(Instruction Cache Invalidate VMA to poU)
      • PoU 직전까지 하나의 instruction 캐시 라인을 비운다.
  • ARM v7 아키텍처는 최대 7단계 까지의 캐시를 지원하며 PoU 명령으로 처리할 수 있는 캐시 레벨은 다음 레지스터에 기록되어 있다. 보통 통합 캐시를 지정하거나 DRAM 메모리 위치가 된다.
    • CLIDR 레지스터의 LoUU(Level of Unification Uniprocessor) 및 LoUIS(Level of Unification Inner Shareable) 필드에 기록되어 있다.
    • ARMv7 아키텍처는 LoU 및 LoUIS값으로 1(L2 캐시)을 사용하는데 L2 캐시가 통합 지점을 의미한다.
      • 확인해봐야 할 사항:
        • ARM 레퍼런스 매뉴얼에서 숫자 1은 보통 L1 캐시를 말하는데 LoU에 대해서는 숫자 1을 L2로 표기하였다.
        • Instruction 캐시와 Data 캐시의 coherency를 통합 캐시 위치인 PoU에서 보장하기 위해 PoU 직전 레벨의 캐시까지 조작한다.
        • 아래 그림에서도 PoU가 L2인 경우 L1까지 캐시를 처리하는 것처럼 색상이 구분되어 있다.
  • 용도
    • Self-modifing 코드
      • ARM에서 하바드 캐시를 사용하는 캐시 레벨들에 대해서는 instruction 코드를 변경한 후 재 사용하기 위해 h/w가 자동으로 cache coherency를 처리하지 못하므로 이러한 캐시 영역은 CP15 PoU 관련 명령을 사용하여 직접 처리해야 한다.
      • PoU 직전까지의 data 캐시를 먼저 clean한 후, 다시 PoU 직전까지의 instruction 캐시를 invalidate 하여 data 캐시와 instruction 캐시의 coherency를 PoU 에서 보장한다.

cache5

 

LoC(Level of Coherency for the cache hierarchy)

PoC를 위해 cache hierarchical을 지원하는 캐시 구성에서 처음 레벨의 캐시(L1)부터 LoC가 지정한 캐시 레벨까지 캐시 조작 명령을 수행해야 하는 레벨을 가리킨다.

  • 예) rpi2: PoC=RAM, LoC=2(L2)
    • L1 ~ L2 캐시까지 cache operation 명령을 수행한다.

 

LoU / LoUU(Level of Unification Uniprocessor for the cache hierachy)

PoU를 위해 cache hierarchical을 지원하는 캐시 구성에서 처음 레벨의 캐시(L1)부터 LoUU가 지정한 캐시 레벨(한 개 코어에서 가장 가까운 통합 캐시)-1까지 캐시 조작 명령을 수행하여 LoU 위치에서 데이터 캐시와 instruction 캐시의 coherency를 보장하게 한다.

  • 예) rpi2: PoU=L2, LoU=1(L2 통합 캐시)
    • L1 캐시까지 cache operation 명령을 수행한다.

 

LoUIS(Level of Unification Inner Shareable for the cache hierarchy)

Multiprocess Extensions에서만 구현되며 PoU를 위해 cache hierachical을 지원하는 캐시 구성에서 Inner shareable domain을 위해 처음 레벨의 캐시(L1)부터 LoUIS가 지정한 캐시 레벨까지 (L2-1)-1 까지 캐시 조작 명령을 수행하여 LoUIS 위치에서 데이터 캐시와 instruction 캐시의 coherency를 보장하게 한다.

  • 예) rpi2: PoU=L2, LoUIS=1(L2 통합 캐시)
    • L1 캐시까지 cache operation 명령을 수행한다.

 

ARM 아키텍처별 캐시 레벨 속성 값

cache6

 

 참고

Cache – Policies

Cache – Policies

캐시 할당(Allocation) 정책

캐시 할당 정책 중 Read-Allocation은 거의 대부분의 아키텍처에서 기본 정책이라 특별히 기재를 하지 않아도 동작하는 정책이다. WA의 경우는 지정을 하는 경우에만 동작하는 정책이다.

1) WA(Write-Allocation)

쓰기 요청 시 캐시 라인이 할당된다. 즉, 프로세서에서 저장 명령을 실행하면 캐시 라인으로 버스트 읽기가 발생할 수 있다. 쓰기가 수행되기 전에 캐시 라인에 대한 데이터를 얻기위한 라인 필이 발생한다. 캐시는 캐시 라인 내의 단일 바이트에만 쓰는 경우에도 로드 가능한 최소 단위가 캐시 라인이 된다.

 

2) RA(Read-Allocation)

읽기 요청 시 캐시에서 읽기 실패(miss)한 경우 외부 메모리로 부터 할당된다.

 

캐시 기록(Write) 정책

1) WB(Write-Back)

기록 요청 시 캐시만 갱신한다. 그리고 캐시 라인은 Dirty 상태가 된다. 캐시가 eviction이 발생되는 경우 또는 명확히 clean 명령이 내려질 때에만 외부 메모리에  기록하게 된다.

 

2) WT(Write-Through)

기록 요청 시 캐시와 외부 메모리 둘 다 갱신한다. 캐시 라인은 Dirty 상태가 되지 않는다..

 

캐시 교체(Replacement) 정책

  • LRU(Least Recently Used)
    • cpu 아키텍처에서 가장 많이 사용하는 캐시 교체 정책으로 가장 사용 빈도가 가장 낮은 항목을 먼저 삭제한다.
  • FIFO(First In First Out)
    • 전송에 사용되는 Write Buffer 등에서 가장 많이 사용되는 캐시 교체 정책으로 사용 빈도와 관련 없이 가장 먼저 진입한 항목을 먼저 삭제한다.
  • 그 외 정책들은 다음을 참고한다.

 

캐시 Policies 상세

WT(Write-Through with no write-allocation)

cache1

 

WB(Write-Back with no write-allocation)

cache2

 

WBWA(Write-Back with Write-Allocation)

cache3

 

캐시 영역(inner vs outer)

다음 그림과 같이 inner 영역에 L1 및 L2 캐시가 같이 존재할 수도 있고, L1 캐시만 inner로 동작하는 경우도 있다.

 

참고

32비트 ARM에서의 user space vs kernel space

user space 크기 선택

커널을 빌드시 3가지의 VMSPLIT 옵션에 따라 user space가 달라진다.

  • 주로 PC 리눅스에서는 3G 옵션을 사용하고,
  • 임베디드 리눅스에서는 3G 또는 2G 옵션을 사용한다.
  • 1G 옵션은 거의 사용되지 않는다.

user space를 크게할 때의 장단점

  • 장점: 사용자 application에서 사용할 수 있는 가상 메모리 공간이 더 커진다.
  • 단점: NORMAL ZONE의 공간이 작아 HIMEM ZONE의 사용이 많아져 메모리 access의 속도가 저하된다.

vmsplit

 

메모리 공간 할당은 아래 두 시스템에서 추가적으로 이해가 필요하지만 32bit ARM만 이해하기로 한다.

  • 32bit ARM with LPAE
  • 64bit ARM

 

¹) NORMAL ZONE: kernel space에 존재하며, 물리 메모리의 direct 매핑이 가능한 영역.

²) HIMEM ZONE: kernel space에는 선택한 일부 공간만 존재하며, 물리 메모리의 direct 매핑을 할 수 없어 반드시 일부를 선택하여 사용할 수 있다.