1. 课程导学与实验环境搭建

各位同学,欢迎来到这门实战课。我是你们的讲师,一个在嵌入式Linux领域摸爬滚打了十几年的老工程师。今天咱们先不急着敲代码,把整个嵌入式Linux开发的全景图理清楚,再把实验环境搭好。这一步走稳了,后面三十章你才能跑得起来。

1.1 嵌入式Linux开发全景图

嵌入式Linux开发,说白了就是让Linux跑在一个资源受限的硬件上,然后控制各种外设。我见过不少新手,一上来就盯着内核配置菜单看,结果配了三天,板子起不来,连问题出在哪都不知道。为什么会这样?因为脑子里没有全局图。

我习惯把整个开发流程分成四个层次:

层次 核心内容 你最终要交付什么
硬件层 SoC选型、外设接口、内存布局、时钟树 原理图、PCB、硬件手册
引导层 Bootloader(U-Boot)、SPL、ATF 能启动内核的二进制镜像
内核层 内核配置、设备树、驱动框架、中断管理 定制的内核镜像 + 设备树文件
应用层 根文件系统、Busybox、应用进程、调试工具 可运行的完整系统

这门课主要聚焦在内核层,尤其是内核配置和设备树这两块硬骨头。但你要记住,每一层之间都有接口——设备树就是连接硬件描述和内核驱动的桥梁。我在项目中遇到过好几次,硬件工程师说“这个引脚我接了”,内核驱动说“我没读到”,最后发现是设备树里中断号写错了。嗯,这种坑,踩一次就够了。

核心观点:嵌入式Linux开发不是单点技术,而是一条完整的工具链。你配置内核、写设备树,最终是为了让硬件和软件对上话。没有全景图,你就是在黑箱里调参数。

1.2 课程目标与学习方法

这门课的目标很明确:让你能独立完成一个嵌入式Linux项目的内核配置和设备树开发。具体来说,学完之后你应该能做到:

  • 看懂任何一款开发板的原理图,并写出对应的设备树
  • 根据项目需求裁剪内核,去掉不需要的驱动,把镜像控制在合理大小
  • 通过设备树调试手段,快速定位外设不工作的根因
  • 处理常见的故障场景,比如中断冲突、时钟配置错误、引脚复用冲突

学习方法上,我建议你这样做:

  1. 先动手,后看书。 每章我都会给实验,你先照着做一遍,遇到问题再回头看理论。我当年学内核,就是一边编译一边查资料,编译失败了十几次才把第一个内核跑起来。
  2. 准备一个实验笔记本。 不是记笔记,是记错误日志。每次编译报错、启动崩溃,把错误信息和你的解决思路写下来。这东西比任何教材都值钱。
  3. 别怕改代码。 设备树文件就是文本,改错了大不了起不来,又不会烧板子。我曾经把整棵设备树删了一半,然后看内核报什么错,再一行行加回来——这是最笨但最有效的学习方法。

我的建议: 不要试图一次性理解所有内容。嵌入式Linux的知识体系像一棵树,你先抓住主干(内核配置 + 设备树),分支(具体驱动、子系统)后面慢慢长。贪多嚼不烂,这是实话。

1.3 Ubuntu虚拟机与交叉编译链安装

好,理论说完了,咱们开始搭环境。我推荐用Ubuntu 22.04 LTS作为开发主机。为什么?因为LTS版本稳定,社区资源多,你遇到问题搜一下基本都有答案。

安装步骤很简单,我列个清单:

  • 虚拟机软件: VMware Workstation 17 或 VirtualBox 7.x,两者都可以。我个人习惯用VMware,网络配置更顺手。
  • Ubuntu镜像: ubuntu-22.04.3-desktop-amd64.iso,从官网下载。
  • 虚拟机配置: 至少4核CPU、8GB内存、80GB硬盘。别省资源,编译内核很吃内存,我见过有人给2GB,编译到一半直接OOM。

安装完Ubuntu之后,第一件事就是装交叉编译链。我们针对ARM架构开发,所以用gcc-arm-none-eabi或者aarch64-linux-gnu,取决于你的目标平台是32位还是64位。

# 安装ARM 32位交叉编译链
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf

# 安装ARM 64位交叉编译链
sudo apt install gcc-aarch64-linux-gnu

# 验证安装
arm-linux-gnueabihf-gcc --version
aarch64-linux-gnu-gcc --version

装完之后,随便写个hello.c编译一下,确认工具链能用。这一步卡住的人不少,我遇到过最离谱的是PATH没配好,系统调用了宿主机的gcc,编译出来的东西在ARM板上跑不了。嗯,这里要注意:交叉编译链的名字里一定带有目标架构前缀,比如arm-linux-、aarch64-linux-,没有前缀的就是本地编译器。

避坑指南: 我曾经在Ubuntu 20.04上装过某个版本的gcc-arm-none-eabi,结果编译出来的内核在QEMU上跑起来就段错误。折腾了两天,最后发现是工具链版本太老,不支持新的ARMv8指令。所以,工具链版本一定要和内核版本匹配。内核5.x以上,建议用gcc 9.x或更高。

1.4 QEMU模拟器与开发板选择

环境搭好了,接下来是运行环境。你有两个选择:

  • QEMU模拟器: 免费、方便、不怕烧板子。适合前期学习和驱动调试。
  • 真实开发板: 贵、有物理限制,但能验证真实硬件行为。适合项目后期。

我建议你先用QEMU把课程实验跑通,再考虑买板子。QEMU能模拟完整的ARM平台,包括中断控制器、定时器、串口、网卡等。你写的设备树,QEMU能解析;你编译的内核,QEMU能启动。说白了,除了没有真实的GPIO电平,其他都一样。

安装QEMU也很简单:

sudo apt install qemu-system-arm qemu-system-aarch64

# 验证安装
qemu-system-arm --version
qemu-system-aarch64 --version

至于开发板,如果你决定买,我推荐这几款:

开发板 SoC 架构 适合场景
Raspberry Pi 4B BCM2711 ARMv8 64位 通用学习、多媒体、网络
STM32MP157 STM32MP157 ARMv7 32位 工业控制、RTOS+Linux双核
Allwinner V3s V3s ARMv7 32位 低成本、IoT、摄像头

我个人习惯用QEMU模拟的virt平台做课程实验,因为它设备树简单、启动快、调试方便。等讲到具体外设驱动时,再切换到真实板子。这样既省钱又高效。

一句话总结: QEMU是你的实验田,开发板是你的试金石。先用QEMU把知识学扎实,再用开发板验证真实效果。别一上来就买几千块的板子,结果吃灰。

本章知识体系

下面这张图,把第一章的核心脉络画出来了。你对照着看,心里就有数了。

第一章知识体系:嵌入式Linux开发全景与实验环境 第一章 知识体系结构图 嵌入式Linux开发 开发全景图 课程目标与方法 环境搭建 QEMU与开发板 硬件层 引导层 内核层 应用层 看懂原理图 裁剪内核 调试设备树 故障定位 Ubuntu 22.04 交叉编译链 虚拟机配置 QEMU模拟器 Raspberry Pi STM32MP157 Allwinner V3s 核心:先搭环境,再学知识;先跑QEMU,再上真板