2

SCSI CDB プログラミングは初めてです。6バイトのCDBを使用して書き込みコマンド用に書かれたコードがあります

ccb = (Exec_IO_CCB *)(buffer + header_size);   
ccb->ccb_length = sizeof(Exec_IO_CCB);          
ccb->cam_opcode = 0x1;    
ccb->connect_id = 0;    
ccb->data_buf_ptr = (long)(header_size + ccb->ccb_length + MAX_SENSE_LEN);    
ccb->data_xfer_length = (long)(XFER_BUFSIZE - ccb->data_buf_ptr);    
ccb->sense_buf_ptr = (long)(header_size + ccb->ccb_length);    
ccb->sense_buf_length = MAX_SENSE_LEN;    
ccb->time_out = CAM_TIMEOUT;    
ccb->cdb_length = 6;    
ccb->cam_flags = DATA_OUT;    
ccb->cdb[0] = 0xA;   /*  0xA SCSI Opcode for write operation */    
ccb->cdb[1] = 0;    
ccb->cdb[2] = (ccb->data_xfer_length & 0xFF0000) >> 16;    
ccb->cdb[3] = (ccb->data_xfer_length & 0xFF00) >> 8;    
ccb->cdb[4] = (ccb->data_xfer_length & 0xFF);    
ccb->cdb[5] = 0;

上記のコードから、cdb[2] と cdb[3] がどのように派生するのか理解できませんでした。

同様の行で、書き込みコマンド用に 10 バイトの CDB を開発しようとしています。LBA を説明する cdb[2-5] のデータを入力する方法は?

ccb->cam_flags = DATA_OUT;    
ccb->cdb[0] = 0x2A;     /*  0x2A SCSI Opcode for write10  CDB */    
ccb->cdb[1] = 0;    
ccb->cdb[2] =  ??    
ccb->cdb[3] =  ??    
ccb->cdb[4] =  ??    
ccb->cdb[5] =  ??    
ccb->cdb[6] = 0;    
ccb->cdb[7] = (ccb->data_xfer_length & 0xFF);    
ccb->cdb[8] = (ccb->data_xfer_length & 0xFF);    
ccb->cdb[9] = 0;
4

4 に答える 4

0

SCSI SBC 標準を見てください。これはドラフト形式の SBC-3 ですが、WRITE (6) と (10) はかなり長い間変更されていません: http://www.t10.org/ftp/t10/document.05/05-344r0.pdf

WRITE (6) の場合、cdb[2] と cdb[3] は転送長ではなく、論理ブロック アドレスの下位 16 ビットです。転送長は、書き込むブロックの数です。アドレスは、書き込みを開始するデバイス上の場所です。ディスクの先頭にある場合は、LBA 0 です。デバイスに 512 バイトのブロックがあり、1 MiB の書き込みを開始したい場合、アドレスは LBA 2048 です。

于 2013-08-21T15:18:11.993 に答える
0

バイト 5 はバイトで 2048 は short であるため、バイト 5 に 2048 を入れることはできません。代わりに cdb[4]=((2048 & 0xFF00) >> 8) と cdb[5]=(2048 & 0xFF) を使用してください。また、cdb[7] の場合、data_xfer_length の下位バイトを割り当てましたが、上位バイトにする必要があります。

于 2013-08-26T15:29:48.103 に答える