启动流程分析(二)-vitis工程boot.S

boot.S步骤包括:

  1. 设置异常向量表基地址(VBAR)。

  2. 无效化缓存和TLB。

  3. 禁用MMU。

  4. 初始化不同处理器模式下的栈指针(IRQ、Supervisor、Abort、FIQ、Undefined、System)。

  5. 配置计时器计数器频率。

  6. 配置ACTLR和CPUECTLR寄存器以启用某些特性。

  7. 配置MMU,设置页表基地址和域。

  8. 启用MMU、I-Cache和D-Cache。

  9. 启用VFP(浮点单元)。

  10. 配置分支预测和预取。

  11. 启用异步中止异常。

  12. 跳转到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模式位模式名称用途
0x12IRQ中断处理
0x13Supervisor操作系统内核
0x17Abort内存访问异常
0x1BUndefined未定义指令异常

性能优化策略:
    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、栈溢出防护

        各异常模式独立栈空间分配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值