Fonctionnement d'un ordinateur/Le contrôleur de périphériques

Dans ce chapitre, on va voir comment les périphériques communiquent avec le processeur ou la mémoire. On sait déjà que les entrées-sorties (et donc les périphériques) sont reliées au reste de l'ordinateur par un ou plusieurs bus. Pour communiquer avec un périphérique, le processeur a juste besoin de configurer ces bus avec les bonnes valeurs. Dans la façon la plus simple de procéder, le processeur se connecte au bus et envoie sur le bus les données et commandes à adéquates. Ensuite, le processeur attend et reste connecté au bus tant que le périphérique n'a pas traité sa demande correctement, que ce soit une lecture, ou une écriture. Mais les périphériques sont tellement lents que le processeur passe son temps à attendre le périphérique.

Pour résoudre ce problème, il suffit d'intercaler des registres d'interfaçage entre le processeur et les entrées-sorties. Une fois que le processeur a écrit les informations à transmettre dans ces registres, il peut faire autre chose dans son coin : le registre se charge de maintenir/mémoriser les informations à transmettre. Le processeur doit vérifier ces registres d’interfaçage régulièrement pour voir si un périphérique lui a envoyé quelque chose, mais il peut prendre quelques cycles pour faire son travail en attendant que le périphérique traite sa commande. Ces registres peuvent contenir des données tout ce qu'il y a de plus normales ou des « commandes », des valeurs numériques auxquelles le périphérique répond en effectuant un ensemble d'actions préprogrammées.

Pour simplifier, les registres d’interfaçage sont de trois types : les registres de données, les registres de commande et les registres d'état. Les registres de données permettent l'échange de données entre le processeur et les périphériques. On trouve généralement un registre de lecture et un registre d'écriture, mais il se peut que les deux soient fusionnés en un seul registre d’interfaçage de données. Les registres de commande sont des registres qui mémorisent les commandes envoyées par le processeur. Quand le processeur veut envoyer une commande au périphérique, il écrit la commande en question dans ce ou ces registres. Enfin, beaucoup de périphériques ont un registre d'état, lisible par le processeur, qui contient des informations sur l'état du périphérique. Ils servent notamment à indiquer au processeur que le périphérique est disponible, qu'il est en train d’exécuter une commande, qu'il est utilisé par un autre processeur, etc. Ils peuvent parfois signaler des erreurs de configuration ou des pannes touchant un périphérique.

Registres d'interfaçage.

Les commandes sont traitées par un contrôleur de périphérique, qui va lire les commandes envoyées par le processeur, les interpréter, et piloter le périphérique de façon à faire ce qui est demandé. Le boulot du contrôleur de périphérique est de générer des signaux de commande qui déclencheront une action effectuée par le périphérique. L'analogie avec le séquenceur d'un processeur est possible. Les contrôleurs de périphérique vont du simple circuit de quelques centaines de transistors à un microcontrôleur très puissant. Si le contrôleur de périphérique peut très bien être séparé du périphérique qu'il commande, certains périphériques intègrent en leur sein ce contrôleur : les disques durs IDE, par exemple.

Contrôleur de périphérique.

Lorsqu'un ordinateur utilise un système d'exploitation, celui-ci ne connaît pas toujours le fonctionnement d'un périphérique ou de son contrôleur : il faut installer un programme qui va s'exécuter quand on souhaite communiquer avec le périphérique, et qui s'occupera de tout ce qui est nécessaire pour le transfert des données, l'adressage du périphérique, etc. Ce petit programme est appelé un driver ou pilote de périphérique. La « programmation » d'un contrôleur de périphérique est très simple : il suffit de savoir quoi mettre dans les registres pour paramétrer le contrôleur.

Un contrôleur de périphérique peut gérer plusieurs périphériques modifier

Dans ce que l'on a dit plus haut, nous sommes partis du principe que chaque périphérique est associé à un contrôleur de périphérique qui ne s'occupe que de lui. Et en effet, les contrôleurs les plus simples ne sont connectés qu'à un seul périphérique, via une connexion point à point. Tel est le cas du port série RS-232 ou des différents ports parallèles, autrefois présents à l'arrière des PC. Mais de nombreux contrôleurs de périphériques sont connectés à plusieurs périphériques. Prenez par exemple l'USB : vous avez plusieurs ports USB sur votre ordinateur, mais ceux-ci sont gérés par un seul contrôleur USB. En fait, ces périphériques sont connectés au contrôleur de périphérique par un bus, et le contrôleur gère ce qui transite sur le bus. On devrait plutôt parler de contrôleur de bus que de contrôleur de périphérique dans ce cas précis, mais passons.

 
Contrôleur de périphérique qui adresse plusieurs périphériques

Les périphériques connectés à un même contrôleur peuvent être radicalement différents, même si ils sont connectés au même bus. C'est notamment le cas pour tout ce qui est des contrôleurs PCI, USB et autres. On peut connecter en USB aussi bien des clés USB, des imprimantes, des scanners, des lecteurs DVD et bien d'autres. Mais leur respect du standard USB les rend compatible. Au final, le contrôleur USB gère le bus USB mais se fiche de savoir si il communique avec un disque dur, une imprimante USB ou quoique ce soit d'autre.

L'adressage des périphériques par le contrôleur de périphérique modifier

Toujours est-il que le contrôleur de périphérique doit pouvoir identifier chaque périphérique. Prenons par exemple le cas où une imprimante, une souris et un disque dur sont connectés en USB sur un ordinateur. Si je lance une impression, le contrôleur de périphérique doit envoyer les données à l'imprimante et pas au disque dur. Pour cela, il attribue à chaque périphérique une ou plusieurs adresses, utilisées pour l'identifier et le sélectionner. En général, les périphériques ont plusieurs adresses : une par registre d’interfaçage. L'adresse permet ainsi d'adresser le périphérique, et de préciser quel registre du contrôleur lire ou écrire. L'adresse d'un périphérique peut être fixée une bonne fois pour toutes dès la conception du périphérique, ou se configurer via un registre ou une EEPROM.

Quand le contrôleur de périphérique envoie une transmission sur le bus, il doit faire en sorte qu'elle n'arrive qu'à destination. Pour cela, deux solutions sont possibles.

  • La première solution délègue cette responsabilité aux périphériques et à la mémoire. Chaque composant branché sur le bus vérifie si l'adresse envoyée par le processeur est bien la sienne : si c'est le cas, il va se connecter sur le bus (les autres composants restants déconnectés). En conséquence, chaque contrôleur contient un comparateur pour cette vérification d'adresse, dont la sortie commande les circuits trois états qui relient le contrôleur au bus.
  • La seconde solution est celle du décodage d'adresse. Elle utilise un circuit qui détermine, à partir de l'adresse, quel est le composant adressé. Seul ce composant sera activé/connecté au bus, tandis que les autres seront désactivés/déconnectés du bus.

Pour implémenter la dernière solution, chaque périphérique possède une entrée CS, qui active ou désactive le périphérique suivant sa valeur. Le périphérique se déconnecte du bus si ce bit est à 0 et est connecté s'il est à 1. Pour éviter les conflits sur le bus, un seul contrôleur de périphérique doit avoir son bit CS à 1. Pour cela, il faut ajouter un circuit qui prend en entrée l'adresse et qui commande les bits CS : ce circuit est un circuit de décodage partiel d'adresse.

 
Décodage d'adresse par le contrôleur de périphérique.

Le décodage d'adresse n'est que rarement utilisé quand on peut ajouter ou retirer des périphériques à la demande. Dans ce cas, la première méthode est plus pratique. Le contrôleur attribue alors une adresse à chaque composant quand il est branché, il attribue les adresses à la volée. Les adresses en question sont alors mémorisées dans le périphérique, ainsi que dans le contrôleur de périphérique.

Les bus connectés au contrôleur de périphérique modifier

Le contrôleur de périphérique est donc un intermédiaire entre un ou plusieurs périphériques et le reste de l'ordinateur. Et sa nature d'intermédiaire se voit encore mieux quand on compare les bus auxquels il est connecté. D'un côté, il est connecté au processeur par un bus spécialisé appelé le bus d'entrées-sorties, de l'autre il est connecté aux périphériques par un autre bus séparé appelé le bus secondaire. Les deux bus n'ont aucune raison d'être les mêmes et ils sont presque toujours différents dans les faits. Le bus d'entrées-sorties, qui connecte le processeur au contrôleur de périphérique, est généralement un bus à haute performance, rapide, à haut débit. Il faut dire que le processeur est un composant rapide et qu'il vaut mieux que le contrôleur de périphérique communique avec lui avec une liaison rapide. Par contre, le bus secondaire qui relie le contrôleur aux périphériques est souvent un bus moins rapide, à débit moindre, à latence plus élevée. La raison est que les périphériques sont assez lents et qu'il est préférable d'utiliser un bus aux performances moindres, mais moins complexe et avec une interface plus simple.

À ce propos, on s'attend à ce que l'ordinateur utilise deux bus bien séparés, avec un bus mémoire d'un côté et un bus d'entrées-sorties de l'autre. C'est effectivement le cas sur beaucoup d'architectures simples, où les adresses sont petites et où le contrôleur de périphérique est simple. Cela a cependant des défauts, car un second bus demande pas mal de connexions, de broches sur le processeur, de fils d'interconnexion et autres ressources.

 
Bus entre processeur et contrôleur de périphérique.

Mais sur d'autres ordinateurs, le bus qui connecte le processeur au contrôleur de périphérique est le même bus qui connecte le processeur et la RAM. Nous verrons cela plus en détail dans le chapitre suivant, ainsi que dans le chapitre sur la carte mère, mais nous pouvons en parler rapidement ici. C'est quelque chose de fréquent et qui colle assez bien avec ce qu'on vient de dire dans le paragraphe précédent. Le bus mémoire est en effet un bus à haute performance, au même titre que le bus d'entrées-sorties. Le fait de partager le bus entre mémoire et entrées-sorties fait qu'on économise des fils, des broches sur le processeur, et d'autres ressources. Le câblage est plus simple, la fabrication aussi : les avantages sont nombreux. Et cela a d'autres avantages, notamment au niveau du processeur, qui n'a pas besoin de gérer deux bus séparés, mais un seul. Mais ce partage du bus mémoire et d'entrée-sortie n'est pas systématique. Toujours est-il que le bus qui relie processeur, mémoire et contrôleur de périphérique est appelé un bus système.

 
Partage du bus entre la mémoire et les périphériques

Un ordinateur moderne contient plusieurs contrôleurs de périphérique modifier

La situation se complique encore plus quand un ordinateur contient plusieurs contrôleurs de périphériques, ce qui est la norme de nos jours et l'est depuis déjà plusieurs décennies. Par exemple, un ordinateur de type PC assez ancien avait un contrôleur de périphérique pour le clavier, un autre pour la souris, un autre pour le port parallèle, un autre pour le port série et quelques autres. Par la suite, d'autres contrôleurs se sont greffés aux précédents : un pour l'USB, un intégré à la carte vidéo, un intégré à la carte son, et ainsi de suite. Concrètement, n'importe quel ordinateur récent contient plusieurs dizaines, si ce n'est centaines, de contrôleurs de périphériques.

La connexion du processeur aux contrôleurs de périphériques modifier

En théorie, la solution la plus simple serait de connecter chaque contrôleur de périphérique au processeur avec une connexion point à point, un ensemble de fils. Cette solution demande cependant beaucoup de fils et de connexions pour être praticable s'il y a beaucoup de contrôleurs à connecter. Elle est surtout utilisé sur les ordinateurs simples, où il y a quelques contrôleurs de périphériques, ce qui limite le nombre de broches et de fils à câbler.

 
Usage de plusieurs bus d'entrées-sorties

Pour limiter la casse, il est possible de connecter plusieurs contrôleurs de périphériques au processeur en utilisant un seul bus d'entrés-sorties. Mais c'est rarement suffisant.

 
Bus d'entrées-sorties multiplexé.

Là encore, il est possible de fusionner le bus d'entrées-sorties avec le bus mémoire.

 
Bus unique avec plusieurs contrôleurs de périphériques.

Le décodage d'adresse, pour les contrôleurs de périphériques modifier

Avec un seul bus pour connecter le processeur à plusieurs contrôleurs de périphériques, on retombe face au même problème que précédemment. Dans la section précédente, nous avions vu ce qui se passe quand on connecte plusieurs périphériques à un même contrôleur de périphérique. Ici, on remplace les périphériques par les contrôleurs de périphérique, et le contrôleur de bus par le processeur. Là encore, le problème est le même : toute transmission doit être prise en charge par le bon contrôleur de périphérique. Il ne faudrait pas qu'une transmission PCI-Express destinée à la carte graphique soit traitée par le contrôleur USB. Et là encore, la solution est la même : chaque contrôleur de périphérique a sa propre adresse mémoire.

Là encore, les solutions utilisées pour sélectionner un contrôleur parmi tous les autres sont les mêmes, le décodage d'adresse étant la possibilité la plus fréquente. Son utilisation est beaucoup plus fréquente, pour une raison assez simple. Les contrôleurs de périphériques sont tous placés soit dans les périphériques, soit sur la carte mère. Pour les contrôleurs sur la carte mère, on ne s'attend pas à ce qu'ils soient retiré ou ajoutés : les contrôleurs restent sur la carte mère et leur nombre ne change pas, les contrôleurs sont fixés une fois pour toutes. C'est le cas classique où on peut facilement utiliser le décodage d'adresse sans problèmes. Une fois les contrôleurs connectés, ajouter un circuit de décodage d'adresse est assez facile. Pour les contrôleurs placés dans les périphériques, comme ceux de la carte graphique et de la carte son, les périphériques en question sont connectés à des bus spécifiques, et le contrôleur du bus est généralement sur la carte mère. Ce qui rend là encore l'usage du décodage d'adresse facile pour le contrôleur de bus, la gestion des adresses sur le bus étant réalisé autrement.

 
Circuit de décodage d'adresse.

Pour résumer, les registres des périphériques sont identifiés par des adresses mémoires. Et les adresses sont conçues de façon à ce que les adresses des différents périphériques ne se marchent pas sur les pieds. Chaque périphérique, chaque registre, chaque contrôleur a sa propre adresse. D'ordinaire, certains bits de l'adresse indiquent quel contrôleur de périphérique est le destinataire, d'autres indiquent quel est le périphérique de destination, les restants indiquant le registre de destination.

Le chipset et l'intégration des contrôleurs de périphériques sur la carte mère modifier

Les anciens ordinateurs personnels disposaient de nombreux contrôleurs de périphériques, qui étaient tous connectés au bus système. Ils étaient ainsi reliés au processeur et à la mémoire directement. De nos jours, la plupart des contrôleurs de périphériques sont soit intégrés dans le périphérique, soit placés sur la carte mère. Les périphériques qui intègrent leur propre contrôleur sont nombreux et on peut citer les disques durs, les SSD, les cartes sons ou les cartes vidéo. Mais il reste encore de nombreux contrôleurs placés sur la carte mère. Ces derniers sont généralement regroupés dans un seul circuit, appelé le chipset, sauf pour quelques exceptions.

Grâce au chipset, chaque périphérique a un bus qui lui est dédié, et qui est généralement parfaitement adapté aux besoins du périphérique. De nos jours, chaque périphérique a son propre bus dédié, avec cependant quelques exceptions. Il y a ainsi un bus pour la souris, un autre pour le clavier, un autre pour les supports de stockage, un autre pour les cartes d'extension (carte son, carte graphique) et ainsi de suite. Sans chipset, cela ne serait pas possible. précisons aussi que le chipset intègre les mécanismes de décodage d'adresse et/ou de sélection des contrôleurs vus au-dessus. C'est lui qui redirige les commandes/données vers le contrôleur adéquat.

 
Chipset et contrôleurs de périphériques.

Ce regroupement a de nombreux avantages. Déjà, cette technique permet de profiter des techniques avancées de miniaturisation et l'intégration. Les anciens ordinateurs devaient souder une dizaine de contrôleurs de périphériques différents sur la carte mère, ce qui avait un coût en termes de branchements, de coût de production et autres. Mais la miniaturisation a permet de regrouper le tout dans un seul boîtier, limitant les besoins en branchements, en soudures, en coût de production, et j'en passe. Ensuite, cette technique limite le nombre d'interconnexions. Un seul bus relie le processeur, la mémoire, et le chipset, les autres bus sont tous connectés au chipset. Les interconnexions sont beaucoup plus simples et relier les différents composants est facile.