首页 理论教育ARM嵌入式系统设备驱动的重要数据结构

ARM嵌入式系统设备驱动的重要数据结构

【摘要】:用户应用程序调用设备的功能都是在设备驱动程序中定义的,也就是设备驱动程序中所定义的功能入口点函数。struct file_operations{};struct inode{};struct file{};编写设备驱动程序,很大一部分工作就是“填写”结构体中定义的函数。取得目录入口点,只用于与文件系统相关的设备驱动程序。一般编写设备驱动程序时并不一定要全部定义以上函数,只需定义对设备有意义的接口函数。fie结构主要是与文件系统对应的设备驱动程序使用。

用户应用程序调用设备的功能都是在设备驱动程序中定义的,也就是设备驱动程序中所定义的功能入口点函数(或称为功能接口函数)。这些设备的功能接口函数都被定义在<include/linux/fs.h>中的数据结构体里面。

struct file_operations{};

struct inode{};

struct file{};

编写设备驱动程序,很大一部分工作就是“填写”结构体中定义的函数。这是内核结构,不会出现在用户级的程序中。

1.file_operations{}结构体

在内核的内部,通过file_operations{}结构体提供文件系统的入口点函数,也就是访问设备驱动的功能接口函数。

在include//linux/fs.h>中所定义的file_operations{}结构体的结构如下:

在结构体file operations{}里,每一个成员的名字都对应着一个系统调用,对应着设备驱动程序所提供的入口点位置。在用户进程利用系统调用对设备文件进行操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个结构体相应的函数指针,接着把控制权交给该函数,这就是设备驱动程序的工作原理。

设备驱动程序所提供的入口点位置分别有以下几个:

(1)lseek。移动文件指针的位置,显然只能用于可以随机存取的设备。

(2)read进行读操作,参数buf为存放读取结果的缓冲区,count为所要读取的数据长度。返回值为负表示读取操作发生错误,否则返回实际读取的字节数。对于字符型,要求取的字节和返回实际读取字节数都必须是inode_>i_blksize的倍数。

(3)write。进行写操作,与read类似。

(4)readdir。取得目录入口点,只用于与文件系统相关的设备驱动程序。(www.chuimin.cn)

(5)select。进行选择操作,如果驱动程序没有提供select人口,select操作将会认为设备已经准备好进行任何的1/O操作。

(6)ioctl。进行读、写以外的其他操作,前面已有详细介绍。

(7)mmap。用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用。

(8)open。打开设备准备进行I/O操作,返回O表示打开成功,返回负数表示失败。如果驱动程序没有提供open入,则只要/dev/driver文件存在就认为打开成功。

(9)release。关闭设备并释放资源。

一般编写设备驱动程序时并不一定要全部定义以上函数,只需定义对设备有意义的接口函数。例如,一个仅有输出功能的设备只要定义一个write()函数,一个仅有输入功能的设备只要定义一个read()函数。在大多数的嵌入式系统的开发中,一般仅仅实现其中几个关键的接口函数,如open、read、write、ioctl、release等。

在编写用gcc编译的设备驱动程序时,经常使用一种更为方便的结构体形式:

当用gcc命令编译上述结构体时,对于没有显式声明的结构体成员都被gcc初始化为NULL。

2.inode{}和file{}结构体

文件系统处理文件所需要的信息在inode(索引节点)数据结构体中。inode中保存了“页”结构,用于进行设备缓冲,当进行读、写操作时,系统首先检查是否有inode存在,然后检查是否已经获得其缓冲内容。若没有则请求,若已经存在,则把被写的“页”作上标记。

inode数据结构体提供了关于特别设备文件/dev/driver(这里假设设备名为driver)的信息。

fie结构主要是与文件系统对应的设备驱动程序使用。当然,其他设备驱动程序也可以使用。