由于经常学习Unix操作系统的一些知识,而且很喜欢Unix操作系统,在工作中也很喜欢总结关于Unix操作系统相关的经验教训,下面就Unix操作系统下的设备驱动程序问题来详细说说吧。
Unix操作系统下的设备驱动程序
具体到系统里,设备驱动程序所提供的这组入口点由一个结构来向系统进行说明,其中,struct inode提供了关于特别设备文件/dev/driver(假设此设备名为driver)的信息,它的定义为:
dev_t i_rdev& /* Device major and minor numbers*/
struct vm_area_struct * i_mmap&
unsigned short i_flags& /* Mount flags see fs.h */
struct file主要用于与Unix操作系统文件系统对应的设备驱动程序使用。当然,其它设备驱动程序也可以使用它。它提供关于被打开的文件的信息,定义为:unsigned short f_flags& /* The flags arg passed to open */
在结构file_operations里,指出了设备驱动程序所提供的入口点位置,分别是:
1 lseek,移动文件指针的位置,显然只能用于可以随机存取的设备。
2 read,Unix操作系统进行读操作,参数buf为存放读取结果的缓冲区,count为所要 读取的数据长度。返回值为负表示读取操作发生错误,否则返回实际读取 的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必须是inode- i_blksize的的倍数。
3 write,进行写操作,与read类似。
4 readdir,取得下一个目录入口点,只有与Unix操作系统文件系统相关的设备驱动程序 才使用。
5 selec,进行选择操作,如果驱动程序没有提供select入口,select操 作将会认为设备已经准备好进行任何的I/O操作。
6 ioctl,进行读、写以外的其它操作,参数cmd为自定义的的命令。
7 mmap,用于把设备的内容映射到地址空间,一般只有块设备驱动程序使 用。
8 open,打开设备准备进行I/O操作。返回0表示打开成功,返回负数表示失败。如果驱动程序没有提供open入口,则只要/dev/driver文件存在就认为打开成功。
9 release,即close操作。 设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进行登 记,以便系统在适当的时候调用。LINUX系统里,通过调用register_chrdev 向系统注册字符型设备驱动程序。register_chrdev定义为:
int register_chrdevunsigned int major, const char *name,
其中,major是为设备驱动程序向Unix操作系统申请的主设备号,如果为0则Unix操作系统为此 驱动程序动态地分配一个主设备号。name是设备名。fops就是前面所说的对各个 调用的入口点的说明。此函数返回0表示成功。返回-EINVAL表示申请的主设备号 非法,一般来说是主设备号大于系统所允许的***设备号。返回-EBUSY表示所申 请的主设备号正在被其它设备驱动程序使用。
如果是动态分配主设备号成功,此 函数将返回所分配的主设备号。如果register_chrdev操作成功,设备名就会出 现在/proc/devices文件里。
初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时 钟、I/O端口等,这些资源也可以在open子程序或别的地方申请。在这些资源不 用的时候,应该释放它们,以利于资源的共享。 在Unix操作系统里,对中断的处理是属于系统核心的部分,因此如果设备与系
统之间以中断方式进行数据交换的话,就必须把该设备的驱动程序作为Unix操作系统核心的一部分。设备驱动程序通过调用request_irq函数来申请中断,通过free_irq 来释放中断。
以上,我们就完成了对Unix操作系统下的设备驱动程序介绍。希望对大家对Unix操作系统的学习有所帮助。
【编辑推荐】