您的位置:首页 > 运维架构 > Linux

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

2014-05-25 20:52 323 查看
   最近在研究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请求会更好些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  块设备 驱动 linux
相关文章推荐