1. ARM平台与嵌入式Linux概述

本章是整门课程的基石。在动手裁剪和编译Linux内核之前,必须理解ARM架构的演进脉络、不同系列Cortex处理器的定位差异,以及嵌入式Linux系统的三层组成结构。只有掌握了这些背景知识,后续的移植工作才能有的放矢。

1.1 ARM架构发展史

ARM(Advanced RISC Machines)架构自1985年诞生以来,经历了从简单微控制器到高性能应用处理器的完整演进。其核心设计哲学是低功耗、高能效,这使得ARM在移动设备和嵌入式领域占据了统治地位。

架构版本 代表核心 发布时间 关键特性
ARMv4T ARM7TDMI 1995 Thumb 16位指令集、三级流水线
ARMv5TE ARM926EJ-S 2001 DSP指令扩展、Jazelle Java加速
ARMv6 ARM1136J(F)-S 2003 SIMD指令、多核支持雏形
ARMv7-A Cortex-A8/A9/A15 2005 统一架构、NEON、多核、MMU
ARMv8-A Cortex-A53/A72/A76 2011 64位指令集AArch64、大.LITTLE
ARMv9-A Cortex-X2/A710/A510 2021 机密计算、SVE2、AI增强
关键节点:ARMv7-A是嵌入式Linux移植最成熟的版本,大量SoC(如i.MX6、AM335x)基于此架构。ARMv8-A引入的64位支持是当前主流移动设备和服务器平台的基础。
ARM架构演进时间线 ARMv4T ARM7TDMI 1995 ARMv5TE ARM926EJ-S 2001 ARMv7-A Cortex-A8/A9 2005 ARMv8-A 64位 AArch64 2011 ARMv9-A SVE2/CCA 2021 ARMv7-A 是嵌入式 Linux 移植最成熟的架构;ARMv8-A 是当前主流 64 位平台

1.2 Cortex-A/R/M系列区别

ARM Cortex系列根据应用场景分为三个明确的子系列:A系列(应用处理器)、R系列(实时处理器)和M系列(微控制器)。理解它们的差异是选择硬件平台的前提。

特性 Cortex-A Cortex-R Cortex-M
目标应用 Linux/Android、多媒体、服务器 实时控制、汽车、工业 物联网、传感器、简单控制
操作系统 Linux、Windows、QNX RTOS(FreeRTOS、VxWorks) 裸机、RTOS
内存管理 MMU(虚拟内存) MPU(内存保护) 无MMU/MPU(部分有MPU)
中断延迟 中等(~100周期) 极低(~10周期) 极低(~6周期)
流水线深度 8-15级 8-10级 2-3级
典型频率 1-3 GHz 500 MHz - 2 GHz 10-500 MHz
功耗 高(数瓦) 中(数百毫瓦) 极低(微瓦级)
代表核心 Cortex-A53、A72、A76 Cortex-R52、R82 Cortex-M0、M4、M7
选型陷阱:初学者常误以为Cortex-M系列可以运行Linux。实际上,Cortex-M没有MMU,无法支持Linux的虚拟内存机制。只有Cortex-A系列才能完整运行嵌入式Linux。Cortex-R系列虽然性能强劲,但同样缺乏MMU,只能运行RTOS。
Cortex-A/R/M 三系列对比 Cortex-A 应用处理器 ✅ MMU 虚拟内存 ✅ 运行 Linux ✅ 多核缓存 ✅ NEON SIMD 手机 / 服务器 / 工控 Cortex-R 实时处理器 ✅ MPU 内存保护 ❌ 无 MMU ✅ 极低中断延迟 ✅ 硬件锁步 汽车 / 工业 / 基带 Cortex-M 微控制器 ❌ 无 MMU/MPU ❌ 不能运行 Linux ✅ 超低功耗 ✅ 裸机/RTOS IoT / 传感器 / 可穿戴 只有 Cortex-A 系列具备 MMU,是运行嵌入式 Linux 的唯一选择 Cortex-R 用于硬实时场景,Cortex-M 用于低功耗微控制器场景

1.3 嵌入式Linux系统组成

一个完整的嵌入式Linux系统由三个核心组件构成:Bootloader(引导加载程序)、Kernel(内核)和Rootfs(根文件系统)。这三个部分在启动过程中依次加载,缺一不可。

1.3.1 系统启动流程

  1. ROM Bootloader(固化引导):芯片上电后,从片内ROM执行第一级引导代码,初始化基本时钟和存储器控制器。
  2. SPL/MLO(Secondary Program Loader):加载到内部SRAM,初始化DDR内存控制器。
  3. U-Boot(主引导程序):从存储介质(eMMC、SD卡、NAND Flash)加载到DDR,提供命令行交互。
  4. Linux Kernel:U-Boot将内核镜像(zImage/Image)加载到内存,跳转到内核入口。
  5. Rootfs挂载:内核启动后挂载根文件系统,执行init进程(PID 1)。
嵌入式Linux启动流程 ROM Boot 固化引导代码 SPL/MLO 初始化DDR U-Boot 加载内核镜像 Linux Kernel 解压/初始化 Rootfs 挂载/init进程 启动顺序:ROM Boot → SPL → U-Boot → Kernel → Rootfs 每个阶段都依赖前一阶段完成初始化,最终进入用户空间应用程序

1.3.2 各组件详解

组件 功能 常见实现 存储位置 大小范围
Bootloader 硬件初始化、加载内核到内存、传递启动参数 U-Boot、Barebox、ATF SPI Flash、eMMC Boot分区 64 KB - 2 MB
Kernel 进程调度、内存管理、设备驱动、网络协议栈 Linux Mainline、vendor BSP eMMC、SD卡、NAND 2 MB - 10 MB(压缩后)
Rootfs 提供用户空间环境、库文件、应用程序 BusyBox、Buildroot、Yocto eMMC、NFS、initramfs 4 MB - 数百MB
实战要点:在ARM平台移植中,Bootloader通常需要根据具体SoC修改设备树(Device Tree)和内存映射;Kernel需要配置正确的架构选项(ARCH=arm或ARCH=arm64)和板级支持包;Rootfs则通过BusyBox或Buildroot构建最小根文件系统,体积可控制在8MB以内。

1.3.3 设备树(Device Tree)的作用

设备树是ARM平台Linux移植中最重要的概念之一。它用文本文件描述硬件资源,避免了内核中充斥大量板级代码。

// 设备树示例:描述一个UART控制器
/dts-v1/;

/ {
    model = "TI AM335x BeagleBone Black";
    compatible = "ti,am335x-bone-black", "ti,am335x";

    chosen {
        stdout-path = &uart0;
    };

    uart0: serial@44e09000 {
        compatible = "ti,am3352-uart", "ns16550";
        reg = <0x44e09000 0x2000>;
        interrupts = <72>;
        clocks = <&clk_uart0>;
        status = "okay";
    };
};

设备树文件(.dts)通过dtc编译器生成二进制设备树Blob(.dtb),内核在启动时解析.dtb来获取硬件信息。移植工作的核心之一就是编写正确的设备树文件。

1.4 本章小结

  • ARM架构从ARMv4T演进到ARMv9-A,ARMv7-A和ARMv8-A是嵌入式Linux移植的主要目标。
  • Cortex系列中只有A系列具备MMU,能够运行Linux;R系列用于实时场景,M系列用于微控制器。
  • 嵌入式Linux系统由Bootloader → Kernel → Rootfs三层组成,启动过程严格顺序执行。
  • 设备树是ARM平台硬件描述的标准方式,移植工作的核心是编写正确的.dts文件。