You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
是一种模版,很多情况都会被用到.她有很多元素,不过咱们mass storage 里边定义的变量<br />
usb_stor_host_template 并没有初始化所有的元素,只是初始化了其中一部分.实际<br />
上,scsi_host_template 正如其名字一样,代表的是scsi host,通俗一点说,一个scsi 卡,或者专业一点说<br />
102<br />
scsi 适配器,或者更专业的scsi 主机适配器,或者scsi 主机控制器,scsi 卡可以有多个,而在Linux 中,每<br />
一<br />
个scsi 卡对应一个数据结构,<strong>Scsi</strong>_Host(而Linux 中将通过使用一个scsi_host_template 结构指针为<br />
参<br />
数的函数来为<strong>Scsi</strong>_Host 初始化),但是有些<strong>Scsi</strong>_Host 对应的并非是真实的scsi 卡,硬件上并不存在,但<br />
仍然需要一个<strong>Scsi</strong>_Host,比如咱们的u 盘,因为她得被模拟成scsi 设备,所以得为她准备一个scsi 卡,虚<br />
拟<br />
的scsi 卡.回忆刚才cat /proc/scsi/scsi 的输出,有U 盘的情况,显示的scsi 信息多了最后这么一段,而其<br />
次呢,Host 号也多了一个,原来Host 只有scsi0,scsi1,而现在多出来一个scsi3.而这个scsi3 其实就是一<br />
个虚拟的scsi 卡.所以,为了创建这么一个虚拟的scsi 卡的数据结构,咱们在<br />
drivers/usb/storage/scsiglue.c 中定义了结构体变量struct scsi_host_template<br />
usb_stor_host_template.<br />
实际上<strong>Scsi</strong>_Host 也是一个变态的数据结构,咱们将在下节结合刚才提到的函数scsi_host_alloc 来讲<br />
解这些变态的数据结构.晕了吧,没办法,在这么多复杂的数据结构面前,也许只有琼瑶阿姨最近给中的设计的那段经典的连续13 个我晕的对白才能表达我们此刻的心情吧.<br />
<strong>Scsi</strong> 数据结构-像雾像雨又像风<br />
关于scsi,咱想说的是,在Linux 内核中,整个scsi 子系统被分为三层.upper level,mid level,lower<br />
level,也许您看到这心里很烦,Linux 为什么这么麻烦呢.就像某位大侠所说的:真不明白,女孩买很多很多<br />
漂<br />
亮衣服穿,就是为了吸引男孩的目光,但男孩想看的,却是不穿衣服的女孩.实际上,Linux 开发者们把scsi<br />
子<br />
系统包装成很多层,是为了给您提供方便,但是您看代码的时候却会感觉很烦,要是没有那么多层该多好.<br />
来说说这三层吧,upper level,用伟大的汉语来讲,就是最上层,她是和操作系统打交道的,比如您要是有<br />
一块scsi 硬盘,那么您就需要使用sd_mod.o 这么一个模块,她实际上是与硬件无关的,是纯粹的软件上的<br />
抽象出来的数据结构组建的模块.mid level,中层,实际上这层才是真正的核心层,江湖上人称scsi-core,即<br />
scsi 核心层,她提供了支持scsi 的核心数据结构和函数,这一层对应的模块是scsi_mod.o,系统中要想使<br />
用<br />
scsi 设备,首先必须加载她,反过来,只有所有的scsi 设备的模块都被卸载了才能够卸载她.陆游就曾如此形<br />
容scsi 核心层,无意苦争春,一任群芳妒.<br />
然后,是lower level,底层.很不幸,如果您要写驱动,八成就是写的底层,正如现实中的我们一样,生活在社<br />
会的最底层.因为upper level 和mid level 都已经基本上确定了,她们和硬件没关系.能留给您做的事情只<br />
能是底层.现实就是这样,尤其对80 后的来说,生存的压力让80 后不可能再如70 后那样,能做的只有面对<br />
现实.<br />
既然您需要关注的是底层,那么底层和中层或者说scsi 核心层是如何打交道的呢?首先您得知道,核心层<br />
提供了很多函数供底层使用,其中上一节见到的scsi_host_alloc()函数正是核心层提供的,后面还将遇到<br />
的一些函数也来自中层,对于scsi 中层提供的函数,咱们不需要去关心她究竟如何实现的,只看看她的声明<br />
即可.在include/scsi/scsi_host.h 中,有这么一行,<br />
527 extern struct <strong>Scsi</strong>_Host *scsi_host_alloc(struct scsi_host_template *, int);