第1部分 基础篇 2
第1章 Linux系统的基本使用方法 2
1.1 Linux系统的使用环境 2
1.1.1 Linux系统的目录结构 3
1.1.2 Linux系统的用户 3
1.2 命令行工作方式 4
1.2.1 终端 4
1.2.2 目录操作 5
1.2.3 文件操作 6
1.2.4 浏览文件 7
1.2.5 打包、压缩和解压 8
1.2.6 进程控制 8
1.2.7 管道与重定向 9
1.2.8 shell脚本程序 10
1.3 规则表达式 11
1.4 与开发相关的常用命令 12
1.4.1 文件比较 12
1.4.2 文本搜索 13
1.4.3 流编辑 13
1.5 文本编辑工具 14
1.5.1 vim工作模式 14
1.5.2 vim常用编辑命令 15
1.5.3 vim高级操作 17
本章练习 17
本章参考资源 18
第2章 Linux系统的主要开发工具 19
2.1 gcc工具链 19
2.1.1 gcc编译器 19
2.1.2 汇编器和链接器 20
2.2 代码分析与转换工具 20
2.2.1 函数地址解析addr2line 21
2.2.2 符号列表nm 21
2.2.3 目标文件转储objdump 22
2.2.4 代码剖析gprof 22
2.2.5 ELF符号解析readelf 24
2.2.6 代码瘦身strip 24
2.3 GNU Make 25
2.3.1 源代码的组织 25
2.3.2 第一个Makefile 27
2.3.3 GNU Make基本规则 27
2.3.4 完善Makefile 28
2.3.5 GNU Make的依赖 30
2.4 开源软件的移植 32
2.4.1 工具准备 32
2.4.2 源代码的组织结构 32
2.4.3 配置编译环境 33
2.4.4 编译和安装 34
2.5 调试工具 34
2.5.1 gdb使用示例 35
2.5.2 远程调试 36
2.6 版本控制系统 37
2.6.1 集中式版本控制系统svn 38
2.6.2 追溯历史、分支与合并 39
2.6.3 分布式版本控制系统git 40
2.6.4 git基本操作 40
2.6.5 git分支与合并 43
2.7 合理地组织程序 44
2.7.1 头文件的要求 44
2.7.2 C语言源文件 45
2.7.3 库的产生和作用 45
2.7.4 项目的目录组织结构 47
2.8 交叉编译工具链的制作 47
本章练习 52
本章参考资源 52
第3章 文件读写 53
3.1 文件系统的概念 53
3.2 文件与目录 54
3.2.1 Linux系统中的虚拟文件系统 54
3.2.2 Linux系统的文件类型 54
3.2.3 改变文件属性 56
3.3 文件描述符 57
3.3.1 标准I/O设备 57
3.3.2 有关文件操作的系统功能调用 58
3.3.3 文件描述符复制 59
3.3.4 文件描述符操作 59
3.3.5 文件共享与读写冲突 60
3.4 标准I/O库的文件操作 61
3.4.1 打开文件 61
3.4.2 文件流读写 62
3.4.3 文件流定位 63
3.4.4 格式化I/O文件操作函数 64
本章练习 64
本章参考资源 65
第4章 多任务机制 66
4.1 理解进程的概念 66
4.1.1 什么是进程 66
4.1.2 进程的状态 66
4.1.3 进程的创建和结束 67
4.1.4 创建进程的例子 68
4.2 进程间的数据交换 69
4.2.1 管道 69
4.2.2 共享内存 71
4.2.3 消息队列 73
4.3 守护进程 75
4.4 线程——轻量级进程 77
4.5 线程的竞争与同步 78
4.5.1 互斥锁 78
4.5.2 信号和信号量 79
4.5.3 进程与线程的对比 81
本章练习 81
本章参考资源 82
第5章 网络套接字编程 83
5.1 套接字API 83
5.1.1 两种类型的套接口 83
5.1.2 网络协议分层 84
5.1.3 关闭套接口 84
5.2 TCP网络程序分析 85
5.2.1 网络地址 86
5.2.2 端口 86
5.3 TCP服务器程序设计 88
5.4 简单的数据流对话 90
5.5 多任务数据流对话 95
5.6 基于数据报的对话程序 97
本章练习 100
本章参考资源 100
第6章 模块与设备驱动 101
6.1 设备驱动程序简介 101
6.1.1 内核功能划分 101
6.1.2 设备驱动程序的作用 102
6.1.3 设备和模块分类 102
6.2 构建和运行模块 103
6.2.1 第一个示例模块 103
6.2.2 模块的编译 104
6.2.3 模块的运行 105
6.2.4 内核模块与应用程序 105
6.3 模块的结构 106
6.3.1 模块的初始化和清除函数 107
6.3.2 内核符号表 108
6.3.3 模块的卸载 108
6.3.4 资源使用 109
6.4 字符设备驱动程序 112
6.4.1 timer的设计 112
6.4.2 文件操作 115
6.4.3 打开设备 117
6.4.4 I/O控制 124
6.4.5 阻塞型I/O 130
6.5 设备驱动程序的使用 133
6.5.1 驱动程序与应用程序 133
6.5.2 内核源码中的模块结构 134
6.5.3 将模块加入内核 135
6.6 调试技术 135
6.6.1 输出调试 136
6.6.2 查询调试 139
6.6.3 监视调试 142
6.6.4 故障调试 142
6.6.5 使用gdb调试工具 143
6.6.6 使用内核调试工具 144
6.7 硬件管理与中断处理 145
6.7.1 I/O寄存器和常规内存 145
6.7.2 中断 150
6.8 内核的定时 152
6.8.1 时间间隔 152
6.8.2 获取当前时间 154
6.8.3 延迟执行 156
6.8.4 定时器 157
本章练习 161
本章参考资源 161
第7章 嵌入式Linux系统开发 162
7.1 引导装载程序 162
7.2 内核设置 163
7.2.1 内核布局 164
7.2.2 内核链接和装入 164
7.2.3 参数传递和内核引导 165
7.3 设备驱动程序 166
7.3.1 帧缓冲区驱动程序 167
7.3.2 输入设备驱动程序 167
7.3.3 MTD驱动程序 167
7.3.4 MTD驱动程序设置 168
7.4 嵌入式设备的文件系统 169
7.4.1 扩展文件系统 169
7.4.2 日志闪存文件系统的第2版(JFFS2) 170
7.4.3 tmpfs 171
7.5 图形用户界面(GUI) 172
7.5.1 XFree86 4.X(带帧缓冲区支持的X11R6) 172
7.5.2 Microwindows 173
7.5.3 Microwindows上的FLTK API 173
7.5.4 Qt/Embedded 174
7.6 帧缓冲 174
第8章 GUI程序设计初步 177
8.1 基本组件介绍 177
8.1.1 一个简单的图形接口程序 177
8.1.2 按钮类组件 180
8.1.3 数据类组件 183
8.1.4 菜单栏与工具栏 184
8.2 画图区 185
8.3 界面布局方法 186
8.3.1 盒子 187
8.3.2 表格 188
8.3.3 对位 188
8.3.4 便签 188
8.3.5 对话框 188
8.4 GTK+界面设计工具 189
本章练习 191
本章参考资源 191
第2部分 实验篇 194
第9章 实验系统介绍 194
9.1 实验系统性能概括 194
9.2 软件 195
9.2.1 交叉编译工具链 195
9.2.2 工具链安装 195
9.2.3 嵌入式操作系统软件 195
9.3 实验系统搭建 196
第10章 嵌入式系统开发实验 197
10.1 实验目的 197
10.2 嵌入式系统开发过程 197
10.2.1 串口设置(使用minicom) 198
10.2.2 TFTP(简单文件传输协议) 199
10.2.3 NFS服务器架设 200
10.2.4 编译应用程序 200
10.3 实验报告要求 201
第11章 引导加载器 202
11.1 实验目的 202
11.2 BootLoader 202
11.2.1 BootLoader的作用 202
11.2.2 BootLoader程序结构框架 202
11.3 实验内容 203
11.3.1 获取U-Boot 203
11.3.2 配置BootLoader选项 203
11.3.3 制作TF卡 204
11.4 实验报告要求 204
第12章 内核配置和编译 205
12.1 实验目的 205
12.2 相关知识 205
12.2.1 内核源代码目录结构 205
12.2.2 内核配置的基本结构 205
12.2.3 编译规则Makefile 205
12.3 编译内核 206
12.3.1 Makefile的选项参数 206
12.3.2 内核配置项介绍 207
12.4 实验内容 208
12.5 实验报告要求 208
第13章 根文件系统的构建 209
13.1 实验目的 209
13.2 Linux文件系统的类型 209
13.2.1 EXT文件系统 209
13.2.2 NFS文件系统 210
13.2.3 JFFS2文件系统 210
13.2.4 YAFFS2 211
13.2.5 RAM Disk 211
13.3 文件系统的制作 212
13.3.1 BusyBox介绍 212
13.3.2 BusyBox的编译 212
13.3.3 配置文件系统 212
13.3.4 制作ramdisk文件镜像 214
13.3.5 制作init ramfs 215
13.4 实验内容 216
13.5 实验报告要求 216
第14章 图形用户接口 217
14.1 实验目的 217
14.2 原理概述 217
14.2.1 帧缓冲设备 217
14.2.2 帧缓冲与色彩 218
14.2.3 LCD控制器 218
14.2.4 帧缓冲设备操作 218
14.3 实验内容 220
14.3.1 实现基本画图功能 220
14.3.2 合理的软件结构 220
14.4 实验报告要求 220
第15章 音频接口程序设计 221
15.1 实验目的 221
15.2 接口介绍 221
15.3 应用软件设计 221
15.3.1 OSS 221
15.3.2 ALSA 222
15.4 实验内容 223
15.5 实验报告要求 223
第16章 嵌入式系统中的I/O接口驱动 224
16.1 实验目的 224
16.2 接口电路介绍 224
16.3 I/O端口地址映射 224
16.4 LED控制 225
16.5 实验内容 225
16.6 实验报告要求 226
第17章 触摸屏移植 227
17.1 实验目的 227
17.2 Linux系统的触摸屏支持 227
17.2.1 触摸屏的基本原理 227
17.2.2 内核配置 227
17.2.3 触摸屏库tslib 227
17.2.4 触摸屏库的安装和测试 228
17.3 实验内容 229
17.4 实验报告要求 229
第18章 Qt/Embedded移植 230
18.1 实验目的 230
18.2 Qt/Embedded介绍 230
18.2.1 Qt/Embedded软件包结构 230
18.2.2 编译环境设置 230
18.2.3 编译过程 231
18.2.4 Qt/Embedded的安装 232
18.2.5 Qt-4.8版本编译 233
18.3 实验要求 234
18.4 实验报告要求 235
第19章 MPlayer移植 236
19.1 实验目的 236
19.2 软件介绍 236
19.3 编译准备 236
19.4 编译 236
19.5 扩展功能 237
19.6 实验报告要求 237
第20章 GTK+移植 238
20.1 实验目的 238
20.2 GTK+的背景 238
20.3 GTK+库的依赖关系 238
20.4 编译过程 240
20.4.1 编译准备 240
20.4.2 一般方法 240
20.4.3 环境变量 241
20.4.4 一些特殊的设置 242
20.4.5 编译技巧 243
20.5 测试 244
20.6 实验要求 244
20.7 实验报告要求 244
第21章 实时操作系统RTEMS 245
21.1 实验目的 245
21.2 实时操作系统RTEMS简介 245
21.3 编译RTEMS 246
21.4 启用RTEMS终端 247
21.5 实验报告要求 247