ARM CPU 初始化代码详解 - 清空缓存和同步屏障

本文将详细解析一段ARM CPU 初始化代码,并重点分析其中清空缓存和同步屏障的相关代码段。

代码段:

113 ENTRY(cpu_init_cp15)
114 /*
115 * Invalidate L1 I/D
116 */
117 mov r0, #0 @ set up for MCR
118 mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
119 mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
120 mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array
121 mcr p15, 0, r0, c7, c10,4 @ DSB
122 mcr p15, 0, r0, c7, c5, 4 @ ISB
123
124 /*
125 * disable MMU stuff and caches
126 */
127 mrc p15, 0, r0, c1, c0, 0
128 bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
129 bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
130 orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
131 orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
132 #ifdef CONFIG_SYS_ICACHE_OFF
133 bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache
134 #else
135 orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache
136 #endif
137 mcr p15, 0, r0, c1, c0, 0
138
......
255
256 mov pc, r5 @ back to my caller
257 ENDPROC(cpu_init_cp15)

代码分析:

  • 117-122行:清空缓存和同步屏障

    • 117行代码: mov r0, #0 @ set up for MCR 将0赋值给寄存器r0,为MCR指令做准备。MCR指令用于将数据写入协处理器(如CP15)的寄存器。
    • 118行代码: mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs 使用MCR指令执行清空TLB(Translation Lookaside Buffer,翻译后备缓存)的操作,清空后,CPU需要重新访问内存以填充缓存。
    • 119行代码: mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 使用MCR指令执行清空指令缓存的操作,清空后,CPU需要重新访问内存以填充缓存。
    • 120行代码: mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array 使用MCR指令执行清空分支预测器的操作,清空后,CPU需要重新访问内存以填充缓存。
    • 121行代码: mcr p15, 0, r0, c7, c10,4 @ DSB 使用MCR指令执行数据同步屏障指令(Data Synchronization Barrier,DSB)的操作,确保之前的所有内存操作都已完成。
    • 122行代码: mcr p15, 0, r0, c7, c5, 4 @ ISB 使用MCR指令执行指令同步屏障指令(Instruction Synchronization Barrier,ISB)的操作,确保之前的所有内存操作都已完成,并刷新指令流水线,以防止之前的指令对后续指令产生影响。
  • 127-137行:禁用MMU和缓存

    这段代码主要用于禁用MMU(内存管理单元)和缓存,具体操作是通过修改CP15寄存器中的相关位来实现。

总结:

这段ARM CPU 初始化代码主要完成以下操作:

  1. 清空TLB、指令缓存和分支预测器
  2. 执行数据同步屏障和指令同步屏障指令
  3. 禁用MMU和缓存

通过这些操作,确保CPU处于一个干净且可预期的状态,为后续的系统启动和运行提供良好的基础。

ARM CPU 初始化代码详解 - 清空缓存和同步屏障

原文地址: https://www.cveoy.top/t/topic/nj3D 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录