图书简介:
第1章 Yocto项目 1
1.1 嵌入式Linux系统 1
1.1.1 什么是嵌入式系统 2
1.1.2 嵌入式Linux系统简介 2
1.1.3 嵌入式Linux系统的应用领域 3
1.1.4 嵌入式Linux系统的构建工具 4
1.1.5 常见的嵌入式Linux系统发行版 5
1.2 什么是Yocto项目 6
1.2.1 Yocto项目的起源 6
1.2.2 为什么选择Yocto项目 7
1.2.3 社区与资源 7
1.3 Yocto项目概览 9
1.3.1 版本管理 10
1.3.2 开发与生产工具 12
1.3.3 常用术语 13
1.4 特性与挑战 16
1.4.1 特性与优势 16
1.4.2 面临的挑战 17
1.4.3 经验总结 19
第2章 Linux系统架构 22
2.1 GNU/Linux 22
2.1.1 GNU/Linux概述 23
2.1.2 Linux系统架构概述 23
2.2 Bootloader 24
2.2.1 Bootloader启动流程 25
2.2.2 常用的Bootloader 25
2.2.3 U-Boot简介 26
2.2.4 GRUB简介 27
2.3 内核空间 28
2.3.1 Linux内核 28
2.3.2 控制硬件资源 31
2.3.3 服务用户空间 32
2.4 用户空间 33
2.4.1 根文件系统 34
2.4.2 标准C库 34
2.4.3 系统共享库 36
2.4.4 init进程 37
2.4.5 窗口管理系统 38
第3章 Yocto项目基础架构 40
3.1 快速构建指南 41
3.1.1 搭建构建主机环境 41
3.1.2 下载Poky源代码 42
3.1.3 初始化OpenEmbedded构建环境 42
3.1.4 构建镜像 44
3.1.5 QEMU启动镜像 44
3.2 Yocto项目架构 45
3.2.1 层模型 45
3.2.2 核心组件 46
3.2.3 构建主机 47
3.3 OpenEmbedded构建系统 48
3.3.1 BitBake构建引擎 49
3.3.2 OpenEmbedded-Core 49
3.3.3 构建系统工作流 50
3.4 OpenEmbedded构建环境 52
3.4.1 构建环境配置脚本 53
3.4.2 构建目录结构 54
3.4.3 构建输出结构 55
第4章 元数据架构 60
4.1 元数据 60
4.1.1 元数据的概念 61
4.1.2 元数据文件 61
4.1.3 元数据语法 68
4.2 菜谱 77
4.2.1 菜谱及追加菜谱示例 77
4.2.2 菜谱命名与版本控制 79
4.2.3 菜谱语法 81
4.2.4 创建菜谱 89
4.2.5 菜谱工作流 97
4.3 层 108
4.3.1 层的概念 108
4.3.2 层的结构与功能 109
4.3.3 层的分类 115
4.3.4 bitbake-layers层管理工具 122
第5章 BitBake构建引擎 130
5.1 BitBake的起源与发展 130
5.2 BitBake的源代码 131
5.2.1 BitBake源代码的获取 131
5.2.2 BitBake源代码结构及核心模块 132
5.3 BitBake命令 137
5.3.1 BitBake的命令语法 137
5.3.2 执行默认任务 140
5.3.3 执行指定任务 141
5.3.4 强制执行任务 143
5.4 BitBake调试与优化 144
5.4.1 清除共享状态缓存 144
5.4.2 查看任务列表 146
5.4.3 查看变量值 149
5.4.4 查看依赖关系 150
5.4.5 查看调试信息 153
5.5 BitBake执行流程 154
5.5.1 基础配置解析 155
5.5.2 菜谱解析与管理 156
5.5.3 任务依赖与调度 158
5.5.4 任务执行与日志记录 159
第6章 Poky参考发行版 163
6.1 Poky 163
6.1.1 发行版与特性 164
6.1.2 源代码接口与核心文件 165
6.2 镜像菜谱 167
6.2.1 镜像菜谱详解 167
6.2.2 镜像菜谱语法 171
6.2.3 镜像类 173
6.2.4 包组菜谱 178
6.3 机器配置文件 181
6.3.1 Poky中的机器配置文件 181
6.3.2 机器特性与实现 188
6.3.3 选择目标设备 190
6.4 发行版配置文件 191
6.4.1 指定发行版配置文件 191
6.4.2 Poky中的发行版配置文件 192
6.4.3 发行版特性与实现 199
6.5 QEMU 203
6.5.1 QEMU简介 203
6.5.2 设置QEMU的运行环境 204
6.5.3 runqemu脚本 204
第7章 定制镜像菜谱与内核菜谱 208
7.1 定制镜像菜谱 209
7.1.1 搭建构建环境 209
7.1.2 创建自定义层 210
7.1.3 定制镜像菜谱的步骤 211
7.1.4 QEMU测试镜像 214
7.2 定制应用程序 216
7.2.1 HelloWorld应用程序 216
7.2.2 Yocto项目中的HelloWorld程序 217
7.2.3 使用QEMU测试HelloWorld程序 219
7.3 定制内核菜谱 219
7.3.1 Yocto项目的内核仓库 220
7.3.2 内核元数据 225
7.3.3 内核菜谱 234
7.3.4 内核配置 239
7.3.5 定制内核菜谱的步骤 242
7.4 定制内核树外模块 245
7.4.1 树外模块的基本原理 246
7.4.2 树外模块的安装与加载 246
7.4.3 定制customer.ko树外模块 248
第8章 树莓派启动定制镜像 253
8.1 树莓派简介 254
8.1.1 树莓派4B 254
8.1.2 树莓派与Yocto项目 255
8.2 构建和部署树莓派镜像 256
8.2.1 构建树莓派测试镜像 256
8.2.2 将镜像部署到SD卡 261
8.2.3 启动树莓派4B 265
8.3 meta-raspberrypi层 266
8.3.1 meta-raspberrypi层概述 267
8.3.2 层配置 269
8.3.3 硬件配置 271
8.3.4 内核配置 274
8.3.5 图形系统配置 278
8.3.6 硬件测试镜像菜谱 279
8.4 使用Wic工具创建分区镜像 280
8.4.1 Wic工具介绍 280
8.4.2 Kickstart文件 284
8.4.3 Wic插件 286
8.4.4 Wic工具的操作模式 288
8.4.5 树莓派的镜像分区 290
8.4.6 dd和bmaptool部署镜像 293
第9章 实战定制树莓派BSP层 297
9.1 创建与配置BSP层 298
9.1.1 定制BSP层的方法 298
9.1.2 创建meta-raspberrypi-custom层 298
9.1.3 定制机器配置文件 300
9.2 定制内核菜谱 300
9.2.1 内核配置 301
9.2.2 指定内核设备树文件 302
9.2.3 添加内核补丁 303
9.3 定制硬件启动配置菜谱 306
9.3.1 指定内核设备树文件 307
9.3.2 控制LED硬件行为 308
9.4 定制测试镜像菜谱 310
9.4.1 创建基础测试镜像菜谱 311
9.4.2 添加SSH服务 311
9.4.3 X11图形显示协议 311
9.4.4 启用Systemd系统管理器 313
9.5 定制分区镜像 316
9.5.1 定制Kickstart文件 317
9.5.2 重构并验证镜像 318
9.5.3 meta-raspberrypi-custom层的最终结构 319
第10章 软件开发工具包 321
10.1 软件开发工具包概述 322
10.1.1 SDK简介 322
10.1.2 获取和使用SDK安装包 324
10.1.3 SDK通用组件 328
10.2 可扩展SDK 333
10.2.1 可扩展SDK结构 333
10.2.2 定制可扩展SDK安装包 336
10.2.3 devtool命令行工具 340
10.3 标准SDK构建应用程序 349
10.3.1 定制应用程序 349
10.3.2 构建应用程序 350
10.3.3 部署与测试 353
10.4 可扩展SDK构建与部署 355
10.4.1 创建菜谱 355
10.4.2 构建与部署 360
10.4.3 测试与集成 362
第11章 进阶项目实战 367
11.1 搭建项目开发环境 368
11.1.1 硬件开发环境 368
11.1.2 软件开发环境 370
11.2 初始化构建环境 378
11.2.1 构建环境配置脚本 379
11.2.2 初始化构建环境 381
11.3 元数据结构 385
11.3.1 元数据层结构 385
11.3.2 镜像菜谱 388
11.3.3 内核 392
11.3.4 Bootloader 398
11.4 定制层与镜像 403
11.4.1 创建meta-imx-custom层 403
11.4.2 创建追加菜谱文件 404
11.4.3 集成Chromium浏览器 405
11.4.4 添加Systemd服务 408
11.5 构建镜像与部署验证 412
11.5.1 构建目标镜像 412
11.5.2 搭建部署环境 414
11.5.3 启动硬件与验证 421
附录A Yocto项目社区与支持渠道 427
展开
推荐序一
与作者相识多年,我们既是同学,也是志趣相投的挚友。一路走来,我们的交流始终围绕着技术。从嵌入式开发到开源生态,再到AI的融合应用,我们共同见证了技术的发展,也在各自的领域持续深入探索。在这一路上,我们最大的感触就是:技术的进步不仅仅是工具的演变,更是学习方式、实践路径和产业落地的全面升级。
当下,嵌入式开发正迎来新的浪潮,国产芯片、AIoT(人工智能物联网)、边缘计算的快速发展,让定制化的嵌入式Linux系统成为必然选择。而在这一领域,Yocto项目无疑是一款强大的工具,能够帮助开发者精准且高效定制嵌入式系统,以及优化软硬件协同。但Yocto项目的学习曲线陡峭且生态复杂,许多开发者在入门时都会遇到不小的挑战。
作者长期深耕Yocto项目,从技术学习到工程实践,再到社区分享,他不仅积累了丰富的经验,更具备将复杂问题系统化、结构化的能力。本书便是他这些年开发经验的凝练,不仅全面解析了Yocto项目的理论体系,还结合QEMU模拟器、树莓派教学开发板和恩智浦i.MX 8M Plus高端芯片的实战案例,为处于不同学习阶段的开发者提供了一条清晰可操作的学习路径。无论是刚入门的嵌入式工程师,还是希望深入掌握Yocto项目的资深开发者,相信你都能在书中找到值得拥有的内容。
在开源技术的持续推动下,嵌入式开发正呈现出生态融合、全球协作与技术共享的趋势。我们正处在行业变革的关键节点,未来的嵌入式系统开发不仅要适应国产芯片的软件生态演进,还需深度融合AI推理加速与软硬件协同优化。本书的亮点不仅在于技术讲解,更在于为国内开发者提供一条系统化的学习路径,帮助大家更高效地掌握Yocto项目,在嵌入式开发的浪潮中提升竞争力。
技术因分享而进步,产业因协作而繁荣。希望这本书能成为更多嵌入式开发者的学习指南,帮助大家少走弯路,提升效率,在国产芯片生态演进与智能计算时代抓住机遇。
王强
佛山市迪海网络科技有限公司董事长
推荐序二
在近二十年嵌入式产品开发和推广的过程中,我的工作一直围绕在如何让嵌入式工程师更快更好地开发产品。嵌入式技术作为电子信息产业的基础技术,近十年来在国内经历了飞速的发展。然而,当下国外已经普遍使用的Yocto项目相关技术,在国内仍然面临一些挑战:Yocto项目好用,但学习曲线陡峭;想学Yocto项目,但国内的资料和生态不成熟。这是当前国内开发者运用Yocto项目这把嵌入式领域的“瑞士军刀”时,常会面临的困境和挑战。
本书作者,我的好友孙杰,在国外求学多年后,又在世界500强企业从事嵌入式开发多年,至今仍在该领域深耕。得益于其出色的语言能力和规范且系统的工作环境,及多年Yocto项目的实战工作经历,他充分掌握了Yocto项目的开发精髓。在作者多年的博客生涯中,众多网友对其分享的Yocto项目相关文章给予了高度关注和广泛传播。在与众多开发者交流的过程中,他意识到开发者迫切需要一本系统且实用的Yocto项目使用指南。于是出于助力国内开发者更快更好地学习和使用Yocto项目的初心,作者写下了本书,分享他的专业知识和经验。
本书紧密结合Yocto项目的核心概念和实战案例,结构清晰、层次分明、由浅入深,将理论学习和实践应用有效结合。全书内容大体分为三个部分。
第一部分:系统并精要地介绍了Yocto项目基础框架与核心组件,包括元数据结构,BitBake构建引擎,Poky参考发行版,镜像菜谱和内核菜谱等关键知识点。受益于作者多年的深入研究,这些章节并不是直接地搬运官方知识或进行简单翻译,而是作者对Yocto项目完整知识体系的梳理和传递。
第二部分:以定制树莓派系统作为入门案例,讲述了BSP定制和SDK生成两个实战中常用的核心知识点,让初学者能以最低的学习成本快速学习和使用Yocto项目的核心技术。在实践中学习,结合前面章节的知识体系与树莓派广泛的应用基础,让Yocto项目实战的第一步做到了敏捷而有效。
第三部分:以NXP公司的i.MX 8M Plus芯片开发为案例,介绍了工业场景中系统开发的完整过程。这能有效地帮助开发者实现Yocto项目从入门到精通的过程,充分地体会和发挥Yocto项目的开发优势,帮助开发者实现高效进阶。
相信无论对于初学者还是有一定经验但需要进阶的开发者而言,通过本书各个章节的学习,都能真正敏捷且高效地使用Yocto项目实现嵌入式Linux系统的开发。
写作本序的时候,我正好在参加纽伦堡嵌入式展会。围绕嵌入式技术的未来发展,展商众多,观众如云,热闹非凡,这也体现了全球嵌入式技术发展如火如荼。相比于13年前嵌入式展会寥寥的中国面孔,在今年的嵌入式展会上,来自中国的芯片厂家和嵌入式产品方案公司已经占据了相当大的比例。各个展台关于AI嵌入式边缘应用的广泛尝试,机器人应用的深度探索,工业场景的性能跃迁,新能源汽车等热点方向的应用展示,吸引了大批观众驻足交流。
在嵌入式技术范围之内,世界是平的。正如本书作者的经历一样,因为他人的分享而收获,也推动他积极地回馈,帮助国内开发者应对学习Yocto项目的挑战。因为开源和分享,全球的开发者将共同推动创新,并享受来自分享的效率提升。也正因为我们有众多像作者一样卓越的开发者,相信下一个十年,我们将见证中国的开发者和企业在嵌入式开发领域经历从使用者到提供者,从跟随者到引领者,从群演到主演的“版本升级”。
周麒
深圳米尔电子副总经理
前言
本书基于笔者的实践经验,系统化讲解Yocto项目的核心知识,结合丰富的实战示例,帮助读者高效掌握Yocto项目的构建方法,并深入理解其应用与实践技巧。
嵌入式Linux系统的现状与挑战
随着科技的快速发展,嵌入式Linux系统已广泛应用于智能家居、工业控制、智能汽车等领域,并在AIoT、边缘计算、智能医疗等方向发挥着关键作用。其开源、灵活、可定制的特性,使其成为嵌入式设备的主流操作系统;市场需求持续增长,使其在智能设备中的核心地位不断加强。
然而,嵌入式Linux系统的开发面临诸多挑战。硬件生态碎片化导致适配和维护成本高昂,定制化需求要求针对启动速度、功耗、实时性、安全性进行深度优化,开发流程复杂,涉及内核裁剪、驱动适配、交叉编译、软件栈集成,且版本管理混乱,周期冗长。此外,软硬件协同优化难度大,不同平台资源受限,优化策略难以通用,进一步提高了开发门槛,使嵌入式Linux系统在智能设备中的核心地位面临更高的技术挑战。
应运而生的Yocto项目
面对嵌入式Linux系统开发中硬件适配复杂、定制化需求高、构建流程烦琐等挑战,Yocto项目提供了一套灵活、可扩展、自动化的构建工具集。它采用模块化架构、分层构建体系和软件栈管理机制,使开发者能够高效定制、优化和维护嵌入式Linux系统,可提高开发效率并降低适配成本。
Yocto项目汇聚了全球开发者的智慧,依托活跃的开源社区,不断优化和迭代,支持多架构、多平台的嵌入式Linux系统构建与定制。它持续提升跨平台适配能力、完善长期维护机制、增强系统稳定性和可复用性。随着技术演进,Yocto项目不断拓展应用场景,为日益复杂的嵌入式Linux系统需求提供更加高效、可靠的解决方案。
本书的定位与特点
Yocto项目已成为定制嵌入式Linux系统的主流工具,但由于构建体系复杂、配置灵活、调试难度大,其“难学易用”的特性让许多开发者望而却步。本书在官方文档的基础上,结合笔者多年的嵌入式开发经验,提炼核心理论框架,使其易读易懂。同时辅以大量实践案例,帮助读者系统化学习Yocto项目,快速掌握Yocto项目的基础知识与实战技巧。
本书以实践为导向,从基础到进阶、从理论到实战,循序渐进,全面剖析Yocto项目的架构与高阶应用。无论是初学者、进阶开发者,还是专注于底层技术研究的专家,本书都将成为系统学习Yocto项目的一站式指南,助您自信应对嵌入式Linux系统的定制与构建挑战。
Yocto项目在中国的现状与机遇
当前,Yocto项目已在全球范围内得到广泛认可和应用,但在国内的普及程度相对较低。国产芯片适配度不足、技术资料主要以英文为主、本地社区生态不成熟,使开发者在学习和应用Yocto项目时面临较高门槛。此外,尽管国产AI技术发展迅速,但AI设备的软件环境仍主要依赖厂商的专有SDK和BSP,不同平台的软件接口和适配机制存在差异,增加了系统维护和版本管理的复杂度。
随着国产芯片生态的持续优化,Yocto项目的本地化进程正在加速推进。同时,AI技术在边缘计算、智能设备等领域中的应用需求增长,对嵌入式Linux系统的定制、构建效率和长期维护提出了更高要求。Yocto项目凭借灵活的构建机制和广泛的硬件支持,正成为国产芯片和AI应用的重要支撑,将为嵌入式Linux系统的开发和维护提供高效、稳定、可扩展的解决方案。
总结与展望
本书旨在促进Yocto项目在国内的应用,帮助嵌入式开发者系统掌握其核心技术。通过系统化讲解与实践结合,降低学习门槛,使Yocto项目在国产芯片研发及更多嵌入式应用中发挥更大价值。
受限于编写周期和笔者的个人水平,书中难免存在疏漏与不足。如您在阅读过程中发现问题或有任何建议,欢迎交流探讨。相信在大家的共同努力下,Yocto项目将在国产芯片生态、AIoT和边缘计算等领域得到更广泛的应用,进一步推动嵌入式Linux系统生态的标准化与发展。
孙杰
jerrysundev@163.com
展开