← Documents Documentation/arch/riscv/vm-layout.rst GitHub 원문 ↗

Linux 6.18.37 · Architecture

Virtual Memory Layout on RISC-V Linux

SV39, SV48, SV57의 userspace, non-canonical hole과 shared kernel mapping 주소 배치입니다.

Source pathDocumentation/arch/riscv/vm-layout.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

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

1. 요약·해설

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

요약과 해설

vm-layout.rst:1-136

64-bit canonical-address 규칙은 userspace lower half와 kernel upper half를 큰 hole로 분리합니다. Address width가 늘어도 마지막 4 GB의 modules/BPF와 kernel layout은 동일합니다.

2. 영어 원문 전체

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

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 =====================================
4 Virtual Memory Layout on RISC-V Linux
5 =====================================
6
7 :Author: Alexandre Ghiti <[email protected]>
8 :Date: 12 February 2021
9
10 This document describes the virtual memory layout used by the RISC-V Linux
11 Kernel.
12
13 RISC-V Linux Kernel 32bit
14 =========================
15
16 RISC-V Linux Kernel SV32
17 ------------------------
18
19 TODO
20
21 RISC-V Linux Kernel 64bit
22 =========================
23
24 The 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
26 occur.": that splits the virtual address space into 2 halves separated by a very
27 big hole, the lower half is where the userspace resides, the upper half is where
28 the RISC-V Linux Kernel resides.
29
30 RISC-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 ffffffc4fea00000 | -236 GB | ffffffc4feffffff | 6 MB | fixmap
51 ffffffc4ff000000 | -236 GB | ffffffc4ffffffff | 16 MB | PCI io
52 ffffffc500000000 | -236 GB | ffffffc5ffffffff | 4 GB | vmemmap
53 ffffffc600000000 | -232 GB | ffffffd5ffffffff | 64 GB | vmalloc/ioremap space
54 ffffffd600000000 | -168 GB | fffffff5ffffffff | 128 GB | direct mapping of all physical memory
55 | | | |
56 fffffff700000000 | -36 GB | fffffffeffffffff | 32 GB | kasan
57 __________________|____________|__________________|_________|____________________________________________________________
58 |
59 |
60 ____________________________________________________________|____________________________________________________________
61 | | | |
62 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | modules, BPF
63 ffffffff80000000 | -2 GB | ffffffffffffffff | 2 GB | kernel
64 __________________|____________|__________________|_________|____________________________________________________________
65
66
67 RISC-V Linux Kernel SV48
68 ------------------------
69
70 ::
71
72 ========================================================================================================================
73 Start addr | Offset | End addr | Size | VM area description
74 ========================================================================================================================
75 | | | |
76 0000000000000000 | 0 | 00007fffffffffff | 128 TB | user-space virtual memory, different per mm
77 __________________|____________|__________________|_________|___________________________________________________________
78 | | | |
79 0000800000000000 | +128 TB | ffff7fffffffffff | ~16M TB | ... huge, almost 64 bits wide hole of non-canonical
80 | | | | virtual memory addresses up to the -128 TB
81 | | | | starting offset of kernel mappings.
82 __________________|____________|__________________|_________|___________________________________________________________
83 |
84 | Kernel-space virtual memory, shared between all processes:
85 ____________________________________________________________|___________________________________________________________
86 | | | |
87 ffff8d7ffea00000 | -114.5 TB | ffff8d7ffeffffff | 6 MB | fixmap
88 ffff8d7fff000000 | -114.5 TB | ffff8d7fffffffff | 16 MB | PCI io
89 ffff8d8000000000 | -114.5 TB | ffff8f7fffffffff | 2 TB | vmemmap
90 ffff8f8000000000 | -112.5 TB | ffffaf7fffffffff | 32 TB | vmalloc/ioremap space
91 ffffaf8000000000 | -80.5 TB | ffffef7fffffffff | 64 TB | direct mapping of all physical memory
92 ffffef8000000000 | -16.5 TB | fffffffeffffffff | 16.5 TB | kasan
93 __________________|____________|__________________|_________|____________________________________________________________
94 |
95 | Identical layout to the 39-bit one from here on:
96 ____________________________________________________________|____________________________________________________________
97 | | | |
98 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | modules, BPF
99 ffffffff80000000 | -2 GB | ffffffffffffffff | 2 GB | kernel
100 __________________|____________|__________________|_________|____________________________________________________________
101
102
103 RISC-V Linux Kernel SV57
104 ------------------------
105
106 ::
107
108 ========================================================================================================================
109 Start addr | Offset | End addr | Size | VM area description
110 ========================================================================================================================
111 | | | |
112 0000000000000000 | 0 | 00ffffffffffffff | 64 PB | user-space virtual memory, different per mm
113 __________________|____________|__________________|_________|___________________________________________________________
114 | | | |
115 0100000000000000 | +64 PB | feffffffffffffff | ~16K PB | ... huge, almost 64 bits wide hole of non-canonical
116 | | | | virtual memory addresses up to the -64 PB
117 | | | | starting offset of kernel mappings.
118 __________________|____________|__________________|_________|___________________________________________________________
119 |
120 | Kernel-space virtual memory, shared between all processes:
121 ____________________________________________________________|___________________________________________________________
122 | | | |
123 ff1bfffffea00000 | -57 PB | ff1bfffffeffffff | 6 MB | fixmap
124 ff1bffffff000000 | -57 PB | ff1bffffffffffff | 16 MB | PCI io
125 ff1c000000000000 | -57 PB | ff1fffffffffffff | 1 PB | vmemmap
126 ff20000000000000 | -56 PB | ff5fffffffffffff | 16 PB | vmalloc/ioremap space
127 ff60000000000000 | -40 PB | ffdeffffffffffff | 32 PB | direct mapping of all physical memory
128 ffdf000000000000 | -8 PB | fffffffeffffffff | 8 PB | kasan
129 __________________|____________|__________________|_________|____________________________________________________________
130 |
131 | Identical layout to the 39-bit one from here on:
132 ____________________________________________________________|____________________________________________________________
133 | | | |
134 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | modules, BPF
135 ffffffff80000000 | -2 GB | ffffffffffffffff | 2 GB | kernel
136 __________________|____________|__________________|_________|____________________________________________________________
137

3. 한국어 전문 번역

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

RISC-V Linux virtual memory layout

1-12

Alexandre Ghiti가 2021-02-12 작성한 이 문서는 RISC-V Linux kernel이 사용하는 virtual memory layout을 설명합니다.

32-bit SV32

13-20

RISC-V Linux kernel의 SV32 layout 설명은 원문에서 아직 TODO입니다.

64-bit canonical address split

21-29

RISC-V privileged architecture는 64-bit address의 bit 63-48이 모두 bit 47과 같아야 하며 그렇지 않으면 page-fault exception이 발생한다고 규정합니다.

이 규칙은 virtual address space를 큰 non-canonical hole로 분리된 두 half로 나눕니다. Lower half에는 userspace, upper half에는 RISC-V Linux kernel이 위치합니다.

SV39 layout

30-66

SV39는 256 GB userspace와 kernel upper-half 사이에 거의 64-bit 폭의 non-canonical hole을 둡니다. Kernel-space mapping은 모든 process가 공유합니다.

RISC-V SV39 virtual memory map
Start addressOffsetEnd addressSizeVM area
000000000000000000000003fffffffff256 GBUserspace virtual memory, mm마다 다름
0000004000000000+256 GBffffffbfffffffff~16M TB-256 GB kernel mapping 시작점까지의 non-canonical hole
ffffffc4fea00000-236 GBffffffc4feffffff6 MBfixmap
ffffffc4ff000000-236 GBffffffc4ffffffff16 MBPCI io
ffffffc500000000-236 GBffffffc5ffffffff4 GBvmemmap
ffffffc600000000-232 GBffffffd5ffffffff64 GBvmalloc/ioremap space
ffffffd600000000-168 GBfffffff5ffffffff128 GB모든 physical memory의 direct mapping
fffffff700000000-36 GBfffffffeffffffff32 GBkasan
ffffffff00000000-4 GBffffffff7fffffff2 GBmodules, BPF
ffffffff80000000-2 GBffffffffffffffff2 GBkernel

원문의 ASCII address table을 동일한 address, offset, size로 구조화했습니다.

SV48 layout

67-102

SV48는 userspace를 128 TB로 확장하고 -114.5 TB 부근부터 kernel mapping을 배치합니다. Modules/BPF와 kernel의 마지막 4 GB layout은 SV39와 같습니다.

RISC-V SV48 virtual memory map
Start addressOffsetEnd addressSizeVM area
0000000000000000000007fffffffffff128 TBUserspace virtual memory, mm마다 다름
0000800000000000+128 TBffff7fffffffffff~16M TB-128 TB kernel mapping 시작점까지의 non-canonical hole
ffff8d7ffea00000-114.5 TBffff8d7ffeffffff6 MBfixmap
ffff8d7fff000000-114.5 TBffff8d7fffffffff16 MBPCI io
ffff8d8000000000-114.5 TBffff8f7fffffffff2 TBvmemmap
ffff8f8000000000-112.5 TBffffaf7fffffffff32 TBvmalloc/ioremap space
ffffaf8000000000-80.5 TBffffef7fffffffff64 TB모든 physical memory의 direct mapping
ffffef8000000000-16.5 TBfffffffeffffffff16.5 TBkasan
ffffffff00000000-4 GBffffffff7fffffff2 GBmodules, BPF
ffffffff80000000-2 GBffffffffffffffff2 GBkernel

SV48의 userspace, non-canonical hole, shared kernel mappings입니다.

SV57 layout

103-136

SV57은 userspace를 64 PB로 확장하고 -57 PB 부근부터 kernel mapping을 배치합니다. Modules/BPF와 kernel의 마지막 4 GB layout은 SV39와 같습니다.

RISC-V SV57 virtual memory map
Start addressOffsetEnd addressSizeVM area
0000000000000000000ffffffffffffff64 PBUserspace virtual memory, mm마다 다름
0100000000000000+64 PBfeffffffffffffff~16K PB-64 PB kernel mapping 시작점까지의 non-canonical hole
ff1bfffffea00000-57 PBff1bfffffeffffff6 MBfixmap
ff1bffffff000000-57 PBff1bffffffffffff16 MBPCI io
ff1c000000000000-57 PBff1fffffffffffff1 PBvmemmap
ff20000000000000-56 PBff5fffffffffffff16 PBvmalloc/ioremap space
ff60000000000000-40 PBffdeffffffffffff32 PB모든 physical memory의 direct mapping
ffdf000000000000-8 PBfffffffeffffffff8 PBkasan
ffffffff00000000-4 GBffffffff7fffffff2 GBmodules, BPF
ffffffff80000000-2 GBffffffffffffffff2 GBkernel

SV57의 userspace, non-canonical hole, shared kernel mappings입니다.