设备驱动程序分类

5
根据我所拥有的两本设备驱动程序书(针对Linux),尤其是O'REILLY版本("Linux Device Drivers(3rd edition)"),设备驱动程序可以分为3类:
  1. 字符驱动程序,一次读/写一个字节的数据。
  2. 块设备驱动程序,读/写数据块(文件存储设备)。
  3. 网络驱动程序,发送和接收帧(对于以太网和WiFi,这些都是48位数据块)。
那么视频和声音驱动程序属于哪一类?我之所以问是因为据我所知,您的屏幕具有将帧从主板发送到监视器的总线,并且屏幕上的图像是刷新在每秒特定数量的帧的内存映射(一个方形的数组)。声音驱动程序也会以44.1KHz的采样率向DAC发送16位(2字节)帧。这些是否属于字符驱动程序?我认为它们应该与网络驱动程序处于类似的类别中,因为网络接口、屏幕、扬声器、麦克风和网络摄像头都是读取和写入帧(字节数组)的设备。
2个回答

7
更准确地描述这些设备的类型应该是:
字符设备处理数据流。你可以向它们写入数据,也可以从它们读取数据,但你不能跳过数据。如果没有数据可用,则从中读取数据可能会阻塞。常见的字符设备包括终端、串口和特殊设备,例如/dev/null和/dev/random。虽然这不一定是一个字节一次,许多设备将数据作为较大的帧返回。例如,在/dev/input下的Linux输入设备以32字节的帧返回数据,每个帧表示一个事件。
块设备处理固定大小的数据块。你可以读取和写入想要的任何位置的数据,并使用mmap()将它们映射到内存中。它们通常用于表示存储设备(如磁盘),但也可以用于表示其他更不寻常的东西。
网络设备是一个特殊情况。它们更或多或少地专门用于实际与网络接口的设备(例如,以太网NIC、无线网络硬件、手机调制解调器等)。它们根本不出现在/dev下。
字符设备和块设备都可以使用ioctl()实现不适合正常框架的特殊操作(例如,更改串口的波特率、弹出CD等),所以在某种程度上,使用哪个设备可以有点随意。然而,对于你所描述的设备类型:
音频设备通常表示为字符设备。
旧的OSS Linux声音系统将声音设备表示为/dev/dsp:从中读取数据将读取PCM数据,表示麦克风输入,向其写入PCM数据将通过声卡播放它。更现代的ALSA声音系统使用一组更复杂的设备和格式,但概念是相同的。
视频设备是一个不寻常的情况。
一些简单的“帧缓冲”视频驱动程序实现为块设备,例如/dev/fb0。该设备表示屏幕上的图像 - 例如使用32位颜色的1024x768屏幕将由3 MB缓冲区表示 - 并且写入它会改变该图像。它最常用于将其映射到内存中。
但大多数现代视频设备不那么简单。其中许多部分是作为内核驱动程序和X11设备驱动程序实现的,可以直接映射和写入视频硬件。它们有时可能包含额外的字符或块设备(例如,某些Nvidia图形卡使用字符设备/dev/nvidia),但从这个设备读取或写入的数据的详细信息在很大程度上是专有的。

谢谢您的回答!我有一个问题:您是说对于现代视频设备,它在不同的视图中既可以是字符设备也可以是块设备吗?在我的计算机上,/dev/dri/card* 是字符设备。 - roachsinai


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接