# paging_init: RAM에 접근할 가상 주소 마련하기

v6.18.37 / arch/arm64/mm/mmu.c

RAM이 존재한다는 사실과 커널이 그 RAM을 가상 주소로 읽을 수 있다는 사실은 다릅니다. arm64의 paging_init은 메모리 목록을 바탕으로 커널 주소 공간을 정리합니다. 이 버전의 함수는 짧지만 각 호출이 담당하는 주소 공간의 역할을 구분해야 합니다.

## paging_init

```c

void __init paging_init(void)
{
	map_mem(swapper_pg_dir);

	memblock_allow_resize();

	create_idmap();
	declare_kernel_vmas();
}

```

### 1426행

```c

void __init paging_init(void)

```

arm64 메모리 초기화 함수입니다. __init은 부팅 초기화 코드로 분류한다는 뜻이며 일반 실행 중에 수시로 호출하는 할당 함수가 아닙니다.

### 1428행

```c

	map_mem(swapper_pg_dir);

```

커널 최상위 테이블을 넘겨 실제 RAM을 선형 매핑에 연결합니다. 메모리 구간과 예약 속성에 따른 세부 매핑 판단은 map_mem 안에서 합니다.

### 1430행

```c

	memblock_allow_resize();

```

memblock 내부 구간 배열이 필요할 때 커질 수 있도록 허용합니다. 초기의 고정 배열 제약을 풀지만 이 줄 자체가 RAM을 추가하는 것은 아닙니다.

### 1432행

```c

	create_idmap();

```

주소 변환 전환 과정 등에 필요한 동일 주소 매핑을 구성합니다. 선형 매핑과 사용 목적을 구별해 읽으셔야 합니다.

### 1433행

```c

	declare_kernel_vmas();

```

커널 코드와 데이터 등의 가상 주소 영역을 관리 자료구조에 등록합니다. 이미 만든 매핑을 커널의 영역 관리 관점에서도 알 수 있게 합니다.

