Why MMU and D-Cache must be off at Startup point

Q. 아래와 같이 startup point에서 MMUD-Cache의 상태가 off 여야 하는데 이유가 뭔가요?

 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  * This code is mostly position independent so you call this at
11  * __pa(PAGE_OFFSET).
12  *  
13  * Note that the callee-saved registers are used for storing variables
14  * that are useful before the MMU is enabled. The allocations are described
15  * in the entry routines.
16  */

A-1. MMU

MMU는 CPU가 명령어를 수행할 때 메모리에 접근할 vaddr(Virtual Address)를 paddr(Physical Address)로 변환하는 작업을 수행합니다. 그리고 이때 사용되는 자료구조가 주소 매핑 테이블인데 이는 커널이 생성합니다. Startup 코드가 수행되는 시점에서는 매핑 테이블이 존재하지 않는데 MMU가 on 되어 있다면 메모리 주소가 vaddr로 해석됩니다. 결국 MMU가 수행되고 이는 paddr로 변환되어 의도치 않은 동작이 수행됩니다. 이와 같은 이유로 매핑 테이블이 생성되기 이전에는 MMU를 off 해야합니다.

A-2. D-Cache

D-Cache는 CPU와 메인 메모리 사이에서 데이터를 빠르게 접근하기 위한 저장소 역할을 수행합니다. 대부분의 시스템 프로그래머들은 알다시피 종종 캐시와 메모리간 데이터 싱크(Sync) 문제들을 마주하게 되는데 startup 시점에서는 paddr에서 데이터를 직접 읽거나 써야 합니다. 그러나 D-Cache가 on 되어 있다면 paddr에서 데이터를 읽는 대신 캐시 메모리에서 읽으므로 의도치 않은 동작을 수행하게 됩니다. 이와 같은 이유로 D-Cache도 off 해야합니다.