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也属于我成长路上的必备技能,应该自己总结一套东西,理解了,分享出来。

相关推荐
ZRT00014 分钟前
Ubuntu 22.04安装ESP-IDF
linux·ubuntu·esp32·esp-idf
2301_7951672015 分钟前
Python 高手编程系列一十八:子类化内置类型
linux·windows·python
赖small强19 分钟前
【Linux驱动开发】Linux DMA 技术详解与驱动开发实战
linux·dma·直接内存访问
斌蔚司李21 分钟前
笔记本、台式机、平板二合一?Mac、Win、Linux?
linux·macos·电脑
DeeplyMind22 分钟前
AMD rocr-libhsakmt分析系列6-2:共享机制-import
linux·amdgpu·dma-buf·rocm·kfd·rocr
Dillon Dong26 分钟前
【超详细】Ubuntu 上 MySQL 5.7 升级 MySQL 8 完整指南
linux·mysql·ubuntu
DARLING Zero two♡40 分钟前
【Linux操作系统】简学深悟启示录:线程同步与互斥
linux·运维·服务器
hhwyqwqhhwy1 小时前
linux 驱动iic
linux·运维·服务器
知识分享小能手1 小时前
CentOS Stream 9入门学习教程,从入门到精通, CentOS Stream 9中的文件和目录管理(3)
linux·学习·centos
一只努力学习的Cat.1 小时前
Linux:NAPT等其他补充内容
linux·运维·网络