前言 1
第一章 Linux内核简介 11
驱动程序作者的作用 12
划分内核 13
设备和模块的分类 16
安全问题 18
版本编号 19
许可证术语 21
全书概貌 22
第二章 编写和运行模块 25
模块与应用程序 26
编译和加载 31
版本相关性 33
内核符号表 35
初始化和终止 37
使用资源 42
自动和手动配置 48
在用户空间编写驱动程序 50
快速索引 52
第三章 字符设备驱动程序 57
scull的设计 57
主设备号和次设备号 59
文件操作 66
file结构 70
Open 和Close 71
Scull的内存使用 76
读和写 80
试试新设备 86
快速索引 86
第四章 调试技术 89
用打印信息调试 89
通过查询调试 94
通过监视进行调试 98
调试系统故障 100
使用调试器 111
第五章 字符设备驱动程序的扩展操作 117
ioctl 118
阻塞型I/O 130
Select 140
异步触发 145
定位设备 148
设备文件的访问控制 150
快速索引 156
内核中的时间间隔 161
第六章 时间流 161
获取当前时间 162
延迟执行 164
任务队列 168
内核定时器 179
快速索引 183
第七章 获取内存 185
kmalloc函数的内幕 185
get_free_page和相关函数 188
vmalloc和相关函数 191
“脏”的处理方法(Playing Dirty) 194
快速索引 195
第八章 硬件管理 197
使用I/O端口 198
使用并口 203
访问设备卡上的内存 206
访问字符模式的视频缓冲区 211
快速索引 212
准备并口 215
第九章 中断处理 215
安装中断处理程序 216
实现中断处理程序 228
下半部 233
共享中断 239
中断驱动的I/O 243
竞争条件 244
中断处理的版本相关性 253
快速索引 255
第十章 合理使用数据类型 259
使用标准C类型 260
分配确定的空间大小给数据项 261
接口特定的类型 262
其他与移植有关的问题 263
快速索引 266
第十一章 Kerneld和高级模块化 269
按需加载模块 269
模块中的版本控制 275
跨过卸载/装载的持久存储 280
快速索引 282
第十二章 加载块设备驱动程序 285
注册驱动程序 285
头文件blk.h 290
处理请求 293
挂载(Mounting)是如何工作的 300
ioctl方法 301
可拆卸的设备 305
可分区设备 308
中断驱动的块设备驱动程序 317
快速索引 320
第十三章 MMAP和DMA 323
Linux中的内存管理 323
mmap设备操作 332
直接内存访问(DMA) 347
快速索引 358
第十四章 网络驱动程序 361
snull如何设计 362
与内核相连 366
设备结构的细节 371
打开和关闭 380
包发送 382
包接收 384
中断驱动的操作 386
插座缓冲区 388
地址解析 391
加载时配置 394
运行时配置 395
自定义ioctl命令 397
统计信息 399
选播(multicasting) 399
快速索引 403
第十五章 外设总线概览 407
PCI接口 407
回顾:ISA 423
其他PC总线 425
Sbus 427
快速索引 428
第十六章 内核源代码的物理布局 431
引导内核 431
引导之前 433
Init进程 438
Kernel目录 439
mm目录 441
fs目录 443
网络 448
IPC和lib函数 449
Drivers 450
体系结构相关性 452
第十七章 最新进展 453
模块化 454
文件操作 459
访问用户空间 463
任务队列 469
中断管理 469
位操作 470
转换函数 470
vremap 471
虚拟内存 472
处理内核空间错误 472
其他变化 474