文章目录
-
- 1、资料快车
- 2、uboot教程选择
- 3、uboot版本与演进趋势
-
- 1)2008推出,持续更新迭代中
- 2)uboot的来源
- 3)工程上的bootloader
-
- [1、MTK - mboot/sboot](#1、MTK - mboot/sboot)
- [2、AML - ATF架构](#2、AML - ATF架构)
- 4)uboot概况
- 4、uboot与kernel的对比
-
- 1)复杂度对比
- 2)源码目录对比
- 3)编译架构对比
-
- [1、uboot支持make menuconfig?](#1、uboot支持make menuconfig?)
- 2、Linux内核配置
- 5、boot的驱动和内核的驱动分工?
- 6、U-Boot关键开发任务
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
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的;
1、uboot支持make menuconfig?
在较新版本支持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关键开发任务
