Cache Memory QnA

잘못된 정보는 https://github.com/memnoth/me/issues/1에 남겨주시기 바랍니다.

List

  1. Startup에서 D-cache=off 임에도 불구하고 cache line invalidation 하는 목적이 뭔가요?

QnA

Q. 아래 코드에서 D-cache = off 임에도 불구하고 cache line invalidation 하는 목적이 뭔가요?

 1// 'head.S' of linux kernel 5.10
 2/*
 3 * Kernel startup entry point.
 4 * ---------------------------
 5 *  
 6 * The requirements are:
 7 *   MMU = off, D-cache = off, I-cache = on or off,
 8 *   x0 = physical address to the FDT blob.
 9 *
10 * 기타 내용들...
11 */
12
13....
14
15// In 'preserve_boot_args' label, try invalidating cache lines
16// addressed to 'boot_args' space.
17mov x1, #0x20           // 4 x 8 bytes
18b   __inval_dcache_area     // tail call

A. 'D-cache = on' 이후 data corruption을 방지하기 위함입니다.

커널이 초기화 작업을 진행하기 이전에는 일반적으로 bootloader가 커널이 부팅하는데 필요한 최소한의 장치들을 초기화합니다. 여기에는 메모리와 관련된 작업들도 당연히 포함되고요. 커널의 startup point에서는 이전에 부트로더가 어떤 작업을 했는지 모릅니다만 위 requirements와 최소한의 장치만 초기화되면 됩니다. 이때 cache에는 어떤 정보들이 들어 있는지 모르는 상태이고요. 따라서 dirty data가 캐싱되어 있을 가능성이 높습니다.

bootloader가 사용한 또는 커널이 앞으로 사용할 주소에 대해 cache line invalidation 없이 D-cache=on 시점에서 load/store 명령어를 수행하면 아래와 같은 시나리오가 발생할 수 있습니다. Startup point에서 D-cache=off 인 이유는 이것과 관련성이 적지만 on일 때를 생각해보면 invalidation은 충분한 이유입니다.

  1. Load insts
    Load의 src 주소가 cache line에 존재한다면 hit 되어 dirty data가 fetch될 가능성이 높습니다.
  2. Store insts
    Store의 dest 주소가 cache line에 존재한다면 hit 되어 해당 라인의 데이터가 계속적으로 변경됩니다. 이때 데이터는 실제 예측한 데이터가 아니겠죠. dc clean을 수행하거나 line이 eviction 되는 시점에서 메인 메모리의 데이터는 out-of-date 이므로 line에 있는 dirty data로 업데이트됩니다.

따라서 다음과 같은 결론에 도달하게 됩니다. Chip booting 후 또는 bootloader가 사용하고 난 후 cache line에 남아 있는 dirty data를 정리하고 D-cache=on 시점에서 new data를 메인 메모리로부터 참조하기 위함입니다.

References