- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十二章加载设备驱动程序
第十二章 加载快设备驱动程序
正如在第一章“Linux核心简介”中“设备与模块的分类”中所概述的一样,Unix的设备驱动程序并不仅限于字符设备。本章就来介绍一下第二大类的设备驱动程序——块设备驱动程序。所谓面向块的设备是指数据传输是以块为单位的(例如软盘和硬盘),这里硬件的块一般被称作“扇区(Sector)”。而名词“块”常用来指软件上的概念:驱动程序常常使用1KB大小的块,即使扇区大小为512字节。
在这一章,我们将来构造一个全特征的块设备驱动程序sbull(Simple Block Utility for Loading Localities)。这个驱动程序与scull类似,也是使用计算机的内存作为硬件设备。换句话说,它是一个RAM-disk的驱动程序。sbull可以在任何Linux计算机上执行(不过我只在有限的几个平台上作过测试)。
注册驱动程序
和字符设备驱动程序类似,核心里的块设备驱动程序也是由一个主设备号来标识。用来对其进行注册和取消注册的函数是:
int register_blkdev(unsigned int major, const char*name, struct file_operations *fops)
int unregister_blkdev(unsigned int major, const char*name);
参数的含义与字符设备驱动程序一样,对主设备号的动态赋值也类似。因此,一个sbull设备与scull一样将自己注册:
result=register_blkdev(sbull_major,“sbull”,$sbull_fops);
if(result0){
printk(KERN_WARNING“sbull:can’t get major %d\n”,sbull_major);
return result;
}
if (sbull_major==0) sbull_major=result; /*dynamic*/
major=sbull_major; /*Use “major”later on to save typing*/
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中被声明和描述。
int blk_size[][];
这个数组由主设备号和次设备号索引。它以KB为单位描述了每个设备的大小。如果blk_size[major]是NULL,则不对这个设备的大小进行检查(也就是说,核心可能要求数据传送通过end_of_device)。
int blksize_size[][];
被每个设备所使用的块的大小,以字节为单位。与上一个数组类似,这个二维数组也是由主设备号和次设备号索引。如果blksize_size[major]是一个空指针,那么便假设其块大小为BLOCK_SIZE(目前是1KB)。块大小必须是2
文档评论(0)