Adressräume in PCIe

19

Es gibt vier Adressräume in PCI Express:

  • Speicher zugeordnet
  • E / A zugeordnet
  • Konfigurationsraum
  • Botschaft

Kann jemand bitte die Bedeutung jedes Adressraums und seinen Zweck in Kürze erläutern?

Nach meinem Verständnis werden diese alle Speicherplätze in RAM (dh Prozessorspeicher) zugeordnet. Konfigurationsspeicher ist der Speicherplatz, der für gemeinsame Registersätze reserviert ist (in allen PCIe-Geräten vorhanden). Ist dieser Speicherplatz für alle PCIe-Geräte gleich? Und wie nützlich ist es für den PCIe-Funktionsbetrieb?

Dieser Raum enthält BAR (Basisadressregister). Wird dieses Register verwendet, um die im PCIe-Endpunkt verfügbare Adresse anzugeben?

Ich bin neu im PCIe und versuche es zu lernen. Ich beziehe mich auf die Basisspezifikation, aber ich denke, sie wurde für Leser geschrieben, die über Vorkenntnisse in PCI und PCIe verfügen.

Lesen Sie auch einige kostenlose Online-Referenzen, um das Verständnis der Basisspezifikation zu verbessern. Ich verstehe, dass jedes PCIe-Gerät, an das der Root-Komplex angeschlossen ist, einem bestimmten Speicherbereich zugewiesen wird.

Ronex Dicapriyo
quelle

Antworten:

31

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 .

Krunal Desai
quelle
Die Post war sehr hilfreich. Ich bin sehr neu bei PCIe. Damit der Aufzählungsprozess stattfinden kann (Zuweisung und Zuordnung des Konfigurationsspeichers), benötigen wir Treiberunterstützung, oder er kann von Os initiiert werden.
Kamlendra
Danke, ich bin froh, dass es hilfreich war! Auf x86-Plattformen führt die BIOS-Software im Allgemeinen eine gewisse Speicherzuordnung auf der Grundlage der Konfigurationsspeicherinformationen durch, die sie von den PCI-Geräten analysiert. Moderne Betriebssysteme akzeptieren diese Speicherzuordnung im Allgemeinen so wie sie ist (AFAIK), obwohl auch sie Geräte durchlaufen und auflisten, um die entsprechenden Treiber zu laden. Ich erinnere mich, dass ich unter Linux einige interessante Dinge gesehen habe, mit denen Sie möglicherweise die vom BIOS zugewiesenen Einstellungen ändern können.
Krunal Desai
Beachten Sie, dass nur der als vorabrufbar markierte Speicher mehr als ein DWORD pro Transaktion übertragen kann. Alle anderen Leerzeichen können nur ein einziges DWORD pro Transaktion übertragen. Die Größe eines Bursts ist auf MAX_PAYLOAD_SIZE begrenzt (während der Aufzählung ermittelt).
Peter Smith
Hallo. Ich bin neu bei PCI und möchte ein bisschen Klarheit über Ihre Antwort. Sie haben angegeben, dass der Konfigurationsspeicher von 256 b / 4 kByte dem Systemspeicher zugeordnet ist. Nach meinem Selbststudium dachte ich, der Zugriff auf den Konfigurationsraum wird über einen PCI-Controller abgewickelt, der statisch in den Systemspeicher abgebildet wird. Dieser Controller stellt einige Register (zur Geräte- / Funktionsidentifikation, versetzt in Adressraum, Ergebnisadresse) zur Verfügung, die als kleine Schnittstelle in den Konfigurationsraum dienen. Tatsächlich sind also nur 5 bis 10 Bytes statisch für den PCI-Controller reserviert. Ist das richtig ???
Cerezo
Wenn also der Host (die CPU) einen Wert 0xFF an der Adresse 0x10000004 in ein Register schreibt, ruft der PCI-Stammkomplex diese Daten ab (möglicherweise hat er immer an einer beliebigen Adresse von 0x10000000 bis 0x10100000 nach Daten gesucht) und schreibt sie an der Adresse 0x04 am Endpunkt (PCIe-Gerät)? Ist dieses Verständnis richtig?
AlphaGoku