第1章 引言 1
1.1为什么使用Linux 1
1.2嵌入式Linux现状 2
1.3开源和GPL 2
1.4标准和相关机构 3
1.4.1LSB 3
1.4.2OSDL 3
1.5小结 4
参考资源 4
第2章 嵌入式初体验 5
2.1需要嵌入式系统吗 5
2.2嵌入式系统剖析 6
2.2.1典型嵌入式Linux系统设置 7
2.2.2启动目标板 8
2.2.3启动内核 9
2.2.4内核初始化概述 10
2.2.5第一个用户空间进程:init 11
2.3存储的思考 12
2.3.1闪存 12
2.3.2NAND闪存 13
2.3.3闪存的用途 14
2.3.4闪存文件系统 14
2.3.5存储器空间 15
2.3.6运行上下文 16
2.3.7进程中的虚拟内存 17
2.3.8交叉开发环境 19
2.4嵌入式Linux的发行版 20
2.4.1Linux商业发行版 21
2.4.2Linux自定义发行版 21
2.5小结 21
参考资源 22
第3章 处理器基础 23
3.1单机处理器 23
3.1.1IBM 970FX 24
3.1.2Intel Pentium M 24
3.1.3Freescale MPC7448 25
3.1.4配套芯片组 25
3.2集成化处理器:片上系统 27
3.2.1PowerPC 27
3.2.2AMCC PowerPC 27
3.2.3Freescale PowerPC 30
3.2.4MIPS 33
3.2.5Broadcom MIPS 33
3.2.6AMD MIPS 34
3.2.7其他类型的MIPS 35
3.2.8ARM 35
3.2.9TI ARM 35
3.2.10Freescale ARM 37
3.2.11Intel ARM XScale 37
3.2.12其他ARM 38
3.2.13其他体系结构 38
3.3硬件平台 38
3.3.1CompactPCI 38
3.3.2ATCA 39
3.4小结 39
参考资源 40
第4章 Linux内核——不同视角 41
4.1背景知识 41
4.1.1内核的版本 42
4.1.2内核源码库 43
4.2Linux内核构造 44
4.2.1顶层资源目录 44
4.2.2编译内核 45
4.2.3严格意义上的内核:vmlinux 46
4.2.4内核映像组件 47
4.2.5子目录结构 50
4.3内核构建系统 50
4.3.1.config文件 51
4.3.2配置编辑器 52
4.3.3makefile的目标 55
4.3.4内核配置 58
4.3.5自定义配置选项 59
4.3.6内核makefile 62
4.3.7内核文档 62
4.4获取Linux内核 63
4.5小结 64
参考资源 64
第5章 内核初始化 65
5.1合成内核映像:piggy及其他 65
5.1.1工mage目标文件 67
5.1.2体系结构相关的目标文件 68
5.1.3第二阶段引导装入程序 69
5.1.4引导信息 69
5.2初始化控制流 72
5.2.1内核入口点:head.o 73
5.2.2内核启动:main.c 74
5.2.3体系结构设置 75
5.3内核命令行处理 75
5.4子系统初始化 80
5.5init线程 82
5.5.1通过initcall初始化 83
5.5.2引导的最后步骤 84
5.6小结 85
参考资源 85
第6章 系统初始化 86
6.1根文件系统 86
6.1.1FHS 87
6.1.2文件系统布局 87
6.1.3最小文件系统 88
6.1.4根文件系统带来的挑战 89
6.1.5试错法 90
6.1.6自动化文件系统构建工具 90
6.2内核的最后引导过程 90
6.2.1用户空间下第一个程序 91
6.2.2解决依赖 92
6.2.3定制初始化进程 92
6.3init进程 92
6.3.1inittab 95
6.3.2Web服务器启动脚本示例 96
6.4初始RAM磁盘 97
6.4.1初始RAM磁盘的目的 98
6.4.2使用initrd引导 98
6.4.3引导装入程序对于initrd的支持 98
6.4.4initrd的奥妙所在:linuxrc文件 100
6.4.5initrd探究 100
6.4.6构建initrd映像文件 101
6.5使用ini tramfs 102
6.6关机 103
6.7小结 103
参考资源 104
第7章 引导装入程序 105
7.1引导装入程序的作用 105
7.2引导装入程序的挑战 106
7.2.1DRAM控制器 106
7.2.2闪存与RAM 106
7.2.3映像的复杂性 107
7.2.4执行上下文 108
7.3通用的引导装入程序:Das U-Boot 109
7.3.1执行上下文 109
7.3.2U-Boot命令集 111
7.3.3网络操作 111
7.3.4存储子系统 113
7.3.5从磁盘启动:U-Boot 113
7.4移植U-Boot 114
7.4.1为EP405开发板移植U-Boot 114
7.4.2U-Boot的makefile配置目标 115
7.4.3EP405处理器初始化 116
7.4.4特定开发板的初始化 117
7.4.5移植概要 120
7.4.6U-Boot映像格式 120
7.5其他引导装入程序 122
7.5.1Lilo 122
7.5.2GRUB 123
7.5.3其他引导装入程序 124
7.6小结 124
参考资源 124
第8章 设备驱动程序基础 126
8.1设备驱动程序基本概念 126
8.1.1可加载模块 127
8.1.2设备驱动程序的体系结构 127
8.1.3最小设备驱动程序示例 128
8.1.4模块构建的基础设施 129
8.1.5安装设备驱动程序 131
8.1.6加载设备驱动程序模块 132
8.2模块实用程序 133
8.2.1insmod 133
8.2.2模块参数 133
8.2.3lsmod 134
8.2.4modprobe 135
8.2.5depmod 136
8.2.6rmmod 136
8.2.7modinfo 137
8.3驱动程序方法 137
8.3.1驱动程序文件系统操作 138
8.3.2设备节点与mknod 140
8.4汇总 141
8.5设备驱动程序与GPL 143
8.6小结 143
参考资源 144
第9章 文件系统 145
9.1Linux文件系统的概念 146
9.2ext2文件系统 147
9.2.1挂载文件系统 148
9.2.2文件系统完整性检查 149
9.3ext3文件系统 150
9.4ReiserFS文件系统 152
9.5JFFS2文件系统 153
9.6cramfs文件系统 155
9.7NFS文件系统 156
9.8伪文件系统 160
9.8.1proc文件系统 160
9.8.2sysfs文件系统 162
9.9其他文件系统 164
9.10构建简单的文件系统 165
9.11小结 166
参考资源 166
第10章 MTD子系统 168
10.1启用MTD服务 168
10.2MTD基础知识 170
10.3MTD分区 172
10.3.1Redboot分区表 173
10.3.2内核命令行分区 176
10.3.3映射驱动程序 177
10.3.4闪存芯片驱动程序 178
10.3.5特定开发板的初始化 179
10.4MTD实用程序 180
10.5小结 184
参考资源 184
第11章 BusyBox 186
11.1BusyBox简介 186
11.2BusyBox配置 187
11.3BusyBox操作 189
11.3.1BusyBox之init 191
11.3.2rcS初始化脚本示例 193
11.3.3在目标平台安装BusyBox 193
11.3.4BusyBox命令 195
11.4小结 196
参考资源 196
第12章 嵌入式开发环境 197
12.1交叉开发环境 197
12.2主机系统需求 200
12.3为目标板提供服务 201
12.3.1TFTP服务器 201
12.3.2BOOTP/DHCP服务器 202
12.3.3NFS服务器 204
12.3.4使用NFS为目标板挂载根文件系统 205
12.3.5U-Boot NFS根挂载示例 206
12.4小结 208
参考资源 208
第13章 开发工具 209
13.1GDB 209
13.1.1调试核心转储 210
13.1.2调用GDB 211
13.1.3GDB调试会话 213
13.2DDD 214
13.3cbrowser/cscope 216
13.4追踪和程序分析工具 217
13.4.1strace 217
13.4.2strace的变体 220
13.4.3ltrace 221
13.4.4ps 222
13.4.5top 224
13.4.6mtrace 225
13.4.7dmalloc 226
13.4.8内核oops 228
13.5二进制实用程序 230
13.5.1readelf 230
13.5.2使用readelf检查调试信息 232
13.5.3objdump 233
13.5.4obj copy 234
13.6其他二进制实用程序 234
13.6.1strip 234
13.6.2addr2line 235
13.6.3strings 235
13.6.4ldd 235
13.6.5nm 236
13.6.6prelink 236
13.7小结 237
参考资源 237
第14章 内核调试技术 238
14.1内核调试的难点 238
14.2使用KGDB调试内核 239
14.2.1KGDB内核配置 240
14.2.2支持KGDB的内核启动 241
14.2.3有用的内核断点 243
14.3Linux内核的调试 244
14.3.1gdb远程串口协议 244
14.3.2调试优化后的内核代码 247
14.3.3gdb用户定义命令 251
14.3.4有用的内核gdb宏 252
14.3.5调试可加载模块 258
14.3.6printk调试 262
14.3.7Magic SysReq键 263
14.4硬件辅助调试 263
14.4.1使用JTAG探测器对闪存编程 265
14.4.2用JTAG探测器进行调试 266
14.5无法启动时 268
14.5.1早期串口调试输出 269
14.5.2转储printk日志缓冲区 270
14.5.3KGDB捕捉崩溃 271
14.6小结 272
参考资源 272
第15章 调试嵌入式Linux应用程序 274
15.1目标机调试 274
15.2远程(交叉)调试 274
15.3使用共享库进行调试 278
15.4多任务调试 282
15.4.1多进程的调试 282
15.4.2多线程应用程序的调试 284
15.4.3引导装入程序/闪存代码的调试 286
15.5远程调试的附加选项 287
15.5.1串行端口调试 287
15.5.2绑定到正在运行的进程 287
15.6小结 288
参考资源 288
第16章 移植Linux 289
16.1Linux源代码的组织 289
16.2为开发板定制Linux 291
16.2.1前提和假设 291
16.2.2定制内核初始化 292
16.2.3静态内核命令行 294
16.3平台初始化 295
16.3.1早期变量访问 298
16.3.2开发板信息结构 299
16.3.3机器相关的调用 301
16.4汇总 302
16.5小结 304
参考资源 304
第17章 Linux与实时 305
17.1什么是实时 305
17.1.1软实时 305
17.1.2硬实时 306
17.1.3Linux调度 306
17.1.4中断延迟 306
17.2内核抢占 307
17.2.1抢占的缺陷 307
17.2.2抢占模型 308
17.2.3SMP内核 309
17.2.4抢占延迟源 310
17.3实时内核补丁 310
17.3.1实时的特性 311
17.3.2O(1)调度器 313
17.3.3创建实时进程 313
17.3.4临界区管理 314
17.4调试实时内核 314
17.4.1软锁检测 314
17.4.2抢占调试 315
17.4.3调试唤醒时间 315
17.4.4唤醒延迟历史 315
17.4.5中断响应时间 316
17.4.6中断响应历史 316
17.4.7延迟跟踪 317
17.4.8调试死锁环境 318
17.4.9锁模式的运行时控制权 319
17.5小结 319
参考资源 319
附录A 可配置的U-Boot命令 320
附录B BusyBox命令 322
附录C SDRAM接口的注意事项 328
附录D 开源项目资源 334
附录E BDI-2000配置文件示例 336