ii
Linux 设备驱动程序
(第二版)
iii
内容提要
本书面向的读者,是那些想在 Linux 操作系统下支持各种计算机外设,或者想开发新的硬件并在
Linux 下运行的人们。Linux 是 Unix 市场中增长最为快速的部分,并且在许多应用领域获得了广
泛而热情的支持。现在,人们越来越清楚地认识到 Linux 是嵌入式系统的一个极好平台。《Linux
设备驱动程序》已经成为该领域的一流著作,此书将以往那些口述式的经验和知识,或者隐晦的源
代码注释变成了系统地讲述各种设备驱动程序编写方法的著作。
Linux 内核的 2.4 版在设备驱动程序方面发生了重大变化,它简化了许多工作,但同时提供了许多
新的功能,可让驱动程序更加有效而且灵活。本书第二版彻底讲述了这些变化,并介绍了许多新的
处理器和总线结构。
要阅读此书,并不要求读者成为一名内核黑客;我们仅仅希望读者理解 C 语言并熟悉 Unix 系统
调用。我们循序渐进地讲述了字符设备、块设备和网络设备的驱动程序,并且给出了功能完善的示
例驱动程序。这些示例驱动程序说明了驱动程序设计中的许多问题以及解决方法,并且不需要任何
特定的硬件就可以运行。本书第二版的重要修订包括:对对称多处理器(SMP)系统和锁机制的讨
论、对新 CPU 的支持以及新近支持的总线的讨论等等。
如果读者对操作系统完成其任务的方式感兴趣,本书则提供了对地址空间、异步事件和 I/O 的深
入讨论。
可移植性是本书的一个主要关注点。尽管本书主要讲述 2.4 版本,但只要可能,我们也会讲述向
后直到 2.0 版本的相关内容。《Linux 设备驱动程序》也讲述了如何在各种硬件平台上实现最大的
可移植性;示例驱动程序已经在 IA32(PC)和 IA64、PowerPC、SPARC 和 SPARC64、Alpha、
ARM 以及 MIPS 等平台上经过了测试。
iv
作者简介
Alessandro Rubini 在他获得电子工程师职称后不久,就安装了 Linux 0.99.14 版本。后来,他
在 Pavia 大学获得了计算机科学博士学位。但很快他就离开了大学,因为他实在不想写很多的论
文。现在,他是一名自由撰稿人,编写和设备驱动程序相关的文章和论文(很有讽刺意味)。在他
的小孩出世之前,他曾是一名年轻的黑客;而现在则是一名年老的、偏爱非 PC 计算机平台开发
的自由软件鼓吹者。
Jonathan Corbet 早在 1981 年就接触了 BSD Unix 的源代码。那时,科罗拉多大学的一名教
员让他“修正”其中的分页算法。从那时起直到现在,他深入研究了他所遇到的每一个系统,其中
包括 VAX、Sun、Ardent 以及 x86 系统的驱动程序。他在 1993 年第一次接触 Linux 系统,从
此以后一直从事 Linux 的开发。Corbet 先生是 Linux Weekly News (http://LWN.net) 的奠基人和执
行主编;他和妻子及两个孩子生活在科罗拉多州巨石市。
目 录
i
目 录
前 言 ....................................................... i
Alessandro 的介绍 ............................................................................................................i
Jon 的介绍........................................................................................................................ii
本书面向的读者 ...............................................................................................................ii
内容的组织 ......................................................................................................................iii
背景信息 ..........................................................................................................................iii
其它信息来源 ..................................................................................................................iv
在线版本和条款 ...............................................................................................................v
本书使用的约定 ...............................................................................................................v
我们希望得到来自读者的反馈 ......................................................................................vi
致谢 ..................................................................................................................................vi
第 1 章 设备驱动程序简介 .................................... 1
1.1 设备驱动程序的作用 ..............................................................................................2
1.2 内核功能划分 ..........................................................................................................3
进程管理......................................................................................................................................................3
内存管理......................................................................................................................................................4
文件系统......................................................................................................................................................4
设备控制......................................................................................................................................................4
网络功能......................................................................................................................................................4
1.3 设备和模块分类 ......................................................................................................5
字符设备......................................................................................................................................................5
块设备.......................................................................................................................................................... 5
网络接口......................................................................................................................................................5
1.4 安全问题 ..................................................................................................................6
1.5 版本编号 ..................................................................................................................7
1.6 许可证条款 ..............................................................................................................8
1.7 加入内核开发社团 ..................................................................................................9
1.8 本书概要 ..................................................................................................................9
第 2 章 构造和运行模块 ..................................... 11
2.1 核心模块与应用程序的对比 ................................................................................12
2.1.1 用户空间和内核空间..................................................................................................... 14
2.1.2 内核中的并发................................................................................................................. 15
2.1.3 当前进程......................................................................................................................... 15
2.2 编译和装载 ............................................................................................................16
2.2.1 版本依赖......................................................................................................................... 18
2.2.2 平台依赖......................................................................................................................... 19
2.3 内核符号表 ............................................................................................................20
2.4 初始化和关闭 ........................................................................................................22
2.4.1 init_module 中的出错处理 ............................................................................................22