嵌入式Linux快速入门系统教程(一):拆解核心概念

立芯嵌入式 2025-07-08 10:00

从路由器到智能音箱,再到工业控制器,Linux的灵活性和低成本处理器的普及让它们成为开发的天堂。更夸张的是,国内目前价格花不到100块就能买到一块能跑Linux的开发板,简直是白菜价

这一系列文章的目标,是带你从零开始,逐步掌握嵌入式Linux的开发精髓。我们会从挑选硬件开始,一路讲到如何从源码编译系统镜像,再深入到定制Linux内核、设计可靠的固件更新机制,甚至打造一块属于自己的Linux开发板。无论你是想搞个DIY项目,还是准备在工作中用嵌入式Linux,这系列内容都会让你上手无压力。不过前提是,你最好有点Linux命令行基础,知道嵌入式系统的基本组成(比如处理器、闪存、外设),以及有足够的时间来折腾和试错。接下来,我们先从高层次的概念入手,理清嵌入式Linux的整体框架,避免一头扎进细节时晕头转向。

嵌入式Linux的本质

如果你玩过单片机,比如STM32或者AVR,可能已经习惯了那种全家桶式芯片:买一块芯片,里面自带闪存、RAM、处理器核心,还有一堆外设,比如UART、SPI,甚至可能有蓝牙或USB接口。写代码时,你直接用厂商的开发工具,代码跑在裸机上,没有操作系统来“添乱”。这些芯片通常还很友好,封装也适合手焊,比如SOIC或者QFP。

MCU VS MPU
MCU VS MPU

但Linux处理器(MPU)就不太一样了。这类处理器通常集成了一大堆外设,种类多到你可能都没听说过,比如MIPI接口、CAN总线之类。但它们通常不带内置RAM,也压根没有存储空间。启动过程也更复杂:处理器内部有个Boot ROM,负责加载你的引导程序(bootloader)。引导程序再加载Linux内核,初始化外设,最后启动用户程序。整个环境跑起来后,跟桌面Linux几乎没区别:一样的API、一样的文件系统、一样的网络协议。你的应用代码几乎可以直接从PC搬到嵌入式设备上跑。

整个系统镜像可以小到只有4MB,但核心点在于:嵌入式Linux的软件组件跟桌面Linux几乎一模一样,Linux内核提供了强大的硬件抽象层,你的任务主要是把引导程序和内核适配到你的硬件上。

嵌入式Linux的组件

嵌入式Linux系统由几大模块组成,每个模块的选择都会深刻影响你的设计。我们来逐一拆解。

从上电到应用程序:完整启动链
从上电到应用程序:完整启动链

处理器

CPU是系统的核心,直接决定性能和功能。便宜的嵌入式Linux设备大多用ARM或MIPS核心,现在ARM几乎一统江湖。不过,RISC-V这匹黑马也值得关注,它是开源指令集架构,虽然还没完全成熟,但已经吸引了不少厂商的目光。

跟单片机类似,处理器厂商会在芯片里塞进各种外设,比如USB、SPI、以太网接口。这些外设通常通过内存映射寄存器控制,厂商还喜欢“偷懒”,直接把旧芯片的外设IP复制到新芯片上,或者多加几个同类型外设来提升性能。

内存

Linux处理器一般不带内置RAM,内存得单独提供。低端设备常用SDRAM,高端点的用DDR、DDR2甚至DDR3,DDR4虽然少见,但迟早会普及。内存控制模块要么由厂商的启动代码初始化,要么由引导程序的第一阶段搞定。

有些模块化开发板(比如树莓派)已经把内存集成好了,省去了你布板的麻烦。但如果你是DIY爱好者,从零开始设计电路板,内存布局可是个大坑。内存信号线对布线要求极高,稍有不慎就会导致系统不稳定。所以在下一篇文章里,我会推荐一些自带内存的处理器,帮你少踩雷。

存储

MPU存储方案存储是用来存放代码和数据的非易失性介质,嵌入式系统里几乎都是闪存。常见的有SD卡、eMMC和原始闪存(raw flash)。SD卡大家都很熟悉,带闪存控制器,操作简单,但可靠性堪忧,树莓派用户估计都吃过SD卡损坏的苦。eMMC是嵌入式版的SD卡,集成了闪存和控制器,但通常用BGA封装,手工焊接基本没戏。

原始闪存分NOR和NAND两种。NOR闪存写速慢、容量小、价格便宜,适合存储引导程序,Boot ROM通常都能直接从SPI接口的NOR闪存读取数据。NAND闪存容量更大、速度更快,但价格稍高,有些还支持专用NAND总线。原始闪存的缺点是操作麻烦:不能随意写入,必须先擦除大块区域,而且写入次数有限(1000到10万次不等)。幸好,Linux的UBI子系统能帮你管理这些问题,让原始闪存用起来更顺手。

软件

启动流程
启动流程

嵌入式Linux的软件包括引导程序、内核和用户空间(userland)。好消息是,Linux内核对大多数外设都有现成的驱动,接口还很统一,不像单片机那样经常要自己写驱动。

引导程序

引导程序是工程师能控制的第一段代码,任务是加载内核并启动它。Linux几乎都用U-Boot这个万能引导程序。它自带简化的存储驱动和少量外设驱动,功能刚好够把内核读进内存并运行。

很多时候,开发板自带的引导程序已经够用,只要按它的规则来就行。但如果你想实现特殊功能,比如自定义启动流程,就得改引导程序。别怕,U-Boot本质上就是个程序,改起来并不神秘。

Boot ROM

Boot ROM是处理器内置的一小段代码,由厂商提供,功能极简,通常只负责 Hospitality。Boot ROM支持的存储介质,比如SPI NOR闪存或SD卡,还能通过USB跟电脑通信。这意味着你可以用USB给全新设备刷固件,堪称防砖神器。不同厂商的叫法不同,比如NXP叫它Download Mode,Allwinner叫它FEL模式。用的时候需要特定的PC端工具,功能因处理器而异。

内核

Linux内核需要针对具体处理器和开发板进行适配。内核源码包含了海量的驱动,但嵌入式系统用到的往往只有一小部分。设备树(device tree)是适配的关键,它就像驱动的配置文件,告诉内核硬件的连接方式。只要设备树写对了,驱动就能自动识别硬件,省去不少麻烦。

用户空间

用户空间的软件跟桌面Linux几乎一样,包括文件系统、初始化系统和shell。文件系统要根据存储介质选择,比如SD卡和eMMC支持ext2/3/4或f2fs,原始闪存则需要JFFS2或UBIFS。我个人喜欢用squashfs加UBI分区,后面会详细讲。

初始化系统负责管理用户空间程序,大型系统可能用systemd,小型系统通常用简单的SysV脚本。shell则是你的交互窗口,通常通过UART串口访问,偶尔也会有显示屏支持。如果能看到shell提示符,说明你的系统已经成功启动!


声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
嵌入式
Copyright © 2025 成都科技区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号