Warum teilen sich PCI-Geräte denselben Adressraum?

Warum teilen sich PCI-Geräte denselben Adressraum?

Wenn ein Computer hochfährt, prüft das BIOS oder Betriebssystem jedes PCI-Gerät, um zu erfahren, wie viel Adressraum es benötigt. Anschließend weist es den entsprechenden Platz zu und teilt jedem PCI-Gerät mit, wo sein Platz beginnt, damit das PCI-Gerät auf Lese- und Schreibanforderungen innerhalb dieses Bereichs reagieren kann.

Meine Frage ist, warum allen Geräten Blöcke aus demselben Adressraum zugewiesen werden müssen. Warum wird nicht jedem Gerät ein eigener Adressraum zugewiesen?

Auf der Leiterplatte gibt es bereits eine „Out-of-Band“-Methode zur Unterscheidung zwischen PCI-Geräten: die IDSEL-Leitung. Dies wird während der PCI-Aufzählung verwendet, bevor jedem Gerät sein Speicherplatz zugewiesen wurde. Warum also nicht auch für Zugriffe nach der Aufzählung verwenden und etwas Dekodierungslogik auf dem PCI-Gerät speichern? Wäre das irgendwie langsamer gewesen oder so?

Antwort1

In der Regel tun sie das nicht.brauchenum denselben Adressraum zu teilen. Die Trennung der Adressräume des Geräts ist genau der Zweck einer IOMMU und kann aus mehreren Gründen nützlich sein:

  • Es kann einer virtuellen Maschine den sicheren, direkten Zugriff auf physische Hardware mit nativen Treibern ermöglichen.
  • Es entkoppelt die Adressierungsfunktionen des Geräts vom physischen Adressraum. Mit anderen Worten: Es ermöglicht Ihnen, Geräte zu haben, die nur mit 32-Bit-Adressierung auf Daten überall im physischen Speicher zugreifen können, sogar oberhalb der ersten 4G.
  • Dadurch können Sie Geräte besser voneinander isolieren und so die Systemsicherheit deutlich verbessern.

Warum dies nicht das Standardverhalten ist und warum die IDSEL-Leitung hierfür nicht verwendet wird, kann ich nicht wirklich sagen, da ich nicht viel über die Geschichte der PCI-Designs weiß. Meine erste Vermutung wäre, dass es ursprünglich so war, damit es einfacher war, Treiber für ISA-Karten auf PCI zu portieren (ISA geht von einem flachen, gemeinsam genutzten Adressraum aus). Außerdem sind IOMMUs nicht gerade die am einfachsten zu entwerfende Hardware und sind erst seit kurzem auf x86-Plattformen weithin verfügbar (und es ist immer noch nicht garantiert, viele Intel-Chips haben sie noch nicht und viele Low-End-AMD-Chips auch nicht).

Es ist jedoch vielleicht erwähnenswert, dass die gemeinsame Nutzung des Adressraums zwischen Geräten bei PCI Express tatsächlich einen Vorteil bietet, nämlich dass Sie Übertragungen von Gerät zu Gerät durchführen können (obwohl dies von den meisten Plattformen nicht richtig unterstützt wird), was in großen Grid-Konfigurationen, die RDMA verwenden, sehr nützlich sein kann (Sie können Daten direkt von Remote-Geräten abrufen, ohne dass das Betriebssystem des Remote-Systems nach der Einrichtung der Übertragung vermitteln muss).

Antwort2

Bei x86-Systemen kann die CPU selbst nur auf zwei Adressräume zugreifen: den normalen Speicheradressraum und den IO-Adressraum. Andere Systeme haben möglicherweise nur einen Adressraum (z. B. ARM, PowerPC usw.). Diese beiden Adressräume sind aus Sicht der PCI-Geräte getrennt – für den Zugriff auf jeden Adressraum werden unterschiedliche Befehle verwendet, und Brücken haben für jeden Adressraum separate Konfigurationsregister. Da die CPU jedoch nur auf diese beiden Adressräume zugreifen kann, müssen alle angeschlossenen Geräte diesen beiden Adressräumen zugeordnet werden. Es handelt sich also nicht so sehr um eine Einschränkung von PCI, sondern eher um eine Einschränkung der Architektur des restlichen Systems.

Ich sollte auch erwähnen, dass es bei der Entwicklung von PCI so etwas wie ein IOMMU noch nicht gab; das ist eine relativ neue Ergänzung.

verwandte Informationen