Aller au contenu

Information et données

En informatique, l’information est un ensemble d’unités de données stockées dans la mémoire centrale ou dans les registres des contrôleurs de périphériques d’entrées/sorties. Selon le type d’information à traiter par le µP, les données peuvent prendre différentes formes (texte, valeurs numériques, valeurs booléennes, etc. ou des instructions d’un programme). Cependant, toutes les données sont représentées par une suite de bits, où le bit (symbole b) désigne un chiffre binaire 0 ou 1.

Représentation mémoire

Vu du µP, la mémoire est un tableau d’éléments à une dimension (figure ci-dessous). Chacun de ces éléments représente une unité de données. La taille de ce tableau, appelé espace adressable ou espace mémoire, dépend du nombre de bits dont dispose le µP pour l’accéder, lequel correspond à la taille de l’adresse.

Espace adressable

La plus petite unité de données adressable et accessible est le byte (symbole B). Le terme byte vient de l’anglais bite, signifiant bouchée, mais écrit avec un y afin d’éviter toute confusion avec le bit. Le nombre de bits contenus dans un byte n’est pas défini, cependant des bytes à 8 bits, un octet (symbole o), sont la norme aujourd’hui. Par convention, la numérotation des bits d’un octet se fait généralement de droite à gauche et le bit de poids faible est le bit 0 tandis que le bit de poids fort est le bit 7.

Capacité mémoire

La capacité d’une mémoire, le chip, se donne par les fabricants en bits. Par contre, la capacité mémoire d’un ordinateur ou d’un système à microprocesseur se donne en bytes.

Pour éviter toutes confusions entre le système décimal (puissances de 10) et le système binaire (puissances de 2), l’organisation internationale de normalisation (ISO) ainsi que la commission électronique internationale (IEC) ont proposé une nouvelle nomenclature pour indiquer la capacité mémoire d’un ordinateur, soit:

Décimal Symbole Binaire Symbole Anciennement
\(1000^1\) kB (kilobyte) \(1024^1\) KiB (kibibyte) KB (kilobyte)
\(1000^2\) MB (megabyte) \(1024^2\) MiB (mebibyte) MB (megabyte)
\(1000^3\) GB (gigabyte) \(1024^3\) GiB (gibibyte) GB (gigabyte)
\(1000^4\) TB (terabyte) \(1024^4\) TiB (tebibyte) TB (terabyte)
\(1000^5\) PB (petabyte) \(1024^5\) PiB (pebibyte)
\(1000^6\) EB (exabyte) \(1024^6\) EiB (exbibyte)
\(1000^7\) ZB (zettabyte) \(1024^7\) ZiB (zebibyte)
\(1000^8\) YB (yottabyte) \(1024^8\) YiB (yobibyte)

Si l’on souhaite indiquer la capacité en bits au lieu de bytes, il suffit de remplacer le B du symbole par un b.

Accès mémoire

La figure ci-dessous présente un ordinateur élémentaire, avec juste une unité centrale de traitement, une mémoire volatile pour les données, un mémoire non volatile pour le programme ainsi que des contrôleurs de périphériques d’entrées/sorties. Trois bus offrent au CPU une interface de communication pour le transfert de données entre ses composants internes (registres et unité de contrôle) et les composants externes (mémoire centrale et contrôleurs de périphériques).

Bus du µP

Les bus servent à regrouper les signaux d’une même fonctionnalité, soit:

  • Bus d’adresses (addr)
  • Bus de données (data)
  • Bus de contrôle (ctrl)

Le bus d’adresses (addr) permet d’identifier et d’accéder de façon univoque chaque unité de données ou chaque octet dans l’espace mémoire. La taille du bus d’adresses dépend fortement de l’architecture du processeur. Pour des processeurs avec une architecture à 32 bits, il est généralement également de 32 bits, offrant ainsi un espace adressable de 4GiB. Par contre pour les processeurs avec une architecture de 64 bits, il est généralement plus étroit, par exemple 44 bits (16TiB) pour les µP Cortex ARMv8-A et de 48 bits (256TiB) pour les processeurs x86-64.

Le bus de données (data) permet le transfert de l’information entre le processeur et ses composants placés en espace mémoire. La largeur du bus de données dépend naturellement fortement de l’architecture du µP, mais également des objectifs en coûts matériel que les fabricants souhaitent atteindre (nombre de broches, encombrement, prix, etc.). Il est assez courant que des systèmes basés sur une architecture 32 bits ne disposent que d’un bus mémoire à 16 bits. Cependant et pour maximiser les performances globales du système, les fabricants préféreront un bus de données de même taille que celui de l’architecture, voire plus large. Sur les systèmes sur puce (SoC - System on Chip) équipés d’une logique programmable (FPGA - Field Programmable Gate Arrays), il est courant que les bus de données internes soient très larges, 256 bits, 512 bits, voire même 1024 bits. Indépendamment de la largeur du bus de données, le µP peut effectuer des transferts de tailles variables, 8 bits, 16 bits, 32 bits voire 64 bits.

Le bus de contrôle (ctrl) regroupe tous les signaux nécessaires à la gestion des transferts entre le µP et ses composants. Les signaux principaux sont:

  • Type de transfert, lecture ou écrire (R/W - Read/Write)
  • Taille du transfert (SZ - Size)
  • Lignes de sélection des contrôleurs de périphériques (CS - Chip Select)
  • Lignes d’interruptions (IRQ-Lines - Interrupt Request Lines)

Le décodeur d’adresses (address decoder) sert à adresser séparément chacun des composants en espace mémoire. En effet, pour des raisons de coût et de simplicité, les différents composants placés dans l’espace mémoire du µP ne disposent que des lignes du bus d’adresses correspondant à la taille (en puissance de 2) de l’ensemble de leurs registres pour des contrôleurs de périphériques ou la capacité (également en puissance de 2) pour des mémoires. Selon un schéma pré-établi, le décodeur d’adresses génère un chip select afin d’activer le contrôleur de périphériques ou la mémoire correspondant à l’adresse mise sur le bus.

Alignement

Afin d’augmenter les performances du µP, la taille du bus de données correspond généralement à l’architecture du processeur, typiquement pour un µP avec une architecture à 32 bits, son bus de données sera également de 32 bits. Si le µP doit accéder une donnée de 4 octets (32 bits) et que son adresse est divisible par 4, on parle d’un accès aligné (aligned access) et dans le cas contraire on parle d’accès non aligné (unaligned access ou misaligned access).

Alignement des données en mémoire

Selon la conception du µP, des accès non alignés peuvent conduire à:

  • Violation de contrainte
  • Performances non optimales

Dans le cas d’une violation de contrainte, le µP arrête l’exécution de l’instruction et génère une exception. Dans le cas d’alignement non optimal, le processeur effectuera plusieurs accès alignés (dans l’exemple ci-dessous 2 accès de 4 octets) afin d’extraire les octets correspondants à la requête. Ces multiples accès prennent plus de temps et vont simplement dégrader les performances globales du système.

La règle pour qu’une donnée soit bien alignée en mémoire est que son adresse soit un multiple de sa taille en octets:

  • par 8 pour des mots de 64 bits (8 octets)
  • par 4 pour des mots de 32 bits (4 octets)
  • par 2 pour des mots de 16 bits (2 octets)

Les données d’un seul octet (8 bits) sont quant à elles toujours bien alignées.

Boutisme

En informatique, la représentation de certains types de données nécessite plus d’un octet. On peut citer par exemple les nombres entiers sur 16, 32 ou 64 bits ou les nombres à virgule flottante qui occupent généralement 32 bits pour les float ou 64 bits pour les double. Le boutisme (endianness) désigne l’ordre dans lequel les octets d’une donnée sont stockés dans la mémoire. Il existe deux orientations, lesquelles dépendent de l’architecture du processeur:

  • Petit-boutisme (little-endian)
  • Gros-boutisme (big-endian)

Dans l’orientation petit-boutisme, pour une donnée dont le type est plus grand que 8 bits, l’octet de poids faible est stocké à l’adresse basse en mémoire, tandis que l’octet de poids fort est placé à l’adresse haute. Si l’on choisit une la valeur entière hexadécimale 0x44332211, l’ordre des octets dans la mémoire est 0x11, 0x22, 0x33 et 0x44 en allant de l’adresse basse vers la haute. Les processeurs d’Intel et ARM utilisent cette convention.

Boutisme

Dans l’orientation gros-boutisme, pour la même donnée, l’ordre est inversé, c’est-à-dire l’octet de poids faible est stocké à l’adresse haute en mémoire, tandis que l’octet de poids fort est placé à l’adresse basse. L’ordre des octets dans la mémoire devient alors 0x44, 0x33, 0x22 et 0x11. Les processeurs PowerPC et MIPS utilisent cette convention. Il intéressant de noter que les protocoles de communications TCP/IP utilisent également cette convention.

En C/C++, ces conventions ne sont utilisées que pour les types de base, tels que int, float, double ou enum. Par contre, pour les types complexes, tels que struct ou array, l’ordre de déclaration des différents attributs dans la structure, respectivement l’index de l’élément dans le tableau, seront utilisés pour stocker les données en mémoire, en allant toujours des adresses basses vers les hautes.