← Documents Documentation/arch/xtensa/mmu.rst GitHub 원문 ↗

Linux 6.18.37 · Architecture

Xtensa MMUv3 Initialization and Address Space

MMUv3 초기 TLB 전환과 128·256·512MB KSEG address-space layout을 설명합니다.

Source pathDocumentation/arch/xtensa/mmu.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

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

1. 요약·해설

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

요약과 해설

mmu.rst:1-198

Xtensa MMUv3는 position-independent 초기화 code로 reset TLB를 MMUv2-compatible mapping으로 단계적으로 전환하고, 임시 virtual address를 거쳐 최종 linked address로 이동합니다.

address-space layout은 KSEG 크기에 따라 VMALLOC·KMAP 계열 위치가 달라집니다. 세 layout의 symbol, VADDR, size와 device-tree IO remap 제약을 구조화 표로 비교할 수 있습니다.

2. 영어 원문 전체

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

원문 전체 펼치기
1 =============================
2 MMUv3 initialization sequence
3 =============================
4
5 The code in the initialize_mmu macro sets up MMUv3 memory mapping
6 identically to MMUv2 fixed memory mapping. Depending on
7 CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX symbol this code is
8 located in addresses it was linked for (symbol undefined), or not
9 (symbol defined), so it needs to be position-independent.
10
11 The code has the following assumptions:
12
13 - This code fragment is run only on an MMU v3.
14 - TLBs are in their reset state.
15 - ITLBCFG and DTLBCFG are zero (reset state).
16 - RASID is 0x04030201 (reset state).
17 - PS.RING is zero (reset state).
18 - LITBASE is zero (reset state, PC-relative literals); required to be PIC.
19
20 TLB setup proceeds along the following steps.
21
22 Legend:
23
24 - VA = virtual address (two upper nibbles of it);
25 - PA = physical address (two upper nibbles of it);
26 - pc = physical range that contains this code;
27
28 After step 2, we jump to virtual address in the range 0x40000000..0x5fffffff
29 or 0x00000000..0x1fffffff, depending on whether the kernel was loaded below
30 0x40000000 or above. That address corresponds to next instruction to execute
31 in this code. After step 4, we jump to intended (linked) address of this code.
32 The scheme below assumes that the kernel is loaded below 0x40000000.
33
34 ====== ===== ===== ===== ===== ====== ===== =====
35 - Step0 Step1 Step2 Step3 Step4 Step5
36
37 VA PA PA PA PA VA PA PA
38 ====== ===== ===== ===== ===== ====== ===== =====
39 E0..FF -> E0 -> E0 -> E0 F0..FF -> F0 -> F0
40 C0..DF -> C0 -> C0 -> C0 E0..EF -> F0 -> F0
41 A0..BF -> A0 -> A0 -> A0 D8..DF -> 00 -> 00
42 80..9F -> 80 -> 80 -> 80 D0..D7 -> 00 -> 00
43 60..7F -> 60 -> 60 -> 60
44 40..5F -> 40 -> pc -> pc 40..5F -> pc
45 20..3F -> 20 -> 20 -> 20
46 00..1F -> 00 -> 00 -> 00
47 ====== ===== ===== ===== ===== ====== ===== =====
48
49 The default location of IO peripherals is above 0xf0000000. This may be changed
50 using a "ranges" property in a device tree simple-bus node. See the Devicetree
51 Specification, section 4.5 for details on the syntax and semantics of
52 simple-bus nodes. The following limitations apply:
53
54 1. Only top level simple-bus nodes are considered
55
56 2. Only one (first) simple-bus node is considered
57
58 3. Empty "ranges" properties are not supported
59
60 4. Only the first triplet in the "ranges" property is considered
61
62 5. The parent-bus-address value is rounded down to the nearest 256MB boundary
63
64 6. The IO area covers the entire 256MB segment of parent-bus-address; the
65 "ranges" triplet length field is ignored
66
67
68 MMUv3 address space layouts.
69 ============================
70
71 Default MMUv2-compatible layout::
72
73 Symbol VADDR Size
74 +------------------+
75 | Userspace | 0x00000000 TASK_SIZE
76 +------------------+ 0x40000000
77 +------------------+
78 | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
79 +------------------+
80 | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
81 +------------------+ 0x8e400000
82 +------------------+
83 | VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB
84 +------------------+ VMALLOC_END
85 +------------------+
86 | Cache aliasing | TLBTEMP_BASE_1 0xc8000000 DCACHE_WAY_SIZE
87 | remap area 1 |
88 +------------------+
89 | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
90 | remap area 2 |
91 +------------------+
92 +------------------+
93 | KMAP area | PKMAP_BASE PTRS_PER_PTE *
94 | | DCACHE_N_COLORS *
95 | | PAGE_SIZE
96 | | (4MB * DCACHE_N_COLORS)
97 +------------------+
98 | Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
99 | | NR_CPUS *
100 | | DCACHE_N_COLORS *
101 | | PAGE_SIZE
102 +------------------+ FIXADDR_TOP 0xcffff000
103 +------------------+
104 | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xd0000000 128MB
105 +------------------+
106 | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xd8000000 128MB
107 +------------------+
108 | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB
109 +------------------+
110 | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB
111 +------------------+
112
113
114 256MB cached + 256MB uncached layout::
115
116 Symbol VADDR Size
117 +------------------+
118 | Userspace | 0x00000000 TASK_SIZE
119 +------------------+ 0x40000000
120 +------------------+
121 | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
122 +------------------+
123 | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
124 +------------------+ 0x8e400000
125 +------------------+
126 | VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB
127 +------------------+ VMALLOC_END
128 +------------------+
129 | Cache aliasing | TLBTEMP_BASE_1 0xa8000000 DCACHE_WAY_SIZE
130 | remap area 1 |
131 +------------------+
132 | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
133 | remap area 2 |
134 +------------------+
135 +------------------+
136 | KMAP area | PKMAP_BASE PTRS_PER_PTE *
137 | | DCACHE_N_COLORS *
138 | | PAGE_SIZE
139 | | (4MB * DCACHE_N_COLORS)
140 +------------------+
141 | Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
142 | | NR_CPUS *
143 | | DCACHE_N_COLORS *
144 | | PAGE_SIZE
145 +------------------+ FIXADDR_TOP 0xaffff000
146 +------------------+
147 | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xb0000000 256MB
148 +------------------+
149 | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xc0000000 256MB
150 +------------------+
151 +------------------+
152 | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB
153 +------------------+
154 | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB
155 +------------------+
156
157
158 512MB cached + 512MB uncached layout::
159
160 Symbol VADDR Size
161 +------------------+
162 | Userspace | 0x00000000 TASK_SIZE
163 +------------------+ 0x40000000
164 +------------------+
165 | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
166 +------------------+
167 | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
168 +------------------+ 0x8e400000
169 +------------------+
170 | VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB
171 +------------------+ VMALLOC_END
172 +------------------+
173 | Cache aliasing | TLBTEMP_BASE_1 0x98000000 DCACHE_WAY_SIZE
174 | remap area 1 |
175 +------------------+
176 | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
177 | remap area 2 |
178 +------------------+
179 +------------------+
180 | KMAP area | PKMAP_BASE PTRS_PER_PTE *
181 | | DCACHE_N_COLORS *
182 | | PAGE_SIZE
183 | | (4MB * DCACHE_N_COLORS)
184 +------------------+
185 | Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
186 | | NR_CPUS *
187 | | DCACHE_N_COLORS *
188 | | PAGE_SIZE
189 +------------------+ FIXADDR_TOP 0x9ffff000
190 +------------------+
191 | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xa0000000 512MB
192 +------------------+
193 | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xc0000000 512MB
194 +------------------+
195 | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB
196 +------------------+
197 | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB
198 +------------------+
199

3. 한국어 전문 번역

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

MMUv3 초기화 전제

1-20

`initialize_mmu` macro의 code는 MMUv3 memory mapping을 MMUv2 fixed memory mapping과 동일하게 설정합니다. `CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX` symbol이 정의되지 않으면 이 code는 link된 address에 있고, 정의되면 그렇지 않으므로 position-independent여야 합니다.

이 code fragment는 다음 전제를 가집니다.

  • MMU v3에서만 실행됩니다.
  • TLB가 reset state입니다.
  • `ITLBCFG`와 `DTLBCFG`가 0인 reset state입니다.
  • `RASID`가 reset value `0x04030201`입니다.
  • `PS.RING`이 0인 reset state입니다.
  • `LITBASE`가 0인 reset state이며 PC-relative literal을 사용합니다. PIC가 되기 위한 필수 조건입니다.

이 전제에서 TLB setup은 뒤의 단계대로 진행됩니다.

Step0~Step5 TLB mapping 전환

21-47
  • `VA`: virtual address의 상위 두 nibble
  • `PA`: physical address의 상위 두 nibble
  • `pc`: 이 code를 포함하는 physical range

Step 2 뒤에는 kernel이 `0x40000000` 아래에 load되었는지 여부에 따라 `0x40000000..0x5fffffff` 또는 `0x00000000..0x1fffffff` 범위의 virtual address로 jump합니다. 이 address는 code에서 다음에 실행할 instruction에 대응합니다.

Step 4 뒤에는 이 code가 의도한 linked address로 jump합니다. 아래 구조는 kernel이 `0x40000000` 아래에 load되었다고 가정합니다.

MMUv3 initialization mapping sequence
Initial VAStep0 PAStep1 PAStep2 PAStep3 PAStep4 VAStep4 PAStep5 PA
`E0..FF``E0``E0``E0``F0..FF``F0``F0`
`C0..DF``C0``C0``C0``E0..EF``F0``F0`
`A0..BF``A0``A0``A0``D8..DF``00``00`
`80..9F``80``80``80``D0..D7``00``00`
`60..7F``60``60``60`
`40..5F``40``pc``pc``40..5F``pc`
`20..3F``20``20``20`
`00..1F``00``00``00`
두 번의 jumpStep 2 뒤에는 실행 가능한 임시 virtual range로, Step 4 뒤에는 최종 linked address로 이동합니다.

각 단계 뒤 VA range가 가리키는 PA range를 원문 좌표대로 정리했습니다. 빈 cell은 해당 단계에 mapping이 표시되지 않음을 뜻합니다.

device-tree IO range 제약

48-65

IO peripheral의 default location은 `0xf0000000` 위입니다. device tree `simple-bus` node의 `ranges` property로 바꿀 수 있으며 syntax와 semantics는 Devicetree Specification Section 4.5를 따릅니다.

  • top-level `simple-bus` node만 고려합니다.
  • 첫 번째 `simple-bus` node 하나만 고려합니다.
  • 빈 `ranges` property는 지원하지 않습니다.
  • `ranges` property의 첫 triplet만 고려합니다.
  • `parent-bus-address` value는 가장 가까운 하위 256MB boundary로 내림합니다.
  • IO area는 `parent-bus-address`가 속한 256MB segment 전체를 포괄하며 `ranges` triplet의 length field는 무시합니다.

기본 MMUv2-compatible layout

66-112

기본 MMUv2-compatible layout은 128MB Cached KSEG와 128MB Uncached KSEG를 사용합니다.

Default MMUv2-compatible address space
AreaSymbolVADDR / boundarySize
Userspace`0x00000000` (next boundary `0x40000000`)`TASK_SIZE`
Page table`XCHAL_PAGE_TABLE_VADDR``0x80000000``XCHAL_PAGE_TABLE_SIZE`
KASAN shadow map`KASAN_SHADOW_START``0x80400000` (next boundary `0x8e400000`)`KASAN_SHADOW_SIZE`
VMALLOC area`VMALLOC_START` .. `VMALLOC_END``0xc0000000``128MB - 64KB`
Cache aliasing remap area 1`TLBTEMP_BASE_1``0xc8000000``DCACHE_WAY_SIZE`
Cache aliasing remap area 2`TLBTEMP_BASE_2`앞 영역에서 derived`DCACHE_WAY_SIZE`
KMAP area`PKMAP_BASE`layout에서 derived`PTRS_PER_PTE * DCACHE_N_COLORS * PAGE_SIZE` (`4MB * DCACHE_N_COLORS`)
Atomic KMAP area`FIXADDR_START` .. `FIXADDR_TOP`top `0xcffff000``KM_TYPE_NR * NR_CPUS * DCACHE_N_COLORS * PAGE_SIZE`
Cached KSEG`XCHAL_KSEG_CACHED_VADDR``0xd0000000``128MB`
Uncached KSEG`XCHAL_KSEG_BYPASS_VADDR``0xd8000000``128MB`
Cached KIO`XCHAL_KIO_CACHED_VADDR``0xe0000000``256MB`
Uncached KIO`XCHAL_KIO_BYPASS_VADDR``0xf0000000``256MB`
고정 상단 IO세 layout 모두 Cached KIO는 `0xe0000000`, Uncached KIO는 `0xf0000000`에서 시작합니다.

기본 layout의 userspace, page table, KASAN, VMALLOC, KMAP, KSEG와 KIO 좌표입니다.

256MB cached + 256MB uncached layout

113-155

이 layout은 VMALLOC와 KMAP 계열 영역을 아래로 옮기고 Cached KSEG와 Uncached KSEG를 각각 256MB로 확장합니다.

256MB cached + 256MB uncached address space
AreaSymbolVADDR / boundarySize
Userspace`0x00000000` (next boundary `0x40000000`)`TASK_SIZE`
Page table`XCHAL_PAGE_TABLE_VADDR``0x80000000``XCHAL_PAGE_TABLE_SIZE`
KASAN shadow map`KASAN_SHADOW_START``0x80400000` (next boundary `0x8e400000`)`KASAN_SHADOW_SIZE`
VMALLOC area`VMALLOC_START` .. `VMALLOC_END``0xa0000000``128MB - 64KB`
Cache aliasing remap area 1`TLBTEMP_BASE_1``0xa8000000``DCACHE_WAY_SIZE`
Cache aliasing remap area 2`TLBTEMP_BASE_2`앞 영역에서 derived`DCACHE_WAY_SIZE`
KMAP area`PKMAP_BASE`layout에서 derived`PTRS_PER_PTE * DCACHE_N_COLORS * PAGE_SIZE` (`4MB * DCACHE_N_COLORS`)
Atomic KMAP area`FIXADDR_START` .. `FIXADDR_TOP`top `0xaffff000``KM_TYPE_NR * NR_CPUS * DCACHE_N_COLORS * PAGE_SIZE`
Cached KSEG`XCHAL_KSEG_CACHED_VADDR``0xb0000000``256MB`
Uncached KSEG`XCHAL_KSEG_BYPASS_VADDR``0xc0000000``256MB`
Cached KIO`XCHAL_KIO_CACHED_VADDR``0xe0000000``256MB`
Uncached KIO`XCHAL_KIO_BYPASS_VADDR``0xf0000000``256MB`
고정 상단 IO세 layout 모두 Cached KIO는 `0xe0000000`, Uncached KIO는 `0xf0000000`에서 시작합니다.

256MB KSEG layout에서 달라지는 VMALLOC, FIXADDR와 KSEG 좌표를 포함합니다.

512MB cached + 512MB uncached layout

156-198

가장 큰 layout은 VMALLOC와 KMAP 계열 영역을 더 아래로 옮기고 Cached KSEG와 Uncached KSEG를 각각 512MB로 확장합니다.

512MB cached + 512MB uncached address space
AreaSymbolVADDR / boundarySize
Userspace`0x00000000` (next boundary `0x40000000`)`TASK_SIZE`
Page table`XCHAL_PAGE_TABLE_VADDR``0x80000000``XCHAL_PAGE_TABLE_SIZE`
KASAN shadow map`KASAN_SHADOW_START``0x80400000` (next boundary `0x8e400000`)`KASAN_SHADOW_SIZE`
VMALLOC area`VMALLOC_START` .. `VMALLOC_END``0x90000000``128MB - 64KB`
Cache aliasing remap area 1`TLBTEMP_BASE_1``0x98000000``DCACHE_WAY_SIZE`
Cache aliasing remap area 2`TLBTEMP_BASE_2`앞 영역에서 derived`DCACHE_WAY_SIZE`
KMAP area`PKMAP_BASE`layout에서 derived`PTRS_PER_PTE * DCACHE_N_COLORS * PAGE_SIZE` (`4MB * DCACHE_N_COLORS`)
Atomic KMAP area`FIXADDR_START` .. `FIXADDR_TOP`top `0x9ffff000``KM_TYPE_NR * NR_CPUS * DCACHE_N_COLORS * PAGE_SIZE`
Cached KSEG`XCHAL_KSEG_CACHED_VADDR``0xa0000000``512MB`
Uncached KSEG`XCHAL_KSEG_BYPASS_VADDR``0xc0000000``512MB`
Cached KIO`XCHAL_KIO_CACHED_VADDR``0xe0000000``256MB`
Uncached KIO`XCHAL_KIO_BYPASS_VADDR``0xf0000000``256MB`
고정 상단 IO세 layout 모두 Cached KIO는 `0xe0000000`, Uncached KIO는 `0xf0000000`에서 시작합니다.

512MB KSEG layout에서 달라지는 VMALLOC, FIXADDR와 KSEG 좌표를 포함합니다.

세 layout에서 page table과 KASAN shadow map의 시작점은 같지만 VMALLOC, temporary alias, FIXADDR, KSEG 위치와 크기는 선택한 cached/uncached layout에 따라 달라집니다.