Linux-ARM-Bootloader概述

文章目录

1、资料快车

1)官方源码(与Linux一样):https://elixir.bootlin.com/u-boot/v2025.10/source/Licenses

2)由于uboot体量不大,没有成体系的书籍,大多数是工程笔记文档 - 启动分析、移植

最易懂的U-Boot概述:https://blog.csdn.net/robin__su/article/details/132509344

U-boot官方文档(最佳学习资料):https://docs.u-boot.org/en/latest/

U-Boot、文件系统与系统移植:BSP开发全栈实战指南:https://blog.csdn.net/niuTyler/article/details/151114244

uboot介绍:介绍uboot的基本概念、用法和实现方式:https://developer.aliyun.com/article/1463090

2)BIOS/UEFI - 与uboot同等地位

http://www.wowotech.net/armv8a_arch/UEFI.html

3)uboot移植

https://blog.csdn.net/oqqhutu12345678/category_6837476.html

4)内核移植

https://blog.csdn.net/oqqhutu12345678/category_6875733.html

1)ARMv8架构u-boot分析

系列一:https://blog.csdn.net/maybeYoc/article/details/122937844

系列二:https://blog.csdn.net/maybeYoc/article/details/122960357

2)u-boot启动流程分析

u-boot启动流程分析1:http://www.wowotech.net/u-boot/boot_flow_1.html

u-boot启动流程分析2:http://www.wowotech.net/u-boot/boot_flow_2.html

3)A/B系统分析案例

A/B系统问题(宇杭): https://kb.cvte.com/pages/viewpage.action?pageId=374124329

4)Bootloader(Uboot)到内核的启动流程

https://blog.csdn.net/qq_16933601/article/details/106244510

2、uboot教程选择

1)韦东山教程

1)Linux Bootloader

https://www.bilibili.com/video/BV1L24y187cK/?spm_id_from=333.337.search-card.all.click\&vd_source=7d19bc580a97f07b3ada7b2093867f55

2)韦东山嵌入式 - 学习方法路线

复制代码
1)先学习《从零编写bootloader的视频》,这可以从最少的代码理解bootloader的主要功能;
2)再看书上对u-boot的讲解,并结合《分析u-boot 1.1.6的视频》来理解;
3)最后,有时间有兴趣的话,看《移植一个全新u-boot的视频》,这不是必须的。

学习程度:
1)理解u-boot的启动过程,特别是u-boot代码重定位:怎么从Flash上把自己读入内存;
2)理解u-boot的核心:命令
3)知道bootloader如何给内核传递参数;
4)知道bootloader是根据"bootcmd"指定的命令启动内核
5)作为入门:只求理解,不要求能移植u-boot

2)其它

1、韦东山 - 2017.03版本(教程2023 - 特点:编译架构)

2、朱有鹏 - 2012版本(教程2015 - 特点:完整,细致)

3、麦子学院 - 2012版本 (教程2019 - 特点:运行内存,DDR)

4、华清远见 - 2013版本

版本的选择原则 - 够用就行

3、uboot版本与演进趋势

掌握复杂的开源项目uboot,建议了解其"背景"和演进,具有指导意义,能够洞悉其中的设计思想和设计技巧;

1)2008推出,持续更新迭代中

https://elixir.bootlin.com/u-boot/v2025.10/source/Licenses

2)uboot的来源

1)UBOOT官方源码(一级);

2)芯片厂商定制(二级);

3)开发板厂商或方案商(三级);

3)工程上的bootloader

不同项目对uboot的改造不同,但主体不变

1、MTK - mboot/sboot
复制代码
├── MstarApp
├── MstarCore
├── MstarCustomer
├── sboot
├── tool
├── TVTEELoader
└── u-boot-2011.06
2、AML - ATF架构
复制代码
bootloader/
├── uboot-repo/          # 主代码仓库
│   ├── bl2/             # 第二阶段 Bootloader(安全启动)
│   ├── bl30/            # 实时操作系统(RTOS)固件
│   ├── bl31/            # ARM Trusted Firmware-A (ATF) EL3 阶段
│   ├── bl31_1.3/        # ATF 1.3 版本
│   ├── bl32/            # 安全世界固件(如 OP-TEE)
│   ├── bl32_3.8/        # BL32 3.8 版本
│   ├── bl33/            # U-Boot 主程序(非安全世界)
│   │   ├── v2015/       # U-Boot 2015 版本
│   │   └── v2019/       # U-Boot 2019 版本
│   ├── bl40/            # 额外的 bootloader 阶段
│   ├── fip/             # Firmware Image Package 构建系统
│   ├── build/           # 构建输出目录
│   └── soc/             # SoC 相关固件

BL2:早期初始化、DDR 初始化、安全验证
BL30:RTOS,处理低功耗、电源管理等
BL31:ATF,提供安全监控调用(SMC)接口
BL32:可选,安全执行环境(如 OP-TEE)
BL33:U-Boot,设备树、驱动、文件系统、网络等
BL40:额外 bootloader 阶段

3)HISI - 采用原生uboot,相较于AML,没有使用ATF

4)uboot概况

1、2015前boot是一个单线程程序,都是单线程,较新的boot会有类似线程机制(任务队列、多核启动SMP)

1)单任务执行的Bootloader,从头到尾按顺序执行代码;

2)没有线程/进程调度器(如 Linux 的 scheduler);

3)全程独占CPU,不保存/恢复执行上下文;

2、uboot在bootloader中的地位

嵌入式领域默认使用uboot作为bootloader,目前在嵌入式开发项目中没有看到过第二款bootloader;

uboot与内核类型,也在不断地迭代更新,加入越来越多的新特性(比如dm),如今uboot逐渐发展成一个"小型linux";

常见的版本2011(MTK)、2015(AML)、2017(Rockchip)、2019(AML、HISI);

3、为什么一定需要uboot?

1、这是一个分层分工的设计,uboot面向原始的板级操作,kernel则面向软件核心;

2、uboot的代码完全可以集成到kernel,但这样加大kernel的负担,降低灵活性,并且uboot和kernel是两个不同的开源项目,kernel没有必要重新设计,直接使用uboot的功能(OTA/刷镜像/调试等等功能);

3、比如使用boot升级kernel,如果boot和kernel合体,则大大损失灵活性;

4、uboot本身要求功能最简单,为何uboot越来越复杂?

1、uboot与kernel一样,作为一个优秀的开源项目,兼容很多平台,功能越来越复杂,不同平台需求不同;

2、换言之,uboot功能是可配置的,多功能只是一种选择,实际应用时,按照当前平台来配置选取相应的功能;

5、为什么boot不需要线程?

boot的作用是硬件初始化、内核加载、用户交互(命令行 - 轮询输入+状态机) 单线程即可满足

boot支持文件系统吗?支持 bootloader/fs/* (fat/jffs2/yaffs2)

6、boot的处理流程

4、uboot与kernel的对比

1)uboot大量借鉴和移植kernel源码,因此可以对比着研究;

2)有些厂商甚至设计在编译阶段,直接拷贝kernel的驱动源码到uboot中去使用;

3)裸机、uboot和kernel的驱动差异,分层设计不同,其中kernel最为复杂,很多框架子系统,兼容代码和附属功能代码最为齐全;

1)复杂度对比

uboot就是轻量级Linux,趋势是越来越接近;

2)源码目录对比

1、为什么uboot和kernel有相同的驱动?

1)uboot在一定程度移植了linux的驱动 给自己使用;

2)学习驱动,uboot会比kernel更好学,没有kernle的框架约束,更直观地操作硬件;

2、uboot的很多功能都是阉割版,最小化支持 - net/fs/drivers等

3)编译架构对比

1、uboot越来越像kernel,很多都是直接移植kernel的;

在较新版本支持make menuconfig

复制代码
1、/android/bootloader/uboot-repo/bl33/v2019/README
Software Configuration:
=======================

Configuration is usually done using C preprocessor defines; the
rationale behind that is to avoid dead code whenever possible.

There are two classes of configuration variables:

* Configuration _OPTIONS_:
  These are selectable by the user and have names beginning with
  "CONFIG_".

* Configuration _SETTINGS_:
  These depend on the hardware etc. and should not be meddled with if
  you don't know what you're doing; they have names beginning with
  "CONFIG_SYS_".

Previously, all configuration was done by hand, which involved creating
symbolic links and editing configuration files manually. More recently,
U-Boot has added the Kbuild infrastructure used by the Linux kernel,
allowing you to use the "make menuconfig" command to configure your
build.

2、make menuconfig
android/bootloader/uboot-repo/bl33/v2019/Kbuild
android/bootloader/uboot-repo/bl33/v2019/Kconfig
2、Linux内核配置
复制代码
1、Linux内核配置三剑客:

https://blog.csdn.net/qq_40336702/article/details/151683669
.config 由谁来解析,最终产物?只能有一个.config?

2、.config的最终生成物
会生成.h文件
https://blog.csdn.net/xxxx123041/article/details/133905328

3、configs/defconfigs的差异?
defconfigs : 一般位于 arch/<架构>/configs/目录下,只包含相当于默认值有所改动的配置,较为精简
configs : 包含所有配置项的最终状态

5、boot的驱动和内核的驱动分工?

复制代码
1)boot是一个临时工,初始化最小化硬件设备 - 初始化内存控制器、时钟、电源管理单元、串口等基础硬件,直接操作寄存器

2)进到内核后,内核有可能会重新初始化部分硬件,以能提供 完整的设备功能初始化,比如
1、完整设备抽象:支持中断处理、DMA传输、缓冲区管理等高级特性
2、动态资源管理:电源管理、热拔插支持
3、系统集成:统一设备模型、支持设备树DTB解析

3)boot和内核 如何分工?
1、Bootloader驱动:凡内核无法独立完成的初始化(如内存未就绪),由Bootloader处理。
2、内核驱动:凡需持久运行、用户交互、复杂管理的功能,均由内核实现

6、U-Boot关键开发任务

相关推荐
林深现海2 小时前
宇树 Go2 + NaVILA 全栈导航系统详解 (新手入门版)
linux·vscode·yolo·ubuntu·机器人
橙露2 小时前
Docker 容器化运维:镜像优化、容器编排与持久化存储方案
java·运维·docker
LUCIFER2 小时前
[驱动进阶——MIPI摄像头驱动(三)]rk3588+OV13855摄像头驱动加载过程详细解析第二部分——DPHY驱动+CSI驱动
linux·驱动开发
小尧嵌入式2 小时前
【Linux开发四】Linux中概念|MobaXterm和Filezilla软件使用|线程|互斥锁|读写锁
linux·运维·服务器·开发语言·数据结构
a努力。2 小时前
Spring Boot 4 全面拥抱 Jackson 3
java·运维·开发语言·spring boot·后端·spring·jenkins
峥嵘life2 小时前
Android16 EDLA【GTS】GtsUnofficialApisUsageTestCases存在fail项
android·linux·运维·学习
德育处主任Pro2 小时前
『NAS』推荐几个绿联 NAS Docker 能用的镜像加速器
运维·docker·容器
海天鹰2 小时前
fcitx5皮肤
linux