目 录
第 1 章 概述.................................................................................................................................... 1
1.1 嵌入式系统....................................................................................................................... 1
1.2 嵌入式操作系统............................................................................................................... 2
1.3 嵌入式 Linux 历史 ........................................................................................................... 4
1.4 嵌入式 Linux 开发环境 ................................................................................................... 5
1.5 嵌入式 Linux 系统开发要点 ........................................................................................... 7
第 2 章 ARM 处理器....................................................................................................................... 8
2.1 ARM 处理器简介............................................................................................................. 8
2.1.1 ARM 公司简介...................................................................................................... 9
2.1.2 ARM 处理器体系结构........................................................................................ 10
2.1.3 Linux 与 ARM 处理器 ........................................................................................ 12
2.2 ARM 指令集................................................................................................................... 13
2.2.1 ARM 微处理器的指令集概述............................................................................ 13
2.2.2 ARM 指令寻址方式............................................................................................ 15
2.2.3 Thumb 指令概述 ................................................................................................. 17
2.3 典型 ARM 处理器简介.................................................................................................. 17
2.3.1 Atmel AT91RM9200............................................................................................ 17
2.3.2 Samsung S3C2410 ............................................................................................... 18
2.3.3 TI OMAP1510/1610 系列 ................................................................................... 19
2.3.4 Freescale i.Max21 ................................................................................................ 22
2.3.5 Intel Xscale PXA 系列......................................................................................... 23
2.4 三星 S3C2410 开发板.................................................................................................... 24
2.4.1 三星 S3C2410 开发板介绍................................................................................. 24
2.4.2 众多的开发板供应商.......................................................................................... 26
第 3 章 Linux 编程环境................................................................................................................ 28
║2 嵌入式
系统开发技术详解——基于ARM
3.1 Linux 常用工具 .............................................................................................................. 28
3.1.1 Shell 简介 ............................................................................................................ 28
3.1.2 常用 Shell 命令.................................................................................................... 30
3.1.3 编写 Shell 脚本.................................................................................................... 38
3.1.4 正则表达式.......................................................................................................... 42
3.1.5 程序编辑器.......................................................................................................... 44
3.2 Makefile .......................................................................................................................... 48
3.2.1 GNU make ........................................................................................................... 48
3.2.2 Makefile 规则语法 .............................................................................................. 49
3.2.3 Makefile 文件中变量的使用 .............................................................................. 51
3.3 二进制代码工具的使用................................................................................................. 52
3.3.1 GNU Binutils 工具介绍....................................................................................... 52
3.3.2 Binutils 工具软件使用 ........................................................................................ 54
3.4 编译器 GCC 的使用....................................................................................................... 54
3.4.1 GCC 编译器介绍................................................................................................. 54
3.4.2 GCC 编译选项解析............................................................................................. 56
3.5 调试器 GDB 的使用技巧 .............................................................................................. 60
3.5.1 GDB 调试器介绍 ................................................................................................ 60
3.5.2 GDB 调试命令 .................................................................................................... 61
3.6 Linux 编程库 .................................................................................................................. 66
3.6.1 Linux 编程库介绍 ............................................................................................... 66
3.6.2 Linux 系统调用 ................................................................................................... 67
3.6.3 Linux 线程库 ....................................................................................................... 70
第 4 章 交叉开发环境.................................................................................................................. 73
4.1 交叉开发环境介绍......................................................................................................... 73
4.1.1 交叉开发概念模型.............................................................................................. 73
4.1.2 目标板与主机之间的连接.................................................................................. 75
4.1.3 文件传输.............................................................................................................. 76
4.1.4 网络文件系统...................................................................................................... 77
4.2 安装交叉编译工具......................................................................................................... 78
4.2.1 获取交叉开发工具链.......................................................................................... 78
4.2.2 主机安装工具链.................................................................................................. 79
4.3 主机开发环境配置......................................................................................................... 80
4.3.1 主机环境配置...................................................................................................... 80
4.3.2 串口控制台工具.................................................................................................. 81
4.3.3 DHCP 服务.......................................................................................................... 84
4.3.4 TFTP 服务 ........................................................................................................... 85
4.3.5 NFS 服务 ............................................................................................................. 86
第 1 章 目录 3 ║
4.4 启动目标板..................................................................................................................... 88
4.4.1 系统引导过程...................................................................................................... 88
4.4.2 内核解压启动...................................................................................................... 89
4.4.3 挂接根文件系统.................................................................................................. 90
4.5 应用程序的远程交叉调试............................................................................................. 91
4.5.1 交叉调试的模型.................................................................................................. 91
4.5.2 交叉调试程序实例.............................................................................................. 92
第 5 章 交叉开发工具链.............................................................................................................. 94
5.1 工具链软件..................................................................................................................... 94
5.1.1 相关软件工程...................................................................................................... 94
5.1.2 软件版本的匹配.................................................................................................. 95
5.1.3 工具链制作流程.................................................................................................. 97
5.2 制作交叉编译器............................................................................................................. 98
5.2.1 准备编译环境...................................................................................................... 98
5.2.2 编译 binutils......................................................................................................... 99
5.2.3 编译 GCC 的辅助编译器.................................................................................. 100
5.2.4 编译生成 glibc 库.............................................................................................. 101
5.2.5 编译生成完整的 GCC 编译器.......................................................................... 105
5.3 制作交叉调试器........................................................................................................... 106
5.3.1 编译交叉调试器................................................................................................ 106
5.3.2 编译 gdbserver................................................................................................... 106
第 6 章 Bootloader ...................................................................................................................... 108
6.1 Bootloader ..................................................................................................................... 108
6.1.1 Bootloader 介绍................................................................................................. 108
6.1.2 Bootloader 的启动............................................................................................. 109
6.1.3 Bootloader 的种类..............................................................................................111
6.2 U-Boot 编程...................................................................................................................113
6.2.1 U-Boot 工程简介................................................................................................113
6.2.2 U-Boot 源码结构................................................................................................113
6.2.3 U-Boot 的编译....................................................................................................114
6.2.4 U-Boot 的移植....................................................................................................117
6.2.5 添加 U-Boot 命令...............................................................................................118
6.3 U-Boot 的调试.............................................................................................................. 121
6.3.1 硬件调试器........................................................................................................ 121
6.3.2 软件跟踪............................................................................................................ 121
6.3.3 U-Boot 启动过程............................................................................................... 123
6.3.4 U-Boot 与内核的关系....................................................................................... 128
║4 嵌入式
系统开发技术详解——基于ARM
6.4 使用 U-Boot.................................................................................................................. 133
6.4.1 烧写 U-Boot 到 Flash ........................................................................................ 134
6.4.2 U-Boot 的常用命令........................................................................................... 134
6.4.3 U-Boot 的环境变量........................................................................................... 141
第 7 章 配置编译内核................................................................................................................ 143
7.1 Linux 内核特点 ............................................................................................................ 143
7.1.1 Linux 内核版本介绍 ......................................................................................... 143
7.1.2 Linux 内核特点 ................................................................................................. 143
7.1.3 Linux 2.6 内核新特性 ....................................................................................... 144
7.2 配置编译内核源码....................................................................................................... 147
7.2.1 内核源码结构.................................................................................................... 148
7.2.2 内核配置系统.................................................................................................... 150
7.2.3 Kbuild Makefile ................................................................................................. 157
7.2.4 内核编译............................................................................................................ 169
7.2.5 内核编译结果.................................................................................................... 179
7.3 内核配置选项............................................................................................................... 180
7.3.1 使用配置菜单.................................................................................................... 180
7.3.2 基本配置选项.................................................................................................... 181
7.3.3 驱动程序配置选项............................................................................................ 183
第 8 章 内核移植浅析................................................................................................................ 185
8.1 移植内核源码............................................................................................................... 185
8.1.1 移植前的准备工作............................................................................................ 185
8.1.2 开发板内核移植................................................................................................ 186
8.1.3 移植后的工作.................................................................................................... 194
8.2 Linux 内核启动过程分析 ............................................................................................ 194
8.2.1 内核启动流程源代码分析................................................................................ 194
8.2.2 内核自引导程序................................................................................................ 195
8.2.3 内核 vmlinux 入口 ............................................................................................ 199
8.2.4 Linux 系统初始化 ............................................................................................. 201
8.2.5 挂接根文件系统................................................................................................ 206
8.2.6 初始化设备驱动................................................................................................ 208
8.2.7 启动用户空间 init 进程..................................................................................... 209
第 9 章 内核调试技术................................................................................................................ 212
9.1 内核调试方法............................................................................................................... 212
9.1.1 内核调试概述.................................................................................................... 212
9.1.2 学会分析内核源程序........................................................................................ 213
第 1 章 目录 5 ║
9.1.3 调试方法介绍.................................................................................................... 213
9.2 内核打印函数............................................................................................................... 216
9.2.1 内核映像解压前的串口输出函数.................................................................... 216
9.2.2 内核错误报告子程序........................................................................................ 218
9.2.3 内核打印函数.................................................................................................... 220
9.3 获取内核信息............................................................................................................... 227
9.3.1 系统请求键........................................................................................................ 227
9.3.2 通过/proc 接口................................................................................................... 228
9.3.3 通过/sys 接口..................................................................................................... 229
9.3.4 通过 ioctl 方法................................................................................................... 232
9.4 处理出错信息............................................................................................................... 233
9.4.1 oops 信息 ........................................................................................................... 233
9.4.2 panic ................................................................................................................... 234
9.5 内核源码调试............................................................................................................... 236
9.5.1 KGDB 调试内核源代码.................................................................................... 236
9.5.2 BDI2000 调试内核源代码................................................................................ 237
第 10 章 制作 Linux 根文件系统............................................................................................... 242
10.1 根文件系统目录结构................................................................................................. 242
10.1.1 FHS 目录结构 ................................................................................................. 243
10.1.2 文件存放规则.................................................................................................. 246
10.2 添加系统文件............................................................................................................. 247
10.2.1 添加共享链接库.............................................................................................. 247
10.2.2 添加内核模块.................................................................................................. 249
10.2.3 添加设备文件.................................................................................................. 251
10.3 init 系统初始化过程 .................................................................................................. 253
10.3.1 inittab 文件....................................................................................................... 253
10.3.2 System V init 启动过程................................................................................... 256
10.3.3 Busybox init 启动过程分析 ............................................................................ 258
10.4 定制文件系统............................................................................................................. 260
10.4.1 定制应用程序.................................................................................................. 260
10.4.2 配置应用程序自动启动.................................................................................. 260
第 11 章 充分利用开源软件...................................................................................................... 262
11.1 开放源代码工程介绍................................................................................................. 262
11.1.1 Linux 系统和开源软件 ................................................................................... 263
11.1.2 开源软件的特点.............................................................................................. 264
11.2 Busybox 使用.............................................................................................................. 265
11.2.1 Busybox 工程介绍........................................................................................... 265
║6 嵌入式
系统开发技术详解——基于ARM
11.2.2 配置编译 Busybox........................................................................................... 265
11.3 X11 图形系统 ............................................................................................................. 270
11.3.1 X Windows 介绍.............................................................................................. 270
11.3.2 Tiny-X 介绍 ..................................................................................................... 270
11.3.3 GTK 图形库..................................................................................................... 271
11.4 Qt 图形库.................................................................................................................... 277
11.4.1 Qt 介绍............................................................................................................. 277
11.4.2 Qt/Embedded 介绍........................................................................................... 278
11.4.3 Qt/Embedded 架构........................................................................................... 280
11.4.4 Qt/Embedded 软件包与安装........................................................................... 281
11.5 MiniGUI 图形系统 ..................................................................................................... 283
11.5.1 MiniGUI 图形系统概述 .................................................................................. 283
11.5.2 MiniGUI 移植 .................................................................................................. 285
11.6 MicroWindows 图形系统 ........................................................................................... 290
11.7 Linux 下的网络应用 .................................................................................................. 292
11.7.1 嵌入式设备的网络化...................................................................................... 292
11.7.2 TCP/IP 协议概述............................................................................................. 292
11.7.3 Linux 下的 Socket 编程 .................................................................................. 294
11.8 嵌入式 Linux 的串行通信 ......................................................................................... 304
11.8.1 Linux 下的串口操作 ....................................................................................... 304
11.8.2 Linux 串口编程实例 ....................................................................................... 309
第 12 章 系统集成测试.............................................................................................................. 314
12.1 系统集成测试............................................................................................................. 314
12.1.1 系统集成测试概述.......................................................................................... 314
12.1.2 系统集成测试要求.......................................................................................... 315
12.2 系统跟踪工具............................................................................................................. 315
12.2.1 为什么需要跟踪工具...................................................................................... 315
12.2.2 Strace ................................................................................................................ 316
12.2.3 Ltrace ............................................................................................................... 316
12.2.4 LTT ................................................................................................................... 317
12.3 系统性能测量工具..................................................................................................... 321
12.3.1 代码效率测量.................................................................................................. 321
12.3.2 LTP ................................................................................................................... 324
12.3.3 LMbench .......................................................................................................... 325
12.4 测量内存泄漏............................................................................................................. 326
12.4.1 mtrace ............................................................................................................... 326
12.4.2 dmalloc ............................................................................................................. 327
12.4.3 memwatch ........................................................................................................ 328
第 1 章 目录 7 ║
12.4.4 YAMD .............................................................................................................. 330
第 13 章 部署 Linux 系统........................................................................................................... 333
13.1 部署 Linux 系统概述 ................................................................................................. 333
13.1.1 部署 Linux 系统的基本流程 .......................................................................... 333
13.1.2 部署 Linux 系统的关键问题 .......................................................................... 334
13.2 文件系统类型............................................................................................................. 335
13.2.1 EXT2/EXT3 ..................................................................................................... 335
13.2.2 JFS .................................................................................................................... 337
13.2.3 cramfs ............................................................................................................... 339
13.2.4 JFFS/JFFS2 ...................................................................................................... 340
13.2.5 YAFFS .............................................................................................................. 341
13.3 存储设备..................................................................................................................... 343
13.3.1 MTD 类型设备................................................................................................ 343
13.3.2 磁盘类型设备.................................................................................................. 344
13.4 部署 Linux 系统 ......................................................................................................... 346
13.4.1 安装 MTD 工具............................................................................................... 346
13.4.2 使用磁盘文件系统.......................................................................................... 347
13.4.3 使用 RAMDISK 设备 ..................................................................................... 348
13.4.4 使用 MTD 设备和 JFFS2 文件系统............................................................... 349
13.4.5 系统启动和升级.............................................................................................. 351
第 14 章 系统设计开发实例...................................................................................................... 352
14.1 需求分析..................................................................................................................... 352
14.2 系统硬件设计............................................................................................................. 354
14.3 系统软件设计............................................................................................................. 364
14.4 系统集成与部署......................................................................................................... 366
前 言
随着 Linux 操作系统的发展,特别是 Linux 2.6 内核的迅速发展,嵌入式Linux 在嵌入式
领域的应用越来越广泛。Linux 具备源码开放、内核稳定高效、软件丰富等优势,而且还具
备支持广泛的处理器结构和硬件平台、可定制性好、可靠性高等特点。据 IDC 的报告显示,
嵌入式 Linux 在未来两年将占嵌入式操作系统市场份额的 50%,约 3.5 亿美元,由此产生的
应用市场前景更是不可估量。
正是由于市场的需求,嵌入式领域也需要大量的嵌入式 Linux 开发者。目前国内 Linux
程序员的素质和数量还不能满足企业的需要。
编写目的
大学计算机相关专业课程都已经包含计算机组成原理、计算机编程语言、计算机体系结
构、计算机操作系统,甚至还包括电子技术和半导体技术。尽管已经具备这些嵌入式 Linux
系统的基础知识,但是多数大学毕业生不清楚到底该如何开发嵌入式 Linux 系统。
编写本书的目的就是阐述嵌入式 Linux 系统的各组成部分,从概念上和实践上说明嵌入
式 Linux 系统开发的基本过程。这本书可以帮助具备计算机基础知识的开发者迅速进入嵌入
式系统开发领域。
希望本书能够帮助读者更好地理解嵌入式 Linux 系统,并且参与到嵌入式 Linux 系统开
发中来。
主要内容
本书以嵌入式 Linux 系统开发流程为主线,剖析了嵌入式 Linux 系统构建的各个环节。
从嵌入式系统基础知识和 Linux 编程技术讲起,接下来说明了建立嵌入式 Linux 交叉开发环
境,然后分析了嵌入式 Linux 系统的引导程序、内核和文件系统三大组成部分,最后介绍了
嵌入式 Linux 系统集成和部署的方法。
第 1 章介绍了嵌入式系统和嵌入式操作系统的概况,讲述了嵌入式 Linux 发展历史和开
发环境,概括说明了嵌入式 Linux 系统开发的特点。
第 2 章描述了 ARM 体系结构和 ARM Linux 的发展,介绍了几种应用 Linux 的典型 ARM
处理器和开发板。