Hallo,
Die Sache mit dem Routing ist ein klein wenig komplexer. Zuerst muss mal zwischen 2 Abschnitten auf dem Weg von der CPU bis zur betreffenden Hardware-Komponente unterschieden werden:
- 1. von der CPU bis zum richtigen PCI-Root-Complex (an dem die betreffende Komponente hängt, es kann in einem Computer durchaus mehrere PCI-Root-Complexe geben)
- 2. vom Root-Complex bis zum eigentlichen PCI-Device
Der erste Abschnitt ist sehr plattformspezifisch und nicht durch die PCI-Spezifikation abgedeckt. Der zweite Abschnitt wird durch die PCI-Bridges geregelt (die übernehmen innerhalb des PCI-Systems das Routing) und natürlich durch die PCI-Spezifikation klar definiert.
Der zweite Wegabschnitt beginnt damit das der Zugriff an den betreffenden PCI-Root-Complex übergeben wird, der PCI-Root-Complex selber tritt aus PCI-Sicht nicht als Bridge in Erscheinung und hat demzufolge keine eigenen Routing-Config-Register sondern er nimmt den Zugriff und leitet ihn an seinen einen PCI-BUS weiter (beim klassischen PCI können da dran mehrere Devices und Bridges hängen und beim PCI-Express ist es immer nur ein Device also entweder eine PCI-Bridge zum Weiterverzweigen oder ein Device als End-Punkt). Diesen Zugriff des Root-Complex muss genau ein Device/Bridge entgegennehmen. Das bedeutet das wenn das eigentliche Device hinter einer der Bridges liegt dann muss die betreffende Bridge das auch wissen wozu deren Routing-Config-Register zu benutzen sind, das sind die Register 0x01C bis 0x033 im Header-Typ 0x01
http://www.lowlevel.eu/wiki/PCI#Header_Type_0x01 (von Secondary Status mal abgesehen). Wenn man eine Device-Ressource an eine neue Adresse platzieren möchte dann muss das in den Routing-Informationen
aller davor befindlicher PCI-Bridges berücksichtigt werden. Da eine PCI-Bridge pro Ressourcen-Typ immer nur ein Routing-Register-Paar (Base + Limit) hat müssen alle dahinter liegenden Ressourcen in einem zusammenhängenden Adressbereich liegen. Deswegen kann man die Ressourcenzuweisung immer erst dann durchführen nachdem man den gesamten PCI-Baum komplett durchsucht hat und den Ressourcenbedarf aller PCI-Devices genau kennt. Diese Vorgänge sind nicht ganz trivial aber in der PCI-Spezifikation recht gut beschrieben.
Der erste Wegabschnitt ist anders aber doch recht ähnlich. Er dürfte über spezielle Routing-Register im Chip-Satz und den CPUs geregelt werden. Für das Hyper-Transport-Netzwerk der AMD-CPUs sind diese Routing-Mechanismen wimre recht gut dokumentiert, ich denke diese Informationen findet man auch für die Intel-Plattformen. Es bleibt aber dabei dass das sehr spezifisch ist und es extrem schwer sein dürfte dafür generische Treiber für ein OS zu bauen, diese Dinge sind im BIOS/Firmware IMHO ganz gut aufgehoben.
Das entscheidende ist aber das Ihr Euch von der BUS-Philosophie verabschieden müsst. In modernen Computern werden Zugriffe über geswitchte Netzwerke transportiert. Hypertransport und QPI (und auch PCI-Express) haben mehr mit Ethernet gemein als mit dem klassischen ISA-BUS!
Ich hoffe ich konnte etwas Klarheit bringen, wenn nicht dann ruhig noch mal nachfragen.
Grüße
Erik