이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under the GPL license).
Documentation/arm64/memory.txt
AArch64 리눅스의 메모리 배치
============================
Author: Catalin Marinas <catalin.marinas@arm.com>
번역 : 양정석 <dasomoli@gmailREMOVETHIS.com>
Date : 20 February 2012
이 문서는 AArch64 리눅스 커널이 사용하는 가상 메모리 배치를 설명합니다.
이 아키텍처는 4KB 페이지 크기의 4단계 변환 테이블과 64KB 페이지 크기의
3단계 변환 테이블을 허용합니다.
AArch64 리눅스는 유저와 커널 양 쪽 모두 39비트 (512GB) 가상 주소를 허용하는
4KB 페이지 설정의 3단계 변환 테이블을 사용합니다. 64KB 페이지는 오직
2단계 변환 테이블이 사용되지만 메모리 배치는 같습니다.
유저 주소는 63:39 비트가 0으로 셋팅되는 반면, 커널 주소는 같은 곳의 비트에
1로 셋팅됩니다. TTBRx 선택은 가상 주소의 비트 63에 의해 결정됩니다.
swapper_pg_dir은 오직 커널 (전역) 맵핑만 포합하는 반면,
유저 pgd는 오직 유저 (비전역) 맵핑만 포함합니다. swapper_pgd_dir 주소는
TTBR1으로 쓰여지고, TTBR0로 절대 쓰여지지 않습니다.
4KB 페이지의 AArch64 리눅스 메모리 배치:
시작 끝 크기 용도
———————————————————————–
0000000000000000 0000007fffffffff 512GB 유저
ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc
ffffffbbffff0000 ffffffbbffffffff 64KB [guard page]
ffffffbc00000000 ffffffbdffffffff 8GB vmemmap
ffffffbe00000000 ffffffbffbbfffff ~8GB [guard, 추후 vmmemap]
ffffffbffa000000 ffffffbffaffffff 16MB PCI I/O 공간
ffffffbffb000000 ffffffbffbbfffff 12MB [guard]
ffffffbffbc00000 ffffffbffbdfffff 2MB 고정 맵핑
ffffffbffbe00000 ffffffbffbffffff 2MB [guard]
ffffffbffc000000 ffffffbfffffffff 64MB 모듈들
ffffffc000000000 ffffffffffffffff 256GB 커널 논리 메모리 맵
64KB 페이지의 AArch64 리눅스 메모리 배치:
시작 끝 크기 용도
———————————————————————–
0000000000000000 000003ffffffffff 4TB 유저
fffffc0000000000 fffffdfbfffeffff ~2TB vmalloc
fffffdfbffff0000 fffffdfbffffffff 64KB [guard page]
fffffdfc00000000 fffffdfdffffffff 8GB vmemmap
fffffdfe00000000 fffffdfffbbfffff ~8GB [guard, 추후 vmmemap]
fffffdfffa000000 fffffdfffaffffff 16MB PCI I/O 공간
fffffdfffb000000 fffffdfffbbfffff 12MB [guard]
fffffdfffbc00000 fffffdfffbdfffff 2MB 고정 맵핑
fffffdfffbe00000 fffffdfffbffffff 2MB [guard]
fffffdfffc000000 fffffdffffffffff 64MB 모듈들
fffffe0000000000 ffffffffffffffff 2TB 커널 논리 메모리 맵
4KB 페이지의 변환 테이블 탐색:
+——–+——–+——–+——–+——–+——–+——–+——–+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+——–+——–+——–+——–+——–+——–+——–+——–+
| | | | | |
| | | | | v
| | | | | [11:0] 페이지 내의 오프셋
| | | | +-> [20:12] L3 인덱스
| | | +———–> [29:21] L2 인덱스
| | +———————> [38:30] L1 인덱스
| +——————————-> [47:39] L0 인덱스 (미사용)
+————————————————-> [63] TTBR0/1
64KB 페이지의 변환 테이블 탐색:
+——–+——–+——–+——–+——–+——–+——–+——–+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+——–+——–+——–+——–+——–+——–+——–+——–+
| | | | |
| | | | v
| | | | [15:0] 페이지 내의 오프셋
| | | +———-> [28:16] L3 인덱스
| | +————————–> [41:29] L2 인덱스 (38:29 만 사용)
| +——————————-> [47:42] L1 인덱스 (미사용)
+————————————————-> [63] TTBR0/1
KVM을 사용할 때, 하이퍼바이저는 커널 페이지를 EL2에서 커널 VA로부터 고정된
오프셋(커널 VA의 상위 24비트를 0으로 셋팅한)에 맵핑합니다:
시작 끝 크기 용도
———————————————————————–
0000004000000000 0000007fffffffff 256GB HYP 내에서 맵핑된 커널 객체