Commit | Line | Data |
---|---|---|
4f04d8f0 CM |
1 | Memory Layout on AArch64 Linux |
2 | ============================== | |
3 | ||
4 | Author: Catalin Marinas <catalin.marinas@arm.com> | |
5 | Date : 20 February 2012 | |
6 | ||
7 | This document describes the virtual memory layout used by the AArch64 | |
8 | Linux kernel. The architecture allows up to 4 levels of translation | |
9 | tables with a 4KB page size and up to 3 levels with a 64KB page size. | |
10 | ||
11 | AArch64 Linux uses 3 levels of translation tables with the 4KB page | |
12 | configuration, allowing 39-bit (512GB) virtual addresses for both user | |
13 | and kernel. With 64KB pages, only 2 levels of translation tables are | |
14 | used but the memory layout is the same. | |
15 | ||
16 | User addresses have bits 63:39 set to 0 while the kernel addresses have | |
17 | the same bits set to 1. TTBRx selection is given by bit 63 of the | |
18 | virtual address. The swapper_pg_dir contains only kernel (global) | |
19 | mappings while the user pgd contains only user (non-global) mappings. | |
20 | The swapper_pgd_dir address is written to TTBR1 and never written to | |
21 | TTBR0. | |
22 | ||
23 | ||
847264fb | 24 | AArch64 Linux memory layout with 4KB pages: |
4f04d8f0 CM |
25 | |
26 | Start End Size Use | |
27 | ----------------------------------------------------------------------- | |
28 | 0000000000000000 0000007fffffffff 512GB user | |
29 | ||
e3978cde | 30 | ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc |
4f04d8f0 | 31 | |
e3978cde | 32 | ffffffbbffff0000 ffffffbbffffffff 64KB [guard page] |
4f04d8f0 | 33 | |
e3978cde | 34 | ffffffbc00000000 ffffffbdffffffff 8GB vmemmap |
4f04d8f0 | 35 | |
e3978cde | 36 | ffffffbe00000000 ffffffbffbbfffff ~8GB [guard, future vmmemap] |
4f04d8f0 | 37 | |
2475ff9d CM |
38 | ffffffbffbc00000 ffffffbffbdfffff 2MB earlyprintk device |
39 | ||
e3978cde | 40 | ffffffbffbe00000 ffffffbffbe0ffff 64KB PCI I/O space |
4f04d8f0 | 41 | |
e29a074b | 42 | ffffffbffbe10000 ffffffbcffffffff ~2MB [guard] |
4f04d8f0 CM |
43 | |
44 | ffffffbffc000000 ffffffbfffffffff 64MB modules | |
45 | ||
715a7119 | 46 | ffffffc000000000 ffffffffffffffff 256GB kernel logical memory map |
4f04d8f0 CM |
47 | |
48 | ||
847264fb CM |
49 | AArch64 Linux memory layout with 64KB pages: |
50 | ||
51 | Start End Size Use | |
52 | ----------------------------------------------------------------------- | |
53 | 0000000000000000 000003ffffffffff 4TB user | |
54 | ||
55 | fffffc0000000000 fffffdfbfffeffff ~2TB vmalloc | |
56 | ||
57 | fffffdfbffff0000 fffffdfbffffffff 64KB [guard page] | |
58 | ||
59 | fffffdfc00000000 fffffdfdffffffff 8GB vmemmap | |
60 | ||
61 | fffffdfe00000000 fffffdfffbbfffff ~8GB [guard, future vmmemap] | |
62 | ||
63 | fffffdfffbc00000 fffffdfffbdfffff 2MB earlyprintk device | |
64 | ||
65 | fffffdfffbe00000 fffffdfffbe0ffff 64KB PCI I/O space | |
66 | ||
67 | fffffdfffbe10000 fffffdfffbffffff ~2MB [guard] | |
68 | ||
69 | fffffdfffc000000 fffffdffffffffff 64MB modules | |
70 | ||
71 | fffffe0000000000 ffffffffffffffff 2TB kernel logical memory map | |
72 | ||
73 | ||
4f04d8f0 CM |
74 | Translation table lookup with 4KB pages: |
75 | ||
76 | +--------+--------+--------+--------+--------+--------+--------+--------+ | |
77 | |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0| | |
78 | +--------+--------+--------+--------+--------+--------+--------+--------+ | |
79 | | | | | | | | |
80 | | | | | | v | |
81 | | | | | | [11:0] in-page offset | |
82 | | | | | +-> [20:12] L3 index | |
83 | | | | +-----------> [29:21] L2 index | |
84 | | | +---------------------> [38:30] L1 index | |
85 | | +-------------------------------> [47:39] L0 index (not used) | |
86 | +-------------------------------------------------> [63] TTBR0/1 | |
87 | ||
88 | ||
89 | Translation table lookup with 64KB pages: | |
90 | ||
91 | +--------+--------+--------+--------+--------+--------+--------+--------+ | |
92 | |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0| | |
93 | +--------+--------+--------+--------+--------+--------+--------+--------+ | |
94 | | | | | | | |
95 | | | | | v | |
96 | | | | | [15:0] in-page offset | |
97 | | | | +----------> [28:16] L3 index | |
98 | | | +--------------------------> [41:29] L2 index (only 38:29 used) | |
99 | | +-------------------------------> [47:42] L1 index (not used) | |
100 | +-------------------------------------------------> [63] TTBR0/1 | |
aa4a73a0 MZ |
101 | |
102 | When using KVM, the hypervisor maps kernel pages in EL2, at a fixed | |
103 | offset from the kernel VA (top 24bits of the kernel VA set to zero): | |
104 | ||
105 | Start End Size Use | |
106 | ----------------------------------------------------------------------- | |
107 | 0000004000000000 0000007fffffffff 256GB kernel objects mapped in HYP |