2013-08-25 106 views
1

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

我如何表示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; 
} 

回答

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;

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

+0

嗯,再次看我没有看到你在哪里写每个迭代。不要忘记这样做。 – eddyq

+0

非常感谢您的信息。新的CDB看起来像这样 – arun

+0

ccb-> cam_flags = DATA_OUT; ccb-> cdb [0] = 0x2A; ccb-> cdb [1] = 0; ccb-> cdb [2] =(i&0xFF000000)>> 24; \t ccb-> cdb [3] =(i&0xFF0000)>> 16; \t ccb-> cdb [4] =(i&0xFF00)>> 8; \t ccb-> cdb [5] =(i&0xFF); ccb-> cdb [6] = 0; ccb-> cdb [7] = 0;/*数据传输长度*/ ccb-> cdb [8] = 1;/*数据传输长度为1块*/ 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; – arun