我是SCSI CDB编程的新手。我用6字节CDB写了一些写命令的代码
ccb = (Exec_IO_CCB *)(buffer + header_size);
ccb->ccb_length = sizeof(Exec_IO_CCB);
ccb->cam_opcode = 0x1;
ccb->connect_id = 0;
ccb->data_buf_ptr = (long)(header_size + ccb->ccb_length + MAX_SENSE_LEN);
ccb->data_xfer_length = (long)(XFER_BUFSIZE - ccb->data_buf_ptr);
ccb->sense_buf_ptr = (long)(header_size + ccb->ccb_length);
ccb->sense_buf_length = MAX_SENSE_LEN;
ccb->time_out = CAM_TIMEOUT;
ccb->cdb_length = 6;
ccb->cam_flags = DATA_OUT;
ccb->cdb[0] = 0xA; /* 0xA SCSI Opcode for write operation */
ccb->cdb[1] = 0;
ccb->cdb[2] = (ccb->data_xfer_length & 0xFF0000) >> 16;
ccb->cdb[3] = (ccb->data_xfer_length & 0xFF00) >> 8;
ccb->cdb[4] = (ccb->data_xfer_length & 0xFF);
ccb->cdb[5] = 0;从上面的代码中,我不明白cdb2和cdb3是如何派生的?
在类似的线路上,我正在尝试开发用于write命令的10Byte CDB。如何填写占LBA的cdb2-5的数据?
ccb->cam_flags = DATA_OUT;
ccb->cdb[0] = 0x2A; /* 0x2A SCSI Opcode for write10 CDB */
ccb->cdb[1] = 0;
ccb->cdb[2] = ??
ccb->cdb[3] = ??
ccb->cdb[4] = ??
ccb->cdb[5] = ??
ccb->cdb[6] = 0;
ccb->cdb[7] = (ccb->data_xfer_length & 0xFF);
ccb->cdb[8] = (ccb->data_xfer_length & 0xFF);
ccb->cdb[9] = 0;发布于 2013-08-21 23:18:12
看看SCSI SBC标准。下面是草案形式的SBC-3,但WRITE (6)和(10)在很长一段时间内都没有变化:http://www.t10.org/ftp/t10/document.05/05-344r0.pdf。
对于WRITE (6),cdb2和cdb3是逻辑块地址的低16位,而不是传输长度。传输长度是您要写入的块数。地址是设备上您要开始写入它们的位置。如果它位于磁盘的最开始,则为LBA 0。如果设备有512字节块,而您想要开始写入1个MiB,则地址为LBA 2048。
发布于 2013-08-22 16:40:11
来看看http://en.wikipedia.org/wiki/SCSI_Write_Commands吧,这很简单。
发布于 2013-08-26 23:29:48
您不能将2048放入字节5,因为字节5是一个字节,而2048是一个短字节。请改用cdb4=((2048 & 0xFF00) >> 8)和cdb5=(2048 & 0xFF)。另外,对于cdb7,您已经分配了data_xfer_length的低位字节,但它应该是高位字节。
https://stackoverflow.com/questions/18349606
复制相似问题