首页 百科知识 设备驱动的基础知识

设备驱动的基础知识

时间:2022-10-12 百科知识 版权反馈
【摘要】:设备驱动在嵌入式系统中的地位毋庸置疑,离开了对设备的操作,很多嵌入式产品也就失去了意义。每个这样的“设备文件”都唯一的确定了系统中的一个设备。从应用程序的角度看,设备文件逻辑上的空间是个线性空间。图5-1描述了设备驱动分层的结构示意图。对设备的这种划分只是一个技术问题,因为在文件节点中记录着与特定设备建立连接所需的信息。注册Linux驱动的命令语法格式如下:

5.2 设备驱动的基础知识

设备驱动在嵌入式系统中的地位毋庸置疑,离开了对设备的操作,很多嵌入式产品也就失去了意义。我们知道在Linux系统下,所有的设备都是看成文件的,都纳入了文件系统的范畴,都通过文件操作的界面进行操作,也就是说文件操作是对设备操作的组织与抽象,而设备操作是对文件操作的最终实现。这就意味着:

(1)每一项设备都至少由一个文件(更确切的说是节点)代表,因而都有一个“文件名”。每个这样的“设备文件”都唯一的确定了系统中的一个设备。应用程序通过设备的文件名寻访具体的设备,而设备则像普通文件一样受到文件系统访问权限控制机制的保护。

(2)应用程序通常可以通过调用open()“打开”设备文件,建立起与目标设备的连接。代表着该设备的文件节点中记载着建立这种连接所需要的信息。对于执行该应用程序的进程而言,建立起的连接就表现为一个已打开的文件。

(3)打开了代表目标设备的文件,即建立起与设备的连接后,就可以通过read()、writer()、ioctl()等常规的文件操作对目标设备进行操作。从应用程序的角度看,设备文件逻辑上的空间是个线性空间。从这个逻辑空间到具体设备的物理空间的映射由内核提供,并划分成文件操作与设备驱动两个层次。

这样,对一个具体的设备来说,文件操作和设备驱动就成为同一事物的不同层次,而不是互相独立或平行的两个概念。图5-1描述了设备驱动分层的结构示意图。在这个示意图中,处于应用层的进程通过“打开文件号”fd与已打开文件的文件结构相联系。每个文件结构代表着对一个已打开文件操作的上下文。通过对各个上下文,进程使用各个文件的线性逻辑空间进行文件操作。对于普通文件,文件的逻辑空间在文件系统层按具体文件系统的结构和规则映射到设备的线性逻辑空间,然后在设备驱动层进一步从设备的逻辑空间映射到其物理空间。这样一共经历了两层映射。对于“设备文件”,文件的逻辑空间通常就直接等价于设备的逻辑空间,所以到文件系统层就不需要映射。但是,也有些设备需要在文件系统层中有一些简单的映射,从图还可以看出,对同一设备的不同的文件以不同的方式来操作。这里还需要指出的是,代表着设备文件的节点,都要通过某个索引节点才能访问,而对索引节点又要通过一些目录节点才能访问,这些目录节点实质上相当于普通文件,所以在打开设备文件的过程中即隐含着对普通文件的操作。Linux将设备分成两个大类。一类是像磁盘那样以记录块或“扇区”为单位,成块进行输入/输出的设备,称为“块设备”,比如/dev/had、/dev/ram等;另一类是像键盘那样以字符为单位,逐个进行输入/输出的设备,称为“字符设备”,比如/dev/video0、/dev/fb0等。文件系统通常是建立在块设备上,但是也并无规定说在字符设备上就不可以建立文件系统。对设备的这种划分只是一个技术问题,因为在文件节点中记录着与特定设备建立连接所需的信息。这种信息由三个部分组成:第一个部分是文件(包括设备)的类型,第二个部分是一个“主设备号”,第三个部分是一个“次设备号”,其中设备类型和主设备号唯一的确定了设备的驱动程序及其界面,而次设备号则说明了目标设备是同类设备中的第几个。Linux系统下的设备都注册在/dev目录下面,我们可以用“ls-lsa”命令来查询当前可用的设备。

img111

图5-1 设备驱动分层结构示意图

#cd/dev

#ls-lsa

设备的注册是通过mknod()来进行的,mknod()可以创建任何类型的文件(目录除外),包括普通文件、特殊文件以及设备文件。不过由于其他类型的文件大都有专用的系统代用,如普通文件可以用creat()创建,FIFO可以用pipe创建,所以mknod()主要用于设备文件的创建。注册Linux驱动的命令语法格式如下:

img112

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈