07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

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);

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

Saved successfully!

Ooh no, something went wrong!