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,而是经过多级引导。典型流程如下:
- BootROM:芯片内部固化代码,根据启动引脚从 eMMC、SD 卡或 SPI Flash 加载一级引导。
- TPL/SPL:完成 DDR 初始化等关键硬件准备。
- U-Boot:加载内核镜像、设备树和根文件系统,设置 bootargs。
- Kernel:解压并启动内核,初始化驱动,挂载 rootfs。
- init 进程:执行用户空间初始化,进入登录或应用界面。
下面这张图展示了 RK3588 从 BootROM 到用户空间的信号与镜像加载关系:
三、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 板级移植、驱动开发和系统裁剪的基础。