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。别犹豫。

课程目标与学习路径

这门课的目标很明确:让你能独立从零构建一个可运行的嵌入式Linux系统。不是只跑个Hello World,而是从交叉编译工具链、Bootloader、内核、根文件系统,到应用部署,全链路打通。

整个课程30章,我把它分成四个阶段:

课程知识体系 阶段一:基础与环境 第1-5章 | 开发环境、Linux基础、Shell脚本 阶段二:构建核心 第6-15章 | 交叉编译、Bootloader、内核、根文件系统 阶段三:驱动与调试 第16-23章 | 驱动模型、设备树、调试技巧 阶段四:应用与优化 第24-30章 | 应用部署、性能优化、生产环境 学习建议 • 每章都动手做一遍,光看是学不会的 • 遇到问题先查日志,再查社区,最后问人 • 准备好一块开发板(推荐QEMU模拟器起步,再上真板)

每个阶段我都会穿插实际项目中的案例。比如讲驱动时,我会拿一个I2C温湿度传感器的移植过程来演示——那是我在智能农业项目里踩过的坑。

搭建开发环境

好,理论说完了,咱们动手。开发环境是后面所有实验的基础,我建议你一次配好,后面省心。

1. 安装Ubuntu虚拟机

为什么用虚拟机?因为嵌入式开发需要Linux环境,但大部分人主力机是Windows。虚拟机是最快的方式。我个人习惯用VMware Workstation,但VirtualBox也完全够用。

步骤很简单:

  1. 下载Ubuntu 22.04 LTS的ISO镜像(别用最新版,LTS最稳)
  2. 新建虚拟机,分配4GB内存、2个CPU核心、60GB硬盘
  3. 安装时选「最小安装」,省掉LibreOffice那些用不上的
  4. 安装完成后,先跑 sudo apt update && sudo apt upgrade -y
注意: 硬盘别用动态分配,直接固定60GB。动态分配在频繁读写时性能很差,我吃过这个亏——编译内核时虚拟机卡死,最后发现是磁盘扩展导致的IO瓶颈。

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系列),一定要用这个版本。软浮点版本性能差很多。

避坑指南: 我曾经在项目里用错了工具链——目标板是Cortex-A7,我用了arm-linux-gnueabi(软浮点),结果程序跑起来CPU占用率飙到90%,浮点运算全靠软件模拟。换了硬浮点版本后,直接降到15%。所以,选工具链时一定要确认目标CPU的浮点特性。

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开发板上就能跑。

嗯,到这里开发环境就搭好了。后面每一章我都会假设你已经配好了这个环境。别偷懒,动手配一遍,后面会省很多事。