# x86-64 커널의 32비트 진입과 long mode·가상 주소 전환

v6.18.37 / arch/x86/kernel/head64.c

x86-64 부팅에서는 임시 매핑을 오래 유지하는 것이 오히려 잘못된 접근을 숨길 수 있습니다. 아래에서는 v6.18.37의 reset_early_page_tables 전체를 읽습니다. 압축 해제와 long mode 진입 전체 중, 이미 초기 C 실행이 가능한 단계에서 임시 표를 정리하는 작은 부분을 대표로 선택했습니다.

## reset_early_page_tables

```c

static void __init reset_early_page_tables(void)
{
	memset(early_top_pgt, 0, sizeof(pgd_t)*(PTRS_PER_PGD-1));
	next_early_pgt = 0;
	write_cr3(__sme_pa_nodebug(early_top_pgt));
}

```

### 71행

```c

static void __init reset_early_page_tables(void)

```

아주 초기의 임시 페이지 표를 정리하는 __init 함수입니다. long mode에 들어오기 전 어셈블리의 기능과 구분합니다.

### 73행

```c

	memset(early_top_pgt, 0, sizeof(pgd_t)*(PTRS_PER_PGD-1));

```

최상위 표에서 마지막 PGD 항목을 제외한 나머지를 0으로 지웁니다. 현재 실행에 필요한 커널 기호 매핑을 남겨 두려는 크기 계산입니다.

### 74행

```c

	next_early_pgt = 0;

```

동적 초기 페이지 표 풀의 다음 사용 위치를 0으로 되돌립니다. 실제 RAM 전체를 지우는 코드가 아닙니다.

### 75행

```c

	write_cr3(__sme_pa_nodebug(early_top_pgt));

```

메모리 암호화 주소 표현을 고려한 초기 루트의 물리 주소를 CR3에 다시 기록합니다. 페이지 표 메모리 수정만으로 끝내지 않고 CPU 변환 상태를 갱신합니다.

