首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写入磁盘上的每个LBA

写入磁盘上的每个LBA
EN

Stack Overflow用户
提问于 2013-08-25 18:17:25
回答 1查看 782关注 0票数 1

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

如何表示32位LBA,使其从LBA 0迭代到最大LBA。如果我计划在每个LBA上写入数据,那么数据传输长度应该是多少。每个LBA大小为512字节。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2013-08-26 23:46:13

分配与此类似的lba (但请注意,如果您要写入所有大驱动器,它将非常慢……因此,如果您写入大量的块(可能是1MB,然后相应地调整下一个LBA ),效果会更好。

代码语言:javascript
复制
cdb[2] = (i & 0xFF000000) >> 24;
cdb[3] = (i &   0xFF0000) >> 16;
cdb[4] = (i &     0xFF00) >> 8;
cdb[5] = (i &       0xFF);

对于上面的设置,将块的数量设置为1: cdb7 = 0;cdb8 = 1;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18427940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档