3. Linux BSP基础概念
在嵌入式 Linux 开发中,BSP(Board Support Package,板级支持包)是连接通用操作系统与具体硬件板卡之间的“适配层”。对于全志 T113 这类 ARM Cortex-A7 双核平台,BSP 并不是单一文件,而是一整套源码、配置、脚本和文档的集合,它让 Linux 内核、U-Boot 和根文件系统能够在特定电路板上正确启动并驱动外设。理解 BSP 的定义、启动流程以及 U-Boot/Kernel/Rootfs 三者关系,是进行后续驱动移植和系统裁剪的前提。
一、BSP 的定义与组成
从工程角度看,BSP 是“让操作系统跑在指定硬件上”的最小充分集合。它通常包含以下内容:
- 引导加载程序:如 U-Boot,负责初始化 DDR、时钟、串口,并加载内核。
- Linux 内核源码及板级配置:包括设备树(.dts/.dtsi)、defconfig、驱动补丁。
- 根文件系统:BusyBox、systemd 或 Buildroot 构建的 rootfs 镜像。
- 构建工具与脚本:交叉编译工具链、打包脚本、烧录工具配置。
- 硬件描述文档:原理图、引脚复用表、电源时序说明。
全志 T113 的 BSP 通常以 SDK 形式发布,目录结构清晰,便于按需裁剪。下面这张图展示了 BSP 在系统中的位置以及 U-Boot、Kernel、Rootfs 三者的加载关系。
二、启动流程:从上电到用户空间
T113 的启动流程可以概括为“四级跳”:BootROM → SPL → U-Boot → Kernel → Rootfs。上电后,芯片内部固化的 BootROM 根据引脚或 eFuse 选择启动介质(如 eMMC、SD 卡、SPI Flash),加载 SPL(Secondary Program Loader)。SPL 体积很小,主要完成 DDR 初始化和时钟配置,随后加载完整的 U-Boot 到 DDR 中运行。
U-Boot 阶段会读取环境变量,准备内核镜像(Image 或 zImage)和设备树(.dtb),并通过 bootargs 向内核传递启动参数,例如:
setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait'
fatload mmc 0:1 0x40000000 zImage
fatload mmc 0:1 0x41800000 sun8iw20p1.dtb
bootz 0x40000000 - 0x41800000
内核启动后,会解析设备树,匹配并初始化各外设驱动,最后尝试挂载 rootfs。挂载成功后执行 /sbin/init,进入用户空间,系统启动完成。
三、U-Boot、Kernel、Rootfs 的关系
三者是“接力”关系,而非并列关系。U-Boot 是搬运工和参数传递者;Kernel 是硬件管理者和抽象层;Rootfs 是用户程序和服务的载体。它们之间的接口主要是:
| 阶段 | 核心职责 | 关键产物 | 与下一阶段接口 |
|---|---|---|---|
| U-Boot | 硬件初始化、加载内核 | u-boot-sunxi-with-spl.bin | bootargs、内核地址、DTB 地址 |
| Kernel | 驱动初始化、内存管理、进程调度 | zImage、sun8iw20p1.dtb | root= 参数、init 路径 |
| Rootfs | 提供用户空间、库、应用 | rootfs.tar.gz / .img | 通过 /dev、/proc 与内核交互 |
四、全志 BSP 目录结构
全志 T113 SDK 的目录结构通常如下,理解它有助于快速定位修改点:
t113-sdk/
├── brandy/ # U-Boot 源码(全志定制)
│ ├── u-boot-2018.05/
│ └── spl/
├── kernel/ # Linux 内核源码
│ ├── linux-5.4/
│ └── linux-5.4/arch/arm/boot/dts/
├── buildroot/ # 根文件系统构建
├── device/ # 板级配置
│ └── config/
│ └── t113-xxx/
├── out/ # 编译输出
├── tools/ # 打包与烧录工具
└── build.sh # 顶层编译脚本
其中 device/config/ 下存放板级差异配置,如 sys_config.fex、board.dts、分区表等;brandy/ 对应 U-Boot;kernel/ 对应内核;buildroot/ 对应 rootfs。编译时通常执行 ./build.sh 并选择配置,脚本会自动完成三者的构建与打包。
五、常见误区与复盘
误区二:修改了设备树却忘记重新编译 DTB,导致内核仍使用旧硬件描述。
误区三:U-Boot 的 bootargs 中 root= 指向错误分区,内核找不到 rootfs 而 panic。
误区四:把 rootfs 当成“可有可无”的部分,实际上没有 rootfs 内核无法进入用户空间。
复盘时建议按“上电→BootROM→SPL→U-Boot→Kernel→Rootfs→应用”的顺序逐级排查,先确认串口有输出,再确认内核是否解压成功,最后确认 rootfs 挂载和 init 是否执行。掌握这条链路,后续的驱动移植和系统裁剪就会事半功倍。