HTL Steyr - 2AHK- 01/02
Maschineningenieurwesen - Fahrzeugtechnik


AINF - Facharbeit
zurück

PCI-Bus

 

3.2. Arbeitsweise

Der PCI-Bus kennt zwei Arten von Bus Devices, Initiator und Target. Der Initiator initiiert einen Zugriff, indem er die Kontrolle über die Steuersignale übernimmt und
die Adressen generiert, sowie Beginn und Länge einer Bus Transaktion bestimmt. Das Target aktiviert beim Erkennen seiner Adresse auf dem Bus ein
Rückmeldesignal für den Initiator des Zugriffs. Das Target kann die Verfügbarkeit von Daten oder Lesebereitschaft, aber auch die Bitte um Erzeugung von
Wait-States signalisieren. Mit diesen beiden Einheiten können alle Transfers und Zugriffe abgewickelt werden, was weitere Devices überflüssig macht.

Die PCI-Bus Targets sind die Slaves des PCI-Bus. Sie selbst sind nicht in der Lage Zugriffe oder Transfers zu initiieren und sind deshalb darauf angewiesen, daß die
Zugriffe durch einen Bus-Master oder die Host-CPU durchgeführt werden. Das PCI-Bus-Interface des Targets ist wie bei jedem anderen PCI-Device ein ASIC,
das die PCI-Bus-Zyklen beherrscht und sinnvollerweise Burst-Modi unterstützen sollte. Optional kann auch ein Transfer Buffer implementiert werden, der einen
Transfer von Daten von und zum Bus und I/O-Device mit geringer Latenz und ohne die Notwendigkeit zur Erzeugung von Wait-States ermöglicht. Die Daten sollten
ohne eingreifen der CPU geschrieben und gelesen werden können, deswegen kann ein Slave mit einer eigenen CPU ausgerüstet sein. Hat ein Slave von der
peripheren Einheit Daten empfangen, so kann er diesen Umstand der CPU oder einem Bus Master per Interrupt melden, die die Daten dann abholen können.

PCI-Bus-Initiators, die dem Master entsprechen, können im Unterschied dazu über alle Ressourcen des Systems verfügen, also auch auf alle PCI-Devices zugreifen.
Sie können eigenständig und unabhängig von der Host-CPU Zyklen initiieren und Zugriffe und Transfers durchführen. Solch ein Zugriff wird initiiert, indem der
Initiator die Kontrolle über die Steuersignale übernimmt und die Adressen generiert sowie Beginn und Länge einer Bus Transaktion bestimmt. Weiterhin betreibt er
ein Handshake mit dem Target, wodurch die Anzahl der Wartezustände definiert wird.

Beide Device-Arten sind in der Lage Burst-Transfers zu bedienen, aber nur der Initiator ist in der Lage sie zu initiieren. Burst-Übertragung bedeutet, daß nicht jeder
Datenblock (z.B. 1 DWord, also 32 Bit) mit seiner dazugehörigen Adresse angefordert werden muß, sondern nur die Adresse des ersten Datenblocks und die Daten
danach einfach der Reihe nach übertragen werden. Dies funktioniert natürlich nur, wenn im Speicher aufeinanderfolgende Daten abgerufen werden, was in der Praxis
relativ häufig vorkommt. Folgen die benötigten Daten im Speicher nicht aufeinander, muß allerdings weiterhin jedes DWord mit seiner entsprechenden Adresse
angefordert werden. Der Burst beim PCI-Bus ist praktisch unbegrenzt, was nur hier der Fall ist. Als Vergleich, beim VL-Bus ist er auf 4 DWords begrenzt.

Im Prinzip kann beim PCI-Bus jede Karte ein Master sein. Eine Arbitrierungslogik entscheidet welcher Master als nächstes an der Reihe ist, wenn mehrere Master
Anspruch auf den Bus erheben. Die Arbitration selbst erfolgt im Hintergrund (overlapped Arbitration) mit Hilfe slotspezifischer Steuerleitungen. Ein
Watch-Dog-Timer überwacht, daß ein Master den Bus nicht zu lange belegt. Wird die zugestandene Zeit überschritten und ein anderer Master will Daten übertragen,
entzieht der Watch-Dog dem ersten den Bus. Dadurch wird verhindert, daß abgestürzte Devices den beanspruchten Bus nicht wieder freigeben (Deadlocks).

Neben den Initialisierungs- und Arbitrierungszyklen gibt es nur noch einen weiteren Grundzyklus für Datentransfers. Über Frame- und Stoping-Leitung einigen sich
Initiator und Target darüber, ob ein Burst- (Auto incremental Burst Mode) oder ein Non-Burst-Zyklus gewünscht wird. Im Non-Burst-Transfer benötigt ein Read 3
und ein Write 2 Takte pro DWord, womit sich bei 33 MHz Bustakt eine Transferrate von 44 MByte/s beim Read und 66 MByte/s beim Write ergibt. Im
Burst-Mode werden normalerweise größere Blöcke (ab 4 DWords) übertragen. Beim Read ist dies ein 3-1-1-1-...-Burst (105 MByte/s) und beim Write ein
2-1-1-1-...-Burst (117 MByte/s). Da die Burstlänge nur durch den Adressbereich begrenzt wird, ist ein maximaler Wert von theoretisch 266 MByte/s möglich.

Um die Anwenderfreundlichkeit des Busses zu erhöhen, unterstützt PCI die automatische Konfiguration von Devices (plug and play). Das PCI-BIOS auf dem
Motherboard erkennt beim Booten jede der eingestellten Karten und konfiguriert sie automatisch. Sollten zwischen zwei PCI-Karten unlösbare Konflikte auftreten,
so wird eine der Karten einfach abgeschalten. Dies geschieht aber sehr selten, da das BIOS in der Lage ist, die von den verschiedenen Karten benutzten Ressourcen,
wie Port- und Memoryadressen sowie DMA-Kanäle, selbständig zu ändern. Belegen z.B. zwei Karten den gleichen I/O-Port, so wird die Adresse einer der Karten
vom BIOS gewechselt. Anders verhält es sich bei den Interrupts (IRQ). Freie IRQ's sind im PC eh Mangelware, besonders aber seit immer mehr Netzwerk-,
Sound-, Fax- oder sonstige Erweiterungskarten die Computer bis auf den letzten Steckplatz füllen. Da ist es oft nicht leicht, noch einen freien IRQ für die neue
Erweiterungskarte zu finden. Der PCI-Bus kennt zwei Möglichkeiten dies zu umgehen. Erstens können gemäß Spezifikation alle IRQ's mehrfach benutzt werden
(Interrupt-Sharing). Zweitens lassen sich die Interruptleitungen der PCI-Karten durch Jumper- oder BIOS-Einstellungen auf jeden freien Interrupteingang des
Interruptcontrollers schalten. Die PCI-Spezifikation sieht vor, daß für jeden PCI-Slot vier Interrupts zur Verfügung stehen (A, B, C und D). Davon wird
normalerweise nur der Interrupt A genutzt. Dieser Interrupt wird nun für jeden PCI-Slot einzeln auf einen PC-Interrupt gelegt. Zum Beispiel A von Slot 1 auf IRQ 5,
A von Slot 2 auf IRQ 3 und A von Slot 3 auf IRQ 7. Desweiteren schlägt die PCI-Spezifikation vor, daß die Interrupts B, C und D nur von Karten, die mehr als
einen Interrupt benötigen, benutzt werden. In der Praxis sah es aber am Anfang (erste Hälfte 1994) noch ganz anders aus. Bei damals erhältlichen Boards lag
entweder nur einer der Interrupts am Slot an, oder es standen alle vier Interrupts zur Verfügung, aber sie ließen sich nicht von Slot zu Slot unabhängig belegen. Dies
drohte eine der wichtigsten Stärken von PCI zu zerstören, die exakte Spezifikation. Ein weiteres schwerwiegendes Problem stellten einige BIOS-Versionen dar, die
nur die PCI-Karten erkannten, die zu der Zeit existierten. Glücklicherweise residierte bei allen PCI-Boards das BIOS in einem sogenannten Flash-Memory
(Flash-ROM). Das bedeutet, daß man jederzeit ein neues BIOS von Diskette auf das Board überspielen kann. Hat das BIOS herausgefunden, welche Ressourcen
von der PCI-Karte benötigt werden, steht ein 256 Byte großer Konfigurationsbereich zur Verfügung, um diese Parameter zu speichern.

Da PCI nicht nur auf die Prozessoren der INTEL-Architektur beschränkt ist, können verschiedene Karten-BIOS-Versionen, z.B. für Alpha- oder Power-PC,
gleichzeitig verwaltet werden. Je nach CPU wählt das BIOS einen der drei möglichen Einsprungspunkte des Karten-BIOS aus. Diese Fähigkeit ist besonders
wichtig, da sowohl APPLE (Power-PC) als auch DEC (Alpha) PCI unterstützen. Somit können alle Kartenhersteller ein einheitliches ROM für alle drei Plattformen
anbieten.
 

Quelle: http://wwwbs.informatik.htw-dresden.de/svortrag/ai94/Krauss/pci2.htm

 


© 2002 by Gerhard Madlmayr g_madlmayr@gmx.at