U-Boot 啟動過程中,設置完時鐘分頻後,調用 cpu_init_crit 彙編函數,核心任務:關閉 Cache 與 MMU,隨後調用 lowlevel_init 初始化總線。
| 位 | 名稱 | 功能 | 啟動時設置 |
|---|---|---|---|
| 0 | M | MMU 啟用 | 0 (關閉) |
| 1 | A | 地址對齊檢查 | 1 (開啟) |
| 2 | C | 數據 Cache 啟用 | 0 (關閉) |
| 7 | B | 大/小端模式 | 0 (小端) |
| 12 | I | 指令 Cache 啟用 | 1 (開啟,可選) |
| 13 | V | 異常向量基址 | 0 (0x00000000) |
| 30,31 | nF, iA | 總線模式 | 配置為 FastBus |
cpu_init_crit:
/* 清除 V4 I/D Cache */
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 @ 清除 I/D Cache
mcr p15, 0, r0, c8, c7, 0 @ 清除 V3/V4 Cache
mcr p15, 0, r0, c8, c7, 0 @ 清除 TLB
/* 禁用 MMU、Cache,啟用對齊檢查、指令 Cache */
mrc p15, 0, r0, c1, c0, 0 @ 讀取 CP15 c1 (控制寄存器)
bic r0, r0, #0x00002300 @ 清除位 13(V), 9(R), 8(S)
bic r0, r0, #0x00000087 @ 清除位 7(B), 2(C), 1(A), 0(M)
orr r0, r0, #0x00000002 @ 設置位 1(A) = 1 (對齊檢查)
orr r0, r0, #0x00001000 @ 設置位 12(I) = 1 (指令 Cache)
mcr p15, 0, r0, c1, c0, 0 @ 寫回 CP15 c1
/* 跳轉到 lowlevel_init */
mov ip, lr
bl lowlevel_init
mov lr, ip
mov pc, lr
mcr (Move to Coprocessor from ARM Register):ARM → CP15mrc (Move to ARM Register from Coprocessor):CP15 → ARMbic (Bit Clear):清除指定位orr (Bit OR):設置指定位mrc → bic/orr → mcr 保證不影響其他位關閉 Cache 前必須清空(Clean/Flush) Cache 內容,將髒數據寫回內存,否則關閉後數據丟失。
c7 操作執行 Cache 清理/無效化,c8 操作 TLB 無效化。
U-Boot 早期初始化的核心原則:在硬件機制就緒前,禁用所有可能導致不可預測行為的優化單元。Cache 與 MMU 是典型代表,必須在內存控制器就緒、頁表建立後才能安全啟用。