ARM Cortex-A9 嵌入式 Linux 内核裁剪与根文件系统构建

一、内核裁剪流程
  1. 源码获取与配置

    • 下载 Linux 内核源码(推荐 LTS 版本)
    • 基础配置:
      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig  # 以 ARM vexpress 为例
      

  2. 交互式裁剪

    • 启动配置界面:
      make ARCH=arm menuconfig
      

    • 关键裁剪区域:
      • Processor Type:启用 ARM Cortex-A9 支持
      • Device Drivers:仅保留目标硬件所需驱动(如 UART、GPIO)
      • File Systems:移除无关文件系统(如 NTFS、HFS)
      • Networking:按需禁用无线/WAN 协议
      • Kernel Features:关闭 CONFIG_DEBUG_KERNEL 等调试选项
  3. 编译优化

    • Makefile 添加:
      KBUILD_CFLAGS += -Os -fno-unwind-tables  # 尺寸优化
      

    • 编译命令:
      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4
      

    • 输出文件:arch/arm/boot/zImage(约 1-3MB)
二、根文件系统构建
  1. 目录结构创建

    mkdir rootfs && cd rootfs
    mkdir -p bin dev etc lib proc sbin sys tmp usr var
    

  2. BusyBox 集成

    • 编译配置:
      make menuconfig  # 选择静态链接(Settings → Build static binary)
      

    • 安装到根目录:
      make CONFIG_PREFIX=../rootfs install
      

  3. 关键文件配置

    • /etc/inittab(基础初始化):
      ::sysinit:/etc/init.d/rcS
      ::respawn:/bin/sh
      

    • /etc/fstab(挂载点):
      proc  /proc  proc  defaults  0  0
      sysfs /sys   sysfs defaults  0  0
      

  4. C 库精简

    • 使用 arm-linux-gnueabihf-strip 裁剪动态库:
      arm-linux-gnueabihf-strip rootfs/lib/*.so
      

三、系统集成与验证
  1. 生成镜像

    • 使用 Buildroot 或 Yocto 构建完整镜像
    • 手动制作 JFFS2 镜像:
      mkfs.jffs2 -d rootfs -o rootfs.jffs2
      

  2. QEMU 测试

    qemu-system-arm -M vexpress-a9 -kernel zImage \
    -drive file=rootfs.jffs2,if=sd -append "root=/dev/mmcblk0"
    

  3. 性能指标

    优化项 裁剪前 裁剪后
    内核大小 15-20MB 1-3MB
    根文件系统大小 100+MB 8-15MB
    冷启动时间 5-8s 1-2s
四、注意事项
  1. 硬件适配

    • 确认目标板设备树(DTS)包含 Cortex-A9 特性:
      cpu@0 {
          compatible = "arm,cortex-a9";
          reg = <0>;
      };
      

  2. 裁剪边界

    • 保留必须模块:CONFIG_MMU, CONFIG_ARM_THUMB
    • 避免过度裁剪导致系统调用失效
  3. 安全加固

    • 启用 CONFIG_CC_STACKPROTECTOR
    • 禁用未使用的网络端口

实践建议:优先使用 Buildroot 自动化构建,再逐步手动优化。最终系统应满足:$$ \text{启动时间} \leq 2\text{s} \quad \text{且} \quad \text{存储占用} \leq 16\text{MB} $$ 可通过 CONFIG_PRINTK_TIME 验证启动时序。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐