요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
=============================
MMUv3 initialization sequence
=============================
The code in the initialize_mmu macro sets up MMUv3 memory mapping
identically to MMUv2 fixed memory mapping. Depending on
CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX symbol this code is
located in addresses it was linked for (symbol undefined), or not
(symbol defined), so it needs to be position-independent.
The code has the following assumptions:
- This code fragment is run only on an MMU v3.
- TLBs are in their reset state.
- ITLBCFG and DTLBCFG are zero (reset state).
- RASID is 0x04030201 (reset state).
- PS.RING is zero (reset state).
- LITBASE is zero (reset state, PC-relative literals); required to be PIC.
TLB setup proceeds along the following steps.
Legend:
- VA = virtual address (two upper nibbles of it);
- PA = physical address (two upper nibbles of it);
- pc = physical range that contains this code;
After step 2, we jump to virtual address in the range 0x40000000..0x5fffffff
or 0x00000000..0x1fffffff, depending on whether the kernel was loaded below
0x40000000 or above. That address corresponds to next instruction to execute
in this code. After step 4, we jump to intended (linked) address of this code.
The scheme below assumes that the kernel is loaded below 0x40000000.
====== ===== ===== ===== ===== ====== ===== =====
- Step0 Step1 Step2 Step3 Step4 Step5
VA PA PA PA PA VA PA 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
====== ===== ===== ===== ===== ====== ===== =====
The default location of IO peripherals is above 0xf0000000. This may be changed
using a "ranges" property in a device tree simple-bus node. See the Devicetree
Specification, section 4.5 for details on the syntax and semantics of
simple-bus nodes. The following limitations apply:
1. Only top level simple-bus nodes are considered
2. Only one (first) simple-bus node is considered
3. Empty "ranges" properties are not supported
4. Only the first triplet in the "ranges" property is considered
5. The parent-bus-address value is rounded down to the nearest 256MB boundary
6. The IO area covers the entire 256MB segment of parent-bus-address; the
"ranges" triplet length field is ignored
MMUv3 address space layouts.
============================
Default MMUv2-compatible layout::
Symbol VADDR Size
+------------------+
| Userspace | 0x00000000 TASK_SIZE
+------------------+ 0x40000000
+------------------+
| Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
+------------------+
| KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
+------------------+ 0x8e400000
+------------------+
| VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB
+------------------+ VMALLOC_END
+------------------+
| Cache aliasing | TLBTEMP_BASE_1 0xc8000000 DCACHE_WAY_SIZE
| remap area 1 |
+------------------+
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
| remap area 2 |
+------------------+
+------------------+
| KMAP area | PKMAP_BASE PTRS_PER_PTE *
| | DCACHE_N_COLORS *
| | PAGE_SIZE
| | (4MB * DCACHE_N_COLORS)
+------------------+
| Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
| | NR_CPUS *
| | DCACHE_N_COLORS *
| | PAGE_SIZE
+------------------+ FIXADDR_TOP 0xcffff000
+------------------+
| 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
+------------------+
256MB cached + 256MB uncached layout::
Symbol VADDR Size
+------------------+
| Userspace | 0x00000000 TASK_SIZE
+------------------+ 0x40000000
+------------------+
| Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
+------------------+
| KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
+------------------+ 0x8e400000
+------------------+
| VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB
+------------------+ VMALLOC_END
+------------------+
| Cache aliasing | TLBTEMP_BASE_1 0xa8000000 DCACHE_WAY_SIZE
| remap area 1 |
+------------------+
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
| remap area 2 |
+------------------+
+------------------+
| KMAP area | PKMAP_BASE PTRS_PER_PTE *
| | DCACHE_N_COLORS *
| | PAGE_SIZE
| | (4MB * DCACHE_N_COLORS)
+------------------+
| Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
| | NR_CPUS *
| | DCACHE_N_COLORS *
| | PAGE_SIZE
+------------------+ FIXADDR_TOP 0xaffff000
+------------------+
| 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
+------------------+
512MB cached + 512MB uncached layout::
Symbol VADDR Size
+------------------+
| Userspace | 0x00000000 TASK_SIZE
+------------------+ 0x40000000
+------------------+
| Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
+------------------+
| KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
+------------------+ 0x8e400000
+------------------+
| VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB
+------------------+ VMALLOC_END
+------------------+
| Cache aliasing | TLBTEMP_BASE_1 0x98000000 DCACHE_WAY_SIZE
| remap area 1 |
+------------------+
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
| remap area 2 |
+------------------+
+------------------+
| KMAP area | PKMAP_BASE PTRS_PER_PTE *
| | DCACHE_N_COLORS *
| | PAGE_SIZE
| | (4MB * DCACHE_N_COLORS)
+------------------+
| Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
| | NR_CPUS *
| | DCACHE_N_COLORS *
| | PAGE_SIZE
+------------------+ FIXADDR_TOP 0x9ffff000
+------------------+
| 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
+------------------+
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되었다고 가정합니다.
각 단계 뒤 VA range가 가리키는 PA range를 원문 좌표대로 정리했습니다. 빈 cell은 해당 단계에 mapping이 표시되지 않음을 뜻합니다.
device-tree IO range 제약
48-65IO 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를 사용합니다.
기본 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 KSEG layout에서 달라지는 VMALLOC, FIXADDR와 KSEG 좌표를 포함합니다.
512MB cached + 512MB uncached layout
156-198가장 큰 layout은 VMALLOC와 KMAP 계열 영역을 더 아래로 옮기고 Cached KSEG와 Uncached KSEG를 각각 512MB로 확장합니다.
512MB KSEG layout에서 달라지는 VMALLOC, FIXADDR와 KSEG 좌표를 포함합니다.
세 layout에서 page table과 KASAN shadow map의 시작점은 같지만 VMALLOC, temporary alias, FIXADDR, KSEG 위치와 크기는 선택한 cached/uncached layout에 따라 달라집니다.
요약과 해설
mmu.rst:1-198Xtensa 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 제약을 구조화 표로 비교할 수 있습니다.