Sind PCIe-Geräte für den Einsatz in Plattformen und Architekturen konzipiert?

631
Kong Chun Ho

Einige PCIe-Geräte enthalten ein "PCI Expansion ROM" oder "PCI Option ROM", in dem Programme zur Initialisierung der Geräte gespeichert sind.

Nehmen wir an, ich habe einen PCIe-RAID-Controller, der normalerweise auf x86-Computern verwendet wird. Wenn das PCIe-Gerät jetzt in eine ARM-Maschine eingesteckt wird, konnte es nicht initialisiert werden? Sind die meisten PCIe-Geräte also x86-spezifisch?

2
Bei den an das System angeschlossenen Geräten gibt es zwischen x86 und ARM erhebliche Unterschiede. Diese beiden Architekturen sind in diesem Bereich so unterschiedlich, dass sie nicht miteinander verglichen werden können. Wie Geräte zu einem ARM-Gerät hinzugefügt werden, unterscheidet sich grundlegend von einem x86-Gerät. Ramhound vor 5 Jahren 0
@Ramhound: Und dennoch unterstützen sie PCI und PCIe. (So ​​auch PowerPC-Systeme, MIPS-Systeme, TileGX-Systeme ...) grawity vor 5 Jahren 2
@grawity - Ich habe ARM nicht unterstützt. PCI und PCI-E werden nicht unterstützt. Wie sie dem System hinzugefügt werden, ist jedoch völlig anders als das Hinzufügen eines PCI-E-Geräts zu einem x86-System. Ramhound vor 5 Jahren 0
ein Beispiel für PPC: [NXP-Entwicklerplatine T2080 e6500 mit Debian sid PPC64 und RadeonHD] (https://www.facebook.com/powerpcnotebook/posts/1881412475487133) phuclv vor 5 Jahren 0

2 Antworten auf die Frage

6
LawrenceC

Hier sind die Probleme mit PCI-Options-ROMs in der ARM-Architektur:

  • Ein in x86-Assembly geschriebenes Options-ROM kann von einer ARM-CPU nicht verstanden werden.
  • Option-ROMs, die von PC-BIOSen ausgeführt werden sollen (solche ROMs beginnen mit 0x55AAund verfügen über ein paar Bytes für Prüfsumme und zusätzliche Informationen), gehen von Details der PC-Architektur aus, z. B. VGA-Hardware, Intel-CPU-E / A-Ports usw.
  • Das gesamte BIOS-Konzept war eng mit der x86-CPU- und PC-Architektur verbunden und wurde für kein ARM-System verwendet.

Jetzt ...

  • UEFI, der BIOSes-Nachfolger ist für andere CPUs als x86 vorgesehen.

  • Die Lösung für die oben genannten Probleme war EFI-Bytecode - ein Bytecode, der von einer Laufzeit in der UEFI interpretiert werden würde, wodurch der Code unabhängig von der CPU wurde.

  • ARM-Systeme, die UEFI verwenden, sind relativ neu (die Surface RT könnte sogar das einzige derartige System sein). Die meisten ARM-Systeme verwenden CFE, U-Boot oder andere Boot-Firmware, die nicht wie PC-BIOS funktionieren.

Wenn das PCIe-Gerät jetzt in eine ARM-Maschine eingesteckt wird, konnte es nicht initialisiert werden?

Sie hätten nicht einmal eine Chance, es sei denn, das ARM-System würde UEFI verwenden. Wenn ja, würde Ihr System wahrscheinlich beim Booten hängen bleiben. EBC wird in der Boot-ROM-Firmware nicht häufig verwendet.

Während das Boot-ROM nicht funktionieren würde, würde ein Betriebssystem, das später bootet, die Hardware immer noch erkennen und verwenden können.


Was macht ein Boot-ROM?

Das alte BIOS vor UEFI implementierte eine API über den x86-Interrupt-Mechanismus. Ihr Programm muss verschiedene x86-Register als Parameter festlegen und dann eine x86- INTAnweisung ausgeben .

INTveranlasst die x86-CPU, eine Adresse in einer Tabelle nachzuschlagen, und überträgt die Steuerung darauf (dies wird als Software-Interrupt bezeichnet - Hardware kann dazu führen, dass mit einem Interrupt-Controller gesprochen wird, der ebenfalls mit der CPU verbunden ist).

Vor der Verarbeitung von Options-ROMs füllt das BIOS diese Tabelle mit verschiedenen Adressen, die wieder in das BIOS gehen und API-Funktionen ausführen.

MS-DOS verwendet Tabelle ausgiebig auf der BIOS für seine ursprüngliche Funktion zu verlassen - ein B asic I Nput / O utput S ystem. Andere Betriebssysteme verwenden keine BIOS-Aufrufe, wenn sie die Kontrolle haben. Sie verwenden ihre eigenen Treiber und Mechanismen zum Treiben von Hardware.

Da sich diese Interrupt-Tabelle im RAM befindet, kann sie geändert werden. Option-ROMs könnten sich in die Interrupt-Tabelle "einhaken" - die Adresse eines bestimmten Interrupts mit etwas im ROM überschreiben - und dazu führen, dass BIOS-API-Aufrufe zuerst an das Option-ROM gehen.

Ein BIOS-API-Aufruf, den das BIOS selbst verwendet 13h- dieser Aufruf liest einen Sektor von einem Plattengerät. Es ist erforderlich, Sektor 0 von einer Festplatte zu laden, um ein Betriebssystem (auch MS-DOS) zu starten.

Das BIOS kann mit Disketten- und IDE-Geräten sprechen, aber sonst nichts. Eine SCSI-Karte hätte ein optionales ROM, das neu geschrieben oder "angehängt" werden würde, 13hund das das Starten eines SCSI-Laufwerks ermöglichte. Wenn das Betriebssystem MS-DOS ist, kann MS-DOS mit dem SCSI-Laufwerk arbeiten, da es 13hfür Festplattenoperationen verwendet wird.

Netzwerkstart ist eine andere Situation, in der Option-ROMs verwendet werden.

Wenn ja, könnten die Treiber stattdessen dafür ausgelegt werden?

Ja, und sie tun es. BIOS-Options-ROMs unterstützen eigentlich nur das Booten eines Betriebssystems und optional eines Konfigurationsmenüs ("Drücke Strg-A, um die RAID-Konfiguration aufzurufen" befindet sich im Option-ROM und Sie sehen es an dem Punkt, an dem das BIOS seinen Initialisierungscode aufruft).

IIRC Linux kümmert sich erneut um die Aufzählung von Geräten und ignoriert die Informationen des x86-BIOS

Windows macht das auch. Das x86-BIOS (und der x86-Realmodus) hing so lange herum wie für die MS-DOS-Unterstützung.

Könnten Sie erläutern, was das Boot-ROM normalerweise tut? Ich gehe davon aus, dass es eine POST / Initialisierung des Geräts gibt, die vom ROM koordiniert oder ausgeführt wird, bevor das System weiter gestartet werden kann. Ist das korrekt? Wenn ja, könnten die Treiber stattdessen dafür ausgelegt werden? (zB: IIRC Linux kümmert sich um die Auflistung der _again_-Geräte und ignoriert die Informationen des x86-BIOS.) Attie vor 5 Jahren 0
Siehe meine Bearbeitungen und fügte viele Informationen hinzu. LawrenceC vor 5 Jahren 1
Wenn der Bootloader eines ARM-Computers ungeachtet des Vorhandenseins eines PCI-Options-ROMs direkt zum Linux-Kernel springt, besteht dann die Möglichkeit, dass der Kernel aufgrund von Imporper-Initialisierungssequenzen durchläuft? Mit anderen Worten, sind einige PCIe-Geräte von der Initialisierung über ein PCI-Options-ROM abhängig und würden ohne das Options-ROM nicht ordnungsgemäß funktionieren? Kong Chun Ho vor 5 Jahren 0
Es gibt wahrscheinlich einige seltsame Hardware, die das Boot-ROM vor dem Betriebssystem initialisieren muss (möglicherweise einige Chipsätze, die auf dem PCI-Bus erscheinen, aber nicht entfernbar sind). Da das PC-BIOS absichtlich OS-unabhängig war, sollte von einem Betriebssystem eigentlich immer erwartet werden, dass die HW-Initialisierung durchgeführt wird. Das wäre also komisch. Ausnahme wären wahrscheinlich Grafikkarten. LawrenceC vor 5 Jahren 1
1
Tonny

Die meisten PCIe-Geräte mit integrierter Firmware sind x86-spezifisch.
Die integrierte Firmware ist für die Zusammenarbeit mit einer Intel-kompatiblen Umgebung konzipiert.

Es gibt Geräte für andere Architekturen. Hauptsächlich GPU, Storage / Raid und Netzwerkkarten. Einige davon ermöglichen sogar das Flashen der Firmware, um von einer Architektur zur anderen zu wechseln. Andere sind Dual-Firmware und können bei Bedarf zwischen Architekturen wechseln.
Ich habe sogar einige RAID-Controller gesehen, die (beim Booten aus der UEFI-Umgebung) mit der entsprechenden Firmware für die Architektur, in der sie installiert wurden, geladen werden konnten.
Die meisten davon sind für Rechenzentren geeignet und sehr teuer. Nichts, was der durchschnittliche Benutzer jemals in der Wildnis antreffen wird.

Bei Geräten ohne integrierte Firmware (oder besser gesagt: Integrierte Firmware, die nicht mit dem Host-System interagiert) können sie in jeder Architektur arbeiten, für die Treiber vorhanden sind.