Clarification de la différence entre l'adressage de la mémoire PCI et l'adressage E / S?

Quelqu'un pourrait-il préciser la différence entre la mémoire et les adresses E / S sur le bus PCI / PCIe?

Je comprends que les adresses d'E / S sont de 32 bits, limitées à la plage de 0 à 4 Go, et ne correspondent pas à la mémoire système (RAM) et que les adresses de mémoire sont 32 bits ou 64 bits.

J'ai l'impression que l'adressage de la mémoire doit correspondre à la RAM disponible, est-ce vrai? Que si un périphérique PCI souhaite transférer des données vers une adresse mémoire, cette adresse doit exister dans la RAM système réelle (et est allouée pendant la configuration PCI) et non la mémoire virtuelle.

Donc, si un périphérique PCI ne doit transférer qu'une petite quantité de données à la fois, où il n'y a aucun avantage à le mettre en RAM ou à utiliser DMA, l'adressage E / S est bien (p. Ex., Un port parallèle implémenté sur une carte PCI) .

Et pourquoi est-ce que je continue à lire que l'adressage d'E / S PCI / PCIe est en désuétude en faveur de l'adressage mémoire?

Merci!

L'espace d'adressage physique est énorme aujourd'hui en raison de l'adressage 64 bits. De nombreux périphériques, par exemple des contrôleurs de disque compatibles AHCI, nécessitent des blocs d'espace d'adressage assez importants pour être mappés dans les registres des périphériques.

En outre, l'espace d'adresse IO n'est pas accessible avec les instructions d'assemblage habituelles. Il est accessible uniquement avec des instructions spéciales qui peuvent être lues et écrites dans les registres IO. Ce n'est pas vraiment pratique et inefficace dans de nombreux cas.

Par exemple, le contrôleur compatible ACPI mentionné ci-dessus a une certaine fonctionnalité qui nécessite que le processeur exécute une opération de lecture-modification-écrit verrouillée pour changer un seul bit dans un registre de périphérique à condition qu'aucun autre noyau ne puisse accéder et modifier le même registre entre les deux. Avec l'espace d'adresse IO, cela n'est pas possible du tout.

Un autre point que nous devrions prendre en compte est que le bus PCI n'est pas unique à l'architecture x86. Il existe d'autres architectures qui n'ont aucun bus IO spécial. Ainsi, les fournisseurs de périphériques préfèrent ne pas utiliser les adresses IO pour rester compatibles avec la plupart des systèmes. Ainsi, personne n'utilise l'espace d'adresse IO. Alors pourquoi ne pas faire de-jure ce qui est de facto depuis longtemps?