|
| 1 | +==================================================== |
| 2 | +Complete virtual memory map with 4-level page tables |
| 3 | +==================================================== |
1 | 4 |
|
2 |
| -Virtual memory map with 4 level page tables: |
3 |
| - |
4 |
| -0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm |
5 |
| -hole caused by [47:63] sign extension |
6 |
| -ffff800000000000 - ffff87ffffffffff (=43 bits) guard hole, reserved for hypervisor |
7 |
| -ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory |
8 |
| -ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole |
9 |
| -ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space |
10 |
| -ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole |
11 |
| -ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB) |
12 |
| -... unused hole ... |
13 |
| -ffffec0000000000 - fffffbffffffffff (=44 bits) kasan shadow memory (16TB) |
14 |
| -... unused hole ... |
15 |
| - vaddr_end for KASLR |
16 |
| -fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping |
17 |
| -fffffe8000000000 - fffffeffffffffff (=39 bits) LDT remap for PTI |
18 |
| -ffffff0000000000 - ffffff7fffffffff (=39 bits) %esp fixup stacks |
19 |
| -... unused hole ... |
20 |
| -ffffffef00000000 - fffffffeffffffff (=64 GB) EFI region mapping space |
21 |
| -... unused hole ... |
22 |
| -ffffffff80000000 - ffffffff9fffffff (=512 MB) kernel text mapping, from phys 0 |
23 |
| -ffffffffa0000000 - fffffffffeffffff (1520 MB) module mapping space |
24 |
| -[fixmap start] - ffffffffff5fffff kernel-internal fixmap range |
25 |
| -ffffffffff600000 - ffffffffff600fff (=4 kB) legacy vsyscall ABI |
26 |
| -ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole |
27 |
| - |
28 |
| -Virtual memory map with 5 level page tables: |
29 |
| - |
30 |
| -0000000000000000 - 00ffffffffffffff (=56 bits) user space, different per mm |
31 |
| -hole caused by [56:63] sign extension |
32 |
| -ff00000000000000 - ff0fffffffffffff (=52 bits) guard hole, reserved for hypervisor |
33 |
| -ff10000000000000 - ff8fffffffffffff (=55 bits) direct mapping of all phys. memory |
34 |
| -ff90000000000000 - ff9fffffffffffff (=52 bits) LDT remap for PTI |
35 |
| -ffa0000000000000 - ffd1ffffffffffff (=54 bits) vmalloc/ioremap space (12800 TB) |
36 |
| -ffd2000000000000 - ffd3ffffffffffff (=49 bits) hole |
37 |
| -ffd4000000000000 - ffd5ffffffffffff (=49 bits) virtual memory map (512TB) |
38 |
| -... unused hole ... |
39 |
| -ffdf000000000000 - fffffc0000000000 (=53 bits) kasan shadow memory (8PB) |
40 |
| -... unused hole ... |
41 |
| - vaddr_end for KASLR |
42 |
| -fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping |
43 |
| -... unused hole ... |
44 |
| -ffffff0000000000 - ffffff7fffffffff (=39 bits) %esp fixup stacks |
45 |
| -... unused hole ... |
46 |
| -ffffffef00000000 - fffffffeffffffff (=64 GB) EFI region mapping space |
47 |
| -... unused hole ... |
48 |
| -ffffffff80000000 - ffffffff9fffffff (=512 MB) kernel text mapping, from phys 0 |
49 |
| -ffffffffa0000000 - fffffffffeffffff (1520 MB) module mapping space |
50 |
| -[fixmap start] - ffffffffff5fffff kernel-internal fixmap range |
51 |
| -ffffffffff600000 - ffffffffff600fff (=4 kB) legacy vsyscall ABI |
52 |
| -ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole |
| 5 | +Notes: |
| 6 | + |
| 7 | + - Negative addresses such as "-23 TB" are absolute addresses in bytes, counted down |
| 8 | + from the top of the 64-bit address space. It's easier to understand the layout |
| 9 | + when seen both in absolute addresses and in distance-from-top notation. |
| 10 | + |
| 11 | + For example 0xffffe90000000000 == -23 TB, it's 23 TB lower than the top of the |
| 12 | + 64-bit address space (ffffffffffffffff). |
| 13 | + |
| 14 | + Note that as we get closer to the top of the address space, the notation changes |
| 15 | + from TB to GB and then MB/KB. |
| 16 | + |
| 17 | + - "16M TB" might look weird at first sight, but it's an easier to visualize size |
| 18 | + notation than "16 EB", which few will recognize at first sight as 16 exabytes. |
| 19 | + It also shows it nicely how incredibly large 64-bit address space is. |
| 20 | + |
| 21 | +======================================================================================================================== |
| 22 | + Start addr | Offset | End addr | Size | VM area description |
| 23 | +======================================================================================================================== |
| 24 | + | | | | |
| 25 | + 0000000000000000 | 0 | 00007fffffffffff | 128 TB | user-space virtual memory, different per mm |
| 26 | +__________________|____________|__________________|_________|___________________________________________________________ |
| 27 | + | | | | |
| 28 | + 0000800000000000 | +128 TB | ffff7fffffffffff | ~16M TB | ... huge, almost 64 bits wide hole of non-canonical |
| 29 | + | | | | virtual memory addresses up to the -128 TB |
| 30 | + | | | | starting offset of kernel mappings. |
| 31 | +__________________|____________|__________________|_________|___________________________________________________________ |
| 32 | + | |
| 33 | + | Kernel-space virtual memory, shared between all processes: |
| 34 | +____________________________________________________________|___________________________________________________________ |
| 35 | + | | | | |
| 36 | + ffff800000000000 | -128 TB | ffff87ffffffffff | 8 TB | ... guard hole, also reserved for hypervisor |
| 37 | + ffff880000000000 | -120 TB | ffffc7ffffffffff | 64 TB | direct mapping of all physical memory (page_offset_base) |
| 38 | + ffffc80000000000 | -56 TB | ffffc8ffffffffff | 1 TB | ... unused hole |
| 39 | + ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base) |
| 40 | + ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole |
| 41 | + ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base) |
| 42 | + ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole |
| 43 | + ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory |
| 44 | + fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole |
| 45 | + | | | | vaddr_end for KASLR |
| 46 | + fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping |
| 47 | + fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | LDT remap for PTI |
| 48 | + ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks |
| 49 | +__________________|____________|__________________|_________|____________________________________________________________ |
| 50 | + | |
| 51 | + | Identical layout to the 47-bit one from here on: |
| 52 | +____________________________________________________________|____________________________________________________________ |
| 53 | + | | | | |
| 54 | + ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole |
| 55 | + ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space |
| 56 | + ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole |
| 57 | + ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0 |
| 58 | + ffffffff80000000 |-2048 MB | | | |
| 59 | + ffffffffa0000000 |-1536 MB | fffffffffeffffff | 1520 MB | module mapping space |
| 60 | + ffffffffff000000 | -16 MB | | | |
| 61 | + FIXADDR_START | ~-11 MB | ffffffffff5fffff | ~0.5 MB | kernel-internal fixmap range, variable size and offset |
| 62 | + ffffffffff600000 | -10 MB | ffffffffff600fff | 4 kB | legacy vsyscall ABI |
| 63 | + ffffffffffe00000 | -2 MB | ffffffffffffffff | 2 MB | ... unused hole |
| 64 | +__________________|____________|__________________|_________|___________________________________________________________ |
| 65 | + |
| 66 | + |
| 67 | +==================================================== |
| 68 | +Complete virtual memory map with 5-level page tables |
| 69 | +==================================================== |
| 70 | + |
| 71 | +Notes: |
| 72 | + |
| 73 | + - With 56-bit addresses, user-space memory gets expanded by a factor of 512x, |
| 74 | + from 0.125 PB to 64 PB. All kernel mappings shift down to the -64 PT starting |
| 75 | + offset and many of the regions expand to support the much larger physical |
| 76 | + memory supported. |
| 77 | + |
| 78 | +======================================================================================================================== |
| 79 | + Start addr | Offset | End addr | Size | VM area description |
| 80 | +======================================================================================================================== |
| 81 | + | | | | |
| 82 | + 0000000000000000 | 0 | 00ffffffffffffff | 64 PB | user-space virtual memory, different per mm |
| 83 | +__________________|____________|__________________|_________|___________________________________________________________ |
| 84 | + | | | | |
| 85 | + 0000800000000000 | +64 PB | ffff7fffffffffff | ~16K PB | ... huge, still almost 64 bits wide hole of non-canonical |
| 86 | + | | | | virtual memory addresses up to the -128 TB |
| 87 | + | | | | starting offset of kernel mappings. |
| 88 | +__________________|____________|__________________|_________|___________________________________________________________ |
| 89 | + | |
| 90 | + | Kernel-space virtual memory, shared between all processes: |
| 91 | +____________________________________________________________|___________________________________________________________ |
| 92 | + | | | | |
| 93 | + ff00000000000000 | -64 PB | ff0fffffffffffff | 4 PB | ... guard hole, also reserved for hypervisor |
| 94 | + ff10000000000000 | -60 PB | ff8fffffffffffff | 32 PB | direct mapping of all physical memory (page_offset_base) |
| 95 | + ff90000000000000 | -28 PB | ff9fffffffffffff | 4 PB | LDT remap for PTI |
| 96 | + ffa0000000000000 | -24 PB | ffd1ffffffffffff | 12.5 PB | vmalloc/ioremap space (vmalloc_base) |
| 97 | + ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole |
| 98 | + ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base) |
| 99 | + ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole |
| 100 | + ffdf000000000000 | -8.25 PB | fffffdffffffffff | ~8 PB | KASAN shadow memory |
| 101 | + fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole |
| 102 | + | | | | vaddr_end for KASLR |
| 103 | + fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping |
| 104 | + fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole |
| 105 | + ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks |
| 106 | +__________________|____________|__________________|_________|____________________________________________________________ |
| 107 | + | |
| 108 | + | Identical layout to the 47-bit one from here on: |
| 109 | +____________________________________________________________|____________________________________________________________ |
| 110 | + | | | | |
| 111 | + ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole |
| 112 | + ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space |
| 113 | + ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole |
| 114 | + ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0 |
| 115 | + ffffffff80000000 |-2048 MB | | | |
| 116 | + ffffffffa0000000 |-1536 MB | fffffffffeffffff | 1520 MB | module mapping space |
| 117 | + ffffffffff000000 | -16 MB | | | |
| 118 | + FIXADDR_START | ~-11 MB | ffffffffff5fffff | ~0.5 MB | kernel-internal fixmap range, variable size and offset |
| 119 | + ffffffffff600000 | -10 MB | ffffffffff600fff | 4 kB | legacy vsyscall ABI |
| 120 | + ffffffffffe00000 | -2 MB | ffffffffffffffff | 2 MB | ... unused hole |
| 121 | +__________________|____________|__________________|_________|___________________________________________________________ |
53 | 122 |
|
54 | 123 | Architecture defines a 64-bit virtual address. Implementations can support
|
55 | 124 | less. Currently supported are 48- and 57-bit virtual addresses. Bits 63
|
|
0 commit comments