【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机从开机到运行程序的启动过程如下:

  1. 预引导阶段

    • 当我们按下电源按钮时,计算机会进行自检(POST),并执行一些基本的硬件初始化
    • 然后,它会查找EFI分区,并加载EFI分区中的引导文件(通常是\EFI\Boot\bootx64.efi)。
  2. 引导阶段

    • 引导文件(如bootmgfw.efi)会启动Windows的引导管理器(bootmgr)。
    • 引导管理器会显示一个启动菜单,我们可以选择需要启动的操作系统或者让它进入安全模式等。
  3. 载入内核阶段

    • 接着引导管理器会选择适当的内核文件(如ntoskrnl.exe)并加载到内存中
    • 同时,它还会加载一些必要的设备驱动程序和系统服务。
  4. 初始化内核阶段

    • 载入内核阶段完成后,Windows内核会进行自我初始化,包括设置内存管理、输入输出系统、进程管理等。
    • 内核还会创建系统进程(如SYSTEMSMSS),并加载更多的设备驱动程序和系统服务。
  5. 用户登录阶段(加载Windows用户环境和应用程序)

    • 用户登录:内核初始化完成后,会启动Windows的登录管理器(winlogon),登录管理器会显示出登录界面,用户在登录界面输入用户名和密码,系统验证用户的身份。
    • 创建用户会话:如果用户身份验证成功,Windows系统会为该用户创建一个新的用户会话。这个过程包括加载用户的配置文件、设置用户的环境变量等。
    • 启动Windows的外壳程序(explorer),加载Windows用户环境:用户会话创建完成后,系统会自动启动 explorer 进程。explorer进程负责加载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的启动过程可以分为几个详细的阶段 :

总结

  1. BROM (Boot ROM):系统上电后,BROM自动执行自己出厂时烧录好的程序。
    根据芯片的引脚电平或寄存器设置,确定启动模式。
    根据启动模式,选择相应的设备驱动,初始化SD卡设备控制器,设置设备参数(如设置时钟频率,总线宽度,电压等级等)。
    从外部存储器(如SD卡、eMMC等)中找到并加载SPL程序到SRAM中。
  2. U-Boot SPLSPLSRAM中执行,负责初始化最基本的硬件,特别是DDR(LDDR)内存控制器,然后加载U-Boot properLDDR中。
  3. U-Boot ProperU-Boot properLDDR(外部内存)中执行,进行更深入的硬件初始化、设备检测、操作系统内核加载和启动。
  4. 操作系统内核启动并运行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的)。

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内部存储和运行空间的不足,确保系统能够引导并运行复杂的操作系统。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【动手学电机驱动】 TI InstaSPIN-FOC(2)Lab01 闪灯实验

【动手学电机驱动】 TI InstaSPIN-FOC(2)Lab01 闪灯实验 1. 硬件连接与设置2. Lab01:闪灯实验2.1 项目简介2.2 导入项目2.3 调试和运行 3. 修改程序:改变闪灯频率4. 程序解读4.1 软件流程图4.2 包含文件、变量和函数声明4.3 中断服…

Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录

问题出现情况 邮件发送时debug用F8逐步运行可以成功发送邮件,但是用F9或者直接运行程序却发送失败未开启mail的debug模式的报错日志是下面这个:org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is java…

Chainbase :链原生的 Web3 AI 基建设施

“随着 Chainbase 在生态系统和市场方面的进一步拓展,其作为链原生 Web3 AI 基建设施的价值将愈发显著。” 算法、算力和数据是 AI 技术的三大核心要素。实际上,几乎所有的 AI 大模型都在不断革新算法,以确保模型能够跟上行业的发展趋势&…

CUDA Graphs学习与实验

CUDA Graphs学习与实验 一.参考链接二.测试方案三.测试代码 CUDA图(CUDA Graphs)为CUDA引入了一种全新的工作提交模型。它允许将一系列操作(如内核启动)以图的形式表示,并通过依赖关系将这些操作连接起来。这种图的定义…

C语言—双链表

一、双向链表的结构 注意:这⾥的“带头”跟前⾯我们说的“头节点”是两个概念,实际前⾯在单链表阶段称呼不严谨,带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨的”…

【C++】C++的引用

一.引用 1.引用的概念和定义 引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。 类型& 引用别名 引用对象; 2.引用的特征 a.引用在定义时必须初始化 …

Visual Studio--VS安装配置使用教程

Visual Studio Visual Studio 是一款功能强大的开发人员工具,可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好,使用方便,不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…

详解前端开发都需要掌握的十个 JavaScript 基本数组函数

假设你正在开发一个复杂的 Web 项目。你的数据来自许多 API,你的工作是高效地处理、过滤和分析这些数据。你的时间很紧张,所以每一行代码都很重要。 这时学习高级 JavaScript 数组方法就会对你有所帮助。 这些函数不仅可以减少代码量,还可以…

阻塞socket 和非阻塞socket的区别(浅显易懂版)

什么是阻塞socket,什么是非阻塞socket。 对于这个问题,我们要先弄清什么是阻塞/非阻塞。 阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式。 阻塞的意思是指,当试图对该文件描述符进行读写时,如果当时没有东西可…

基于Feign的远程调用

目录 前言 RestTemplate方式调用存在的问题 存在的问题 Feign Feign介绍 Feign的使用步骤 引入依赖 添加注解 编写Feign客户端 使用客户端(修改orderService) 原代码 修改后 总结 前言 RestTemplate方式调用存在的问题 以前利用RestTempla…

【Unity 100个实用小技巧】 UI分辨率适配

UI分辨率适配 学习实际项目中,分辨率适配的方案,基础版本。 以下适配以720*1680为基准适配 具体操作 Canvas Scaler的Screen Match Model 设置为Match Width Or Height,Match设置为0 这个设置,是以宽为基准进行分辨率适配 其实在…

uniapp__微信小程序使用秋云ucharts折线图双轴

1、子组件 <template><view class"charts-box"><qiun-data-charts type"line":opts"computedOpts":chartData"chartData"/></view> </template><script> export default {props: {chartData: {t…

【优选算法】(第三十五篇)

目录 验证栈序列&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 N叉树的层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 验证栈序列&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;L…

只需5步,就可以使用大语言模型(LLM)打造高效的应用

01 概述 随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLM&#xff09;正逐渐成为各个领域的得力助手。从最初的文本理解、生成到翻译&#xff0c;这些模型在自然语言处理&#xff08;NLP&#xff09;中的出色表现&#xff0c;让它们在聊天机器人、虚拟助…

98. UE5 GAS RPG 实现技能眩晕效果

我们在技能伤害基类上面设置了对应的负面效果应用的配置项&#xff0c;用来实现技能的负面效果应用。 在之前实现火球术的负面效果时&#xff0c;我们我们在创建火球时&#xff0c;通过伤害基类上的创建技能配置用于后续应用。 在火球攻击到敌人时&#xff0c;通过函数库书写…

68 Netty

68 Netty 参考资料 【硬核】肝了一月的Netty知识点 概念 Netty 是一个高性能、异步事件驱动的网络应用框架&#xff0c;简化了 Java 网络编程&#xff0c;适用于构建高效、可扩展的网络服务器和客户端。 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架&#xff0c;使…

Premiere半色调动漫风格视频叠加特效素材MOGRT

Premiere Pro 半色调叠加素材视频模板&#xff0c;使用这个半色调效果轻松设置视频或图像的样式。可以使用自定义选项&#xff0c;让工作流程更加高效。 特征&#xff1a; 15个半色调叠加效果。 Adobe Premiere Pro 2023 4K分辨率&#xff08;38402160&#xff09;。 包括视频…

回溯法与迭代法详解:如何从手机数字键盘生成字母组合

在这篇文章中&#xff0c;我们将详细介绍如何基于手机数字键盘的映射&#xff0c;给定一个仅包含数字 2-9 的字符串&#xff0c;输出它能够表示的所有字母组合。这是一个经典的回溯算法问题&#xff0c;适合初学者理解和掌握。 问题描述 给定一个数字字符串&#xff0c;比如 …

TikTok流量不好是为什么?是网络没选对吗?

很多人发现他们的TikTok视频观看量不高&#xff0c;点赞和分享率也低&#xff0c;就会开始怀疑是不是网络选择不当导致了这一问题。虽然网络确实是导致流量不佳的一大原因之一&#xff0c;但也不能忽视其他因素&#xff0c;包括内容质量、时机选择、互动参与等方面。本文将揭示…

桌面运维转网络要做什么准备,高级网工学习路线分享_运维转网络工程师好转岗吗

如果你的船不进来&#xff0c;请游过去。 做过桌面运维的朋友都知道&#xff0c;这个岗位相当于做牛做马。我做桌面运维的时候要修监控门禁&#xff0c;消防报警广播音响&#xff0c;还要懂暖通空调下水管道疏通&#xff0c;电梯保养与维护&#xff0c;我听到有些同行还得会修桌…