第1章 概论 1
1.1 现代操作系统 1
1.1.1 操作系统的概念 1
1.1.2 操作系统的分类 2
1.1.2.1 批处理操作系统 2
1.1.2.2 分时操作系统 2
1.1.2.3 实时操作系统 3
1.1.2.4 网络操作系统和分布式操作系统 3
1.1.2.5 通用操作系统 3
1.1.2.6 个人操作系统 3
1.1.3 操作系统的功能 4
1.1.3.1 处理机管理 4
1.1.3.2 存储管理 4
1.1.3.3 文件管理 4
1.1.3.4 设备管理 4
1.1.3.5 用户接口 5
1.1.3.6 网络管理 5
1.1.4 操作系统的结构 5
1.1.4.1 整体式模型 5
1.1.4.2 层次式模型 5
1.1.4.3 客户/服务器模型 5
1.2 Linux系统概论 6
1.2.1 Linux发展史 6
1.2.1.1 Linux的起源 6
1.2.1.2 Linux的版本 7
1.2.2 Linux的特点 7
1.2.3 自由软件基金会及GNU计划 8
1.3 Linux的发展趋势 8
1.3.1 嵌入式Linux 9
1.3.2 桌面Linux:32位Linux 9
1.3.2.1 Red Hat Linux 9
1.3.2.2 XteamLinux 10
1.3.3 服务器Linux:64位Linux 10
1.3.3.1 64位计算技术 10
1.3.3.2 64位Linux:Penguin64中文Linux 11
1.4 小结 11
第2章 Linux基础 13
2.1 Linux系统结构及文件组织 13
2.1.1 Linux系统结构 13
2.1.2 Linux源文件组织 13
2.2 系统启动和初始化 14
2.2.1 内核引导 14
2.2.1.1 init和inittab 14
2.2.1.2 系统的运行级别 16
2.2.2 关闭系统 17
2.3 文件系统操作 17
2.3.1 文件系统类型 17
2.3.2 加载文件系统 18
2.3.3 卸载文件系统 18
2.3.4 创建文件系统 19
2.4 常用命令 19
2.4.1 用户帐号管理 19
2.4.1.1 创建用户帐号 19
2.4.1.2 修改用户帐号 20
2.4.1.3 删除和查封帐号 20
2.4.1.4 几个和用户相关的命令 20
2.4.2 基本目录和文件操作 20
2.4.3 用vi编辑文件 21
2.4.4 进程控制 22
2.4.5 网络命令及其他 22
2.5 Shell编程 22
2.5.1 创建和执行Shell脚本文件 23
2.5.1.1 执行Shell脚本文件 23
2.5.1.2 创建脚本文件 23
2.5.2 变量及符号 23
2.5.2.1 变量 23
2.5.2.2 符号 24
2.5.3 表达式 24
2.5.4 控制语句 25
2.5.5 实例 26
2.6 GNU C编程 27
2.6.1 使用gcc编译和链接 27
2.6.2 使用make和makefile实现自动编译 28
2.6.2.1 简单的makefile文件 28
2.6.2.2 使用make命令 29
2.6.3 gdb调试工具 29
2.6.3.1 gdb简介 29
2.6.3.2 gdb的命令 29
2.6.4 其他调试工具 32
2.6.4.1 Calls 32
2.6.4.2 cproto 32
2.6.4.3 indent 32
2.7 小结 32
第3章 Linux进程管理 33
3.1 现代操作系统的进程模型 33
3.1.1 程序的并发执行 33
3.1.2 进程模型 34
3.1.2.1 进程的创建及组织 34
3.1.2.2 进程的状态 34
3.1.2.3 操作系统的进程模型 35
3.1.3 进程的描述 35
3.1.3.1 进程控制块 36
3.1.3.2 处理机上下文和进程上下文 36
3.1.4 Linux的进程 37
3.1.4.1 task_struct数据结构 37
3.1.4.2 Linux进程状态 40
3.2 Linux的进程控制 41
3.2.1 进程的创建fcxk 41
3.2.1.1 fork系统调用 41
3.2.1.2 vfork调用 43
3.2.1.3 实例 44
3.2.2 进程的执行exec 46
3.2.3 进程的等待wait 49
3.2.3.1 wait函数 49
3.2.3.2 waitpid函数 49
3.2.3.3 实例 50
3.2.4 进程的结束exit 54
3.3 进程调度 55
3.3.1 进程调度的原理 55
3.3.1.1 调度的时机 56
3.3.1.2 调度的处理过程 56
3.3.1.3 调度的算法 57
3.3.2 Linux的进程调度 58
3.3.2.1 调度的时机 58
3.3.2.2 调度策略 59
3.3.2.3 调度程序源码分析 60
3.4 进程通信 66
3.4.1 进程的相互制约 66
3.4.1.1 进程的互斥 67
3.4.1.2 进程的同步 68
3.4.1.3 Linux的进程通信机制 69
3.4.2 信号Signals 69
3.4.2.1 信号机制 69
3.4.2.2 信号的处理函数 71
3.4.2.3 实例 73
3.4.2.4 信号集及其处理 74
3.4.3 管道 77
3.4.3.1 管道(Pipe)实现机制 78
3.4.3.2 管道(Pipe)实例 78
3.4.3.3 创建管道(Pipe)的简单方法 82
3.4.3.4 命名管道(FIFO) 85
3.4.4 System V的进程通信机制 90
3.4.4.1 IPC对象 90
3.4.4.2 IPC命令 91
3.4.5 信号量Semaphore 92
3.4.5.1 信号量机制 92
3.4.5.2 系统调用 93
3.4.5.3 编程实例 96
3.4.6 消息队列Message Queues 100
3.4.6.1 消息队列机制 100
3.4.6.2 系统调用 101
3.4.6.3 编程实例 103
3.4.7 共享内存Shared Memory 113
3.4.7.1 共享内存机制 113
3.4.7.2 编程实例 115
3.5 Linux的线程 123
3.5.1 线程的概念 124
3.5.1.1 与进程的关系 124
3.5.1.2 编程初步 125
3.5.2 线程的互斥与同步 127
3.5.2.1 用信号量实现同步 128
3.5.2.2 用互斥量实现互斥 130
3.5.3 多线程编程 132
3.6 小结 133
第4章 Linux存储管理 134
4.1 存储管理概述 134
4.1.1 存储管理的基本概念 135
4.1.2 物理内存和虚拟内存 136
4.1.3 分页与分段式内存管理 138
4.2 Linux内存管理体系结构 142
4.2.1 基于硬件的基本抽象概念 142
4.2.1.1 物理内存设备 142
4.2.1.2 地址空间 143
4.2.1.3 地址映射和地址转换硬件 144
4.2.2 虚拟内存管理和分页机制 145
4.2.2.1 Linux的虚拟存储管理 145
4.2.2.2 页目录和页表 147
4.2.2.3 页的分配和回收 148
4.2.2.4 内存映射 149
4.2.2.5 缺页中断 149
4.2.2.6 交换机制 150
4.2.2.7 交换设备 153
4.2.3 系统中的缓存 154
4.3 内存的分配策略 154
4.3.1 分配和回收 154
4.3.1.1 分配策略 154
4.3.1.2 分配与释放操作 155
4.3.1.3 相关函数 156
4.3.2 进程与内存 157
4.3.2.1 进程的创建和执行 157
4.3.2.2 相关函数 159
4.4 小结 159
第5章 Linux文件系统 160
5.1 文件管理概述 160
5.1.1 文件与文件系统 160
5.1.1.1 文件的定义 160
5.1.1.2 文件的操作 160
5.1.1.3 文件系统的功能 160
5.1.2 文件系统的实现 162
5.1.2.1 文件的逻辑结构 162
5.1.2.2 文件的物理结构 163
5.1.2.3 文件存储空间管理 164
5.1.2.4 文件目录管理 165
5.1.2.5 文件的安全设计 165
5.2 Linux文件系统概述 166
5.2.1 文件的用户接口 166
5.2.1.1 文件的类型 166
5.2.1.2 文件描述符 167
5.2.2 Linux文件系统的框架 168
5.3 ext2文件系统 168
5.3.1 ext2文件系统的特点 168
5.3.2 ext2文件的逻辑结构与物理结构 169
5.3.3 ext2文件系统存储空间的管理 171
5.3.3.1 ext2文件系统的物理存储空间 171
5.3.3.2 ext2文件系统的超级块 172
5.3.3.3 ext2文件系统的组描述符 175
5.3.3.4 ext2文件系统空闲块的分配 175
5.3.4 ext2文件系统目录文件的实现 176
5.3.4.1 ext2目录文件的结构 176
5.3.4.2 文件的查询 177
5.3.4.3 文件的共享 177
5.4 VFS 179
5.4.1 VFS的超级块和索引节点 180
5.4.1.1 VFS的超级块 181
5.4.1.2 VFS的inode 182
5.4.2 对VFS的操作 184
5.4.2.1 打开文件 184
5.4.2.2 注册安装文件系统 185
5.4.3 Linux文件系统的缓冲机制 186
5.4.3.1 VFS索引节点缓存 186
5.4.3.2 VFS的目录缓存 187
5.4.3.3 缓冲区缓存(Buffer Cache) 187
5.5 proc文件系统 189
5.6 Linux文件系统调用及应用实例 189
5.6.1 文件的打开和关闭 189
5.6.1.1 open系统调用 189
5.6.1.2 close系统调用 191
5.6.1.3 应用实例 191
5.6.2 文件的读写 192
5.6.2.1 read系统调用 193
5.6.2.2 write系统调用 193
5.6.2.3 应用实例 194
5.6.3 文件的随机存取 196
5.6.3.1 lseek系统调用 196
5.6.3.2 应用实例 196
5.6.4 文件的保护和控制 197
5.6.4.1 chown和chmod系统调用 197
5.6.4.2 umask系统调用 199
5.6.4.3 fcntl系统调用 199
5.6.4.4 应用实例 201
5.6.5 目录文件管理 209
5.6.5.1 mkdir,rmdir系统调用 209
5.6.5.2 chdir系统调用 210
5.6.5.3 Link,unlink 210
5.6.5.4 应用实例 210
5.6.6 文件信息查询 211
5.6.6.1 stat,fstat,lstat 211
5.6.6.2 应用实例 212
5.7 小结 216
第6章 设备管理 217
6.1 设备管理概述 217
6.1.1 设备的分类和功能 217
6.1.2 设备管理的实现 218
6.1.2.1 总线概述 218
6.1.2.2 数据传送方式 219
6.1.2.3 缓冲技术 221
6.1.2.4 设备驱动程序 222
6.1.2.5 SPARC机中设备管理初始化过程 222
6.2 Linux设备管理概述 223
6.2.1 Linux中总线的使用 225
6.2.1.1 PCI总线概述 225
6.2.1.2 PCI总线的地址管理 226
6.2.1.3 Linux系统中有关PCI的操作 227
6.2.2 中断和DMA 228
6.2.2.1 中断 228
6.2.2.2 计时机制的使用 230
6.2.2.3 DMA 230
6.2.3 内存管理 231
6.2.3.1 设备内存地址的分类 232
6.2.3.2 设备内存的使用和分配 232
6.2.3.3 用户空间和内核空间数据传递 233
6.3 Linux设备驱动程序框架 234
6.3.1 设备驱动程序分类 234
6.3.2 设备开关表 234
6.3.3 驱动程序入口点 236
6.4 Linux设备的I/O调用 236
6.4.1 设备文件 236
6.4.2 Linux文件系统对设备文件的处理 237
6.4.3 字符设备I/O 237
6.4.4 块设备I/O 238
6.5 中文Linux核心技术 238
6.5.1 汉字处理的基本原理 238
6.5.1.1 基本差异 239
6.5.1.2 汉字处理的需求 239
6.5.1.3 中文Linux对汉字的支持 240
6.5.2 相关设备结构 241
6.5.2.1 显示机制 241
6.5.2.2 Framebuffer 242
6.5.3 Linux内核汉字技术 243
6.5.3.1 实现机制 243
6.5.3.2 核心汉字支持细节介绍 244
6.6 Linux系统设备管理应用实例 245
6.6.1 字符设备驱动程序的实现 245
6.6.1.1 字符设备结构 245
6.6.1.2 驱动程序入口点 246
6.6.1.3 字符设备驱动程序的安装 248
6.6.1.4 实例 248
6.6.2 块设备驱动程序的实现 254
6.6.2.1 块设备的结构 254
6.6.2.2 驱动程序入口点 254
6.6.2.3 相关问题 257
6.7 小结 257
第7章 Linux网络系统 258
7.1 概述 258
7.1.1 网络协议 258
7.1.1.1 ISO/OSI网络模型 259
7.1.1.2 TCP/IP协议 261
7.1.2 BSD Socket 266
7.1.3 网络设备 267
7.2 网络设备接口 268
7.2.1 核心层—网络驱动 268
7.2.1.1 层次结构 268
7.2.1.2 网络设备初始化 273
7.2.1.3 网络协议绑定 275
7.2.2 核心层—灵活的网络机制 277
7.2.2.1 网络虚拟设备 277
7.2.2.2 IP伪装 279
7.2.2.3 防火墙、路由 282
7.2.2.4 其他新特性 283
7.2.2.5 IPv6简介 284
7.3 系统层—网络服务系统机制 284
7.3.1 网络守护进程 285
7.3.2 INETD 285
7.3.2.1 INETD概述 285
7.3.2.2 INETD的机制 286
7.3.2.3 INETD配置说明 286
7.4 网络编程 287
7.4.1 网络通信编程要点 287
7.4.1.1 TCP协议传输中的状态 288
7.4.1.2 UDP协议传输过程 289
7.4.1.3 网络程序的设计 290
7.4.1.4 网络编程中的重要函数 290
7.4.2 客户端编程 293
7.4.2.1 面向连接的客户程序 293
7.4.2.2 非面向连接的客户程序 294
7.4.3 服务器端编程 294
7.4.3.1 面向连接的服务器端通信程序 295
7.4.3.2 非面向连接的服务器 296
7.5 网络应用 297
7.5.1 Internet应用 297
7.5.1.1 Sendmail 297
7.5.1.2 DNS 298
7.5.1.3 Web Server、FTP等 298
7.5.1.4 Ipchains 298
7.5.2 群组服务器应用 298
7.5.2.1 Appleralk 299
7.5.2.2 IPX/SPX 299
7.5.2.3 SMB 299
7.6 小结 300
第8章 应用实例 301
8.1 认识Linux系统 301
8.1.1 目的 301
8.1.2 要求 301
8.1.3 内容 301
8.2 Shell编程初步 301
8.2.1 目的 301
8.2.2 要求 301
8.2.3 内容 301
8.3 简单C语言编程实验 302
8.3.1 目的 302
8.3.2 要求 303
8.3.3 内容 303
8.4 Linux一进程管理 303
8.4.1 目的 303
8.4.2 要求 303
8.4.3 内容 303
8.5 Linux进程管理二 305
8.5.1 目的 305
8.5.2 要求 305
8.5.3 内容 305
8.6 Linux线程 314
8.6.1 目的 314
8.6.2 要求 314
8.6.3 内容 314
8.7 Linux存储管理 322
8.7.1 目的 322
8.7.2 要求 322
8.7.3 内容 322
8.8 Linux文件管理 325
8.8.1 目的 325
8.8.2 要求 325
8.8.3 内容 325
8.9 Linux设备管理 333
8.9.1 目的 333
8.9.2 要求 334
8.9.3 内容 334
8.10 Linux网络管理 345
8.10.1 目的 345
8.10.2 要求 346
8.10.3 内容 346
8.11 综合实例 352
8.11.1 目的 352
8.11.2 要求 352
8.11.3 内容 352
附录 353
参考文献 360