阅读:1183回复:0
关于LINUX中的SCSI的问题
在SCSI中,SCSI适配器和SCSI设备之间是什么关系。
在rd.c中我看到了Scsi_Device_Template结构,在sym53c8xx.c中有Scsi_Host_Template结构。这两个应该分别是SCSI设备和SCSI适配器的标准接口。 我现在需要做一个虚拟的SCSI适配器,作为SLAVE。我想应该采用Scsi_Host_Template作为接口,来截获OS发下来的如TEST_UNIT_READY,MODE_SENSE,INQUIRY,READ,WRITE等命令,经过我的虚拟设备处理之后再发给系统中的SCSI适配器。请教这和块设备接口有什么关系吗? 谢谢。 还有,SCSI适配器是否也被系统作为一个标准的块设备? 我的想法是 先要构造一个Scsi_Host_Template,在该模板中来实现自己的功能。由于SCSI设备不同与一般的设备,有许多自己独特的命令,如TEST_UNIT_READY,MODE_SENSE,INQUIRY,READ,WRITE。因此,只有该模板才能模拟一个SCSI适配器来截获OS发给SCSI设备的命令。 如果模拟一个一般的块设备,OS只会发给他READ和WRITE命令,显然达不到要求。 问题1:我如何把自己的命令发到实际的SCSI适配器上,兄台说的real-scsi-device-task-queue(s)! 在哪里,我知道标准的块设备里是有这样的队列,但对SCSI就不是很清楚。 问题2:如何让实际的SCSI适配器不接受OS的命令,而接受我的虚拟DRIVER的命令呢? 思路正如兄台所讲,比较简单, 问题3:我是否需要注册一个块设备,用mknode只能注册快和字符设备。如果需要,这个块设备和我的Scsi_Host_Template之间又是什么关系? 问题4:tell you x-driver which real-SCSI device(s) to ctl ,请教这一点该如何去做? 在SCSI。C中 void scsi_initialize_queue(Scsi_Device * SDpnt, struct Scsi_Host * SHpnt) { blk_init_queue(&SDpnt->request_queue, scsi_request_fn); blk_queue_headactive(&SDpnt->request_queue, 0); SDpnt->request_queue.queuedata = (void *) SDpnt; } 这个函数应该是SCSI适配器的队列函数,因为调用了blk_init_queue ,但该函数仅仅在SCSI适配器注册的时候使用了,scsi_register_host(),和scsi_get_host_dev()。 SCSI的确很难读,也没有资料,请大家多指点。 |
|
|