Von-Neumann-Architektur und maschinennahe Programme
Auf Ihrem Smartphone läuft eine Musik-App, und im selben Moment lädt der Rechner im Hintergrund ein Update herunter. Programm und Daten liegen dabei im selben Arbeitsspeicher. Wie kann ein Prozessor überhaupt „wissen“, ob ein Bitmuster ein Befehl oder eine Zahl ist? Und was folgt daraus für die Sicherheit? Diese Frage klären wir am Ende dieses Kapitels. Smartphone und Laptop sind Informatiksysteme: Sie bestehen aus Hardware, Software und Netzwerkkomponenten und lösen ein Anwenderproblem. Hier betrachten wir die Hardware-Grundlage, den Aufbau des Rechners.
Aufbau der Von-Neumann-Architektur
Fast jeder heutige Rechner folgt einem Bauplan, den John von Neumann 1945 beschrieben hat. Er besteht aus wenigen Funktionseinheiten, die über Leitungen (den Bus) verbunden sind.
-
Steuerwerk: holt Befehle, entschlüsselt sie und steuert den Ablauf. Es enthält den Befehlszähler (Adresse des nächsten Befehls) und das Befehlsregister (der gerade bearbeitete Befehl).
-
Rechenwerk (ALU): führt arithmetische und logische Operationen aus. Zwischenergebnisse liegen in Registern, in unserem Modell im Akkumulator ACC.
-
Speicher: nummerierte Zellen (Adressen), jede enthält ein Bitmuster.
-
Ein-/Ausgabewerk: Verbindung zur Außenwelt, z. B. Tastatur, Bildschirm, Sensoren.
Der Vorteil liegt in der Flexibilität: Ein neues Programm ist nur neuer Speicherinhalt, der Rechner muss nicht umgebaut werden. Der Nachteil: Der Prozessor kann Befehle und Daten nicht streng trennen (dazu mehr im letzten Abschnitt).
Nennen Sie die Hauptbestandteile der Von-Neumann-Architektur und beschreiben Sie in je einem Satz die Aufgabe von Rechenwerk, Steuerwerk, Speicher und Ein-/Ausgabewerk.
Nennen Sie die Hauptbestandteile der Von-Neumann-Architektur und beschreiben Sie in je einem Satz die Aufgabe von Rechenwerk, Steuerwerk, Speicher und Ein-/Ausgabewerk.
Erklären Sie das Prinzip des gemeinsamen Speichers für Daten und Programme in der Von-Neumann-Architektur. Nennen Sie einen Vorteil und einen Nachteil.
Erklären Sie das Prinzip des gemeinsamen Speichers für Daten und Programme in der Von-Neumann-Architektur. Nennen Sie einen Vorteil und einen Nachteil.
Befehlszyklus
Der Prozessor wiederholt immer denselben Ablauf, den Befehlszyklus:
-
Fetch (Holen): Der Befehl, auf dessen Adresse der Befehlszähler zeigt, wird aus dem Speicher ins Befehlsregister geladen. Der Befehlszähler wird um 1 erhöht.
-
Decode (Dekodieren): Das Steuerwerk erkennt Operation (z. B. ADD) und Operanden (z. B. Adresse 11).
-
Execute (Ausführen): Die Operation wird ausgeführt, z. B. Operand aus dem Speicher lesen, in der ALU verrechnen, Ergebnis in ACC schreiben.
Danach beginnt der Zyklus von vorn. Sprungbefehle überschreiben den Befehlszähler und verändern damit den Ablauf.
Erklären Sie anhand des Befehlszyklus (Fetch, Decode, Execute), wie der Befehl ADD 11 aus Aufgabe FACIL-03 abgearbeitet wird. Gehen Sie dabei auf Befehlszähler,…
Erklären Sie anhand des Befehlszyklus (Fetch, Decode, Execute), wie der Befehl ADD 11 aus Aufgabe FACIL-03 abgearbeitet wird. Gehen Sie dabei auf Befehlszähler, Befehlsregister und Akkumulator ein.
Eine einfache Registermaschine
Zur Beschreibung maschinennaher Programme verwenden wir ein Modell mit einem Akkumulator und diesen Befehlen (x: Speicheradresse, z: Programmzeile):
| Befehl | Wirkung |
|---|---|
| LOAD x | ACC ← Speicher[x] |
| ADD x | ACC ← ACC + Speicher[x] |
| SUB x | ACC ← ACC − Speicher[x] |
| STORE x | Speicher[x] ← ACC |
| JUMPZ z | springe zu Zeile z, falls ACC = 0 |
| JUMP z | springe immer zu Zeile z |
| HALT | Programmende |
Wichtig: STORE verändert den Akkumulator nicht. Ein nachfolgendes JUMPZ prüft also den zuletzt berechneten Wert.
Zum Nachvollziehen eines Programms legen Sie eine Ablaufprotokoll-Tabelle an: eine Zeile pro Schritt oder pro Schleifendurchlauf, eine Spalte für jede relevante Speicherzelle und ACC.
Addiert man in der Schleife nicht 1, sondern eine beliebige Zahl, und zählt dabei einen Zähler herunter, so berechnet das Programm ein Produkt (wiederholte Addition). Das Prinzip „Zähler herunterzählen, bei 0 beenden“ ist die Standardform einer Schleife in Maschinensprache.
Ein Rechner hat einen Akkumulator ACC und die Befehle LOAD x (ACC ← Speicher[x]), ADD x (ACC ← ACC + Speicher[x]), STORE x (Speicher[x] ← ACC). Es gilt Speicher[10] = 7…
Ein Rechner hat einen Akkumulator ACC und die Befehle LOAD x (ACC ← Speicher[x]), ADD x (ACC ← ACC + Speicher[x]), STORE x (Speicher[x] ← ACC). Es gilt Speicher[10] = 7 und Speicher[11] = 5.
Das Programm lautet: LOAD 10, ADD 11, STORE 12.
Geben Sie den Inhalt von ACC nach jedem Befehl und den Inhalt von Speicher[12] am Ende an.
Ein Registermaschinenmodell kennt die Befehle LOAD x, ADD x, SUB x, STORE x, JUMPZ z (springe zu Zeile z, falls ACC = 0), JUMP z, HALT. Zu Beginn gilt Speicher[20] = 3,…
Ein Registermaschinenmodell kennt die Befehle LOAD x, ADD x, SUB x, STORE x, JUMPZ z (springe zu Zeile z, falls ACC = 0), JUMP z, HALT. Zu Beginn gilt Speicher[20] = 3, Speicher[21] = 4, Speicher[22] = 0, Speicher[23] = 1.
Programm:
1: LOAD 22
2: ADD 21
3: STORE 22
4: LOAD 20
5: SUB 23
6: STORE 20
7: JUMPZ 9
8: JUMP 1
9: HALT
- a) Protokollieren Sie die Werte von Speicher[20] und Speicher[22] nach jedem Durchlauf der Schleife.
- b) Welche mathematische Operation berechnet das Programm?
Schreiben Sie ein Programm für die Registermaschine aus MEDIO-01 (mit Befehlen LOAD, ADD, SUB, STORE, JUMPZ, JUMP, HALT), das das Produkt von Speicher[30] und…
Schreiben Sie ein Programm für die Registermaschine aus MEDIO-01 (mit Befehlen LOAD, ADD, SUB, STORE, JUMPZ, JUMP, HALT), das das Produkt von Speicher[30] und Speicher[31] (beide nichtnegativ) in Speicher[32] ablegt. Speicher[33] enthält die Konstante 1. Erläutern Sie den Ablauf und testen Sie mit $4 \cdot 3$.
Befehle und Zahlen als Bitmuster
Im Speicher gibt es nur Bits. Ob 01000001 die Zahl 65, der Buchstabe „A“ oder ein Maschinenbefehl ist, hängt allein davon ab, wie das Bitmuster verwendet wird. Folgt der Befehlszähler der Adresse, wird der Inhalt als Befehl dekodiert. Liest ein LOAD die Zelle, wird er als Zahl behandelt.
Zahlen ohne Vorzeichen werden im Dualsystem gespeichert. Mit 8 Bit sind die Zahlen von 0 bis $2^8 - 1 = 255$ darstellbar.
Wird das Ergebnis größer als 255, passt es nicht mehr in 8 Bit. Das höchste Bit „fällt heraus“. Man spricht von Überlauf. Das gespeicherte Ergebnis ist dann der Rest bei Division durch 256.
Ein Mikrocontroller speichert die Zahl 200 als 8-Bit-Binärzahl ohne Vorzeichen. a) Geben Sie die Binärdarstellung an. b) Es wird 100 addiert. Berechnen Sie das Ergebnis…
Ein Mikrocontroller speichert die Zahl 200 als 8-Bit-Binärzahl ohne Vorzeichen.
- a) Geben Sie die Binärdarstellung an.
- b) Es wird 100 addiert. Berechnen Sie das Ergebnis im 8-Bit-Speicher und erklären Sie, was geschieht (Überlauf).
- c) Erklären Sie, warum Programmbefehle und Zahlen im Speicher beide als Bitmuster vorliegen.
Sicherheit und Grenzen der Architektur
Jetzt lässt sich der Gedanke vom Anfang auflösen: Der Prozessor erkennt nicht am Bitmuster selbst, ob es Befehl oder Datum ist. Er verhält sich nur nach dem Befehlszähler. Zeigt dieser durch einen Fehler auf eine Datenzelle, werden die Daten als Befehle ausgeführt.
Sicherheitsprobleme
Bei einem Pufferüberlauf schreibt ein Programm mehr Daten in einen Speicherbereich, als dieser fasst. Die überzähligen Daten überschreiben benachbarte Zellen, im schlimmsten Fall Rücksprungadressen oder Programmcode. Ein Angreifer kann so eigenen Code einschleusen und den Befehlszähler darauf lenken.
Gegenmaßnahmen sind zum Beispiel:
-
Längenprüfung beim Schreiben (Bounds-Checking),
-
Markierung von Speicherbereichen als „nicht ausführbar“ (NX-Bit, DEP),
-
zufällige Anordnung von Speicherbereichen (ASLR),
-
sichere Programmiersprachen mit Laufzeitprüfung.
Der Von-Neumann-Flaschenhals
Prozessor und Speicher sind über einen Bus verbunden. Befehle und Daten müssen nacheinander durch diese Leitung. Prozessoren sind viel schneller als der Hauptspeicher, sodass der Prozessor häufig auf Daten warten muss. Das ist der Von-Neumann-Flaschenhals.
Ein Cache ist ein kleiner, sehr schneller Zwischenspeicher direkt am Prozessor. Er hält Befehle und Daten bereit, die wahrscheinlich bald wieder gebraucht werden, z. B. die Schleifenbefehle eines Programms. Dadurch sinkt die Zahl der langsamen Zugriffe auf den Hauptspeicher.
Harvard-Architektur
Bei der Harvard-Architektur gibt es getrennte Speicher und Busse für Programm und Daten. Beides kann gleichzeitig gelesen werden, und Programmspeicher kann gegen Überschreiben geschützt sein. Viele Mikrocontroller sind so gebaut. Der Preis ist ein aufwendigerer Aufbau und geringere Flexibilität.
| Von-Neumann | Harvard | |
|---|---|---|
| Speicher | gemeinsam | getrennt |
| Zugriff auf Befehl und Datum | nacheinander | gleichzeitig möglich |
| Schutz des Programms | schwierig | einfacher |
| typischer Einsatz | PC, Laptop, Smartphone | Mikrocontroller, Signalprozessoren |
Zurück zum Anfang: Der Prozessor unterscheidet Befehl und Datum nur durch die Verwendung, nicht durch das Bitmuster. Das macht die Architektur flexibel, aber angreifbar.
Ein Programm läuft in einer Schleife und enthält durch einen Fehler einen Sprungbefehl, der auf eine Datenzelle statt auf einen Befehl zeigt. a) Erklären Sie, warum die…
Ein Programm läuft in einer Schleife und enthält durch einen Fehler einen Sprungbefehl, der auf eine Datenzelle statt auf einen Befehl zeigt.
- a) Erklären Sie, warum die Von-Neumann-Architektur dies nicht verhindern kann.
- b) Erläutern Sie, welche Sicherheitsprobleme sich daraus ergeben können (z. B. Pufferüberlauf).
- c) Nennen Sie eine Gegenmaßnahme.
Der Von-Neumann-Flaschenhals begrenzt die Leistung eines Rechners. a) Erklären Sie, was damit gemeint ist. b) Erläutern Sie, wie Cache-Speicher das Problem abmildern. c)…
Der Von-Neumann-Flaschenhals begrenzt die Leistung eines Rechners.
- a) Erklären Sie, was damit gemeint ist.
- b) Erläutern Sie, wie Cache-Speicher das Problem abmildern.
- c) Beurteilen Sie, ob ein Rechner mit getrenntem Programm- und Datenspeicher (Harvard-Architektur) für eine Waschmaschinensteuerung sinnvoll wäre.