需要使用SCSI CDB写入磁盘上的每个LBA。在这里,我构建了一个while / for循环来写入每个LBA。我使用10字节CDB。
我如何表示32位LBA,以便它从LBA 0迭代到Maximun LBA。如果我计划在每个LBA上写字,那么数据Tranfer lenght应该是什么?每个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;
}
答案 0 :(得分: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;
同样,你将整天等待一个大型驱动器,所以进行更改以在循环的每次迭代中写入大量的块。