memory.txt 3.87 KB
Newer Older
Catalin Marinas's avatar
Catalin Marinas committed
1
2
3
4
5
6
7
8
9
		     Memory Layout on AArch64 Linux
		     ==============================

Author: Catalin Marinas <catalin.marinas@arm.com>

This document describes the virtual memory layout used by the AArch64
Linux kernel. The architecture allows up to 4 levels of translation
tables with a 4KB page size and up to 3 levels with a 64KB page size.

10
11
12
13
AArch64 Linux uses either 3 levels or 4 levels of translation tables
with the 4KB page configuration, allowing 39-bit (512GB) or 48-bit
(256TB) virtual addresses, respectively, for both user and kernel. With
64KB pages, only 2 levels of translation tables, allowing 42-bit (4TB)
14
virtual address, are used but the memory layout is the same.
Catalin Marinas's avatar
Catalin Marinas committed
15

16
User addresses have bits 63:48 set to 0 while the kernel addresses have
Catalin Marinas's avatar
Catalin Marinas committed
17
18
19
20
21
22
23
the same bits set to 1. TTBRx selection is given by bit 63 of the
virtual address. The swapper_pg_dir contains only kernel (global)
mappings while the user pgd contains only user (non-global) mappings.
The swapper_pgd_dir address is written to TTBR1 and never written to
TTBR0.


24
AArch64 Linux memory layout with 4KB pages + 3 levels:
Catalin Marinas's avatar
Catalin Marinas committed
25
26
27
28

Start			End			Size		Use
-----------------------------------------------------------------------
0000000000000000	0000007fffffffff	 512GB		user
29
ffffff8000000000	ffffffffffffffff	 512GB		kernel
Catalin Marinas's avatar
Catalin Marinas committed
30
31


32
33
34
35
36
AArch64 Linux memory layout with 4KB pages + 4 levels:

Start			End			Size		Use
-----------------------------------------------------------------------
0000000000000000	0000ffffffffffff	 256TB		user
37
ffff000000000000	ffffffffffffffff	 256TB		kernel
38
39
40


AArch64 Linux memory layout with 64KB pages + 2 levels:
41
42
43
44

Start			End			Size		Use
-----------------------------------------------------------------------
0000000000000000	000003ffffffffff	   4TB		user
45
fffffc0000000000	ffffffffffffffff	   4TB		kernel
46
47


48
49
50
51
52
53
54
55
AArch64 Linux memory layout with 64KB pages + 3 levels:

Start			End			Size		Use
-----------------------------------------------------------------------
0000000000000000	0000ffffffffffff	 256TB		user
ffff000000000000	ffffffffffffffff	 256TB		kernel


56
57
For details of the virtual kernel memory layout please see the kernel
booting log.
58
59


60
Translation table lookup with 4KB pages:
61
62
63
64
65
66
67
68
69
70
71
72
73
74

+--------+--------+--------+--------+--------+--------+--------+--------+
|63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
+--------+--------+--------+--------+--------+--------+--------+--------+
 |                 |         |         |         |         |
 |                 |         |         |         |         v
 |                 |         |         |         |   [11:0]  in-page offset
 |                 |         |         |         +-> [20:12] L3 index
 |                 |         |         +-----------> [29:21] L2 index
 |                 |         +---------------------> [38:30] L1 index
 |                 +-------------------------------> [47:39] L0 index
 +-------------------------------------------------> [63] TTBR0/1


75
Translation table lookup with 64KB pages:
Catalin Marinas's avatar
Catalin Marinas committed
76
77
78
79
80
81
82
83

+--------+--------+--------+--------+--------+--------+--------+--------+
|63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
+--------+--------+--------+--------+--------+--------+--------+--------+
 |                 |    |               |              |
 |                 |    |               |              v
 |                 |    |               |            [15:0]  in-page offset
 |                 |    |               +----------> [28:16] L3 index
84
85
 |                 |    +--------------------------> [41:29] L2 index
 |                 +-------------------------------> [47:42] L1 index
Catalin Marinas's avatar
Catalin Marinas committed
86
 +-------------------------------------------------> [63] TTBR0/1
87

88

89
90
91
92
93
94
When using KVM, the hypervisor maps kernel pages in EL2, at a fixed
offset from the kernel VA (top 24bits of the kernel VA set to zero):

Start			End			Size		Use
-----------------------------------------------------------------------
0000004000000000	0000007fffffffff	 256GB		kernel objects mapped in HYP