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

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

3天内不再提示

深入解析U-Boot核心文件board_f.c:知识点、调试要点与开发价值

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

扫码添加小助手

加入工程师交流群

嵌入式系统开发中,U-Boot作为应用最广泛的引导程序,其底层初始化逻辑直接决定了硬件启动的稳定性与可靠性。board_f.c作为U-Boot早期初始化的核心文件,承担着从硬件上电到代码重定位的关键流程。本文将从三个维度展开分析:

1.核心知识点:解析board_f.c的功能模块与初始化流程

2.调试关注点:开发中需重点监控的关键节点与问题排查方向

3.开发意义:理解该文件对嵌入式系统移植与定制的实际价值

一、核心知识点:board_f.c的功能与初始化流程

board_f.c的核心作用是完成U-Boot早期初始化(board_init_f,即在代码重定位到RAM之前,完成硬件基础配置、内存规划与环境准备。其内部通过一个初始化函数序列(init_sequence_f)按顺序执行各项任务,整体流程可归纳为以下模块:

wKgZPGkam2qADdCaAADrtm2Q_d0144.png

1.基础环境搭建

全局数据(gd)初始化:定义全局数据结构指针(DECLARE_GLOBAL_DATA_PTR),存储系统关键信息(内存大小、波特率、重定位地址等),是贯穿U-Boot初始化的核心数据载体。

监控程序长度计算(setup_mon_len:根据不同架构(ARMMIPS等)计算U-Boot代码段(text)、数据段(data)和BSS段的总长度,为后续内存预留做准备。

早期日志与调试初始化:通过log_inittrace_early_init等函数开启调试日志,支持后续初始化过程的信息输出。

2.硬件基础配置

CPU与架构初始化

arch_cpu_init:架构相关的基础配置(如ARMcache禁用、MIPS寄存器初始化)。

mach_cpu_init:具体芯片(SoC)的定制化配置,如时钟源选择。

get_clocks:获取CPU主频、总线时钟等关键时钟参数,为外设初始化提供基础。

外设初始化

串口(serial_init):初始化调试串口,确保早期打印功能可用。

看门狗init_func_watchdog_init):根据配置启动硬件看门狗,防止系统卡死。

I2C/SPIinit_func_i2c/init_func_spi):初始化总线控制器,为后续传感器、存储设备访问做准备。

3.内存管理与规划

DRAM初始化

dram_init:探测并配置物理内存(DRAM)的大小与地址范围。

dram_init_banksize:设置内存bank的起始地址与大小(支持多bank场景)。

show_dram_config:输出内存配置信息(总大小、各bank分布),用于调试验证。

内存预留:从DRAM顶部向下预留各类专用内存区域(顺序不可随意调整),流程图如下:

+-------------------------+高地址

|未使用内存(留给内核)|

+-------------------------+

|保护内存(CONFIG_PRAM|<- reserve_pram()

+-------------------------+

| MMU页表(ARM架构) |<- reserve_mmu()

+-------------------------+

|视频帧缓存(LCD/HDMI|<- reserve_video()

+-------------------------+

|调试跟踪缓冲区(TRACE|<- reserve_trace()

+-------------------------+

| U-Boot代码与数据 |<- reserve_uboot()

+-------------------------+

|堆内存(malloc |<- reserve_malloc()

+-------------------------+

|板级信息结构体(bd_t|<- reserve_board()

+-------------------------+

|全局数据(gd_t |<- reserve_global_data()

+-------------------------+

|设备树(FDT |<- reserve_fdt()

+-------------------------+

|栈内存(stack |<- reserve_stacks()

+-------------------------+低地址

4.代码重定位(Relocation

由于U-Boot通常从Flash启动,而Flash速度较慢,需将代码复制到RAM中执行以提升效率。核心步骤包括:

setup_dest_addr:计算重定位目标地址(基于DRAM顶部,避开预留区域)。

reloc_fdt/reloc_bootstage:将设备树、启动阶段记录等数据复制到RAM

setup_reloc:计算重定位偏移量,更新全局数据中的地址信息。

jump_to_copy:跳转至RAM中重定位后的代码,完成初始化阶段切换。

二、调试关注点:关键节点与问题排查

在调试启动问题时,board_f.c的初始化流程是核心排查对象,需重点关注以下节点:

1.初始化序列执行状态

init_sequence_f中的函数按顺序执行,任何一个函数返回非0值都会导致系统挂起(hang)。可通过以下方式定位异常:

添加打印信息:在关键函数(如dram_initreserve_uboot)前后增加printf,确认执行进度。

利用bootstage:通过bootstage_mark_name记录各阶段耗时,识别卡滞环节(需开启CONFIG_BOOTSTAGE)。

2.内存配置正确性

内存初始化错误会导致后续重定位失败,表现为系统崩溃或无响应。需验证:

DRAM大小与地址:通过show_dram_config输出确认探测到的内存大小是否与硬件匹配。

内存预留冲突:若新增设备(如LCD)需要预留内存,需检查reserve_video等函数是否导致内存重叠(可通过debug日志中的“Reserving xxx at: yyy”确认)。

3.外设初始化状态

串口:若串口无输出,需检查serial_init是否正确配置波特率(init_baud_rate)、引脚复用是否正确。

看门狗:若系统频繁复位,可能是看门狗未及时喂狗(需在长耗时操作中调用WATCHDOG_RESET ())。

设备树(FDT:通过reloc_fdt确认设备树是否成功复制到RAM,地址是否正确(避免与其他区域冲突)。

4.重定位过程验证

重定位失败会导致代码执行异常,需关注:

重定位地址计算:通过“Relocation Offset: xxx”日志确认偏移量是否正确(目标地址=原地址+偏移量)。

栈指针(SPdisplay_new_sp输出的栈地址需在预留的栈内存区域内,否则会导致栈溢出。

三、开发意义:嵌入式移植与定制的核心依据

board_f.cU-Boot移植到新硬件的关键修改点,其开发意义体现在:

1.硬件适配的入口

新增硬件(如自定义开发板)需通过修改init_sequence_f添加专属初始化函数(如board_early_init_f),配置引脚复用、时钟等底层参数。

对于特殊内存布局(如带安全区域的DRAM),需重写board_get_usable_ram_top调整内存顶地址计算逻辑。

2.系统优化的关键

内存预留策略可根据需求调整(如减小malloc区域大小以节省内存,或增大视频缓存支持更高分辨率)。

通过裁剪init_sequence_f中不必要的初始化步骤(如禁用未使用的I2C/SPI),可缩短启动时间。

3.问题定位的基础

理解board_f.c的流程是解决启动问题的前提:

若内核启动时提示内存大小错误,需检查dram_init_banksize是否正确设置bi_dram结构体。

若重定位后程序崩溃,需验证reloc_off计算是否正确,或是否遗漏了某些数据的复制(如私有的全局变量)。

总结

board_f.c作为U-Boot早期初始化的总指挥,串联了硬件配置、内存管理与代码重定位的核心流程。掌握其知识点有助于理解嵌入式系统的启动原理,明确调试关注点可快速定位启动故障,而深入其开发意义则为硬件移植与系统优化提供了清晰路径。无论是调试现有问题还是定制新平台,board_f.c都是嵌入式工程师必须吃透的关键文件。



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

    关注

    5209

    文章

    20625

    浏览量

    336759
  • 调试
    +关注

    关注

    7

    文章

    653

    浏览量

    35864
  • u-boot
    +关注

    关注

    0

    文章

    135

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    imx6ull开发u-boot下网络部分的移植和调试

    今天给大家讲一讲如何将u-boot网络部分的移植和调试
    发表于 07-12 15:11 4654次阅读
    imx6ull<b class='flag-5'>开发</b>板<b class='flag-5'>u-boot</b>下网络部分的移植和<b class='flag-5'>调试</b>

    U-boot的基本介绍

    从本文开始,将陆续推送“手把手教你移植U-boot”系列文章,目标是由浅入深地讲解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默认硬件开发
    发表于 07-14 16:52 4262次阅读
    <b class='flag-5'>U-boot</b>的基本介绍

    U-Boot的启动及移植分析

    bootloader 开发是嵌入式系统必不可少而且十分重要的部分,U-Boot 为功能强大的bootloader 开发软件。本文详细分析了U-Boot 的启动流程,并结合其源码,阐述了
    发表于 09-01 16:34 27次下载

    基于S3C2440的U-Boot开机logo的设计

    在对U-Boot进行深入分析的基础上,同时对S3C2440的LCD控制器原理以及INNOLUX 7寸LCD的成像原理进行分析,最后结合系统软硬件特性实现基于U-Boot的开机logo。
    发表于 12-06 15:14 96次下载
    基于S3<b class='flag-5'>C</b>2440的<b class='flag-5'>U-Boot</b>开机logo的设计

    u-boot简介

    演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一
    发表于 10-14 11:17 3997次阅读

    如何使用Xilinx SDK调试u-boot代码

    了解如何使用Xilinx SDK调试u-boot代码。 概述了技术以获得重定位偏移量,以便可以在SDK中应用它。
    的头像 发表于 11-27 06:36 5003次阅读

    fireflyAIO-3399C主板U-Boot介绍

    RK U-Boot 基于开源的 U-Boot 进行开发,工作模式有启动加载模式和下载模式。
    的头像 发表于 12-04 10:31 2073次阅读

    fireflyAIO-3288C主板U-Boot介绍

    RK U-Boot 基于开源的 U-Boot 进行开发,工作模式有启动加载模式和下载模式。
    的头像 发表于 12-16 13:52 1842次阅读
    fireflyAIO-3288<b class='flag-5'>C</b>主板<b class='flag-5'>U-Boot</b>介绍

    U-Boot架构浅析

    导读:嵌入式Linux系统搭建,bootloader是必不可少的一环,而U-Boot已成嵌入式Linux事实标准。所以较为深入的分析U-Boot的设计,对于更...
    发表于 02-07 11:56 7次下载
    <b class='flag-5'>U-Boot</b>架构浅析

    Linux U-Boot开发指南

    介绍 U-Boot 的编译打包、基本配置、常用命令的使用、基本调试方法等, 为 U-BOOT 的移植及应用开发提供了基础。
    的头像 发表于 03-06 10:28 2612次阅读
    Linux <b class='flag-5'>U-Boot</b><b class='flag-5'>开发</b>指南

    u-boot armv8链接脚本

    /u-boot-spl.lds进行链接,因为每个board的情况可能不同,所以u-boot可以通过Kconfig来自定义u-boot-spl.lds和
    的头像 发表于 12-07 11:19 1662次阅读

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

    解析 U-Boot 中 spl.c 文件的功能与作用,探讨其在系统调试和优化中的价值,并通过流程
    的头像 发表于 02-05 14:08 415次阅读
    <b class='flag-5'>U-Boot</b> SPL<b class='flag-5'>核心</b><b class='flag-5'>文件</b>spl.<b class='flag-5'>c</b>深度<b class='flag-5'>解析</b>:从启动流程到<b class='flag-5'>调试</b>优化

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

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

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

    在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c
    的头像 发表于 02-03 15:29 929次阅读
    <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.c正是
    的头像 发表于 02-24 16:46 1768次阅读
    <b class='flag-5'>深入</b><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>逻辑