当前位置: 首页 > news >正文

u-boot启动过程(NXP6ULL)

1、Nxp6ull的uboot是怎么初始化并最终引导内核启动的?

a. Boot ROM 阶段(在rom和片上ram上执行)
i.MX6ULL 的镜像(.imx)头部由三部分组成:IVT(Image Vector Table,包含程序入口和 DCD 指针)、Boot Data(记录映像大小和偏移地址)和 DCD(Device Configuration Data,用于寄存器配置,如 CCGR 时钟门控和基础硬件配置)。
Boot ROM 根据头部信息执行操作:通过 DCD 配置基础硬件(时钟、引脚复用等,但不包括DDR初始化);然后根据头部中记录的运行地址和大小,将SPL代码复制到指定的片上RAM地址,最后跳转执行SPL代码。
b.  SPL阶段(只在片上RAM执行)
SPL汇编入口 _start
SPL代码被加载到片上RAM后,从 _start 标签处开始执行。_start 执行极早期的CPU初始化(关闭中断,设置模式,将处理器置于预期状态等),完成后调用低级初始化例程,并最终进入C语言环境。
SPL关键函数 board_init_f()
SPL开始运行C代码,首先设置堆栈和全局数据结构,然后调用 board_init_f() 函数。board_init_f 负责早期板级初始化:• 运行初始化序列(串口、时钟等基础配置)• DDR控制器初始化(这是SPL的核心任务)• 配置IOMUX、使能必要时钟• 调用 dram_init() 完成DDR初始化和检测
SPL加载完整U-Boot
完成DDR初始化后,SPL从存储设备(SD卡)读取完整的U-Boot镜像,将其加载到DDR中,然后跳转到DDR中执行完整U-Boot。c.完整U-Boot阶段(在DDR中执行)
U-Boot汇编入口 _start
完整U-Boot代码在DDR中从 _start 标签处开始执行。_start 定义在 arch/arm/lib/vectors.S 文件中,其作用是建立异常向量表(将向量基址寄存器 VBAR 指向此处)并跳转到 reset 函数。reset 函数位于 arch/arm/cpu/armv7/start.S 中,执行CPU初始化,完成后调用低级初始化例程,并最终进入C语言环境下的 _main 函数。
U-Boot初始化关键函数
在 _main(位于 arch/arm/lib/crt0.S)中,U-Boot开始运行C代码,首先设置堆栈和全局数据结构,然后可能会进行代码重定位(如果需要),之后调用 board_init_r() 函数。
修正: board_init_r()(定义于 common/board_r.c)负责后期板级初始化:• 环境变量初始化• 驱动模型启动• 板级特定驱动的初始化(如 MMC、以太网、USB 等设备的注册)• 设置启动环境
最后,U-Boot会执行引导命令(如 bootz、bootm)以加载并运行Linux内核。
uboot目录下的u-boot.map可以看到uboot整个镜像的是怎么链接的,System.map可以看到uboot被复制到片上ram的开始地址

2、为什么需要把uboot搬运到ddram里面去?
把 U-Boot 搬运到 DDR 执行,是为了克服片上 SRAM 的空间限制、获得更大的运行空间、更高的性能以及支持更多功能(如设备树、网络、USB、命令交互等)。这是嵌入式引导加载器标准的启动策略。
3、uboot前面加的头是加了什么,干了什么?
在这里插入图片描述
4、DCD 初始化 vs. board_init_f / board_init_r 初始化的区别
在这里插入图片描述

http://www.dtcms.com/a/312063.html

相关文章:

  • android studio 安装Flutter
  • WD5208S,12V500MA,应用于小家电电源工业控制领域
  • Kubernetes 构建高可用、高性能 Redis 集群实战指南
  • #C语言——学习攻略:探索字符函数和字符串函数(一)--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
  • 数据库理论
  • 【MATLAB】(五)向量
  • 变量筛选—随机森林特征重要性
  • windows@Path环境变量中同名可执行文件优先级竞争问题@Scoop安装软件命令行启动存在同名竞争问题的解决
  • 解决 InputStream 只能读取一次问题
  • Java语言核心特性全解析:从面向对象到跨平台原理
  • Docker--将非root用户添加docker用户组,解决频繁sudo执行输入密码的问题
  • 【动态规划 | 子序列问题】子序列问题的最优解:动态规划方法详解
  • RK628F HDMI-IN调试:应用接口使用
  • Vulnhub ELECTRICAL靶机复现(附提权)
  • QPainter::CompositionMode解析
  • junit总@mockbaen与@mock的区别与联系
  • flutter分享到支付宝
  • Linux进程控制核心:创建·等待·终止·替换
  • Qt 信号和槽正常连接返回true,但发送信号后槽函数无响应问题【已解决】
  • 深入解析Java Stream Sink接口
  • Design Compiler:Milkyway库的创建与使用
  • 1-7〔 OSCP ◈ 研记 〕❘ 信息收集▸主动采集E:SMB基础
  • 硬件-可靠性学习DAY1——系统可靠性设计指南:从原理到实践
  • Markdown 中的图表 Mermaid 与 classDiagram
  • Thread 中的 run() 方法 和 start() 方法的
  • 笔记:C语言中指向指针的指针作用
  • MQTT协议测试环境部署
  • 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
  • (nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
  • UNet改进(29):记忆增强注意力机制在UNet中的创新应用-原理、实现与性能提升