0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

U-Boot SPL核心文件spl.c深度解析:从启动流程到调试优化

jf_44130326 来源:Linux1024 2026-02-05 14:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式系统开发中,U-BootSPLSecondary Program Loader)扮演着至关重要的角色,它是系统上电后执行的第一个软件组件之一,负责为后续启动过程铺平道路。本文将深入解析U-Bootspl.c文件的功能与作用,探讨其在系统调试和优化中的价值,并通过流程图和脑图帮助开发者快速掌握核心要点。

一、spl.c文件核心功能解析

spl.cU-Boot SPL阶段的核心实现文件,承担着从硬件初始化到加载下一阶段程序的关键任务。其主要功能可归纳为以下几个模块:

1.初始化管理

早期初始化(spl_early_init:完成malloc内存分配、缓存使能(spl_dcache_enable)、bootstage初始化等基础工作,为后续操作准备环境

系统初始化(spl_init:根据配置完成设备模型(DM)初始化、内存初始化等,设置全局标志(GD_FLG_SPL_INIT)标记初始化状态

重定位设置(spl_setup_relocate:处理SPL自身的重定位逻辑,调整全局数据(gd)和设备树(fdt)的存储位置

2.镜像加载与解析

镜像头部解析(spl_parse_image_header:识别镜像类型(U-Boot镜像、Linux内核等),提取加载地址、入口点、大小等关键信息

设备加载管理(boot_from_devices:按照板级定义的启动顺序(board_boot_order),尝试从不同设备加载镜像

加载器匹配(spl_ll_find_loader:根据启动设备类型匹配对应的镜像加载器,完成实际的镜像读取操作

3.启动流程控制

下一阶段选择(spl_next_stage:确定SPL之后要启动的程序(通常是主U-Boot或内核)

跳转准备(spl_cleanup_before_jump:跳转前的清理工作,包括关闭中断、禁用缓存、刷新数据同步屏障(dsb/isb

多路径启动支持:实现对U-BootLinux内核、ATFARM可信固件)、OP-TEE等不同目标的启动支持

4.板级适配框架

提供大量弱函数(__weak)如spl_start_ubootdram_init_banksize等,允许板级代码重写以实现平台特定功能

通过宏定义(如CONFIG_SPL_OS_BOOTCONFIG_ATF等)支持灵活的功能配置,适应不同硬件和启动需求

二、spl.cU-Boot中的核心作用

SPL作为系统启动的第一阶段,是连接硬件上电与主程序运行的桥梁,spl.c则是这一阶段的"神经中枢",具体作用体现在:

1.硬件最小化初始化:完成CPU、内存、串口等核心硬件的初始化,为后续程序运行提供基础环境

2.启动介质适配:支持从NANDNORMMC等多种存储介质加载程序,实现灵活的启动策略

3.资源约束管理:在内存、Flash等资源受限的早期阶段,高效分配和使用系统资源

4.安全启动支持:为secure boot提供基础环境,可在早期阶段验证后续程序的完整性

5.多阶段启动衔接:实现SPL到主U-Boot、内核或其他固件的平滑过渡,传递必要的启动参数

wKgZO2kajDWAcc98AAE33CBipmM970.png

三、spl.c对系统调试的关键价值

嵌入式系统调试中,SPL阶段的问题往往导致系统无法启动,spl.c提供了丰富的调试支持:

1.启动进度跟踪

通过show_boot_progress函数可跟踪启动阶段,定位卡壳位置

bootstage相关函数记录各阶段耗时,便于分析启动性能瓶颈

1.错误定位机制

详细的debug日志输出(如镜像加载信息、设备匹配结果)

明确的错误返回码(如-ENODEV表示无可用设备)

关键操作的状态提示(如"Trying to boot from XXX"

1.环境验证工具

内存初始化和分配状态检查

设备树(fdt)修复和验证(spl_fixup_fdt

缓存配置正确性验证

1.调试配置选项

CONFIG_SPL_SERIAL_SUPPORT启用串口调试输出

CONFIG_SPL_PANIC_ON_RAW_IMAGE增强对非法镜像的错误检测

CONFIG_BOOTSTAGE_STASH保存启动阶段信息供后续分析

四、在问题定位与系统优化中的应用

问题定位场景

1.启动失败问题

若卡在"SPL: failed to boot from all boot devices",可检查board_boot_order配置及对应设备驱动

镜像解析失败时,通过spl_parse_image_header中的日志确认镜像格式是否正确

1.硬件兼容性问题

内存初始化失败可检查dram_init_banksize实现

设备加载失败可跟踪spl_ll_find_loader匹配逻辑

1.性能瓶颈分析

通过spl_cleanup_before_jump中的时间统计,分析各阶段耗时

缓存配置(spl_dcache_enable)对加载速度的影响

系统优化方向

1.启动速度优化

精简启动设备列表,减少无效尝试

优化内存分配策略,减少SPL阶段内存占用

1.可靠性提升

增强镜像校验逻辑,在spl_parse_image_header中增加完整性检查

增加启动设备重试机制,提高容错能力

1.资源利用优化

根据实际需求调整CONFIG_SYS_MONITOR_LEN等宏定义,减少内存浪费

合理配置SPL与主U-Boot的功能划分,平衡资源占用

五、核心功能脑图

wKgZO2kajDuAPsJvAAFzcgGO8Eo884.png

总结

spl.c作为U-Boot SPL阶段的核心实现,是理解嵌入式系统启动流程的关键。它不仅承担着初始化硬件、加载程序的核心任务,更为系统调试和优化提供了丰富的接口和工具。

对于开发者而言,深入理解spl.c的逻辑有助于:

快速定位启动阶段的疑难问题

优化系统启动速度和资源利用

实现定制化的启动策略和硬件适配

掌握spl.c的工作机制,将为嵌入式系统开发和调试打下坚实基础,助力构建更可靠、高效的启动流程。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3830

    浏览量

    133892
  • u-boot
    +关注

    关注

    0

    文章

    137

    浏览量

    39948
  • 内存分配
    +关注

    关注

    0

    文章

    19

    浏览量

    8572
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于AM335x的U-Boot/SPL 的CCS 调试

    在基于Linux的AM335x软件开发流程中,第一步就是U-Boot/SPL(SecondProgram Loader)的移植。##2.调试环境的准备##3.3
    发表于 08-21 15:09 1.1w次阅读
    基于AM335x的<b class='flag-5'>U-Boot</b>/<b class='flag-5'>SPL</b> 的CCS <b class='flag-5'>调试</b>

    深度解析SPL阶段A/B分区启动spl_ab.c代码全拆解

    ( Secondary Program Loader ,二级程序加载器)作为系统启动的早期阶段,负责初始化硬件、选择启动分区, spl_ab.c 正是 SPL 层处理 A/B 分区
    的头像 发表于 01-20 07:07 1w次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>SPL</b>阶段A/B分区<b class='flag-5'>启动</b>:<b class='flag-5'>spl_ab.c</b>代码全拆解

    i.mx8m如何在u-boot SPL阶段启用pwm?

    硬件:i.mx8m mini。 U-Boot 版本:2023.01 DFSG-2 我想让 pwm 点亮我的 spl.c 中的 LED,这样用户在接通板子电源后就可以立即看到灯亮了。 我没有找到将
    发表于 03-21 07:51

    如何使 i.MX93 上的 U-Boot SPL 和 ATF/BL31输出静音呢?

    到外部网络设备时,U-Boot SPL 和 ATF/BL31 启动消息会回显到外部设备的控制台。如果外部设备也在启动,它可以将这些字符解释为输入命令,从而可能损坏其引导加载程序或配置。
    发表于 03-09 08:28

    更新 SPLU-Boot的提示和技巧

    U-BootSPL 文件并将它们加载到 U 盘上 7 连接将 USB 记忆棒连接到 VF2 板并将其安装在文件夹中 8 更新来自终
    发表于 03-20 08:15

    soc fpga开发日记之:preloader spl探秘

    (comm/spl/spl.c)中是spl中至关重要的工作,可畏步步惊心,是系统启动核心。。。。。。比较重要的调用有:timer_init
    发表于 12-18 14:59

    【OK210试用体验】u-boot篇 -- SPL移植

    本帖最后由 q15920078530 于 2015-8-28 20:25 编辑 【OK210试用体验】u-boot篇 -- SPL移植 在S5PV210的启动流程中可以知道,iR
    发表于 08-26 20:51

    AM335X的U-BOOT代码拷贝SDRAM,请问MLO拷贝代码u-boot.img到外部SDRAM的流程,是否正确?

    的是SD卡启动,对于AM335X,知道MLO是在内部RAM运行,而u-boot.img是在外部SDRAM运行, 那么MLO里面应该有拷贝u-boot.img
    发表于 06-21 07:21

    关于U-boot SPL入口的问题。

    仔细看了源代码,知道SPL(MLO镜像)入口是start.s但是没有找到u-bootu-boot.img)的入口,请问一下u-boot.img的入口是哪个
    发表于 06-21 16:13

    ARM U-boot SPL源码简要分析

    的设置值不变。  跳转到board_init_r()运行,复制u-boot第二阶段代码系统RAM中,并跳到第二阶段代码在系统RAM的起始地址处开始运行。crt0.S中整理出来的SPL
    发表于 04-13 09:44

    一文浅析ARM U-boot SPL的源码

    ()运行,复制u-boot第二阶段代码系统RAM中,并跳到第二阶段代码在系统RAM的起始地址处开始运行。crt0.S中整理出来的SPL main源码:ENTRY(_main)#if
    发表于 06-06 16:08

    u-boot armv8链接脚本

    u-boot armv8链接脚本 在进行源码分析之前,首先看看u-boot的链接脚本,通过链接脚本可以整体了解一个u-boot的组成,并且可以在
    的头像 发表于 12-07 11:19 1676次阅读

    深入解析U-Boot命令处理核心文件:功能、调试与开发价值

    在嵌入式系统开发中,U-Boot 作为主流的引导加载程序,其命令处理、交互逻辑和自动启动流程核心功能模块。本文将围绕command.c、c
    的头像 发表于 02-03 15:44 998次阅读
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令处理<b class='flag-5'>核心</b><b class='flag-5'>文件</b>:功能、<b class='flag-5'>调试</b>与开发价值

    解析Rockchip平台U-Boot核心文件boot_rkimg.c到底做了什么?

    在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.cU
    的头像 发表于 02-03 15:29 962次阅读
    <b class='flag-5'>解析</b>Rockchip平台<b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b><b class='flag-5'>文件</b>:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

    深入解析U-Boot image.c:RK平台镜像处理核心逻辑

    在瑞芯微(RK)平台的嵌入式开发中,U-Boot作为核心启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.
    的头像 发表于 02-24 16:46 1810次阅读
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> image.<b class='flag-5'>c</b>:RK平台镜像处理<b class='flag-5'>核心</b>逻辑