E/S mappées en mémoire - Memory-mapped I/O

Les E/S mappées en mémoire ( MMIO ) et les E/S mappées sur les ports ( PMIO ) sont deux méthodes complémentaires pour effectuer des entrées/sorties (E/S) entre l' unité centrale de traitement (CPU) et les périphériques d'un ordinateur . Une autre approche consiste à utiliser des processeurs d'E/S dédiés, communément appelés canaux sur les ordinateurs centraux , qui exécutent leurs propres instructions .

Les E/S mappées en mémoire utilisent le même espace d'adressage pour adresser à la fois la mémoire et les périphériques d'E/S . La mémoire et les registres des périphériques d'E/S sont mappés sur (associés à) des valeurs d'adresse. Ainsi, une adresse mémoire peut faire référence à une partie de la RAM physique ou à la mémoire du périphérique d'E/S. Ainsi, les instructions CPU utilisées pour accéder à la mémoire peuvent également être utilisées pour accéder aux périphériques. Chaque périphérique d'E/S surveille le bus d'adresse du processeur et répond à tout accès au processeur d'une adresse attribuée à ce périphérique, en connectant le bus de données au registre matériel du périphérique souhaité . Pour accueillir les périphériques d'E/S, les zones des adresses utilisées par la CPU doivent être réservées aux E/S et ne doivent pas être disponibles pour la mémoire physique normale. La réservation peut être permanente ou temporaire (telle que réalisée via la commutation bancaire ). Un exemple de ce dernier se trouve dans le Commodore 64 , qui utilise une forme de mappage de mémoire pour faire apparaître la RAM ou le matériel d'E/S dans la 0xD000-0xDFFFplage.

Les E/S mappées sur les ports utilisent souvent une classe spéciale d'instructions CPU conçues spécifiquement pour effectuer des E/S, telles que les instructions inet outtrouvées sur les microprocesseurs basés sur les architectures x86 et x86-64 . Différentes formes de ces deux instructions peuvent copier un, deux ou quatre octets ( outb, outwet outl, respectivement) entre le registre EAX ou l'une des subdivisions de ce registre sur la CPU et un port d'E/S spécifié qui est affecté à un périphérique d'E/S. Les périphériques d'E/S ont un espace d'adressage séparé de la mémoire générale, soit accompli par une broche "E/S" supplémentaire sur l'interface physique de la CPU, soit un bus entier dédié aux E/S. Étant donné que l'espace d'adressage des E/S est isolé de celui de la mémoire principale, il est parfois appelé E/S isolées.

Aperçu

Différentes méthodes de communication CPU-appareil, telles que le mappage de mémoire, n'affectent pas l' accès direct à la mémoire (DMA) pour un appareil, car, par définition, DMA est une méthode de communication mémoire-appareil qui contourne le CPU.

Les interruptions matérielles sont une autre méthode de communication entre la CPU et les périphériques, cependant, pour un certain nombre de raisons, les interruptions sont toujours traitées séparément. Une interruption est déclenchée par le périphérique, contrairement aux méthodes mentionnées ci-dessus, qui sont déclenchées par le processeur. Il est également unidirectionnel, car les informations ne circulent que du périphérique au processeur. Enfin, chaque ligne d'interruption ne porte qu'un seul bit d'information à signification fixe, à savoir « un événement nécessitant une attention s'est produit dans un appareil sur cette ligne d'interruption ».

Les opérations d'E/S peuvent ralentir l'accès à la mémoire si les bus d'adresse et de données sont partagés. En effet, le périphérique est généralement beaucoup plus lent que la mémoire principale. Dans certaines architectures, les E/S mappées sur les ports fonctionnent via un bus d'E/S dédié, ce qui atténue le problème.

L'un des mérites des E/S mappées en mémoire est que, en éliminant la complexité supplémentaire apportée par les E/S de port, un processeur nécessite moins de logique interne et est donc moins cher, plus rapide, plus facile à construire, consomme moins d'énergie et peut être physiquement plus petit ; cela suit les principes de base du calcul à jeu d'instructions réduit , et est également avantageux dans les systèmes embarqués . L'autre avantage est que, du fait que des instructions mémoire régulières sont utilisées pour adresser des périphériques, tous les modes d'adressage du CPU sont disponibles pour les E/S ainsi que la mémoire, et les instructions qui effectuent une opération ALU directement sur un opérande mémoire (chargement d'un opérande à partir d'un emplacement mémoire, stockage du résultat dans un emplacement mémoire, ou les deux) peut également être utilisé avec les registres de périphérique d'E/S. En revanche, les instructions d'E/S mappées sur les ports sont souvent très limitées, ne fournissant souvent que de simples opérations de chargement et de stockage entre les registres CPU et les ports d'E/S, de sorte que, par exemple, pour ajouter une constante à un port mappé registre de périphérique nécessiterait trois instructions : lire le port dans un registre CPU, ajouter la constante au registre CPU et réécrire le résultat dans le port.

Comme les processeurs 16 bits sont devenus obsolètes et remplacés par des processeurs 32 bits et 64 bits d'usage général, réserver des plages d'espace d'adressage mémoire pour les E/S est moins un problème, car l'espace d'adressage mémoire du processeur est généralement beaucoup plus grand que l'espace requis pour tous les périphériques de mémoire et d'E/S d'un système. Par conséquent, il est devenu plus souvent pratique de tirer parti des avantages des E/S mappées en mémoire. Cependant, même si l'espace d'adressage n'est plus une préoccupation majeure, aucune des méthodes de mappage d'E/S n'est universellement supérieure à l'autre, et il y aura des cas où l'utilisation d'E/S mappées par port sera toujours préférable.

Les E/S mappées en mémoire sont préférées dans les architectures x86 car les instructions qui effectuent les E/S basées sur les ports sont limitées à un seul registre : EAX, AX et AL sont les seuls registres dans lesquels les données peuvent être déplacées, et soit une valeur immédiate de la taille d'un octet dans l'instruction soit une valeur dans le registre DX détermine quel port est le port source ou de destination du transfert. Étant donné que tout registre à usage général peut envoyer ou recevoir des données vers ou depuis la mémoire et les périphériques d'E/S mappés en mémoire, les E/S mappées en mémoire utilisent moins d'instructions et peuvent s'exécuter plus rapidement que les E/S de port. AMD n'a pas étendu les instructions d'E/S de port lors de la définition de l' architecture x86-64 pour prendre en charge les ports 64 bits, de sorte que les transferts 64 bits ne peuvent pas être effectués à l'aide d'E/S de port.

Barrières de mémoire

Étant donné que les caches médiatisent accès à des adresses mémoire, les données écrites à des adresses différentes peuvent atteindre les périphériques de la mémoire ou des registres de l'ordre du programme, à savoir si le logiciel écrit des données à une adresse et écrit ensuite les données à une autre adresse, le cache tampon d'écriture ne garantir que les données atteindront les périphériques dans cet ordre. Tout programme qui n'inclut pas d' instructions de vidage du cache après chaque écriture dans la séquence peut voir des effets d'E/S involontaires si un système de cache optimise l'ordre d'écriture. Les écritures en mémoire peuvent souvent être réorganisées pour réduire la redondance ou pour mieux utiliser les cycles d'accès à la mémoire sans changer l'état final de ce qui a été stocké ; alors que les mêmes optimisations pourraient changer complètement la signification et l'effet des écritures dans les régions d'E/S mappées en mémoire.

Le manque de prévoyance dans le choix des régions d'E/S mappées en mémoire a conduit à de nombreuses barrières de capacité de mémoire vive dans les anciennes générations d'ordinateurs. Les concepteurs s'attendaient rarement à ce que les machines grandissent pour utiliser pleinement la capacité de mémoire RAM théorique d'une architecture et utilisaient donc souvent certains des bits de poids fort de l'espace d'adressage comme sélecteurs pour les fonctions d'E/S mappées en mémoire. Par exemple, la barrière de 640 Ko dans les PC IBM et dérivés est due à la réservation de la région entre 640 et 1024 Ko (64k segments 10 à 16) pour la zone mémoire supérieure . Ce choix a eu au départ peu d'impact, mais il a finalement limité la mémoire vive totale disponible dans l'espace d'adressage disponible de 20 bits. La barrière de 3 Go et le trou PCI en sont des manifestations similaires avec des espaces d'adressage 32 bits, exacerbés par les détails du processus de démarrage X86 et de la conception MMU . Les architectures 64 bits ont souvent des problèmes techniques similaires, mais ceux-ci n'ont que rarement des conséquences pratiques.

Exemples

Un exemple de carte de mémoire système
Plage d'adresses ( hexadécimal ) Taille Appareil
0000-7FFF 32 Kio RAM
8000–80FF 256 octets E/S à usage général
9000–90FF 256 octets Contrôleur de son
A000–A7FF 2 Kio Contrôleur vidéo/RAM d'affichage mappée en texte
C000–FFFF 16 Kio ROM

Un système simple construit autour d'un microprocesseur 8 bits peut fournir des lignes d'adresse 16 bits, lui permettant d'adresser jusqu'à 64  kibioctets (KiB) de mémoire. Sur un tel système, les 32 premiers Ko d'espace d'adressage peuvent être alloués à la mémoire vive (RAM), 16 Ko supplémentaires à la mémoire morte (ROM) et le reste à une variété d'autres dispositifs tels que des minuteries, des compteurs, un affichage vidéo. puces, dispositifs générateurs de son, etc.

Le matériel du système est conçu de telle sorte que les appareils sur le bus d'adresses ne répondent qu'à des adresses particulières qui leur sont destinées, tandis que toutes les autres adresses sont ignorées. C'est le travail des circuits de décodage d'adresse , et qui établit la carte mémoire du système. En conséquence, la carte mémoire du système peut ressembler à celle du tableau de droite. Cette carte mémoire contient des lacunes, ce qui est également assez courant dans les architectures système réelles.

En supposant que le quatrième registre du contrôleur vidéo définit la couleur d'arrière-plan de l'écran, la CPU peut définir cette couleur en écrivant une valeur dans l'emplacement mémoire A003 en utilisant son instruction d'écriture mémoire standard. En utilisant la même méthode, des graphiques peuvent être affichés sur un écran en écrivant des valeurs de caractères dans une zone spéciale de RAM au sein du contrôleur vidéo. Avant la RAM bon marché qui permettait les affichages bitmap , cette méthode de cellule de caractères était une technique populaire pour les affichages vidéo informatiques (voir Interface utilisateur texte ).

Types de base de décodage d'adresse

Les types de décodage d'adresses, dans lesquels un appareil peut décoder des adresses complètement ou incomplètement, comprennent les suivants :

Décodage complet (exhaustif)
Mappage 1:1 d'adresses uniques sur un registre matériel (emplacement de mémoire physique). Implique la vérification de chaque ligne du bus d'adresses .
Décodage incomplet (partiel)
mappage n:1 de n adresses uniques à un registre matériel. Le décodage partiel permet à un emplacement mémoire d'avoir plus d'une adresse, permettant au programmeur de référencer un emplacement mémoire en utilisant n adresses différentes. Cela peut également être fait pour simplifier le matériel de décodage en utilisant une logique plus simple et souvent moins chère qui n'examine que certaines lignes d'adresse, lorsque tout l'espace d'adressage de la CPU n'est pas nécessaire. Généralement, le décodage lui-même est programmable, de sorte que le système peut reconfigurer sa propre carte mémoire selon les besoins, bien qu'il s'agisse d'un développement plus récent et généralement en conflit avec l'intention d'être moins cher.
Synonymes : repliement, mappage multiple, mappage partiel, alias d' adresse .
Décodage linéaire
Les lignes d'adresse sont utilisées directement sans aucune logique de décodage. Cela se fait avec des dispositifs tels que des RAM et des ROM qui ont une séquence d'entrées d'adresses, et avec des puces périphériques qui ont une séquence d'entrées similaire pour adresser une banque de registres. L'adressage linéaire est rarement utilisé seul (uniquement lorsqu'il y a peu de périphériques sur le bus, car l'utilisation d'un adressage purement linéaire pour plusieurs périphériques gaspille généralement beaucoup d'espace d'adressage) mais est plutôt combiné avec l'une des autres méthodes pour sélectionner un périphérique ou groupe de dispositifs au sein duquel l'adressage linéaire sélectionne un seul registre ou emplacement mémoire.

E/S de port via les pilotes de périphérique

Dans les ordinateurs Windows, la mémoire est également accessible via des pilotes spécifiques tels que DOLLx8KD qui donne un accès E/S en 8, 16 et 32 ​​bits sur la plupart des plates-formes Windows à partir de Windows 95 jusqu'à Windows 7. Installation des E/S les pilotes de port assureront l'accès à la mémoire en activant les pilotes avec de simples appels DLL permettant les E/S de port et lorsqu'ils ne sont pas nécessaires, le pilote peut être fermé pour empêcher l'accès non autorisé aux ports d'E/S.

Linux fournit l' utilitaire pcimem pour permettre la lecture et l'écriture sur les adresses MMIO. Le noyau Linux permet également de tracer l'accès MMIO à partir des modules du noyau (pilotes) à l'aide de la fonction de débogage mmiotrace du noyau . Pour permettre cela, le noyau Linux doit être compilé avec l'option correspondante activée. mmiotrace est utilisé pour le débogage des pilotes de périphériques à source fermée.

Voir également

Les références