Die Maschine
Wie funktioniert ein Prozessor? Von Logikgattern bis zur CPU
Eine CPU ist keine Magie, und im Prinzip nicht einmal kompliziert. Sie ist ein Zähler, der auf eine Liste von Zahlen zeigt, ein Decoder, der jede Zahl in Schalterstellungen übersetzt, und ein Addierer mit ein paar Freunden. Diese Seite setzt die Teile zusammen – Takt für Takt.
Die Teileliste
Fast jeder Prozessor, vom Intel 4004 von 1971 bis zum Chip in deinem Handy, besteht aus denselben paar Blöcken:
- Der Speicher enthält das Programm und seine Daten als nummerierte Wörter. (Manche Designs trennen beides in zwei Speicher. Mehr dazu unten.)
- Der Befehlszähler (englisch Program Counter, PC) ist ein Register mit der Adresse des nächsten Befehls. Normalerweise zählt er einfach mit jedem Schritt um einen Befehl weiter.
- Befehlsregister und Decoder bilden das Steuerwerk: Sie halten den aktuellen Befehl und übersetzen seine Bits in Steuersignale – welches Register gelesen wird, was die ALU tun soll, ob in den Speicher geschrieben wird.
- Die Register sind ein paar schnelle Speicherplätze für die Werte, mit denen gerade gearbeitet wird. Sie bestehen aus Flipflops.
- Das Rechenwerk (ALU), die arithmetisch-logische Einheit, ist ein Block kombinatorischer Logik, der addiert, subtrahiert, vergleicht, UND und ODER bildet und schiebt. Welche Operation es ausführt, wählen ein paar Steuerbits. Sein Kern ist ein Addierer.
- Flags sind einzelne Bits, die Fakten über das letzte Ergebnis festhalten – Null, negativ, Übertrag (Carry), Überlauf (Overflow) –, damit spätere Befehle davon abhängig springen können.
Der Befehlszyklus: Fetch, Decode, Execute
Eine CPU wiederholt drei Schritte, solange sie Strom hat:
- Holen (Fetch). Das Wort an der Adresse im PC ins Befehlsregister lesen und den PC auf den nächsten Befehl weiterstellen.
- Dekodieren (Decode). Den Befehl in Felder zerlegen. Meist sagt ein Opcode, was zu tun ist, und Operandenfelder sagen, womit. Der Decoder macht aus diesen Bits Steuersignale.
- Ausführen (Execute). Die Steuersignale schalten den Datenpfad. Werte fließen aus Registern oder Speicher durch die ALU, und das Ergebnis wird zurückgeschrieben. Ein Sprungbefehl erledigt seine Arbeit, indem er einen neuen Wert in den PC lädt – der nächste Fetch kommt dann von woanders.
Mehr ist es nicht. Schleifen, Funktionsaufrufe, Betriebssysteme und Spiele bestehen alle aus diesem Zyklus, der Milliarden Mal pro Sekunde läuft. Stell dir einen Spielzeugcomputer vor: ein einziges Register (den Akkumulator), 16 Bytes Speicher und acht Befehle mit 4-Bit-Opcode und 4-Bit-Adresse. Schon damit lässt sich in einer Schleife 5 + 4 + 3 + 2 + 1 ausrechnen: Befehl holen, dekodieren, ausführen, PC weiter – immer wieder, bis der Zähler bei null ist.
Programme sind auch nur Zahlen
Ein Befehl wie ADD 15 wird auf so einer Maschine als das Byte 0010 1111 gespeichert: Opcode 2, Adresse 15. Der Speicher weiß nicht, ob ein Wort ein Befehl oder eine Zahl ist. Es kommt nur darauf an, wie die CPU es benutzt. Das ist die Idee des speicherprogrammierten Rechners, zum ersten Mal 1948 auf dem Manchester Baby ausgeführt. Sie macht Computer universell: Um zu ändern, was die Maschine tut, änderst du Zahlen im Speicher, nicht Drähte.
Diese Zahlen von Hand zu schreiben wird schnell öde, also schreiben Programmierer Assembler-Code (ADD 15), und ein Programm namens Assembler übersetzt ihn in Maschinencode. Welche Befehle es gibt und wie sie kodiert sind, legt der Befehlssatz der Maschine fest (englisch Instruction Set Architecture, ISA), der Vertrag zwischen Hardware und Software. Mehr dazu unter Einen eigenen Befehlssatz entwerfen.
Eintakt, Mehrtakt, Pipeline
Eine CPU, die jeder Phase einen eigenen Takt gönnt, nennt man Mehrtakt-Design (multi-cycle). Eine Eintakt-CPU (single-cycle) erledigt alle drei Phasen in einem langen Takt – einfach, aber langsam, weil die Taktperiode für den langsamsten Befehl reichen muss. Echte Prozessoren arbeiten mit Pipelining: Während ein Befehl ausgeführt wird, wird der nächste schon dekodiert und der übernächste geholt, wie am Fließband. Pipelining bringt eigene Rätsel mit, die Hazards. Was, wenn ein Befehl ein Ergebnis braucht, das noch nicht geschrieben ist? Was soll nach einem Sprung geholt werden, dessen Ausgang noch unklar ist? Forwarding, Stalls und Sprungvorhersage sind die Antworten, und moderne CPUs gehen mit Out-of-Order-Ausführung und mehreren parallelen Pipelines noch weiter.
Von-Neumann und Harvard
Eine Von-Neumann-Architektur hält Befehle und Daten in einem Speicher und erreicht ihn über einen Weg. Das ist flexibel – ein Programm kann sogar ein anderes Programm laden –, aber Befehle holen und Daten lesen konkurrieren um diesen einen Weg. Eine Harvard-Architektur hat getrennte Befehls- und Datenspeicher und kann beides gleichzeitig. Viele Mikrocontroller sind Harvard-Maschinen. Die meisten großen CPUs sind beim Hauptspeicher Von-Neumann, trennen aber nah am Kern Befehls- und Daten-Cache – und bekommen so etwas von beidem.
Wie viele Gatter hat eine CPU?
Weniger, als du denkst – jedenfalls eine einfache. Eine kleine 8-Bit-CPU lässt sich aus ein paar Tausend NAND-Äquivalenten bauen, und der 6502 im Apple II hatte rund 3.500 Transistoren. Ein moderner Desktop-Prozessor hat zig Milliarden Transistoren. Die Ideen sind dieselben, nur wiederholt, verbreitert und beschleunigt: größere Register, mehr davon, Caches, viele Pipelines und viele Kerne.