1		     Memory Layout on AArch64 Linux
2		     ==============================
3
4Author: Catalin Marinas <catalin.marinas@arm.com>
5
6This document describes the virtual memory layout used by the AArch64
7Linux kernel. The architecture allows up to 4 levels of translation
8tables with a 4KB page size and up to 3 levels with a 64KB page size.
9
10AArch64 Linux uses either 3 levels or 4 levels of translation tables
11with the 4KB page configuration, allowing 39-bit (512GB) or 48-bit
12(256TB) virtual addresses, respectively, for both user and kernel. With
1364KB pages, only 2 levels of translation tables, allowing 42-bit (4TB)
14virtual address, are used but the memory layout is the same.
15
16User addresses have bits 63:48 set to 0 while the kernel addresses have
17the same bits set to 1. TTBRx selection is given by bit 63 of the
18virtual address. The swapper_pg_dir contains only kernel (global)
19mappings while the user pgd contains only user (non-global) mappings.
20The swapper_pg_dir address is written to TTBR1 and never written to
21TTBR0.
22
23
24AArch64 Linux memory layout with 4KB pages + 3 levels:
25
26Start			End			Size		Use
27-----------------------------------------------------------------------
280000000000000000	0000007fffffffff	 512GB		user
29ffffff8000000000	ffffffffffffffff	 512GB		kernel
30
31
32AArch64 Linux memory layout with 4KB pages + 4 levels:
33
34Start			End			Size		Use
35-----------------------------------------------------------------------
360000000000000000	0000ffffffffffff	 256TB		user
37ffff000000000000	ffffffffffffffff	 256TB		kernel
38
39
40AArch64 Linux memory layout with 64KB pages + 2 levels:
41
42Start			End			Size		Use
43-----------------------------------------------------------------------
440000000000000000	000003ffffffffff	   4TB		user
45fffffc0000000000	ffffffffffffffff	   4TB		kernel
46
47
48AArch64 Linux memory layout with 64KB pages + 3 levels:
49
50Start			End			Size		Use
51-----------------------------------------------------------------------
520000000000000000	0000ffffffffffff	 256TB		user
53ffff000000000000	ffffffffffffffff	 256TB		kernel
54
55
56For details of the virtual kernel memory layout please see the kernel
57booting log.
58
59
60Translation table lookup with 4KB pages:
61
62+--------+--------+--------+--------+--------+--------+--------+--------+
63|63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
64+--------+--------+--------+--------+--------+--------+--------+--------+
65 |                 |         |         |         |         |
66 |                 |         |         |         |         v
67 |                 |         |         |         |   [11:0]  in-page offset
68 |                 |         |         |         +-> [20:12] L3 index
69 |                 |         |         +-----------> [29:21] L2 index
70 |                 |         +---------------------> [38:30] L1 index
71 |                 +-------------------------------> [47:39] L0 index
72 +-------------------------------------------------> [63] TTBR0/1
73
74
75Translation table lookup with 64KB pages:
76
77+--------+--------+--------+--------+--------+--------+--------+--------+
78|63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
79+--------+--------+--------+--------+--------+--------+--------+--------+
80 |                 |    |               |              |
81 |                 |    |               |              v
82 |                 |    |               |            [15:0]  in-page offset
83 |                 |    |               +----------> [28:16] L3 index
84 |                 |    +--------------------------> [41:29] L2 index
85 |                 +-------------------------------> [47:42] L1 index
86 +-------------------------------------------------> [63] TTBR0/1
87
88
89When using KVM without the Virtualization Host Extensions, the
90hypervisor maps kernel pages in EL2 at a fixed (and potentially
91random) offset from the linear mapping. See the kern_hyp_va macro and
92kvm_update_va_mask function for more details. MMIO devices such as
93GICv2 gets mapped next to the HYP idmap page, as do vectors when
94ARM64_HARDEN_EL2_VECTORS is selected for particular CPUs.
95
96When using KVM with the Virtualization Host Extensions, no additional
97mappings are created, since the host kernel runs directly in EL2.
98