设备驱动层

http://www.lupaworld.com/26540/action-spacelist-starttime-1243785600-endtime-1246377600.html

 

 

设备驱动层 图

 

 

 

 

 

 

 

 

 

 

 

 

Unix操作系统在最初设计的时候就将所有的设备都看成文件,也就是说,把设备纳入文件系统的范畴来管理。Linux操作系统的设计也遵循这一理念。把设备看成文件,具有以下含义:

(1)     每个设备都对应一个文件名,在内核中也就对应一个索引节点。应用程序通过设备的文件名寻访具体的设备,而设备则像普通文件一样受到文件系统访问权限控制机制的保护。

(2)     对文件操作的系统调用大都适用于设备文件。例如,通过open()系统调用可以打开设备文件,也就是说建立起应用程序与目标设备的连接。之后,就可以通过open()write()ioctl()等常规的文件操作对目标设备进行操作。

(3)     从应用程序的角度看,设备文件逻辑上的空间是一个线性空间(起始地址为0,每读取一个字节加1)。从这个逻辑空间到具体设备物理空间(如磁盘的磁道、扇区)的映射则是由内核提供,并被划分为文件操作和设备驱动两个层次。

由此可以看出,对于一个具体的设备而言,文件操作和设备驱动是一个事物的不同层次。从这种观点出发,从概念上可以把一个系统划分为应用、文件系统和设备驱动三个层次,如图所示。

Linux将设备分成两大类。一类是像磁盘那样以块或扇区为单位,成块进行输入/输出的设备,称为块设备;另一类像键盘那样以字符(字节)为单位,逐个字符进行输入/输出的设备,称为字符设备。文件系统通常都建立在块设备上。

对于不同的设备,其文件系统层的“厚度”有所不同。对于像磁盘这样结构性很强,并且内容需要进一步组织和抽象的设备来说,其文件系统就很“厚重”,这是由磁盘设备的复杂性决定的。一方面是对磁盘物理空间的立体描述,如柱面、磁道、扇区;另一方面是从物理空间到逻辑空间的抽象,如第一层抽象,即线性地址空间中的“块”,以及在块之上又一层组织和抽象,即“磁盘文件”。这样,在物理介质上的第一层抽象使操作者不必关心读/写的物理位置究竟在哪一个磁道,哪一个扇区;而第二层抽象则使操作者不必关心读/写的内容在哪一个逻辑“块”中。于是,我们把第一层抽象归为设备驱动,而把第二层抽象归为文件系统。另一方面,还有一些像字符终端这样的字符设备,其文件系统就比较“薄”,其设备驱动层也比较简单。

上图中,处于应用层的进程通过文件描述符fd与已打开文件的file结构相联系,每个file结构代表着对一个已打开文件操作的上下文。通过各个上下文,进程通过各个文件的线性逻辑空间对文件进行操作。对于普通文件,即磁盘文件,文件的逻辑空间在文件系统层内按具体文件系统的结构和规则映射到设备的线性逻辑空间,然后在设备驱动层进一步从设备的逻辑空间映射到其物理空间。这样一共经历了两次映射。或者,可以反过来说,磁盘设备的物理空间经过两层抽象而成为普通文件的线性逻辑空间。而对于设备文件,则文件的逻辑空间通常直接等价于设备的逻辑空间,所以在文件系统层不需要映射。

另外,为什么要把繁杂的设备归为“块设备”和“字符设备”两大类?这一方面是为了描述上的方便,更重要的是为了技术处理上的方便。与代表着文件的索引结点一样,代表着设备的索引节点中记载着与特定设备建立连接所需的信息。这种信息由三部分组成:文件(包括设备)的类型、主设备号和次设备号。其中设备类型和主设备号结合在一起唯一地确定了设备的驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。例如,当主设备号为2时,若设备类型为块设备就指软盘驱动器,而若为字符设备则是指所谓“伪终端(Pseudo TTY)”设备。

要使一项设备在系统中成为可见,成为应用程序可以访问的设备,首先要在系统中建立一个代表此设备的设备文件,这是通过系统调用mknode()实现的。除此之外,更重要的是在设备驱动层要有这种设备的驱动程序。

设备驱动层是直接与物理设备打交道的,在实际的实现中则因系统的结构和具体设备的物理特性不同而有不同的驱动方式。事实上,多数设备都是中断驱动的,而块设备往往都采用DMA(直接访问内存)方式,所以物理设备的输入/输出从本质上说大都是异步的。相比之下,文件操作既可以是同步的,也可以是异步的,但多数情况下是异步的。以从键盘读入一个字符过程为例,用户进程通过系统调用read()企图从标准输入文件读一个字符,但是真正的、物理意义上的从键盘读入通常并不是发生在用户进程调用read()的瞬间。如果在此之前,用户已经按了键,那么所敲的字符已经通过中断服务程序读了进来,放在缓冲区中等待由进程读取,此时上述read()操作立即就可以完成而返回这个字符。但是,如果缓冲区中没有字符可读,那当前进程通常要睡眠等待。等待到什么时候?等到用户按键的时候,那是异步的,也就是无法预测何时会发生的。从这个意义上说,设备驱动程序是上层的同步操作与低层的异步操作之间的桥梁。

 

字符驱动模型

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值