HyperNews Linux KHG 讨论页面

什么是设备驱动程序?

让硬件工作是很繁琐的。例如,要写入硬盘,需要你在特定的位置写入魔数,等待硬盘表示它已准备好接收数据,然后非常小心地将它想要的数据馈送给它。写入软盘甚至更难,并且需要程序在软盘驱动器运行时几乎持续地监控它。

与其在你编写的每个应用程序中都放入控制每个设备的代码,不如在应用程序之间共享代码。为了确保该代码不被破坏,你需要保护它免受用户和使用它的普通程序的侵害。如果你做得对,你将能够在不更改任何应用程序的情况下从系统中添加和删除设备。此外,你需要能够将你的程序加载到内存中并运行它,这也是操作系统所做的。因此,操作系统本质上是一个特权的、通用的、可共享的底层硬件、内存和进程控制函数和例程库。

所有版本的 Unix 都有一种抽象的读取和写入设备的方式。通过使设备尽可能地像常规文件一样工作,相同的调用(read(), write()等)可以用于设备和文件。在内核中,有一组函数,已在文件系统中注册,当请求对代表设备的“设备特殊文件”执行 I/O 操作时,会调用这些函数。(请参阅mknod(1,2)以获得关于如何创建这些文件的解释。)

由同一设备驱动程序控制的所有设备都被赋予相同的主设备号,而在具有相同主设备号的设备中,不同的设备通过不同的次设备号来区分。(这并非完全正确,但已经足够接近了。如果你理解它不正确的地方,你就不需要阅读本节,如果你不理解但想学习,请阅读 tty 设备的代码,它使用了 2 个主设备号,并且在你阅读本文时可能会使用第三个甚至第四个。此外,“misc”主设备支持许多只需要少量次设备号的次设备;我们稍后会讨论这个问题。)

本章解释了如何编写你可能需要的任何类型的 Linux 设备驱动程序,包括字符设备驱动程序、块设备驱动程序、SCSI 驱动程序和网络驱动程序。它解释了你需要编写哪些函数,如何初始化你的驱动程序并有效地为它们获取内存,以及 Linux 内置了哪些函数来使你的工作更轻松。

为 Linux 创建设备驱动程序比你想象的要容易。它仅仅涉及编写一些函数并将它们注册到虚拟文件系统交换 (VFS) 中,这样当访问适当的设备特殊文件时,VFS 就可以调用你的函数。

但是,这里有必要发出警告:编写设备驱动程序就是编写 Linux 内核的一部分。这意味着你的驱动程序以内核权限运行,并且可以做任何它想做的事情:写入任何内存,重新格式化你的硬盘驱动器,损坏你的显示器或显卡,甚至损坏你的盘子,如果你的洗碗机是由你的计算机控制的。请小心。

此外,你的驱动程序将在内核模式下运行,而 Linux 内核,像大多数 Unix 内核一样,是不可抢占的。这意味着如果你的驱动程序花费很长时间工作而没有给其他程序工作的机会,那么当你的驱动程序运行时,你的计算机将显得“冻结”。正常的用户模式抢占式调度不适用于你的驱动程序。

版权所有 (C) 1992, 1993, 1994, 1996 Michael K. Johnson, johnsonm@redhat.com。


消息

1. None: 问题? 作者:Rose Merone
-> News: 尚未... 作者:Michael K. Johnson