Ein Blick zurück: ISA

Der ISA-Bus hat ein ziemlich veraltetes Design und eine notorisch schlechte Performance, deckt aber immer noch einen bedeutenden Teil des Marktes für Erweiterungskarten ab. Wenn es auf die Geschwindigkeit nicht so ankommt und Sie alte Hauptplatinen unterstützen wollen, dann ist eine ISA-Implementation einer PCI-Implementation vorzuziehen. Ein weiterer Vorteil: Wenn Sie Hobby-Elektroniker sind, dann können Sie sich leicht eigene Geräte bauen, etwas, was mit PCI definitiv nicht möglich ist.

Ein großer Nachteil von ISA ist dagegen die enge Bindung an die PC-Architektur. Der Bus hat alle Einschränkungen des 80286-Prozessors und verursacht Systemprogrammierern endlose Schmerzen. Das zweite große Problem des ISA-Designs (das vom ursprünglichen IBM PC ererbt wurde) ist das Fehlen von geographischer Adressierung, was zu endlosen Problemen und langwierigen Ausstöpseln-Jumper-umstecken-Einstöpseln-Testen-Zyklen beim Einbau neuer Geräte geführt hat. Interessanterweise benutzten selbst die ältesten Apple II-Computer eine geographische Adressierung und verfügten über Jumper-lose Erweiterungskarten.

Trotz seiner großen Nachteile wird ISA immer noch an mehreren unerwarteten Stellen verwendet. Beispielsweise enthält die VR41xx-Serie von MIPS-Prozessoren, die in mehreren Palmtops verwendet wird, merkwürdigerweise einen ISA-kompatiblen Erweiterungs-Bus. Der Grund dafür sind die extrem niedrigen Kosten mancher alter Hardware wie 8390-basierter Ethernet-Karten, weswegen eine CPU mit elektrischen ISA-Signalen leicht die furchtbaren, aber billigen PC-Geräte verwenden kann.

Hardware-Ressourcen

Ein ISA-Gerät kann über I/O-Ports, Speicherbereiche und Interrupt-Leitungen verfügen.

Auch wenn die x86-Prozessoren 64 KByte an I/O-Port-Speicher unterstützen (d. h., der Prozessor verwendet 16 Adreßleitungen), decodiert manche alte PC-Hardware nur die unteren zehn Leitungen. Das begrenzt den verwendbaren Adreßraum auf 1024 Ports, weil jede Adresse im Bereich von 1 KByte bis 64 KByte für eine niedrige Adresse eines Gerätes gehalten wird, das nur die unteren Adreßleitungen decodiert. Manche Peripherie-Geräte umgehen dies, indem sie nur einen Port in das untere Kilobyte abbilden und die hohen Adreßleitungen benutzen, um zwischen den verschiedenen Geräteregistern auszuwählen. Beispielsweise kann ein an 0x340 abgebildetes Gerät auch sicher 0x740, 0xB40 usw. verwenden.

Kann man die Anzahl der zur Verfügung stehenden I/O-Ports schon als beschränkt betrachten, ist es beim Speicherzugriff noch schlechter. Ein ISA-Gerät kann nur den Speicherbereich zwischen 640 KByte und 1 MByte und den zwischen 15 MByte und 16 MByte verwenden. Der Bereich von 64 KByte bis 1 MByte wird vom PC-BIOS, von VGA-kompatiblen Grafikkarten und verschiedenen anderen Geräten benutzt, was nur wenig Platz für andere Geräte läßt. Der Speicher ab 15 MByte wird dagegen von Linux nicht direkt unterstützt, und das Aufbohren des Kernels, um dies zu unterstützen, ist heutzutage Zeitverschwendung.

Die dritte zur Verfügung stehende Ressource von ISA-Karten sind die Interrupt-Leitungen. Es gibt nur eine begrenzte Anzahl von Interrupt-Leitungen, die auf den ISA-Bus geleitet werden, und diese werden auch noch von allen Karten gemeinsam genutzt. Das kann dazu führen, daß falsch konfigurierte Geräte auf einmal die gleichen Interrupt-Leitungen verwenden.

Obwohl die ursprüngliche ISA-Spezifikation das gemeinsame Nutzen von Interrupts über Gerätegrenzen hinweg nicht erlaubt, ist das doch mit den meisten Geräten möglich.[1] Das gemeinsame Nutzen von Interrupts auf der Ebene der Software wurde in “the Section called Gemeinsames Nutzen von Interrupts in Kapitel 9” in Kapitel 9 beschrieben.

ISA-Programmierung

Was die Programmierung angeht, gibt es im Kernel oder im BIOS keine direkten Hilfen, die die Verwendung von ISA-Geräten einfacher machen (wie etwa bei PCI) — einmal abgesehen davon, daß Sie die Register für I/O-Ports und IRQ-Leitungen verwenden können, die in “the Section called Ressourcen verwenden in Kapitel 2” (Kapitel 2) und in “the Section called Einen Interrupt-Handler installieren in Kapitel 9” (Kapitel 9) beschrieben wurden.

Die im ersten Teil des Buches gezeigten Programmiertechniken gelten alle für ISA-Geräte; der Treiber kann nach I/O-Ports suchen, und die Interrupt-Leitung muß mit einer der in “the Section called Automatische Erkennung der IRQ-Nummer in Kapitel 9” in Kapitel 9 gezeigten Techniken automatisch ermittelt werden.

Die Hilfsfunktion isa_readb und mit ihr verwandte Funktionen sind in “the Section called I/O-Speicher verwenden in Kapitel 8” in Kapitel 8 kurz eingeführt worden; mehr gibt es dazu auch nicht zu sagen.

Die “Plug-and-Play”-Spezifikation

Einige neuere ISA-Karten folgen merkwürdigen Entwurfsregeln und erfordern eine besondere Initialisierungssequenz, die dazu gedacht ist, die Installation und Konfiguration von zusätzlichen Karten zu vereinfachen. Die Spezifikation dafür wird Plug-and-Play (PnP) genannt und besteht aus einer unpraktischen Menge an Regeln zum Entwerfen und Konfigurieren Jumper-loser ISA-Geräte. PnP-Geräte implementieren relozierbare I/O-Regionen, und das PC-BIOS ist für die Relozierung zuständig — ähnlich wie bei PCI.

Das Ziel von PnP ist es also, die gleiche Flexibilität wie bei PCI-Geräten zu erreichen, ohne die zugrundeliegende elektrische Schnittstelle (den ISA-Bus) zu verändern. Zu diesem Zweck definiert die Spezifikation eine Reihe von geräteunabhängigen Konfigurationsregistern und eine Möglichkeit, die Karten geografisch zu adressieren, auch wenn der physikalische Bus selbst keine Leitungen pro Karte (also geographische Leitungen) hat — jede ISA-Signalleitung ist mit jedem verfügbaren Slot verbunden.

Die geograpische Adressierung läuft so ab, daß zunächst jedem Peripherie-Gerät im Computer eine kleine ganze Zahl, die Card Select Number (CSN) zugewiesen wird. Jedes PnP-Gerät hat eine eindeutige 64 Bit breite Seriennummer, die in der Karte hart codiert ist. Bei der CSN-Zuweisung wird diese eindeutige Seriennummer verwendet, um die PnP-Geräte zu identifizieren. Diese Zuweisung funktioniert aber nur beim Hochfahren des Rechners sicher, weswegen das BIOS PnP-fähig sein muß. Daher können alte Rechner PnP nur mit einer spezifischen Konfigurationsdiskette unterstützen, selbst wenn das Gerät PnP-fähig ist.

Die Karten, die der PnP-Spezifikation folgen, sind auf der Hardware-Seite sehr komplex, insbesondere komplexer als PCI-Karten, und benötigen auch komplexe Software. Schwierigkeiten bei der Installation dieser Geräte sind nicht unüblich, und selbst, wenn die Installation glatt läuft, gibt es immer noch die Performance-Beschränkungen und den begrenzten I/O-Raum auf dem ISA-Bus. Unserer Meinung nach ist es viel besser, wo immer möglich PCI-Geräte zu verwenden und die neue Technologie zu genießen.

Wenn Sie sich für die PnP-Konfigurationssoftware interessieren, dann können Sie einen Blick in drivers/net/3c509.c werfen, wo die Funktion zum Suchen der PnP-Geräte unterstützt wird. In Linux 2.1.33 wurde auch im Verzeichnis drivers/pnp einiges an Unterstützung für PnP eingebaut.

Fußnoten

[1]

Das Problem beim gemeinsamen Nutzen von Interrupts hat seine Ursache hauptsächlich in der Elektrotechnik. Wenn ein Gerät die Signalleitung auf inaktiv legt, indem es eine Spannung niedriger Impedanz anlegt, dann kann dieser Interrupt nicht gemeinsam benutzt werden. Wenn dagegen das Gerät einen Pull-Up-Widerstand für den inaktiven logischen Zustand verwendet, dann ist eine gemeinsame Nutzung möglich. Die meisten Karten verwenden den zweiten Ansatz. Es kann aber immer noch passieren, daß Interrupts verlorengehen, weil ISA-Interrupts an den Flanken und nicht auf den Ebenen ausgelöst werden. An den Flanken ausgelöste Interrupts sind in der Hardware einfacher zu implementieren, sind aber nicht für sicheres gemeinsames Nutzen geeignet.