Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
[linux-2.6-block.git] / Documentation / arm64 / memory.txt
CommitLineData
4f04d8f0
CM
1 Memory Layout on AArch64 Linux
2 ==============================
3
4Author: Catalin Marinas <catalin.marinas@arm.com>
4f04d8f0
CM
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
08375198
CM
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)
4edae01e 14virtual address, are used but the memory layout is the same.
4f04d8f0 15
08375198 16User addresses have bits 63:48 set to 0 while the kernel addresses have
4f04d8f0
CM
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.
a24637d5 20The swapper_pg_dir address is written to TTBR1 and never written to
4f04d8f0
CM
21TTBR0.
22
23
4edae01e 24AArch64 Linux memory layout with 4KB pages + 3 levels:
4f04d8f0
CM
25
26Start End Size Use
27-----------------------------------------------------------------------
280000000000000000 0000007fffffffff 512GB user
08375198 29ffffff8000000000 ffffffffffffffff 512GB kernel
4f04d8f0
CM
30
31
4edae01e
JL
32AArch64 Linux memory layout with 4KB pages + 4 levels:
33
34Start End Size Use
35-----------------------------------------------------------------------
360000000000000000 0000ffffffffffff 256TB user
08375198 37ffff000000000000 ffffffffffffffff 256TB kernel
4edae01e
JL
38
39
40AArch64 Linux memory layout with 64KB pages + 2 levels:
847264fb
CM
41
42Start End Size Use
43-----------------------------------------------------------------------
440000000000000000 000003ffffffffff 4TB user
08375198 45fffffc0000000000 ffffffffffffffff 4TB kernel
847264fb 46
847264fb 47
383c2799
CM
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
08375198
CM
56For details of the virtual kernel memory layout please see the kernel
57booting log.
847264fb 58
847264fb 59
08375198 60Translation table lookup with 4KB pages:
4edae01e
JL
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
08375198 75Translation table lookup with 64KB pages:
4f04d8f0
CM
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
08375198
CM
84 | | +--------------------------> [41:29] L2 index
85 | +-------------------------------> [47:42] L1 index
4f04d8f0 86 +-------------------------------------------------> [63] TTBR0/1
aa4a73a0 87
08375198 88
aa4a73a0
MZ
89When using KVM, the hypervisor maps kernel pages in EL2, at a fixed
90offset from the kernel VA (top 24bits of the kernel VA set to zero):
91
92Start End Size Use
93-----------------------------------------------------------------------
940000004000000000 0000007fffffffff 256GB kernel objects mapped in HYP