| 商家名称 | 信用等级 | 购买信息 | 订购本书 |
![]() |
Linux嵌入式系统高级程序设计(萨莉(Gene Sally)著) | ![]() |
|
![]() |
Linux嵌入式系统高级程序设计(萨莉(Gene Sally)著) | ![]() |

《Linux嵌入式系统高级程序设计》:Linux嵌入式系统开发最新动态,以项目方式揭示Linux嵌入式开发的全过程,嵌入式系统开发人员必备。
“如果你从事Linux嵌入式开发,此书绝对不容错过。”
——亚马逊读者讨论
作者:(美国)萨莉(Gene Sally) 译者:郭旭
Gene Sally 从十几岁就开始接触计算机,有着近10年的嵌入式项目开发经验。利用Linux开发过会计、保险处理、社会福利系统以及电信管理软件的测试软件。曾任职于一家专门开发嵌入式Linux工具和发布版的公司,担任过工程师、培训师、技术支持等职务。
译者简介:
郭旭,毕业于北京大学,获得计算机软件专业学士学位、信号与信息处理专业硕士学位。资 深软件设计师,有多年电子文档/电子图书领域的从业经验,目前从事高性能数据集成工具的开发,主要兴趣是复杂软件系统的设计和剖析。译作有《深入Linux内核架构》、《灰帽攻击安全手册——渗透测试与漏洞分析技术》、《JFC核心编程(第2版)》等。
第1章 嵌入式linux简介
1.1 为何使用嵌入式linux
1.1.1 使用嵌入式linux的技术原因
1.1.2 商业上使用嵌入式linux的原因
1.2 1万英尺高空鸟瞰:略述嵌入式linux开发
1.2.1 目标硬件
1.2.2 获取linux
1.2.3 启动linux
1.2.4 开发环境
1.2.5 系统设计
1.3 嵌入式linux系统的组织结构
1.3.1 启动装载程序
1.3.2 内核
1.3.3 根文件系统
1.3.4 应用程序
1.3.5 交叉编译器
1.3.6 工具
1.4 从何处获得帮助
1.4.1 google大学
1.4.2 邮件列表和新闻组
1.4.3 厂商赞助的资源
1.4.4 行业组织和社区兴趣网站
1.4.5 irc
1.5 前瞻
第2章 配置软件环境
2.1 宿主机环境
2.1.1 linux
2.1.2 windows
2.2 宿主机服务
2.2.1 关闭防火墙
2.2.2 tftp
2.2.3 dhcp
2.2.4 nfs
2.2.5 pxe
2.3 连接线缆
2.3.1 串行连接(用于控制台)
2.3.2 网络
2.4 避免it管理人员恼火的拜访
第3章 目标机仿真与虚拟机
3.1 为何仿真目标机
3.2 通过qemu进行仿真
3.2.1 编译qemu
3.2.2 使用qemu仿真目标机
3.2.3 使用qemu在仿真模式下进行编译
3.3 x86宿主机的虚拟化软件
3.4 小结
第4章 开始你的项目
4.1 大多数目标板包含了linux发布版
4.2 打开目标板包装后需要做什么
4.2.1 有linux吗?启动它
4.2.2 访问内核
4.2.3 理解根文件系统
4.3 根文件系统对项目的适用性
4.4 小结
第5章 获取对应于目标板的linux
5.1 从目标板厂商获取linux
5.1.1 应该询问板卡厂商的问题
5.1.2 现在你是一位顾客了
5.2 开源嵌入式linux发布版
5.2.1 嵌入式linux发布版构建工具存在的原因
5.2.2 应该使用某种发布版构建工具吗
5.2.3 流行的开源嵌入式linux发布版
5.3 从商业厂商和咨询机构获取linux
5.3.1 你需要考虑商业性的linux厂商吗
5.3.2 预期厂商应提供什么
5.3.3 厂商列表
5.4 小结
第6章 从头开始创建linux发布版
6.1 交叉编译器基础
6.1.1 联编软件时需要注意的情况
6.1.2 习惯命令行
6.2 联编gcc交叉编译器概述
6.2.1 c库
6.2.2 收集源代码
6.2.3 联编gcc
6.3 用crosstool-ng联编工具链
6.4 创建根文件系统
6.4.1 配置环境
6.4.2 联编和安装busybox
6.4.3 库
6.4.4 创建设备结点和目录
6.4.5 最后修整
6.4.6 联编内核
6.4.7 解决启动问题
6.5 发布发布版
6.6 小结
第7章 启动目标板
7.1 启动linux系统是一部三幕剧
7.1.1 启动装载程序
7.1.2 内核层与用户层
7.2 启动装载程序
7.3 内核启动
7.3.1 内核入口点
7.3.2 用户层启动
7.3.3 busybox init
7.3.4 用户自定义init
7.4 前瞻
第8章 配置应用开发环境
8.1 选择完成工作的正确工具
8.2 了解要开发的应用程序
8.3 使用何种开发工具
8.3.1 c语言
8.3.2 c++
8.3.3 java
8.4 非传统嵌入式语言
8.4.1 python
8.4.2 tcl
8.4.3 shell脚本
8.4.4 php
8.5 性能和性能剖析工具
8.5.1 性能剖析
8.5.2 内存泄漏检测
8.5.3 静态分析
8.6 ide
8.6.1 编辑器 + make + shell
8.6.2 eclipse
8.7 前瞻
第9章 应用开发
9.1 开始开发应用程序
9.2 桌面系统和目标机
9.2.1 针对可移植性编写代码
9.2.2 系统差别
9.3 hello world
9.3.1 获取工具
9.3.2 使make工作
9.3.3 在目标机上运行代码
9.3.4 更复杂的项目
9.4 准备好调试
9.5 前瞻
第10章 调试应用程序
10.1 开始开发应用程序
10.2 调试的种类
10.3 远程调试概述
10.4 调试c和c++
10.4.1 联编gdb
10.4.2 gdb前端
10.4.3 针对调试进行编译
10.5 调试java
10.6 测量
10.6.1 java测量
10.6.2 脚本语言中的测量
10.7 前瞻
第11章 内核配置和开发
11.1 内核项目布局
11.2 联编内核
11.2.1 内核配置程序的工作方式
11.2.2 默认配置
11.2.3 手工编辑.config文件
11.2.4 联编内核
11.2.5 联编模块
11.2.6 清理
11.3 开源社区
11.3.1 内核开发过程
11.3.2 向linux内核贡献代码
11.3.3 应用补丁
11.4 前瞻
第12章 实时
12.1 linux中的实时实现
12.2 实时程序设计惯例
12.2.1 仅一个实时进程
12.2.2 锁定内存
12.2.3 避免使用堆
12.2.4 需要继承优先级的互斥量
12.2.5 i/o是非确定的
12.2.6 使用线程池
12.2.7 latencytop
12.3 常见的硬件缺陷
12.3.1 系统管理中断
12.3.2 vga控制台
12.3.3 dma总线独占
12.4 小结
第13章 使用开源软件项目
13.1 使用开源软件包
13.1.1 开源项目的结构
13.1.2 项目团队并非你的员工
13.1.3 理解许可证
13.1.4 下载
13.1.5 使用源代码控制系统取得代码
13.1.6 交叉编译
13.1.7 使用configure
13.1.8 联编和安装
13.2 常用项目
13.2.1 directfb
13.2.2 dropbear
13.2.3 qt/qtopia
13.2.4 jamvm
13.2.5 rzsz
13.2.6 netcat
13.2.7 tinyxml
13.2.8 micro_httpd
13.2.9 stupid-ftpd
13.2.10 quagga
13.2.11 tslib
13.2.12 fgetty
第14章 busybox
14.1 基于busybox的系统的组织方式
14.2 构建基于busybox的系统
14.2.1 下载软件
14.2.2 配置
14.3 busybox为什么这样小
14.4 创建自己的小应用程序
14.5 获得帮助
14.6 前瞻
第15章 系统设计
15.1 整体图景
15.2 配置启动装载程序和内核
15.2.1 u-boot
15.2.2 其他启动装载程序
15.2.3 就地执行
15.3 选择根文件系统
15.3.1 基于块的文件系统
15.3.2 mtd文件系统
15.3.3 基于内存缓冲区的文件系统
15.3.4 文件系统的组合
15.4 组装根文件系统
15.4.1 创建中间整备区域
15.4.2 创建目录框架
15.4.3 收集库和其他必需的文件
15.4.4 创建初始化脚本
15.4.5 设置所有权和权限
15.5 安全
15.5.1 内建的安全机制
15.5.2 selinux
15.5.3 pam
15.6 前瞻
第16章 系统微调
16.1 减小根文件系统的大小
16.1.1 从零开始
16.1.2 为节省空间而编译
16.2 减小内核的大小
16.3 最小化启动时间
16.3.1 减少内核启动时间
16.3.2 测量内核启动时间
16.3.3 缩减根文件系统的启动时间
16.4 前瞻
第17章 部署应用程序
17.1 嵌入式设备的部署
17.1.1 需求
17.1.2 工业设计
17.1.3 机械设计
17.1.4 电气工程
17.1.5 制造工程
17.1.6 软件设计
17.1.7 软件工程
17.1.8 制造
17.2 部署策略和战术
17.3 启动装载程序
17.3.1 一般概念
17.3.2 uboot:配置初始参数
17.3.3 expect
17.3.4 启动装载程序只是程序
17.4 部署根文件系统
17.4.1 应用程序文件和库
17.4.2 在工厂进行的第一次现场更新
17.5 前瞻
第18章 处理现场更新
18.1 根文件系统更新
18.1.1 基本策略
18.1.2 完全更新
18.1.3 并行系统
18.1.4 自己动手
18.1.5 使用包管理器
18.1.6 initramfs根文件系统
18.2 内核更新
18.2.1 基本策略
18.2.2 模块
18.2.3 完全更新
18.3 现场更新故障
18.3.1 报告失败,停下
18.3.2 故障安全的根文件系统
18.3.3 故障安全的内核
18.4 综述
在大约十年前进入嵌入式Linux领域时,我面对的一个问题是:我是不是应该使用操作系统?选择Linux意味着经常需要将该操作系统移植到目标硬件上运行,并联编移植所需的工具。随着时间的流逝,事情有了很大的变化,对许多项目来说Linux已经是默认选项,而需要决策的是在具体项目上应该使用该操作系统的哪些特性。如今的问题是:我应该如何配置我的Linux发布版?用技术术语来说,这是开发者态度在很短的时间范围内所发生的巨大转变。
在嵌入式领域,Linux是如此普遍,以至于嵌入式处理器和开发板默认情况下都附带了Linux。买家都期望开发板会启动Linux,并带有随硬件一同提供的、进行嵌入式开发所需的工具。不同于Linux发展的早期阶段,现在的开发者无需把Linux移植到相应的开发板上,只需要对一个已经能够运行的Linux内核和根文件系统进行配置,使之适合应用的需求即可。
着眼于这样的背景,我以一个用户的视角来撰写本书:他即将开始其项目,而手头已经有一个可以在开发板上运行的Linux发布版。这不见得是最终随产品交付的Linux发布版,但很可能作为开发的起点。本书描述了诸如从头开始构建交叉编译器之类的任务,以便读者理解,但读者或许会使用与开发板一同提供的交叉编译器,这样读者就可以集中精力开发实际的应用。但学习构建和配置用于Linux系统的工具绝非浪费,当读者需要从你的系统中压榨出内存的每一位时,这些就成为基本功了。
更进一步,对于新的片上系统(System on a Chip, SOC)式设计,开发板附带的Linux发布版带有芯片上的设备所需的所有驱动程序。需要开发驱动程序的情形是比较罕见的。这意味着,大多数工程师把时间花费在内核的定制上,而不需要构建新的内核组件,而花费在所有内核配置和开发方面的总时间,只是过去几年的几分之一。
随着嵌入式设备中的处理器变得更为强大,开发者逐渐发现可以使用C以外的语言进行开发。将C++用于开发已经很常见,还有其他高级语言如Python、TCL、Java,甚至Perl或PHP。对于使用汇编语言开始嵌入式开发的人来说,在嵌入式目标机上使用类似Perl的语言几乎是异端(如果不算是叛教的话)。但这些高级语言可以大大提高嵌入式开发的效率。在上市时间至关重要的环境下,高级语言显然会成为主流。
嵌入式项目的开发过程不同于其他的软件项目。首先会有一个设计过程,这涉及建立一个专用的容器,以及一个用户界面(可能是一个小的LCD显示器和一些按钮)。但更重要的是软件的部署和更新。项目的代码不会放到CD或网站上,而必须下载到带有Linux发布版的目标板上。在软件最初安装后,可能需要将其更新为包含bug修正或其他特性的新版本。根据系统的配置方式,更新系统本身可能会成为另一个项目。
如果读者是在工作中开始一个嵌入式项目,或购买了某种面向计算机业余爱好者的比较廉价的开发板,我预祝你的努力能够获得好运。与以前任何时候相比,目前在嵌入式项目中使用Linux都更为容易,且有更多乐趣。
插图:
1.基于标准
Linux操作系统和相关的开源项目遵守工业标准。大多数情况下,可用的开源实现是某个标准的规范或参考实现。参考实现包含了对规范的解释,是一致性测试的基础。简言之,参考实现是用于度量其他实现的标准。
如果读者不熟悉参考实现的概念,可能会有点困惑。例如,POSIX中用于处理线程和进程间通信的部分,通常称作标准组是IEEE(Institute of Electricaland Electronics Engineers,电气和电子工程师协会)的一部分,它是一个委员会,设计了用于与线程交互的API,但该标准的实现则由另一个标准组完成。实际上,在标准的工作开始时,委员会的一个或多个参与者会自愿创建相关的代码,即参考实现。参考实现会包括一个测试套件,其他实现需要通过测试套件,才能证明相关代码是按照规范编写的。
使用基于标准的软件,不仅关系到质量,也关系到平台无关性。项目基于遵守标准的软件,可以减少因为特定于厂商的特性而锁定到具体平台的可能性。厂商可能是善意的,但这些额外特性的好处通常会因为缺乏互操作性和自由选择权而被抵消,互操作性和自由选择权已经悄然成为商业事务的一部分,但很少被认真考虑。
在一个有许多嵌入式设备建立连接(很多时候是连接到任意的系统,而非彼此连接)的世界里,标准变得越发重要。以太网是一种这样的连接方法,但还有其他选择,如Zigbee、CANbus、SCSI,这只是其中几个例子而已。
2.进程隔离与控制
Linux内核在最基本的层面上,以通用API的形式提供了这些服务,供访问系统资源之用。管理任务,使之与内核彼此隔离。
提供统一接口,供访问系统硬件资源之用。
当存在争用时,充当资源的仲裁者。这些是非常重要的特性,与硬件和资源访问未能得到严密管理的环境相比,这些特性将产生一个更为稳定的环境。例如,在没有操作系统时,每个运行的程序对所有可用的物理内存都具有同等访问权限。这意味着,一个程序中的溢出错误,将会写入到由另一个程序使用的内存中,除非对系统中所有的代码进行检查,否则第二个程序的失败原因会看似神秘而无法解释。资源争用的概念是比较复杂的,不仅仅只是确保两个进程不会同时向串口写数据这样简单,稀缺的资源是处理器时间,而操作系统可以决定在何时运行哪个进程,以便最大化所能处理的工作量。
相关阅读:
更多图书资讯可访问读书人图书频道:http://www.reAder8.cn/book/