Espaces d'adresses dans PCIe

19

PCI express comporte quatre espaces d'adressage:

  • Mémoire mappée
  • E / S mappées
  • Espace de configuration
  • Message

Quelqu'un peut-il expliquer la signification de chaque espace d'adressage, et son objectif en bref?

Selon ma compréhension, tous ces espaces sont alloués dans la RAM (c'est-à-dire la mémoire du processeur). L'espace de configuration est l'espace alloué pour un ensemble commun de registres (présent dans tous les périphériques PCIe). Cet espace est-il commun à tous les périphériques PCIe? Et comment est-il utile pour un fonctionnement fonctionnel PCIe?

Cet espace contient BAR (registre d'adresses de base). Ce registre est-il utilisé pour spécifier l'adresse disponible dans le point de terminaison PCIe?

Je suis nouveau sur le PCIe et j'essaie de l'apprendre. Je fais référence à la spécification de base, mais je pense qu'elle est écrite pour les lecteurs ayant une connaissance préalable de PCI et PCIe.

Veuillez également consulter quelques références en ligne gratuites utiles pour accélérer la compréhension des spécifications de base. Je comprends que chaque fois qu'un périphérique PCIe attaché avec un complexe racine, il sera attribué à une région de mémoire.

ronex dicapriyo
la source

Réponses:

31

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 .

Krunal Desai
la source
Le Post a été très utile. Je suis très nouveau sur PCIe. Pour que le processus d'énumération se produise (allocation et mappage de l'espace de configuration), nous avons besoin du support du pilote, ou il peut être initié par Os.
kamlendra
Merci, heureux que cela ait été utile! Généralement, sur les plates-formes x86, le logiciel du BIOS effectue une certaine allocation de mémoire en fonction des informations d'espace de configuration qu'il analyse à partir des périphériques PCI. Les systèmes d'exploitation modernes acceptent généralement cette carte mémoire en l'état, AFAIK, bien qu'eux aussi passent en revue et énumèrent les périphériques pour charger les pilotes appropriés. Je me souviens avoir vu des choses intéressantes de bas niveau dans Linux qui pourraient vous permettre de changer ce que le BIOS avait assigné.
Krunal Desai
Notez que seule la mémoire marquée comme pré-récupérable peut transférer plus d'un seul DWORD par transaction; tous les autres espaces ne peuvent transférer qu'un seul DWORD par transaction. La taille d'une rafale est limitée à MAX_PAYLOAD_SIZE (découverte lors de l'énumération).
Peter Smith
Bonjour. Je suis nouveau au PCI et j'aimerais avoir des éclaircissements sur votre réponse. Vous avez déclaré que les 256b / 4k octets d'espace de configuration sont mappés dans la mémoire système. De mon auto-tutorat, j'ai pensé que l'accès à l'espace de configuration est géré par un contrôleur PCI qui est mappé statiquement dans la mémoire système. Ce contrôleur fournit quelques registres (pour l'identification de périphérique / fonction, décalage dans l'espace d'adressage, adresse de résultat) qui servent de petite interface dans l'espace de configuration. Donc, en fait, seulement 5 à 10 octets sont réservés statiquement au contrôleur PCI. Est-ce correct ???
Cerezo
Ainsi, lorsque l'hôte (CPU) écrit dans un registre à l'adresse 0x10000004 une valeur 0xFF, le complexe racine PCI récupère ces données (peut-être recherchait-il toujours des données à n'importe quelle adresse de 0x10000000 à 0x10100000) et l'écrira à l'adresse 0x04 au point final (périphérique PCIe)? Cette compréhension est-elle correcte?
AlphaGoku