07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

雨,总是在最纤细的时候飘逸;<br />

花,总是在将调零的时候让人惋惜;<br />

夜,总是在最深冷的时候令人希冀;<br />

在编写Linux 设备驱动时,在生与死的抉择中,我们总是无法逃避,我们总是要涉及内存管理.内存管理毫<br />

无疑问是Linux 内核中最复杂的一部分,能不涉及我们都希望别去涉及.但生活中总是充满了无奈,该来的<br />

还<br />

是会来.而我们倒是该庆幸,毕竟它不是每个月来一次.(这里说的是水电煤气费的单子,不许误解.)更不是八<br />

点档的连续剧,每天准时来赚你的眼泪.<br />

所以,usb_stor_access_xfer_buf()函数映入了人们的眼帘.<br />

首先判断srb->use_sg 是否为0.<br />

无聊的it 玩家们创建了有一个词,叫做scatter/gather,她是一种用于高性能IO 的标准技术.她通常意味<br />

着一种DMA 传输方式,对于一个给定的数据块,她老人家可能在内存中存在于一些离散的缓冲区,换言之,<br />

就<br />

是说一些不连续的内存缓冲区一起保存一个数据块,如果没有scatter/gather 呢,那么当我们要建立一个<br />

从内存到磁盘的传输,那么操作系统通常会为每一个buffer 做一次传输,或者干脆就是把这些不连续的<br />

buffer 里边的冬冬全都移动到另一个很大的buffer 里边,然后再开始传输.那么这两种方法显然都是效率<br />

不<br />

高的.毫无疑问,如果 操作系统/驱动程序/硬件 能够把这些来自内存中离散位置的数据收集起来(gather<br />

up)并转移她们到适当位置整个这个步骤是一个单一的操作的话,效率肯定就会更高.反之,如果要从磁盘向<br />

内存中传输,而有一个单一的操作能够把数据块直接分散开来(scatter)到达内存中需要的位置,而不再需要<br />

中间的那个块移动,或者别的方法,那么显然,效率总会更高.<br />

在struct scsi_cmnd 中,有一个成员unsigned short use_sg,上头传下来的scsi_cmnd,其use_sg<br />

是设好了的,咱们判断一下,如果她为0,那么说明没有使用scatter/gather.struct scsi_cmnd 中还有两个<br />

成员,unsigned request_bufflen 和void *request_buffer,她们和use_sg 是什么关系呢?<br />

事实上,要玩scatter/gather,就需要一个scatterlist 数组,有人管她叫散列表数组.对于不同的硬件平台,<br />

定义了不同的struct scatterlist 结构体,她们来自include/asm/scatterlist.h 中,(如果是硬件平台i386<br />

的,那么就是include/asm-i386/scatterlist.h,如果是x86_64 的平台,那么就在<br />

include/asm-x86_64/scatterlist.h 中),然后所谓的scatter/gather 就是一次把整个scatterlist 数组<br />

给传送掉.而use_sg 为0 就表示没有scatter gather list,或者说scatterlist,对于这种情况,数据将直接<br />

传送给request_buffer 或者直接从request_buffer 中取得数据.而如果use_sg 大于0,那么表示<br />

scatter gather list 这么一个数组就在request_buffer 中,而数组元素个数正是use_sg 个.也就是<br />

说,srb->request_buffer 里边的冬冬有两种可能,一种是包含了数据本身,另一种是包含了scatter<br />

gather list.具体是哪种情况通过判断use_sg 来决定.而接下来即将要讲到的srb->request_bufflen 顾<br />

135<br />

名思义,就是buffer 的长度,但对于use_sg 大于0 的情况,换言之,对于使用scatter gather list 的情<br />

况,request_bufflen 没有意义,将被忽略.<br />

对这些原理有了基本的了解之后,我们可以从下节开始看代码了.这里先提醒一下,要注意我们这个函数虽<br />

然看似是传输数据,可它实际上并没有和usb 真正发生关系,我们只是从软件上来fix 一个硬件的bug,这个<br />

bug 就是我们已经说过了的,不能响应基本的SCSI 命令INQUIRY,你问她,她完全不予理睬.至于为什么<br />

不<br />

能响应我就不用说了吧?人的冷漠,不是因为天生就如此,只是暗淡的心境早已将所有通向阳光的窗户关闭<br />

了.而设备的冷漠,显然是制造商做的傻事了.(我没有讽刺Sony 的意思,事实上这种情况并非只有Sony 他<br />

们家才出现了,别的厂家也有这样的产品.只是,Device 有bug,可以让程序去补,我们80 后的梦碎了,拿什<br />

么去补?)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!