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. 158