块设备驱动程序实现请求处理函数的两种方式

   最近在研究Linux块设备驱动程序,觉得陈雪松老师的《深入Linux设备驱动程序内核机制》讲得还算比较深入。当然第一遍读还是感觉有点晦涩的,也许这是大部分Linux内核书籍的通病吧,所以指望读一两遍就能把这类书研究透彻,对大部分内核与驱动初学者来说是不且实际的。下面是我读第二遍时感觉写得不错的地方,这里转载并总结一下,一来供自己复习,二来以飨读者。当然,这本书里面的闪光点是很多的,也有比这里写得更好的,只不过是我个人觉得下面这些是Linux块设备驱动中很基础、又很关键的一点。

   当其它内核组件(典型的如文件系统)通过submit_bio来向块设备提交数据传输请求时,根据驱动程序对请求处理函数设计的不同行为(也即通常所说的request和make_request方式),当这个请求最终到达驱动程序的请求处理函数时,读写请求参数出现的形式会有所变化,因此设备驱动程序必须有针对性地予以处理,下图显示了这一过程:
  

  通过对之前的分析及上图的展示,我们已经可以分清驱动程序用request和make_request两种方式实现请求处理的区别了:当驱动程序采用request方式时,外部组件发送给它的bio对象将首先被内核提供的函数__make_request拦截并处理,__make_request使用了复杂的逻辑来试图优化目标设备请求队列中的各个请求,以最大程度提升系统性能。__make_request在最终调用驱动程序前,会将bio对象中的相关数据结构转储到请求对象req中,然后把它作为参数传递给请求处理函数,所以后者利用传入的req对象便可知道当前请求的所有信息。当驱动程序使用make_request方式时,实际上用驱动程序自己实现的一个 make_request_fn类型的函数取代了系统提供的__make_request函数,这种情形下除了缺少了块子系统I/O调度器的参与外,驱动程序实现的make_request_fn类型的函数将直接面对bio,而不是请求对象req,因此需要显示地操作bio对象。
   具体在写Linux块设备驱动时选择哪种方式,依据的是要驱动的设备本身的特性。如果要驱动的设备是硬盘这种机械型的半随机存取设备,为了减少寻道时间,应选择request方式。如果要驱动的设备是SD卡、RAM盘、闪存这类完全随机存取的设备,因为不必使用块设备子系统提供的请求重排及合并机制,否则会适得其反地降低驱动系能,所以应使用make_request方式,直接处理bio请求会更好些。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值