ARMv7 UBOOT Start.s文件分析
ARMv7 UBOOT Start.s文件分析 reset: /* Allow the board to save important registers */ b save_boot_params 由 reset函数跳转到 **save_boot_params **函数。 b: 跳转不返回。 bl: 跳转返回 (提前将下一条指令存入 **lr **寄存器,在执行玩当前函数后会执行 mov pc, lr ,跳回 **lr **寄存器保存的地址)。 ENTRY(save_boot_params) b save_boot_params_ret @ back to my caller ENDPROC(save_boot_params) .weak save_boot_params 这个函数实际跳转到 save_boot_params_ret 函数。 ENTRY 宏展开得(.type save_boot_params STT_FUNC), .type **是 **GCC** 伪指令,说明**save_boot_params是函数。 **ENDPROC **宏展开得 (size save_boot_params, -save_boot_params),由当前地址减去标号地址,计算 **save_boot_params **函数大小。 .weak 关键字,说明后面的 **save_boot_params **为弱标号,如果链接器在其他地方发现 **save_boot_params **,则这里作废,如果没有发现,则使用这里的。 save_boot_params_ret: /* * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode, * except if in HYP mode already */ mrs r0, cpsr and r1, r0, #0x1f @ mask mode bits teq r1, #0x1a @ test for HYP mode bicne r0, r0, #0x1f @ clear all mode bits orrne r0, r0, #0x13 @ set SVC mode orr r0, r0, #0xc0 @ disable FIQ and IRQ msr cpsr,r0 将 cpsr 状态寄存器存入 r0 将寄存器 r0 中的值与 0X1F 进行与运算,结果保存到 r1 寄存器中,提取cpsr寄存器的低5位,用来设置 **CPU ** 模式 判断 **CPU ** 当前是否处于 HYP 模式 如果 **CPU ** 不是 HYP 模式,则清楚 r0 低5位 将 **CPU ** 切换到 SVC32 模式, CPU 可以使用 SoC 的各种资源 关闭 FIQ 和 IRQ,为了保证 uboot 启动过程不允许被打断 将 r0 的值存回 cpsr 寄存器 #if !...