第一部分 Linux概况 1
1 Linux的演变 1
2 通用内核职责 4
2.1 资源抽象 4
2.2 共享资源 5
2.2.1 管理对资源的竞争 5
2.2.2 资源的独占使用 6
2.2.3 有控制的共享 6
2.3 操作系统的功能划分 7
3 内核的组织结构 8
3.1 中断 8
3.2 使用内核服务 10
3.3 串行执行 12
3.4 守护进程 13
3.5 引导过程 13
3.5.1 引导扇区 13
3.5.2 启动内核 14
3.6 登录到机器 15
3.7 机器中的控制流 16
4 进程与资源管理 17
4.1 运行进程管理程序 18
4.1.1 系统调用 18
4.1.2 中断 19
4.2 创建新任务 19
4.3 调度程序 20
4.4 进程间通信与同步机制 20
4.5 保护机制 21
5 存储管理 22
5.1 管理虚拟地址空间 22
5.2 辅助存储 23
5.3 缺页处理 23
5.4 地址变换 24
6 设备管理 26
6.1 设备驱动程序 27
6.2 处理中断 28
7 文件管理 29
7.1 装载文件系统 30
7.2 打开文件 31
7.3 读写文件 32
7.4 Ext2文件系统 33
8 了解Linux的更多信息 36
第二部分 练习 38
练习一 观察Linux行为 38
1.1 介绍 38
1.2 问题陈述 40
1.2.1 部分A 40
1.2.2 部分B 41
1.2.3 部分C 41
1.2.4 部分D 41
1.3 解决问题 42
1.3.1 /proc文件系统 42
1.3.2 使用argc和argv 42
1.3.3 组织方案 44
1.3.4 将工作保存在共享实验室 45
练习二 Shell编程 46
2.1 介绍 46
2.1.1 基本UNIX风格的shell操作 47
2.1.2 将进程放在后台 49
2.1.3 I/O重定向 49
2.1.4 shell管道 50
2.1.5 读取多个输入流 52
2.2 问题陈述 53
2.2.1 部分A 53
2.2.2 部分B 53
2.2.3 部分C 53
2.3 解决问题 54
2.3.1 组织方案 54
2.3.2 部分A 54
2.3.3 部分B和C 56
练习三 内核定时器 57
3.1 介绍 57
3.1.1 内核如何维护时间 57
3.1.2 每进程定时器 58
3.2 问题陈述 60
3.2.1 部分A 60
3.2.2 部分B 60
3.2.3 部分C 60
3.3 解决问题 61
3.3.1 Linux源代码组织结构 61
3.3.2 信号 62
3.3.3 组织方案 63
练习四 内核模块 66
4.1 介绍 66
4.1.1 模块组织结构 66
4.1.2 模块的装载与卸载 69
4.2 问题陈述 70
4.3 解决问题 70
4.3.1 read()过程 70
4.3.2 文件结束(EOF)条件 71
4.3.3 编译模块 71
4.3.4 装载和卸载模块 71
4.3.5 时钟精度问题 71
4.3.6 更多帮助 71
练习五 系统调用 72
5.1 介绍 72
5.1.1 系统调用链 72
5.1.2 定义系统调用编号 73
5.1.3 生成系统调用stub 74
5.1.4 内核函数组织结构 75
5.1.5 引用用户空间内存地址 76
5.2 问题陈述 76
5.2.1 部分A 76
5.2.2 部分B 76
5.3 解决问题 77
5.3.1 内核printk()函数 77
5.3.2 组织方案 77
5.3.3 重建内核 78
5.3.4 留下一个干净的环境 79
练习六 共享内存 80
6.1 介绍 80
6.1.1 共享内存API 80
6.1.2 实现 83
6.2 问题陈述 88
6.3 解决问题 88
练习七 虚拟存储 90
7.1 介绍 90
7.1.1 虚拟地址空间 91
7.1.2 虚拟存储区 93
7.1.3 地址变换 94
7.1.4 缺页处理程序 94
7.1.5 主存分配 97
7.2 问题陈述 97
7.2.1 部分A 97
7.2.2 部分B 97
7.3 解决问题 97
练习八 同步机制 98
8.1 介绍 98
8.1.1 阻塞任务 98
8.1.2 等待队列 99
8.1.3 使用等待队列 100
8.2 问题陈述 102
8.2.1 部分A 102
8.2.2 部分B 103
8.3 解决问题 103
练习九 调度程序 105
9.1 介绍 105
9.1.1 进程管理 105
9.1.2 进程状态 107
9.1.3 调度程序实现 108
9.1.4 公平共享调度 111
9.2 问题陈述 112
9.2.1 部分A 112
9.2.2 部分B 112
9.3 解决问题 112
9.3.1 设计解决方案 112
9.3.2 比较调度程序的性能 112
练习十 设备驱动程序 114
10.1 介绍 114
10.1.1 驱动程序组织结构 115
10.1.2 可装载内核模块驱动程序 117
10.1.3 示例:磁盘驱动程序 118
10.2 问题陈述 120
10.2.1 部分A 120
10.2.2 部分B 120
10.3 解决问题 120
练习十一 文件系统 122
11.1 介绍 122
11.1.1 虚拟文件系统 123
11.1.2 目录 127
11.1.3 示例:MS-DOS文件系统 128
11.2 问题陈述 129
11.2.1 部分A 129
11.2.2 部分B 130
11.2.3 部分C 130
11.3 解决问题 130
11.3.1 MS-DOS磁盘格式 130
11.3.2 MS-DOS FAT 132
11.3.3 使用软盘API 136
11.3.4 设计解决方案 137
练习十二 文件I/O 141
12.1 介绍 141
12.1.1 打开与关闭操作 142
12.1.2 读写操作 142
12.1.3 块分配 144
12.1.4 缓冲区管理 145
12.2 问题陈述 146
12.2.1 部分A 146
12.2.2 部分B 147
12.2.3 部分C 147
12.2.4 部分D 147
12.3 解决问题 147
12.3.1 open()函数 147
12.3.2 缓冲FAT 148
12.3.3 解决方案 148
进一步学习 151
附录A Linux Mandrake 7.0快速安装指南 152
附录B GNU通用公共许可证(版本2,1991.6) 156
参考文献 161