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 節。 以下限制適用

  1. 僅考慮頂級 simple-bus 節點

  2. 僅考慮一個(第一個)simple-bus 節點

  3. 不支援空的“ranges”屬性

  4. 僅考慮“ranges”屬性中的第一個三元組

  5. parent-bus-address 值向下舍入到最近的 256MB 邊界

  6. 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
+------------------+