|
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
|