1_5.1.3_U-boot分析与使用_u-boot分析之源码第1阶段_P

本文详细解析了UBOOT在启动过程中的关键步骤,包括初始化硬件、设置栈、时钟配置、代码重定位和C函数调用,展示了裸机程序开发的底层细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们以前写裸机程序时:

  1. 初始化:关看门狗,初始化时钟,初始化SDRAM;
  2. 把程序从nand拷贝到SDRAM;
  3. 设置sp,调用C语言函数;
  4. 继续执行…

uboot作为一个裸机程序的集大成者,这些都会做,而且还要读出内核并启动内核。

之前分析过,uboot上电会先调用cpu/arm920t/start.S,我们就从这个文件来入手分析。

首先会跳到reset段。
在这里插入图片描述然后将CPU设为SVC32模式(管理模式)并关闭看门狗。
在这里插入图片描述
在这里插入图片描述第四步设置时钟,视频里面是用了函数调用,但是我本地打完补丁使用的是汇编,这里不做深究,理解为主。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从这里,我们就可以看到栈是怎么划分的,从0x33F80000开始,依次是堆,bdinfo,中断使用的栈,3字节中断栈。其中,0x33F80000到0x34000000这片内存放的是uboot,有512字节。

在这里插入图片描述然后是调用时钟初始化函数。
在这里插入图片描述
在这里插入图片描述然后把代码重定位到链接地址去。
在这里插入图片描述最后,调用start_armboot函数,该函数为一个C语言函数,更复杂的功能就在这里面实现。
在这里插入图片描述

从上到下分析,start.S做了这些操作:

  1. 设为SVC模式;
  2. 关看门狗;
  3. 屏蔽中断;
  4. 初始化SDRAM;
  5. 设置栈;
  6. 时钟配置;
  7. 重定位,代码从Flash拷到SDRAM;
  8. 清bss段(初始值为0或未初始化的全局变量和静态变量);
  9. 调用start_armboot;

上面都是硬件相关的初始化,最后一步是一个C函数,更复杂的功能就在这个函数中实现,1到8称为第一阶段,start_armboot之后的就是第二阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值