![]() |
Rechner-PeripherieProf. Jürgen Plate |
Im Jahre 1944 legte John von Neumann, ein ehemaliges Mitglied des ENIAC-Projektes, ein Architektur-Konzept für einen speicherprogrammierten Universalrechner vor. Sein erster Entwurf ist heute als "von-Neumann-Maschine" oder "von-Neumann-Architektur" bekannt - ein weitsichtiges und visionäres Konzept, das auch noch aktuellen Computern zugrunde liegt. Eine Von-Neumann-Maschine weist folgende wichtige Merkmale auf:
Die Struktur des Rechners ist unabhängig von dem zu bearbeitenden Problem (
Universalrechner). Die verschiedenen Aufgaben werden durch entsprechende Programme gelöst.
Programme und von diesen benötigte Daten werden in einem gemeinsamen Speicher abgelegt.
Die Speicherplätze sind gleichlang und werden über Adressen einzeln angesprochen.

Die bedeutendste Neuerung war von Neumanns Idee, Programm und Daten zuerst in den Speicher zu laden und dann auszuführen. Bis dahin war das Programm noch hardwaremäßig verschaltet oder wurde über Lochstreifen schrittweise eingelesen und sofort (streng sequentiell) bearbeitet. Nun war es möglich:
Die von Neumann Architektur hat aber auch einige Nachteile:
Da Daten und Befehle im Speicher gehalten werden, wird die Verbindung und Datenübertragung zwischen CPU und Speicher bzw. zur Ein-/Ausgabe über den Systembus zum sogenannten Von-Neumann-Flaschenhals. Jeglicher Datenverkehr von und zur CPU wird über den internen Bus abgewickelt, dessen Transfergeschwindigkeit langsamer ist, als die Verarbeitungsgeschwindigkeit der CPU. Dieses Problem versucht man in modernen PC's durch die Verwendung von schnellem Cache-Speicher, der meist in der CPU integriert ist, abzuschwächen.
Die CPU besteht aus Recheneinheit (ALU) und Steuereinheit. Die ALU hat eine feste Wortbreite, z. B. 8, 16, 32 oder 64 Bit, ihre Aufgabe besteht in der Bearbeitung der Daten, besonders dem Ausführen von arithmetischen und logischen Operationen.
Zur wichtigsten Aufgabe der Steuereinheit gehört die Koordination der zeitlichen Abläufe im Rechner. Dazu muss die Steuereinheit die Befehle aus dem Speicher holen, entschlüsseln und deren Ausführung steuern. Die Steuereinheit besteht aus Befehlsregister, Befehlsdecoder, Speicheradressregister und Befehlszähler.
Der Speicher eines von-Neumann-Rechners besteht aus einer Vielzahl von Speicherworten, die wahlfrei adressiert werden können.
Innerhalb eines von-Neumann-Rechners erfolgt der Datentransport auf internen Datenwegen, den Bussen:
In einem modernen PC verkörpert der Prozessor die ALU und die Steuereinheit, die Northbridge mit dem RAM den Speicher. Die Southbridge und der Rest bilden die Ein-/Ausgabe. Zu letzterer gehören z. B. der PCI-Bus ebenso wie die verschiedenen Schnittstellen der Peripheriegeräte und Festplatten.
Zentraler Bestandteil des PCs ist das Mainboard (Hauptplatine, Motherboard). Auf ihm sind die CPU, Arbeitsspeicher (RAM), das BIOS-ROM (bzw. BIOS-Flash-EEPROM) sowie verschiedene Steckplätze und Schnittstellenbausteine zur Koppelung dieser Komponenten montiert, die in der Regel aus "Northbridge" und "Southbridge" bestehen (s. u.).
Die Standards der Bussysteme für Peripheriekomponenten haben sich seit Einführung des PCs um 1980 sehr verändert. Begonnen hat alles mit dem ISA-Bus, der im Prinzip die Busleitungen der CPU wiederspiegelte. Mit immer höheren Taktfrequenzen der CPU-Typen konnte dieser Bus bald nicht mehr muthalten und so bildetetn sich immer neue Standards:
Die Northbridge enthält in PC-Systemen unter anderem den Speichercontroller, der den Datentransfer zwischen CPU und Hauptspeicher verwaltet. Dieser ist über den Frontsidebus (FSB) an die CPU gekoppelt. Außerdem synchronisiert die Northbridge noch den Datentransfer und die Datensteuerung zwischen CPU und AGP- bzw. PCI-Express-Grafikkarte. In neueren Systemen ist der Speichercontroller nicht mehr Bestandteil der Northbridge, sondern direkt in den Prozessor integriert (z. B. Athlon64) was den Datentransfer zwischen CPU und Speicher zusätzlich beschleunigt. Die Northbridge ist über den PCI-Bus, über PCI-X (schnellere 64-Bit-Variante von PCI) oder eine andere Schnittstelle mit der Southbridge verbunden. Die Southbridge ist für den Datentransfer und die Steuerung der peripheren Geräte (PCI-Steckkarten, IDE-Laufwerke, USB, Maus, Tastatur etc.) zuständig. Außerdem sind oftmals Peripheriegeräte bereits in die Southbridge integriert, beispielsweise OnBoard-Soundlösungen und LAN-Schnittstellen.

Northbridge und Southbridge bilden zusammen den sogenannten Chipsatz des Mainboards. In moderneren Systemen kann die Southbridge sogar direkt in die Northbridge integriert sein. Die Bezeichnungen "Northbridge" und "Southbridge" resultieren aus der räumlichen Anordnung der jeweiligen Chips auf dem Mainboard. Dreht man die Platine so, dass der Prozessorsockel oben ist, liegt die Northbridge näher an der CPU, also "im Norden der Platine", während die Southbridge weiter "südlich" im unteren Teil der Platine zu finden ist.
"PCI" steht für "Peripheral Component Interconnect". Wie schon erwähnt, handelt es sich um
einen Bus zur Verbindung von Peripheriegeräten mit dem Chipsatz und dem Prozessor.
Der PCI-Bus ist Industriestandard und wurde von Intel im Jahr 1990 entwickelt, um ISA und EISA abzulösen.
Der ursprüngliche PCI-Bus übertrug 32 Bit pro Zyklus und lief mit 33 MHz. Die Bandbreite betrug
insgesamt 133 MByte/s. 1993 wurde PCI 2.0 eingeführt, und 1995 kam PCI 2.1 heraus. PCI 2.2
hat Eigenschaften, die ihn für mobile Computer geegnet machen (vorwiegend solche zur Leistungs-Einsparung
von Batteriestrom). Mittlerweile liegt PCI 2.3 vor. Der aktuelle PCI-Bus läuft mit bis zu
66 MHz und handhabt 64 Bit-Transfers.
Die PCI Spezial Interest Group (PCI-SIG) entwickelt seit 1998 den Standard PCI-X. Die Version 1.0 ist eng
mit der PCI-Variante verwandt, die in PCs eingesetzt wird. Vorwiegender Einsatz von PCI-X ist in einem
Dual-Prozessor-System. Die 64-Bit-Variante ermöglicht mit 133 MHz Taktfrequenz übertragungsraten von bis zu
1,06 GByte/s. PCI-X ist abwärtskompatibel zu PCI, wenn die verwendete Steckkarte mit 3,3 V Signalspannung
und 66 MHz arbeiten. Durch Kodierkerben im Kontaktkamm und Slot ist dafür gesorgt, das 5-V-Karten nicht
in den 3,3-V-Slot passen und umgekehrt. Die PCI-X-Version 2.0 verbessert die Effizienz auf dem PCI-Bus
und bringt eine ECC-Fehlerkorrektur für die übertragenen Daten mit.
PCI-Express (Peripheral Component Interconnect Express, PCIe) ist der Nachfolger von PCI und bietet eine höhere Datenübertragungsrate. Der 2004 eingeführte PCIe ist im Gegensatz zu PCI kein paralleler Bus, sondern eine serielle Punkt-zu-Punkt-Verbindung. Die PCI-Express-Spezifikation beschreibt das Software-Protokoll, elektrische und mechanische Eigenschaften der Steckverbinder und Erweiterungskarten. Wesentliche Eigenschaften sind:
Verwendet man nur eine Lane, spricht man von "PCIe x1". Durch die Koppelung mehrerer Lanes kann die Datenrate erhöht werden, beispielsweise "PCIE x2" mit zwei Lanes bis hin zu "PCI x32" mit 32 Lanes. Die PCI-SIG plant darüber hinaus zukünftige Versionen mit 500 und 1000 MByte/s pro Lane. Im Enduserbereich wird "PCIe x1" als Ersatz für den PCI-Bus und "PCIe x16" zur Anbindung einer Grafikkarte verwendet (PCI-Express For Graphics, PEG). Die Slots sind außerdem abwärts kompatibel, d. h. eine "PCI x4"-Karte kann z. B. auch in einen "PCI x8"-Slot gesteckt werden, die überzähligen vier Lanes werden dann nicht genutzt.
programmierter E/A-Transfer.
Direkt- Speicher-Zugriff (DMA = Direct Memory Access) ohne Ablauf
eigener Programme.
Adressierung
erforderlich. Für die Adressierung der E/A-Schnittstellen gibt
es zwei Möglichkeiten:
geringfügige Einschränkung
des Speicheradreßraums. Die E/A-Adressen werden von der CPU
genauso behandelt und angesprochen, wie Speicheradressen.
E/A-Operationen werden mit den normalen Transportbefehlen
durchgeführt (z. B. Load, Store)
Einsparung
zusätzlichen Aufwandes für Adreß-/Steuerleitungen
und für spezielle E/A-Befehle.
Warteschleife,
"Polling". Dabei können zwei "Randbereiche" Probleme verursachen:
es werden Ereignisse "übersehen".
Vorteil des programmierten Transfers: Sehr einfache Schnittstellen, die übersichtlich und leicht zu verwenden sind.
Nachteil des programmierten Transfers: Für den
Transfer jedes einzelnen Datenworts wird die CPU benötigt.
Diese muss dabei relativ viel Verwaltungsaufwand leisten
(Laden/lesen EASR, Interrupt-Behandlung)
die maximale
Datenrate ist sehr begrenzt.
Datentransport zwischen Speicher
und Peripherie unter Umgehung der CPU. Selbst, wen die CPU in
dieser Zeit nichts anderes tut, ist ein wesentlich schnellerer
Datentransport möglich (weitgehender Wegfall der
Verwaltungsarbeit). Daher ist DMA für den schnellen Transfer
großer Datenmengen besonders geeignet. Zum Anstoßen des
DMA-Transfers übermittelt die CPU der DMA-Schnittstelle:
Initialisierung der
Schnittstelle.
Ablauf eines DMA-Transfers:
Cycle Stealing.
Transfer eines ganzen Datenblocks.
keine
Beeinträchtigung der CPU.
Die Schnittstellen des PC (USB, serielle Schnittstelle, parallele Schnittstelle, Tastatur etc.) werden an anderer Stelle behandelt:
Wenn man den Begriff aufschlüsselt ergibt sich:
Eingebettete Systeme können in Einzelfällen auf ähnlicher Hardware wie Arbeitsplatzcomputer basieren (sogenannte embedded-PCs), in der Regel unterliegen sie jedoch stark einschränkenden Randbedingungen: Minimale Kosten, geringer Platz-, Energie-, Speicherverbrauch. Einzelne Komponenten wie Prozessor oder Arbeitsspeicher müssen auch wesentlich länger auf dem Markt verfügbar sein, um die langfristige Einsetzbarkeit und Ersatzteilbeschaffung zu gewährleisten. „Moderne“ eingebettete Systeme basieren auf den verschiedensten Prozessor-Plattformen, die in Bezug auf die Peripheriemodule hochintegriert sind und durch moderne Stromspartechniken wenig Energie verbrauchen.
"Embedded Systems" vereinigen daher durch ihre oftmals sehr hardwarenahe Konstruktion die große Flexibilität von Software mit der Leistungsfähigkeit der Hardware. Die Software-Entwicklung für diese Systeme unterscheidet sich oft grundsätzlich von jener für Desktop- oder PC-Systeme: oftmals werden Betriebssysteme eingesetzt, die zwar nicht über eine grafische Benutzeroberfläche verfügen, dafür jedoch Echtzeitanforderungen genügen.
Bevorzugte Programmiersprachen sind daher z. B. Assembler oder C. Bekannte Embedded-Betriebssysteme sind z.B. QNX, VxWorks, Windows CE, DOS, LynxOS, Nucleus, zunehmend auch spezielle Linux-Derivate, wenn die Echtzeitbedingungen keine dominante Rolle spielen. Einige Beispiele für Embedded Systems sind:
Man setzt deshalb für die Definition des eingebetteten Systems voraus, dass
Anders als stationäre Systeme haben eingebettete Systeme besondere Anforderungen hinsichtlich Robustheit, Energieverbrauch und Speicherbedarf, Im Gegensatz zu einem Arbeitsplatzrechner wird ein eingebettetes System im Allgemeinen nicht "heruntergefahren", bevor man es ausschaltet. Es muss im Gegenteil damit zurechtkommen, dass ihm der Strom jederzeit und ohne Vorwarnung abgestellt werden kann. Damit ein solcher Shutdown, etwa aufgrund eines Stromausfalls, problemlos überstanden wird und die Software nach dem Booten in einen definierten Anfangszustand gelangt.
Bewegliche Teile wie Lüfter oder Festplatte sind meist nicht erwünscht. Besonders sind auch meist die Umgebungsbedingungen wie Temperatur und Feuchtigkeit. Um auch diesen Anforderungen gerecht zu werden, steht eine möglichst geringe Stromaufnahme des Prozessors bzw. des Boards im Vordergrund. Im Vergleich zum "Stomfresser" im Desktop-Rechner kommt ein embedded Board meist mit weniger als 1 Watt aus. Embedded Systems laufen buchstäblich während ihrer gesamten Lebensdauer, also an sieben Tagen pro Woche und 24 Stunden pro Tag. Gelegentliche Abstürze mit der Notwendigkeit eines Neustarts sind hier absolut inakzeptabel (insofern fällt mein kürzlich erworbener DVB-T-Empfänger/Decoder aus dem Rahmen, bei schlechtem Empfang hängt er sich schon mal auf).
Embedded Systems basieren also oft auf ähnlicher Hardware wie Arbeitsplatzcomputer, unterliegen jedoch meist stark einschränkenden Randbedingungen: minimale Kosten und damit geringer Platz-, Energie-, Speicherverbrauch. Die Fertigung in großen Stückzahlen, oft im Millionen-Bereich, ist ein weiterer wichtiger Punkt zur Kostenreduzierung. Hinzu kommt, dass die einzelnen Komponenten wie Prozessor und RAM auf Weiterentwicklungen älterer Komponenten basieren, was die Langlebigkeit steigert, Stromverbrauch und -kosten jedoch senkt.
Für viele Anwendungen können auch ältere Komponenten eingesetzt werden, wenn zudem die Vereinfachung der Architektur des ursprünglichen Systems dazu beiträgt, weitere Kosten zu senken. Programme eines Embedded Systems müssen oft Echtzeitanforderungen genügen. In der Regel existieren verglichen mit Desktop-PC-Hardware nur stark reduzierte Ressourcen, zumeist ohne Festplatte, Betriebssystem, Tastatur oder Bildschirm. Ein ROM- oder Flash-Speicher ersetzt meist mechanische Speicherkomponenten wie eine Festplatte: bewegliche Teile bedeuten Verschleiß, der hier unerwünscht ist. Wenn überhaupt, dann gibt es meist nur ein Tastenfeld und die Ausgabe wird -- soweit überhaupt vorgesehen -- durch ein LCD realisiert.
Handelsübliche Festplatten sind nicht immer einsetzbar, wenn es sich um eine rauhe Industrieumgebung handelt. Schock-, Staub und Temperaturempfindlichkeit setzen ihnen Grenzen -- obwohl heutige Festplatten viel aushalten. Den Ausweg bieten sogenannte "Solid-State-Disks" auf der Basis von Flash-Speichern, Permanentspeicher ohne verschleißempfindliche Teile mit einer logischen oder physikalischen Festplatten-Schnittstelle. Leider vertragen Flash-Bausteine selten mehr als einige 10000 bis 100000 Schreibzyklen, so dass es sich nicht unbedingt empfiehlt, darauf Logdateien oder Swap-Partitionen anzulegen. Auch das Aktualisieren des Dateisystems (Eintragen des letzten Zugriffs auf eine Datei, usw.) muss abgeschaltet werden. Für variable Dateien bietet sich das Anlegen einer RAM-Disk an, deren Inhalt gegebenenfalls in größeren Zeitabständen auf das Flash-Dateisystem kopiert wird. Für Flash-Disks gibt es etliche Anbieter, im Bereich Embedded-Linux haben sich aus Kostengründen die Produkte von SanDisk (und den zahlreichen Second-Source-Lieferanten) durchgesetzt.
Hier gibt es eine schier unüberschaubare Produktpalette, beginnend beim 3,5-Zoll-Festplattenersatz bis hin zu CompactFlash-Karten und einzelnen Flash-Chips mit den dazugehörigen Mikrocontrollern (IDE und PCMCIA-Interfaces). Bei 2 MByte bis 2 GByte dürfte für jeden Zweck was dabei sein. Ein Zielsystem lässt sich also zunächst unter Verwendung einer gewöhnlichen Festplatte erstellen und bei der Serienproduktion durch eine Flash-Disk mit IDE-Schnittstelle ersetzen. Der Entwickler muss sich nicht um spezielle Treiber kümmern, das eingebettete System setzt aber einen unter Linux nutzbaren IDE-Controller voraus.
Um die Verbreitung von Linux als Embedded-Betriebssystem zu fördern, wurden 2001 in den USA das "Embedded Linux Consortium (ELC)" und in Japan die "Emblix Vereinigung" gegründet. Beide Institutionen verfügen dank ihrer zahlreichen Mitglieder über nicht unerhebliche Finanzmittel und wollen Linux durch gezielte Pressearbeit, Messeauftritte und Internet-Präsenz zum führenden Embedded-Betriebssystem entwickeln.
Wie klein muss ein Kernel sein? Bei eingebetteten System natürlich so klein wie möglich, aber bitte schön mit aller Funktionalität, die Linux bietet! Diese Forderung muss natürlich zu Kompromissen führen. Wer aber mit extrem knappen Ressourcen zu kämpfen hat, sollte sich überlegen, ob er nicht zu einem anderen, "dünneren" Betriebssystem greift.
Generell verwendet man bei Embedded-Projekten die jeweilige Portierung für die Plattform. Die spezifischen Eigenschaften werden durch die Konfiguration festgelegt, d. h. durch die Auswahl der Komponenten und Module.
Eine Besonderheit stellt hier uClinux dar. Hierbei handelt es sich um eine Linux-Portierung auf Systeme, die keine MMU (Memory Management Unit) haben, wie es bei Mikrocontrollern der Fall ist. Durch die fehlende MMU ergeben sich einige Einschränkungen für uClinux. Ohne MMU kann kein Speicherschutz implementiert werden, was bedeutet, dass Programme sich gegenseitig und sogar den Kernel zum Absturz bringen können. Es gibt natürlich keinen virtuellen Speicher und Paging. fork() ist nicht implementiert, sondern nur vfork(). Der Elternprozess wird bei vfork() blockiert, bis execve() oder exit() aufgerufen wird. Es wird auch keine Kopie des Speicherbereiches des Elternprozesses erstellt, da dazu virtueller Speicher nötig wäre. Trotzdem können Prozesse parallel laufen. Das Fehlen von virtuellem Speicher bedingt ein spezielles Binärformat, das "Flat Binary Format", das relozierbare Executables erlaubt, bei denen anhand einer Relozierungstabelle die Adressen an die Speicherposition angepasst werden können.
Der verwendete Prozessor entscheidet also darüber, welche Betriebssystem-Variante eingesetzt werden kann. Typische Varianten sind:

Beim Linux-Systemstart wird zuerst immer der Bootloader aktiviert, der in der Regel auf dem ersten Sektor des Bootmediums liegt (Master Boot Record, MBR). Als Bootloader kommen meist LILO oder GRUB zum Einsatz. Der Bootloader lädt den Kernel in den Arbeitsspeicher und startet ihn. Der Kernel entpackt sich zunächst selbst und erzeugt danach die RAM-Disk oder bindet die Festplatte ins System ein. Er sucht dabei auch nach einer VGA-Karte und, falls es diese nicht gibt, nach einer seriellen Schnittstelle, um dort seine Boot-Meldungen auszugeben. Nachdem das Dateisystem vollständig ist und alle Dateien im Verzeichnisbaum der RAM-Disk vorliegen, löst der Kernel den sogenannten Systeminit-Prozess aus, indem er ein Programm startet. Welches das ist, kann in den Bootoptionen festgelegt werden, z. B. init=myinitprog. Ist nichts anderes angegeben, wird nacheinander eines der Programme /sbin/init, /etc/init, /bin/init oder /bin/sh gesucht und, falls gefunden, gestartet. In der Regel wird dies also /sbin/init sein. Dieses Programm aktiviert unter Umständen weitere Programme gemäß dem Inhalt der Konfigurationsdatei /etc/inittab. Will man ohne Platte booten, wird es schwieriger.
Der Init-Prozess seinerseits startet die systemnahen Dienste (Deamons), beispielsweise für Login oder Netzwerkdienste. In /etc/inittab sind auch verschiedene Runlevel vorgesehen, die festlegen, welche Dienste gestartet werden.