让一块空的开发板运行起 Linux,通常需要经历以下几个关键步骤:
1. 了解硬件信息
首先,你需要确认开发板的核心硬件信息,包括:
- CPU 架构(ARM、x86、RISC-V、MIPS)
- 存储介质(eMMC、NAND、SD 卡、SPI Flash)
- RAM 大小
- UART/USB 调试接口
- 是否支持 U-Boot 作为 Bootloader
- GPIO、I2C、SPI、USB 等外设信息
📌 为什么要确认这些?
这些信息会影响 交叉编译工具链、Bootloader 选择、内核配置、根文件系统适配等。
2. 准备交叉编译工具链
开发板可能基于 ARM、RISC-V 或其他嵌入式架构,所以你需要 交叉编译工具链 以编译 Linux 内核和其他软件。
✅ ARM 平台常用工具链
sudo apt install gcc-arm-linux-gnueabihf # 32-bit ARM
sudo apt install gcc-aarch64-linux-gnu # 64-bit ARM
✅ RISC-V 工具链
sudo apt install gcc-riscv64-linux-gnu
3. 获取 Bootloader(U-Boot)并编译
Bootloader 是开发板启动 Linux 之前的第一步,常见选择是 U-Boot。
步骤
-
下载 U-Boot 源码
git clone https://source.denx.de/u-boot/u-boot.git cd u-boot
-
查找你的开发板是否有现成的 U-Boot 配置
ls configs | grep "你的开发板"
如果没有,你可能需要自己编写 设备树(
dts
)文件。 -
编译 U-Boot
假设开发板使用 ARM 64:make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- <你的开发板配置文件>_defconfig make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
-
烧录 U-Boot 到开发板
- 如果开发板使用 SD 卡 启动:
dd if=u-boot.bin of=/dev/sdX bs=1M seek=1
- 如果是 eMMC/NAND,则需要使用 JTAG 或其他方式烧写。
- 如果开发板使用 SD 卡 启动:
4. 获取并编译 Linux 内核
-
下载 Linux 内核源码
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git cd linux
-
选择开发板适配的默认内核配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
-
编译 Linux 内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
-
将内核 Image 复制到 SD 卡
cp arch/arm64/boot/Image /mnt/sdcard/boot/
5. 制作 Root 文件系统
Linux 需要一个 根文件系统(RootFS),可以使用:
- BusyBox(轻量级,适用于嵌入式设备)
- Ubuntu/Debian 发行版(适用于 SBC 开发板)
- 自定义构建(如 Yocto、Buildroot)
制作 BusyBox 根文件系统
-
下载并编译 BusyBox
git clone git://busybox.net/busybox.git cd busybox make defconfig make install
-
构建 RootFS
mkdir rootfs cp -r _install/* rootfs/
-
创建必要的设备节点
mkdir -p rootfs/{dev,proc,sys,run} sudo mknod -m 622 rootfs/dev/console c 5 1 sudo mknod -m 666 rootfs/dev/null c 1 3
-
打包为 RAM Disk(initrd)
cd rootfs find . | cpio -o --format=newc | gzip > ../rootfs.img
6. 将系统组件烧录到开发板
假设开发板从 SD 卡启动,通常分区如下:
分区 | 内容 |
---|---|
boot | u-boot.bin 、Image (Linux 内核)、dtb (设备树) |
rootfs | rootfs.img (根文件系统) |
烧录 U-Boot
dd if=u-boot.bin of=/dev/sdX bs=1M seek=1
烧录 Linux 内核
cp arch/arm64/boot/Image /mnt/sdX/boot/
cp arch/arm64/boot/dts/<your_board>.dtb /mnt/sdX/boot/
烧录 RootFS
dd if=rootfs.img of=/dev/sdX2 bs=1M
7. 连接开发板并启动
-
使用 UART 串口连接开发板
sudo minicom -D /dev/ttyUSB0 -b 115200
-
启动开发板
- U-Boot 启动后,输入:
bootm 0x80000000 - 0x88000000
- 或者设置 U-Boot 自动引导:
setenv bootcmd "booti 0x80000000 - 0x88000000" saveenv
- U-Boot 启动后,输入:
-
看到 Linux 启动日志,并进入 shell
Welcome to BusyBox # ls
总结
步骤 | 关键任务 |
---|---|
1. 了解硬件 | 获取 CPU 架构、存储方式 |
2. 交叉编译工具链 | 选取正确的 GCC 工具链 |
3. 编译 Bootloader | 下载 U-Boot,编译,烧录 |
4. 编译 Linux 内核 | 下载内核源码,配置,编译 |
5. 制作 RootFS | 选用 BusyBox,创建必要设备节点 |
6. 烧录到存储设备 | 把 Bootloader、内核、RootFS 烧录到 SD/eMMC |
7. 连接串口调试 | 通过 UART 连接,启动 Linux |
下一步?
-
驱动开发:
- 研究
drivers/
目录,编写字符设备驱动 - 适配开发板上的 I2C/SPI/UART 外设
- 研究
-
优化 Linux 内核:
- 了解
menuconfig
选择适合的内核模块 - 研究
Device Tree
适配不同硬件
- 了解
-
添加网络支持:
- 使用
ifconfig
/ip
让开发板联网 - 运行 SSH 服务器或 web 服务器
- 使用
💡 如果你的目标是做 医疗设备的底层驱动,你可以在这个 Linux 系统上开发 传感器、网络通信、医疗数据采集等驱动,然后适配应用层软件,如 Qt、Android 或 Web 界面。 🚀