Linux Virtual Memory Space
x86_64 4 Page Level Mapping, Linux v6.9 taken from here
|
|
Negative addresses such as β-23 TBβ are absolute addresses in bytes, counted down from the top of the 64-bit address space. Itβs easier to understand the layout when seen both in absolute addresses and in distance-from-top notation.
For example 0xffffe90000000000 == -23 TB, itβs 23 TB lower than the top of the 64-bit address space (ffffffffffffffff).
A more detailed one maybe [1]:
Userland (128 TiB)
0000000000000000 -> |---------------| ^
| Process | |
| address | | 128 TiB
| space | |
0000800000000000 -> |---------------| v
. ` . - `- ./ _
_ .` - The netherworld of `/ `
- ` _ | / unavailable sign-extended -/ .
` - . ` 48-bit address space - \ / -
\- - . . . . \ / -
Kernel (128 TiB)
ffff800000000000 -> |----------------| ^
| Hypervisor | |
| reserved | | 8 TiB
| space | |
ffff880000000000 -> |----------------| x
| LDT remap for | | 0.5 TiB
| PTI | |
[kaslr] PAGE_OFFSET = ffff888000000000 -> |----------------| x
| Direct mapping | |
| of all phys. | | 64 TiB
| memory | |
ffffc88000000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
[kaslr] VMALLOC_START = ffffc90000000000 -> |----------------| ^
| vmalloc/ | |
| ioremap | | 32 TiB
| space | |
VMALLOC_END + 1 = ffffe90000000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
[kaslr] VMEMMAP_START = ffffea0000000000 -> |----------------| ^
| Virtual | |
| memory map | | 1 TiB
| (struct page | |
| array) | |
ffffeb0000000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
ffffec0000000000 -> |----------------| ^
| KASAN shadow | | 16 TiB
| memory | |
fffffc0000000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
fffffe0000000000 -> |----------------| ^
| cpu_entry_area | | 0.5 TiB
| mapping | |
fffffe8000000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
ESPFIX_BASE_ADDR = ffffff0000000000 -> |----------------| ^
| %esp fixup | | 0.5 TiB
| stacks | |
ffffff8000000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
EFI_VA_END = ffffffef00000000 -> |----------------| ^
| EFI region | | 64 GiB
| mapping space | |
EFI_VA_START = ffffffff00000000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
__START_KERNEL_map = ffffffff80000000 -> |----------------| ^
| Kernel | |
| text | | KERNEL_IMAGE_SIZE = 1 GiB *
| mapping | |
MODULES_VADDR = ffffffffc0000000 -> |----------------| x *
| Module | |
| mapping | | 1 GiB *
| space | |
ffffffffff600000 -> |----------------| x
| vsyscalls | | 8 MiB
ffffffffffe00000 -> |----------------| v
/ /
\ unused \
/ hole /
\ \
------------------
[1] https://github.com/lorenzo-stoakes/linux-mm-notes/blob/master/virt_layout.md