写入磁盘上的每个LBA

时间:2013-08-25 10:17:25

标签: scsi

需要使用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;
}

1 个答案:

答案 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;

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