Es ist schon eine Weile her, dass dies gefragt wurde, aber ich hasse verwaiste Fragen :)
Lassen Sie uns zunächst eine moderne x86-Plattform stark vereinfachen und so tun, als ob sie einen 32-Bit-Adressraum von 0x00000000 bis 0xFFFFFFFF hat. Wir ignorieren alle speziellen / reservierten Bereiche, TOLUD-Löcher (oben auf dem unteren DRAM-Bereich, im Intel-Sprachgebrauch) usw. Wir nennen diese Systemspeicherzuordnung .
Zweitens, PCI - Express erweitert PCI. Aus Sicht der Software sind sie sich sehr, sehr ähnlich.
Ich werde zuerst zu Ihrem dritten - Konfigurationsraum - springen . Alle Adressen, die auf den Konfigurationsbereich verweisen, werden aus der Systemspeicherzuordnung zugewiesen . Ein PCI-Gerät verfügte über einen 256-Byte-Konfigurationsspeicher - dieser Speicher wird für PCI Express auf 4 KB erweitert. Dieser 4 - KB - Raum verbraucht Speicheradressen aus dem Systemspeicher Karte, aber die tatsächlichen Werte / bits / Inhalte werden in den Registern auf dem Peripheriegerät im Allgemeinen implementiert. Wenn Sie beispielsweise die Hersteller-ID oder Geräte-ID lesen, gibt das Zielperipheriegerät die Daten zurück, obwohl die verwendete Speicheradresse aus der Systemspeicherzuordnung stammt.
Sie haben angegeben, dass diese "in den RAM" zugewiesen werden - nicht wahr, die tatsächlichen Bits / statusbehafteten Elemente befinden sich im Peripheriegerät. Sie werden jedoch der Systemspeicherzuordnung zugeordnet. Als Nächstes haben Sie gefragt, ob es sich um einen gemeinsamen Registersatz für alle PCIe-Geräte handelt - Ja und Nein. Wie der PCI-Konfigurationsraum funktioniert, befindet sich am Ende jedes Abschnitts ein Zeiger, der angibt, ob mehr "Zeug" gelesen werden muss. Es gibt ein Minimum, das alle PCIe-Geräte implementieren müssen, und die fortgeschritteneren Geräte können mehr implementieren. Wie nützlich es für den Funktionsbetrieb ist, ist obligatorisch und wird häufig genutzt. :)
Nun ist Ihre Frage zu BARs (Basisadressregister) ein guter Bereich, um in Speicherbereich und E / A-Bereich zu unterteilen. Die Spezifikation ist etwas x86-zentriert und ermöglicht zusätzlich zum Typ die Angabe einer BAR-Größe. Auf diese Weise kann ein Gerät eine reguläre Speicherzuordnungs-BAR oder eine E / A-Leiste anfordern, die einen Teil des 4-KB-E / A-Speicherplatzes eines x86-Computers belegt. Sie werden feststellen, dass auf PowerPC-Computern E / A-Leisten wertlos sind.
Eine BAR ist im Grunde die Methode des Geräts, um dem Host mitzuteilen, wie viel Speicher und von welchem Typ er benötigt (siehe oben). Wenn ich nach 1 MB Speicherplatz frage, weist mir das BIOS möglicherweise die Adresse 0x10000000 bis 0x10100000 zu. Dies verbraucht keinen physischen RAM, sondern nur Adressraum (sehen Sie jetzt, warum 32-Bit-Systeme Probleme mit Erweiterungskarten wie High-End-GPUs mit GB RAM haben?). Jetzt wird ein Schreib- / Lesespeicher mit der Meldung 0x10000004 an das PCI Express-Gerät gesendet. Dies kann ein byteweites Register sein, das mit LEDs verbunden wird. Wenn ich also 0xFF in die physikalische Speicheradresse 0x10000004 schreibe, werden 8 LEDs eingeschaltet. Dies ist die grundlegende Prämisse der Memory-Mapped I / O .
Der E / A-Bereich verhält sich ähnlich, mit der Ausnahme, dass er in einem separaten Speicherbereich, dem x86-E / A-Bereich, ausgeführt wird. Die Adresse 0x3F8 (COM1) befindet sich sowohl im E / A-Bereich als auch im Speicherbereich und ist zwei verschiedene Dinge.
Ihre letzte Frage, Nachrichten beziehen sich auf eine neue Art von Interrupt-Mechanismus, Message Signaled Interrupts oder kurz MSI. Ältere PCI-Geräte hatten vier Interrupt-Pins, INTA, INTB, INTC, INTD. Diese wurden in der Regel zwischen den Steckplätzen gewechselt, sodass INTA auf Steckplatz 0 zu INTA ging, dann auf Steckplatz 1 zu INTB, dann auf Steckplatz 2 zu INTC, auf Steckplatz 3 zu INTD und dann wieder auf Steckplatz 4 zu INTA. Der Grund dafür ist, dass die meisten PCI Geräte, die nur INTA implementieren, und wenn Sie es mit drei Geräten beträufeln, erhalten Sie jeweils ein eigenes Interrupt-Signal für den Interrupt-Controller. MSI ist einfach eine Möglichkeit, Interrupts über die PCI Express-Protokollschicht zu signalisieren, und der PCIe-Root-Komplex (der Host) kümmert sich um die Unterbrechung der CPU.
Diese Antwort ist vielleicht zu spät, um Ihnen zu helfen, aber vielleicht hilft sie einem zukünftigen Googler / Binger.
Schließlich empfehle ich, dieses Buch von Intel zu lesen , um eine gute, detaillierte Einführung in PCIe zu erhalten, bevor Sie fortfahren. Eine weitere Referenz wären die Linux Device Drivers, ein Online-eBook von LWN .