【Linux】嵌入式Linux系统的组成、u-boot编译
Linux—嵌入式Linux系统的组成、u-boot编译
- 前言
- 一、嵌入式Linux系统的组成
- 1.1 嵌入式Linux系统和PC完整的操作系统的对比如下:
- 1.2 PC机—Windows系统启动流程(PC机—Linux系统、嵌入式ARM—linux系统的启动流程类似)
- 二、编译u-boot
- 2.1 u-boot简介
- 2.2 XIP设备
- 2.3 为什么需要u-boot
- 2.4 u-boot启动流程
- 总结
- 1. **设备上电,执行ROM代码 —— 加载U-Boot SPL(Secondary Program Loader)**
- 2. **执行SPL —— 初始化基本硬件**
- 3. **执行SPL —— 加载 U-Boot Proper**
- 4. **执行U-Boot Proper —— 进一步初始化硬件、加载操作系统内核**
- 5. **启动操作系统内核**
- 6. **操作系统运行**
- 疑问点
- 1. **LDDR(内存)**
- 2. **旁边的存储设备(带有mmcbblk1分区的部分)**
- 3. **为什么需要这些东西?**
前言
一、嵌入式Linux系统的组成
1.1 嵌入式Linux系统和PC完整的操作系统的对比如下:

1. BIOS和UEFI的作用:
a. 进行硬件自检,检测内存,CPU,显卡,硬盘等设备的状态和配置。
b. 设置启动顺序,选择从哪个设备加载引导程序,如硬盘,U盘等。
c. 加载引导程序,如bootmgr,grub2等,然后由引导程序加载操作系统,如Windows,Linux等。
d. UEFI是BIOS的一种升级替代方案。UEFI本身已经相当于一个微型操作系统。
2. grub2和bootmgr:
a. grub2 是 GNU项目 开发的一种通用的引导加载器,它可以引导多种不同的操作系统,包括Linux,Windows,FreeBSD等。
b. bootmgr 是 Windows版本 的引导加载器,它只能引导 Windows系统 或者其他使用 MBR分区表 的系统。
c. grub2 和 bootmgr 都可以通过 chainloader命令 来加载对方的引导文件,从而实现多重引导。
d. 加载引导程序,如 bootmgr,grub2 等,然后由引导程序加载操作系统,如 Windows,Linux 等。
3. U-boot:
a. uboot是一种用于嵌入式系统的引导加载器,它可以支持多种硬件平台和架构,如ARM,MIPS,PowerPC等.
b. uboot可以提供BIOS和grub2的功能,它可以初始化硬件设备,设置启动顺序,加载引导文件,启动操作系统,或者进入命令行模式
1.2 PC机—Windows系统启动流程(PC机—Linux系统、嵌入式ARM—linux系统的启动流程类似)
对应上面的系统流程图,这里以启动我们常用的windows操作系统为例,那么PC机从开机到运行程序的启动过程如下:
-
预引导阶段:
- 当我们按下电源按钮时,计算机会进行自检(POST),并执行一些基本的硬件初始化。
- 然后,它会查找EFI分区,并加载EFI分区中的引导文件(通常是
\EFI\Boot\bootx64.efi)。
-
引导阶段:
- 引导文件(如
bootmgfw.efi)会启动Windows的引导管理器(bootmgr)。 - 引导管理器会显示一个启动菜单,我们可以选择需要启动的操作系统或者让它进入安全模式等。
- 引导文件(如
-
载入内核阶段:
- 接着引导管理器会选择适当的内核文件(如
ntoskrnl.exe)并加载到内存中。 - 同时,它还会加载一些必要的设备驱动程序和系统服务。
- 接着引导管理器会选择适当的内核文件(如
-
初始化内核阶段:
- 载入内核阶段完成后,Windows内核会进行自我初始化,包括设置内存管理、输入输出系统、进程管理等。
- 内核还会创建系统进程(如
SYSTEM和SMSS),并加载更多的设备驱动程序和系统服务。
-
用户登录阶段(加载Windows用户环境和应用程序):
- 用户登录:内核初始化完成后,会启动Windows的登录管理器(
winlogon),登录管理器会显示出登录界面,用户在登录界面输入用户名和密码,系统验证用户的身份。 - 创建用户会话:如果用户身份验证成功,Windows系统会为该用户创建一个新的用户会话。这个过程包括加载用户的配置文件、设置用户的环境变量等。
- 启动Windows的外壳程序(
explorer),加载Windows用户环境:用户会话创建完成后,系统会自动启动 explorer 进程。explorer进程负责加载Windows用户环境,其中包括显示用户的桌面、任务栏和开始菜单等用户界面元素。 - 用户交互、加载应用程序:用户可以通过桌面、任务栏和开始菜单等用户界面元素与操作系统进行交互,启动应用程序、管理文件等。当用户点击某个应用程序的图标时,系统会启动该应用程序的进程,并将应用程序的窗口显示在桌面上。
- 用户登录:内核初始化完成后,会启动Windows的登录管理器(
这就是Windows系统的启动流程。与Linux系统相比,Windows系统在引导阶段会加载更多的设备驱动程序和系统服务,因此在启动速度上可能会稍慢一些。
二、编译u-boot
2.1 u-boot简介
uboot是一种通用的引导加载程序,它可以用于多种嵌入式系统,支持多种操作系统,如Linux, Android, NetBSD等。
uboot的主要作用是将操作系统内核从存储设备(如Flash, SD卡等)加载到内存中,并执行内核代码。
2.2 XIP设备
XIP设备是指一种可以直接在存储器中执行程序代码的设备,而不需要将代码复制到内存中。
XIP的全称是eXecute In Place,即芯片内执行。像片内的SRAM, NOR Flash, BROM等。
2.3 为什么需要u-boot
因为嵌入式系统的硬件资源有限,CPU上电后只能执行一小段内置的代码(BROM System),
这段代码不足以完成内存初始化,文件系统访问,网络通信等复杂的任务。
因此,需要一个中间层的程序,来完成这些工作,并引导操作系统启动。
2.4 u-boot启动流程

以下官网有对U-Boot SPL大小限制的说明:
https://linux-sunxi.org/BROM

另《Allwinner_H616_Datasheet_v1.0.pdf》(3.1 Memory Mapping)章节对BROM大小的说明。
根据上面图示,从设备上电(开机)到操作系统内核启动,U-Boot的启动过程可以分为几个详细的阶段 :
总结
- BROM (Boot ROM):系统上电后,
BROM自动执行自己出厂时烧录好的程序。
根据芯片的引脚电平或寄存器设置,确定启动模式。
根据启动模式,选择相应的设备驱动,初始化SD卡设备控制器,设置设备参数(如设置时钟频率,总线宽度,电压等级等)。
从外部存储器(如SD卡、eMMC等)中找到并加载SPL程序到SRAM中。 - U-Boot SPL:
SPL在SRAM中执行,负责初始化最基本的硬件,特别是DDR(LDDR)内存控制器,然后加载U-Boot proper到LDDR中。 - U-Boot Proper:
U-Boot proper在LDDR(外部内存)中执行,进行更深入的硬件初始化、设备检测、操作系统内核加载和启动。 - 操作系统内核启动并运行:
U-Boot完成加载并启动内核后,交出控制权,操作系统开始运行。
1. 设备上电,执行ROM代码 —— 加载U-Boot SPL(Secondary Program Loader)
- 执行位置: BROM (Boot ROM)
- 加载对象的来源:外部存储中的U-Boot SPL(在图中位于外部存储设备的8~40KB的分区)
- 当设备上电后,H616 SOC中的BROM(64KB)开始执行程序。这段代码是SOC出厂时预烧录在内部的,它位于SOC的ROM中,且不可更改。
BROM会根据芯片的引脚电平或寄存器设置,确定启动模式,比如从nand flash,spi flash,sd卡,usb等设备中启动。
BROM会根据启动模式,选择相应的设备驱动,初始化SD卡设备控制器,设置设备参数(如设置时钟频率,总线宽度,电压等级等)。 - BROM的任务非常简单,主要是寻找并加载更高级的引导程序,也就是U-Boot SPL。
BROM会检测外部存储设备(如SD卡、eMMC等),根据预设的引导顺序从存储设备中查找U-Boot SPL并加载其到SOC内部的SRAM中以便执行。(在图中,外部存储设备的8KB~40KB位置的分区是用来存储SPL的)。
- 当设备上电后,H616 SOC中的BROM(64KB)开始执行程序。这段代码是SOC出厂时预烧录在内部的,它位于SOC的ROM中,且不可更改。
2. 执行SPL —— 初始化基本硬件
- 执行位置: SRAM
- 当BROM成功查找并将其加载到SRAM后,SPL在SRAM中开始执行。
- SPL作为一个精简的引导程序,主要任务是负责执行关键的硬件初始化任务,并决定是否加载 U-Boot Proper。
- 初始化基本硬件资源:SPL通常会初始化CPU、PLL(生成时钟频率)、DDR(LDDR)内存控制器和最基础的外设gpio等。这其中包括的DDR(LDDR)内存控制器的初始化,便于系统拥有更多内存用于加载完整的U-Boot程序和操作系统。
- 加载U-Boot Proper:SPL成功完成硬件初始化后,它会决定是否继续加载U-Boot proper(完整版本的U-Boot)。
3. 执行SPL —— 加载 U-Boot Proper
- 执行位置: SRAM
- 加载对象的来源:外部存储中的U-Boot Proper(在图中位于外部存储器40~1024KB的内存位置)
- 在U-Boot SPL初始化完成后,U-Boot SPL就会去加载完整的U-Boot引导程序,这个U-Boot proper存放在外部存储器的另一个分区中(在图中位于存储器40~1024KB的内存位置)。
- U-Boot SPL会将U-Boot proper从外部存储器中读取,将其加载到LDDR(外部内存)中,并将控制权转交给U-Boot Proper。
- U-Boot proper的作用:U-Boot proper是一个功能更完整的引导程序,主要用于引导操作系统。
①它可以进行更多的硬件初始化,如设置网络、启动内核等。
②提供调试接口,它还为用户提供了一个可交互的引导环境,允许配置启动参数。
③加载操作系统内核并将控制权移交给内核。
4. 执行U-Boot Proper —— 进一步初始化硬件、加载操作系统内核
- 执行位置: LDDR(外部内存)
- 加载对象的来源:在图中位于外部存储器"kernel(内核)"的存储分区
- 进一步初始化硬件:在执行过程中,U-Boot proper会进行更深入的硬件检测,确保所有的外设(例如网络、存储、显示等)已正确初始化。此时系统已经有足够的资源来运行更复杂的代码。
- 加载环境变量:U-Boot会加载存储在设备上的环境变量。这些变量可以包括启动参数、设备树配置、内核位置等信息。
- 查找操作系统内核:根据配置,U-Boot会从特定的存储设备或通过网络(如TFTP)查找并加载操作系统内核。例如,从外部存储设备的特定分区(图中“kernel”区域)中查找Linux内核。
- 加载操作系统内核:U-Boot将内核加载到内存(LDDR)中,并根据设备树(device tree)的配置,为操作系统提供硬件布局和状态信息。
5. 启动操作系统内核
- 执行位置: LDDR(外部内存)
- 启动内核:U-Boot完成所有加载工作后,U-Boot会通过“bootm”命令或者“bootz”命令启动操作系统内核。
- 传递参数:在启动内核时,U-Boot将向内核传递启动参数、设备树以及内核命令行选项。
- 控制权转交给内核:最终,U-Boot将控制权移交给操作系统内核,通常是Linux。此时,U-Boot的任务完成,系统转入操作系统的执行流程。
6. 操作系统运行
- 操作系统内核启动后,系统进入正常的操作系统级别运行。U-Boot的作用至此完成。
疑问点

在这个图中,H616 SOC是主芯片(系统级芯片,System on Chip),它包括CPU、SRAM(静态随机存储器)和BROM(Boot ROM)。这个图描述了一个典型的嵌入式系统启动过程,涉及多个组件:
1. LDDR(内存)
- 这个应该是DDR内存的一种,可能是低功耗版的DDR(Low Power DDR),它是外挂的内存(外部的物理内存芯片),用于系统正常运行时的主要存储器。
- 在图中,LDDR连接到H616 SOC,用来加载并执行
uboot proper。
2. 旁边的存储设备(带有mmcbblk1分区的部分)
- 这个部分表示的是一个存储设备,可能是一个eMMC或者SD卡等外部存储器,它通过接口连接到H616 SOC。上面的“mmcbblk1”是Linux下的分区表示方法,表示这个存储设备的第一个分区。
- 这个存储器中包含启动所需的关键组件:
- MBR(主引导记录):这是硬盘的主引导区,负责存储分区表信息和启动代码。
- uboot SPL:这个是U-Boot的第一阶段引导程序(Secondary Program Loader),它是较小的引导程序,通常会放置在SRAM中运行。这个程序负责初始化基本的硬件环境。
- uboot proper:这是U-Boot的完整引导程序,在SPL完成基本初始化后由它接管系统引导流程。它会被加载到外部内存(LDDR)中执行。
- kernel:这是操作系统的内核,SPL和U-Boot proper完成引导后,最终会启动操作系统的内核。
3. 为什么需要这些东西?
- 外部存储器(带有mmcbblk1分区的部分):H616 SOC内部存储有限,因此需要通过外部存储设备来保存更大的引导程序和操作系统镜像。SOC本身的BROM可能只有极小的容量,负责最基础的启动,而后面的SPL、U-Boot和kernel等更大、更复杂的软件都放在外部存储器中。
- LDDR内存:H616的内部SRAM容量很小,无法运行复杂的引导程序或操作系统。因此,复杂的引导程序(如U-Boot proper)和操作系统(kernel)需要加载到LDDR中,以确保足够的空间和性能。
综上所述,LDDR和外部存储设备都是外挂在H616 SOC上的硬件模块,主要是为了弥补H616内部存储和运行空间的不足,确保系统能够引导并运行复杂的操作系统。
相关文章:
【Linux】嵌入式Linux系统的组成、u-boot编译
Linux—嵌入式Linux系统的组成、u-boot编译 前言一、嵌入式Linux系统的组成1.1 嵌入式Linux系统和PC完整的操作系统的对比如下:1.2 PC机—Windows系统启动流程(PC机—Linux系统、嵌入式ARM—linux系统的启动流程类似) 二、编译u-boot2.1 u-bo…...
Qt打开excel文件,并读取指定单元格数据
1. 下载并安装QXlsx库,详见之前的博文Qt子线程创建excel文件报错QObject: Cannot create children for a parent that is in a different thread.-CSDN博客 2. // 创建一个XlsxDocument对象QString filename "D:\\mydocuments\\data_acquisition\\data\\tes…...
适合下班回家做的小副业,用AI做视频,几天时间3000+
大家好,今天要给大家分享的项目是定制儿歌,精准定位宝妈群体,每天轻松赚500! ***01* 项目原理 父母都非常疼爱自己的孩子,愿意为孩子提供独特的东西。而我们正是利用这一点,通过免费AI工具生成专属的儿童…...
git的基本操作 + 分支管理
一、基本操作 1. 修改文件 Git比其他的版本管理器设计得更加优秀,因为Git追踪并管理的是修改,而非文件。 修改一个文件,不管你是添加一行,或者删除一行,还是添加了又删除了,甚至你创建了一个新文件&…...
VRRP
1、VRRP简介 虚拟路由冗余协议 VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时(单点故障…...
个人健康系统|个人健康数据管理系统|基于小程序+java的个人健康数据管理系统设计与实现(源码+数据库+文档)
个人健康数据管理系统 目录 基于小程序java的个人健康数据管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...
R语言统计分析——折线图
参考资料:R语言实战【第2版】 如果将散点图上的点从左到右连接起来,就会得到一个折线图。以基础安装中的Orange数据集为例,展示如下: # 设置绘图参数 opar<-par(no.readonly TRUE) # 画布拆分为1行2列 par(mfrowc(1,2)) # 选…...
前端怎么实现电子签名
电子签名(e-signature)作为一种数字化的签署方式,广泛应用于合同、协议等文件的确认中。随着科技的发展,前端技术也为电子签名的实现提供了便利。本文将探讨在前端如何实现电子签名,包括技术选型、实现步骤及注意事项。…...
数字后端零基础入门系列 | Innovus零基础LAB学习Day1
一 Floorplan 数字IC后端设计如何从零基础快速入门?(内附数字IC后端学习视频) Lab5-1这个lab学习目标很明确——启动Innovus工具并完成设计的导入。 在进入lab之前,我们需要进入我们的FPR工作目录。 其中ic062为个人服务器账户。比如你端…...
鼠标移入盒子,盒子跟随鼠标移动
demo效果: 鼠标移入盒子,按下鼠标,开启移动跟随移动模式,再次按下关闭移动模式 涉及主要属性 在元素上单击鼠标按钮时输出鼠标指针的坐标: var x event.pageX; // 获取水平坐标 var y event.pageY; // 获取垂直坐标元素offsetL…...
css的简单问题
1.display:none;和visibility:hidden;的区别 相同点:都可以让元素不可见 区别: display:none;可以让元素完成在渲染树中消失,渲染时不占任何空间;visibility:hidden;不会让元素从渲染树消失,渲染元素继续占据空间&a…...
使⽤ Override 和 New 关键字进⾏版本控制(C#)
文章目录 1. 基础概念1.1 override1.2 new 2. 示例代码1. override 关键字2. new 关键字 3.完整示例测试3.1 基类和派生类的定义3.2 测试代码3.3 运行结果 结论 在 C# 中,override 和 new 关键字用于控制类之间的成员方法的隐藏和重写。理解它们之间的差异和使用场景…...
JavaScript 15章:模块化编程
在现代软件开发中,模块化编程是一种非常重要的实践,它可以帮助开发者组织代码,提高代码的复用性和可维护性。以下是关于模块化编程的一些关键知识点和实战案例: 第15章:模块化编程 模块的概念 模块是指将一组相关的…...
qt creator 开发环境的安装
1.找官网 官网地址:Installation | Qt Creator Documentation 点 Parent Directory 继续点 Parent Directory 点 archive/ 2.下载在线安装器 点 online_ainstallers 选择在线安装器版本 选择对应版本后进入下载列表,根据自己的系统选择下载。 下载后…...
Xilinx远程固件升级(二)——STARTUPE2原语的使用
通过(一)可以看出,对于远程固件升级实际上是通过调用flash不同区域的bit实现,通过golden image和update image共同保障了系统的稳定性。在项目中如果将flash的时钟直接绑定FPGA后进行约束,在综合编译时是无法通过的。这…...
DynamicExpresso
DynamicExpresso 动态Expression 安装包:DynamicExpresso.Core Student.cs public class Student { public int Age { get; set; } public string Name { get; set; } public void Hello() { Con…...
从Naive RAG到Agentic RAG:基于Milvus构建Agentic RAG
检索增强生成(Retrieval-Augmented Generation, RAG)作为应用大模型落地的方案之一,通过让 LLM 获取上下文最新数据来解决 LLM 的局限性。典型的应用案例是基于公司特定的文档和知识库开发的聊天机器人,为公司内部人员快速检索内部…...
Linux 环境chrony设置服务器间时间同步一致
服务器: master01: slave02: slave03: 安装chrony安装: yum -y install chrony 设置以master01为时间服务器,其他服务器同步master01时间 master01的chrony.conf配置: server ntp1.aliyun.com iburst allow all local stratum 10重启ch…...
MetaCTO确认将放弃QuestPro2及轻量化头显正在开发中
MetaCTO确认将放弃QuestPro2及轻量化头显正在开发中 随着虚拟现实(VR)和增强现实(AR)技术的不断发展,越来越多的公司开始关注这个领域。其中,QuestPro2是一款备受关注的头戴式显示器,由MetaCTO公司开发。然而,最近MetaCTO公司宣布…...
深度学习 .exp()
在 MXNet 中,.exp() 是 ndarray 对象的方法,用于计算数组中每个元素的指数(e 的幂)。此方法适用于所有类型的 ndarray,并返回一个新的数组,其中每个元素都是相应输入元素的指数。 语法 ndarray.exp() 参…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
