2011-7-10 13:50:21

来源:互联网 发布:常用有限元分析软件 编辑:程序博客网 时间:2024/05/16 15:20
 

 

2011-7-10 13:50:21


linux中将设备抽象成一个设备文件,可以通过和操纵普通文件相同的标准系统调用来打开、关闭、读取 和写入设备。
例如系统中第一个IDE硬盘被表示成/dev/hda。块(磁盘)设备和字符设备的设备文件可以通过mknod命令来创建,
并使用主从设备号来描述此设备。网络设备也用设备相关文件来表示,但Linux寻找和初始化网络设备时才建立这种文件。

在概念上一般把设备分为字符设备、块设备。字符设备是指设备发送和接收数据以字符形式的进行;而块设备则以块数据缓冲区的形式进行。
但是,由于网络设备等有其特殊性,实际上系统对它们单独处理。

字符设备指那些无需缓冲直接读写的设备,如系统的串口设备/dev/cua0和/dev/cua1。块设备则仅能以块为单位读写,
典型的块大小为512或1024字节。块设备的存取是通过buffer来进行并且可以进行随机访问,
即不管块位于设备中何处都可以对其进行读写。块设备可以通过其设备文件进行访问,但更为平常的访问方法是通过文件系统。
只有块设备才能支持可安装文件系统。网络设备可以通过BSD套接口访问。

统用主设备号(MAJOR)加次设备(MINOR)号来唯一标识一个设备。相同主设备号表示同一类设备,
例如都是硬盘;次设备号标识同类设备的个数。所有设备在适当的目录(通常在/dev目录下)下必须有相应的文件,
这样对字符设备和块设备的访问都可以通过文件操作的系统调用了完成。不同的是,块设备操作经常要和缓冲区打交道,
更加复杂一点。

Linux核心中虽存在许多不同的设备驱动但它们具有一些共性:

核心代码 设备驱动是核心的一部分,象核心中其它代码一样,出错将导致系统的崩溃。

核心接口 设备驱动必须为Linux核心或者其从属子系统提供一个标准接口。

例如终端驱动为Linux核心提供了一个文件I/O接口而SCSI设备驱动为SCSI子系统提供了一个SCSI设备接口,

同时此子系统为核心提供了文件I/O和buffer cache接口。

核心机制与服务 设备驱动可以使用标准的核心服务如内存分配、中断发送和等待队列等等。

动态可加载 多数Linux设备驱动可以作为模块进行加载,同时在不再使用时卸载。这样核心能有效地利用系统资源。

可配置 Linux设备驱动可以连接到核心中。当核心被编译时,哪些驱动被连入核心 是可配置的。

动态性 当系统启动及设备驱动初始化时将查找它所控制的硬件设备。如果某个设 备的驱动为一个空过程并不会有什么问题。

此时此设备驱动仅仅是一个冗余的程序,它除了会占用少量系统内存外不会对系统造成什么危害。

本章介绍了字符设备及块设备驱动程序的工作原理,以及如何编写字符设备与块设备驱动程序。


备文件及设备访问方式
轮询与中断
设备被执行某个命令时,如"将读取磁头移动到软盘的第42扇区上",设备驱动可以从轮询方式和中断方式中选择一种以判断设备是否已经完成此命令。

轮询方式意味着需要经常读取设备的状态,一直到设备状态表明请求已经完成为止。基于中断的设备驱动会在它所控制的硬件设备需要服务时引发一个硬件中断。

如以太网设备驱动从网络上接收到一个以太数据报时都将引起中断。

直接内存访问 (DMA) ===

数据量比较少时,使用中断驱动设备驱动程序能顺利地在硬件设备和内存之间交换数据。当数据量大的时候,如SCSI设备的数据传输率可达到每秒40M字节。

中断方式变量效率低且不可行,直接内存存取(DMA)是解决此类问题的有效方法。DMA控制器可以在不受处理器干预的情况下在设备和系统内存之间高速传输数据。