Commande SCSI

Dans l'architecture SCSI chaque équipement connecté au bus peut envoyer un ordre à n'importe quel autre. Le format de cet ordre ou commande SCSI est normalisé pour garantir l'interopérabilité (ainsi un disque dur de n'importe quel fabricant fonctionnera de la même façon une fois connecté à un contrôleur SCSI employé sur un serveur.)

Format d'une commande modifier

Les commandes sont envoyées en respectant un format appelé CDB pour Command Descriptor Block.Historiquement le format des commandes SCSI employait un nombre d'octets prédéterminé (6, 10, 12 ou 16 octets), les commandes les plus récentes emploient un nombre variable d'octets, voici par exemple la description de la commande READ (6) :

bit→
↓octet
76543210
08 = commande READ (6)
1Numéro d'unité(MSB) 
2Numéro du premier bloc à lire
3 (LSB)
4Nombre de blocs contigus à lire
5Contrôle

Un bloc est la capacité minimale transférable de/vers le support de stockage, le plus souvent il fait 512 octets pour un disque dur mais comme ce n'est pas nécessairement le cas, la commande READ CAPACITY permet à l'ordinateur y accédant de déterminer la taille exacte de l'unité de stockage manipulée par le support.

Les commandes varient selon la catégorie de l'équipement connecté au bus SCSI (disques durs, lecteurs de bandes magnétiques, robots de sauvegarde, tiroirs de disques, etc.) Il existe un ensemble commun de commandes que tout équipement implémente et des versions spécifiques selon la catégorie de l'équipement[1]. Le format CDB est spécifié dans le document d'architecture générale SCSI[2].

Exemples de commandes modifier

Ces commandes correspondent à la norme ANSI INCITS 408-2005[3]. L'exemple READ vient de la norme ANSI INCITS 405-2005[4].

Test Unit Ready modifier

Cette commande permet de demander à un périphérique s'il est prêt à transférer des données, i.e. le disque dur est en rotation, la bande dans un lecteur est chargée et prête, etc.

bit→
↓octet
76543210
00 = commande TEST UNIT READY
1Numéro d'unité
2(réservé)
3
4
5Contrôle

INQUIRY modifier

Cette commande est obligatoirement présente sur tous les périphériques. Elle permet d'obtenir des informations sur l'équipement connecté. Cette commande est disponible dès que l'équipement est alimenté, même s'il n'a pas encore fini sa séquence d'initialisation (il fournira éventuellement une réponse plus complète une fois initialisé.)

bit→
↓octet
76543210
00x12 = 18 = commande INQUIRY
1Numéro d'unité(réservé)EVPD
2Numéro de page
3(MSB) Taille maxi de la réponse
4 (LSB)
5Contrôle

READ modifier

Il existe plusieurs versions de cette commande, la plus ancienne READ (6) permet de coder le numéro de premier bloc à lire sur 21 bits (sur un disque dur cela ne permet d'accéder qu'au premier 1 Gio) cette commande est pourtant toujours obligatoirement supportée pour conserver la compatibilité avec les codes en ROM de certains serveurs informatiques qui lisent leur code d'amorçage via cette commande (ce dernier devra alors avoir été enregistré vers le début du disque.)

bit→
↓octet
76543210
08 = commande READ (6)
1Numéro d'unité(MSB) 
2Numéro du premier bloc à lire
3 (LSB)
4Nombre de blocs contigus à lire
5Contrôle

READ(10) modifier

La commande READ (10) est une extension de la précédente, elle propose un numéro de LBA sur 32 bits (2 Tio avec un bloc de 512 octets). Le bit DPO ("Disable Page Out") signale à l'unité qu'il n'est sans doute pas utile de mettre les données lues en cache car elles ne sont plus nécessaires, à l'inverse le bit FUA ("Force Unit Access") demande de ne pas utiliser le cache lors d'une lecture, enfin le bit RelAd ("Relative Address") est employé lors de commandes liées pour préciser que le numéro de LBA est relatif à la précédente commande de lecture. Cette commande a été spécifiée vers 1982 et aurait donc pu être décrite dans la première norme ce qui à l'époque où les plus gros disques durs n'atteignaient pas 1 Gio était d'une clairvoyance remarquable.

bit→
↓octet
76543210
00x28 = 40 = commande READ (10)
1Numéro d'unitéDPOFUA(réservé)RelAd
2(MSB) 
3Numéro du premier bloc à lire
4
5 (LSB)
6(réservé)
7(MSB) Nombre de blocs contigus à lire
8 (LSB)
9Contrôle

READ(12) modifier

La commande READ (12) est à nouveau une extension de la précédente, elle propose un nombre de blocs à lire codé sur 32 bits (avec un bloc de 512 octets cela permet un transfert maximum de 2 Tio en une seule commande.)

bit→
↓octet
76543210
00xA8 = 168 = commande READ (12)
1Numéro d'unitéDPOFUA(réservé)RelAd
2(MSB) 
3Numéro du premier bloc à lire
4
5 (LSB)
6(MSB) 
7Nombre de blocs contigus à lire
8
9 (LSB)
10(réservé)
11Contrôle

READ(16) modifier

La commande READ (16) est elle aussi une extension de la précédente, elle propose un numéro de LBA sur 64 bits (plus de 8 000 000 Pio avec des blocs de 512 octets).

bit→
↓octet
76543210
00x88 = 136 = commande READ (16)
1Numéro d'unitéDPOFUA(réservé)RelAd
2(MSB) 
3
4
5Numéro du premier bloc à lire
6
7
8
9 (LSB)
10(MSB) 
11Nombre de blocs contigus à lire
12
13 (LSB)
14(réservé)
15Contrôle

Annexes modifier

Articles connexes modifier

Liens externes modifier

Notes et références modifier

  1. Voir le lien externe vers l'ensemble des spécifications publiée par le comité T10.
  2. SCSI Architecture Model - 4 (SAM-4) ce document n'est plus (depuis janvier 2009) consultable librement ; la version suivante, en cours de rédaction, l'est encore SCSI Architecture Model - 5 (SAM-5).
  3. SCSI Primary Commands - 3 (SPC-3) ce document n'est plus (depuis janvier 2009) consultable librement ; la version suivante, en cours de rédaction, l'est encore SCSI Primary Commands - 4 (SPC-4).
  4. SCSI Block Commands - 2 (SBC-2) ce document n'est plus (depuis janvier 2009) consultable librement ; la version suivante, en cours de rédaction, l'est encore SCSI Block Commands - 3 (SBC-3).