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 知识体系总览
下面这张图概括了本章的核心脉络,也是咱们整个课程的地图:
1.6 本章小结
咱们这一章,把嵌入式Linux的定义、特点、场景、环境都过了一遍。说白了,嵌入式Linux就是为特定硬件量身定制的Linux系统。你学会了搭交叉编译链和QEMU,后面所有实验都能在PC上完成——不用买开发板也能学。
重要提醒:请务必在本章把环境搭好。我见过太多同学后面章节跑不起来,最后发现是交叉编译链没装对或者QEMU版本不兼容。磨刀不误砍柴工,环境搞定了,后面一路畅通。