3. Linux BSP基础概念

在嵌入式 Linux 开发中,BSP(Board Support Package,板级支持包)是连接通用 Linux 软件栈与具体硬件板卡之间的“适配层”。对于 RK3588 这类 SoC,BSP 并不是单一文件,而是一整套源码、配置、二进制镜像和构建脚本的集合,它决定了这块板子能否正常上电、启动、驱动外设并进入用户空间。

BSP = Bootloader(U-Boot)+ Kernel(Linux 内核)+ Device Tree(设备树)+ Rootfs(根文件系统)+ 板级配置与构建工具。

一、BSP 的定义与组成

从工程视角看,BSP 是“让操作系统跑在特定硬件上”的最小软件集合。它通常包含:

  • U-Boot:负责最早期硬件初始化、加载内核与设备树、传递启动参数。
  • Linux Kernel:负责进程调度、内存管理、驱动框架和硬件驱动。
  • Device Tree:用数据描述硬件资源,使同一内核镜像适配不同板级配置。
  • Rootfs:提供用户空间程序、库、配置和启动脚本。
  • 构建与烧录工具:如 SDK 中的 build.sh、mkimage、烧录工具等。

RK3588 的 BSP 通常由芯片原厂或板卡厂商提供,开发者在此基础上做板级适配、驱动裁剪和功能验证。

二、RK3588 典型启动流程

RK3588 上电后并不是直接运行 Linux,而是经过多级引导。典型流程如下:

  1. BootROM:芯片内部固化代码,根据启动引脚从 eMMC、SD 卡或 SPI Flash 加载一级引导。
  2. TPL/SPL:完成 DDR 初始化等关键硬件准备。
  3. U-Boot:加载内核镜像、设备树和根文件系统,设置 bootargs。
  4. Kernel:解压并启动内核,初始化驱动,挂载 rootfs。
  5. init 进程:执行用户空间初始化,进入登录或应用界面。

下面这张图展示了 RK3588 从 BootROM 到用户空间的信号与镜像加载关系:

RK3588 Linux BSP 启动链路与核心组成 BootROM 芯片内固化引导 TPL / SPL DDR 初始化 U-Boot 加载内核与 DTB Linux Kernel 驱动与调度 Rootfs 用户空间 Device Tree 硬件资源描述 eMMC / SD 镜像存储介质 板级配置 dts / defconfig 关键关系说明 1. U-Boot 从 eMMC/SD 读取 kernel Image 与 DTB,并通过 bootargs 指定 rootfs 位置。 2. Device Tree 由 U-Boot 传递给 Kernel,Kernel 根据它匹配驱动、分配地址与中断。 3. Rootfs 被挂载后,init 进程启动,BSP 的板级服务与应用程序开始运行。 4. 板级配置贯穿 U-Boot、Kernel、DTB 与 Rootfs,是 BSP 适配的核心输入。

三、U-Boot、Kernel、Rootfs、设备树的作用与关系

这四个部分不是孤立存在的,而是通过启动参数和镜像加载关系串联起来。可以用下表快速对比:

组成部分 核心作用 典型文件/配置 与其他部分的关系
U-Boot 硬件初始化、加载内核与 DTB、传递启动参数 u-boot.bin、bootargs、bootcmd 把 Kernel、DTB、Rootfs 串起来
Kernel 驱动硬件、管理资源、提供系统调用 Image、defconfig、驱动模块 依赖 DTB 识别硬件,挂载 Rootfs
Device Tree 描述板级硬件资源与连接关系 rk3588s-xxx.dts、dtb 由 U-Boot 传给 Kernel,Kernel 解析
Rootfs 提供用户空间程序、库、配置与启动脚本 rootfs.img、init、/etc 由 Kernel 挂载,决定系统最终形态

四、案例:一次典型的 BSP 启动日志分析

在 RK3588 开发板上,串口通常会输出类似日志。通过日志可以判断 BSP 各阶段是否正常:

U-Boot 2017.09 (Jan 10 2025 - 10:20:30 +0800)
Model: Rockchip RK3588 EVB
DRAM:  8 GiB
MMC:   sdhci@fe2e0000: 0, sdhci@fe2e0000: 1
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found /extlinux/extlinux.conf
Retrieving file: /extlinux/extlinux.conf
...
Starting kernel ...
[    0.000000] Booting Linux on physical CPU 0x0000000000
[    0.000000] Linux version 5.10.110
[    0.000000] Machine model: Rockchip RK3588 EVB
[    0.000000] earlycon: uart8250 at MMIO32 0x00000000feb50000
[    2.345678] Run /sbin/init as init process

这段日志对应了 U-Boot 加载、内核启动、设备树匹配和 init 启动四个关键节点。如果卡在“Starting kernel ...”之后没有输出,通常要检查 DTB 是否正确、串口配置是否匹配、内核是否使能了对应驱动。

调试 BSP 时,优先确认三件事:U-Boot 能否加载内核、DTB 是否与板子匹配、rootfs 是否能被正确挂载。这三步通了,系统基本就能进入用户空间。

五、常见误区与复盘

  • 误区一:把 BSP 等同于内核。BSP 还包括 U-Boot、DTB、Rootfs 和板级配置,缺一不可。
  • 误区二:忽略设备树。同一内核镜像换一块板子,往往只需要换 DTB,而不是重编内核。
  • 误区三:启动失败只查内核。很多问题出在 U-Boot 的 bootargs、分区表或 rootfs 路径上。
  • 误区四:Rootfs 随便替换。不同 Rootfs 的 init 系统、库版本和内核模块可能不兼容。

复盘时建议按“BootROM → U-Boot → Kernel → DTB → Rootfs → init”的顺序逐级排查,每一级都确认镜像、地址、参数和硬件连接是否一致。理解 BSP 各组成部分的作用与关系,是后续进行 RK3588 板级移植、驱动开发和系统裁剪的基础。