Cela fait un moment que cela n'a pas été demandé, mais je déteste les questions orphelines :)
Tout d'abord, simplifions excessivement une plate-forme x86 moderne et prétendons qu'elle a un espace d'adressage de 32 bits de 0x00000000 à 0xFFFFFFFF. Nous ignorerons toutes les zones spéciales / réservées, les trous TOLUD (en haut de la DRAM utilisable inférieure, le langage Intel), etc. Nous appellerons cette carte de mémoire système .
Deuxièmement, PCI Express étend PCI. D'un point de vue logiciel, ils sont très, très similaires.
Je vais passer à votre troisième espace de configuration - en premier. Toutes les adresses qui pointent vers l'espace de configuration sont attribuées à partir de la carte de mémoire système . Un périphérique PCI avait un espace de configuration de 256 octets - celui-ci est étendu à 4 Ko pour PCI express. Cet espace de 4 Ko utilise des adresses mémoire de la carte mémoire du système, mais les valeurs / bits / contenus réels sont généralement implémentés dans des registres sur le périphérique. Par exemple, lorsque vous lisez l'ID de fournisseur ou l'ID de périphérique, le périphérique cible renvoie les données même si l'adresse mémoire utilisée provient de la carte de mémoire système.
Vous avez déclaré que ceux-ci sont "alloués dans la RAM" - ce n'est pas vrai, les bits / éléments avec état réels sont dans le périphérique. Cependant, ils sont mappés dans la carte de mémoire système. Ensuite, vous avez demandé s'il s'agissait d'un ensemble commun de registres sur tous les périphériques PCIe - oui et non. La façon dont l'espace de configuration PCI fonctionne, il y a un pointeur à la fin de chaque section qui indique s'il y a plus de "trucs" à lire. Il y a un strict minimum que tous les périphériques PCIe doivent implémenter, puis les périphériques plus avancés peuvent implémenter davantage. Quant à son utilité pour le fonctionnement fonctionnel, eh bien, c'est obligatoire et largement utilisé. :)
Maintenant, votre question sur les BAR (registres d'adresses de base) est un bon espace pour enchaîner dans l'espace mémoire et l'espace d'E / S. Étant quelque peu centrée sur x86, la spécification permet la spécification d'une taille de BARRE, en plus du type. Cela permet à un périphérique de demander une BAR régulière mappée en mémoire, ou une BARRE d'espace d'E / S, qui mange une partie des 4 K d'espace d'E / S d'une machine x86. Vous remarquerez que sur les machines PowerPC, les BARRES d'espace d'E / S sont sans valeur.
Une BAR est fondamentalement le moyen utilisé par l'appareil pour indiquer à l'hôte la quantité de mémoire dont il a besoin et de quel type (voir ci-dessus). Si je demande par exemple 1 Mo d'espace mappé en mémoire, le BIOS peut m'attribuer l'adresse 0x10000000 à 0x10100000. Cela ne consomme pas de RAM physique, il suffit d'adresser de l'espace (voyez-vous maintenant pourquoi les systèmes 32 bits rencontrent des problèmes avec les cartes d'extension comme les GPU haut de gamme qui ont Go de RAM?). Maintenant, une écriture / lecture de mémoire pour dire 0x10000004 sera envoyée au périphérique PCI Express, et cela peut être un registre à l'échelle de l'octet qui se connecte aux LED. Donc, si j'écris 0xFF à l'adresse de mémoire physique 0x10000004, cela allumera 8 LED. Il s'agit du principe de base des E / S mappées en mémoire .
L'espace d'E / S se comporte de la même manière, sauf qu'il fonctionne dans un espace mémoire séparé, l'espace d'E / S x86. L'adresse 0x3F8 (COM1) existe à la fois dans l'espace d'E / S et dans l'espace mémoire et ce sont deux choses différentes.
Votre dernière question, les messages font référence à un nouveau type de mécanisme d'interruption, les interruptions signalées par message ou MSI pour faire court. Les périphériques PCI hérités avaient quatre broches d'interruption, INTA, INTB, INTC, INTD. Celles-ci étaient généralement réparties entre les emplacements tels que INTA est allé à INTA sur l'emplacement 0, puis INTB sur l'emplacement 1, puis INTC sur l'emplacement 2, INTD sur l'emplacement 3, puis de nouveau sur INTA sur l'emplacement 4. La raison en est que la plupart des PCI les périphériques implémentaient uniquement INTA et, en le multipliant, c'est-à-dire trois périphériques, chacun se retrouverait avec son propre signal d'interruption au contrôleur d'interruption. MSI est simplement un moyen de signaler les interruptions à l'aide de la couche de protocole PCI Express, et le complexe racine PCIe (l'hôte) se charge d'interrompre le CPU.
Cette réponse est peut-être trop tard pour vous aider, mais peut-être qu'elle aidera certains futurs Googler / Binger.
Enfin, je vous recommande de lire ce livre d'Intel pour obtenir une bonne introduction détaillée à PCIe avant d'aller plus loin. Une autre référence serait les pilotes de périphériques Linux, un ebook en ligne de LWN .