首页>参考读物>计算机科学与技术>软件与程序设计

嵌入式Linux编程
作者 : [英] 克里斯?西蒙兹(Chris Simmonds) 著
出版日期 : 2017-04-07
ISBN : 978-7-111-56128-6
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 288
开本 : 16
原书名 : Mastering Embedded Linux Programming
原出版社: Packt Publishing Ltd.
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是按典型的嵌入式Linux项目的生命周期线组织的。前6章介绍如何建立项目,组织、Linux系统,以及选择合适的Linux构建系统。下一步,到达需要对系统架构和设计选择做出某些关键决策的阶段,包括闪存、设备驱动程序和init系统。接着,是利用已构建的嵌入式平台编写应用程序的阶段,其中有两章是关于进程、线程和内存管理的。最后,来到调试和优化平台的阶段,这是在第12章和第13章讨论的。最后一章描述如何为实时应用程序配置Linux。

图书前言

嵌入式系统是一种设备,它的里面有一台微控制器。洗衣机、电视机、打印机、汽车、飞机和机器人都是由一个或多个微控制器控制的。随着这些设备变得越来越复杂,以及我们对于这些设备所拥有功能期望的提高,对于一个强大的操作系统来控制它们的需求不断增长。Linux逐渐成为首选的操作系统。
Linux的优势来源于它的开源模型,它鼓励代码共享。这意味着,具有众多背景并且经常由不同竞争公司雇用的软件工程师们,可以合作创建最新的操作系统内核并且跟踪硬件开发。这样一个代码库,可以对上至最大的超级计算机下至手表提供支持。Linux只是操作系统的一个组件。要创建一个工作系统,还需要许多其他组件,从基本的工具,如命令外壳,到具有Web内容并且与云服务通信的图形用户界面。Linux内核与众多其他的开源组件一起,可以构建一个在广泛的领域中发挥作用的系统。
然而,灵活性是一把双刃剑。尽管它可以针对一个特定问题给系统设计师提供广泛的备选解决方案,但是它也提出了这样的问题,即需要知道哪个方案是最好的选择。本书的目的是详细描述如何使用免费的开源项目构建一个嵌入式Linux系统,以生成一个健壮、可靠、高效的系统。基于作者作为一名咨询顾问和培训师的多年经验,本书将使用实例来说明最佳实践。
本书内容
本书是按典型的嵌入式Linux项目的生命周期线组织的。前6章介绍如何建立项目,组织、Linux系统,以及选择合适的Linux构建系统。下一步,到达需要对系统架构和设计选择做出某些关键决策的阶段,包括闪存、设备驱动程序和init系统。接着,是利用已构建的嵌入式平台编写应用程序的阶段,其中有两章是关于进程、线程和内存管理的。最后,来到调试和优化平台的阶段,这是在第12章和第13章讨论的。最后一章描述如何为实时应用程序配置Linux。
第1章 通过描述系统设计师在项目开始时的可行选择来设置场景。
第2章 描述工具链的组件,特别是交叉编译。本章描述从何处获取一个工具链,并且提供从源代码构建工具链的细节。
第3章 以U-Boot和Bareboot为例,解释引导加载程序在初始化设备硬件中的作用。本章还描述设备树,这是一种在许多嵌入式系统中使用的硬件配置编码方式。
第4章 提供关于如何针对一个嵌入式系统选择Linux内核以及为设备内部硬件配置Linux内核的信息。本章还包括如何将Linux移植到新的硬件。
第5章 通过一个关于如何配置根文件系统的分步指南,介绍关于嵌入式Linux实现的用户空间部分所隐含的思想。
第6章 包括两个嵌入式Linux构建系统,通过构建系统可以自动化前面4章描述的步骤,并且总结本书第一部分。
第7章 讨论闪存管理所引起的挑战,包括raw f lash芯片和嵌入式MMC或eMMC封装。本章描述适用于每种技术类型的文件系统。本章还包括如何现场更新设备固件的技术。
第8章 通过一个简单的驱动程序实例描述内核设备驱动程序如何与硬件交互。本章还描述从用户空间调用设备驱动程序的各种方法。
第9章 说明第一个用户空间程序init如何启动系统的其余部分。本章描述init程序的三个版本,每个版本适用于一组不同的嵌入式系统,从BusyBox init到systemd复杂性递增。
第10章 从应用程序员的角度描述嵌入式系统。本章讨论进程和线程、进程间通信和调度策略。
第11章 介绍虚拟内存背后的思想,以及如何将地址空间划分为内存映射。本章还介绍如何检测正在使用的内存和内存泄漏。
第12章 介绍如何使用GNU调试器GDB,以交互方式调试用户空间和内核代码。本章还描述内核调试器kdb。
第13章 涵盖可用于测量系统性能的技术,从全系统分析开始,然后聚焦特定的区域,该区域通常是造成性能不佳的瓶颈。本章还描述Valgrind工具,用于检查应用程序是否正确使用线程同步和内存分配。
第14章 提供关于Linux实时编程的详细指南,包括内核配置和实时内核补丁,还提供关于测量实时延迟的工具描述。本章还包括关于如何通过锁定内存来减少页面故障数量的信息。
本书所需配套环境
本书中使用的软件完全是开源的。在大多数情况下,使用的版本是在本书写作时可用的最新的稳定版本。尽管我试图以一种不针对特定版本的方式描述主要特性,但是不可避免地,在命令实例中包含的一些细节将无法在后来的版本中工作。我希望与它们相关的描述能够提供足够的信息,从而可以将同样的原则应用到软件包的后期版本中。
在创建一个嵌入式系统时涉及两个系统:用于交叉编译软件的主机系统和用于运行软件的目标系统。对于主机系统,我使用的是Ubuntu 14.04,但是大多数Linux发行版只需要很小的修改即可工作。同样地,需要选择一个目标系统来表示嵌入式系统。我选择了两个:BeagelBone Black和QEMU CPU仿真器,用于仿真ARM目标。后者意味着你可以试验这些实例,而不必为一个实际的目标设备来投资硬件。同时,通过对特定细节的修改,例如设备名称和内存布局,应该有可能将实例应用到范围更广泛的目标。
目标系统的主软件包版本是U-Boot 2015.07、Linux 4.1、Yocto Project 1.8 "Fido"和Buildroot 2015.08。
读者对象
本书非常适合那些已经熟悉嵌入式系统以及想知道如何创建一流设备的Linux开发人员和系统程序员阅读。基本理解C语言编程和具有系统编程经验是必要的。
本书约定
在这本书中,你会发现用于区别不同种类信息的文本样式。下面是这些样式的一些例子以及它们含义的说明。
代码块设置如下:

当我们希望提醒你注意代码块的特定部分时,相关行或项被设置为粗体:


任意命令行输入或输出书写如下:

表示警告或重要说明。

表示提示和技巧。

样例源码下载
你可以从http://www. packtpub.com通过个人账号下载你所购买书籍的样例源码。如果你是从其他途径购买的,可以访问http://www.packtpub.com/support,完成账号注册,就可以直接通过邮件方式获得相关文件。
你也可以访问华章图书官网:http//www.hzbook.com,通过注册并登录个人账号,下载本书的源代码。

上架指导

计算机\程序设计

封底文字

本书引导你遍历整个嵌入式Linux产品的周期,并提供在每个阶段可用组件和选项的深入描述。作者首先介绍工具链、引导加载程序、Linux内核和配置根文件系统的相关知识,然后讲解如何使用两个最常用的构建系统,即Buildroot和Yocto项目,以加快和简化开发过程,接着介绍如何充分使用raw NAND/NOR闪存和托管闪存eMMC芯片,包括增加器件寿命的机制以及进行可靠的现场更新,探讨POSIX线程的使用,这对最终设备的响应能力和性能有着很大的影响。本书的结尾部分探讨使用perf和ftrace剖析和跟踪应用程序以及内核代码的技术。

通过阅读本书,你将:
理解Linux内核的作用,并为应用程序选择一个合适的角色
使用Buildroot和Yocto项目快速而有效地创建嵌入式Linux系统
使用U-Boot创建定制化的引导加载程序
使用perf和ftrace查找性能瓶颈
理解设备树并做出改变,以适应新的硬件设备
编写与Linux设备驱动程序进行交互的应用程序
使用POSIX线程设计并编写多线程应用程序
测量实时延迟,并调整内核以尽量将延迟最小化

作者简介

[英] 克里斯?西蒙兹(Chris Simmonds) 著:暂无简介

译者序

嵌入式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,最终我们将会看到你成为这个充满活力的开源社区的一部分,该社区也同样包含着你即将学习的众多元素。

Richard Purdie
Yocto项目架构师,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.7 U-Boot 39
3.8 Barebox 49
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.5 proc与sysfs文件系统 80
5.6 内核模块 81
5.7 把根文件系统转移到目标 81
5.8 创建启动内存磁盘 82
5.9 init程序 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 不再手动创建嵌入式Linux 96
6.2 构建系统 96
6.3 包格式和包管理器 98
6.4 Buildroot 98
6.5 Yocto项目 104
6.6 延伸阅读 116
6.7 总结 116
第7章 创建存储策略 117
7.1 存储器选择 117
7.2 从引导加载程序访问闪存 121
7.3 从Linux中访问闪存 122
7.4 闪存文件系统 127
7.5 NOR和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.3 BusyBox init 169
9.4 System V init 171
9.5 systemd 176
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.1 GNU调试器:GDB 218
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.10 GDB用户界面 228
12.11 调试内核代码 230
12.12 延伸阅读 237
12.13 总结 237
第13章 剖析和跟踪 238
13.1 观察者效应 238
13.2 开始剖析 239
13.3 使用top进行剖析 240
13.4 介绍perf 241
13.5 其他剖析器:OProf ile和gprof 245
13.6 跟踪事件 247
13.7 介绍Ftrace 247
13.8 使用LTTng 252
13.9 使用Valgrind剖析应用程序 256
13.10 Callgrind 256
13.11 Helgrind 256
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

教学资源推荐
作者: 刘振安 刘燕君 孙忱
作者: 马玉春 著
作者: Brian W.Kernighan,Dennis M.Ritchie
参考读物推荐
作者: 董文娟 尚小冬 张军 著
作者: 陈显鹭 阚俊宝 匡大虎 卢稼奇 著
作者: 张良均 谢佳标 杨坦 肖刚 等著