← Documents Documentation/arch/x86/x86_64/mm.rst GitHub 원문 ↗

Linux 6.18.37 · Architecture

x86_64 Memory Management

4-level·5-level virtual-memory map과 direct, EFI, KASLR mapping 규칙을 설명합니다.

Source pathDocumentation/arch/x86/x86_64/mm.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

mm.rst:1-180

x86_64의 4-level layout은 약 128 TB userspace를, 5-level layout은 약 64 PB userspace를 제공합니다. 두 구조의 kernel region을 원문 address·offset·size 그대로 구조화 표에서 비교할 수 있습니다.

direct mapping, vmalloc, vmemmap은 `CONFIG_RANDOMIZE_MEMORY`에 따라 base가 바뀔 수 있고 EFI runtime mapping은 별도 `efi_pgd`에서 call 중에만 활성화됩니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 =================
4 Memory Management
5 =================
6
7 Complete virtual memory map with 4-level page tables
8 ====================================================
9
10 .. note::
11
12 - Negative addresses such as "-23 TB" are absolute addresses in bytes, counted down
13 from the top of the 64-bit address space. It's easier to understand the layout
14 when seen both in absolute addresses and in distance-from-top notation.
15
16 For example 0xffffe90000000000 == -23 TB, it's 23 TB lower than the top of the
17 64-bit address space (ffffffffffffffff).
18
19 Note that as we get closer to the top of the address space, the notation changes
20 from TB to GB and then MB/KB.
21
22 - "16M TB" might look weird at first sight, but it's an easier way to visualize size
23 notation than "16 EB", which few will recognize at first sight as 16 exabytes.
24 It also shows it nicely how incredibly large 64-bit address space is.
25
26 ::
27
28 ========================================================================================================================
29 Start addr | Offset | End addr | Size | VM area description
30 ========================================================================================================================
31 | | | |
32 0000000000000000 | 0 | 00007fffffffefff | ~128 TB | user-space virtual memory, different per mm
33 00007ffffffff000 | ~128 TB | 00007fffffffffff | 4 kB | ... guard hole
34 __________________|____________|__________________|_________|___________________________________________________________
35 | | | |
36 0000800000000000 | +128 TB | 7fffffffffffffff | ~8 EB | ... huge, almost 63 bits wide hole of non-canonical
37 | | | | virtual memory addresses up to the -8 EB
38 | | | | starting offset of kernel mappings.
39 | | | |
40 | | | | LAM relaxes canonicallity check allowing to create aliases
41 | | | | for userspace memory here.
42 __________________|____________|__________________|_________|___________________________________________________________
43 |
44 | Kernel-space virtual memory, shared between all processes:
45 __________________|____________|__________________|_________|___________________________________________________________
46 | | | |
47 8000000000000000 | -8 EB | ffff7fffffffffff | ~8 EB | ... huge, almost 63 bits wide hole of non-canonical
48 | | | | virtual memory addresses up to the -128 TB
49 | | | | starting offset of kernel mappings.
50 | | | |
51 | | | | LAM_SUP relaxes canonicallity check allowing to create
52 | | | | aliases for kernel memory here.
53 ____________________________________________________________|___________________________________________________________
54 | | | |
55 ffff800000000000 | -128 TB | ffff87ffffffffff | 8 TB | ... guard hole, also reserved for hypervisor
56 ffff880000000000 | -120 TB | ffff887fffffffff | 0.5 TB | LDT remap for PTI
57 ffff888000000000 | -119.5 TB | ffffc87fffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
58 ffffc88000000000 | -55.5 TB | ffffc8ffffffffff | 0.5 TB | ... unused hole
59 ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base)
60 ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole
61 ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base)
62 ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole
63 ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory
64 __________________|____________|__________________|_________|____________________________________________________________
65 |
66 | Identical layout to the 56-bit one from here on:
67 ____________________________________________________________|____________________________________________________________
68 | | | |
69 fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
70 | | | | vaddr_end for KASLR
71 fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
72 fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
73 ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
74 ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
75 ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
76 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
77 ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0
78 ffffffff80000000 |-2048 MB | | |
79 ffffffffa0000000 |-1536 MB | fffffffffeffffff | 1520 MB | module mapping space
80 ffffffffff000000 | -16 MB | | |
81 FIXADDR_START | ~-11 MB | ffffffffff5fffff | ~0.5 MB | kernel-internal fixmap range, variable size and offset
82 ffffffffff600000 | -10 MB | ffffffffff600fff | 4 kB | legacy vsyscall ABI
83 ffffffffffe00000 | -2 MB | ffffffffffffffff | 2 MB | ... unused hole
84 __________________|____________|__________________|_________|___________________________________________________________
85
86
87 Complete virtual memory map with 5-level page tables
88 ====================================================
89
90 .. note::
91
92 - With 56-bit addresses, user-space memory gets expanded by a factor of 512x,
93 from 0.125 PB to 64 PB. All kernel mappings shift down to the -64 PB starting
94 offset and many of the regions expand to support the much larger physical
95 memory supported.
96
97 ::
98
99 ========================================================================================================================
100 Start addr | Offset | End addr | Size | VM area description
101 ========================================================================================================================
102 | | | |
103 0000000000000000 | 0 | 00fffffffffff000 | ~64 PB | user-space virtual memory, different per mm
104 00fffffffffff000 | ~64 PB | 00ffffffffffffff | 4 kB | ... guard hole
105 __________________|____________|__________________|_________|___________________________________________________________
106 | | | |
107 0100000000000000 | +64 PB | 7fffffffffffffff | ~8 EB | ... huge, almost 63 bits wide hole of non-canonical
108 | | | | virtual memory addresses up to the -8EB TB
109 | | | | starting offset of kernel mappings.
110 | | | |
111 | | | | LAM relaxes canonicallity check allowing to create aliases
112 | | | | for userspace memory here.
113 __________________|____________|__________________|_________|___________________________________________________________
114 |
115 | Kernel-space virtual memory, shared between all processes:
116 ____________________________________________________________|___________________________________________________________
117 8000000000000000 | -8 EB | feffffffffffffff | ~8 EB | ... huge, almost 63 bits wide hole of non-canonical
118 | | | | virtual memory addresses up to the -64 PB
119 | | | | starting offset of kernel mappings.
120 | | | |
121 | | | | LAM_SUP relaxes canonicallity check allowing to create
122 | | | | aliases for kernel memory here.
123 ____________________________________________________________|___________________________________________________________
124 | | | |
125 ff00000000000000 | -64 PB | ff0fffffffffffff | 4 PB | ... guard hole, also reserved for hypervisor
126 ff10000000000000 | -60 PB | ff10ffffffffffff | 0.25 PB | LDT remap for PTI
127 ff11000000000000 | -59.75 PB | ff90ffffffffffff | 32 PB | direct mapping of all physical memory (page_offset_base)
128 ff91000000000000 | -27.75 PB | ff9fffffffffffff | 3.75 PB | ... unused hole
129 ffa0000000000000 | -24 PB | ffd1ffffffffffff | 12.5 PB | vmalloc/ioremap space (vmalloc_base)
130 ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole
131 ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base)
132 ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole
133 ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory
134 __________________|____________|__________________|_________|____________________________________________________________
135 |
136 | Identical layout to the 47-bit one from here on:
137 ____________________________________________________________|____________________________________________________________
138 | | | |
139 fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
140 | | | | vaddr_end for KASLR
141 fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
142 fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
143 ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
144 ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
145 ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
146 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
147 ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0
148 ffffffff80000000 |-2048 MB | | |
149 ffffffffa0000000 |-1536 MB | fffffffffeffffff | 1520 MB | module mapping space
150 ffffffffff000000 | -16 MB | | |
151 FIXADDR_START | ~-11 MB | ffffffffff5fffff | ~0.5 MB | kernel-internal fixmap range, variable size and offset
152 ffffffffff600000 | -10 MB | ffffffffff600fff | 4 kB | legacy vsyscall ABI
153 ffffffffffe00000 | -2 MB | ffffffffffffffff | 2 MB | ... unused hole
154 __________________|____________|__________________|_________|___________________________________________________________
155
156 Architecture defines a 64-bit virtual address. Implementations can support
157 less. Currently supported are 48- and 57-bit virtual addresses. Bits 63
158 through to the most-significant implemented bit are sign extended.
159 This causes hole between user space and kernel addresses if you interpret them
160 as unsigned.
161
162 The direct mapping covers all memory in the system up to the highest
163 memory address (this means in some cases it can also include PCI memory
164 holes).
165
166 We map EFI runtime services in the 'efi_pgd' PGD in a 64GB large virtual
167 memory window (this size is arbitrary, it can be raised later if needed).
168 The mappings are not part of any other kernel PGD and are only available
169 during EFI runtime calls.
170
171 Note that if CONFIG_RANDOMIZE_MEMORY is enabled, the direct mapping of all
172 physical memory, vmalloc/ioremap space and virtual memory map are randomized.
173 Their order is preserved but their base will be offset early at boot time.
174
175 Be very careful vs. KASLR when changing anything here. The KASLR address
176 range must not overlap with anything except the KASAN shadow area, which is
177 correct as KASAN disables KASLR.
178
179 For both 4- and 5-level layouts, the KSTACK_ERASE_POISON value in the last 2MB
180 hole: ffffffffffff4111
181

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

4-level memory map 표기법

1-25

이 문서는 `SPDX-License-Identifier: GPL-2.0`으로 배포되며 x86_64 memory management의 complete virtual-memory map을 설명합니다.

`-23 TB` 같은 negative address는 64-bit address space 최상단에서 아래로 센 absolute byte address입니다. 예를 들어 `0xffffe90000000000 == -23 TB`이며 `ffffffffffffffff`보다 23 TB 아래입니다. 상단에 가까워질수록 notation은 TB에서 GB, MB, KB로 바뀝니다.

`16M TB`는 처음에는 낯설지만 대중에게 익숙하지 않은 `16 EB`보다 크기를 시각화하기 쉽고 64-bit address space가 얼마나 큰지도 잘 보여 줍니다.

4-level page-table memory map

26-86
4-level virtual memory map
Start addrOffsetEnd addrSizeVM area
`0000000000000000``0``00007fffffffefff``~128 TB`mm마다 다른 userspace virtual memory
`00007ffffffff000``~128 TB``00007fffffffffff``4 kB`guard hole
`0000800000000000``+128 TB``7fffffffffffffff``~8 EB`-8 EB kernel mapping 시작점까지 이어지는 거의 63-bit non-canonical hole. LAM은 canonicity check를 완화해 이 영역에 userspace-memory alias를 만들 수 있게 함
`8000000000000000``-8 EB``ffff7fffffffffff``~8 EB`-128 TB kernel mapping 시작점까지 이어지는 거의 63-bit non-canonical hole. LAM_SUP는 kernel-memory alias를 허용
`ffff800000000000``-128 TB``ffff87ffffffffff``8 TB`guard hole, hypervisor용으로도 reserved
`ffff880000000000``-120 TB``ffff887fffffffff``0.5 TB`PTI용 LDT remap
`ffff888000000000``-119.5 TB``ffffc87fffffffff``64 TB`모든 physical memory의 direct mapping (`page_offset_base`)
`ffffc88000000000``-55.5 TB``ffffc8ffffffffff``0.5 TB`unused hole
`ffffc90000000000``-55 TB``ffffe8ffffffffff``32 TB`vmalloc/ioremap space (`vmalloc_base`)
`ffffe90000000000``-23 TB``ffffe9ffffffffff``1 TB`unused hole
`ffffea0000000000``-22 TB``ffffeaffffffffff``1 TB`virtual memory map (`vmemmap_base`)
`ffffeb0000000000``-21 TB``ffffebffffffffff``1 TB`unused hole
`ffffec0000000000``-20 TB``fffffbffffffffff``16 TB`KASAN shadow memory
`fffffc0000000000``-4 TB``fffffdffffffffff``2 TB`unused hole, KASLR의 `vaddr_end`
`fffffe0000000000``-2 TB``fffffe7fffffffff``0.5 TB``cpu_entry_area` mapping
`fffffe8000000000``-1.5 TB``fffffeffffffffff``0.5 TB`unused hole
`ffffff0000000000``-1 TB``ffffff7fffffffff``0.5 TB``%esp` fixup stack
`ffffff8000000000``-512 GB``ffffffeeffffffff``444 GB`unused hole
`ffffffef00000000``-68 GB``fffffffeffffffff``64 GB`EFI region mapping space
`ffffffff00000000``-4 GB``ffffffff7fffffff``2 GB`unused hole
`ffffffff80000000``-2 GB``ffffffff9fffffff``512 MB`physical address 0에 mapping된 kernel text
`ffffffff80000000``-2048 MB`kernel text offset marker
`ffffffffa0000000``-1536 MB``fffffffffeffffff``1520 MB`module mapping space
`ffffffffff000000``-16 MB`fixmap 전 offset marker
`FIXADDR_START``~-11 MB``ffffffffff5fffff``~0.5 MB`size와 offset이 가변인 kernel-internal fixmap range
`ffffffffff600000``-10 MB``ffffffffff600fff``4 kB`legacy vsyscall ABI
`ffffffffffe00000``-2 MB``ffffffffffffffff``2 MB`unused hole
공유 범위kernel-space virtual memory는 모든 process가 공유합니다.
공통 상단`fffffc0000000000`부터는 56-bit layout과 동일합니다.

47-bit userspace와 kernel-space의 전체 주소 범위를 원문 좌표로 구조화했습니다.

5-level address-space 확장

87-96

5-level page table의 56-bit address는 userspace memory를 0.125 PB에서 64 PB로 512배 확장합니다. 모든 kernel mapping은 시작 offset `-64 PB`로 내려가며 훨씬 큰 physical memory를 지원하도록 여러 region도 확장됩니다.

5-level page-table memory map

97-155
5-level virtual memory map
Start addrOffsetEnd addrSizeVM area
`0000000000000000``0``00fffffffffff000``~64 PB`mm마다 다른 userspace virtual memory
`00fffffffffff000``~64 PB``00ffffffffffffff``4 kB`guard hole
`0100000000000000``+64 PB``7fffffffffffffff``~8 EB`-8 EB kernel mapping 시작점까지 이어지는 거의 63-bit non-canonical hole. LAM이 userspace-memory alias를 허용
`8000000000000000``-8 EB``feffffffffffffff``~8 EB`-64 PB kernel mapping 시작점까지 이어지는 거의 63-bit non-canonical hole. LAM_SUP가 kernel-memory alias를 허용
`ff00000000000000``-64 PB``ff0fffffffffffff``4 PB`guard hole, hypervisor용으로도 reserved
`ff10000000000000``-60 PB``ff10ffffffffffff``0.25 PB`PTI용 LDT remap
`ff11000000000000``-59.75 PB``ff90ffffffffffff``32 PB`모든 physical memory의 direct mapping (`page_offset_base`)
`ff91000000000000``-27.75 PB``ff9fffffffffffff``3.75 PB`unused hole
`ffa0000000000000``-24 PB``ffd1ffffffffffff``12.5 PB`vmalloc/ioremap space (`vmalloc_base`)
`ffd2000000000000``-11.5 PB``ffd3ffffffffffff``0.5 PB`unused hole
`ffd4000000000000``-11 PB``ffd5ffffffffffff``0.5 PB`virtual memory map (`vmemmap_base`)
`ffd6000000000000``-10.5 PB``ffdeffffffffffff``2.25 PB`unused hole
`ffdf000000000000``-8.25 PB``fffffbffffffffff``~8 PB`KASAN shadow memory
`fffffc0000000000``-4 TB``fffffdffffffffff``2 TB`unused hole, KASLR의 `vaddr_end`
`fffffe0000000000``-2 TB``fffffe7fffffffff``0.5 TB``cpu_entry_area` mapping
`fffffe8000000000``-1.5 TB``fffffeffffffffff``0.5 TB`unused hole
`ffffff0000000000``-1 TB``ffffff7fffffffff``0.5 TB``%esp` fixup stack
`ffffff8000000000``-512 GB``ffffffeeffffffff``444 GB`unused hole
`ffffffef00000000``-68 GB``fffffffeffffffff``64 GB`EFI region mapping space
`ffffffff00000000``-4 GB``ffffffff7fffffff``2 GB`unused hole
`ffffffff80000000``-2 GB``ffffffff9fffffff``512 MB`physical address 0에 mapping된 kernel text
`ffffffff80000000``-2048 MB`kernel text offset marker
`ffffffffa0000000``-1536 MB``fffffffffeffffff``1520 MB`module mapping space
`ffffffffff000000``-16 MB`fixmap 전 offset marker
`FIXADDR_START``~-11 MB``ffffffffff5fffff``~0.5 MB`size와 offset이 가변인 kernel-internal fixmap range
`ffffffffff600000``-10 MB``ffffffffff600fff``4 kB`legacy vsyscall ABI
`ffffffffffe00000``-2 MB``ffffffffffffffff``2 MB`unused hole
공유 범위kernel-space virtual memory는 모든 process가 공유합니다.
공통 상단`fffffc0000000000`부터는 47-bit layout과 동일합니다.

56-bit userspace와 확장된 kernel mapping을 원문 좌표로 구조화했습니다.

canonical address와 runtime mapping

156-180

architecture는 64-bit virtual address를 정의하지만 implementation은 더 적은 bit를 지원할 수 있습니다. 현재 48-bit와 57-bit virtual address를 지원하며 bit 63부터 구현된 최상위 bit까지 sign extension합니다. 이를 unsigned로 해석하면 userspace와 kernel address 사이에 hole이 생깁니다.

direct mapping은 system의 최고 memory address까지 모든 memory를 포괄하므로 경우에 따라 PCI memory hole도 포함할 수 있습니다.

EFI runtime service는 `efi_pgd` PGD의 64GB virtual-memory window에 mapping합니다. 크기는 임의로 정한 것이며 필요하면 늘릴 수 있습니다. 이 mapping은 다른 kernel PGD에는 포함되지 않고 EFI runtime call 중에만 사용할 수 있습니다.

`CONFIG_RANDOMIZE_MEMORY`를 활성화하면 physical-memory direct mapping, vmalloc/ioremap space, virtual-memory map을 randomize합니다. 순서는 유지하지만 base는 early boot에서 offset됩니다.

이 영역을 바꿀 때는 KASLR과의 관계를 매우 주의해야 합니다. KASLR address range는 KASAN shadow area 외의 어떤 영역과도 겹치면 안 됩니다. KASAN은 KASLR을 비활성화하므로 둘의 overlap은 올바릅니다.

4-level과 5-level layout 모두 마지막 2MB hole에 있는 `KSTACK_ERASE_POISON` 값은 `ffffffffffff4111`입니다.