1

SCSI インターフェイスのエラーは、SenseKey + ASC + ASCQ の 3 つの数字の連結によって認識されます。asc/ascq ペアの説明は、asc/ascq 値に基づくすべてのエラーの意味を説明します。しかし、すべての asc/ascq ペアがすべてのセンス キーで意味を持つわけではありません。各 asc/ascq ペアで返されるセンス キーを知るにはどうすればよいですか?

4

1 に答える 1

0

ASC/ASCQ はセンス キーに関連付けられていません。

Sense key は、メインのエラー コードです。ASC および ASCQ は、追加のセンス コードおよび修飾子です。あなたの I_T_L_Q ネクサスのどこが悪いのか答えるためのちょっとしたヒントです。

したがって、あなたの質問に答えるために -一般に、各 ASC/ASCQ ペアでどのセンス キーが返されるかを知る方法はありません。

ただし、よく知られている「センス キー」 + ASC + ASCQ の組み合わせがいくつかあります。これは、ほとんどのオペレーティング システムがエラーの小さなサブセットに対してのみエラー処理を実装しているためです。残念ながら、そのサブセットを見つけるには、ソース コードを調べるしかありません。

たとえば、Mac OS X Darwin カーネルではADDITIONAL_SENSE_CODEIOSCSIArchitectureModelFamilyを探すことができます。IOSCSIBlockCommands/IOSCSIBlockCommandsDevicePM.cppの659 行目の例を次に示します。

// Check the sense key to see if it is an error group we know how to handle
if  ( ( ( senseBuffer.SENSE_KEY & kSENSE_KEY_Mask ) == kSENSE_KEY_NOT_READY ) || 
      ( ( senseBuffer.SENSE_KEY & kSENSE_KEY_Mask ) == kSENSE_KEY_MEDIUM_ERROR ) )
{

    // The SenseKey is an 02 ( Not Ready ) or 03 ( Medium Error ). Check to see
    // if we can do something about this

    if ( ( senseBuffer.ADDITIONAL_SENSE_CODE == 0x04 ) && 
         ( senseBuffer.ADDITIONAL_SENSE_CODE_QUALIFIER == 0x02 ) )
    {

        // Device requires a start command before we can tell if media is there
        if ( START_STOP_UNIT ( request, 0x00, 0x00, 0x00, 0x01, 0x00 ) == true )
        {

            STATUS_LOG ( ( "Sending START_STOP_UNIT.\n" ) );
            serviceResponse = SendCommand ( request, 0 );

        }

        STATUS_LOG ( ( "%s::drive NOT READY\n", getName ( ) ) );

        IOSleep ( 200 );
        continue;

    }

    else if ( ( senseBuffer.ADDITIONAL_SENSE_CODE == 0x3A ) && 
              ( senseBuffer.ADDITIONAL_SENSE_CODE_QUALIFIER == 0x00 ) )
    {

        STATUS_LOG ( ( "No Media.\n" ) );
        // No media is present, return false
        driveReady = true;
        mediaPresent = false;

    }

    else
    {

        STATUS_LOG ( ( "%s::drive NOT READY\n", getName ( ) ) );
        IOSleep ( 200 );
        continue;

    }

}

使用された SK+ASC+ASCQ チューブ:

  • 0x02/0x03, 0x04, 0x02- NOT READY/MEDIUM ERROR、論理ユニットの準備ができていません。初期化コマンドが必要です。
  • 0x02/0x03, 0x3A, 0x00- NOT READY/MEDIUM エラー、MEDIUM が存在しません。

ここでわかるように、ASC/ASCQ ペアは 0x02 または 0x03 センス キーで使用され、実行するアクションは ASC/ASCQ ペアで決定されるため、ASC/ASCQ ペアがセンス キー間でどのように分割されているかは問題ではありません。

于 2014-03-18T08:48:47.587 に答える