嵌入式 ARM Linux 系统构成(1):Bootloader层

目录

一、Bootloader 概述

1.1 核心作用

1.2 典型启动流程

二、ARM Bootloader 架构详解

2.1 多阶段启动设计

2.2 关键代码流程 

2.3. Bootloader的加载过程

2.4. Bootloader的加载方式

2.5. Bootloader 的移植

三、常见的Bootloader介绍

3.1.  U-Boot

3.2. vivi

3.3. Blob(BootLoader Object)

3.4. ARMboot

3.5. RedBoot

四、典型问题解决方案

4.1 启动卡死问题排查

4.2 环境变量修复

4.3 安全启动配置

五、性能优化技巧

5.1 启动时间优化

5.2 存储布局优化

六、 高级调试技术

6.1 异常跟踪方法

七、 常见问题 FAQ

八、总结

九、参考资料


嵌入式ARM Linux系统因其高效、低功耗的特点,在智能手机、家用电器、汽车控制系统等领域得到了广泛应用。作为系统启动的第一道门槛,Bootloader层在嵌入式Linux系统中扮演着至关重要的角色。

一、Bootloader 概述

1.1 核心作用

Bootloader 是嵌入式系统的"第一行代码",承担着从冷启动到操作系统加载的关键桥梁作用。其主要功能包括:

  • 硬件初始化:时钟、DDR、外设控制器

  • 介质检测:识别存储设备(NOR/NAND Flash, eMMC, SD卡)

  • 镜像加载:定位并加载内核及设备树

  • 协议支持:实现TFTP、USB、UART等传输协议

  • 安全启动:验签机制(可选)

1.2 典型启动流程

  1. ROM Code → 2. SPL → 3. TPL → 4. U-Boot → 5. Linux Kernel

二、ARM Bootloader 架构详解

2.1 多阶段启动设计

┌────────────┐   ┌───────────────┐   ┌───────────┐
│  Boot ROM  │ → │ Secondary PL  │ → │  U-Boot   │
└────────────┘   └───────────────┘   └───────────┘(固化在芯片)       (SPL/TPL)           (完整功能)

①SPL(Secondary Program Loader)

  • 特点体积 < 64KB,无动态内存

  • 功能

    • 初始化基础时钟

    • 配置DDR控制器

    • 加载TPL/U-Boot到RAM

② U-Boot 主体

  • 功能集:

    • 设备树解析

    • 文件系统支持(FAT, EXT4)

    • 网络协议栈(PING, TFTP)

    • 命令交互接口

2.2 关键代码流程 

// arch/arm/lib/crt0.S
_start:b   resetldr pc, _undefined_instruction/* ... 异常向量表 ... */reset:/* 关闭MMU/Cache */mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002000bic r0, r0, #0x00000007mcr p15, 0, r0, c1, c0, 0/* 设置栈指针 */ldr sp, =CONFIG_SYS_INIT_SP_ADDR/* 跳转到C入口 */bl  board_init_f

2.3. Bootloader的加载过程

Bootloader的启动过程通常分为两个阶段:Stage1和Stage2。

①Stage1(硬件初始化阶段)

  • 硬件初始化:此阶段,Bootloader会执行基本的硬件初始化,包括屏蔽中断、设置CPU速度和时钟频率、初始化RAM、初始化LED系统指示灯以及关闭CPU内部指令/数据cache等。这些初始化操作为后续阶段和操作系统的执行提供了必要的硬件环境。
  • 准备RAM空间:为了加载Stage2,Bootloader需要准备一段可用的RAM空间。通常涉及测试RAM的读写能力,以确保所选地址范围是有效的RAM空间。
  • 拷贝Stage2到RAM:将Stage2的可执行映像从固态存储设备(如ROM、EEPROM、FLASH等)拷贝到准备好的RAM空间中。
  • 设置堆栈指针:为执行C语言代码,需要设置堆栈指针。
  • 跳转到Stage2:完成以上步骤后,Bootloader会跳转到Stage2的C语言入口点开始执行。

②Stage2

  • 初始化硬件设备:在Stage2中,Bootloader会进一步初始化本阶段需要使用的硬件设备,如串口、计时器等。
  • 检测系统内存映射:内存映射是指在整个物理地址空间中,哪些地址范围被分配以用作寻址系统的RAM单元。Stage2会检测系统内存映射,以便正确加载和访问操作系统或应用程序。
  • 加载操作系统或应用程序:根据预定义的引导策略,Bootloader会从选定的引导设备(如闪存、外部存储器、串口等)中读取操作系统镜像或应用程序,并将其加载到内存中。
  • 设置启动参数:为操作系统或应用程序设置必要的启动参数,如内核命令行参数等。
  • 启动操作系统或应用程序:一旦操作系统或应用程序加载到内存中并设置好启动参数,Bootloader会跳转到该程序的入口点,启动执行。对于操作系统,这意味着将控制权移交给操作系统内核;对于应用程序,则开始执行应用程序的主函数。

2.4. Bootloader的加载方式

Bootloader的加载方式取决于具体的硬件平台和引导需求。常见的加载方式包括:

  • 从Flash存储器加载:如果Bootloader已经烧录到Flash存储器中,系统上电后会自动从Flash加载Bootloader到内存并启动。
  • 通过UART接口加载:可以通过UART接口使用特定的命令(如loadb)将Bootloader加载到内存中。这种方式通常用于调试和更新Bootloader。
  • 通过网络加载:如TFTP(Trivial File Transfer Protocol)等网络协议,可以将Bootloader从主机下载到目标机的内存中。这种方式适用于远程调试和升级。
  • 从SD卡加载:可以将Bootloader写入SD卡,然后通过SD卡启动系统。这种方式常用于嵌入式系统的固件升级和恢复。 

2.5. Bootloader 的移植

①移植步骤

  • 硬件相关代码修改:首先需要根据目标硬件平台,修改 Bootloader 中与硬件初始化相关的代码。包括修改时钟配置、内存控制器配置、串口等设备驱动代码。例如,对于新的 ARM 芯片,可能需要重新计算 PLL 的分频系数,以获得合适的时钟频率。
  • 设备树修改:如果目标硬件平台使用设备树,需要根据实际硬件情况修改设备树文件。添加或修改硬件设备节点,确保设备树能够准确描述硬件设备的信息。例如,添加新的 GPIO 控制器节点,并配置其相关属性。
  • 编译和下载:完成代码修改后,使用交叉编译工具链对 Bootloader 进行编译,生成可执行文件。然后通过 JTAG、串口等方式将 Bootloader 下载到目标硬件平台上进行测试和调试。

②注意事项

  • 在移植过程中,仔细阅读目标硬件平台的参考手册,确保对硬件的理解准确无误。例如,对于内存控制器的配置,不同的芯片可能有不同的寄存器设置方式。
  • 注意 Bootloader 与内核之间的兼容性。一些内核版本可能对 Bootloader 传递的启动参数有特定要求,需要根据内核版本进行相应的调整。
  • 调试移植过程中的问题时,可以充分利用串口输出的调试信息。通过在关键代码位置添加打印语句,逐步排查问题。

三、常见的Bootloader介绍

在嵌入式ARM Linux系统中,常见的Bootloader包括U-Boot、vivi、Blob等。

3.1.  U-Boot

U-Boot是一种广泛应用于嵌入式ARM系统的开源Bootloader。U-Boot是遵循GPL条款的开放源码项目,支持多种处理器架构如PowerPC、ARM、X86、MIPS等,能够适配上百种开发板。提供了丰富的外设驱动支持,支持多个文件系统,并附带调试、脚本、引导等工具。U-Boot特别支持Linux系统,为板级移植做了大量工作,是功能最多、灵活性最强且开发最积极的开源Bootloader之一。

  • 功能特点
    • 支持从多种存储设备中加载内核镜像,如Flash存储器、硬盘等。
    • 可以通过网络进行远程启动,方便进行远程系统升级和设备部署。
    • 提供了丰富的配置选项和命令行接口,方便开发者进行调试和定制。
  • 应用场景:在工业物联网设备的批量生产中,U-Boot可以方便地对大量设备进行内核更新和配置。同时,它也广泛应用于智能手机、平板电脑等高性能嵌入式设备中。

3.2. vivi

  • 特点:vivi是由韩国Mizi公司开发的一种Bootloader,专门针对ARM9处理器而设计,支持S3C2410x处理器。提供了两种工作模式:启动加载模式和下载模式。在下载模式下,vivi为用户提供一个命令行接口,方便用户进行调试和烧写操作。
  • 应用:vivi主要应用于基于ARM9处理器的嵌入式系统中。

3.3. Blob(BootLoader Object)

  • 特点:Blob是由Jan-Derk Bakker和Erik Mouw发布的Bootloader,专为StrongARM构架下的LART设计。它支持SA1100的LART主板,但用户也可以自行修改移植。Blob提供了两种工作模式,并具备较齐全的功能和较少的代码量,适合进行修改移植来引导Linux系统。
  • 应用:Blob主要应用于基于StrongARM构架的嵌入式系统中,如S3C44B0板等。

3.4. ARMboot

  • 特点:ARMboot是一个ARM平台的开源固件项目,它严重依赖于PPCBoot。ARMboot支持的处理器构架有StrongARM、ARM720T、PXA250等,是为基于ARM或StrongARM CPU的嵌入式系统所设计的。ARMboot的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。
  • 应用:ARMboot应用于基于ARM或StrongARM处理器的嵌入式系统中,提供了一个轻便且功能完备的引导解决方案。

3.5. RedBoot

  • 特点:RedBoot是标准的嵌入式调试和引导解决方案,是一个专门为嵌入式系统定制的引导工具。它最初由Redhat开发,是嵌入式操作系统eCos的一个最小版本,并随eCos发布。RedBoot支持串口、网络下载和执行嵌入式应用程序,既可以用在产品的开发阶段(调试功能),也可以用在最终的产品上(Flash更新、网络启动)。
  • 应用:RedBoot广泛应用于各种嵌入式系统中,特别适用于需要远程调试、升级和配置的场景。

四、典型问题解决方案

4.1 启动卡死问题排查

①串口日志分析

U-Boot 2023.07 (Oct 10 2023 - 14:20:00 +0800)CPU: i.MX6ULL rev1.2 792 MHz (running at 396 MHz)
Reset cause: POR
Model: Freescale i.MX6 ULL 14x14 EVK Board
DRAM:  512 MiB
MMC:  FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment

常见错误标识:CRC错误、时钟配置警告

②JTAG 调试流程

  • 设置断点:board_init_f()

  • 寄存器检查:

    • CP15 控制寄存器

    • DDRCTL 配置寄存器

  • 内存测试: 

=> md 0x80000000 100
=> mw 0x80000000 0xdeadbeef

4.2 环境变量修复

# 重置默认环境
env default -a
saveenv# 手动设置启动参数
setenv bootcmd 'mmc dev 0; ext4load mmc 0:1 0x80800000 zImage; bootz 0x80800000 - 0x83000000'
setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait
saveenv

4.3 安全启动配置

U-Boot 签名验证示例:

# 生成密钥
openssl genrsa -out key.pem 2048# 签名镜像
tools/mkimage -F -k keydir/ -K u-boot.dtb -r -o signed -K key.pem u-boot.bin# 验证配置
CONFIG_FIT_SIGNATURE=y
CONFIG_RSA_VERIFY=y

五、性能优化技巧

5.1 启动时间优化

①精简功能:

# configs/imx6ull_defconfig
-CONFIG_CMD_NET=y
-CONFIG_USB=y
+CONFIG_BOOTDELAY=0

②时钟优化策略:

  • 提前提升CPU主频

  • 使用SPL跳过重复初始化

③并行初始化:

// 启用DMA初始化存储设备
mmc_init_stream(dev);

5.2 存储布局优化

典型分区方案:

Device     Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1  2048   34815   32768   16M  a U-Boot
/dev/mmcblk0p2 34816  262143  227328  111M 83 Linux
/dev/mmcblk0p3 262144 1048575 786432  384M 83 Linux

六、 高级调试技术

6.1 异常跟踪方法

①未定义指令处理:

void show_regs(struct pt_regs *regs)
{printf("PC : [<%08lx>] LR : [<%08lx>]\n",regs->ARM_pc, regs->ARM_lr);/* 打印完整寄存器上下文 */
}

②内存保护调试:

=> cp.b 0x80000000 0x81000000 0x100000
=> cmp.b 0x80000000 0x81000000 0x100000

七、 常见问题 FAQ

Q1: 如何判断DDR初始化是否成功?
A: 使用内存测试命令,或观察串口输出的DRAM容量信息

Q2: U-Boot无法保存环境变量怎么办?
A: 检查存储设备分区,确认环境变量区偏移量设置正确

Q3: 启动卡在"Starting kernel..."可能原因?
A: 设备树地址错误、内核镜像损坏或启动参数不匹配

Q4: 如何实现双系统启动?
A: 通过bootcmd脚本实现条件分支:

if mmc dev 1; then run boot_linux; else run boot_rtos; fi

八、总结

Bootloader层在嵌入式ARM Linux系统中扮演着至关重要的角色。它负责初始化系统硬件、加载操作系统,并将控制权转移到操作系统的启动过程。了解Bootloader的功能、作用、加载过程以及常见问题对于嵌入式系统开发者来说至关重要。


九、参考资料

  • 《U-Boot Porting Guide》

  • 《ARM Architecture Reference Manual》

  • ARM架构的BootLoader详解——对于Linux与Baremetal(裸机MCU)_arm bootloader-CSDN博客


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28473.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器

Ubuntu20.04双系统安装及软件安装&#xff08;九&#xff09;&#xff1a;谷歌浏览器 打开终端&#xff0c;下载谷歌浏览器软件包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行&#xff1a; sudo…

【五.LangChain技术与应用】【10.LangChain ChatPromptTemplate(下):复杂场景下的应用】

凌晨两点的西二旗,你盯着监控大屏上跳动的错误日志,智能客服系统在流量洪峰中像纸船一样摇晃。用户骂声塞满弹窗:“等了十分钟就这?”“刚才说的怎么不认了?”“我要人工!!”——这时候你需要的不只是ChatPromptTemplate,而是给对话系统装上航天级操控台。 一、模板组…

Django项目实战

1、安装django 查看包安装的位置 pip镜像源 镜像源名称镜像地址​清华源​https://pypi.tuna.tsinghua.edu.cn/simple​阿里云​https://mirrors.aliyun.com/pypi/simple​腾讯云​https://mirrors.cloud.tencent.com/pypi/simple​华为云​https://repo.huaweicloud.co…

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH 前言整体思路理解向YOLO 目标检测完整流程 环境配置Anaconda 获取 YOLO 代码与预训练模型下载 YOLOv5 代码和预训练模型配置 YOLOV5 工程环境解压 YOLOv5 源代码 并 添加预训练模型调整依赖版本选择对应的 Python 解释器 数据集准备…

PMP项目管理—沟通管理篇—1.规划沟通管理

文章目录 基本信息步骤4W1HITTO输入工具与技术输出 沟通需求分析沟通技术沟通模型沟通噪声障碍的类型 沟通漏斗模型 沟通方法相关方参与度评估矩阵传递方式影响沟通效果沟通管理计划 基本信息 步骤 收集信息&#xff0c;加工信息确定项目沟通需求确定项目沟通的方法编制项目沟…

SCI期刊推荐 | 免版面费 | 计算机领域:信息系统、软件工程、自动化和控制

在学术研究领域&#xff0c;选择合适的SCI期刊对科研成果的传播与认可至关重要。了解SCI期刊的研究领域和方向是基础&#xff0c;确保投稿内容与期刊主题相符。同时&#xff0c;要关注期刊的影响因子和评估标准&#xff0c;选择具有较高影响力和学术认可度的期刊。阅读期刊的投…

EasyDSS视频推拉流系统:清理缓存文件时如何确保缓存读写不受影响?

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户咨询&#xff0c;视频推…

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)

文章目录 2.3.3 极化编码巴氏参数与信道可靠性比特混合生成矩阵编码举例 2.3.4 极化译码最小单元译码串行抵消译码&#xff08;SC译码&#xff09;算法SCL译码算法 2.3.5 总结**Polar 码的优势****Polar 码的主要问题****Polar 码的应用前景** 2.3.6 **参考文档** 本博客为系列…

GCC RISCV 后端 -- cc1 入口

GCC编译工具链中的 gcc 可执行程序&#xff0c;实际上是个驱动程序&#xff08;Driver&#xff09;&#xff0c;其根据输入的参数&#xff0c;然后调用其它不同的程序&#xff0c;对输入文件进行处理&#xff0c;包括编译、链接等。可以通过以下命令查看&#xff1a; gcc -v h…

用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!

下载模型与数据 模型下载&#xff1a; huggingface&#xff1a; Qwen/Qwen2.5-7B-Instruct HF MirrorWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct 魔搭&a…

基于编译器特性浅析C++程序性能优化

最近在恶补计算机基础知识&#xff0c;学到CSAPP第五章的内容&#xff0c;在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;来衡量&#xff0c;其指的是处理每个元素…

K8s控制器Deployment详解

回顾 ReplicaSet 控制器,该控制器是用来维护集群中运行的 Pod 数量的&#xff0c;但是往往在实际操作的时候&#xff0c;我们反而不会去直接使用 RS&#xff0c;而是会使用更上层的控制器&#xff0c;比如说 Deployment。 Deployment 一个非常重要的功能就是实现了 Pod 的滚动…

大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘

文章目录 一、架构设计深度解剖1.1 核心架构对比图谱1.2 动态MoE架构实现架构差异分析表 二、训练策略全面对比2.1 训练数据工程对比2.2 分布式训练代码对比DeepSeek混合并行实现GPT-4 Megatron实现对比 2.3 关键训练参数对比 三、性能表现多维评测3.1 基准测试全景对比3.2 推理…

【MySQL_02】安装(8.4.4LTS : Windows + Linux)

文章目录 一、版本说明二、官网下载三、Windows安装3.1 安装和配置3.2 四、Linux安装 历史文章点击&#x1f449;&#xff1a;SQL &#x1f408;‍⬛github&#xff1a;https://github.com/mysql &#x1f4bb;官网&#xff1a; https://www.mysql.com &#x1f30f;维基百科…

今天来介绍和讨论 AGI(通用人工智能)

首先介绍&#xff0c;AGI&#xff08;通用人工智能&#xff09;是什么&#xff1f; AGI&#xff08;Artificial General Intelligence&#xff0c;通用人工智能&#xff09;指的是能够像人类一样理解、学习、推理和解决广泛任务的人工智能系统。与目前的AI不同&#xff0c;AGI可…

自动化学习-使用git进行版本管理

目录 一、为什么要学习git 二、git是什么 三、git如何使用 1、git的下载安装和配置 2、git常用的命令 3、gitee远程仓库的使用 &#xff08;1&#xff09;注册 &#xff08;2&#xff09;创建仓库 &#xff08;3&#xff09;配置公钥&#xff08;建立电脑和git…

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比

文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析&#xff1a;5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析&#xff1a;卫星通信系统实例…

从vue源码解析Vue.set()和this.$set()

前言 最近死磕了一段时间vue源码&#xff0c;想想觉得还是要输出点东西&#xff0c;我们先来从Vue提供的Vue.set()和this.$set()这两个api看看它内部是怎么实现的。 Vue.set()和this.$set()应用的场景 平时做项目的时候难免不会对 数组或者对象 进行这样的骚操作操作&#xff…

IO学习day3

一、思维导图 二、练习 1、使用文件IO读取图片 文件大小&#xff0c;文件偏移量&#xff0c;宽度&#xff0c;高度 2.向一个程序中输入文件名&#xff0c;判断指定目录下是否有这个文件&#xff0c;如果有这个文件, 将这个文件的属性信息输出。如果不存在输出不存在即可。 .…

MWC 2025|紫光展锐联手美格智能发布5G通信模组SRM812

在2025年世界移动通信大会&#xff08;MWC 2025&#xff09;期间&#xff0c;紫光展锐携手美格智能正式推出了基于紫光展锐V620平台的第二代5G Sub6G R16模组SRM812&#xff0c;以超高性价比方案&#xff0c;全面赋能合作伙伴&#xff0c;加速5G规模化应用在各垂直领域的全面落…