Uboot启动流程梳理

参考链接:
野火教程

别人的总结:

https://blog.csdn.net/qq_37619128/article/details/123481504

https://blog.csdn.net/weixin_44030507/article/details/130158896

代码大致大概工作:

  • 汇编部分完成的工作

①关cache,mmu,中断,看门狗

②进入SVC模式,权限更多,可以操作更多的寄存器

③基本硬件初始化:时钟,串口,Flash,初始化Emmc/SD

④初始化堆栈

⑤自搬移,uboot的源代码从flash搬移到内存上,需要重定位自己,加快运行速度。

  • C语言部分:①大部分硬件初始化 ②把内核搬移到内存

野火讲解吸收

野火讲的挺好,后面需要继续深究。首先从u-boot.lds链接脚本描述了输出文件的内存布局。链接脚本中分了text、bss、data等各段的首尾地址。

ENTRY(_start) @将_start设为入口地址 这个_start的起始地址是在arch/arm/lib/vectors.S文件,但是我发现arch/arm/cpu/armv8/start.S也有_start呀,到底是从哪启动的呢?

到了分析一下arch/arm/lib/vectors.S,然后一直在分析汇编,我真的蒙了,我不懂,好难受,看教程都看不懂。看不懂的先跳过。

然后到了 common/board_f.c 文件,下面十几个跟我项目有关的函数:

  • announce_dram_init

函数打印"DRAM"。

  • dram_init 函数

用于获取DRAM大小,在arch/arm/cpu/armv8/fsl-layerscape/cpu.c中有实现,被定义为了弱函数。但还是被调用。该函数可以增加打印,看到15G字节大小。

大小在fsl_initdram函数中被赋值了为15G。

  • setup_dest_addr 函数

    Uboot在DRAM初始化后,便完成DRAM的映射,重定位代码到DRAM,继续运行。重定位后的地址为relocaddr。

Uboot也属于我成长路上的必备技能,应该自己总结一套东西,理解了,分享出来。

相关推荐
草莓熊Lotso1 小时前
【Linux系统加餐】从原理到封装:基于建造者模式实现System V信号量工业级C++封装
android·linux·运维·服务器·网络·c++·建造者模式
广州灵眸科技有限公司7 小时前
瑞芯微(EASY EAI)RV1126B 核心板供电电路
linux·运维·服务器·单片机·嵌入式硬件·电脑
keyipatience7 小时前
18.Linux进程退出和进程等待机制详解
linux·运维·服务器
齐齐大魔王7 小时前
Linux-网络编程实战
linux·运维·网络
花阴偷移8 小时前
Ubuntu 22.04版本下配置静态IP
linux·运维·服务器·tcp/ip·ubuntu
weixin_473437238 小时前
Swift4D处理Multi-view dataset记录
linux
霞姐聊IT11 小时前
SR-IOV、MR-IOV 与 SIOV:PCIe虚拟化技术的过去、现在与未来
linux·服务器·虚拟化·pcie
szxinmai主板定制专家11 小时前
电力设备RK3568/RK3576+FPGA,多系统混合部署Linux+RTOS RT-THREAD,强实时性
linux·运维·服务器·人工智能·嵌入式硬件·fpga开发
枕星而眠12 小时前
Linux 四大进程/线程同步锁详解:互斥锁、读写锁、条件变量、文件锁
linux·c语言·后端·ubuntu·学习方法
L、21812 小时前
CANN调优工具链全景:从profiler到tensorboard的完整观测体系
linux·运维·服务器·深度学习