实验七:linux块设备驱动

实验七:linux块设备驱动

ID:27493026

大小:113.00 KB

页数:14页

时间:2018-12-04

实验七:linux块设备驱动_第1页
实验七:linux块设备驱动_第2页
实验七:linux块设备驱动_第3页
实验七:linux块设备驱动_第4页
实验七:linux块设备驱动_第5页
资源描述:

《实验七:linux块设备驱动》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、实验七:Linux块设备驱动块设备是与字符设备并列的概念,这两类设备在Linux中驱动的结构有较大差异,总体而言,块设备驱动比字符设备驱动要复杂得多,在I/O操作上表现出极大的不同,缓冲、I/O调度、请求队列等都是与块设备驱动相关的概念。本章将详细讲解Linux块设备驱动的编程方法。1.块设备的I/O操作特点字符设备与块设备I/O操作的不同如下:(1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位。大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作。(2)块设备对于I/

2、O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设备无须缓冲且被直接读写。对于存储设备而言调整读写的顺序作用巨大,因为在读写连续的扇区比分离的扇区更快。(3)字符设备只能被顺序读写,而块设备可以随机访问。虽然块设备可随机访问,但是对于磁盘这类机械设备而言,顺序地组织块设备的访问可以提高性能。而对SD卡、RamDisk(RamDisk是通过使用软件将RAM模拟当做硬盘来使用的一种技术)等块设备而言,不存在机械上的原因,进行这样的调整没有必要。2.Linux块设备驱动结构2.1.block_d

3、evice_operations结构体在块设备驱动中,有一个类似于字符设备驱动中file_operations结构体的block_device_operations结构体,它是对块设备操作的集合,定义如代码清单1所示。代码清单1block_device_operations结构体structblock_device_operations{int(*open)(structinode*,structfile*);//打开int(*release)(structinode*,structfile*);//释

4、放int(*ioctl)(structinode*,structfile*,unsigned,unsignedlong);//ioctllong(*unlocked_ioctl)(structfile*,unsigned,unsignedlong);long(*compat_ioctl)(structfile*,unsigned,unsignedlong);int(*direct_access)(structblock_device*,sector_t,unsignedlong*);int(*media

5、_changed)(structgendisk*);//介质被改变int(*revalidate_disk)(structgendisk*);//使介质有效int(*getgeo)(structblock_device*,structhd_geometry*);//填充驱动器信息structmodule*owner;//模块拥有者};下面对其主要的成员函数进行分析。1.打开和释放int(*open)(structinode*inode,structfile*filp);int(*release)(str

6、uctinode*inode,structfile*filp);与字符设备驱动类似,当设备被打开和关闭时将调用它们。2.IO控制int(*ioctl)(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg);上述函数是ioctl()系统调用的实现,块设备包含大量的标准请求,这些标准请求由Linux块设备层处理,因此大部分块设备驱动的ioctl()函数相当短。3.介质改变int(*media_changed)(structgend

7、isk*gd);被内核调用来检查是否驱动器中的介质已经改变,如果是,则返回一个非0值,否则返回0。这个函数仅适用于支持可移动介质的驱动器,通常需要在驱动中增加一个表示介质状态是否改变的标志变量,非可移动设备的驱动不需要实现这个方法。4.使介质有效int(*revalidate_disk)(structgendisk*gd);revalidate_disk()被调用来响应一个介质改变,它给驱动一个机会来进行必要的工作以使新介质准备好。5.获得驱动器信息int(*getgeo)(structblock_de

8、vice*,structhd_geometry*);根据驱动器的几何信息填充一个hd_geometry结构体,hd_geometry结构体包含磁头、扇区、柱面等信息。6.模块指针structmodule*owner;一个指向拥有这个结构体的模块的指针,它通常被初始化为THIS_MODULE。2.2.gendisk结构体在Linux内核中,使用gendisk(通用磁盘)结构体来表示1个独立的磁盘设备(或分区),这个结构体的定义如代码清单2所示

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。