boot.S步骤包括:
-
设置异常向量表基地址(VBAR)。
-
无效化缓存和TLB。
-
禁用MMU。
-
初始化不同处理器模式下的栈指针(IRQ、Supervisor、Abort、FIQ、Undefined、System)。
-
配置计时器计数器频率。
-
配置ACTLR和CPUECTLR寄存器以启用某些特性。
-
配置MMU,设置页表基地址和域。
-
启用MMU、I-Cache和D-Cache。
-
启用VFP(浮点单元)。
-
配置分支预测和预取。
-
启用异步中止异常。
-
跳转到C启动代码_startup
以下是针对该ARM Cortex-A53启动代码的流程图解析及关键分析:
graph TD
A[复位入口] --> B[设置异常向量表VBAR]
B --> C[无效化缓存和TLB]
C --> D[禁用MMU]
D --> E[初始化各模式栈指针]
E --> F[配置计时器频率]
F --> G[配置ACTLR/CPUECTLR]
G --> H[设置MMU页表]
H --> I[启用MMU和缓存]
I --> J[启用VFP浮点单元]
J --> K[配置分支预测]
K --> L[使能异步中止异常]
L --> M[跳转至C启动代码]
关键步骤详细解析:
1、异常向量表配置
mcr p15, 0, r0, c12, c0, 0 /* VBAR = _vector_table */
作用:将0x00000000异常向量表重映射到自定义地址
技术细节:使用CP15 c12寄存器设置VBAR
2、缓存与TLB管理
mcr p15, 0, r0, c8, c7, 0 /* 无效化TLB */
mcr p15, 0, r0, c7, c5, 0 /* 无效化I-Cache */
bl invalidate_dcache /* D-Cache逐行无效化 */
设计考虑:Cortex-A53无全D-Cache无效化指令,需遍历所有缓存线
3、多模式栈初始化
pie
title 各模式栈空间分配
"IRQ Stack" : 20
"Supervisor" : 20
"Abort" : 15
"FIQ" : 15
"Undefined" : 15
"System" : 15
关键操作:
msr cpsr, r2 /* 切换处理器模式 */
ldr r13,=IRQ_stack /* 设置对应栈指针 */
4、MMU配置流程
ldr r0,=TblBase /* 页表物理地址 */
orr r0, #0x5B /* 内存属性: Outer-cacheable, WB */
mcr p15, 0, r0, c2, c0, 0 /* 写入TTBR0 */
mvn r0,#0
mcr p15,0,r0,c3,c0,0 /* 设置域为Manager模式 */
5、缓存与MMU启用
orr r0, r0, #(0x1 << 12) /* 启用I-Cache */
orr r0, r0, #(0x1 << 2) /* 启用D-Cache */
orr r0, r0, #0x1 /* 启用MMU */
dsb /* 数据同步屏障 */
isb /* 指令同步屏障 */
6、浮点单元激活
vmrs r1, FPEXC /* 读取浮点异常寄存器 */
orr r1, #FPEXC_EN /* 设置使能位(bit30) */
vmsr FPEXC, r1 /* 写回寄存器 */
关键数据结构:
①、MMU页表项格式
31 20 19 10 9 8 7 6 5 4 3 2 1 0
| Base Addr | SBZ |nG|S|AP2| TEX | AP | C B |1 0|
·C位:Cacheable
·B位:Bufferable
·TEX[2:0]:内存类型扩展
②、处理器模式切换
CPSR模式位 | 模式名称 | 用途 |
---|---|---|
0x12 | IRQ | 中断处理 |
0x13 | Supervisor | 操作系统内核 |
0x17 | Abort | 内存访问异常 |
0x1B | Undefined | 未定义指令异常 |
性能优化策略:
1、缓存预热
/* 在启用缓存前必须无效化 */
mcr p15,0,r0,c7,c5,6 /* 无效化分支预测器 */
2、指令流水线优化
mov r0, r0 /* 流水线同步占位指令 */
dsb
isb /* 保证MMU启用顺序 */
3、数据预取配置
orr r0, #(0x1 << 2) /* D-side预取使能 */
orr r0, #(0x1 << 1) /* L2预取提示 */
4、异常处理准备:
bic r0, r0, #0x100 /* 清除A-bit(异步中止屏蔽) */
msr cpsr_xsf, r0 /* 更新处理器状态 */
安全加固措施:
1、特权级隔离
用户模式无法直接修改CP15寄存器
2、内存保护
MMU启用后实现虚拟地址隔离
3、栈溢出防护
各异常模式独立栈空间分配