Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1.. SPDX-License-Identifier: GPL-2.0
2
3=====================================
4Virtual Memory Layout on RISC-V Linux
5=====================================
6
7:Author: Alexandre Ghiti <alex@ghiti.fr>
8:Date: 12 February 2021
9
10This document describes the virtual memory layout used by the RISC-V Linux
11Kernel.
12
13RISC-V Linux Kernel 32bit
14=========================
15
16RISC-V Linux Kernel SV32
17------------------------
18
19TODO
20
21RISC-V Linux Kernel 64bit
22=========================
23
24The RISC-V privileged architecture document states that the 64bit addresses
25"must have bits 63–48 all equal to bit 47, or else a page-fault exception will
26occur.": that splits the virtual address space into 2 halves separated by a very
27big hole, the lower half is where the userspace resides, the upper half is where
28the RISC-V Linux Kernel resides.
29
30RISC-V Linux Kernel SV39
31------------------------
32
33::
34
35 ========================================================================================================================
36 Start addr | Offset | End addr | Size | VM area description
37 ========================================================================================================================
38 | | | |
39 0000000000000000 | 0 | 0000003fffffffff | 256 GB | user-space virtual memory, different per mm
40 __________________|____________|__________________|_________|___________________________________________________________
41 | | | |
42 0000004000000000 | +256 GB | ffffffbfffffffff | ~16M TB | ... huge, almost 64 bits wide hole of non-canonical
43 | | | | virtual memory addresses up to the -256 GB
44 | | | | starting offset of kernel mappings.
45 __________________|____________|__________________|_________|___________________________________________________________
46 |
47 | Kernel-space virtual memory, shared between all processes:
48 ____________________________________________________________|___________________________________________________________
49 | | | |
50 ffffffc6fea00000 | -228 GB | ffffffc6feffffff | 6 MB | fixmap
51 ffffffc6ff000000 | -228 GB | ffffffc6ffffffff | 16 MB | PCI io
52 ffffffc700000000 | -228 GB | ffffffc7ffffffff | 4 GB | vmemmap
53 ffffffc800000000 | -224 GB | ffffffd7ffffffff | 64 GB | vmalloc/ioremap space
54 ffffffd800000000 | -160 GB | fffffff6ffffffff | 124 GB | direct mapping of all physical memory
55 fffffff700000000 | -36 GB | fffffffeffffffff | 32 GB | kasan
56 __________________|____________|__________________|_________|____________________________________________________________
57 |
58 |
59 ____________________________________________________________|____________________________________________________________
60 | | | |
61 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | modules, BPF
62 ffffffff80000000 | -2 GB | ffffffffffffffff | 2 GB | kernel
63 __________________|____________|__________________|_________|____________________________________________________________
64
65
66RISC-V Linux Kernel SV48
67------------------------
68
69::
70
71 ========================================================================================================================
72 Start addr | Offset | End addr | Size | VM area description
73 ========================================================================================================================
74 | | | |
75 0000000000000000 | 0 | 00007fffffffffff | 128 TB | user-space virtual memory, different per mm
76 __________________|____________|__________________|_________|___________________________________________________________
77 | | | |
78 0000800000000000 | +128 TB | ffff7fffffffffff | ~16M TB | ... huge, almost 64 bits wide hole of non-canonical
79 | | | | virtual memory addresses up to the -128 TB
80 | | | | starting offset of kernel mappings.
81 __________________|____________|__________________|_________|___________________________________________________________
82 |
83 | Kernel-space virtual memory, shared between all processes:
84 ____________________________________________________________|___________________________________________________________
85 | | | |
86 ffff8d7ffea00000 | -114.5 TB | ffff8d7ffeffffff | 6 MB | fixmap
87 ffff8d7fff000000 | -114.5 TB | ffff8d7fffffffff | 16 MB | PCI io
88 ffff8d8000000000 | -114.5 TB | ffff8f7fffffffff | 2 TB | vmemmap
89 ffff8f8000000000 | -112.5 TB | ffffaf7fffffffff | 32 TB | vmalloc/ioremap space
90 ffffaf8000000000 | -80.5 TB | ffffef7fffffffff | 64 TB | direct mapping of all physical memory
91 ffffef8000000000 | -16.5 TB | fffffffeffffffff | 16.5 TB | kasan
92 __________________|____________|__________________|_________|____________________________________________________________
93 |
94 | Identical layout to the 39-bit one from here on:
95 ____________________________________________________________|____________________________________________________________
96 | | | |
97 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | modules, BPF
98 ffffffff80000000 | -2 GB | ffffffffffffffff | 2 GB | kernel
99 __________________|____________|__________________|_________|____________________________________________________________
100
101
102RISC-V Linux Kernel SV57
103------------------------
104
105::
106
107 ========================================================================================================================
108 Start addr | Offset | End addr | Size | VM area description
109 ========================================================================================================================
110 | | | |
111 0000000000000000 | 0 | 00ffffffffffffff | 64 PB | user-space virtual memory, different per mm
112 __________________|____________|__________________|_________|___________________________________________________________
113 | | | |
114 0100000000000000 | +64 PB | feffffffffffffff | ~16K PB | ... huge, almost 64 bits wide hole of non-canonical
115 | | | | virtual memory addresses up to the -64 PB
116 | | | | starting offset of kernel mappings.
117 __________________|____________|__________________|_________|___________________________________________________________
118 |
119 | Kernel-space virtual memory, shared between all processes:
120 ____________________________________________________________|___________________________________________________________
121 | | | |
122 ff1bfffffea00000 | -57 PB | ff1bfffffeffffff | 6 MB | fixmap
123 ff1bffffff000000 | -57 PB | ff1bffffffffffff | 16 MB | PCI io
124 ff1c000000000000 | -57 PB | ff1fffffffffffff | 1 PB | vmemmap
125 ff20000000000000 | -56 PB | ff5fffffffffffff | 16 PB | vmalloc/ioremap space
126 ff60000000000000 | -40 PB | ffdeffffffffffff | 32 PB | direct mapping of all physical memory
127 ffdf000000000000 | -8 PB | fffffffeffffffff | 8 PB | kasan
128 __________________|____________|__________________|_________|____________________________________________________________
129 |
130 | Identical layout to the 39-bit one from here on:
131 ____________________________________________________________|____________________________________________________________
132 | | | |
133 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | modules, BPF
134 ffffffff80000000 | -2 GB | ffffffffffffffff | 2 GB | kernel
135 __________________|____________|__________________|_________|____________________________________________________________
136
137
138Userspace VAs
139--------------------
140To maintain compatibility with software that relies on the VA space with a
141maximum of 48 bits the kernel will, by default, return virtual addresses to
142userspace from a 48-bit range (sv48). This default behavior is achieved by
143passing 0 into the hint address parameter of mmap. On CPUs with an address space
144smaller than sv48, the CPU maximum supported address space will be the default.
145
146Software can "opt-in" to receiving VAs from another VA space by providing
147a hint address to mmap. A hint address passed to mmap will cause the largest
148address space that fits entirely into the hint to be used, unless there is no
149space left in the address space. If there is no space available in the requested
150address space, an address in the next smallest available address space will be
151returned.
152
153For example, in order to obtain 48-bit VA space, a hint address greater than
154:code:`1 << 47` must be provided. Note that this is 47 due to sv48 userspace
155ending at :code:`1 << 47` and the addresses beyond this are reserved for the
156kernel. Similarly, to obtain 57-bit VA space addresses, a hint address greater
157than or equal to :code:`1 << 56` must be provided.