我是SCSI-CDB编程新手我有一段代码是用6字节的CDB编写的write命令

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;

从上面的代码我不明白cdb[2]和cdb[3]是如何派生出来的?
在类似的行中,我试图开发10字节的CDB用于写命令。
如何填写国开行[2-5]的LBA账户数据?
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;

最佳答案

查看SCSI SBC标准这是SBC-3的草稿,但是WRITE(6)和(10)在很长一段时间内没有改变:http://www.t10.org/ftp/t10/document.05/05-344r0.pdf
对于写(6),cdb[2]和cdb[3]是逻辑块地址的低16位,而不是传输长度传输长度是要写入的块数地址是设备上你要开始写它们的地方。如果它在磁盘的最开始,它是LBA 0如果设备有512字节块,并且要开始写入1 MiB,则地址为LBA 2048。

关于c - 创建SCSI 10字节CDB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18349606/

10-15 03:23