MMUv3 初始化序列¶
initialize_mmu 宏中的程式碼以與 MMUv2 固定記憶體對映相同的方式設定 MMUv3 記憶體對映。 根據 CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX 符號,此程式碼位於它連結到的地址(符號未定義)或未連結到的地址(符號已定義)中,因此它需要是位置無關的。
該程式碼具有以下假設
此程式碼段僅在 MMU v3 上執行。
TLB 處於其重置狀態。
ITLBCFG 和 DTLBCFG 為零(重置狀態)。
RASID 為 0x04030201(重置狀態)。
PS.RING 為零(重置狀態)。
LITBASE 為零(重置狀態,PC 相關文字);需要是 PIC。
TLB 設定按照以下步驟進行。
圖例
VA = 虛擬地址(它的兩個高位半位元組);
PA = 物理地址(它的兩個高位半位元組);
pc = 包含此程式碼的物理範圍;
在步驟 2 之後,我們跳轉到 0x40000000..0x5fffffff 或 0x00000000..0x1fffffff 範圍內的虛擬地址,具體取決於核心是載入到 0x40000000 以下還是以上。 該地址對應於此程式碼中要執行的下一條指令。 在步驟 4 之後,我們跳轉到此程式碼的預期(連結)地址。 下面的方案假設核心載入在 0x40000000 以下。
步驟0
步驟1
步驟2
步驟3
步驟4
步驟5
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
IO 外設的預設位置高於 0xf0000000。 可以使用裝置樹 simple-bus 節點中的“ranges”屬性來更改此設定。 有關 simple-bus 節點的語法和語義的詳細資訊,請參見裝置樹規範第 4.5 節。 以下限制適用
僅考慮頂級 simple-bus 節點
僅考慮一個(第一個)simple-bus 節點
不支援空的“ranges”屬性
僅考慮“ranges”屬性中的第一個三元組
parent-bus-address 值向下舍入到最近的 256MB 邊界
IO 區域覆蓋 parent-bus-address 的整個 256MB 段;“ranges”三元組長度欄位被忽略
MMUv3 地址空間佈局。¶
預設的 MMUv2 相容佈局
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 快取 + 256MB 非快取佈局
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 快取 + 512MB 非快取佈局
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
+------------------+