本书是按典型的嵌入式Linux项目的生命周期线组织的。前6章介绍如何建立项目,组织、Linux系统,以及选择合适的Linux构建系统。下一步,到达需要对系统架构和设计选择做出某些关键决策的阶段,包括闪存、设备驱动程序和init系统。接着,是利用已构建的嵌入式平台编写应用程序的阶段,其中有两章是关于进程、线程和内存管理的。最后,来到调试和优化平台的阶段,这是在第12章和第13章讨论的。最后一章描述如何为实时应用程序配置Linux。
嵌入式Linux是以Linux为基础的嵌入式操作系统,它继承了Internet上海量的开放源代码资源,有许多公开的代码可以参考和移植,具有软件移植容易,代码开放,实时性、稳定性、安全性高,应用软件支持广泛,产品开发周期短,新产品上市迅速等优点,已经在移动电话、媒体播放器、消费性电子产品以及航空航天等领域中得到广泛应用。
嵌入式Linux具有其他嵌入式系统所不具备的优势。首先,Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux开发者提供强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快;再次,Linux是一个跨平台的系统,适应于多种CPU和硬件平台,而且性能稳定,可高度定制,开发和使用非常方便;最后,Linux内核对于TCP/IP协议簇具有完备的支持,扩展性强,非常适合于网络设备的开发和应用。
本书遵循典型的嵌入式Linux项目生命周期过程组织,全面地介绍了嵌入式Linux的编程技术。本书作者是一名具有多年嵌入式Linux开发经验的咨询顾问和培训师。本书详细描述了如何使用免费的开放源码项目构建一个健壮、可靠、高效的嵌入式Linux系统,并且使用实例来说明最佳实践。本书前6章介绍如何建立项目,组织Linux系统,以及选择合适的Linux构建系统。接着讨论系统架构和设计选择,包括闪存、设备驱动程序和init系统,以及如何利用已构建的嵌入式平台编写应用程序。最后,介绍如何调试和优化,以及如何为实时应用程序配置Linux。
本书由王春雷组织翻译,梁洪亮、朱华等参与了本书的翻译、校对等工作。译者在翻译的过程中,得到了机械工业出版社编辑的支持和帮助,在此深表感谢。限于时间以及译者水平和经验的不足,译文中难免存在一些不当之处,恳请读者提出宝贵的意见。
Linux是一个非常灵活和强大的操作系统,而我认为,我们还没有真正看到它在嵌入式世界中得到充分利用。一个可能的原因是,Linux有着众多不同的方面,并且它的学习曲线可能十分陡峭和耗时。
正如我自己在过去十年中所做的,你有可能描绘出自己通向嵌入式Linux世界的方式,但是我很高兴地看到像克里斯这样的人士,将许多有用的主题聚焦在一起,汇总为本书,给读者提供了一个很好的学习嵌入式Linux的平台。当我开始学习的时候,当然希望可以将本书作为指导!
很显然,我对于Yocto项目有着自己的个人见解,这也是我的主要贡献并且试图使得嵌入式Linux世界有所不同。它的核心目标之一是尝试并且使得人们在构建嵌入式Linux系统时,事情能变得更加简单。我们已经取得了一些成功,但是还有一些领域仍然需要继续探索。我们不断尝试简化学习的门槛从而让更多的人参与进来,使技术更容易获得和采用。
在写这本书时,克里斯也在为同样的目标努力。我希望你喜欢这本书,喜欢Linux,最终我们将会看到你成为这个充满活力的开源社区的一部分,该社区也同样包含着你即将学习的众多元素。
封面图
目录
- 译者序
- 推荐序
- 审校者简介
- 前言
- 第1章概述1
- 1.1选择合适的操作系统2
- 1.2参与者3
- 1.3项目生命周期4
- 1.4开放源码5
- 1.5嵌入式Linux系统硬件6
- 1.6本书使用的硬件7
- 1.7本书使用的软件9
- 1.8总结9
- 第2章学习工具链10
- 2.1工具链是什么10
- 2.2工具链类型:本地工具链和交叉工具链11
- 2.3选择C库13
- 2.4寻找工具链14
- 2.5工具链解析17
- 2.6工具链中的其他工具20
- 2.7查看C库的组件21
- 2.8链接库:静态和动态链接21
- 2.9 交叉编译艺术24
- 2.10交叉编译的问题28
- 2.11总结29
- 第3章引导加载程序30
- 3.1引导加载程序都做了些什么30
- 3.2引导序列31
- 3.3使用UEFI固件引导32
- 3.4从引导加载程序到内核33
- 3.5设备树介绍34
- 3.6选择引导加载程序38
- 3.7U-Boot39
- 3.8Barebox49
- 3.9总结51
- 第4章移植与配置内核52
- 4.1内核做了什么52
- 4.2选择内核53
- 4.3内核构建55
- 4.4编译60
- 4.5清理内核源63
- 4.6启动你的内核63
- 4.7将Linux移植到新板上66
- 4.8延伸阅读69
- 4.9总结69
- 第5章构建根文件系统71
- 5.1根文件系统是什么71
- 5.2根文件系统的程序75
- 5.3根文件系统库78
- 5.4设备节点79
- 5.5proc与sysfs文件系统80
- 5.6内核模块81
- 5.7把根文件系统转移到目标81
- 5.8创建启动内存磁盘82
- 5.9init程序85
- 5.10配置用户账号86
- 5.11启动守护进程87
- 5.12管理设备节点的更好方法88
- 5.13配置网络89
- 5.14借助设备表创建文件系统映像90
- 5.15使用NFS挂载根文件系统92
- 5.16使用TFTP加载内核94
- 5.17延伸阅读95
- 5.18总结95
- 第6章选择构建系统96
- 6.1不再手动创建嵌入式Linux96
- 6.2构建系统96
- 6.3包格式和包管理器98
- 6.4Buildroot98
- 6.5Yocto项目104
- 6.6延伸阅读116
- 6.7总结116
- 第7章创建存储策略117
- 7.1存储器选择117
- 7.2从引导加载程序访问闪存121
- 7.3从Linux中访问闪存122
- 7.4闪存文件系统127
- 7.5NOR和NAND闪存的文件系统128
- 7.6托管闪存的文件系统134
- 7.7只读压缩文件系统138
- 7.8临时文件系统138
- 7.9使根文件系统为只读139
- 7.10文件系统选择140
- 7.11现场更新140
- 7.12延伸阅读142
- 7.13总结143
- 第8章设备驱动程序介绍144
- 8.1设备驱动程序的作用144
- 8.2字符设备145
- 8.3块设备147
- 8.4网络设备147
- 8.5在运行时寻找驱动程序149
- 8.6找到正确的设备驱动程序153
- 8.7用户空间中的设备驱动程序153
- 8.8编写内核设备驱动程序158
- 8.9加载内核模块163
- 8.10查找硬件配置163
- 8.11延伸阅读166
- 8.12总结167
- 第9章启动初始化程序168
- 9.1在内核启动后168
- 9.2初始化程序简介169
- 9.3BusyBox init169
- 9.4System V init171
- 9.5systemd176
- 9.6延伸阅读181
- 9.7总结181
- 第10章学习进程和线程182
- 10.1进程还是线程182
- 10.2进程183
- 10.3线程191
- 10.4调度196
- 10.5延伸阅读200
- 10.6总结200
- 第11章内存管理201
- 11.1虚拟内存基础201
- 11.2内核空间内存布局202
- 11.3用户空间内存布局205
- 11.4进程内存映射206
- 11.5交换207
- 11.6用mmap映射内存208
- 11.7我的应用程序使用了多少内存209
- 11.8每个进程的内存使用情况210
- 11.9识别内存泄漏213
- 11.10内存耗尽215
- 11.11延伸阅读217
- 11.12总结217
- 第12章使用GDB调试218
- 12.1GNU调试器:GDB218
- 12.2准备调试218
- 12.3使用GDB调试应用程序219
- 12.4使用gdbserver远程调试219
- 12.5开始调试221
- 12.6调试共享库224
- 12.7即时调试225
- 12.8调试分叉和线程226
- 12.9核心文件226
- 12.10GDB用户界面228
- 12.11调试内核代码230
- 12.12延伸阅读237
- 12.13总结237
- 第13章剖析和跟踪238
- 13.1观察者效应238
- 13.2开始剖析239
- 13.3使用top进行剖析240
- 13.4介绍perf241
- 13.5其他剖析器:OProf ile和gprof245
- 13.6跟踪事件247
- 13.7介绍Ftrace247
- 13.8使用LTTng252
- 13.9使用Valgrind剖析应用程序256
- 13.10Callgrind256
- 13.11Helgrind256
- 13.12使用strace显示系统调用257
- 13.13总结259
- 第14章实时编程260
- 14.1什么是实时性260
- 14.2确认非确定性的来源262
- 14.3理解调度延迟263
- 14.4内核抢占263
- 14.5实时Linux内核(PREEMPT_RT)264
- 14.6线程化中断处理程序264
- 14.7可抢占的内核锁266
- 14.8获得PREEMPT_RT补丁266
- 14.9高精度定时器267
- 14.10在实时应用中避免页面错误268
- 14.11中断屏蔽269
- 14.12测量调度延迟269
- 14.13延伸阅读273
- 14.14总结273