嵌入式Linux基础教程

嵌入式Linux基础教程
作 者: 哈利南 华清远见嵌入式培训中心
出版社: 人民邮电出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: LINUX
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  Christopher Hallinan,著名嵌入式Linux技术专家。Monta Vistata件公司现场应用工程师,曾任3Com公司工程总监。他有25年以上网络和通信产品的软硬件开发经验,曾担任Linux咨询师,提供定制Linux主板接口、设备驱动程序和引导装入程序等方面的解决方案。译者简介:华清远见嵌入式培训中心(http://www.farsight.com.cn)是享有盛誉的嵌入式高端培训企业,目前已成为ARM、Altera、Atmel、Microsoft、Symbian等全球知名嵌入式企业授权培训中心。每年为Samsung、NEC、Philips、Motorola等世界500强企业提供嵌入式技术企业培训服务,同时也致力于推广与普及嵌入式技术。数万名技术人员由此受益。

内容简介

《嵌入式Linux基础教程》是嵌入式Linux的经典教程,介绍了引导装入程序、系统初始化、文件系统、闪存和内核、应用程序调试技巧等,还讲述了构建Linux系统的工作原理,用于驱动不同体系结构的配置,Linux内核源码树的特性,如何根据需求配制内核运行时的行为,如何扩展系统功能等内容。更重要的是,《嵌入式Linux基础教程》阐述了如何修改系统使之满足读者自己的需求,使读者能从中学习一些嵌入式工程中非常有用的提示和技巧。《嵌入式Linux基础教程》适合Linux程序员阅读,也可作为高等院校相关专业师生的参考读物。

图书目录

第1章 引言 1

1.1 为什么使用Linux 1

1.2 嵌入式Linux现状 2

1.3 开源和GPL 2

1.4 标准和相关机构 3

1.4.1 LSB 3

1.4.2 OSDL 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.2 NAND闪存 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.1 Linux商业发行版 21

2.4.2 Linux自定义发行版 21

2.5 小结 21

参考资源 22

第3章 处理器基础 23

3.1 单机处理器 23

3.1.1 IBM 970FX 24

3.1.2 Intel Pentium M 24

3.1.3 Freescale MPC7448 25

3.1.4 配套芯片组 25

3.2 集成化处理器:片上系统 27

3.2.1 PowerPC 27

3.2.2 AMCC PowerPC 27

3.2.3 Freescale PowerPC 30

3.2.4 MIPS 33

3.2.5 Broadcom MIPS 33

3.2.6 AMD MIPS 34

3.2.7 其他类型的MIPS 35

3.2.8 ARM 35

3.2.9 TI ARM 35

3.2.10 Freescale ARM 37

3.2.11 Intel ARM XScale 37

3.2.12 其他ARM 38

3.2.13 其他体系结构 38

3.3 硬件平台 38

3.3.1 CompactPCI 38

3.3.2 ATCA 39

3.4 小结 39

参考资源 40

第4章 Linux内核——不同视角 41

4.1 背景知识 41

4.1.1 内核的版本 42

4.1.2 内核源码库 43

4.2 Linux内核构造 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.3 makefile的目标 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 Image目标文件 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.5 init线程 82

5.5.1 通过initcall初始化 83

5.5.2 引导的最后步骤 84

5.6 小结 85

参考资源 85

第6章 系统初始化 86

6.1 根文件系统 86

6.1.1 FHS 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.3 init进程 92

6.3.1 inittab 95

6.3.2 Web服务器启动脚本示例 96

6.4 初始RAM磁盘 97

6.4.1 初始RAM磁盘的目的 98

6.4.2 使用initrd引导 98

6.4.3 引导装入程序对于initrd的支持 98

6.4.4 initrd的奥妙所在:linuxrc文件 100

6.4.5 initrd探究 100

6.4.6 构建initrd映像文件 101

6.5 使用initramfs 102

6.6 关机 103

6.7 小结 103

参考资源 104

第7章 引导装入程序 105

7.1 引导装入程序的作用 105

7.2 引导装入程序的挑战 106

7.2.1 DRAM控制器 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.2 U-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.2 U-Boot的makefile配置目标 115

7.4.3 EP405处理器初始化 116

7.4.4 特定开发板的初始化 117

7.4.5 移植概要 120

7.4.6 U-Boot映像格式 120

7.5 其他引导装入程序 122

7.5.1 Lilo 122

7.5.2 GRUB 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.1 insmod 133

8.2.2 模块参数 133

8.2.3 lsmod 134

8.2.4 modprobe 135

8.2.5 depmod 136

8.2.6 rmmod 136

8.2.7 modinfo 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.1 Linux文件系统的概念 146

9.2 ext2文件系统 147

9.2.1 挂载文件系统 148

9.2.2 文件系统完整性检查 149

9.3 ext3文件系统 150

9.4 ReiserFS文件系统 152

9.5 JFFS2文件系统 153

9.6 cramfs文件系统 155

9.7 NFS文件系统 156

9.8 伪文件系统 160

9.8.1 proc文件系统 160

9.8.2 sysfs文件系统 162

9.9 其他文件系统 164

9.10 构建简单的文件系统 165

9.11 小结 166

参考资源 166

第10章 MTD子系统 168

10.1 启用MTD服务 168

10.2 MTD基础知识 170

10.3 MTD分区 172

10.3.1 Redboot分区表 173

10.3.2 内核命令行分区 176

10.3.3 映射驱动程序 177

10.3.4 闪存芯片驱动程序 178

10.3.5 特定开发板的初始化 179

10.4 MTD实用程序 180

10.5 小结 184

参考资源 184

第11章 BusyBox 186

11.1 BusyBox简介 186

11.2 BusyBox配置 187

11.3 BusyBox操作 189

11.3.1 BusyBox之init 191

11.3.2 rcS初始化脚本示例 193

11.3.3 在目标平台安装BusyBox 193

11.3.4 BusyBox命令 195

11.4 小结 196

参考资源 196

第12章 嵌入式开发环境 197

12.1 交叉开发环境 197

12.2 主机系统需求 200

12.3 为目标板提供服务 201

12.3.1 TFTP服务器 201

12.3.2 BOOTP/DHCP服务器 202

12.3.3 NFS服务器 204

12.3.4 使用NFS为目标板挂载根文件系统 205

12.3.5 U-Boot NFS根挂载示例 206

12.4 小结 208

参考资源 208

第13章 开发工具 209

13.1 GDB 209

13.1.1 调试核心转储 210

13.1.2 调用GDB 211

13.1.3 GDB调试会话 213

13.2 DDD 214

13.3 cbrowser/cscope 216

13.4 追踪和程序分析工具 217

13.4.1 strace 217

13.4.2 strace的变体 220

13.4.3 ltrace 221

13.4.4 ps 222

13.4.5 top 224

13.4.6 mtrace 225

13.4.7 dmalloc 226

13.4.8 内核oops 228

13.5 二进制实用程序 230

13.5.1 readelf 230

13.5.2 使用readelf检查调试信息 232

13.5.3 objdump 233

13.5.4 objcopy 234

13.6 其他二进制实用程序 234

13.6.1 strip 234

13.6.2 addr2line 235

13.6.3 strings 235

13.6.4 ldd 235

13.6.5 nm 236

13.6.6 prelink 236

13.7 小结 237

参考资源 237

第14章 内核调试技术 238

14.1 内核调试的难点 238

14.2 使用KGDB调试内核 239

14.2.1 KGDB内核配置 240

14.2.2 支持KGDB的内核启动 241

14.2.3 有用的内核断点 243

14.3 Linux内核的调试 244

14.3.1 gdb远程串口协议 244

14.3.2 调试优化后的内核代码 247

14.3.3 gdb用户定义命令 251

14.3.4 有用的内核gdb宏 252

14.3.5 调试可加载模块 258

14.3.6 printk调试 262

14.3.7 Magic 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.3 KGDB捕捉崩溃 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.1 Linux源代码的组织 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.3 Linux 调度 306

17.1.4 中断延迟 306

17.2 内核抢占 307

17.2.1 抢占的缺陷 307

17.2.2 抢占模型 308

17.2.3 SMP内核 309

17.2.4 抢占延迟源 310

17.3 实时内核补丁 310

17.3.1 实时的特性 311

17.3.2 O(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