结论速览

  • 第一阶段只求启动 Kernel、看到串口 log,重点解决镜像格式、加载地址、DTB、串口、RAM、启动参数。
  • 第二阶段加 initramfs 和静态 BusyBox,看到 / # 就说明整条链路跑通。
  • 第三阶段用 /proc、/sys、/dev 检查基础接口,理解各自暴露的是内核状态、设备驱动模型和设备节点。
  • 第四阶段按 UART、GPIO、SPI、Flash、Ethernet、USB、PCIe 逐个验证硬件,一次只验一个子系统。
  • 第六阶段再过渡到 ext4、SquashFS、UBIFS 等正式 rootfs;Buildroot 可以自动生成整套组件,但建议先手工跑通一次最小系统。

1. 第一阶段:只启动 Kernel

目标:

1
2
3
4
5
U-Boot
↓
Linux Kernel
↓
看到串口 Kernel log

此阶段重点解决:

1
2
3
4
5
6
Kernel 镜像格式
加载地址
DTB
串口
RAM
启动参数

2. 第二阶段:加入 initramfs

准备:

1
2
3
4
5
6
7
rootfs/
├── init
├── bin/
│ └── busybox
├── dev/
├── proc/
└── sys/

BusyBox 推荐静态编译。

/init:

1
2
3
4
5
6
7
#!/bin/busybox sh

/bin/busybox mount -t proc proc /proc
/bin/busybox mount -t sysfs sysfs /sys
/bin/busybox mount -t devtmpfs devtmpfs /dev

/bin/busybox sh

目标:

1
/ #

能看到 shell 提示符,就说明:

1
2
3
4
5
U-Boot
Kernel
initramfs
/init
BusyBox

整条链路已经跑通。

3. 第三阶段:检查 Linux 基础接口

验证:

1
2
3
4
5
cat /proc/cpuinfo
cat /proc/meminfo
dmesg
ls /sys
ls /dev

理解:

1
2
3
/proc → Kernel 状态
/sys → 设备与驱动模型
/dev → 设备节点

4. 第四阶段:逐步验证硬件

建议顺序:

1
2
3
4
5
6
7
UART
GPIO
SPI
Flash
Ethernet
USB
PCIe

一次只验证一个子系统。

5. 第五阶段:跑自己的应用

先写简单程序:

1
2
3
4
5
6
7
8
9
hello world
↓
文件读写
↓
串口访问
↓
socket
↓
HTTP 下载

使用交叉工具链编译,再放入 rootfs。

6. 第六阶段:从 initramfs 过渡到正式 rootfs

之后可以使用:

1
2
3
ext4
SquashFS
UBIFS

例如:

1
2
3
4
5
6
7
Kernel
↓
挂载 Flash / SD
↓
正式 rootfs
↓
/sbin/init

initramfs 也可以作为过渡环境:

1
2
3
4
5
6
7
8
9
Kernel
↓
initramfs
↓
/init
↓
找到正式 rootfs
↓
switch_root

7. Buildroot 的价值

不想手工维护所有组件时,可以使用 Buildroot 自动生成:

1
2
3
4
5
6
Toolchain
Kernel
BusyBox
RootFS
Initramfs
软件包

但建议先手工跑通一次最小系统。

这样以后使用 Buildroot 时,能明确知道它替你自动完成了什么。

8. 最终目标

建立完整认识:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
U-Boot
↓
Kernel
↓
RootFS
↓
PID 1
↓
BusyBox / App
↓
libc
↓
syscall
↓
Kernel
↓
Driver
↓
MT7621 Hardware

做到这一点后,再学习 OpenWrt、Debian、Buildroot,会容易很多。