logo

您所在位置网站首页 > 海量文档  > 教育文化 > 教育文化

加载快设备驱动程序.doc 14页

本文档一共被下载: ,您可全文免费在线阅读后下载本文档。

  • 支付并下载
  • 收藏该文档
  • 百度一下本文档
  • 修改文档简介
全屏预览

下载提示

1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
下载地址
需要金币:150    文档纠错   收藏文档   下载帮助
支付并下载
第十二章加载快设备驱动程序正如在第一章“Linux核心简介”中“设备与模块的分类”中所概述的一样,Unix的设备驱动程序并不仅限于字符设备。本章就来介绍一下第二大类的设备驱动程序——块设备驱动程序。所谓面向块的设备是指数据传输是以块为单位的(例如软盘和硬盘),这里硬件的块一般被称作“扇区(Sector)”。而名词“块”常用来指软件上的概念:驱动程序常常使用1KB大小的块,即使扇区大小为512字节。在这一章,我们将来构造一个全特征的块设备驱动程序sbull(SimpleBlockUtilityforLoadingLocalities)。这个驱动程序与scull类似,也是使用计算机的内存作为硬件设备。换句话说,它是一个RAM-disk的驱动程序。sbull可以在任何Linux计算机上执行(不过我只在有限的几个平台上作过测试)。注册驱动程序和字符设备驱动程序类似,核心里的块设备驱动程序也是由一个主设备号来标识。用来对其进行注册和取消注册的函数是:intregister_blkdev(unsignedintmajor,constchar*name,structfile_operations*fops)intunregister_blkdev(unsignedintmajor,constchar*name);参数的含义与字符设备驱动程序一样,对主设备号的动态赋值也类似。因此,一个sbull设备与scull一样将自己注册:result=register_blkdev(sbull_major,“sbull”,$sbull_fops);if(result<0){printk(KERN_WARNING“sbull:can’tgetmajor%d\n”,sbull_major);returnresult;}if(sbull_major==0)sbull_major=result;/*dynamic*/major=sbull_major;/*Use“major”laterontosavetyping*/register_blkdev的fops参数与我们在字符设备驱动程序中使用的类似,为read,write以及fsync的操作并不要求针对某个驱动程序。通用函数block_read,block_write及block_fsync被用来代替任何针对某个驱动程序的函数。另外,check_media_change和revalidate对块设备驱动程序也有意义,二者都在sbull_fops中定义。在sbull中使用的fops结构如下:(代码236)通用的读写操作被用来获得较高的性能。通过数据缓冲获得加速,这在字符设备驱动程序重中是没有的。块设备驱动程序可以被缓冲是因为它们的数据服从于计算机的文件层次结构,任何应用程序都无法直接访问,而字符设备驱动程序则不是这样。不过,当缓冲的高速缓存不能满足一个读请求或当一个待处理的写操作要刷新到物理磁盘上时,驱动程序必须被调用来进行真正的数据传送。fops结构除了read和write外,并不带有入口点,因此,必须要一个额外的结构blk_dev_struct来发出对实际数据传送的请求。这个结构在<linux/blkdev.h>定义,它有几个域,但只有第一个域需被驱动程序设置。下面是这个结构在核心2.0中的定义。(代码237)当核心需要为sbull设备产生一个I/O操作时,它便调用函数blk_dev[sbull_major].request_fn。因此这个模块的初始化函数须设置这个域使其指向它自己的请求函数。这个结构中的其它域只供核心函数或宏进行内部使用;你不必在你的代码段中显式地使用它们。一个块设备驱动程序模块与核心的关系见图12-1。除了blk_dev还有几个数组带有块设备驱动程序的信息。这些数组一般由主设备号(有时也用次设备号)进行索引。它们在drivers/block/ll_rw_block.c中被声明和描述。intblk_size[][];这个数组由主设备号和次设备号索引。它以KB为单位描述了每个设备的大小。如果blk_size[major]是NULL,则不对这个设备的大小进行检查(也就是说,核心可能要求数据传送通过end_of_device)。intblksize_size[][];被每个设备所使用的块的大小,以字节为单位。与上一个数组类似,这个二维数组也是由主设备号和次设备号索引。如果blksize_size[major]是一个空指针,那么便假设其块大小为BLOCK_SIZE(目前是1KB)。块大小必须是2的幂,因为核心使用移位操作将偏移量转换为块号。inthardsect_size[][];与其它的一样,这个数据结构也是由主设备号和次设备号索引。硬件扇区的缺省大小为512字节。直到包括2.0.X

请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片

©2010-2013 max.book118.com在线文档投稿赚钱网. All Rights Reserved 蜀ICP备08101938号