第一章:嵌入式Linux环境搭建

做安防系统OTA升级,第一步就是搭环境。

很多人一上来就急着写代码,结果编译都过不了。我刚开始做嵌入式时也犯过这毛病——拿着开发板就想跑系统,折腾三天发现连个hello world都跑不起来。说白了,环境没搭好,后面全是坑。

1.1 交叉编译工具链

什么是交叉编译?简单说,你在PC上写代码,编译出来的程序要在ARM板子上跑。PC是x86架构,板子是ARM架构,这俩指令集不一样。所以你需要一个特殊的编译器——交叉编译工具链。

我个人习惯用Linaro提供的工具链,稳定且社区活跃。当然你也可以自己用crosstool-NG去构建,但说实话,没必要重复造轮子。

工具链选择建议:

  • ARM Cortex-A系列:arm-linux-gnueabihf-
  • ARM Cortex-M系列:arm-none-eabi-
  • AArch64(64位):aarch64-linux-gnu-

安装其实很简单。下载后解压,配置环境变量就行。

# 下载工具链(以gcc-10.3为例)
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

小技巧:把环境变量写到~/.bashrc里,这样每次打开终端就不用重新export了。我当年就是忘了这步,每次编译前都要手动敲一遍,烦得很。

验证是否安装成功,跑一下这个命令:

arm-linux-gnueabihf-gcc --version

如果能看到版本信息,说明工具链已经就绪。

1.2 根文件系统制作

根文件系统,说白了就是Linux启动后挂载的第一个文件系统。它包含了系统运行所需的所有库、工具和配置文件。

制作根文件系统,我推荐用Buildroot。为什么?因为它自动化程度高,配置灵活,而且社区资源丰富。我在项目中遇到过客户要求定制化根文件系统,Buildroot改起来非常方便。

基本流程如下:

  1. 下载Buildroot源码
  2. 配置目标平台和软件包
  3. 编译生成根文件系统镜像
# 下载Buildroot
git clone https://git.buildroot.net/buildroot
cd buildroot

# 配置(以树莓派3为例)
make raspberrypi3_defconfig

# 进入菜单配置界面
make menuconfig

在menuconfig里,你需要关注几个关键选项:

配置项 说明 建议值
Target options 目标架构和CPU ARM (little endian)
Toolchain 选择外部工具链或Buildroot内置 External toolchain(用我们刚才装的)
System configuration 主机名、密码、启动脚本等 按需配置
Target packages 需要安装的软件包 选ssh、网络工具等

注意:根文件系统的大小要控制好。安防设备通常存储空间有限,别一股脑把所有包都选上。我曾经见过有人把整个桌面环境都编译进去,结果flash根本装不下。

配置完成后,执行编译:

make

编译时间取决于你的机器性能和选择的软件包数量。第一次编译可能需要半小时到一小时。编译完成后,在output/images目录下会生成rootfs.tar、rootfs.ext2等文件。

1.3 Bootloader配置

Bootloader是系统上电后第一个运行的程序。它负责初始化硬件、加载内核和根文件系统。安防系统常用的Bootloader是U-Boot。

U-Boot的配置和编译,我个人习惯分三步走:

  1. 获取源码并选择默认配置
  2. 根据硬件修改设备树和配置
  3. 编译生成u-boot.bin
# 下载U-Boot
git clone https://github.com/u-boot/u-boot.git
cd u-boot

# 选择目标板配置(以imx6ull为例)
make mx6ull_14x14_evk_defconfig

# 进入配置界面
make menuconfig

在U-Boot的menuconfig里,有几个关键配置:

  • Boot media:从SD卡、NAND Flash还是eMMC启动
  • Network support:是否支持网络启动(TFTP/NFS)
  • Environment:环境变量存储位置

编译命令:

make

编译完成后,会生成u-boot.bin、u-boot.imx等文件。具体烧录方式取决于你的硬件平台。

避坑指南:我曾经在调试一块安防主板时,U-Boot死活起不来。查了两天才发现是设备树里GPIO复用配置错了。所以,拿到开发板后第一件事——确认硬件原理图和设备树是否匹配。

1.4 环境验证

环境搭好了,怎么验证?写个简单的测试程序:

// test.c
#include <stdio.h>

int main() {
    printf("Hello, OTA Security!\n");
    return 0;
}

用交叉编译器编译:

arm-linux-gnueabihf-gcc -o test test.c

查看生成的文件信息:

file test
# 输出应该类似:test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)

如果显示ARM架构,说明交叉编译环境没问题。

然后把test文件拷贝到开发板上运行。能正常打印"Hello, OTA Security!",就说明根文件系统和Bootloader都配置正确了。

嗯,到这里,嵌入式Linux环境就搭好了。下一章我们开始讲OTA升级的核心——安全启动链。那才是真正有意思的部分。