1. 嵌入式Linux概述:从定义到动手

各位同学,咱们今天正式开课。先聊聊嵌入式Linux到底是什么,以及为什么值得你花时间学它。

1.1 嵌入式系统定义

嵌入式系统,说白了就是专用于特定任务的计算机系统。它不像你的PC能打游戏、写文档、剪视频啥都干,而是被“嵌入”到某个设备里,只干一件事——比如你的路由器转发数据包,智能手环计步,汽车ECU控制喷油。

我入行那会儿,嵌入式系统还主要是8位单片机的天下。现在呢?性能要求越来越高,Linux就顺势成了主流选择。

对比项 通用计算机 嵌入式系统
任务 多任务通用 单一专用
资源 充裕(大内存、大存储) 受限(KB~MB级)
功耗 不敏感 严格限制
实时性 软实时 硬实时或软实时
成本 较高 极度敏感

1.2 嵌入式Linux特点

为什么选Linux?我总结几个核心原因:

  • 开源免费:不用交授权费,代码随便改。我在项目里就经常裁剪内核,去掉不需要的驱动,把镜像压到2MB以内。
  • 生态丰富:网络协议栈、文件系统、图形界面,要啥有啥。你想想看,如果从头写一个TCP/IP协议栈,得花多少时间?
  • 稳定可靠:Linux内核在服务器上跑了二十多年,稳定性经过验证。工业设备一跑就是几年不重启,Linux扛得住。
  • 可裁剪:从路由器到航天器,Linux都能适配。内核配置就是干这个的——咱们后面几章会重点讲。

核心观点:嵌入式Linux不是把桌面Linux直接塞进小设备,而是按需定制。你只需要保留硬件必需的驱动和功能,其他统统砍掉。

1.3 典型应用场景

我这些年接触过的项目,基本覆盖了嵌入式Linux的主要战场:

  • 网络设备:路由器、交换机、防火墙。OpenWrt就是基于Linux的典型。
  • 消费电子:智能电视、机顶盒、游戏机。Android底层也是Linux。
  • 工业控制:PLC、数据采集终端、工业网关。实时性要求高的会打RT-Preempt补丁。
  • 汽车电子:信息娱乐系统、ADAS。AUTOSAR Adaptive Platform也跑在Linux上。
  • 物联网:智能家居网关、边缘计算节点。资源受限但需要网络能力。

嗯,这里要注意:不是所有场景都适合Linux。如果你的设备只有64KB Flash、4KB RAM,那还是老老实实用RTOS或裸机吧。

1.4 开发环境搭建

动手之前,先把工具准备好。咱们这章只搭环境,不写代码。

1.4.1 交叉编译链

交叉编译,就是在PC上编译出能在ARM/MIPS/RISC-V等目标板上运行的代码。为什么不能直接在板子上编译?你想想看,开发板通常只有256MB内存,跑个GCC编译大型项目,得等到猴年马月。

我个人习惯用Linaro GCC,稳定且更新及时。以ARM Cortex-A系列为例:

# 下载ARM交叉编译链(以gcc-arm-9.2-2019.12为例)
wget https://releases.linaro.org/components/toolchain/binaries/9.2-2019.12/arm-linux-gnueabihf/gcc-arm-9.2-2019.12-x86_64-arm-linux-gnueabihf.tar.xz

# 解压到/opt目录
sudo tar -xvf gcc-arm-9.2-2019.12-x86_64-arm-linux-gnueabihf.tar.xz -C /opt

# 添加环境变量
export PATH=/opt/gcc-arm-9.2-2019.12-x86_64-arm-linux-gnueabihf/bin:$PATH

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

避坑指南:我曾经在Ubuntu 18.04上装过某个老版本GCC,结果编译出来的程序在板子上段错误。后来发现是glibc版本不匹配。建议用Linaro官方推荐的版本,别自己瞎折腾。

1.4.2 QEMU模拟器

没有开发板怎么办?QEMU可以模拟一个完整的ARM/MIPS/RISC-V系统。我在项目早期验证内核配置时,经常先用QEMU跑一遍,确认没问题再烧到真板上。

安装QEMU:

# Ubuntu/Debian
sudo apt-get install qemu-system-arm

# 验证
qemu-system-arm --version

咱们后面会用QEMU模拟vexpress-a9开发板,这是ARM Cortex-A9的典型平台。先记住这个命令:

qemu-system-arm \
  -M vexpress-a9 \
  -m 256M \
  -kernel zImage \
  -dtb vexpress-v2p-ca9.dtb \
  -append "console=ttyAMA0 root=/dev/mmcblk0" \
  -sd rootfs.ext3 \
  -nographic

参数说明:-M指定机器类型,-m分配内存,-kernel指定内核镜像,-dtb设备树,-append内核启动参数,-sd挂载SD卡镜像(根文件系统),-nographic用终端模拟串口。

1.5 知识体系总览

下面这张图概括了本章的核心脉络,也是咱们整个课程的地图:

嵌入式Linux知识体系 嵌入式Linux 嵌入式系统定义 嵌入式Linux特点 典型应用场景 开发环境搭建 交叉编译链 QEMU模拟器 后续章节:内核配置 → 设备树 → 驱动开发 → 根文件系统 → 系统集成 每章都会基于本章搭建的环境进行实战

1.6 本章小结

咱们这一章,把嵌入式Linux的定义、特点、场景、环境都过了一遍。说白了,嵌入式Linux就是为特定硬件量身定制的Linux系统。你学会了搭交叉编译链和QEMU,后面所有实验都能在PC上完成——不用买开发板也能学。

重要提醒:请务必在本章把环境搭好。我见过太多同学后面章节跑不起来,最后发现是交叉编译链没装对或者QEMU版本不兼容。磨刀不误砍柴工,环境搞定了,后面一路畅通。