Uboot start.S源码深入解析:指令级详解与关键知识点

需积分: 10 1 下载量 104 浏览量 更新于2024-07-26 1 收藏 2.05MB PDF 举报
本文是一篇深入解析Uboot源码start.S版本1.6的详细教程,作者通过green-waste(at)163.com分享了对Uboot启动流程中关键脚本start.S的指令级剖析。文章内容分为几个部分: 1. 引言部分:首先介绍文章的目的,即为读者提供对start.S源码的全面理解,包括代码来源和预期读者背景知识。作者强调了阅读本文的前提是对Uboot工作原理有一定了解。 2. start.S详解: - 设置CPU模式:讲解了为什么Uboot初始化时将CPU设置为SVC模式,这是为了确保系统的安全性和稳定性。 - 关闭看门狗:解释了看门狗定时器的作用以及为什么在系统初始化期间需要将其关闭,以防止意外中断或过早触发。 - 中断管理:描述了如何在启动阶段关闭中断,以保护初始化过程的连续性。 - 堆栈设置:阐述了堆栈指针sp的初始化和其在内存布局中的重要性。 - BSS段清理:说明了清除BSS段(未初始化数据区)的过程。 - 异常中断处理:讲解了异常中断在启动阶段的处理方式。 3. 总结与内存布局:这部分概括了start.S的主要功能,并讨论了Uboot内存的组织结构。 4. 相关知识点详解: - 查看C/C++与汇编对应关系:介绍了如何从源代码级别追踪到实际汇编代码。 - 模式选择:深入探讨了为什么选择SVC模式而非其他模式,如用户模式或系统模式。 - Watchdog的理解及其关闭原因:详细解释了看门狗的作用及其在初始化期间的必要操作。 - ARM7和ARM9的PC=PC+8:解释了这种地址计算在ARM架构中的意义。 - 寄存器别名与APCS:讲解了ARM寄存器的不同名称以及应用程序编程接口标准(APCS)的应用。 - 函数调用的堆栈使用:比较了C/C++和汇编语言中函数调用对堆栈的需求。 - adr伪指令和mov指令:讨论了在特定场景下使用adr指令的原因。 - mov指令操作数范围:明确了mov指令操作数的可能取值范围。 - 汇编学习总结:列举了一些汇编语言的基本概念和语法点,如标号、跳转、extern等。 本文旨在帮助读者深入理解Uboot start.S源码的工作机制,从指令层面解析了关键初始化步骤,以及与C/C++编程和汇编语言相关的概念。通过阅读本文,读者可以对Uboot的启动过程有更深入的认识。

Read Spd Begin... The memory on CH :1 are different! N: pre svc call fun = 0xc2000f04 -- pm-1 = 0, pm-2 = 29819750, pm-3 = 0 N: ddr fun = 0x0 -- pm = 0x29819750, pm2 = 0x0 N: parameter mcu: v0.5 Mcu Start Work ... get_clocks_value: scpi send command start: 0x10 scpi send command success get clocks = 533 MHZ pll_scp_num = 8 Lmu Freq = 1066Mhz ch = 0 parameter set ch closed! DIMM Don't Probed! ch = 1 the dimm info is from uboot... Dimm_Capacity = 8GB Mcu Channel 1 AES configuration begin... AES bypass end... TZC configuration begin... TZC bypass end... use_0x14 == 0xb0100 ctl_cfg_begin...... pi_cfg_begin...... phy_cfg_begin...... fast mode caslat = 15 wrlat = 14 tinit = 856000 r2r_diffcs_dly = 4 r2w_diffcs_dly = 5 w2r_diffcs_dly = 3 w2w_diffcs_dly = 7 r2w_samecs_dly = 4 w2r_samecs_dly = 0 r2r_samecs_dly = 0 w2w_samecs_dly = 0 ch 1 adapter_alg -- 0-0-0-0-0-0-0 rtt_wr = dis rtt_park = 80ohm ron = 34ohm val_cpudrv = 34 rtt_nom = 48ohm val_cpuodt = 48 vref_dev = 10 vrefsel = 0x45 dq_oe_timing = 0x42 rank_num_decode = 1 set phy_indep_init_mode set pi_dram_init_en set_pi_start & ctl_start...... wait init complete...... init complete done...... wait complete done...... rddqs_lat = 0x2 tdfi_phy_rdlat = 0x1f begin software ntp training... rank_num: 0 phy_write_path_lat_add =-1-1-1-1-1-1-1-1-1 phy_write_path_lat_add = 0 0 0 0 0 0 0 0 0 phy_write_path_lat_add = 1 1 1 1 1 1 1 1 1 phy_write_path_lat_add = 2 2 2 2 2 2 2 2 2 phy_write_path_lat_add = 3 3 3 3 3 3 3 3 3 phy_write_path_lat_add = 4 4 4 4 4 4 4 4 4 rank 0 wdqlvl! r2r_diffcs_dly = 4 r2w_diffcs_dly = 7 w2r_diffcs_dly = 4 w2w_diffcs_dly = 6 r2w_samecs_dly = 5 rank 0 ch 1 training fail

2023-06-02 上传