Cache aliasing

페이지 컬러링을 소프트웨어적으로 구현해야하는 경우가 이제 드문 것 같지만, 궁금해서 찾아본 내용을 정리함. 여러 웹페이지들을 쫓아다녔고 필요하다 싶은 문단을 이리저리 긁어다 놓고 읽었음. 아래 내용은 references 에 명시된 사이트에서 발췌한 내용을 짜깁기한 것임.


용어정리 먼저:

초기의 가상 메모리 시스템은 가상주소를 물리주소로 변환하기 위해 메인 메모리에 있는 페이지 테이블로 직접 접근해야 했기 때문에 매우 느렸다. 컴퓨터 시스템에서 처음으로 구현된 하드웨어 캐시는 명령 또는 데이터 캐시가 아니라 TLB 였다.

캐시는 index 와 tag 가 물리주소 또는 가상주소 어디에 해당하는지에 따라 4가지 종류로 구분할 수 있다:

프로세서 퍼포먼스에 load latency 는 결정적인 문제이므로 대부분의 현대 L1 캐시는 MMU의 TLB lookup을 병행적으로 처리할 수 있는 virtually indexed 로 구현되어 있다. 하지만 virtual indexing 이 모든 캐시 레벨에 적합한 것은 아니다. 캐시 사이즈가 증가하는 만큼 virtual aliases 를 처리하는 비용 역시 증가함에 따라 L2 또는 그 이상의 레벨에서는 physically indexed 캐시를 사용한다.

대부분의 프로세서에서는 하나의 물리주소에 대한 업데이트가 프로그램 순서에 따라 순차적으로 일어나는 것을 보장한다. 그리고 이것을 보장하기 위해서 프로세서는 한순간에 단 하나의 물리공간 카피만 캐시에 존재하도록 해야한다.

(캐시 라인 사이즈 * 인덱스 갯수) 또는 (캐시 사이즈 / 웨이 갯수)가 페이지 사이즈보다 작거나 같으면 앨리어스는 발생하지 않는다.

PIPT 캐시와 non-aliasing VIPT 캐시 사이에는 가시적으로 어떤 차이도 없다. 4KiB 페이지 사이즈를 갖는 32 바이트 캐시 라인의 VIPT non-aliasing 캐시에서 어드레스 비트는 다음과 같이 할당된다:

[0:1] = byte offset into word
[4:2] = word offset
[N-1:5] = virtual index
[31:N] = physical tag

N <= PAGE_SHIFT, 이 조건이 충족되지 않으면 aliasing이 발생한다.

PIPT의 경우 다음과 같다:

[0:1] = byte offset into word
[4:2] = word offset
[M-1:5] = physical index
[31:M] = physical tag

M은 어느 값이라도 될 수 있다.

조건 N은 non-aliasing VIPT 캐시를 구현하기 위해 반드시 충족되어야 한다. non-aliasing VIPT 캐시는 PIPT 캐시와 동일한 속성을 갖는다.

N이 큰 경우, 즉 페이지 사이즈에 비해 캐시가 클 경우, 캐시 컬러링을 적용할 필요가 있다. 캐시 컬러링은 하나의 set에 동일한 물리주소가 캐시되는 것을 방지하는 역할을 한다.

References