第1章 Linux操作系统简介 1
目录 1
1.1 主要特点 2
3.1.1 任务结构 1 3
1.2 Linux产品 4
第2章 编译内核 5
2.1 所有的东西在哪里 5
2.2 编译过程 7
2.3 额外的配置工具 8
第3章 内核入门 10
3.1 重要的数据结构 13
3.1.2 进程表 20
3.1.3 文件和节点 21
3.1.4 动态内存管理 23
3.1.5 队列和信号标志 23
3.1.6 系统时间和定时器 25
3.2 主要的算法 26
3.2.1 信号 26
3.2.2 硬件中断 27
3.2.4 启动系统 28
3.2.3 软件中断 28
3.2.5 定时器中断 30
3.2.6 调度程序 32
3.3 系统调用的实现 35
3.3.1 系统调用的实际工作原理 35
3.3.2 简单系统调用的例子 36
3.3.3 更复杂的系统调用的例子 38
第4章 内存管理 46
4.1 独立于体系结构的内存模型 47
4.1.1 内存页面 47
4.1.2 虚拟地址空间 48
4.1.3 转换线性地址 50
4.1.4 页面目录 51
4.1.5 页面表 52
4.2 进程的虚拟地址空间 55
4.2.1 用户段 55
4.2.2 虚拟内存区域 56
4.2.3 系统调用brk 59
4.2.4 映射函数 59
4.2.5 内核段 60
4.2.6 引导过程中内核段中的内存分配 60
4.2.7 内核段中的动态内存管理 61
4.3 块设备高速缓存 63
4.3.1 块缓冲 63
4.3.2 bdflush和kupdate 65
4.3.3 用于缓冲存储器的列表结构 66
4.3.4 使用缓冲存储器 66
4.4 Linux系统下的分页技术 67
4.4.1 内存管理和高速缓冲存储器 69
4.4.2 预定一个内存页面 71
4.4.3 通过内核线程优化内存页面管理 73
4.4.4 页面错误和重新载入页面 73
第5章 进程间的通信 76
5.1 内核中的同步 78
5.2 通过文件通信 81
5.2.1 锁定整个文件 82
5.2.2 锁定文件区域 83
7.4.9 Llseek 1 85
5.3 管道 86
5.4 使用ptrace调试 88
5.5 System V中的进程间通信(IPC) 91
5.5.1 访问权限、号码和关键字 91
5.5.2 信号标志 92
5.5.3 消息队列 95
5.5.4 共享内存 98
5.5.5 ipcs和ipcrm命令 100
5.6 使用套接字的IPC 101
5.6.1 一个简单的例子 102
5.6.2 UNIX域套接字的实现 105
第6章 Linux文件系统 108
6.1 基本原理 108
6.2 内核中文件系统的表示 110
6.2.1 装载 112
6.2.2 超代码块 113
6.2.3 超代码块操作 114
6.2.4 目录缓存器 116
6.2.5 DEntry操作 118
6.2.6 i节点 118
6.2.7 i节点操作 120
6.2.8 文件结构 122
6.2.9 文件操作 123
6.2.10 打开文件 126
6.3 Ext2文件系统 129
6.3.1 Ext2文件系统的结构 130
6.3.2 Ext2文件系统中的目录 132
6.3.3 Ext2文件系统中代码块的分配 133
6.3.4 Ext2文件系统的扩充 133
6.4 Proc文件系统 135
6.4.1 Proc文件系统的结构 135
6.4.2 Proc文件系统的实现 136
第7章 Linux下的设备驱动程序 141
7.1 字符设备和代码块设备 142
7.2 硬件 143
7.2.1 端口I/O 143
7.2.2 PCI总线 144
7.2.3 恐龙——ISA总线 153
7.2.4 ISA即插即用 159
7.3 查询、中断和等待队列 164
7.3.1 查询 164
7.3.2 中断模式 165
7.3.3 中断共享 167
7.3.4 软件中断 167
7.3.5 下半部——较低的中断一半 168
7.3.6 任务队列 169
7.3.7 计时器 170
7.4.1 PC扬声器驱动程序 171
7.4 实现驱动程序 171
7.4.2 一个简单的驱动程序 174
7.4.3 setup函数 175
7.4.4 init 177
7.4.5 打开和释放 178
7.4.6 读取和写入 179
7.4.7 IOCTL 181
7.4.8 Poll 183
7.4.10 Mmsp 185
7.4.11 Fasync 186
7.4.12 Readdir及Fsync 189
7.5 动态驱动程序和静态驱动程序 189
第8章 网络实现方式 191
8.1 导言和概述 191
8.1.1 网络实现方式的层模型 192
8.1.2 将A中的数据转移到B 193
8.2 一些重要的结构 196
8.2.1 套接字结构 196
8.2.2 sk_buff结构——网络中的缓冲区管理 197
8.2.3 INET套接字——套接字的一个特殊部分 200
8.2.4 proto结构中的协议操作 204
8.2.5 套接字地址的一般结构 205
8.3 Linux下的网络设备 206
8.3.1 以太网 211
8.3.2 SLIP和PLIP 212
8.3.3 回送设备 213
8.3.4 哑设备 213
8.3.5 示例设备 213
9.2 内核中的实现 216
9.1 什么是模块 216
第9章 模块和调试 216
9.3 模块和内核的对象片断的含义 219
9.4 参量的传输和示例 221
9.5 模块能实现什么 222
9.6 内核守护程序 222
9.7 模块之间的简单交换 223
9.8 示例模块 223
9.9 调试 224
9.9.1 更改是末尾的开始 225
9.9.3 使用gdb进行调试 226
9.9.2 最好的调试器——printk() 226
10.1 英特尔多重处理规范 228
第10章 多重处理 228
10.2 多重处理器系统存在的问题 229
10.3 内核的改动 230
10.3.1 内核初始化 230
10.3.2 调度 230
10.4.1 原子数据类型 231
10.4.2 访问原子数据类型 231
10.4 原子操作 231
10.3.3 中断处理 231
10.4.3 改变和检测原子变量 232
10.5 旋转锁定 232
10.5.1 访问函数 232
10.5.2 读写旋转锁定 233
附录A 系统调用 234
附录B 内核的相关命令 310
附录C PROC文件系统 338
附录D 引导进程 352
附录E 有用的内核函数 361