第一章 嵌入式操作系统 1
1.1 嵌入式操作系统 1
1.1.1 嵌入式操作系统的特点 1
1.1.2 嵌入式操作系统的分类 2
1.2 实时操作系统 4
1.2.1 实时操作系统与通用操作系统的比较 4
1.2.2 实时操作系统的评价指标 6
1.3 基于Linux的嵌入式操作系统 7
1.3.1 ARMLinux简介 8
1.3.2 uClinux简介 9
1.4 嵌入式系统设计方法 10
1.4.1 嵌入式系统开发的特点 10
1.4.2 嵌入式系统开发的流程 12
第二章 搭建Linux交叉编译开发环境 14
2.1 什么是交叉编译 14
2.2 建立交叉编译开发工具链 15
2.2.1 编译工具链 15
2.2.2 下载工具链 23
2.2.3 验证工具链 26
2.3 配置主机服务 27
2.3.1 配置samba 27
2.3.2 配置DHCP 28
2.3.3 配置TFTP 30
2.3.4 配置NFS 31
第三章 GNU开发工具的使用方法 33
3.1 vi使用说明 33
3.1.1 vi简介 33
3.1.2 vi的基本命令 34
3.2 编写makefile 37
3.2.1 什么是makefile 37
3.2.2 make命令 39
3.2.3 隐含规则 40
3.3 使用gee 42
3.3.1 gcc的用法 42
3.3.2 gcc选项 43
3.4 库文件的管理与使用 49
3.4.1 库文件命名 49
3.4.2 库文件操作 50
3.4.3 库文件升级 51
3.4.4 库文件的使用 52
3.5 调试工具的使用 53
3.5.1 kdb的使用 53
3.5.2 gdb的使用 57
3.6 仿真器的使用 60
3.6.1 Multi-ICE Server状态 60
3.6.2 Multi-ICE Server配置 63
3.6.3 ADS V1.2配合Multi-ICE调试 64
第四章 BootLoader(VIVI)移植 68
4.1 BootLoader简介 68
4.1.1 BootLoader的概念 68
4.1.2 BootLoader的启动过程 70
4.2 VIVI概述 75
4.3 VIVI的配置和编译 75
4.4 VIVI代码导读 77
4.4.1 阶段1:arch/s3c2410/head.S 77
4.4.2 阶段2:init/main.c 78
第五章 ARM Linux内核移植 101
5.1 内核结构 101
5.1.1 系统组成 101
5.1.2 代码目录结构 102
5.1.3 内核代码阅读 103
5.2 内核启动流程 104
5.2.1 “vmlinux-armv.lds.in”和“head-armv.S” 104
5.2.2 start_ kernel()函数 107
5.3 定制Linux内核 108
5.3.1 裁剪、配置内核 109
5.3.2 编译内核 115
5.4 将内核下载到目标板上 115
第六章 Linux中断处理程序开发 119
6.1 中断处理程序概述 119
6.1.1 中断的产生 119
6.1.2 IRQ(Interrupt Requirement) 120
6.1.3 中断处理程序 120
6.1.4 置中断标志位 121
6.1.5 中断处理程序的不可重入性 121
6.1.6 避免竞争条件的出现 122
6.2 ARM处理器中断处理 123
6.2.1 ARM处理器异常中断处理概述 123
6.2.2 支持中断跳转的解析程序 123
6.3 中断处理程序架构 126
6.4 时钟中断与看门狗技术 129
6.4.1 时钟中断与定时器的概念 129
6.4.2 时钟中断与定时器实现 129
6.4.3 看门狗技术 132
第七章 Linux设备驱动开发 133
7.1 设备驱动程序概述 133
7.1.1 设备驱动程序分类 133
7.1.2 其他相关概念 134
7.2 设备驱动程序架构 135
7.2.1 基本架构 135
7.2.2 相关数据结构 136
7.3 设备驱动程序开发实例 146
7.3.1 编写内核模块 146
7.3.2 编写块(字符)设备驱动程序 148
7.3.3 编写网络设备驱动程序 152
第八章 Linux文件系统移植 158
8.1 Linux文件系统概述 158
8.1.1 Linux文件系统的历史 158
8.1.2 Linux文件系统的基本概念 160
8.2 Linux文件系统介绍 162
8.2.1 Ext FS和Ext2 FS 162
8.2.2 Ext3 FS 164
8.2.3 Reiser FS 165
8.2.4 XFS 166
8.2.5 JFS 167
8.2.6 JFFS2 168
8.2.7 其他文件系统简介 172
8.3 Linux文件系统结构 173
8.3.1 VFS(Virtual File System) 174
8.3.2 MTD(Memory Technology Device) 176
8.4 Linux文件系统移植 179
8.4.1 移植JFFS2文件系统 179
8.4.2 使用RamDisk 184
第九章 Linux应用程序开发 188
9.1 进程控制 188
9.1.1 Linux进程概述 188
9.1.2 Linux进程调度 189
9.1.3 相关系统调用及例程 191
9.2 进程间通信 202
9.2.1 Linux进程间通信概述 202
9.2.2 信号 203
9.2.3 管道 205
9.2.4 消息队列 206
9.2.5 信号灯 207
9.2.6 共享内存 209
9.3 多线程应用程序开发 210
9.3.1 线程概述 210
9.3.2 POSIX线程库API 213
9.3.3 线程编程实例 229
第十章 socket编程 233
10.1 socket编程的基本概念 233
10.1.1 网间进程通信 233
10.1.2 服务方式 235
10.1.3 客户/服务器模式 236
10.1.4 套接字类型 237
10.2 socket系统调用 237
10.2.1 建立socket 237
10.2.2 配置socket 238
10.2.3 建立连接 239
10.2.4 传输数据 240
10.2.5 结束传输 241
10.3 socket编程实例 242
10.3.1 简单的C/S模型 242
10.3.2 proxy源码分析 249