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位支持是当前主流移动设备和服务器平台的基础。
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。
1.3 嵌入式Linux系统组成
一个完整的嵌入式Linux系统由三个核心组件构成:Bootloader(引导加载程序)、Kernel(内核)和Rootfs(根文件系统)。这三个部分在启动过程中依次加载,缺一不可。
1.3.1 系统启动流程
- ROM Bootloader(固化引导):芯片上电后,从片内ROM执行第一级引导代码,初始化基本时钟和存储器控制器。
- SPL/MLO(Secondary Program Loader):加载到内部SRAM,初始化DDR内存控制器。
- U-Boot(主引导程序):从存储介质(eMMC、SD卡、NAND Flash)加载到DDR,提供命令行交互。
- Linux Kernel:U-Boot将内核镜像(zImage/Image)加载到内存,跳转到内核入口。
- Rootfs挂载:内核启动后挂载根文件系统,执行init进程(PID 1)。
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文件。