1. ARM64嵌入式Linux开发环境搭建在开始构建ARM64嵌入式Linux系统之前我们需要准备一个合适的开发环境。我建议使用Ubuntu 20.04 LTS作为开发主机系统因为这个版本有很好的软件包支持和社区资源。首先安装必要的交叉编译工具链sudo apt update sudo apt install gcc-aarch64-linux-gnu build-essential flex bison libssl-dev libncurses-dev这里有个小技巧如果你经常进行嵌入式开发可以创建一个专门的开发用户避免污染系统环境。我在实际项目中就遇到过因为系统环境变量混乱导致的编译问题后来专门创建dev用户就再没出现过这类问题。对于RK3399这类主流ARM64开发板还需要安装一些额外的工具sudo apt install device-tree-compiler u-boot-tools开发环境配置完成后建议进行简单的验证aarch64-linux-gnu-gcc --version如果能看到正确的版本输出说明工具链安装成功。我遇到过因为PATH设置错误导致找不到编译器的情况这时候可以检查~/.bashrc中的环境变量设置。2. Linux内核裁剪与编译实战2.1 获取内核源码建议从kernel.org获取稳定版本的内核源码。以5.15 LTS版本为例wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.6.tar.xz tar -xJf linux-5.15.6.tar.xz cd linux-5.15.62.2 内核配置与裁剪对于RK3399平台可以使用默认配置作为起点make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- defconfig内核裁剪是嵌入式开发的关键环节。我建议使用menuconfig界面进行配置make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- menuconfig几个重要的裁剪原则去掉不需要的驱动模块如不用的网卡、声卡驱动禁用调试信息和不需要的文件系统支持根据实际需求选择内核功能我在一个物联网项目中通过内核裁剪将内核大小从4MB减少到1.8MB显著降低了存储占用。2.3 内核编译与输出使用多线程编译加速过程make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j$(nproc)编译完成后关键输出文件位于arch/arm64/boot/Image - 内核镜像arch/arm64/boot/dts/rockchip/ - 设备树文件3. BusyBox构建最小根文件系统3.1 BusyBox编译与安装获取并解压BusyBox源码wget https://busybox.net/downloads/busybox-1.34.1.tar.bz2 tar -jxf busybox-1.34.1.tar.bz2 cd busybox-1.34.1配置为静态编译make CROSS_COMPILEaarch64-linux-gnu- menuconfig在Settings选项中启用Build static binary。编译并安装make CROSS_COMPILEaarch64-linux-gnu- install3.2 构建根文件系统目录结构创建基本的目录结构cd _install mkdir -p etc/init.d dev proc sys tmp mnt创建必要的系统文件# etc/fstab cat etc/fstab EOF proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 EOF # etc/inittab cat etc/inittab EOF ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::askfirst:-/bin/sh EOF # etc/init.d/rcS cat etc/init.d/rcS EOF #!/bin/sh mount -a echo Welcome to Mini Linux /bin/mount -o remount,rw / mkdir -p /dev/pts mount -t devpts devpts /dev/pts EOF chmod x etc/init.d/rcS创建必要的设备节点cd dev mknod console c 5 1 mknod null c 1 3 mknod tty1 c 4 14. 制作可启动系统镜像4.1 根文件系统镜像制作创建一个32MB的ext3文件系统镜像dd if/dev/zero ofrootfs.ext3 bs1M count32 mkfs.ext3 rootfs.ext3 mkdir fs sudo mount -o loop rootfs.ext3 ./fs sudo cp -rf ./_install/* ./fs sudo umount ./fs4.2 制作启动镜像对于RK3399平台需要准备boot.imgmkdir boot cp arch/arm64/boot/Image boot/ cp arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtb boot/rk3399.dtb cat boot/extlinux/extlinux.conf EOF label rockchip-kernel kernel /Image fdt /rk3399.dtb append earlyconuart8250,mmio32,0xff1a0000 root/dev/mmcblk0p1 rootwait rootfstypeext4 init/sbin/init EOF dd if/dev/zero ofboot.img bs1M count32 mkfs.fat boot.img mkdir tmp sudo mount boot.img tmp/ sudo cp -r boot/* tmp/ sudo umount tmp5. 系统烧录与启动测试5.1 镜像烧录使用RK开发工具烧录镜像sudo rkdeveloptool db rk3399_loader_v1.25.126.bin sudo rkdeveloptool wl 0x8000 boot.img sudo rkdeveloptool wl 0x40000 rootfs.ext3 sudo rkdeveloptool rd5.2 系统调试技巧系统启动后可能会遇到各种问题几个实用的调试方法检查串口输出信息确认内核命令行参数正确验证文件系统挂载情况检查init进程是否正常启动我在第一次尝试时遇到了文件系统挂载失败的问题后来发现是fstab配置错误。通过串口调试终端逐步排查最终解决了问题。对于资源受限的嵌入式设备这个最小系统占用空间不到40MB启动时间在5秒以内完全满足大多数嵌入式应用的需求。后续可以根据实际需求添加必要的应用程序和库文件。