1. 课程导论与开发环境搭建
什么是嵌入式Linux系统?
嵌入式Linux,说白了就是把Linux内核裁剪、移植到资源受限的硬件上,让它专门干一件事。你想想看,家里的路由器、智能电视、车载中控、工业PLC……这些设备里跑的系统,十有八九就是嵌入式Linux。
我刚开始接触这行时,总以为嵌入式系统就是单片机那一套——裸机跑循环、中断伺候。后来第一次拆开一台工业网关,发现里面跑的是Linux 2.6内核,还挂着文件系统、网络协议栈、进程调度……说实话,当时挺震撼的。
嵌入式Linux和桌面Linux最大的区别在于:定制化。桌面Linux装好就能用,但嵌入式Linux需要你从内核配置、驱动编写、根文件系统制作,到应用层框架选型,全部自己动手。没有标准答案,只有最适合你硬件的方案。
为什么选择嵌入式Linux?
这个问题我经常被问到。尤其是做单片机出身的朋友,觉得Linux太重、启动太慢、实时性不够。嗯,这里要分场景看。
我个人习惯把嵌入式系统分成三类:
| 类型 | 典型硬件 | 适合系统 | 我的经验 |
|---|---|---|---|
| 深度嵌入式 | 8位/16位MCU,几十KB内存 | 裸机/RTOS | 做传感器节点时用过,确实没必要上Linux |
| 中等嵌入式 | ARM Cortex-M,几百KB~几MB内存 | FreeRTOS/RT-Thread | 适合控制类、实时性要求高的场景 |
| 复杂嵌入式 | ARM Cortex-A,64MB以上内存 | 嵌入式Linux | 网络、存储、图形界面、多任务——Linux是首选 |
为什么选Linux?三个理由:
- 生态丰富:网络协议栈、文件系统、数据库、图形框架……开源社区已经帮你踩过坑了。我在项目中用过Busybox、Qt、SQLite、OpenSSL,都是现成的。
- 开发效率高:你可以在Ubuntu上写代码、交叉编译、用GDB调试,比裸机仿真器快太多。
- 维护成本低:驱动模型统一、应用层POSIX接口标准,换硬件平台时移植工作量可控。
课程目标与学习路径
这门课的目标很明确:让你能独立从零构建一个可运行的嵌入式Linux系统。不是只跑个Hello World,而是从交叉编译工具链、Bootloader、内核、根文件系统,到应用部署,全链路打通。
整个课程30章,我把它分成四个阶段:
每个阶段我都会穿插实际项目中的案例。比如讲驱动时,我会拿一个I2C温湿度传感器的移植过程来演示——那是我在智能农业项目里踩过的坑。
搭建开发环境
好,理论说完了,咱们动手。开发环境是后面所有实验的基础,我建议你一次配好,后面省心。
1. 安装Ubuntu虚拟机
为什么用虚拟机?因为嵌入式开发需要Linux环境,但大部分人主力机是Windows。虚拟机是最快的方式。我个人习惯用VMware Workstation,但VirtualBox也完全够用。
步骤很简单:
- 下载Ubuntu 22.04 LTS的ISO镜像(别用最新版,LTS最稳)
- 新建虚拟机,分配4GB内存、2个CPU核心、60GB硬盘
- 安装时选「最小安装」,省掉LibreOffice那些用不上的
- 安装完成后,先跑
sudo apt update && sudo apt upgrade -y
2. 配置SSH
配SSH是为了后面用VS Code Remote或者MobaXterm远程连接,操作起来比在虚拟机里直接干活舒服。
# 安装SSH服务
sudo apt install openssh-server -y
# 查看IP地址
ip addr show
# 启动并设置开机自启
sudo systemctl enable ssh
sudo systemctl start ssh
# 测试本机连接
ssh localhost
配好后,你可以在Windows上用VS Code的Remote-SSH插件连接虚拟机。代码在Windows上写,编译在Linux里跑,体验很好。
3. 安装必要工具链
嵌入式开发需要交叉编译工具链。我们先用ARM平台的工具链做实验,后面课程会教你怎么自己编译。
# 安装ARM交叉编译工具链
sudo apt install gcc-arm-linux-gnueabihf -y
# 验证安装
arm-linux-gnueabihf-gcc --version
# 安装其他常用工具
sudo apt install build-essential git vim cmake -y
sudo apt install libncurses5-dev bison flex -y # 内核配置需要
这里多说一句:arm-linux-gnueabihf 中的 hf 代表硬浮点。如果你的目标芯片支持硬件浮点运算(比如Cortex-A系列),一定要用这个版本。软浮点版本性能差很多。
4. 验证环境
写个简单的C程序,交叉编译,看看能不能跑:
// hello.c
#include <stdio.h>
int main() {
printf("Hello, Embedded Linux!\n");
return 0;
}
// 交叉编译
arm-linux-gnueabihf-gcc -o hello hello.c
// 查看文件信息
file hello
// 输出: hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)...
看到 ARM 字样,说明交叉编译成功了。这个程序现在不能在x86的Ubuntu上直接运行,但放到ARM开发板上就能跑。
嗯,到这里开发环境就搭好了。后面每一章我都会假设你已经配好了这个环境。别偷懒,动手配一遍,后面会省很多事。