当前位置: 首页 > 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.lryc.cn/news/607879.html

相关文章:

  • 网络常识-子网掩码
  • 音视频学习(四十四):音频处理流程
  • Oracle 11g RAC集群部署手册(三)
  • PHP面向对象编程与数据库操作完全指南-上
  • Redis 核心概念、命令详解与应用实践:从基础到分布式集成
  • C语言字符函数和字符串函数全解析:从使用到模拟实现
  • 力扣面试150题--回文数
  • 2411. 按位或最大的最小子数组长度
  • 历史数据分析——中青旅
  • OneCode 3.0智能分页拦截器深度解析:从拦截机制到性能优化
  • 仿muduo库实现高并发服务器
  • flink写paimon表的过程解析
  • 华为核心交换机S7700的内存OID
  • Unity_数据持久化_XML基础
  • MATLAB科研数据可视化技术
  • LPVIMO-SAM:基于多传感器紧耦合的高精度鲁棒SLAM系统
  • Noob靶机
  • VueX进阶Pinia
  • VScode对Ubuntu用root账号进行SSH远程连接开发
  • 技巧|SwanLab记录混淆矩阵攻略
  • 解决忘记修改配置密码而无法连接nacos的问题
  • DockerFile文件执行docker bulid自动构建镜像
  • Android 15 限制APK包手动安装但不限制自升级的实现方案
  • 20250802让飞凌OK3576-C开发板在飞凌的Android14下【rk3576_u选项】适配NXP的WIFIBT模块88W8987A的蓝牙
  • 【Android】通知
  • React ahooks——副作用类hooks之useDebounceFn
  • linux eval命令的使用方法介绍
  • 【vue】创建响应式数据ref和reactive的区别
  • 防火墙配置实验2(DHCP,用户认证,安全策略)
  • C语言---函数的递归与迭代