gpt4 book ai didi

创建 SCSI 10 字节 CDB

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:20 34 4
gpt4 key购买 nike

我是 SCSI CDB 编程的新手。我有一些使用 6byte 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;

从上面的代码我没看懂cdb[2]和cdb[3]是怎么推导出来的?

在类似的线路上,我正在尝试为写命令开发 10 字节的 CDB。如何填写占LBA的cdb[2-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;

最佳答案

查看 SCSI SBC 标准。这是草稿形式的 SBC-3,但是 WRITE (6) 和 (10) 在相当长的一段时间内没有改变:http://www.t10.org/ftp/t10/document.05/05-344r0.pdf .

对于WRITE (6),cdb[2]和cdb[3]是逻辑 block 地址的低16位,不是传输长度。传输长度是您要写入的 block 数。地址是设备上您要开始写入它们的位置。如果它在磁盘的最开始,它是 LBA 0。如果设备有 512 字节的 block ,并且你想开始写入 1 MiB,你的地址是 LBA 2048。

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

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com