Architecture des ordinateurs TP-1

by Joseph Razik, last modified on 2024-03-15

1   Codage et fichiers binaires

1.1   Objectif

L'objectif de ce TP est de confirmer les différentes formes de représentation de valeurs (nombres entiers, réels, caractères) en accord avec la théorie. Pour cela, vous étudierez une commande shell sous Unix/Linux pour consulter ces valeurs. Ceci vous permettra par exemple à la fin d'extraire l'adresse d'un serveur web caché et de le consulter pour en extraire un message mystérieux.

1.2   Préambule

Rappel de quelques commandes de base d'un shell Unix

Pour ouvrir un terminal / une console:

  • Dans votre gestionnaire de fenêtre préféré (Window Manager - WM) cherchez et sélectionnez un de ces mots clés: gnome-terminal, xterm, urxvt, roxterm, aterm, etc. Il est possible dans certains WM d'entrer la commande cherchée et de choisir un terminal parmi les résultats qu'il vous propose. Il est fortement possible qu'un raccourci soit défini pour ouvrir un terminal (Ctrl+Alt+t).
  • Une fenêtre s'ouvre, c'est votre terminal

Un terminal est un interprète de commandes, c'est-à-dire qu'il exécute directement les commandes que vous écrivez, sans passer par une phase de compilation. Les commandes et la syntaxe dépendent de l'interprète. Pour connaître l'interprète de votre terminal tapez la commande suivante (sans oublier de valider) :

>$ echo $SHELL

Voici un rappel de quelques commandes de base qui existent pour tous les interprètes :

  • pwd  : retourne le chemin absolu du répertoire de travail courant (working directory),
  • cd rep  : change de répertoire (change directory) pour aller dans rep,
  • ls rep  : liste le contenu du répertoire rep,
  • mkdir rep : créé le répertoire rep,
  • cat  : permet d'afficher le contenu d'un fichier en tant que chaîne de caractères,
  • less  : permet d'afficher le contenu d'un fichier en tant que chaîne de caractères mais laisse la possibilité de re déplacer dans celui-ci par exemple avec les flèches (q pour quitter).

Pour quitter ou fermer un terminal, vous pouvez soit taper la commande exit, soit faire la combinaison de touches Ctrl-d.

Rappelez-vous de la possibilité d'auto-complétion des shells avec la touche de tabulation (TAB).

  1. Dans votre répertoire personnel, à partir d'un terminal, créez un sous-répertoire nommé I22, dans lequel vous travaillerez,
  2. Copiez dans ce répertoire le fichier valeurs du répertoire /home/partage/I22/.

Les pages man

Pour obtenir rapidement de la documentation sur l'utilisation d'une commande (sans passer par internet), il existe en général deux possibilités: utiliser une option de la commande, ou consulter sa page man. Par exemple pour l'aide de la commande man vous pouvez effectuer soit :

>$ man --help

soit:

>$ man man

1.3   La commande od

Un fichier manipulé par l'ordinateur n'est vu par celui-ci que comme une suite de 0 et de 1. L'interprétation du sens de cette suite vient de l'utilisateur et du programmeur qui doivent fournir des informations telles que la taille des objets (nombre d'octets), le codage utilisé (signé, virgule flottante, ...), le boutisme (ou endianisme) utilisé, etc.

La commande od permet d'afficher le contenu d'un fichier en appliquant une interprétation particulière de son contenu. En effet, afficher le contenu d'un fichier avec des commandes telles que cat ou less n'a de sens qu'avec des fichiers ne comportant que du texte car ces deux commandes présupposent que les données qu'elles vont traiter sont du texte et les interprètent ainsi.

Par défaut, od travaille en octal (Octal Dump) et indique en première colonne l'adresse du premier octet affiché puis les valeurs des octets interprétés comme des nombres entiers non signés codés sur 2 octets. Sur la plupart des architectures des processeurs actuels, les nombres sont codés en mode petit-boutiste (little-endian). Toutefois, selon les normes et conventions, le mode gros-boutiste (big-endian) peut être utilisé, comme c'est par exemple le cas dans les transmissions réseaux. Notez que l'affichage par od de l'interprétation de plusieurs octets est généralement little-endian (LSB-MSB, Least Significant Byte - Most Significant Byte).

À partir de la page man ou de l'aide de la commande od, comprenez son utilisation et répondez aux questions suivantes :

  1. Quelle option permet d'afficher les adresses en hexadécimal au lieu d'octal ?
  2. Quelle option permet d'afficher chaque octet d'un fichier en hexadécimal ?
  3. Quelle option permet de sauter un certain nombre d'octets ?
  4. Quelle option permet de n'interpréter qu'un certain nombre d'octets ?

1.4   Utilisation de od

Dans le répertoire /home/partage/I22/ se trouve un fichier valeurs contenant une succession d'objets de différents types, au format dit binaire , dont dans cet ordre :

  • la valeur 192, nombre entier non signé codé sur 8 bits
  • la valeur -1, nombre entier signé codé sur 8 bits,
  • la valeur -2, nombre entier signé codé sur 16 bits,
  • la valeur 1633837924, nombre entier non signé codé sur 32 bits,
  • la valeur 1.0, nombre réel codé au format IEEE 754 32 bits (nombre à virgule flottante),
  • la valeur -10.25, nombre réel codé au format IEEE 754 64 bits (nombre à virgule flottante),
  1. Pour chacune des valeurs numériques précédentes, calculez sa représentation théorique en hexadécimal dans le codage indiqué.
  2. À l'aide de la commande od et de ses différents paramètres, retrouvez et affichez chacune des valeurs précédentes de manière isolée (par exemple 0000002     -2). Attention, une des valeurs n'utilise peut-être pas l'endianisme habituel.
  3. Pour chacune des valeurs vérifiez qu'il y a bien concordance entre théorie et pratique en utilisant od avec l'option -t x1.

1.5   Encodage des caractères

Pour représenter dans un ordinateur les caractères graphiques que nous utilisons pour communiquer, une table d'association est utilisée. Une des premières table est l'ASCII qui utilise 7 bits pour énumérer les caractères. Les codes ASCII n'intègrent pas de caractères accentués et permettent seulement de couvrir la langue anglaise. Pour permettre aux autres langues d'afficher leurs caractères spécifiques, le codage ASCII a été étendu en utilisant un 8ème bit pour définir les caractères spéciaux. Malheureusement cette extension ne permet pas de représenter l'ensemble des langues avec une seule table d'association. C'est ainsi qu'il existe une multitude d'encodage ASCII étendu : ISO-8859-1 (latin1), ISO-8859-7 (latin/grec), etc.

Pour éviter tous ces encodages différents il a été décidé de définir une seule table d'association : l'unicode. Cette table regroupe tous les graphèmes de presque toutes les langues. Toutefois pour encoder des caractères unicodes, il faut utiliser un encodage qui le prend en charge. C'est le cas des encodages UTF. La différence entre ces encodages va porter sur la façon de représenter les codes unicodes.

Ainsi, dorénavant, il est possible d'écrire 你好! et des mots comme château ou étoile sans voir apparaître château ou étoile.

  1. À la suite des valeurs numériques précédentes de l'exercice précédent, se trouve également dans le fichier la suite de caractères ASCII abcdABCD0123. Quel est le code ASCII en hexadécimal des caractères a et A (od accepte l'accumulation de plusieurs formats en paramètres) ? Donnez une méthode qui permet de passer rapidement des minuscules aux majuscules un caractère ASCII, et inversement.
  2. De même, quels sont les codes ASCII en hexadécimal de 0 et 9 ? Donnez une méthode qui permet de convertir rapidement un chiffre décimal en son code ASCII et inversement.
  3. Vérifiez vos réponses à l'aide des instructions Python ord et chr.

Dans le même répertoire /home/partage/I22/ se trouve trois autres fichiers : texte1, texte2 et texte3.

  1. À l'aide des commandes cat et less, visualisez le contenu de ces fichiers. Voyez-vous une différence majeure dans leur affichage ?
  2. En fait ces trois fichiers comportent le même texte mais écrit dans un encoding différent. À l'aide de la commande od et des caractéristiques des encodings ISO-8859 (latin-1), UTF-8 et UTF-16, quels indices vous permettent de déterminer quel encoding est utilisé par quel fichier.
  3. Étudiez la commande file et validez votre réponse à la question précédente.
  4. Que donne la réponse de la commande file pour le premier fichier valeurs ? Pourquoi ?

1.6   Jeu de piste

Dans cet exercice, vous allez utiliser la commande od pour retrouver une information fragmentée et cachée dans le fichier valeurs.

  1. Trouvez chaine1, la première chaîne de caractères encodée en ASCII, qui débute à l'adresse 37 et fait 9 caractères de long.
  2. Trouvez chaine2 la chaîne de deux caractères encodée en UTF-16 qui se situe 12 octets après chaine1.
  3. Trouvez la valeur val qui est un entier non signé codé sur deux octets, situé 17 octets après chaine2.
  4. Effectuez dans un terminal la commande curl suivi de la concaténation directe (sans insérer d'espace) de chaine1, chaine2 et de val. Qu'obtenez-vous ?