Запись в каждый LBA на диске

Необходимо выполнить запись в каждый LBA на диске с помощью SCSI CDB. Здесь я построил цикл while/for для записи в каждый LBA. Я использую 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;
}

person arun    schedule 25.08.2013    source источник


Ответы (1)


Назначьте LBA аналогично этому (но обратите внимание, что это будет очень медленно, если вы собираетесь записывать весь большой диск ... поэтому было бы лучше, если вы записываете большое количество блоков, возможно, 1 МБ, а затем настройте следующий 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;

Опять же, вы будете ждать весь день большой диск, поэтому внесите изменения, чтобы записать большое количество блоков в каждой итерации цикла.

person eddyq    schedule 26.08.2013
comment
Хм, глядя еще раз, я не вижу, где вы делали запись на каждой итерации. Не забудьте сделать это. - person eddyq; 26.08.2013
comment
ccb-›cam_flags = DATA_OUT; ccb-›cdb[0] = 0x2A; ccb-›cdb[1] = 0; ccb-›cdb[2] = (i & 0xFF000000) ›› 24; ccb-›cdb[3] = (i & 0xFF0000) ›› 16; ccb-›cdb[4] = (i & 0xFF00) ›› 8; 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 = (длинный)ccb; ptr_data = (byte *)(buffer + ccb-›data_buf_ptr); data_pattern = я + (я ‹‹ 4); буфер[ccb-›data_buf_ptr] = data_pattern; - person arun; 27.08.2013
comment
Большое спасибо за помощь . Могу ли я связаться с вами напрямую по вопросам, связанным с SCSI CDB? Я буду очень признателен, если вы поделитесь своим идентификатором электронной почты. - person arun; 27.08.2013