前言 6
第1章 硬件基础与软件基础 6
1.1硬件基础 6
第一部分 Linux内核 6
1.1.1 CPU 7
1.1.2存储器 8
1.1.3总线 8
1.1.4控制器和外设 8
1.2软件基础 9
1.2.1计算机语言 9
1.1.6时钟 9
1.1.5地址空间 9
1.2.2什么是操作系统 11
1.2.3内核数据结构 13
第2章 内存管理 15
2.1虚拟内存抽象模型 15
2.1.1请求调页 17
2.1.2交换 17
2.1.4物理寻址模式和虚拟寻址模式 18
2.1.5访问控制 18
2.1.3共享虚拟内存 18
2.2高速缓存 19
2.3 Linux页表 20
2.4页分配和回收 21
2.4.1页分配 22
2.4.2页回收 22
2.5内存映射 22
2.6请求调页 23
2.7 Linux页缓存 24
2.8.1减少缓冲区和页缓存大小 25
2.8页换出和淘汰 25
2.8.2换出System V共享内存页 26
2.8.3换出和淘汰页 27
2.9交换缓存 27
2.10页换入 28
第3章 进程 29
3.1 Linux进程 29
3.2标识符 31
3.3调度 32
3.4文件 34
3.5虚拟内存 35
3.6创建进程 36
3.7时间和定时器 37
3.8执行程序 38
3.8.1 ELF 39
3.8.2脚本文件 40
第4章 进程间通信机制 41
4.1信号机制 41
4.2管道 42
4.3套接字 44
4.3.1 System V的进程间通信机制 44
4.3.2消息队列 44
4.3.3信号量 45
4.3.4共享存储区 47
第5章 PCI 49
5.1 PCI的地址空间 49
5.2 PCI配置头 50
5.3 PCI的I/O和存储地址空间 51
5.4 PCI-ISA桥 51
5.5 PCI-PCI桥 51
5.5.1 PCI-PCI桥:PCI I/O和存储地址空间的窗口 51
5.5.2 PCI-PCI桥:PCI配置周期和PCI总线编号 52
5.6.2 PCI设备驱动程序 53
5.6 Linux PCI初始化 53
5.6.1 Linux内核PCI数据结构 53
5.6.3 PCI的BIOS函数 56
5.6.4 PCI修正过程 57
第6章 中断处理与设备驱动程序 60
6.1中断与中断处理 60
6.1.1可编程中断控制器 61
6.1.2初始化中断处理数据结构 61
6.1.3中断处理 62
6.2设备驱动程序 63
6.2.1测试与中断 64
6.2.2直接存储器访问(DMA) 65
6.2.3存储器 66
6.2.4设备驱动程序与内核的接口 66
6.2.5硬盘 69
6.2.6网络设备 74
第7章 文件系统 77
7.1第二个扩展文件系统EXT2 78
7.1.1 EXT2系统的inode节点 79
7.1.2 EXT2系统的超级块 80
7.1.3 EXT2系统的组描述符 80
7.1.5在EXT2文件系统中查找文件 81
7.1.4 EXT2系统的目录 81
7.1.6在EXT2文件系统中改变文件的大小 82
7.2虚拟文件系统 83
7.2.1 VFS文件系统的超级块 84
7.2.2 VFS文件系统的inode节点 84
7.2.3注册文件系统 85
7.2.4装配文件系统 85
7.2.6卸载文件系统 87
7.2.7 VFS文件系统的inode缓存 87
7.2.5在虚拟文件系统中查找文件 87
7.2.8目录缓存 88
7.3缓冲区缓存 88
7.3.1 bdflush内核守护进程 90
7.3.2 update进程 90
7.4 /proc文件系统 91
第8章 网络 92
8.1 TCP/IP网络概述 92
8.2 Linux中的TCP/IP网络层次结构 95
8.3 BSD套接字接口 96
8.4 INET的套接字层 97
8.4.1创建BSD套接字 98
8.4.2为INET BSD Socket绑定地址 99
8.4.3建立INET BSD Socket连接 99
8.4.4 INET BSD Socket侦听 100
8.4.5接受连接请求 100
8.5 IP层 100
8.5.1套接字缓冲区 100
8.5.2接收IP报文 101
8.5.3发送IP报文 102
8.5.4数据分片 102
8.6地址解析协议 103
8.7 IP路由 104
第9章 内核机制与模块 107
9.1内核机制 107
9.1.1 Bottom Half控制 107
9.1.2任务队列 108
9.1.3定时器 109
9.1.4等待队列 110
9.1.5自旋锁 110
9.1.6信号量 110
9.2模块 111
9.2.1模块载入 112
9.2.2模块卸载 113
第10章 处理器 115
10.1 X86 115
10.2 ARM 115
10.3 Alpha AXP处理器 115
第11章 Linux内核源代码 117
11.1怎样得到Linux内核源码 117
11.2内核源码的编排 117
11.3从何处看起 118
第12章 Linux数据结构 120
附录A 有用的Web和FTP站点 138
附录B 词汇表 139
第二部分 Linux内核模块编程指南 145
致谢 145
前言 145
第1章 Hello,World 145
1.1内核模块的Makefiles文件 146
1.2多重文件内核模块 147
第2章 字符设备文件 149
第3章 /proc文件系统 158
第4章 把/proc用于输入 162
第5章 把设备文件用于输入 170
第6章 启动参数 182
第7章 系统调用 185
第8章 阻塞处理 190
第9章 替换printk 199
第10章 任务调度 202
第11章 中断处理程序 207
第12章 对称多处理 211
第13章 常见错误 212
附录A 2.0和2.2之间的差异 213
附录B 其他资源 214
附录C 给出你的评价 215
第1章Linux操作系统 219
第三部分 Linux程序员指南 219
第2章Linux内核 220
第3章Linux libc包 221
第4章 系统调用 222
第5章 “瑞士军刀”:ioctl 223
第6章Linux进程间通信 224
6.1介绍 224
6.2半双工Unix管理 224
6.2.1基本概念 224
6.2.2用C语言创建管道 225
6.2.3简便方法 229
6.2.4管道的原子操作 233
6.2.5关于半双工管道需要注意的几个问题 233
6.3命名管道 234
6.3.1基本概念 234
6.3.2创建FIFO 234
6.3.3 FIFO操作 235
6.3.4 FIFO上的阻塞动作 236
6.3.5 SIGPIPE信号 237
6.4系统V IPC 237
6.4.1基本概念 237
6.4.2消息队列 239
6.4.3信号量 251
6.4.4 semtool:交互式信号量操作程序 260
6.4.5共享内存 267
第7章 声音编程 274
7.1内部扬声器编程 274
7.2声卡编程 274
第8章 字符单元图形 276
8.1 libc中的I/O函数 277
8.1.1格式化输出 277
8.2.1前言 278
8.1.2格式化输入 278
8.2 termcap库 278
8.2.2获得终端描述 279
8.2.3查看终端描述 279
8.2.4 termcap权能 280
8.3 Ncurses简介 280
8.4初始化 282
8.5窗口 283
8.6输出 284
8.6.1格式化输出 285
8.6.3删除字符/行 286
8.6.2插入字符/行 286
8.6.4方框和直线 287
8.6.5背景字符 287
8.7输入 288
8.8选项 289
8.8.1输出选项 289
8.8.2输入选项 290
8.8.3终端属性 291
8.8.4使用选项 291
8.9更新终端 292
8.10视频属性与颜色 293
8.11光标和屏幕坐标 294
8.12滚动 294
8.13小键盘 295
8.14软标签 295
8.15杂项 295
8.16低级访问 296
8.17屏幕转储 296
8.18 Termcap模拟 296
8.19 Terminfo函数 296
8.21.1布尔型权能 297
8.21 Terminfo权能 297
8.20调试函数 297
8.21.2数值型权能 298
8.21.3字符串型权能 299
8.22 [N]Curses函数概述 306
第9章 I/O端口编程 307
9.1鼠标编程 307
9.2调制解调器编程 308
9.3打印机编程 308
9.4游戏杆编程 308
10.2信号处理 309
第10章 把应用程序移植到Linux上 309
10.1介绍 309
10.2.1 SVR4、BSD和POSIX.1下的信号 310
10.2.2 Linux信号选项 310
10.2.3 Linux下的信号 310
10.2.4 Linux支持的信号 311
10.3终端I/O 311
10.4进程信息和控制 311
10.4.2 ptrace和/proc文件系统 312
10.4.3 Linux下的进程控制 312
10.4.1 kvm过程 312
10.5可移植条件编译 313
10.6补充说明 314
附录 以字母顺序排列的系统调用 315
第四部分 Linux内核概念系统结构 323
摘要 323
前言 324
第1章 系统结构 325
1.1系统概述 325
1.2内核的目标 325
1.3内核结构的概述 325
1.4支持多个开发人员 327
1.5.1任务列表 328
1.5.2内存映射 328
1.5.3索引节点 328
1.5系统数据结构 328
1.5.4数据连接 329
第2章 子系统的系统结构 330
2.1进程调度程序系统结构 330
2.1.1目标 330
2.1.2模块 330
2.2.1目标 331
2.2.3数据表示 331
2.2.2模块 331
2.1.4依赖性、数据流和控制流 331
2.2内存管理程序系统结构 331
2.1.3数据表达 331
2.2.4数据流、控制流和依赖性 332
2.3虚拟文件系统系统结构 333
2.3.1目标 333
2.3.2模块 333
2.3.3数据表示 333
2.4.2模块 334
2.4.1目标 334
2.3.4数据流、控制流和依赖性 334
2.4网络接口系统结构 334
2.4.3数据表示 335
2.4.4数据流、控制流和依赖性 335
2.5进程间通信系统结构 335
第3章 结论 336
附录A 术语定义 337
附录B 参考文献 338
第五部分 Linux内核具体系统结构 341
摘要 341
1.2 Linux介绍 342
1.3软件系统结构的背景知识 342
第1章 前言 342
1.1目标 342
1.4方法与途径 343
1.5适用本书的读者 344
1.6本部分的章节安排 344
第2章 系统结构 345
3.1.3子系统描述 346
3.1.2外部接口 346
3.1.1目标 346
3.1进程调度程序 346
第3章 子系统结构 346
3.1.4数据结构 347
3.1.5子系统结构 348
3.1.6子系统依赖性 348
3.2内存管理程序 348
3.2.1目标 348
3.2.2外部接口 349
3.2.3子系统描述 349
3.2.5子系统结构 350
3.2.4数据结构 350
3.2.6子系统依赖性 351
3.3虚拟文件系统 352
3.3.1目标 352
3.3.2外部接口 352
3.3.3子系统描述 353
3.3.4设备驱动程序 353
3.3.5逻辑文件系统 354
3.3.6模块 354
3.4.1目标 355
3.4进程间通信 355
3.3.8子系统结构 355
3.3.7数据结构 355
3.3.9子系统依赖性 355
3.4.2外部接口 357
3.4.3子系统描述 357
3.4.4数据结构 358
3.4.5子系统结构 359
3.4.6子系统依赖性 359
3.5网络接口 360
3.5.1目标 360
3.5.3子系统描述 361
3.5.2外部接口 361
3.5.4数据结构 362
3.5.5子系统结构 363
3.5.6子系统依赖性 363
第4章 结论 365
附录A 术语定义 366
附录B 参考文献 368
第六部分 附录 372
附录A Linux文档工程拷贝许可证 372
附录B GNU通用公共许可证 374