因此,根据我的两本关于设备驱动程序的书(适用于Linux),值得注意的是O'REILLY版本("Linux设备驱动程序(第三版)")有三种类型的设备驱动程序:
-
一次读取/写入字节数据的字符驱动程序。
-
读取和写入数据块(文件存储设备)的块驱动程序。
-
发送和接收帧的网络驱动程序(对于以太网和wifi,这些是48位的数据块)。
那么,视频和声音驱动程序在哪里合适呢?我问这个问题是因为AFAIK你的屏幕有一条总线,可以将帧从主板发送到显示器,而你屏幕上的图像是一个内存映射(一个方形阵列),以一定的帧/秒刷新。声音驱动器还以44.1KHz的采样率向DAC发送16位(2字节)帧。这些是角色驱动因素吗?我认为它们与网络驱动程序属于类似的类别,因为网络接口、屏幕、扬声器、麦克风和网络摄像头都是读取和写入帧(字节数组)的设备。
描述这些类型设备的更准确的方法是:
-
字符设备处理数据流。您可以向它们写入数据,也可以从中读取数据,但不能跳过。如果没有可用的数据,从中读取数据可能会被阻止。常见的字符设备包括终端、串行端口和特殊设备,如
/dev/null
和/dev/random
。不过,这不一定是一次一个字节:许多设备都以较大的帧形式返回数据。(例如,/dev/input
下的Linux输入设备以32字节帧的形式返回数据,每个帧代表一个事件。) -
块设备处理一个固定的数据块。您可以将数据读写到它们中的任何位置,也可以使用
mmap()
将它们映射到内存。它们通常用于表示存储设备(如磁盘),但也可以用于表示其他更不寻常的东西。 -
网络设备是一种特殊情况。它们或多或少专门用于实际与网络接口的设备(例如,以太网NIC、无线网络硬件、蜂窝调制解调器等)。它们根本没有出现在
/dev
中。
字符和块设备都可以使用ioctl()
实现不适合正常框架的特殊操作(例如,更改串行端口的波特率、弹出CD等),因此,在某种程度上,使用哪种操作的决定可能有些随意。然而,对于您所描述的设备类型:
-
音频设备通常表示为字符设备。
旧的OSS Linux声音系统将声音设备表示为
/dev/dsp
:从中读取数据将读取代表麦克风输入的PCM数据,并将PCM数据写入其中将通过声卡播放。更现代的ALSA音响系统使用了一套更复杂的设备和格式,但概念是一样的。 -
视频设备是一种不寻常的情况。
一些简单的"帧缓冲区"视频驱动程序被实现为块设备,如
/dev/fb0
。这个设备表示屏幕上的图像——例如,使用32位颜色的1024x768屏幕将由3MB缓冲区表示——写入它会更改图像。它最常用的方法是将它映射到内存中。不过,大多数现代视频设备并没有那么简单。它们中的许多部分实现为内核驱动程序,部分实现为X11设备驱动程序,可以直接映射和写入视频硬件。它们有时可能包括一个额外的字符或块设备(例如,一些Nvidia显卡使用字符设备
/dev/nvidia
),但从该设备读取或写入哪些数据的细节在很大程度上是专有的。
它们是字符驱动程序。
gfxhttp://www.x.org/wiki/Development/Documentation/HowVideoCardsWork/
音频http://www.alsa-project.org/~tiwai/编写alsa驱动程序/