第1章 操作系统及Linux简介 1
1.1 概述 1
1.1.1 什么是计算机操作系统 1
1.1.2 操作系统的作用 2
1.1.3 操作系统的管理功能 4
1.1.4 操作系统管理用表 6
1.1.5 操作系统的应用程序接口 7
1.1.6 操作系统的特性 8
1.2 操作系统与应用程序的关系 9
1.3 操作系统结构 12
1.3.1 内核 12
1.3.2 内核结构 14
1.4 操作系统的演变与发展 15
1.4.1 人工操作阶段 15
1.4.2 管理程序阶段 16
1.4.3 多道程序设计与操作系统的形成 16
1.4.4 操作系统的发展 17
1.5 Linux基础知识 20
1.5.1 Linux的发展 20
1.5.2 Linux系统的结构 21
1.5.3 Linux系统的特点 21
1.5.4 Linux内核的版本号 22
1.5.5 Linux的一些商业版 23
1.5.6 Linux中的C语言 23
1.5.7 Linux中的汇编语言 23
1.5.8 Linux的链表 24
本章小结 27
习题 27
第2章 存储管理 29
2.1 存储管理的任务 29
2.1.1 存储管理目标 29
2.1.2 存储管理任务 29
2.2 存储空间组织 30
2.2.1 主存与辅存存储空间逻辑组织 30
2.2.2 存储空间分区 30
2.2.3 段分区实例——i386实模式下的存储管理 33
2.3 虚拟存储 33
2.3.1 实模式的问题及虚拟空间的概念 34
2.3.2 MMU和地址映射表 36
2.4 存储空间的页式管理 37
2.4.1 页、页框及页表 37
2.4.2 虚拟空间、物理空间和页表之间的关系 38
2.4.3 请页与交换 41
2.4.4 保护 42
2.4.5 页面共享 44
2.4.6 多级页表 44
2.4.7 快表 46
2.5 段及段管理 47
2.5.1 段的概念 47
2.5.2 i386对段管理的支持 47
2.5.3 段保护 52
2.5.4 i386处理器对分页的支持 54
2.6 Linux的页表 55
2.7 Linux程序虚拟空间 57
2.7.1 Linux的用户虚拟空间 57
2.7.2 Linux的系统虚拟空间 61
2.8 Linux物理内存管理 63
2.8.1 Linux物理内存的布局 63
2.8.2 Linux物理内存数据结构 64
2.8.3 Linux对物理内存的分配与回收 65
2.8.4 交换空间与守护进程 67
2.9 slab分配模式简介 68
2.10 mmap函数简介 71
2.11 Linux内存管理模块总貌 73
2.12 Linux内存初始化 73
2.12.1 实模式下系统初始化的setup()函数 73
2.12.2 保护模式下系统初始化的startup_32()函数 74
2.12.3 内核启动函数start_kernel() 74
本章小结 74
习题 76
第3章 进程 78
3.1 基本概念 78
3.1.1 进程及进程控制块 78
3.1.2 进程的状态 84
3.1.3 进程组织 84
3.2 并发及其实现 85
3.2.1 进程切换 86
3.2.2 处理器调度层次 86
3.2.3 调度器及调度算法 87
3.2.4 调度时机 89
3.2.5 线程 89
3.3 i386对进程切换的支持 90
3.3.1 任务(进程)状态段TSS 90
3.3.2 任务门及任务(进程)切换 92
3.4 Linux的进程 94
3.4.1 Linux进程的组成 94
3.4.2 Linux进程的状态 94
3.4.3 Linux的进程控制块 96
3.4.4 Linux进程控制块的存放 97
3.5 Linux进程的创建 99
3.5.1 子进程的创建 100
3.5.2 Linux进程家族 105
3.5.3 系统调用execve() 106
3.5.4 系统调用wait() 107
3.5.5 系统调用exit() 107
3.5.6 进程0和进程1 107
3.5.7 Linux的守护进程 108
3.6 Linux的进程调度 110
3.6.1 Linux进程的时间片与权重参数weight 110
3.6.2 调度策略 111
3.6.3 普通进程调度策略——SCHED_OTHER 111
3.6.4 实时进程调度策略 113
3.6.5 Linux调度时机 114
3.6.6 Linux的进程切换 114
3.7 Linux 2.6对调度器的改进 116
3.7.1 就绪进程队列runqueue 116
3.7.2 优先级的计算方法 119
本章小结 122
习题 122
第4章 文件管理 124
4.1 文件与文件系统 124
4.1.1 文件的基本概念 124
4.1.2 用户对文件的主要操作 127
4.2 文件的存储 127
4.2.1 文件的简单存储方式 127
4.2.2 存储块的组织方式 128
4.2.3 空闲块的记录 130
4.3 文件目录 131
4.3.1 一体化目录 131
4.3.2 分立式目录 131
4.3.3 硬连接与符号连接 132
4.3.4 目录树及根目录 132
4.3.5 磁盘文件系统 133
4.4 Ext2文件系统 134
4.4.1 Ext2的索引节点 134
4.4.2 Ext2的目录文件及目录项 136
4.4.3 Ext2文件系统在磁盘上的存储结构 137
4.4.4 Ext2文件的用户操作函数集 140
4.5 其他常用文件系统 140
4.5.1 一般文件系统 140
4.5.2 基于日志的文件系统 141
4.5.3 Linux的Ext3文件系统 142
4.6 操作系统的文件管理系统 142
4.6.1 文件管理系统与磁盘文件系统的关系 142
4.6.2 文件缓冲区 144
4.6.3 文件系统层次结构 144
4.6.4 虚拟文件系统 145
4.7 Linux的虚拟文件系统 145
4.7.1 VFS的原理 146
4.7.2 VFS的超级块 147
4.7.3 VFS的dentry结构 149
4.7.4 VFS的i节点 151
4.7.5 文件缓冲区 153
4.8 Linux的proc文件系统简介 156
4.9 操作系统对文件系统的管理 156
4.10 文件系统与进程的关联 158
4.10.1 进程与其打开文件的关系 159
4.10.2 系统打开和关闭文件表 162
4.11 根据文件路径查找索引节点 162
4.12 进程创建时文件的复制和共享 164
本章小结 165
习题 165
第5章 进程互斥和同步 167
5.1 概述 167
5.2 竞争控制 167
5.2.1 进程竞争、临界区、互斥 167
5.2.2 互斥的硬件实现 169
5.2.3 互斥的软件实现——信号量与P、V操作 170
5.2.4 临界段代码格式 172
5.2.5 管程简介 172
5.3 同步控制 174
5.3.1 同步的概念 174
5.3.2 用信号量实现同步 174
5.4 死锁和饥饿 175
5.4.1 死锁 175
5.4.2 饥饿 175
5.4.3 互斥及同步的经典问题 176
5.5 Linux信号量集 180
5.5.1 信号量集结构 180
5.5.2 信号量集的操作 182
5.5.3 进程控制块中关于信号量集的域 186
本章小结 186
习题 187
第6章 进程通信 188
6.1 基本概念 188
6.2 UNIX System V IPC机制简介 190
6.3 共享内存 192
6.3.1 共享内存原理 192
6.3.2 Linux共享内存结构 193
6.3.3 共享内存的使用 194
6.4 消息队列 196
6.4.1 消息结构 196
6.4.2 消息队列结构 197
6.4.3 消息队列的创建与打开 200
6.4.4 消息队列的读写 200
6.4.5 消息队列的一个实例 200
6.5 管道 202
6.5.1 匿名管道 202
6.5.2 命名管道 206
6.6 Linux的信号 206
6.6.1 信号的基本概念 206
6.6.2 信号的发送 208
6.6.3 信号的安装 209
6.6.4 进程的信号向量表 211
6.6.5 进程响应信号的时机 212
6.6.6 信号的生命期及可靠性 213
本章小结 214
习题 215
第7章 中断/异常和系统调用 216
7.1 处理器的硬件中断机制 216
7.1.1 中断及中断向量表 216
7.1.2 异常 217
7.1.3 陷阱 218
7.1.4 中断处理过程 219
7.2 i386处理器对中断的支持 219
7.2.1 i386实模式下的中断向量表 219
7.2.2 i386保护模式下的中断描述符表 220
7.3 Linux的两级中断 222
7.4 Linux硬中断结构 223
7.4.1 中断通道 223
7.4.2 中断请求队列 224
7.4.3 通道的中断处理程序IRQn_interrupt 227
7.5 Linux软中断结构 230
7.5.1 历史上的bottom half 231
7.5.2 任务队列 232
7.5.3 Linux的软中断及小任务机制 234
7.5.4 Linux系统中的中断实例——系统时钟 239
7.5.5 Linux系统中的软中断实例——软件定时器 241
7.6 系统调用 243
7.6.1 系统调用、封装例程和内核服务例程 243
7.6.2 i386对陷入的支持——陷阱门 244
7.6.3 Linux的系统调用 244
7.7 Linux的IDT初始化 249
7.7.1 IDT表的定义 249
7.7.2 Linux对IDT的第一次初始化 250
7.7.3 Linux对IDT的第二次初始化 250
本章小结 250
习题 251
第8章 设备 253
8.1 概述 253
8.1.1 设备分类 253
8.1.2 外部设备控制器 254
8.1.3 总线 256
8.1.4 外部设备与处理器的交互方式 257
8.1.5 外部设备管理任务 258
8.2 设备驱动程序 259
8.2.1 设备驱动程序框架 259
8.2.2 缓冲区及设备驱动程序的特点 260
8.3 设备驱动程序与内核的接口 261
8.3.1 设备标识 261
8.3.2 字符设备和块设备 261
8.3.3 系统调用入口点 262
8.3.4 假脱机技术 262
8.4 设备管理 263
8.4.1 设备控制块 263
8.4.2 设备文件 265
8.5 Linux的设备驱动程序 266
8.5.1 Linux设备驱动程序框架 266
8.5.2 驱动程序函数跳转表 267
8.6 Linux的设备管理 268
8.6.1 字符设备的注册 268
8.6.2 块设备的注册 269
8.7 Linux设备文件 270
8.8 Linux驱动程序的动态安装与卸载 271
8.8.1 什么是模块 271
8.8.2 Linux内核模块的实现机制 272
8.8.3 Linux驱动程序模块 275
本章小结 276
习题 276
第9章 嵌入式操作系统 277
9.1 嵌入式系统基本概念 277
9.1.1 什么是嵌入式系统 277
9.1.2 嵌入式系统的特点 278
9.2 嵌入式操作系统 279
9.2.1 什么是嵌入式操作系统 279
9.2.2 对嵌入式操作系统的一些特殊要求 280
9.3 常见嵌入式操作系统简介 282
9.3.1 常见的源码开放嵌入式操作系统 282
9.3.2 常见的商业嵌入式操作系统 283
9.4 μCLinux简介 284
9.4.1 μCLinux架构 284
9.4.2 无MMU的内存管理 285
9.4.3 内存管理模块的启动与初始化 286
9.4.4 Flat可执行文件格式 287
9.4.5 μCLinux的文件系统 288
9.4.6 ramfs文件系统 290
9.4.7 闪存与JFFS2文件系统 292
9.5 μCLinux的开发环境 296
9.5.1 GNU开发套件 296
9.5.2 μClinux的打印终端 296
9.5.3 交叉编译调试工具 296
本章小结 297
习题 298
附录A i386保护模式的特权级 299
A.1 特权级 299
A.2 基本保护规则 300
A.2.1 被访问段为数据段 300
A.2.2 被访问段为代码段 300
附录B 进程控制块 302
附录C 创建子进程系统调用 306
C.1 sys_fork,sys_clone,sys_vfork 306
C.1.1 sys_fork 306
C.1.2 sys_clone 306
C.1.3 sys_vfork 306
C.2 内核函数do_fork() 307
附录D Linux守护进程介绍 311
附录E Linux的引导、装载和启动 313
附录F Linux Shell简介 317
参考文献 318