이 코드는 어떤 문제를 푸나요?
RAM이 존재한다는 사실과 커널이 그 RAM을 가상 주소로 읽을 수 있다는 사실은 다릅니다. arm64의 paging_init은 메모리 목록을 바탕으로 커널 주소 공간을 정리합니다. 이 버전의 함수는 짧지만 각 호출이 담당하는 주소 공간의 역할을 구분해야 합니다.
읽을 범위: v6.18.37 · arch/arm64/mm/mmu.c · paging_init 1426–1434행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.
먼저 알아둘 개념
선형 매핑
일정한 주소 변환 관계로 물리 RAM을 커널 가상 주소에 연결하는 영역입니다. 주소 구간을 잡는 것과 페이지 테이블 항목을 채우는 일을 함께 이해하셔야 합니다.
identity mapping
가상 주소 숫자와 물리 주소 숫자가 같은 매핑입니다. 주소 변환 체계를 바꾸는 낮은 수준의 코드에서 사용하며, 커널 전체가 항상 이 주소로 실행된다는 뜻은 아닙니다.
swapper_pg_dir
초기 커널 주소 공간의 최상위 페이지 테이블을 가리키는 심벌입니다. 이 인자를 전달하면 하위 함수가 어느 테이블을 갱신해야 하는지 알 수 있습니다.
처음 읽을 때
같은 RAM 한 페이지를 선형 매핑 주소와 동일 주소 매핑 주소로 표시해 보세요. 두 주소 표현이 같은 물리 페이지를 가리킬 수 있다는 점이 핵심입니다.
더 깊이 살펴볼 때
map_mem 내부의 매핑 권한, 큰 블록 매핑 허용 여부와 KFENCE 예외를 살펴보고, 초기 테이블을 그대로 쓰는 영역과 새로 작성하는 영역을 구분해 보세요.
그림으로 보는 변화

1. RAM을 커널 주소에 연결
map_mem(swapper_pg_dir)
화살표는 부팅 코드의 호출 순서입니다. 선형 매핑이 실제 RAM 접근을 가능하게 합니다.
2. 초기 메모리 관리 범위 확장
memblock_allow_resize()
목록을 늘려도 되는 시점임을 표시합니다. 이 호출이 곧바로 모든 목록을 확장하는 것은 아닙니다.
3. 특수 매핑과 영역 정보 준비
create_idmap(); declare_kernel_vmas();
동일 주소 매핑과 커널 영역의 관리 정보를 준비합니다. 하나의 페이지 테이블이 모두를 담당한다는 뜻은 아닙니다.
paging_init를 한 줄씩 읽기
줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.
void __init paging_init(void)
{
map_mem(swapper_pg_dir);
memblock_allow_resize();
create_idmap();
declare_kernel_vmas();
}void __init paging_init(void)arm64 메모리 초기화 함수입니다. __init은 부팅 초기화 코드로 분류한다는 뜻이며 일반 실행 중에 수시로 호출하는 할당 함수가 아닙니다.
map_mem(swapper_pg_dir);커널 최상위 테이블을 넘겨 실제 RAM을 선형 매핑에 연결합니다. 메모리 구간과 예약 속성에 따른 세부 매핑 판단은 map_mem 안에서 합니다.
memblock_allow_resize();memblock 내부 구간 배열이 필요할 때 커질 수 있도록 허용합니다. 초기의 고정 배열 제약을 풀지만 이 줄 자체가 RAM을 추가하는 것은 아닙니다.
create_idmap();주소 변환 전환 과정 등에 필요한 동일 주소 매핑을 구성합니다. 선형 매핑과 사용 목적을 구별해 읽으셔야 합니다.
declare_kernel_vmas();커널 코드와 데이터 등의 가상 주소 영역을 관리 자료구조에 등록합니다. 이미 만든 매핑을 커널의 영역 관리 관점에서도 알 수 있게 합니다.
함께 생각해 볼 질문
RAM 목록만 알면 커널 포인터로 접근할 수 있나요?
아닙니다. 해당 가상 주소를 물리 RAM에 연결하는 유효한 변환과 적절한 접근 권한이 필요합니다.
paging_init이 짧으면 설명할 내용도 적은가요?
각 호출 아래에 실제 페이지 테이블 구성 작업이 들어 있습니다. 이 함수에서는 먼저 호출 순서와 서로 다른 매핑의 목적을 확인하시면 됩니다.
identity mapping은 사용자 주소 공간인가요?
그 의미는 주소 숫자를 같게 매핑한다는 것입니다. 사용자용인지 커널용인지는 테이블과 권한, 사용 경로를 추가로 봐야 합니다.
출처와 읽은 범위
Linux stable v6.18.37 · arch/arm64/mm/mmu.c
해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고
