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
.
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).
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).
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.
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.