1

需要使用 SCSI CDB 写入磁盘上的每个 LBA。在这里,我构建了一个用于写入每个 LBA 的 while/for 循环。我正在使用 10 字节 CDB 。

我如何表示 32 位 LBA 以便它从 LBA 0 迭代到 Maximun LBA 。如果我打算在每个 LBA 上写入,数据传输长度应该是多少。每个 LBA 大小为 512 字节。

for(i=0;i<=max_lba;i++)
{
    ccb->cam_flags = DATA_OUT;
    ccb->cdb[0] = 0x2A;     /*  0x2A SCSI Opcode for write 10  CDB */
    ccb->cdb[1] = 0;
    ccb->cdb[2] = ?? ( LBA )
    ccb->cdb[3] = ?? ( LBA )
    ccb->cdb[4] = ?? ( LBA )       
    ccb->cdb[5] = ?? ( LBA )
    ccb->cdb[6] = 0;
    ccb->cdb[7] = ??      /* Data Transfer Length */
    ccb->cdb[8] = ??      /* Data Transfer Length */ 
    ccb->cdb[9] = 0;

    ccb->ccb_address = (long)ccb;
    ptr_data = (byte *)(buffer  + ccb->data_buf_ptr);

    data_pattern = i + (i << 4);
    buffer[ccb->data_buf_ptr ] = data_pattern;
}
4

1 回答 1

0

分配与此类似的 lba(但请注意,如果您要写入所有大型驱动器,它会非常慢......所以如果您写入大量块会更好,也许 1MB 然后调整下一个 LBA因此)。

cdb[2] = (i & 0xFF000000) >> 24;
cdb[3] = (i &   0xFF0000) >> 16;
cdb[4] = (i &     0xFF00) >> 8;
cdb[5] = (i &       0xFF);

对于上述情况,将块数设置为 1:cdb[7] = 0;cdb[8] = 1;

同样,您将整天等待大型驱动器,因此进行更改以在循环的每次迭代中写入大量块。

于 2013-08-26T15:46:12.837 回答