【Linux】嵌入式Linux系统的组成、u-boot编译

Linux---嵌入式Linux系统的组成、u-boot编译

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

相关推荐
即将头秃的程序媛20 分钟前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin29 分钟前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧2 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天2 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º3 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。4 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert5 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风6 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子6 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka6 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器