实验七(补充):写一个块设备驱动

实验七(补充):写一个块设备驱动

ID:38230045

大小:54.50 KB

页数:5页

时间:2019-05-28

实验七(补充):写一个块设备驱动_第1页
实验七(补充):写一个块设备驱动_第2页
实验七(补充):写一个块设备驱动_第3页
实验七(补充):写一个块设备驱动_第4页
实验七(补充):写一个块设备驱动_第5页
资源描述:

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

1、试验七(补充):写一个块设备驱动staticint__initsimp_blkdev_init(void){return0;}staticvoid__exitsimp_blkdev_exit(void){}module_init(simp_blkdev_init);module_exit(simp_blkdev_exit);为了建立一个可用的块设备,我们需要做1件事情:用add_disk()向系统中添加这个块设备。添加一个全局的结构体指针:staticstructgendisk*simp_blkdev_disk;然后申明模块的入口和出口:modul

2、e_init(simp_blkdev_init);module_exit(simp_blkdev_exit);然后在入口处添加这个设备、出口处释放这个设备:staticint__initsimp_blkdev_init(void){add_disk(simp_blkdev_disk);return0;}staticvoid__exitsimp_blkdev_exit(void){del_gendisk(simp_blkdev_disk);}当然,在添加设备之前我们需要申请这个设备的资源,这用到了alloc_disk(),因此模块入口函数simp_b

3、lkdev_init()应该是:staticint__initsimp_blkdev_init(){simp_blkdev_disk=alloc_disk(1);if(!simp_blkdev_disk){ret=-ENOMEM;gotoerr_alloc_disk;}add_disk(simp_blkdev_disk);return0;err_alloc_disk:returnret;}还有别忘了在卸载模块的代码中也加一个行清理函数:put_disk(simp_blkdev_disk);还有就是,设备有关的属性是要设置的,因此在alloc_dis

4、k()和add_disk()之间我们需要:strcpy(simp_blkdev_disk->disk_name,SIMP_BLKDEV_DISKNAME);simp_blkdev_disk->major=(?1);simp_blkdev_disk->first_minor=0;simp_blkdev_disk->fops=(?2);simp_blkdev_disk->queue=(?3);set_capacity(simp_blkdev_disk,(?4);SIMP_BLKDEV_DISKNAME是这个块设备的名称,把它定义成宏了:#defineS

5、IMP_BLKDEV_DISKNAME"simp_blkdev"这里又引出了4个问号。第1个问号:每个设备需要对应的主、从驱动号。使用命令cat/proc/devices查看没有占用设备号。然后在?1的位置填上150。第2个问号:gendisk结构需要设置fops指针,虽然我们用不到,但该设还是要设的。好吧,就设个空得给它,在全局部分添加:structblock_device_operationssimp_blkdev_fops={.owner=THIS_MODULE,};然后把?2的位置填上&simp_blkdev_fops。第3个问号:首先介绍

6、请求队列的概念。对大多数块设备来说,系统会把对块设备的访问需求用bio和bio_vec表示,然后提交给通用块层。通用块层为了减少块设备在寻道时损失的时间,使用I/O调度器对这些访问需求进行排序,以尽可能提高块设备效率。关于I/O调度器在本章中不打算进行深入的讲解,但我们必须知道的是:1:I/O调度器把排序后的访问需求通过request_queue结构传递给块设备驱动程序处理。2:我们的驱动程序需要设置一个request_queue结构。申请request_queue结构的函数是blk_init_queue(),而调用blk_init_queue()

7、时需要传入一个函数的地址,这个函数担负着处理对块设备数据的请求。因此我们需要做的就是:1:实现一个staticvoidsimp_blkdev_do_request(structrequest_queue*q)函数。2:加入一个全局变量,指向块设备需要的请求队列:staticstructrequest_queue*simp_blkdev_queue;3:在加载模块时用simp_blkdev_do_request()函数的地址作参数调用blk_init_queue()初始化一个请求队列:simp_blkdev_queue=blk_init_queue(

8、simp_blkdev_do_request,NULL);if(!simp_blkdev_queue){ret=-ENOM

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

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

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