1、CMYCMMYCYCMYK扉.pdf 1 2014/4/22 9:56:58 内 容 简 介 本书是一本全面介绍嵌入式 Linux 开发的专著,书中涵盖了程序生成工具、调试工具、引导加载器、Linux 系统结构、Linux 内核、驱动程序、用户空间编程、用户空间中间件等方面的内容。本书内容前后照应、贴近实践,且有较强的延伸型,有利于读者建立嵌入式 Linux 开发系统化的知识结构和技术理念。本书不仅适用于嵌入式 Linux 的工程师增强能力,也适用于其他领域的技术人员了解嵌入式 Linux。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权所有,侵权必究。图书在版编目(CIP)数据
2、嵌入式 Linux 系统开发全程解析/韩超等著.北京:电子工业出版社,2014.5 ISBN 978-7-121-22888-9 .嵌.韩.Linux 操作系统程序设计.TP316.89 中国版本图书馆 CIP 数据核字(2014)第 066337 号 策划编辑:李 冰 责任编辑:李云静 印 刷:中国电影出版社印刷厂 装 订:三河市鹏成印业有限公司 出版发行:电子工业出版社 北京市海淀区万寿路 173 信箱 邮编:100036 开 本:7871092 1/16 印张:27.25 字数:646 千字 印 次:2014 年 5 月第 1 次印刷 定 价:59.00 元 凡所购买电子工业出版社图书有
3、缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888。质量投诉请发邮件至 ,盗版侵权举报请发邮件至 。服务热线:(010)88258888。前 言 本书写作目的 嵌入式 Linux 开发已经不算很新的技术。本书作者从 2003 年开始从事 Linux 方面的研究、开发和科普工作。在 10 年多的时间里,Linux 内核已经从 2.4 版本发展到了 3.x 版本,广泛使用的嵌入式处理器也从 ARMv4 的 ARM7 核心发展成为 ARMv6 的 Cortex 核心。这10 年多嵌入式 Linux 技术逐步成熟,产品已经数不胜数。作者在几年前出版过
4、一些有关嵌入式系统、Linux 和 C 语言编程的书籍。目前面对技术的发展,感觉有必要出版一本全面介绍嵌入式 Linux 的书籍,以帮助相关行业的学习者和开发者更高效地了解嵌入式 Linux,更好地从事相关工作。希望将本书打造成简明、高效的工具书,成为快速开发 Linux 软件的指导书、硬件移植的工具书,以及计算机专业从业者理论联系实际的桥梁。本书特点 本书结合了作者多年的开发经验和知识技术的传播经验,主要有下面一些特点。内容来自工程实践,实用性强。覆盖面更全面、知识系统完整。使用框架图+代码路径+关键代码的方式,一目了然。内容紧凑,读者可以结合手头代码对照学习。将工程技巧蕴含于理论知识的网络
5、之中。包含 Linux 软件编程开发的常用技巧:查找代码、运行时看信息等。结合硬件和操作系统的知识。帮助读者深入理解 Linux 系统的关键结构,具有完备的开发调试能力。重点关注目前的主要应用场景:用户空间开发和驱动开发。本书以 Linux 尤其是嵌入式 Linux 中最常用的内容为主,这些内容大部分是 Linux 开发不同方面的工程师均需要掌握的。通过对本书的学习,可以让有 C 语言基础的工程师在Linux 环境中开发用户空间软件;让有硬件基础的工程师可以在嵌入式 Linux 平台中具有适 IV 配硬件的能力;让具有一定经验的嵌入式 Linux 工程师具有更广泛的视野、更强的开发能力。本书主
6、要内容 本书包含了嵌入式 Linux 系统的主要内容,按照知识结构分成四个方面。第一个方面:开发环境和编程基础(第 1 章到第 4 章)。第二个方面:Linux 系统结构(第 5 章到第 8 章)。第三个方面:嵌入式 Linux 的用户空间(第 9 章到第 13 章)。第四个方面:嵌入式 Linux 的驱动开发(第 14 章到第 24 章)。按照内容的侧重点,本书具有环境、原理性开发和核心开发几个方面。嵌入式 Linux系统和本书知识结构如下图所示。对读者的话 目前的 IT 技术领域有很多热点,除了嵌入式设备的开发外,还有移动开发、互联网开发等。嵌入式 Linux 是很多产品的技术基础。在实践
7、过程中,很多问题都是嵌入式 Linux最基础的问题,只是由于工程师可能来自其他领域,不熟悉嵌入式 Linux,从而小问题就成了大问题。因此,对于嵌入式 Linux,是目前从事 IT 技术领域的各类工程师都至少需要了解的。本书不仅适用于嵌入式 Linux 的工程师增强能力,也适用于其他领域的技术人员了解嵌入式 Linux。本书尤其注重和高校计算机专业的互补关系,基于高校计算机专业知识基础,书中大量补充了在实践中的应用,帮助读者将知识“落地扎根”,引领读者进一步在工作中 V 让知识和技能“生根发芽”,直到在工作中“结出丰硕的果实”。本书的几个基础方面是 C 语言编程、嵌入式处理器、操作系统,这也是
8、计算机行业的基础。通过对本书的学习,读者得到的不仅仅是各个方面的知识和技巧,更有它们之间的有机结合。本书作者 韩超是中国大陆长期工作于一线的知名工程师、架构师,也是嵌入式 Linux 相关技术在大陆发展 10 年的技术领航人之一,同时也是畅销书作者。其主要从事相关技术研发方向,包括嵌入式 Linux 板级平台、GUI 系统和应用、移动多媒体。韩超对嵌入式 Linux 的技术把握以实用技术为主,以操作系统本身为辅,重视在系统使用特定硬件的技术,重视内核与用户空间的交互的要点,适用于嵌入式 Linux 的软件工程等方面。韩超完成了本书主要部分的编写工作,此外,众多不同规模的企业开发成果也为本书的编
9、写提供了重要的素材。参与本书编写的还有康硕、于仕林、张超等人,以及清华大学计算机系操作系统研究兴趣小组的肖奇学、徐永健、王欢、何嘉权、范文良、茅俊杰等人。VI 目 录 第 1 章 Linux 的开发环境.1 1.1 开发环境概述.1 1.2 串口终端工具.2 1.3 TFTP.6 1.4 NFS.7 1.5 SAMBA 共享.8 1.6 Linux 系统的软件发布协议.9 第 2 章 程序生成和 GCC.11 2.1 程序生成工具概述.11 2.1.1 GUN 的 GCC 工具.11 2.1.2 ELF 文件格式.14 2.2 GCC 工具的使用.16 2.2.1 示例工程.16 2.2.2
10、编译、汇编和连接.18 2.2.3 预处理和汇编.20 2.2.4 归档工具(ar)和静态库.20 2.2.5 动态库.22 2.2.6 ELF 格式文件信息读取(readelf).22 2.2.7 符号信息工具(nm).25 2.2.8 字符串工具(strings).26 2.2.9 去除符号(strip).27 2.2.10 目标文件复制(objcopy).28 2.2.11 目标文件信息(objdump).28 第 3 章 工程管理和 make 机制.33 3.1 make 工具.33 3.2 Makefile 的基本原则.34 3.2.1 Makefile 的变量.34 3.2.2 M
11、akefile 的条件执行.36 3.2.3 Makefile 中的函数.36 3.3 Makefile 使用示例.39 3.3.1 简单的 Makefile.39 3.3.2 依赖关系实例.39 3.3.3 隐含规则的编译实例.41 3.3.4 指定依赖的编译实例.44 3.4 自动生成 Makefile.46 3.4.1 autoconf 工具介绍.46 3.4.2 automake 工具介绍.46 3.4.3 其他工具.47 3.4.4 自动生成 Makefile 的流程.47 第 4 章 调试和 GDB.49 4.1 嵌入式系统的调试技术.49 4.1.1 调试技术.49 4.1.2
12、硬件调试.50 4.1.3 代码调试.51 4.2 Linux 的基本信息.51 4.3 GDB 调试和远程调试.52 4.4 GDB 的安装与使用.57 4.4.1 使用 gdbstub 实现调试用户 程序.57 4.4.2 GDB 和GDB Server 的编译.59 4.5 使用 gdbserver 调试.61 第 5 章 Linux 系统的结构.65 5.1 Linux 操作系统基本概念.65 5.1.1 Linux 的进程信息.65 5.1.2 Linux 的文件系统和文件 信息.70 5.1.3 文件的另外三位属性.71 5.2 Linux 系统的组成和构建.72 VII 5.2.
13、1 Linux 系统的组成.72 5.2.2 嵌入式 Linux 的构建.73 5.3 Linux 系统的启动流程.74 第 6 章 BootLoader 及其构建.76 6.1 嵌入式 Linux 的 BootLoader.76 6.1.1 BootLoader 的开发要点.76 6.1.2 BootLoader 的结构.78 6.2 U-Boot 的使用.80 6.2.1 U-Boot 概述.80 6.2.2 U-Boot 的结构.81 6.2.3 U-Boot 的生成.83 6.2.4 U-Boot 的启动流程.84 6.3 U-Boot 的命令.86 6.3.1 U-Boot 命令概述
14、.86 6.3.2 增加命令.88 6.4 U-Boot 的移植.91 6.4.1 U-Boot 的移植概述.92 6.4.2 U-Boot 的扩展.92 6.4.3 板级支持.94 第 7 章 Linux 内核及其构建.97 7.1 Linux 内核概述.97 7.1.1 Linux 内核结构.97 7.1.2 Linux 源文件结构.98 7.2 嵌入式 Linux 的配置和编译.99 7.2.1 Linux 内核配置结构.99 7.2.2 Linux 内核的配置.99 7.2.3 Linux 内核的生成.107 7.3 Linux 内核的启动过程.108 7.4 特定系统的 Linux
15、的构建.114 7.4.1 Linux 内核的移植.114 7.4.2 ARM 处理器上运行的 Linux 系统.115 7.4.3 S3C6410 Linux 内核的构建.117 7.4.4 S3C6410 Linux 内核的移植 内容.118 第 8 章 文件系统及其构建.123 8.1 Linux 文件系统特性.123 8.2 Linux 文件系统的结构.125 8.2.1 文件系统的主要接口.125 8.2.2 文件系统的实现.130 8.2.3 默认的公共实现.134 8.3 几种 Linux 使用的文件系统.136 8.3.1 EXT 2/3(扩展文件系统2/3).136 8.3.
16、2 NFS(网络文件系统).136 8.3.3 ROMFS(只读文件系统).137 8.3.4 CRAMFS(压缩 ROM 文件 系统).137 8.3.5 JFFS2(日志Flash文件 系统).138 8.3.6 YAFFS(另一种 Flash 文件 系统).138 8.3.7 UBIFS(非排序块映像文件 系统).139 8.4 Linux 文件系统的构建.140 8.4.1 根文件系统的结构.140 8.4.2 制作根文件系统映像.141 8.4.3 内核启动中根文件系统的 参数.142 第 9 章 Linux 用户空间的核心.143 9.1 嵌入式系统中的操作系统和系统关系.143 9.2 C 语言库.144 9.3 Shell 工具 Busybox.147 9.3.1 Busybox 配置和编译.148 9.3.2 Busybox 的源代码结构.150 第 10 章 Linux 用户空间的编程.152 10.1 Linux 用户空间编程概述.152 10.2 文件的相关内容.154 10.2.1 文件的打开、关闭和 读写等.155 10.2.2 文件的控制、映射和 查询等.