Systemarchitektur
Transcrição
Systemarchitektur
Systemarchitektur-Skript Dilyana Dimova Mario Mancino 26. Juli 2004 Inhaltsverzeichnis 1 2 Einführung 1.1 Literaturhinweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Definition: Rechnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Bool’sche Algebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 ∼: {0, 1} −→ {0, 1} . . . . . . . . . . . . . . . . . . . . . . . . . . n 1.3.2 ∧, ∨, ⊕ : {0, 1} −→ {0, 1} . . . . . . . . . . . . . . . . . . . . . . 1.4 Definition: Bool’sche Ausdrücke (vollständig geklammert) . . . . . . . 1.5 Exkurs: Mengen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 Exkurs: Induktionsbeweis . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 Rechnen mit bool’schen Algebren . . . . . . . . . . . . . . . . . . . . . . 1.7.1 Definition: Einsetzung . . . . . . . . . . . . . . . . . . . . . . . . 1.7.2 Definition: ϕ(e) für e ∈ BA . . . . . . . . . . . . . . . . . . . . . 1.7.3 Definition: Identität (Allgemeingültige Rechenregel) . . . . . . 1.7.4 Satz: Kommutativität . . . . . . . . . . . . . . . . . . . . . . . . . 1.8 Exkurs: Funktionen(6=Funktionssymbole) . . . . . . . . . . . . . . . . . 1.8.1 Definition: Relation . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8.2 Definition: Funktion . . . . . . . . . . . . . . . . . . . . . . . . . 1.9 Erweiterung zu 1.7.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.10 Konventionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.10.1 Abkürzungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.11 Definition: elementarer bool’scher Ausdruck . . . . . . . . . . . . . . . 1.12 Satz: Darstellungssatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.12.1 Beweis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.12.2 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13 Lösen einer Gleichung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13.1 Beispiel 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13.2 Beispiel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13.3 Beweis: e1 ∧ . . . ∧ en = 1 ⇔ e1 = 1 ∧ . . . ∧ en = 1 . . . . . . . . . 1.13.4 Beweis: e1 ∨ . . . ∨ en = 1 ⇔ e1 = 1 ∨ . . . ∨ en = 1 . . . . . . . . . 1.14 Zusammenhang zwischen Identitäten und Lösungen von Gleichungen 1.15 Spezielle bool’sche Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . 1.15.1 Definition: Literal, Monom, Polynom . . . . . . . . . . . . . . . 1.15.2 Bemerkung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.15.3 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.16 Vollständig disjunktive Normalform . . . . . . . . . . . . . . . . . . . . 1.16.1 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.17 Kosten der Darstellungssätze . . . . . . . . . . . . . . . . . . . . . . . . 1.17.1 Hilfssätze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.17.2 Kosten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.18 Teure Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.18.1 Beweis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.18.2 Offene Fragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 1 2 2 2 2 3 3 3 4 4 4 5 5 5 5 5 6 6 6 7 7 7 7 7 8 8 8 8 9 9 9 10 10 10 10 11 11 Schaltpläne und Schaltkreise 2.1 Gatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Beispiel-Gatter . . . . . . . . . . . . . . . . . . . 2.1.2 Einsetzung an den Eingängen angelegter Werte 2.1.3 Schwierigkeiten von Zyklen . . . . . . . . . . . . 2.1.4 Definition: Pfad . . . . . . . . . . . . . . . . . . . 2.2 Definition: Schaltkreis . . . . . . . . . . . . . . . . . . . 2.2.1 Hoffnung/Satz . . . . . . . . . . . . . . . . . . . 2.2.2 Beweis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 13 13 14 14 14 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 15 15 15 15 17 18 18 19 20 20 Zahlendarstellung, Addieren (für ganze Zahlen) 3.1 Binärdarstellung . . . . . . . . . . . . . . . . . . . 3.1.1 Beispiel . . . . . . . . . . . . . . . . . . . . 3.1.2 Größe der Summe . . . . . . . . . . . . . 3.2 Satz: Eindeutigkeit der Binärdarstellung . . . . . 3.3 Definition: n-bit-Addierer . . . . . . . . . . . . . 3.4 1-bit Addierer / Volladdierer / Full Adder (FA) 3.4.1 Funktionstabelle . . . . . . . . . . . . . . 3.5 Peano Axiome . . . . . . . . . . . . . . . . . . . . 3.6 Zerlegung von Zahlendarstellungen . . . . . . . 3.7 Additionsalgorithmus . . . . . . . . . . . . . . . 3.7.1 Beweis: Induktion über i . . . . . . . . . . 3.8 Carry-Chain-Adder . . . . . . . . . . . . . . . . . 3.9 Definition: Multiplexer (Mux) . . . . . . . . . . . 3.9.1 1-bit Multiplexer Schaltkreis . . . . . . . 3.9.2 n-Mux . . . . . . . . . . . . . . . . . . . . 3.10 Conditional Carry Adder . . . . . . . . . . . . . 3.11 Exkurs: Modulo . . . . . . . . . . . . . . . . . . . 3.12 Subtraktion . . . . . . . . . . . . . . . . . . . . . 3.12.1 Beispiel . . . . . . . . . . . . . . . . . . . . 3.13 Two’s Complement Zahlen . . . . . . . . . . . . 3.13.1 Beispiel . . . . . . . . . . . . . . . . . . . . 3.14 Beweis: Subtraktion . . . . . . . . . . . . . . . . . 3.14.1 Lemma 1 . . . . . . . . . . . . . . . . . . . 3.14.2 Lemma 2 . . . . . . . . . . . . . . . . . . . 3.14.3 Lemma 3 . . . . . . . . . . . . . . . . . . . 3.14.4 Lemma 4 . . . . . . . . . . . . . . . . . . . 3.14.5 Lemma 5 . . . . . . . . . . . . . . . . . . . 3.14.6 Beweis der Subtraktion . . . . . . . . . . 3.15 Definition: n-bit-twoc-Addierer . . . . . . . . . . 3.16 Definition: Arithmetic Unit (AU) . . . . . . . . . 3.16.1 Erweiterung der Notation . . . . . . . . . 3.17 n-bit-twoc AU (auch für Binärzahlen) . . . . . . 3.17.1 Satz: Overflow . . . . . . . . . . . . . . . 3.17.2 Satz: Negation . . . . . . . . . . . . . . . . 3.18 Definition: Arithmetic Logic Unit (ALU) . . . . . 3.18.1 Steuerbit-Tabelle . . . . . . . . . . . . . . 3.18.2 Schaltkreis . . . . . . . . . . . . . . . . . . 3.18.3 akt: Overflow aktivieren/ignorieren . . . 3.18.4 xcc: Fixed Point Condition Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 21 21 22 22 22 23 23 23 24 25 25 26 27 27 28 28 29 29 29 30 30 30 30 30 31 31 32 32 32 32 33 34 35 35 35 36 36 37 37 2.3 2.4 2.5 3 2.2.3 Beispiel . . . . . . . . . . . . . . . . 2.2.4 Hilfssatz . . . . . . . . . . . . . . . Satz: Darstellungssatz (Schaltkreise) . . . 2.3.1 Definitionen . . . . . . . . . . . . . 2.3.2 Beweis . . . . . . . . . . . . . . . . Polynome als Schaltkreise . . . . . . . . . Flache ∧ / ∨ Bäume . . . . . . . . . . . . . 2.5.1 Definition: Schaltkreise ∧-n . . . . 2.5.2 n keine Zweierpotenz . . . . . . . 2.5.3 Neue Berechnung von Polynomen 2.5.4 PLA: Programmed Logic Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 Prozessorbau 4.1 Mathematische Maschinen . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Speicherelemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Register (n-Bit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Random Access Memory (RAM) . . . . . . . . . . . . . . . . . . 4.3 Instruktionssatz des DLX0 -Prozessors . . . . . . . . . . . . . . . . . . . 4.3.1 Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2 Rechnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.3 3 Instruktionsformate . . . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Definition: Signed Extension . . . . . . . . . . . . . . . . . . . . 4.3.5 GP R[05 ] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.6 Instruktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.7 Zusammenfassung: Instruktionen . . . . . . . . . . . . . . . . . 4.4 Hardware-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Unterteilung der Instruktionen in Stufen . . . . . . . . . . . . . 4.5 Beweis der Gleichheit zwischen DLX0 - und Hardware-Konfiguration 4.5.1 c0 comp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.2 adcomp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.3 aluoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.4 mw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.5 ci .m = hi .m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.6 GP R.w . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.7 P Cinc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.8 Spezifikation: n-Inc . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.9 nextP C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 38 39 39 40 41 41 41 42 43 43 43 45 45 46 47 48 49 50 50 51 51 52 52 53 Compiler für C0 (PASCAL mit C-Syntax) 5.1 Kontextfreie Grammatiken . . . . . . . . . . . . . . . . 5.1.1 Beispiel: Kontextfreie Grammatik . . . . . . . 5.1.2 Definition: Kontextfreie Grammatik . . . . . . 5.1.3 Arbeitsweise von Grammatiken . . . . . . . . 5.1.4 Weitere Definitionen . . . . . . . . . . . . . . . 5.1.5 Problem: Alternativer Ableitungsbaum . . . . 5.1.6 Definition: Eindeutigkeit von Grammatiken . 5.1.7 Satz: Grammatik G ist eindeutig . . . . . . . . 5.2 Aufbohren der Grammatik . . . . . . . . . . . . . . . . 5.2.1 Bool’sche Ausdrücke . . . . . . . . . . . . . . . 5.2.2 Komplexe Datentypen . . . . . . . . . . . . . . 5.2.3 Anweisungen . . . . . . . . . . . . . . . . . . . 5.2.4 Programm . . . . . . . . . . . . . . . . . . . . . 5.2.5 Deklarationen . . . . . . . . . . . . . . . . . . . 5.3 Semantik von C0 . . . . . . . . . . . . . . . . . . . . . 5.4 Deklarations-Teil . . . . . . . . . . . . . . . . . . . . . 5.4.1 Typen-Definition . . . . . . . . . . . . . . . . . 5.4.2 Variablen-Deklaration . . . . . . . . . . . . . . 5.4.3 Funktions-Deklaration . . . . . . . . . . . . . . 5.4.4 Speicher der C0 -Maschine . . . . . . . . . . . . 5.5 Zusammenfassung der Grammatik . . . . . . . . . . . 5.6 Ausdrucksauswertung . . . . . . . . . . . . . . . . . . 5.6.1 Definition: Bindungsfunktion(c, N a → (m, i)) 5.6.2 Auswertung . . . . . . . . . . . . . . . . . . . . 5.7 Ausführung von Anweisungen . . . . . . . . . . . . . 5.8 Compilieren . . . . . . . . . . . . . . . . . . . . . . . . 5.8.1 Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 55 55 56 57 57 58 58 58 58 58 59 59 59 60 60 60 63 66 67 68 69 69 70 71 72 72 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 75 78 78 80 80 81 83 88 89 90 90 91 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 95 95 95 95 96 97 97 98 98 98 98 98 99 99 100 101 102 102 103 103 104 104 105 106 106 Betriebssystem-Kern 7.1 CVM: Syntax und Semantik . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Exkurs: Syntax von k . . . . . . . . . . . . . . . . . . . . . . . 7.1.2 Semantik von cp . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.3 Semantik von Interrupts . . . . . . . . . . . . . . . . . . . . . 7.1.4 Formalismus zum Spefizieren der Handler von Kernel Calls 7.2 CVM mit I/O-Devices . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 Wiederholung: Interrupts . . . . . . . . . . . . . . . . . . . . 7.2.2 return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.3 Kernel Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.4 „User-Functions“ . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.5 Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Definition: C0A (C0 mit Assembler-Code) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 107 108 109 109 110 111 111 112 112 114 115 116 5.9 6 7 5.8.2 Übersetzen der Bäume . . . . . . . . . . . . . . . . . . . Codierung von C0 -Konfigurationen in DLX0 -Konfigurationen 5.9.1 Definition: Compiler - Korrektheit . . . . . . . . . . . . 5.9.2 Definition: abase . . . . . . . . . . . . . . . . . . . . . . 5.9.3 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9.4 Exkurs: Aho-Ullmann-Algorithmus . . . . . . . . . . . 5.9.5 Satz: Ahu-Ullmann . . . . . . . . . . . . . . . . . . . . . 5.9.6 g-Ausdrucksübersetzung . . . . . . . . . . . . . . . . . 5.9.7 r-Konsistenz . . . . . . . . . . . . . . . . . . . . . . . . . 5.9.8 c-Konsistenz . . . . . . . . . . . . . . . . . . . . . . . . . 5.9.9 Satz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9.10 Pre-Order-Traversal . . . . . . . . . . . . . . . . . . . . 5.9.11 Code-Generierung . . . . . . . . . . . . . . . . . . . . . Erweiterungen zur DLX0 6.1 DLX0 mit Interrupts . . . . . . . . . . . . . . . . . 6.1.1 Definition: Interrupt . . . . . . . . . . . . . 6.1.2 Grober Ablauf . . . . . . . . . . . . . . . . . 6.1.3 Klassifikation . . . . . . . . . . . . . . . . . 6.1.4 Interrupts des DLX0 . . . . . . . . . . . . . 6.1.5 Konfiguration / Register . . . . . . . . . . . 6.1.6 Definition: δ für DLX0 mit Interrupts . . . 6.1.7 Neue Instruktionen . . . . . . . . . . . . . . 6.1.8 Interrupts . . . . . . . . . . . . . . . . . . . 6.1.9 Definition: nicht sichtbar . . . . . . . . . . . 6.1.10 Definition: JISR-Signal (Jump ISR) . . . . . 6.1.11 Definition: Interrupt Level . . . . . . . . . . 6.1.12 Delta-Funktion . . . . . . . . . . . . . . . . 6.1.13 Aufbau der ISR . . . . . . . . . . . . . . . . 6.1.14 Devices & I/O (Geräte & E/A) . . . . . . . 6.1.15 Beispiel: Hard Disk (HD) . . . . . . . . . . 6.2 Virtueller Speicher(VM) . . . . . . . . . . . . . . . 6.2.1 Motivation . . . . . . . . . . . . . . . . . . . 6.2.2 Vergleich zweier Maschinen . . . . . . . . . 6.2.3 DLX0 mit Interrupts & Adress Translation 6.2.4 Page Table Lookup . . . . . . . . . . . . . . 6.2.5 Page Fault Exception . . . . . . . . . . . . . 6.2.6 Instruktionsausführung . . . . . . . . . . . 6.2.7 Simulation . . . . . . . . . . . . . . . . . . . 6.2.8 Theorem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4 Konkreter Kern K . . . . . . . . . . . . . . . . . . 7.4.1 Semantik . . . . . . . . . . . . . . . . . . . 7.4.2 Restriktionen an asm(s) . . . . . . . . . . 7.4.3 Datenstrukturen des konkreten Kerns K 7.5 Simulationssatz . . . . . . . . . . . . . . . . . . . 7.5.1 Definition: konsis(cc, kbase, c) . . . . . . 7.5.2 Definition: e − konsis(c, kbase, cc) . . . . 7.5.3 Definition: p − konsis(c, kbase, cc) . . . 7.5.4 Definition: c − konsis(c, cc) . . . . . . . . 7.6 Korrekturen . . . . . . . . . . . . . . . . . . . . . 7.6.1 Notation: body(. . . , . . .) . . . . . . . . . . . 7.7 body(main, k) . . . . . . . . . . . . . . . . . . . . 7.8 body(main, K) . . . . . . . . . . . . . . . . . . . 7.9 Definition: c − consis(c, cc) . . . . . . . . . . . . 7.10 Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 117 118 119 121 121 121 122 122 123 123 124 124 124 125 1 EINFÜHRUNG 1 1 Einführung 1.1 Literaturhinweise • S.M. Müller, W.J. Paul: Computer Architecture (Springer 2000) • J. Keller, W.J. Paul: Hardware Design (vergriffen) • G.Even: Skript 1.2 Definition: Rechnen Rechnen: Beispiel: Definition: Ziel: Kalkül: Variablen: (Hoffentlich sinnvolle) Manipulation von Zeichenreihen Hardware n Schaltfunktion f : {0, 1} −→ {0, 1} Bauen von Boxen, die Schaltfunktionen berechnen Bool’sche Algebra V = {x0 , x1 , x2 , . . .} 1.3 Bool’sche Algebra 1.3.1 ∼: {0, 1} −→ {0, 1} x 0 1 1.3.2 ∼x 1 0 n ∧, ∨, ⊕ : {0, 1} −→ {0, 1} x0 0 0 1 1 x1 0 1 0 1 x0 ∧ x1 0 0 0 1 x0 ∨ x1 0 1 1 1 x0 ⊕ x1 0 1 1 0 1 EINFÜHRUNG 1.4 2 Definition: Bool’sche Ausdrücke (vollständig geklammert) 1. B0 = V ∪ {0, 1} 2. e1 , e2 ∈ Bi ⇒ e1 , e2 ∈ Bi+1 (∼ e1 ) ∈ Bi+1 e1 ∧ e2 ∈ Bi+1 e1 ∨ e2 ∈ Bi+1 e1 ⊕ e2 ∈ Bi+1 ( sonst nichts in Bi+1 ) 3. BA = Beispiel: S∞ i=0 Bi (x1 ∧ ((∼ x2 ) ∨ x3 )) ∈ BA Beweis: x1 , x2 , x3 ∈ V ⊆ B0 , B1 , B3 , . . . (∼ x2 ) ∈ B1 , B2 , . . . ((∼ x2 ) ∨ x3 ) ∈ B2 , . . . (x1 ∧ ((∼ x2 ) ∨ x3 )) ∈ B3 , . . . ⊆ BA 1.5 Exkurs: Mengen M: Menge, n ∈ N Mn = {(a1 , . . . , an ) |ai ∈ M } Beispiel: M = {0, 1} M1 = {(0), (1)} M2 = {(0, 0), (0, 1), (1, 0), (1, 1)} M3 = {(0, 0, 0), (0, 0, 1), . . .} 1.6 Exkurs: Induktionsbeweis A(n): Aussage 1. Zeige A(1) 2. Zeige A(n) → A(n+1) 3. Schliesse: A(n) für alle n ∈ N 1.7 Rechnen mit bool’schen Algebren Beispiel: x1 ∧ x2 = x2 ∧ x1 ((x1 ∧ x2 ) ∧ x3 ) = (x1 ∧ (x2 ∧ x3 )) 1 EINFÜHRUNG 1.7.1 3 Definition: Einsetzung ϕ : V → {0, 1} Intuition: setze für xi Werte ϕ(xi ) ein. Beispiel: x1 x2 x3 1.7.2 ϕ 0 1 0 Definition: ϕ(e) für e ∈ BA ϕ(0) = 0 ϕ(1) = 1 ϕ(e1 ∧ e2 ) = ϕ(e1 ) ∧ ϕ(e2 ) ϕ(e1 ∨ e2 ) = ϕ(e1 ) ∨ ϕ(e2 ) ϕ(e1 ⊕ e2 ) = ϕ(e1 ) ⊕ ϕ(e2 ) ϕ(∼ e) =∼ ϕ(e) Beispiel: e = (x1 ∧ ((∼ x2 ) ∨ x3 )) ϕ(x1 ) = 0 ϕ(x2 ) = 1 ϕ(x3 ) = 0 Einsetzung: ϕ(∼ x2 ) = ∼ ϕ(x2 ) = ∼1 = 0 ϕ((∼ x2 ) ∨ x3 ) ϕ(e) = ϕ(∼ x2 ) ∨ ϕ(x3 ) = 0∨0 = 0 = ϕ(x1 ) ∧ ϕ((∼ x2 ) ∨ x3 ) = 0∧0 = 0 1.7.3 Definition: Identität (Allgemeingültige Rechenregel) e1 , e2 ∈ BA: e1 ≡ e2 ⇔ ϕ(e1 ) = ϕ(e2 ) f ür alle ϕ 1 EINFÜHRUNG 1.7.4 4 Satz: Kommutativität x1 ∧ x2 = x2 ∧ x1 x1 ∨ x2 = x2 ∨ x1 x1 ⊕ x2 = x2 ⊕ x1 Beweis: trivial durch Ausprobieren aller Fälle. Rechenregeln: (x1 ∧ x2 ) ∧ x3 = x1 ∧ (x2 ∧ x3 ) x1 ∧ (x2 ∨ x3 ) = (x1 ∧ x2 ) ∨ (x1 ∧ x3 ) 1.8 Exkurs: Funktionen(6=Funktionssymbole) Seien X,Y Mengen, dann gilt: X × Y = {(x, y)|x ∈ X, y ∈ Y } Beispiel: {0, 1}2 {0, 1}3 {0, 1}3 {0, 1} × {0, 1}2 1.8.1 = {0, 1} × {0, 1} 6 = {0, 1} × {0, 1}2 = {(0, 0, 0), (0, 0, 1), . . .} = {(0, (0, 0)), (0, (0, 1)), . . .} Definition: Relation R ⊂ X × Y : Relation z.B.: X = Y = R, R = {(x, y)|x ≥ y} R Abbildung 1: Relation 1 EINFÜHRUNG 1.8.2 5 Definition: Funktion Die Funktion ist eine spezielle (Rechtseindeutige) Relation: (x, y1 ) ∈ R (x, y2 ) ∈ R ⇒ y1 = y2 Der Funktion liegt eine Funktionstabelle zugrunde, fi ist nur ein Name dafür. 1.9 Erweiterung zu 1.7.2 ϕ(f (e1 , . . . , es )) =Def f (ϕ(e1 ), . . . , ϕ(es ))) 1.10 Konventionen Um Schreibarbeit zu sparen, vereinbart man: ∼ bindet stärker als ∧ ∧ bindet stärker als ∨ 1.10.1 Abkürzungen ē ist Abkürzung für (∼ e) /e ist Abkürzung für (∼ e) xi xj ist Abkürzung für xi ∧ xj = ist Abkürzung für ≡ x[n : 1] ist Abkürzung für (xn , . . . , x1 ) 1.11 Definition: elementarer bool’scher Ausdruck Ein elementarer bool’scher Ausdruck, in dem ∧, ∨, ∼ verwendet werden. ElBA = {e ∈ BA|e elementar} = alte Def inition 1 EINFÜHRUNG 1.12 6 Satz: Darstellungssatz ∀ f : {0, 1}n → {0, 1} ∃ e elem. B.A. mit : e ≡ f (x1 , . . . , xn ) 1.12.1 Beweis Beweis per Induktion über n: n=0: f : {0, 1}0 → {0, 1} | {z } φ ⊆ φ × {0, 1} Konvention: 0,1:{0, 1}0 → {0, 1} n=1: Funktionstabelle: x1 0 1 e f1 0 0 0 f2 1 1 1 f3 1 0 x1 f4 0 1 x1 n →n+1: f (x1 , . . . , xn+1 ) = xn+1 ∧ f (x1 , . . . , xn , 1) ∨ xn+1 ∧ f (x1 , . . . , xn , 0) 1.12.2 Beispiel x1 0 0 x2 0 0 x3 0 1 f (x3 , x2 , x1 ) 0 1 f (0, x2 , x1 ) 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 z }| { e0 = x2 x1 ∨ x2 x1 f (1, x2 , x1 ) 1 1 1 1 1 1 0 1 1 0 1 0 z }| { e0 = x2 ∧ 1 ∨ x2 x1 f (0, 0, x1 ) 0 1 z}|{ x1 f (0, 1, x1 ) 1 0 z}|{ x1 f (1, 0, x1 ) 1 1 z}|{ 1 f (1, 1, x1 ) 1 0 z}|{ x1 1 EINFÜHRUNG 1.13 7 Lösen einer Gleichung Einsetzung mit ϕ(e) = ϕ(e′ ) heißt Lösen der Gleichung. 1.13.1 Beispiel 1 Sei e ein elementarer bool’scher Ausdruck. e=1 Lösung: Einsetzen von ϕ mit: ϕ(e) = ϕ(1) = 1 ϕ(e) =∼ ϕ(e) = 1 ⇔ ϕ(e) = 0 d.h. ⇔ ϕ Lösung von e = 1 ϕ Lösung von e = 0 Dies wird abgekürzt als e = 1 ⇔ e = 0 1.13.2 Beispiel 2 Seien e, e’ elementare bool’sche Ausdrücke. e ∧ e’ = 1 Sei ϕ Lösung: ϕ(e ∧ e′ ) = ϕ(1) = 1 ϕ(e) ∧ ϕ(e′ ) ⇔ ϕ(e) = 1 ∧ ϕ(e′ ) = 1 ⇔ und 1.13.3 ϕ Lösung von e=1 ϕ Lösung von e’=1 Beweis: e1 ∧ . . . ∧ en = 1 ⇔ e1 = 1 ∧ . . . ∧ en = 1 Induktion über n: n=2: e1 = e e2 = e′ (eben in 1.13.1 und 1.13.2 gemacht) n→n+1: e1 ∧ . . . ∧ en−1 ∧ en = 1 ⇔ e1 ∧ . . . ∧ en−1 = 1 und en = 1 | {z } |{z} {z } | e 1.13.4 e′ ⇔e1 =1∧...∧en−1 =1 Beweis: e1 ∨ . . . ∨ en = 1 ⇔ e1 = 1 ∨ . . . ∨ en = 1 Der Beweis läuft analog zu 1.13.3. 1 EINFÜHRUNG 1.14 8 Zusammenhang zwischen Identitäten und Lösungen von Gleichungen Seien e, e’ elementare bool’sche Ausdrücke. z Lösung von e=1, e′ =1 ∀ϕ : ⇔ | }| { ϕ Lösung von e = 1 ϕ Lösung von e′ = 1 ϕ(e) = 1 ϕ(e) = 0 ⇔ ⇔ {z ϕ(e′ ) = 1 ϕ(e′ ) = 0 e≡e′ Um e ≡ e’ zu zeigen, genügt es zu zeigen: Gleichung e=1 und e’=1 haben gleiche Lösungen - Kurz: e=1 ⇔ e’=1 e ≡ e’ e=1 ⇔ e’=1 1.15 Spezielle bool’sche Ausdrücke 1.15.1 Definition: Literal, Monom, Polynom ⇔ Seien x1 , x2 , . . . , xn Variablen. Ausdruck L heißt Literal: ⇔ L = xi für ein xi Ausdruck M heißt M onom: ⇔ M = L1 ∧ . . . ∧ Ls für ein s und Literale Li . . . Ls Ausdruck P heißt P olynom: ⇔ P = M1 ∨ . . . ∨ Lt für ein t und Monome Mi . . . Ms 1.15.2 Bemerkung Gleichungen L=1 M =1 P =1 können wir lösen. Notation: ǫ ∈ {0, 1} ½ xi : ǫ = 1 xǫi = xi : ǫ = 0 xǫi = 1 ⇔ xi = ǫ } 1 EINFÜHRUNG 1.15.3 9 Beispiel Sei a = a[n : 1] ∈ {0, 1}n , a 7→ M (a) =Def. xann ∧ . . . ∧ xa1 1 | {z } (M onom) n=3, a=101: M (a) = = x13 ∧ x02 ∧ x11 x3 x2 x1 M (a) = 1 ⇔ xai i = 1 f ür alle i ⇔ xi = ai f ür alle i ⇔ x[n : 1] = a[n : 1] M (a) = 1 ⇔ x = a 1.16 Vollständig disjunktive Normalform Sei f : {0, 1}n → {0, 1} T (f ) = {a ∈ {0, 1}n |f (a) = 1} | {z } (T räger von f ) _ T (f ) 7→ P (f ) = | M (a) (P olynom) a∈T (f ) {z } (V ollständig disjunktive N ormalf orm von f ) P (f ) = 1 ⇔ es gibt a ∈ T (f ) : M (a) = 1 ⇔ es gibt a ∈ T (f ) : x = a ⇔ x ∈ T (f ) ⇒ P (f ) ≡ f (Neuer Beweis des Darstellungssatzes) 1.16.1 Beispiel x3 0 0 0 0 1 1 1 1 T(f)={ 000 ↓ M(000) = x3 x2 x1 , 011 ↓ M(011) = x3 x2 x1 , 100 ↓ M(100) = x3 x2 x1 x2 0 0 1 1 0 0 1 1 , x1 0 1 0 1 0 1 0 1 101 ↓ M(101) = x3 x2 x1 f (x) 1 0 0 1 1 1 0 1 , 111 ↓ M(111) = x3 x2 x1 } ≡ f (x3 , x2 , x1 ) 1 EINFÜHRUNG 1.17 10 Kosten der Darstellungssätze C(e) = Anzahl Vorkommen von ∧, ∨, ∼ in e (Kosten) G(e) = größte auftretende Kosten für ein f : {0, 1}n → {0, 1} 1.17.1 Hilfssätze #M = Anzahl der Elemente in M (Mächtigkeit von M) #(M × N ) = #M · #N #(M N ) = (#M )N ⇒ #{0, 1}n = (#{o, 1}n = 2n 1.17.2 Kosten W 1. f (x) ≡ a∈T m(a) vollständige disjunktive Normalform, Kosten: G(f ) ≤ 2n · 2n 2. f (x[n : 1]) = xn · f (1, x[n − 1 : 1]) ∨ xn · f (0, x[n − 1 : 1]) Differenzengleichung: G(1) G(n) = = 1 4 + 2 · · · G(n-1) geraten (k=n-1): G(n) = 2k · · · G(n − k) + 2k+1 + 2k + . . . + 4 = 2n−1 · · · G(1) + 2n + 2n−1 + . . . + 4 + (+2 + 1 −3) | {z } 2n+1 −1 = = 1.18 n+1 n−1 2 +2 −4 n−1 5...2 −4 Teure Funktionen Gibt es f : {0, 1}n → {0, 1} für das gilt: Jedes e, das f berechnet ist teuer? Ja: • Jedes e berechnet eine Funktion • Die Menge der billigen Ausdrücke ist klein ⇒ {f |∃: e billig und e berechnet f } ist klein, {f : [0, 1]n → {0, 1}} ist groß 1 EINFÜHRUNG 1.18.1 11 Beweis Sei e ein elementarer bool’scher Ausdruck. A = {x1 , . . . , xn , (, ), ∧, ∨, ∼, , 0, 1} #A = n + 8 22 n = #{f |f : {0, 1}n → {0, 1}} ≤ #{e|G(e) ≤ k} #(A5k (n + 8)5k = = k : ∀f : {0, 1}n → {0, 1} ∃e : e ≡ f (x) G(e) ≤ k k≥ 1.18.2 Offene Fragen • Wie sehen f aus, für die jedes e teuer ist? ⊕ erlauben? A = {x1 , . . . , xn , (, ), ∧, ∨, ∼, , 0, 1, ⊕} #A = n + 9 2n k≥ 5 · log(n + 9) • Bool’sches Polynom p: Hat die Gleichung p=0 eine Lösung? Gibt es ein schnelles Rechenverfahren? P = NP? 2n 5 · log(n + 8) 2 SCHALTPLÄNE UND SCHALTKREISE 12 2 Schaltpläne und Schaltkreise 2.1 Gatter Eingänge: Gatter: Ausgänge: x1 x2 Box zur Berechnung von Schaltfunktionen y1 . . . yn (Kabel, Leitungen) , . Å ~ ,-Gatter . -Gatter Å-Gatter Inverter Abbildung 2: Gatter-Symbole 2.1.1 Beispiel-Gatter x1 x2 A B C D Abbildung 3: Schaltkreis - XOR Gatter x1 0 0 1 1 x2 0 1 0 1 A 1 0 1 0 B 1 1 0 0 C 0 0 1 0 G ≡ x1 ⊕ x2 D 0 1 0 0 E 0 1 1 0 2 SCHALTPLÄNE UND SCHALTKREISE 2.1.2 13 Einsetzung an den Eingängen angelegter Werte ϕ : {x1 , . . . , xn } → {0, 1} Z’, Z”: Eingänge des Gatters in Schaltung S Z: Ausgang eines Gatters in Schaltung S f: berechnete Funktion des Gatters in Schaltung S Abbildung 4: Eingänge des Gatters ϕ(Z) ϕ(Z) 2.1.3 = f (ϕ(Z ′ ), ϕ(Z ′′ )) ϕ(Z ′ ) ∧ ϕ(Z ′′ ) : ϕ(Z ′ ) ∨ ϕ(Z ′′ ) : = ϕ(Z ′ ) ⊕ ϕ(Z ′′ ) : f =∧ f =∨ f =⊕ = ∼ ϕ(Z ′ ) Schwierigkeiten von Zyklen 1 Abbildung 5: Schaltkreis - Zyklen-Problem ϕ(A) = 1 ⇒ ϕ(B) = 0 ⇒ ϕ(A) = 0! ϕ(A) = 0 ⇒ ϕ(B) = 1 ⇒ ϕ(A) = 1! Abbildung 6: Schaltkreis - AND Flip-Flop Bei beiden Beispielen ergeben sich Probleme, da in den jeweiligen Gattern mit den Untergattern G1 , . . . , GS von einem Untergatter Gn zu einem vorherigen Gatter Gn−k (0 < k < n) gesprungen wird. 2 SCHALTPLÄNE UND SCHALTKREISE 2.1.4 14 Definition: Pfad Der Pfad wird definiert durch: G1 → G2 → . . . → GS Dabei ist S die Länge das Pfades. 2.2 Definition: Schaltkreis Ein Schaltkreis ist eine Schaltung in der keine Zyklen vorkommen dürfen. 2.2.1 Hoffnung/Satz Wir hoffen ein Schaltkreis ist für alle Z mit Z = Eingang oder Z = Ausgang eines Gatters ϕ(Z) wohldefiniert. 2.2.2 Beweis Induktion über die Tiefe zwischen Z und den Eingängen. Die Tiefe von einem Gatter ist die Länge eines längsten Pfades von den Eingängen zu G: Abbildung 7: Tiefe (Formal) T ief e(G) = max{T ief e(G′ ), T ief e(G′′ )} + 1 2.2.3 Beispiel x1 x2 1 1 2 2 3 Abbildung 8: Schaltkreis - XOR-Gatters (Tiefe) T ief e(G) = max{T ief e(G′ ), T ief e(G′′ )} + 1 2 SCHALTPLÄNE UND SCHALTKREISE 2.2.4 15 Hilfssatz In einem Schaltkreis hat jedes Gatter eine Tiefe. Beweis: Annahme: d.h.: Gatter G in Schaltkreis S hat keine Tiefe: ∀ t ∃ Pfad von den Eingängen zu G mit Länger ≥ t x1 → G1 → . . . → Gt → G Sei S endlich, E = #Gatter in S, t > E ⇒ Gatter wiederholt sich ⇒ Zyklus ! Um zu beweisen, dass ϕ wohldefiniert ist, bedient man sich einer Induktion über die Tiefe(G). 2.3 Satz: Darstellungssatz (Schaltkreise) ∀ f : {0, 1}n → {0, 1} ∃ Schaltkreis S : S berechnet f 2.3.1 Definitionen S berechnet f, f alls ∃ Leitung u in S : u ≡ f (x1 , . . . , xn ) K(S) = #Gatter von S (Kosten) T (S) = max{T ief e(G) | G ist Gatter in S} 2.3.2 Beweis Sei e bool’scher Ausdruck. Behauptung: ∃ Schaltkreis S ∃ Leitung u in S: u ≡ e Induktion über i: e ∈ BAi e ∈ BA0 e ∈ {0, 1, x1 , . . . , xi } 0,1 erlauben wir als Eingänge von jedem Schaltkreis: 2 SCHALTPLÄNE UND SCHALTKREISE 16 i → i+1: ◦ ∈ {∧, ∨, ⊕} e′ , e′′ ∈ BAi 1. e = e′ ◦ e′′ Bus der Breite n Abkürzung für: n x[1:n] x1 S(e'') S(e') xn u Abbildung 9: Schaltkreise - Darstellungssatz (Binäre Operationen) 2. e =∼ e′ n x[1:n] S(e') u Abbildung 10: Schaltkreise - Darstellungssatz (Negation) Bemerkung: K(S(e)) = G(e) 2 SCHALTPLÄNE UND SCHALTKREISE 2.4 17 Polynome als Schaltkreise Sei e Polynom: e = M1 ∧ . . . ∧ M t Mi = Li1 ∧ . . . ∧ Mij Mik = {x1 , . . . , xn , x1 , . . . , xn } Zur Berechnung aller Literale reichen n Inverter. x1 _ x1 xn _ xn Ve r b i n d e m i t L e i t u n g e n Lij die zu Monom Mi gehören M1 M2 M2 Abbildung 11: Schaltkreise - Polynom T ief e leq leq 1 + max{j, i} + t − 2 1 + +n + 2n − 2 langsam! Mt 2 SCHALTPLÄNE UND SCHALTKREISE 2.5 Flache ∧ / ∨ Bäume 2.5.1 Definition: Schaltkreise ∧-n 18 n=1: x0 T (∧1 ) = 0 n=2: x0 x1 Abbildung 12: Schaltkreise - ∧ − 2 Baum T (∧2 ) = 1 n 2 →n: x[n-1:n/2] n/2 x[n/2-1:0] n/2 Abbildung 13: Schaltkreise - ∧ − n Baum T (∧n ) = T (∧n/2 ) + 1 = log2 n Es gilt u ≡ v wegen Assoziativität von ∧. 2 SCHALTPLÄNE UND SCHALTKREISE 19 n xn-1 x0 n u v Abbildung 14: Vergleich - ∧−Reihe / ∧ − n Baum 2.5.2 n keine Zweierpotenz Falls n keine Zweierpotenz ist: n = n′ + k n 2 ≤ n′ = k max{2i |2i ≤ n} = n − n′ n ≤ 2 In diesem Fall sieht ∧n so aus: n' k Abbildung 15: Schaltkreise - ∧ − n Baum, falls n keine Zweierpotenz ist 2 SCHALTPLÄNE UND SCHALTKREISE 2.5.3 20 Neue Berechnung von Polynomen Tiefe ≤ x1 _ x1 xn _ xn 1 + ⌈log2 n⌉ j(i) + M1 Mt Mi ⌈log2 n⌉ t t ≤ 2n ≤ n + log2 n + 2 2.5.4 PLA: Programmed Logic Array Verwendung zur Realisierung sogenannter „random logic“: Es werden keine Regelmäßigkeiten der Funktionstabelle ausgenutzt (Zufall = Abwesenheit von Regelmäßigkeiten) 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3 Zahlendarstellung, Addieren (für ganze Zahlen) b[n-1:0] a[n-1:0] n n Abbildung 16: Addierer Kodierung der Eingänge? Addierer-Schaltkreis? Kodierung der Summe? 3.1 Binärdarstellung Binärdarstellungen: a ∈ {0, 1}n = {0, 1} ∨ {0, 1}2 ∨ . . . Dargestellte Zahl: a ∈ {0, 1}n a = a[n − 1 : 0] = an−1 . . . a0 Definition: <a>= ⇒ Pn−1 <a> = i=0 n−1 X ai · 2i ai · 2i i=0 ≤ n−1 X 2i i=0 = 3.1.1 2n − 1 Beispiel < 101 > = 1 · 22 + 0 · 21 + 1 · 20 = 4+0+1 = 5 21 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.1.2 22 Größe der Summe Sei S = C 0 + C 1 + . . . + C n−1 (C = 2): = C 1 + . . . + C n−1 + C n S·C = Cn − C0 S · (C − 1) = Cn − 1 Cn − 1 C −1 = 2n − 1(f alls c = 2) ⇒< a > + < b > ≤ (2n − 1) · 2 S = < 2n+1 − 1 Hoffnung: ∃ S ∈ {0, 1}n+1 mit < S > = < a > + < b > 3.2 Satz: Eindeutigkeit der Binärdarstellung < >: {0, 1} → {0, . . . , 2n − 1} ist bijektiv (Beweis: Übungsblatt, Hinweis: ∨-Baum → ∨-Gatter-Platzierung) D.h. jede Zahl aus {0, . . . , 2n − 1} hat eine eindeutige Binärdarstellung der Länge n. 3.3 Definition: n-bit-Addierer Schaltkreis: a[n-1:0] b[n-1:0] n cin n 1 n+1 S[n:0] Abbildung 17: n-bit Addierer mit: < s > = < a > + < b > + cin 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.4 1-bit Addierer / Volladdierer / Full Adder (FA) a b cin S0 S1 Abbildung 18: Schaltkreis - 1-bit Addierer 3.4.1 Funktionstabelle a 0 0 0 0 1 1 1 1 3.5 b 0 0 1 1 0 0 1 1 cin 0 1 0 1 0 1 0 1 S1 0 0 0 1 0 1 1 1 S0 0 1 1 0 1 0 0 1 Peano Axiome N achf olgerf unktion N : N0 → N0 0 ∈ N0 0 ist eine (natürliche) Zahl. ∀ x ∈ N0 ∃ < ∈ N0 : y = N (x) Jede natürliche Zahl hat einen Nachfolger. ¬ ∃ y : 0 = N (j) 0 ist nicht Nachfolger einer Zahl. x 6= y ⇔ N (x) 6= N (y) Sind zwei natürliche Zahlen verschieden dann haben sie verschiedene Nachfolger, d.h aus x 6= y folgt x + 1 6= y + 1. 23 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) Definition: N (x) = x + 1 N (0) N (1) = = 1 2 N (N (N (0))) = 2·1+1 = N (N (0)) + N (0) = (1 + 1) + 1 Defintion · x...0 x · (y + 1) x · (0 + 1) = = = 0 x·y+x x · 0 +x |{z} 0 = Defintion + x·1 (1 + 1)1̇ 3.6 = = x 1+1 Zerlegung von Zahlendarstellungen a ∈ {0, . . . , B − 1}n (z.B. B = 10) < a >B = < 101 >10 = = n−1 X ai B i i=0 = 1 · 102 + 0 · 101 + 1 · 100 (1 + 1) + 1 101???? Konvention: Ziffernfolge ∈ {0, . . . , 9} - Standardinterpretation: a = a10 a = an−1 · . . . · ak · ak−1 · . . . · a0 < a[n − 1 : 0] >B = < a[n − 1 : k] >B ·B k + < a[k − 1 : 0] >B B = 10, k = 3: 24197 = 24 · 103 + 197 24 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.7 25 Additionsalgorithmus Summanden: a = a[n − 1 : 0] ∈ {0, 1}n b = b[n − 1 : 0] ∈ {0, 1}n c = c−1 1 (c1 = 1) 1 1 1 (c0 = 1) 0 1 0 (cin = 0) 1 1 0 c−1 < c1 , Si > Sn c a c : Übertrag von Stelle i nach Stelle i+1 b i S = = = cin ai + bi + ci+1 cn−1 Satz: ∀ i < a[i : 0] > + < b[i : 0] > + cin = < ci , S[i : 0] > 3.7.1 Beweis: Induktion über i i = 0: < a0 > + < b0 > +cin = a0 + b0 + | {z } Def.: < > = < c ,S > | 0{z 0 } Def.: cin Def.: <c0 ,S0 > c = c−1 c−1 |{z} 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) i − 1 → i: < a[i : 0] > + < b[i : 0] > +cin = ai · 2i + < a[i − 1 : 0] > +bi · 2i + < b[i − 1 : 0] > + cin | {z } Zerlegung = ai · 2i + bi · 2i + < ci−1 , S[i − 1 : 0] > | {z } Induktionsvorraussetzung = ai · 2i + bi · 2i + ci−1 · 2i + < S[i − 1 : 0] > {z } | Zerlegung n=k=i = i (ai + bi + ci−1 ) · 2 + < S[i − 1 : 0] > {z } | Distributivgesetzt = < ci , si > ·2i | {z } + < S[i − 1 : 0] > Def.: Additionsschritt = < ci , si , S[i − 1 : 0] > {z } | Zerlegung n=i+1, k=i = < ci , S[i : 0] > 3.8 Carry-Chain-Adder a0 b0 cin FA a0 b0 c0 S0 FA c1 an-1 bn-1 S1 FA Sn Sn-1 Abbildung 19: Carry-Chain-Adder Kosten = n · K(F A) Tiefe ≤ n · T (F A) Für alle n-bit Addierer: Tiefe ≥ log(2n) 26 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.9 Definition: Multiplexer (Mux) x y n n S (Select Signal) z Abbildung 20: Multiplexer z= 3.9.1 ½ x y : S=0 : S=1 1-bit Multiplexer Schaltkreis x y S z Abbildung 21: 1-bit Multiplexer Schaltkreis z = xs ∧ ys 27 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.9.2 28 n-Mux xn-1 x0 yn-1 y0 S 1-Mux 1-Mux zn-1 z0 Abbildung 22: n-bit Multiplexer x y n n 1 0 S z Abbildung 23: Multiplexer Symbol 3.10 Conditional Carry Adder Definition von Schaltkreis An (A1 = F A): ah al bh n/2 bl n/2 n/2 n/2 1 An/2 An/2 n/2+1 0 cin 0 cn/2 n/2-1 1 S[n:n/2] Abbildung 24: Conditional Carry Adder An/2 n/2 S[n/2-1:0] 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) Tiefe: T (A1 ) = T (F A) T (An ) = T (An/2 ) + T (M ux) | {z } 3 ⇒ T (An ) = O(log n) 3.11 Exkurs: Modulo (u mod v = Rest bei Division durch v ∈ {0, . . . , v − 1} u ≡ u′ mod v ⇔ (u mod v) = (u′ mod v) Division mit Rest bei u < 0? u = a · v + b ; a ∈ Z, b ∈ {0, . . . , v − 1} 3.12 Subtraktion Notation: x[n− : 0] x = (xn−1 , . . . , x0 ) n Subtraktionsalgorithmus: x, y ∈ {0, 1} < x > − < y > = (< x > + < y > +1) mod 2n 3.12.1 Beispiel n=4: 1 - 0 1 1 0 1 1 0 Regel → + + 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 mod 2 29 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.13 Two’s Complement Zahlen x ∈ {0, 1}n Definition: [x] = −xn−1 · 2n−1 + < x[n − 2 : 0] > [x] heißt two’s complement Darstellung von x der Länge n Tn = {−2n−1 , . . . , 2n−1 − 1} [ ] : 0, 1n → Tn −2n−1 ≤ [x] ≤ hx[n − 2 : 0]i ≤ 2n−1 − 1 3.13.1 Beispiel [1011] = −1 · 23 + < 11 > = −8 + 3 = −5 3.14 Beweis: Subtraktion Eigenschaften: a = a[n − 1 : 0] ∈ {0, 1}n 3.14.1 Lemma 1 <a> = [0a] [0a] = = −0 · 2n + < a > (Def initionvon[ ]) <a> [a] = < a[n − 2 : 0] > mod 2n−1 [a] = = −an−1 · 2n−1 + < a[n − 2 : 0] > < a[n − 2 : 0] > mod 2n−1 Beweis: 3.14.2 Lemma 2 Beweis: 30 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.14.3 31 Lemma 3 [a] = < a > mod 2n [a]− < a > = = = −an−1 · 2n−1 + < a[n − 1 : 0] > −(an−1 · 2n−1 − < a[n − 1 : 0] >) −2 · an−1 · 2n−1 0 mod 2n Beweis: Sind Adressen in Rechnern: • Binärzahlen? • Two’s Complement Zahlen= Nach Lemma 3: egal, da mod 232 3.14.4 Lemma 4 [an−1 a] = [a] [an−1 a] = = = = −an−1 · 2n + < a > −an−1 · 2n + an−1 · 2n−1 + < a[n − 2 : 0] > −an−1 · 2n−1 + < a[n − 2 : 0] > [a] [1011] = = [11011] [111011] Beweis: Beispiel: Definition: a ∈ {0, 1}n interpretiert als two’s complement Zahl: an−1 : sign-bit (Sign Extension) 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.14.5 32 Lemma 5 [a] = [a] + 1 [a] = = = = = = −[an−1 ] · 2n−1 + < [a][n − 2 : 0] > Pn−2 −[an−1 ] · 2n−1 + i=0 ai · 2i Pn−2 −[(1 − an−1 ) · 2n−1 + i=0 (1 − ai ) · 2i P Pn−2 n−2 xn−1 · 2n−2 − i=0 xi 2i − 2n−1 + i=0 2i −[x] − 2n−1 + 2n−1 − 1 −[x] − 1 Beweis: 3.14.6 Beweis der Subtraktion = = = <a>−<b> 3.15 < a > −[0b] < a > +[1b] + 1 < a > + < b > +1 mod 2n (Lemma 1) (Lemma 5) (Lemma 2) Definition: n-bit-twoc-Addierer Siehe hierzu auch Abbildung 17 (Seite 22). [S] = [a] + [b] + cin mod 2n Sei An ein n-bit-Addierer: 3.16 < S[n − 1 : 0] > = = = = = = < a > + < b > +cin Pn−2 −[an−1 ] · 2n−1 + i=0 ai · 2i Pn−2 −[(1 − an−1 ) · 2n−1 + i=0 (1 − ai ) · 2i P Pn−2 n−2 xn−1 · 2n−2 − i=0 xi 2i − 2n−1 + i=0 2i −[x] − 2n−1 + 2n−1 − 1 −[x] − 1 < S[n − 1 : 0] > = = = < a > + < b > +cin [a] + [b] + cin mod 2n [S[n − 1 : 0]] mod 2n (Lemma 3) (Lemma 3) Definition: Arithmetic Unit (AU) a b n n AU sub n S Abbildung 25: Arithmetic Unit [S] = ½ [a] + [b] mod 2n [a] + [b] mod 2n (sub = 0) (sub = 1) 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 33 Nach Lemma 5: [S] = 3.16.1 ½ [a] + [b] + 0 mod 2n [a] + [b] + 1 mod 2n (sub = 0) (sub = 1) Erweiterung der Notation a ∈ {0, 1}n ; x ∈ {0, 1} ◦ : {0, 1}n → {0, 1} a ◦ x = (an−1 ◦ x, . . . , a0 ◦ x) x ◦ a = (x ◦ an−1 , . . . , x ◦ a0 ) b a an-1 b a0 1 n Abk. für: n Abbildung 26: Erweiterung der Notation Beispiel: b n sub 1 Abbildung 27: Beispiel: Erweiterung der Notation b ⊕ sub = (bn−1 ⊕ sub, . . . , b0 ⊕ sub) ½ b (sub = 0) = b (sub = 1) b 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.17 34 n-bit-twoc AU (auch für Binärzahlen) [S] = [a] + [b ⊕ sub] + sub mod 2n b n sub a n n AU n neg ovf S[n-1:0] Abbildung 28: n-bit-twoc AU (auch für Binärzahlen) Behauptung: addiert/subtrahiert auch Binärzahlen Frage: Wann ist [a] + [b] + cin ∈ Tn = {−2n−1 , . . . , 2n−1 − 1}? Definition: ovf (a, b, cin ) ⇔ neg(a, b, cin ) ⇔ [a] + [b] + cin ∈ / Tn (overf low) [a] + [b] + cin < 0 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.17.1 Satz: Overflow ovf (a, b, cin ) = 1 ⇔ cn−1 + cn−2 3.17.1.1 Beweis [a] + [b] + cin = −an−1 · 2n−1 − bn−1 · 2n−1 + < a[n − 2 : 0] > + < b[n − 2 : 0] > = −an−1 · 2n−1 − bn−1 · 2n−1 + < cn−2 , S[n − 2 : 0] > | {z } =2n−1 ·cn−2 +<S[n−2:0]> (Korrektheitsbeweis d. Addierers, Induktion bei i = n − 2) = −2n−1 (an−1 + bn−1 + cn−1 − 2cn−2 )+ < S[n − 2 : 0] > = −2n−1 ( < cn−1 , Sn−1 > + < S[n − 2 : 0] > {z } | 2·(cn−1 +Sn−1 −2cn−2 ) = −2n (cn−1 − cn−2 ) + [S[n − 1 : 0]] = δ Fall cn−1 = cn−2 : ⇒ δ = [S[n − 1 : 0]] ∈ Tn Fall cn−1 = 1; cn−2 = 0: ⇒ δ = −2n + [S] ≤ −2n + 2n−1 − 1 ∈ / Tn Fall cn−1 = 0; cn−2 = 1 ≡ Fallcn−1 = 1; cn−2 = 0 3.17.2 Satz: Negation neg(a, b, cin ) = 1 ⇔ [a] + [b] + cin < 0 ∈ Tn+1 \Tn neg = 3.18 an−1 ⊕ bn−1 ⊕ cn−1 Definition: Arithmetic Logic Unit (ALU) b a n n 4 ALU f [3:0] (Steuerbits) n ovf S[n-1:0] Abbildung 29: Arithmetic Logic Unit 35 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.18.1 3.18.2 36 Steuerbit-Tabelle 0 0 0 0 0 0 0 0 f [3 : 0] 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 f [3 : 0] < = 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 > 0 1 0 1 0 1 0 1 S a +n b a +n b a −n b a −n b a ∧ b a ∨ b a ⊕ b b[n/2 : 0] 0n/2 overflow akt./ign. akt. ign. akt. ign. xcc(1, b, f ) ≡ a a a a a a 0 > = ≥ < 6 = 6 = 1 b b b b b b a−b a−b a−b a−b a−b a−b > = ≥ < 6= 6= 0 0 0 0 0 0 Schaltkreis n a b n n/2 sub n-AU b[n/2-1:0] 0 f[1] n f[3] neg n n n akt* ovf' f[0] f[0] 1 0 1 0 S'' f[1] null* ovf 0 1 0 f[2] 1 n S' n-1 0 xcc* n Interrupt Unit 0 1 n S Abbildung 30: Schaltkreis - Arithmetic Logic Unit f[3] 3 ZAHLENDARSTELLUNG, ADDIEREN (FÜR GANZE ZAHLEN) 3.18.3 akt: Overflow aktivieren/ignorieren akt = f3 f2 f0 3.18.4 xcc: Fixed Point Condition Code neg(a, b, f ) = 1 ⇔ null(a, b, f ) = 1 ⇔ a−b < 1 a−b = 1 pos(a, b, f ) = 1 ⇔ a−b > 1 pos = neg ∧ null xcc(a, b, f ) = f2 neg ∨ f1 null ∨ f0 pos 37 4 PROZESSORBAU 38 4 Prozessorbau Prozessor: rechnet in Schritten Hardware: rechnet besser auch in Schritten 1. Mathematische Maschinen 2. Register, RAM, multiport-RAM’S (Hardware-Erweiterungen) 3. DLX0 : vereinfachter DLX-Instruktionssatz (DLX ≈ MIPS) 4. Bau von DLX0 -Prozessor 4.1 Mathematische Maschinen Aus Programmier-Sprachen x := x + 1 | {z } nicht Gleichheit! Definition von xt : x vor/während Schritt t → xt+1 = xt + 1 x: Register, RAM, . . . : Hardware x: für Benutzer sichtbare Register : Assembler-Programmierung x: Variablen eines Programms : Programmier-Sprachen x: für Benutzer sichtbare Datenstrukturen : Betriebssystem Definition: mathematische Maschinen M = (τ, δ, c0 ) τ : δ : M enge von Konf igurationen (Zustand d. M aschine in einem Schritt) τ →τ : (Ü bergangsf unktion) Startkonf iguration c0 ∈ τ Rechnung: F olge(C 0 , c1 , c2 , . . .) : ci+i = f (ci ) ∀i 4 PROZESSORBAU 4.2 Speicherelemente 4.2.1 Register (n-Bit) 39 Rin Ce n R n Rout Abbildung 31: Register R ∈ {0, 1}n (in Register gesp. bits) ce ∈ {0, 1} (clock enable) Arbeitsweise: R := R = Rin f alls ce = 1 ½ t Rin : cte = 1 Rt : sonst Beispiel: 0 a n n 1 n-Add 0 n n 1 0 reset R 1 Abbildung 32: Register (Beispiel) reset0 = 1 t reset | {z } = 0 (t>0) 0 Rin = 0n 1 Rin t Rin = 0n = Rt +n 1n |{z} 1n = binn (1) R t+1 t = R +n 1 4 PROZESSORBAU 40 Lemma: Rt = binn (t) 4.2.2 Random Access Memory (RAM) Din d ad w a S 1 d Dout Abbildung 33: 2a × d RAM 4.2.2.1 2a × d RAM S : {0, 1}a → {0, 1}d ½ t Din : x = adt ∧ wt = 1 t+1 s (x) = t S (x) : sonst t Dout = S t (adt ) (f alls wt = 0) Allgemeine Regeln zur Wohldefiniertheit: S.M. Müller, W. Paul: The Complexity of Simple Computer Architectures, Springer 1995. Din d ad A ad B ad C a 1 a w S a d Dout A d Dout B Abbildung 34: 3 − P ort RAM 4.2.2.2 3 − P ort RAM S : {0, 1}a → {0, 1}d ½ Din C t : x = adC t ∧ wt = 1 S t+1 (x) = S t (x) : sonst Dout At = S t (adAt ) : (adA 6= adC ∧ wt = 1) ∨ wt = 0 Dout B t = S t (adB t ) : (adB 6= adC ∧ wt = 1) ∨ wt = 0 4 PROZESSORBAU 4.3 41 Instruktionssatz des DLX0 -Prozessors m CPU PC ad 32 32 GPR Abbildung 35: DLX0 Instruktionssatz Central Processing Unit: Memory: Wort-Adressiert Adressen ∈ {0, 1}32 m : {0, 1}32 → {0, 1}32 mt (ad) : Inhalt von Speicherzelle ad zur Zeit t Program Counter (PC) ∈ {0, 1}32 General Purpose Register File (GPR): {0, 1}5 → {0, 1}32 32 Adressen 32 Register GPR[i] ∈ {0, 1}32 ; i ∈ {0, 1}5 4.3.1 Konfiguration c = 4.3.2 (c.P C, c.GP R, c.m) c.P C ∈ {0, 1}32 c.GP R c.m : : {0, 1}5 → {0, 1}32 {0, 1}32 → {0, 1}32 Rechnung Rechnung: (c0 , c1 , c2 , . . .) ci+1 = δ(ci ) Ii = die i-te ausgeführte Instruktion I I I 1 0 c2 . . . ci →i ci+1 c1 → c0 → I(ct ) = ct .m[ct .P C] ∈ {0, 1}32 N otation : I(ct ) ≡ It It wird meistens auch im Instruction Register (IR) zwischengespeichert. Effekt von It formal spezifiziert durch: ct+1 = (ct+1 .P C, ct+1 .GP R, ct+1 .m) = δ(ct ) 4 PROZESSORBAU 4.3.3 42 3 Instruktionsformate I-Type: 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 OPC RS1 RD 8 7 6 5 4 3 2 1 0 6 5 4 3 2 1 0 2 1 0 imm R-Type: 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 OPC RS1 RS2 RD 8 7 (SA) fu J-Type: 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 OPC 8 7 6 5 4 imm Der Typ der Instruktion wird im OpCode festgelegt: opc(c) | {z } = I(c)[31 : 26] c=DLX0 −Konf iguration Prädikate: R − T ype(c) ⇔ opc(c) = 06 J − T ype(c) I − T ype(c) ⇔ ⇔ opc(c) ∈ {000010, 000011, 111110, 111111} /(R − T ype(c) ∨ J − T ype(c)) Felder definieren: RS1(c) = I(c)[25 : 21] RS2(c) = I(c)[20 : 16] ½ I(c)[20 : 16] RD(c) = I(c)[15 : 11] f u1 (c) imm(c) = I(c)[5 : 0] ½ I(c)[15 : 0] = I(c)[25 : 0] : I-Type(c) sonst : I-Type(c) sonst 3 4 PROZESSORBAU 4.3.4 43 Definition: Signed Extension Sei a ∈ {0, 1}b (interpretiert als twoc): sxt(a) = a[b − 1]cb−1 a ∈ {0, 1}b+c Lemma: [imm] = [sxt(imm)] 4.3.5 GP R[05 ] Für das GPR des DLX0 soll immer gelten: c.GP R[00000] = 032 4.3.6 Instruktionen 4.3.6.1 Load/Store load word (lw): lw(c) = 1 ⇔ op(c) = 100011 effective address: ea(c) = c.GP R[RS1(c)] +32 sxt2 (imm(c)) | {z } | {z } | {0,1}5 {z {0,1}32 } {0,1}16 ct+1 .GP R [RD (ct )] = ct .m [ea(ct )] store word (sw): sw(c) = 1 ⇔ op(c) = 101011 ct+1 .m[x] = 2 sxt: signed Extension ½ ct .m [ea(ct )] ct .m [x] : sw(c) ∧ x = ea(ct ) : sonst 4 PROZESSORBAU 44 4.3.6.2 Compute / Compute Immediate compute immedate (comp.imm:) comp.imm(c) = 1 ⇔ I(c)[31 : 30] = 01 Vergleiche hierzu Kapitel 3.18. Wir benötigen hierzu eine 32-bit ALU. ½ aluop(c.GP R[RS1(c)], sxt(imm(c)), I(c)[29 : 26]) ct+1 .GP R[x] = ct .GP R[x] compute (comp): comp(c) = 1 ⇔ R − T ype ∧ I(c)[5 : 4] = 00 ½ aluop(c.GP R[RS1(c)], c.GP R[RS2(c)], I(c)[3 : 0]) ct+1 .GP R[x] = ct .GP R[x] : x = RD(c) ∧ x 6= 05 : sonst : x = RD(c) ∧ x 6= 05 : sonst Zusammenfassung: lop = c.GP R[RS1(c)] ½ sxt(imm(c)) : comp.imm(c) c.GP R[RS2(c)] : sonst ½ I(c)[29 : 26] : comp.imm(c) lop = I(c)[3 : 0] : sonst rop = 4.3.6.3 Branch or Jump taken bjtaken(c) = 1 ⇔ btaken(c) ∧ jump(c) branch(c) = 1 ⇔ I(c)[31 : 27] = 11010 AeqZ(c) = 1 ⇔ c.GP R[RS1(c)] = 0 jump(c) beqz(c) bnez(c) btaken(c) = j(c) ∧ jal(c) ∧ jr(c) ∧ jalr(c) = branch(c) ∧ I(c)[26] = 0 = branch(c) ∧ I(c)[26] = 1 = c.GP R[RS1(c)] = 0 ∧ beqz(c) ∨ c.GP R[RS1(c)] 6= 0 ∧ bnez(c) | {z } Def inition = branch(c) ∧ [c.GP R[RS1(c)] = 0 ∧ I[26] = 0 ∨ c.GP R[RS1(c)] 6= 0 ∧ I[26] = 1)] 4 PROZESSORBAU 45 ⇒ Lemma: *Achtung: btaken(c) = branch(c) ∧ (AeqZ(c) ⊕ I[26]) t c .P C(ct ) +32 sxt(imm(ct )) : btaken(ct ) ∧ j(ct ) ∧ jal(ct )* t+1 ct .GP R[RS1(ct )] : jr(ct ) ∧ jalr(ct ) c .P C = t c.P C(c ) +32 132 : sonst imm(c) ∈ {0, 1}16 oder {0, 1}26 ½ imm[15]16 imm : imm(c) ∈ {0, 1}16 sxt(imm) = imm[25]6 imm : imm(c) ∈ {0, 1}26 32 0 t c .m[ct ] aluop(lop(ct ), rop(ct ), f code(ct )) ct+1 .GP R[x] = c.P C +32 132 {z } | Rücksprungadresse t c .GP R[x] 4.3.7 x = 05 lw(ct ) ∧ x = RD(ct ) ∧ x 6= 05 (comp.imm(ct ) ∨ comp(ct )) ∧ x = RD(ct ) (jal(ct ) ∨ jalr(ct )) ∧ x = 15 : : : : : sonst Zusammenfassung: Instruktionen t+1 c .m[x] = ½ ct .m [ea(ct )] ct .m [x] : sw(c) ∧ x = ea(ct ) : sonst t c .P C(ct ) +32 sxt(imm(ct )) ct .GP R[RS1(ct )] ct+1 .P C = c.P C(ct ) +32 132 32 0 t c .m[ct ] aluop(lop(ct ), rop(ct ), f code(ct )) ct+1 .GP R[x] = +32 132 |c.P C {z } Rücksprungadresse ct .GP R[x] 4.4 : : : : : btaken(ct ) ∧ j(ct ) ∧ jal(ct )* : jr(ct ) ∧ jalr(ct ) : sonst x = 05 lw(ct ) ∧ x = RD(ct ) ∧ x 6= 05 (comp.imm(ct ) ∨ comp(ct )) ∧ x = RD(ct ) (jal(ct ) ∨ jalr(ct )) ∧ x = 15 : sonst Hardware-Konfiguration h = (h.P C, |h.GP {z R} modif iziertes 3−P ort RAM , h.m) 4 PROZESSORBAU 46 {0, 1}5 → {0, 1}32 32 : x = 05 0 t+1 t D : wt ∧ x 6= 05 ∧ x = adC t S [x] = tin S [x] : sonst h.GP R : h.P C ∈ {0, 1}32 h.m : {0, 1}32 → {0, 1}32 Ziel ist es, zu beweisen, dass die beiden mathematischen Maschinen (Hardware und DLX0 ) gleich funktionieren. 4.4.1 Unterteilung der Instruktionen in Stufen IM IF (instruction fetch) Ih 32 ID (instruction decode) nextPC ad comp c0 comp PCinc 5 5 ad A ad B ad C c0 1 5 PLA Prädikate PC A EX (execute) a* 1 0 0 roph ALU link M aluoph* 32-Add min alures 0 b* 1 madr (memory) m mout 0 1 g* ad A WB (write back) GPR ad B GPRw* ad C Dout A B Dout B Abbildung 36: DLX0 -Hardware Konfiguration in Stufen Noch zu definieren: α, β, γ GP Rw , mw , c0 comp, adcomp, nextP C, aluoph , P Cinc mw* 4 PROZESSORBAU 4.5 47 Beweis der Gleichheit zwischen DLX0 - und Hardware-Konfiguration c0 , c1 , c2 , . . . ci+1 = δ(ci ) | {z } DLX0 Rechnung h0 , h1 , h2 , . . . hi+1 = δ(hi ) | {z } Hardware Rechnung Zu zeigen ∀ i: hi .P C = ci .P C h .GP R = ci .GP R hi .m = ci .m (Induktionsbehauptung) i Vorraussetzung: • Induktionsbehauptung(0) gilt • c0 .m[x] = IM [x] für alle x ∈ codesection • kein selbsmodifizierender Code ∀i: sw(ci ) ⇒ ea(ci ) ∈ / codesection ci .P C ∈ codesection Induktionsschluss i → i + 1: ci .P C = hi .P C Ih (hi ) = = = = = IM [hi .P C] IM [ci .P C] m[c0 .P C] mi [ci .P C] I[ci ] (Konstruktion) (Induktions-Vorraussetzung) (keine Selbsmodifikation) 4 PROZESSORBAU 4.5.1 48 c0 comp Ih [31:0] Ih [15]6 Ih [25]6 0 Ih [15]10 0 1 1 J-Type J-Type C0 [31:26] Ih [15:0] Ih [25:16] C0 [25:16] Abbildung 37: DLX0 -Beweis (c0 comp) Lemma: J − T ype(hi ) = J − T ype(ci ) (aus Darstellungssatz!) Lemma: c0 (hi ) = sxt(imm(ci )) C0 [15:0] 4 PROZESSORBAU 4.5.2 49 adcomp Ih [31:0] ad B ad A Ih [15:11] Ih [20:16] Ih [20:16] Ih [25:21] 1 0 5 R-Type 1 0 1 ad C jalh oder jalrh Abbildung 38: DLX0 -Beweis (adcomp) Lemma: ad A(hi ) = RS1(ci ) ad B(hi ) = ½ ad C(hi ) = A(hi ) ½ RS1(ci ) RD(ci ) : R-Type : I-Type RD(ci ) 15 : I-Type ∧ R-Type : jal(ci ) ∧ jalr(ci ) i h | .GP {z R} = ci .GP R i ⇒ A(h ) : I-Type ∨ R-Type [ ad A(hi ) | {z } ] (ind. V or.) RS1(ci ) (eben gezeigt) = lop(c ) (f alls I − T ype(ci ) ∨ R − T ype(ci )) B(hi ) = i ½ ci .GP R[RS2(ci )] ci .GP R[RD(ci )] : R − T ype : I − T ype ¾ α = R − T ypeh i roph (h ) = = *Lemma: ∀ Prädikate P : P (ci ) Ph (hi ) ½ ½ ci .GP R[RS2(ci )] ci .GP R[RD(ci )] ci .GP R[RS2(ci )] ci .GP R[RD(ci )] : R − T ypeh (hi ) = 1 : R − T ypeh (hi ) = 0 ¾ : R − T ype(ci ) = 1 P LA − Lemma ∗ : R − T ype(ci ) = 0 4 PROZESSORBAU 4.5.3 50 aluoph Ih [29:26] Ih [3:0] 1 0 R-Type aluoph Abbildung 39: DLX0 -Beweis (aluoph ) Mit ALU-Korrektheit: ⇒ alures(hi ) = aluop(lop(ci ), rop(ci ), aluop(ci )) 4.5.4 mw Mit Addierer-Korrektheit: ⇒ mad (hi ) = A(hi ) +32 c0 (hi ) = ci .GP R[RS1(ci )] +32 sxt(imm(ci )) = ea(ci ) min (hi ) = ci .GP R[RD(ci )] Definition: mw = swh = sw(ci ) (P LA − Lemma) 4 PROZESSORBAU 4.5.5 51 ci .m = hi .m hi+1 .m[x] | {z } = neuer HW −Speicher ½ min hi .m[x] : mw (hi ) = 1 ∧ x = mad (ci ) : sonst i i c .GP R[RD(c )] i h .m[x] = i | {z } ¾ Def. : HW − Speicher : sw(ci ) = 1 ∧ x = ea(ci ) : sonst c .m[x] (Ind.V or. = ci+1 .m Bewiesen: → 4.5.6 ci .m = hi .m GP R.w Definition: aluup(lop(ci ), rop(ci ), aluop(ci )) i mout (hi ) GP R.Din (h ) = P C i (hi ) β γ(hi ) mout (hi ) : α(hi ) = 0 ∧ β(hi ) = 0 : γ(hi ) = 1 : β(hi ) = 1 ∧ γ(hi ) = 0 = jalh ∨ jalrh (γ = lwh ) = lwh (hi ) = lw(ci ) = i h .m} | {z [ mad (hi ) ] | {z } ci .m (Ind. V or) ea(ci ) (eben) = ci m[ea(ci )] Bewiesen mit Lemma nextPC: P C ′ (hi ) = hi .P C +32 132 Definition: GP R.w = lwh ∨ computeh ∨ compute.immh ∨ jalh ∨ jalrh 4 PROZESSORBAU hi+1 .GP R[x] = 52 32 o aluup(lop(ci ), rop(ci ), aluop(ci )) i i c .m(ea(c )) hi .P C +32 132 | {z } i+1 .GP R[x] c hi .GP R[x] i | {z } : x = 05 (Def. HW-Multiport-RAM) : comp(ci ) ∨ comp.imm(ci ) ∧ x = RD(ci ) : x = RD(ci ) ∧ sw(ci ) : jal ∨ jalr ∧ x = 15 : sonst c .P C (Ind.V or.) 4.5.7 P Cinc Ih (hi ) = I(ci ) ci+1 = hi+1 .GP R ci+1 .m = hi+1 .m P Cinc (hi ) = ci .P C +32 132 4.5.8 Spezifikation: n-Inc x n n-Inc n y Abbildung 40: Spezifikation - n-Inc y = x +n 1n Nach Induktionsvorraussetzung: P Cinc (hi ) = hi .P C +32 132 = ci .P C +32 132 4 PROZESSORBAU 4.5.9 53 nextP C C0 32 32-Inc A 0 32-Add 32 32 bjtakenh 1 0 jrh Ú jalrh 0 1 032 reset 1 0 nextPC PC 1 Abbildung 41: nextP C PLA-Lemma: ⇒ (jrh ∨ jalh )(hi ) = jr(ci ) ∨ jalr(ci ) bjtaken(ci ) = jump(ci ) ∨ branch(ci ) ∧ AeqZ(ci ) ⊕ I(ci )[26] jumph jumph (hi ) = = jh ∨ jalh ∨ jrh ∨ jalrh jump(ci ) 4 PROZESSORBAU 54 Hardware: A 32 32-OR Ih[26] AeqZh jumph bjtakenh Abbildung 42: bjtakenh früher: A(hi ) AeqZh (h ) = 1 i bjtakenh (hi ) = ⇔ ⇔ ci .GP R[RS1(ci )] ∀j : A(hi )[j] = 0 A(hi ) = 032 ⇒ AeqZ(hi ) = AeqZ(ci ) = bjtakenh (ci ) für reset = 0: i c .GP R[RS1(ci )] i+1 i ci .P C +32 sxt(imm(ci )) h .P C = nextP Ch (h ) = i c .P C +32 132 : jr(ci ) ∨ jalr(ci ) : bjtaken(ci )∧ ∼ (jr(ci ) ∨ jalr(ci )) : sonst 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 55 5 Compiler für C0 (PASCAL mit C-Syntax) Vorgehensweise: 1. Definition der Syntax von C0 (entspricht den bool’schen Ausdrücken, DLX0 -Instruktionsformate) 2. Definition der Sematik von C0 : Definition einer abstrakten C0 -Maschine (entspricht δ(h), δ(c)) 3. Compiler: C0 → DLX0 4. Simulationssatz: Compiler p: C0 -Programm → Code(p): DLX0 -Programm Zu zeigen: DLX0 mit Code(p) simuliert eine C0 -Maschine mit Programm p 5.1 Kontextfreie Grammatiken 5.1.1 Beispiel: Kontextfreie Grammatik V C Variable oder Konstante B → V C|(∼ B)|B ∧ B)|(B ∨ B)|(B ⊕ B) | {z } P roduktionensystem Abkürzung für: {B {z V C}, B → ∼ B, . . . , B → B ⊕ B} | → P roduktion N T S 5.1.2 = = = {B} {(, ), V C, ∧, ∨, ⊕, ∼} B Nichtterminalalphabet Terminalalphabet Startsymbol Definition: Kontextfreie Grammatik Grammatik G = (T, N, P, S) | {z } Kontextf reie Grammatik (cf g) T N S P : : = ⊂ endlich, Terminalalphabet endlich, Nichtterminalalphabet Startsymbol (N × (N ∪ T )∗) (n, w) ∈ P (Produktionensystem) (Produktion) Schreibweise: n {z w} | → Aus n kann w abgeleitet werden 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.1.3 56 Arbeitsweise von Grammatiken Definition: induktiv zu G Q ist Ableitungsbaum zu G mit Wurzel w und Blattwort b: b w S ist ein Ableitungs-Baum mit Wurzel S und Blattwort S: S Sei Q Ableitungs-Baum mit Wurzel w und Blattwort b = b′ n b′′ n ∈ N : b' n b'' w Sei n → u ∈ P ⇒ u = u1 , . . . , un Ableitungsbaum mit Wurzel w und Blattwort b = b′ u b′′ : u1 . . . un b' n b'' w 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 57 Beispiel: (B Ù B ) (~ B ) B (~ B ) B VC VC (B Ù B ) (~ B ) B B Abbildung 43: Beispiel - Arbeitsweise von Grammatiken Blattwort: (∼ (V C ∧ V C)) 5.1.4 Weitere Definitionen Zi ZiF V VC A → → → → → 0|1|2|3|4|5|6|7|8|9 Zi|ZiF Zi XZiF ZiF |V V C| −1 A|A + A|A −2 A|A ∗ A|A/A|(A) (Ziffer) (Ziffernfolge) (Variable) (Variable oder Konstante) (Ausdruck) Beispiele: ∗ 0 V C → X |{z} 1 |{z} Zi Zi |{z} ZiF | {z } ZiF {z } | V {z } | VC ∗ X3 X2 ∗ |{z} A → |{z} X1 + |{z} VC VC VC |{z} |{z} A A | {z } A {z } |{z} A | A Dies ist fast ein Schaltkreis (kann als Schaltkreis dargestellt werden). Da Schaltkreise eine Semantik besitzen, besteht auch die berechtigte Hoffnung, die Semantik ves Ausdrucks ableiten zu können. 5.1.5 Problem: Alternativer Ableitungsbaum An dem vorigen Beispiel kann man ebenfalls zeigen, dass es verschiedene Ableitungs-Bäume zum gleichen Blattwort gibt: X3 X2 ∗ |{z} X1 + |{z} |{z} VC VC VC |{z} |{z} |{z} A A A | {z } A {z } | A 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.1.6 58 Definition: Eindeutigkeit von Grammatiken G heißt eindeutig ⇔ ∀ w ∈ L(G) ∃ genau 1 Ableitungs-Baum mit Wurzel s und Blattwort w Dazu beschränken wir A: F T A 5.1.7 → → → V C| −1 F |(F ) F |T ∗ F |T /F T |A + T |A − T (Faktor) (Term) (Ausdruck) Satz: Grammatik G ist eindeutig Der Beweis ist zum Beispiel in Loexx,Mehlhorn,Wilhem: Programmiersprachen zu finden. 5.2 Aufbohren der Grammatik 5.2.1 Bool’sche Ausdrücke Beispiel: if 2 > x + 3 | {z } ... bool′ scherAusdruck Um dies darzustellen definieren wir: Atom BF BT BA 5.2.2 → → → → A > A|A ≥ A|A < A|A ≤ A|A == A|A 6= A|0|1 Atom| BF |(BA) BF |BT ∧ BF BT |BA ∨ BT Komplexe Datentypen struct-Komponenten: (.|. . . . . . . . . . . .{z . . . . . . . . . . . . .}.).N a identif ier des T yps struct array-Komponenten: pointer-Dereferenzierer: (.|. . . . . . . . . . . .{z . . . . . . . . . . . . .}.)[e] adress of-Operator: ∗(.|. . . . . . . . . . . .{z . . . . . . . . . . . . .}.) Um dies darzustellen erweitern wir: &(.|. . . . . . . . . . . .{z . . . . . . . . . . . . .}.) identif ier des T yps array identif ier des T yps pointer identif ier des T yps adress of id → N a|C|id.N a|id[A]| ∗ id|&id (wie bool’sche Variable) (bool’scher Faktor) (bool’scher Term) (bool’scher Ausdruck) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.2.3 59 Anweisungen An → A − F olge AnF → → id = A id = BA if BA then An else An if BA then An while BA do An {AnF } N a(A − F olge) return A return BA A|A − F olge, A An|AnF ; An (Zuweisung) (Zuweisung für bool’sche Variablen) (Bedingte Anweisung) (verkürzte bedignte Anweisung) (Schleife) (Anweisungs-Block) (Funktionsaufruf) (Rückgabewert) (Rückgabewert für bool’sche Variablen) (Ausdrucks-Folge) (Anweisungs-Folge) An einem Beispiel zeigt sich wieder, dass diese Grammatik nicht eindeutig ist: 1. if BA then if BA then An else An | {z } An {z } | An 2. if BA then if BA then An else An {z } | An {z } | An 5.2.4 Programm Das Programm besteht aus einem Deklarations-Teil (zur Deklaration von Variablen, Funktionen und Typen) und einem Anwendungsteil (einer Anweisungs-Folge): programm 5.2.5 → DeklF ; AnF (Programm) Deklarationen Dekl DeklF N aF V aD P ar P arF T ypD eltyp typ KompD KompDF → → → → → → → → → → → V aD|F nD|T ypD DeklF |DeklF ; Dekl N a|N aF, N a typN aF ; T ypN a P ar|P arF, P ar typedef typN a; int|bool|char|f loag| . . . eltyp|eltyp[ZiF ]|N a[ZiF ]|structN a{KompDF }|N a∗ N a : eltyp|N a : N a KompD|KompDF (Deklaration) (Deklarations-Folge) (Namens-Folge) (Variablen-Deklaration) (Parameter) (Parameter-Folge) (Typen-Definition) (elementare Typen) (Typen) (Komponenten-Definition) (Komponenten-Folge) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.3 60 Semantik von C0 Für die Sematik von C0 definieren wir wie schon bei DLX0 eine abstrakte Maschine: • Deklarations-Teil: Typen-Definition Variablen-Deklaration c.env(. . . , . . . , . . . , . . . , . . . , . . .) | {z } | {z } | {z } Funktions-Deklaration T yp V ar Fn • Anweisungs-Teil: Programmrest (noch auszuführende Anweisungen) 5.4 Deklarations-Teil 5.4.1 Typen-Definition ¾ c.prog Als Beispiel für die Typen-Definitionen gelten folgende Deklarationen: typedef x int[5]; typedef y x[5]; struct {wert:int,next:LEL*} LEL; 5.4.1.1 Type Table c.nt c.tt = = = Number of Types (Anzahl der Bennutzten Typen) Type Table ( c.tt.name {z } ) | {z } , |c.tt.tc T ype−N ame T ype−Code Type Table: c.tt.name : c.tt.tc : [ ] → T ypeCodes Type Codes: c.tt.tc[i] = c.tt.tc[i] : c.tt.tc[i] : c.tt.tc[i] : el falls name[i] elementar arr(n, j) typedef (c.tt.name[j])[n] c.tt.name[i] * i-te Type-Definition (inkl. elem. Typen)) *j < i ptr(j) typedef (c.tt.name[j])* c.tt.name[i] * j > i ist erlaubt struct(n1 , i1 ; . . . ; ns : is ) typedef struct(n1 , t1 ; . . . ; ns : ts ) ∗ c.tt.name[i] * tj = name(ij ) * ij < i [0 : nt − 1] → N | amen {z } =L(N a) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 61 Eine Tabelle zu den Beispiel-Deklarationen könnte dann wie folgt aussehen: 5.4.1.2 i 0 1 .. . name int bool .. . tc el el .. . 4 5 6 7 x y p LEL arr(5, 0) arr(5, 4) ptr(7) strwert, 0; next, 6 Größe von Typen • t elementar oder pointer − typ : {z } | simple value size(t) = 1 • t = t′ [n] : size(t) = n · size(t′ ) • t = struct{n1 : t1 ; . . . ; ns : ts } : Ps−1 size(t) = i=0 size(ti ) Bemerktung (in ’Sprache’ der Type Table): • falls c.tt.tc[i] = arr(n, j) : size(i) = n · size(j) • falls c.tt.tc[i] = struct{n1 : t1 ; . . . ; ns : ts } : Ps−1 size(i) = j=0 size(ij ) • size(i) kann aus c.tt in Reihenfolge i = 0, 1, . . . , c.nt − 1 berechnet werden size(t) = n · size(t′ ) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 62 5.4.1.3 Range Festzulegen ∀ deklarierten Typen t: Ra(t) = {w|w Wert, Variablen vom Typ t können w als Wert annehmen } | {z } Range t elementar: Ra(int) Ra(int) 6= Z = {−231 , . . . , 231 − 1} Ra(char) = {0, . . . , 28 − 1} .. . Notation: fs (i) = f [i + s − 1 : i]3 Ra(t[n]) ∋ f [size(t[n]) − 1 : 0] | {z } n·size(t) ⇔ ∀i ∈ {0, . . . , n − 1} : fsize(t) (i.size(t)) ∈ Ra(t) ⇔ Ra(struct{n1 : t1 ; . . . ; ns : ts }) ∋ f ∀i ∈ {1, . . . , s} : fsize(ti ) (di ) ∈ Ra(ti ) Achtung: Wir stellen Werte von Variablen mit (komplexen) Typ t als Folgen von simple values ∈ sv Länge size(t) dar. 3 Teilfolge 4 sv: der Länge s beginnend bei Element i Werte die simple Typen annehmen können (Pointer später!) 4 der 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 63 Typ int[5] x: ∈ R(int) ∈ R(int) ∈ R(int) ∈ R(int) ∈ R(int) ∈ R(x) ∈ R(x) ∈ R(x) ∈ R(x) ∈ R(x) ∈ R(x) ∈ R(y) ... ∈ R(t1 ) ∈ R(t) size(t1 ) 0 Typ x[5] y: Typ struct{n1 : t1 ; . . . ; ni : ti ; . . . ; ns : ts } z: size(t) − 1 ∈ R(ts ) ... ∈ R(ti ) di * *Displacement: di = P j<i size(tj ) Bemerkung: Werte sind (bei uns) flach (wegen dem Adress-Of Operator & ) 5.4.2 Variablen-Deklaration • mit Namen ausserhalb von Funktionen (global) • mit Namen innerhalb von Funktionen (lokal) • neu: ohne Namen, Zugriff nur über Pointer Änderung der Grammatik (!): An Beispiel: LEL* q; q = new LEL*; → N a = newN a∗ (Allokieren von Speicher) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 64 5.4.2.1 Symbol-Tabelle von Speichern Erweiterung der Konfiguration: c = (nt, tt, gm, hm, lms, . . .) gm hm lms = = = global memory heap memory local memory stack memories m = (m.n, m.name, m.typ, m.ct) | {z } st(m) m.n : m.name : m.typ : number (Anz. Variablen) ∈ N0 [0 : m.nv − 1] ⇒ Namen (Variablenname) [0 : m.nv − 1] ⇒ [0 : c.nt − 1] {z } | T yp−N r. aus c.tt m.ct |{z} : size(m) = st(gm) : W ert [0 : m·n−1 X size(m.typ(i)) − 1] ⇒ sv i=0 | {z Anz. simple values Pc.nv−1 i=0 size(m.typ[i]) } durch globale V arDF festgelegt Eine Tabelle zu den Beispiel-Deklarationen könnte dann wie folgt aussehen (Typen-Nummern entsprechen wieder dem Beispiel aus der Type Table 5.4.1.1): i 0 .. . .. . .. . 5.4.2.2 Definition: Variable (6=Identifier) V wird spezifiziert durch ein paar (m, i): m i : ∈ memory {0, . . . , m.nv − 1} name i .. . tc 0 .. . u 4 .. . .. . v 5 .. . .. . ct ª 1 ¾ 5 25 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.4.2.3 65 Definition: Wert von Variable (m, i) va(m, i) = m.ctsize(m.typ[i]) ba(m, i) | {z } | {z } V alue ba(m, i) = X Basis−Adr. size(m.typ[j]) j<i Problem: v[1][2] = 7; Ändert 3 g-Variablen: • Matrix v • Vektor v[1] • einzelnes Element v[1][2] 5.4.2.4 Definition: g(eneralized)-Variablen • alle Variablen sind g-Variablen • (m, i)s5 • typ(m, i)s = t[n] ⇒ (m, i)s[j] ist g-Variable typ ((m, i) s[j]) = t (für 0 ≤ j ≤ n − 1) • typ((m, i)s = structn1 : t1 ; . . . ; ns : ts ⇒ (m, i)s.nj ist g-Variable typ((m, i)s.nj ) = ti (für 1 ≤ j ≤ i) Diesen g-Variablen können auch Basis-Adressen und Werte zugeordnet werden: • typ(m, i)s = t[n] ba((m, i)s[j]) = ba((m, i)s) + j · size(t) • typ((m, i)s = structn1 : t1 ; . . . ; ns : ts P ba((m, i)s.nj ) = ba((m, i)s) + k<j size(tk ) • va((m, i)s) = m.ctsize(typ((m,i)s)) (ba((m, i)s)) 5.4.2.5 5 s: Definition: Werte von Pointern selector pointer = (m : a) m a : ∈ memory {0, m.nv − 1} 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.4.2.6 66 Korrektur: Grammatik F uD → T yp |{z} N a (P arF ) V arDF ; rumpf | {z } | {z } f P arameter lok. V ar. {z } | (Funktions-Deklaration) st(lmf ) rumpf → An; return(A) (Funktions-Rumpf) lmf ist der local memory von f (Variablen sind die Parameter und die lokalen Variablen) Ausserdem wird in der Grammatik return aus den Anweisungen entfernt. Neu: • Deklaration lokaler Variablen (vorher vergessen) • Nur eine return-Anweisung am Ende des Rumpfs 5.4.3 Funktions-Deklaration Erweiterung der Konfiguration: c = (nt, tt, gm, hm, lms, nf, f t, . . .) c.nf : c.f t = [0 : c.nf − 1] → {f d|f d : f unction descriptor} (number of functions ∈ N0 ) function table fd f d.name f d.typ f d.st = : : : (f d.name, f d.typ , f d.st f d.rumpf ) Name d. dekl. Funktion Typ d. Funktion Symbol-Table d. Funktion f d.typ ti = ∈ 0≤i≤n−1 i=n : : (t0 , . . . , tn − 1, tn ) [0 : c.nt − 1] {z } | T ypen d. T T c.nf : c.f t = Typ des i-ten Parameters Typ des return-Werts [0 : c.nf − 1] → {f d|f d : f unction descriptor} (number of functions ∈ N0 ) function table 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) lmf .nv = lmf .name[i] = lmf .typ[i] = ⇒ 67 #P ½ arameter + # lokalerV ariablen aus Fn.Def(ParDF) : i < #P arameter aus VarDF für lok. Var. : sonst ½ aus Fn.Def(ParDF) : i < #P arameter aus VarDF für lok. Var. : sonst size(lmf ) dadurch festgelegt 5.4.3.1 Rekursion, Rekursionstiefe Erweiterung der Konfiguration: c = (nt, tt, gm, hm, lms, nf, f t, rd, lms, rds, . . .) c.rd c.lms : : c.rds c.rds[i] : : 5.4.3.2 #call′ s die noch nicht zurückgekehrt sind [0 : c.rd − 1] → {m|m ist lok. mem. lmf für ein f } (local memory stack) return destinations (m : a) m ∈ gm, lm(i) (Basisadresse, an dem return-Wert von rd = i gespeichert wird Heap Memory c = (nt, tt, gm, hm, lms, nf, f t, rd, lms, rds, hm) c.hm 5.4.4 : heap memory speichert Variablen (und g-Variablen) ohne Namen Speicher der C0 -Maschine gm lms(0) .. . lms(c.rd − 1) hm (abstrakter) Stack des Programms 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.5 68 Zusammenfassung der Grammatik < Zi > < ZiF > < Bu > < BuF > < BuZi > < BuZiF > < Na > < N aF > <C> < id > < id > <F > <T > <A> < A − F olge > < Atom > → → → → → → → → → → → → → → → → < BF > < BT > < BA < An > → → → → < AnF > < Dekl > < DeklF > < V aD > < P ar > < P arF > < T ypD > < F uD > → → → → → → → → < rumpf > < eltyp > < typ > → → → < KompD > < KompDF > < programm > → → → 0|1|2|3|4|5|6|7|8|9 < Zi > | < ZiF > < Zi > a|b|c| . . . |x|y|z < Bu > | < BuF >< Bu > < Bu > | < Zi > < BuZi > | < BuZiF >< BuZi > < Bu > | < Bu >< BuZiF > < N a| < N aF >, < N a > < ZiF > < N a > | < C > | < id > . < N a > | < id > [< A >]|∗ < id > |& < id > < V C > |−1 < F > |(< F >) <F >|<T >∗<F >|<T >/<F > <T >|<A>+<T >|<A>−<T > < A > | < A − F olge >, < A > <A>><A>|<A>≥<A>| <A><<A>|<A>≤<A>| < A > == < A > | < A > 6= < A > | 0|1 < Atom > | < BF > |(< BA >) < BF > | < BT > ∧ < BF > < BT > | < BA > ∨ < BT > < id >=< A > < id >=< BA > if < BA > then < An > else < An > if < BA > then < An > while < BA > do < An > {< AnF >} < N a > (< A − F olge >) < id >=< N a > (< A − F olge >) < N a > = new < N a > ∗ < An > | < AnF >; < An > < V aD > | < F nD > | < T ypD > < DeklF > | < DeklF >; < Dekl > < typ >< N aF >; < T yp >< N a > < P ar > | < P arF >, < P ar > typedef < typ >< N a >; < T yp > < N a > (< P arF >) < V arDF >; < rumpf > < An >; return(< A >) int|bool|char|f loag| . . . < eltyp > | < eltyp > [< ZiF >]| < N a > [< ZiF >]| struct{< KompDF >} < N a > | < N a > ∗ < N a > : < eltyp > | < N a > : < N a > < KompD > | < KompDF > < DeklF >; < AnF > (Ziffer) (Ziffernfolge) (Buchstabe) (Buchstabenfolge) (Buchstabe/Ziffer) (Buchstaben-/Ziffernfolge) (Name) (Namens-Folge) (Konstante) (Identifier - früher Variable oder Konstante) (Faktor) (Term) (Ausdruck) (Ausdrucks-Folge) (wie bool’sche Variable) (bool’scher Faktor) (bool’scher Term) (bool’scher Ausdruck) (Zuweisung) (Zuweisung für bool’sche Variablen) (Bedingte Anweisung) (verkürzte bedignte Anweisung) (Schleife) (Anweisungs-Block) (Funktionsaufruf) (Funktionsaufruf mit Rückgabewert) (Allokieren von Speicher) (Anweisungs-Folge) (Deklaration) (Deklarations-Folge) (Variablen-Deklaration) (Parameter) (Parameter-Folge) (Typen-Definition) (Funktions-Deklaration) (Funktions-Rumpf) (elementare Typen) (Typen) (Komponenten-Definition) (Komponenten-Folge) (Programm) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.6 69 Ausdrucksauswertung 3 Funktionen: • addr (Adresse eines Ausdrucks bestimmen): c, Ausdruck → (m : a) • typ (Typ eines Ausdrucks bestimmen): c, Ausdruck → [0 : nt − 1] • va (Wert eines Ausdrucks bestimmen): c, Ausdruck → Ra(typ) 5.6.1 Definition: Bindungsfunktion(c, N a → (m, i)) bind(c, n) = (c.lms[c.rd − 1], i) : (gm, i) : falls ∃i mit c.lms[c.rd − 1].st.name[i] = n falls ∃i mit c.gm.st.name[i] = n 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.6.2 70 Auswertung 1. Konstante: e addr(c, e) typ(c, e) va(c, e) =<C > = undef iniert = c.env.tt[x] = < e >10 (x = b int) 2. Variable: e = < N a > Sei bind(c, < N a >) = (m : i) addr(c, e) typ(c, e) va(c, e) = = = (m : ba(m, i)) (m, i) va(m, i) 3. Arrayzugriff: e = < id > [< A >] addr(c, e) = (m : (a + j · size(t))) typ(c, e) = t va(c, e) = va(< id >)size(t) (j · size(t)) 4. Strukturen: e = < id > . < N a > Sei addr(c, < id >) = (m : a) typ(c, < id >) = struct{n1 : t1 , . . . , ns : ts } < N a > = ni (Wir greifen auf die i-te Komponente zu addr(c, e) typ(c, e) va(c, e) = = = Pi−1 (m : (a + j=1 size(tj ))) ti Pi−1 va(< id >)size(t) ( j=1 size(tj )) 5. Dereferenzierung: e = ∗ < id > Sei va(c, < id >)[0] = (m : a) typ(c, < id >) = ptr(t) addr(c, e) typ(c, e) va(c, e) = = = (m : a) t m.ctsize(t) (a) 6. adress-of Operator: e = & < id > Sei addr(c, < id >) = (m : a) typ(c, < id >) = t addr(c, e) typ(c, e) va(c, e) = = = undef iniert ptr(t) (m : a) 7. arithmetische/boole’sche Ausdrücke: e = < A > + < T > addr(c, e) = undef iniert typ(c, e) = typ(c, < A >) va(c, e) = va(c, < A <)[0] + va(c, < T >)[0] mod 232 (Achtung bei bool’schen Vergleichsoperatoren!) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.7 71 Ausführung von Anweisungen Definition: next − state Funktion (delta : Konf → Konf ) Berechnet Nachfolgekonfigurationen, delta führt die erste Anweisung vom Programmrest aus: Fallunterscheidung nach der ersten Anweisung in c.prog, r sei der Rest des Programms: 1. Zuweisung: c.prog = < id >=< A >; r / c.prog = < id >=< BA >; r Sei typ(c, < id > = typ(c, < A >) = t ∈ sv ⇒ size(t) = 1 addr(c, < id >) = (m : a) delta(c).m.ct[i] = delta(c).prog = ½ va(c, < A >)[0] : c.m.ct[i] : falls i = a falls i 6= a r 2. if-Anweisung: c.prog½ = if < BA > then < An1 > else < An2 >; r < An1 >; r falls va(c, < BA >) = 1 delta(c).prog = < An2 >; r falls va(c, < BA >) = 0 3. while-Schleife: c.prog ½ = while < BA > do < An >; r < An >; while < BA > do < An >; r delta(c).prog = r falls va(c, < BA >) = 1 falls va(c, < BA >) = 0 4. Speicherallokierung: c.prog = < N a >= new ∗ < T yp >; r Sei t : Typnummer von < T yp > typ(c, < N a >) = ptr(t) addr(c, < N a >) = (m : a) delta(c).hm.n delta(c).hm.typ[c.hm.n] = = delta(c).m.ct[i] = delta(c).prog = c.hm.n + 1 t½ (c.hm : size(c.hm)) c.m.ct r 5. Funktionsaufrufe: c.prog = < id >=< N a > (< AF >); r Sei pi addr(c, < id >) c.f t[j].name typ(c, pi ) typ(c, < id >) falls i = a falls i 6= a : = = = = i-ter Parameter des Funktionsaufrufs (m : a) < Na > c.f t[j].typ[i] c.f t[j].typ[n] | {z } Anz. d. P aram. delta(c).rd delta(c).lms[c.rd].st = = c.rd + 1 c.f t[j].st delta(c).lms[c.rd]size(typ(pk )) (ba(c.lms[c.rd], k ) {z } | = va(c, pk ) delta(c).prog = delta(c).rds[c.rd − 1] = c.f t[j].body; r (j-te Fn. der Funktions-Tabelle) (m : a) ∀k<n: (m,i) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.8 72 Compilieren C0 -Maschine: Konfiguration: insbesondere: c = (nt, tt, gm, hm, lms, nf, f t, rd, lms, rds, hm, prog) c.prog Programmrest (< AnF >) Startkonfiguration von C0 : c.prog = c.f t[0].body Funktionen: Anzahl: spezifiziert in: body’s: c.nf c.f t[0 : c.nf − 1] c.f t[j].body j = 0, . . . , c.nf − 1 Ableitungsbäume: c.ft[ j ].body Tj → „Wald“: T0 , . . . , Tc.nf −1 = T von Ableitungsbäumen. 5.8.1 Compiler → → Der Compiler erzeugt aus T ein DLX0 -Programm: code( T ): Vorgehensweise (vor dem Compilieren): 1. Erzeugen der Symboltabellen für die Funktionen (aus Deklarations-Teil und Parameter-Listen) 2. Erzeugen der Typtable (aus dem Typ-Deklarations-Teil) 3. Erzeugen der Funktionstabelle (aus dem Funktions-Deklarations-Teil) Vorgehensweise (Compilieren in 2 Phasen): 1. Bäume Tj getrennt übersetzen → code(Tj ) allerdings sind einige Sprungweiten noch offen: code(T0 ) ... code(Ti ) ... code(Tj ) ... code(Tc.nf −1 ) Sei in code(Ti ) ein Aufruf von c.f t[j]: Rücksprung: geht mit jal Vorsprung: es fehlt im Allgemeinen die Distanz (wenn die Funktion nach der gerade übersetzten Funktion 2. nicht aufgelöste Distanzen einsetzen 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.8.2 73 Übersetzen der Bäume Ebenfalls in 2 Phasen: e B id A AnF An AnF 1. code(e) erzeugen, für e: Ausdruck A Bedingung B Identifier id 2. code(q) erzeugen, für alle q: An, AnF Ausdrücke: Beispiel: e = x x: Name (einer Variable) steht irgendwo im Speicher d.m einer DLX0 -Maschine in der Konfiguration d = (d.P C, d.GP R, d.m) Ansatz: Wir codieren (auf ziemlich einfache Weise) die memories c.gm, c.lms[i] und c.hm im Speicher der DLX0 Maschine. 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 74 C0 -Maschine: i 0 gm ր → ց j typ el t′ (n) ct : [0 : size(gm) − 1] → sv .. . gm.nv − 1 lms(0) .. . lms(c.rd − 1) hm • size(gm) = Pgm.nv − 1 i=0 size(g.typ[i]) • Der Compiler kann size(gm) berechnent • Der Compiler kann size(lmf ) (für alle deklarierten Funktionen) berechnen n − t′ 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9 75 Codierung von C0 -Konfigurationen in DLX0 -Konfigurationen Ausdrücke: F1 = c.f t[i] | {z } i−te deklarierte F n. Funktions-Stack: SBASE FS Funktions-Frame F0 Funktions-Frame Frd-1 Funktions-Frame Base(F0) Base(Frd-1) gespeichert in GPR[30] Abbildung 44: Funktions-Stack 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 76 Fi codiert lms[i].ct und 3 Wörter mit Zusatzinformationen: Base(Fi) Fi.ra 1 Fi.rds 1 base(Fi-1) 1 lms[i].ct[0:size(lms[i])-1] size(lms[i]) Abbildung 45: Funktions-Frame Base(Fi ) Basisadresse von Frame i im DLX0 -Speicher d.m (i.A. erst zur Laufzeit bekannt) Fi .ra Rücksprungadresse (beim Aufruf mit jal berechnet und hier gespeichert) Fi .rds Ziel für Rückgabewert (hier wird das Ergebnis der Funktion gespeichert) Base(Fi−1 ) Zeigt auf Fi−1 (wird bei Rücksprung aus Fi in GP R[30] geschrieben) Wenn es gelingt diese Planung während der Laufzeit des übersetzten Programms einzuhalten (Induktionsbewes über die Laufzeit), dann kann man zu Laufzeit auf Werte von Variablen im gm (relativ zu SBASE) und im lms[rd − 1] zugreifen (relativ zu GP R[30]) Detail: (m′ , i) = x Variable der C0 -Maschine m′ ∈ gm, lms[rd − 1] | {z } ltop 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 77 Wo steht der Wert von va(c, x) in c.m′ .ct? c.m'.ct 0 1 Displacement* i va(m',i) size(m'.typ[i]) *Displacement: displ(i, m′ ) = X size(m′ .typ[j]) j<i = displ(i, f ) Sei ⇒ m′ m′′ displ(i, m′ ) = = = lms[a] zu Funktion f lms[b] zu Funktion f dipl(i, m′′ ) Das Displacement displ(i, f ) (zur Compile-Zeit bekannt!) hängt nur davon ab, zu welcher Funktion f das lms[a] gehört. Sei y m adr(c, y) : : = Name memory zu f (m : ba(m, i)) | {z } displ(i,f ) typ(c, y) va(c, y) : : simple va(m,i) C0 -Semantik DLX0 -Code lädt va(m, i) = va(c, y) in GP R[u] lokal (aus rd) GP R[u] = m[GP R[30] + displ(i, f ) + 3] global (aus gm) GP R[u] = m[SBASE + displ(i, f ) ] 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.1 78 Definition: Compiler - Korrektheit Der Compiler ist korrekt falls: ∀ Rechnungen C 1 , C 2 , ..., mit Programm P ∀ Rechnungen d1 , d2 , ..., ds(i) , ..., mit code(P ) ∃S : N → N Schrittzahlen : ∀i : ds(i) kodiert C i . C0-Konfiguration DLX - Konfiguration gm GM lms(i) F i Frames zu Funktion Fji lms(rd-1) topl C0 - Konfiguration x=(m,i) Variable von C −→ Wo steht va(C, x) in d.m x=(m,i) g - Variable von C DLX m C x=(m’,i),s abase(C,x) size type(x) Gewünscht: ∀x : typ(x) - elementar: va(C, x) = d.m(abase(C, x)) e-Konsistenz e − consis(C, abase, d) 5.9.2 Definition: abase Frames base(C, GM ) = sbase base(C, F0 ) = sbase + size(GM ) base(C, Fi+1 ) = base(C, Fi ) + size(Fi ) | {z } 3+size(fji ) Bemerkung: fji erst zum Compilerzeit bekannt. Variablen (m′ , j) abase(C, (m′ , j)) = base(C, m) e + displ(j, m′ ) +3 {z } | base(j,m′ ) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) ( Fi m e = GM 79 m′ = lms(i) m′ = gm Namen n abase(C, n) = abase(C, bind(C, n)) | {z } Variable ( (C.topl, i) (1) C.topl.name(i) = n bind(C, n) = (C.gm, i) ∼ (1) ∧ gm.name(i) = n g-Variable und Identifier e = (m, i)s abase(C, e[i]) abase(C, e.n) = abase(C, e) + i.size(typ(C, e)) X = abase(C, e) + (typ(C, tj )) j<i ∗ abase(C, C.e ) später bei code(u = new t∗ ) definieren . typ(C, x) = t∗ va(C, x) = (m′ : a) m m’. ct a gv((m’:a),t) x d.m abase(C,x) abase(C,gv((m’:a),t) (m′ : a) Basisadrese einer g-Variable (gv((m : a), t)) d - Speicher abase(C, x) abase(C, gv((m′ : a), t)) (m′ : a) = va(C, x) p − consis(C, abase, d) : ∀x : typ(C, x) = t∗ : d.m(abase(C, x)) = abase(C, gv(va(C, x), t)) d kodiert C consis(C, abase, d) ↔ e − consis( · · · ) · · · ∧ p − consis( · · · ) · · · ∧ r······∧ c······ Notation: g - Ausdruck : A, B, id Ableitungsbaum von f , Funktion in P 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) u v u : g Ausdrücke v : AnF, An • g - Ausdrücke compilieren. • Auswertung: entlang den Knoten des Baums, von Blättern zur Wurzel. 5.9.3 Beispiel e= a1 + a2+a3 + a4 + . . . + a40 • Wahl bei Reihenfolge • beeinflüßt die Anzahl der benötigten Register. 5.9.4 Exkurs: Aho-Ullmann-Algorithmus Spiel auf DAG’s (Directed Acyclic Graphs) hier: Bäume Spielzüge: Marken (engl. pebbles) auf Knoten setzen oder entfernen. 80 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 81 Regeln: 1. u Quelle oder 2. 3. Ziel: Jede Senke hat irgendwann eine Marke. Minimiere die Anzahl der Marken gleichzeitig auf dem Graphen. τ (n) = min{ x| jeder Baum mit n inneren Knoten und mit indegree = 2 kann mit x Marken markiert werden} 5.9.5 Satz: Ahu-Ullmann τ (n) ≤ ⌈log n⌉ + 2 Beweis: Induktion über n. I.A n = 1 oder I.S n − 1 → n T Baum mit n Knoten, w Wurzel. 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) Fall 1: T’ T’: n-1 Knoten w • Markiere T ′ • Nur die Marke auf w’ halten • Markiere w τ (n) ≤ max{τ (n − 1), 2} ≤ max{⌈log(n − 1)⌉ + 2, 2} ≤ ⌈log(n − 1)⌉ + 2 ≤ ⌈log n⌉ + 2 Fall 2 T1 T2 w1 w 2 w OBdA : 2 ≤ T2 ≤ n 2 • Markiere T1 • Lasse Marke auf w1 • Markiere T2 • Lasse Marke auf w2 • Markiere w τ (n) n ≤ max{τ (n − 1), 1 + τ ( ), 2} 2 n ≤ max{⌈log(n − 1)⌉ + 2, 1 + ⌈log( )⌉ + 2, 2} 2 ≤ max{⌈log(n − 1)⌉ + 2, ⌈log n⌉ − 1 + 1 + 2, 2} ≤ ⌈logn⌉ 82 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.6 83 g-Ausdrucksübersetzung Ableitungs-Baum: u j T Es gelte: e − consis(c, abase, d) p − consis(c, abase, d) (r − consis(. . .)) ∀ i: Aus Move mi generiere ecode(i), so dass: • starte DLX0 in Konfiguration d • sei d(i) Konfiguration, die nach Abarbeitung von E(i) = code(e1 ) . . . code(ci ) erreicht wird • d →∗E(i) d(i) ∀ j (Marken), ∀ u (Knoten, g-Ausdrücke in T ), so dass nach Zug mi Knoten u Marke j hat. Induktionsbehauptung: : R(u) = 1, typ(c, m) 6= ptr(t) va(c, u) abase(c, u) : R(u) = 0 d(i).GP R[j] = abase(c, gv(va(c, u), t) : R(u) = 1, typ(c, m) = ptr(t) 5.9.6.1 Annotation des Ableitungs-Baums T mit Prädikat R Left: x |{z} abase = Right: x + z + 2 {z } | va Definiere rekursiv von der Wurzel zu den Blättern: R(u) = 1 R(u) = 0 = = berechne va(. . .) berechne abase(. . .) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 84 e An AnF return Vorkommen von g-Ausdrücken: R(e) Typ 0 Zuweisung (links) e = ... 1 Zuweisung (rechts) ... = e 1 Parameter f (. . . , e, . . .) 0 Funktionsaufruf (links) e = f (. . .) 1 Bedingung if e . . . while e . . . rumpf(f) Induktionsschritt: Wurzel → Blätter: v w u = v◦w u u = v◦w u = v[w] u = v.n u = &v ecode(ui ) : remove(j) mi setzt Marke k auf Knoten u : kein code : sonst ◦ ∈ +, −2 , ·, /, ∧, ∨ R(v) = R(w) = 1 ◦ ∈ −1 , ∼ R(w) = 1 R(v) = 0 R(v) = 0 R(v) = R(u) (?) R(v) = 0 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.6.2 Ausdrücksübersetzung 85 Fälle: 1. u Konstante u ∈ {0, 1}32 ecode(mi ): 2 DLX0 -Instruktionen GP R[k] := u 2. u Name bi (c, u) = (Übung!) (gm, j) (topl, j) : u nicht lokal → abase(c, u) = SBASE + displ(j, gm) : u lokal → abase(c, u) = base(Frd−1 ) +displ(j, gm) | {z } GP R[30] (f : Funktion deren Rumpf gerade übersetzt wird) ecode(mi ) : R(u) = 0 u nicht lokal: u nicht lokal: GP R[k] := SBASE + displ(j, m) | {z } 2 Instruktionen u lokal: GP R[k] := GP R[30] + displ(j, f ) {z } | 1 × add.imm R(u) = 1: zusätzlich GP R[k] dereferenzieren GP R[k] := m[GP R[k] + 0] {z } | load Korrektheit: R(0) : u lokal d(i).GP R[k] = c.GP R[30] + displ(j, f ) (Lemma: c.GP R[30] = d(i).GP R[30]) = base(Fc.rd − 1 ) + displ(j, f ) (r − consis(c, abase, d)) = base(bind(c, u)) ( Def.: bind) = abase(c, u) (Def.: abase(c, N ame)) (triviales Nachrechnen) R(1) : d′ (i) nach einem weiteren Schritt d′ (i).GP R[k] = = = d.m[d(i).GP R[k]] d.m[abase(c, m)] va(c, m) (e − consis(. . .)) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 86 3. u = v ◦ w v a b w (a) v u (b) w u k Induktions-Vorraussetzung (i − 1): d(i − 1).GP R[a] = d(i − 1).GP R[b] = va(c, v) va(c, w) Code: GP R[k] := GP R[a] ◦ GP R[b] Korrektheit: = d(i).GP R[k] d(i − 1).GP R[a] ◦ d(i − 1).GP R[b] ((DLX0 -Semantik) = va(c, v) ◦ va(c, w) = va(c, v ◦ w) ((C0 -Semantik) 4. u = v[w] v a b w u k Induktions-Vorraussetzung (i − 1): d(i − 1).GP R[a] d(i − 1).GP R[b] typ(c, v) abase(c, v[w]) = = = = abase(c, v) va(c, w) t abase(c, v) + va(c, w) · size(typ(c, v)) Code: GP R[28] := GP R[b] · size(typ(c, v)) | {z } buing: M ult.−Alg. GP R[k] := R(u) = 0 R(u) = 1 : : Korrektheit: (Übung) GP R[a] + GP R[28] f ertig deref erenzieren 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5. u = v.n (Übung!) 6. u = v∗ v a u k R(u) = 0: GP R[k] := GP R[a] R(u) = 0: zusätzlich dereferenzieren 7. u = &v GP R[k] := GP R[a] (?) 87 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.7 88 r-Konsistenz Zur Veranschaulichung, siehe Funktions-Stack (Abb. 44, Seite 75) und Funktions-Frame (Abb. 45, Seite 76). d : F unktions − Stack r − consis(c, , d) SBASE Variablen mit Namen base(H) Variablen ohne Namen Amax GPR[29]: heap pointer Abbildung 46: Heap und Stack im DLX0 -Memory base(H) = min{ abase(hm, j) |j < c.hm.nv} {z } | C0 -Variable im Heap d.GP R[30] d.GP R[29] = = base(c, Fc.rd−1 ) base(c.H) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.8 c-Konsistenz d : F unktions − Stack c − consis(c, d) q : An, AnF in Funktion f ↓ code(f ) : Folge von DLX0 -Anweisungen Sei start(s) Folge von DLX0 -Anweisungen 1. Adresse, die von code(s) belegt ist s : start( code(q) ) code(q) f irst(q) = ½ l( code(q) ) q erste Anweisung von q : falls q < An > : falls q < AnF > c.pr : Folge der noch auszuführenden C0 -Anweisungen f irst(c.pr) ↓ code(f irst(c.pr)) : erste dieser Anweisungen : übersetzte erste Anweisung start(code(first(c.pr))) = d.PC 89 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.9 Satz Zu C0 -Rechnung c1 , c2 , . . . ∃ DLX0 -Rechnung ∃ Funktionen ∃ Schrittzahlen d 1 , d2 , . . . alloc1 , alloc2 , . . . s(1), s(2), . . . so daß ∀ Schritte i der C0 -Maschine consis(ci , alloci , ds(i) Beweis: Mit Ausnahme von c − consis(. . .) einfaches Ausrechnen 5.9.10 Pre-Order-Traversal Reihenfolge der Erzeugung der code(u): Pre-Order-Traversal u return T P OT (T ) rumpf : : Baum pre-order-traversal von T (Permutationen der Knoten von T ) Definition (rekursiv): 1. T = u 2. T = T1 . . . Ts = u : : P OT (T ) = u P OT (T ) = P OT (T1 ), . . . , P OT (Ts ), u Beispiel: 6 7 9 10 5 8 4 2 3 1 P OT (T ) = 4, 6, 7, 5, 2, 9, 10, 8, 3, 1 90 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 5.9.11 Code-Generierung Fälle: 1. Zuweisung q : e = e′ code(e) code(e′ ) • R(e) = 0 • Ergebnis in GP R[i] • Marke j nicht verwenden ⇔ GP R[j] nicht überschieben • Ergebnis in GP R[k] m(GP R[j] + 0) = GP R[k] store Korrektheit: leicht ( mit Ausname von c − consis e − consis p − consis r − consis c − consis 2. Speicherallozierung q : new t∗ U abase(C,u) new GPR[29] GP R[29] := GP R[29] − size(t) code(u) • R(u) = 0 • Ergebnis in GP R[j] Heap größer 91 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 92 • Adresse des Pointers in GP R[j] • Pointer setzen: m(GP R[j] := GP R[29] 3. Anweisungsfolge q : AnF ; An T1 T2 ; q’ q’’ q = q ′ ; q ′′ q q′ q ′′ • code(q) = code(q ′ ); code(q ′′ ) - : : AnF An automatisch bei POT. 4. If - Anweisung q : if a then b1 else b2 Übung 5. While - Schleife q : while e do u code(e) 1 code(v) beqz j code(e) • Ergebnis in GP R[k] • beqz P C := P C + GP R[k]?l(code(u) + 2) : 1 • l(code(u)) - bekannt (POT) code(u) • j P C := P C − (l(code(u)) + l(code(e)) + 1) 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) 93 6. call q : e0 = g(e1 , · · · , ek ) in Rumpf(f) Werte in Pass 1 offen jal code(f)... code(q’) code(g) p1 , · · · , pt - Parameter von g F c.rd-1 zu f ra rds F i-1 p GPR[30] p 1 F \delta(c).rd-1 zu g t p(code(i)) : übergibt Parameter (i) p(code(1)), · · · , p(code(t)) ecode(Ri )) p(code(i)) • R(ei ) = 1 • Ergebnis in GP R[ji] • m(GP R[30] + (size lmf + 3) + 3 + i − 1) := GP R[ji] rds ecode(e0 ) • R(e0 ) = 0 • Ergebnis in GP R[j] • m(GP R[30] + (size( ) + 3 + 1) := GP R[j] altes GP R retten • m(GP R[30] + (size( ) + 3 + 2) := GP R[30] stack Pointer auf neuen Top Frame. • m(GP R[30] := GP R[30] + size( ) + 3 5 COMPILER FÜR C0 (PASCAL MIT C-SYNTAX) • bis hierher : code(q ′ ) • m(GP R[1] := start(code(g)) bekannt nach Pass 1 jal: • P C := P C + 1, GP R[31] := P C • GP R[31] := GP R[31] + 6 • m(GP R[30] := GP R[31] - Rückgabeadresse • GP R[1] := start(code(g)) - Pass 2 • P C := GP R[1] - Sprung in g 7. return Übung 94 6 ERWEITERUNGEN ZUR DLX0 95 6 Erweiterungen zur DLX0 6.1 DLX0 mit Interrupts 6.1.1 Definition: Interrupt Ereignis, das den „normalen“ Programmablauf unterbricht, stattdessen: Aufruf einer Interrupt Service Routine (ISR). 6.1.2 Grober Ablauf 1. Interrupt wird ausgelöst 2. CPU speichert: • Teile des aktuellen Programmzustandes (v.a. P C) • Quelle/Grund des Interrupts 3. Behandlung des Interrupts: ISR 4. Meistens: Wiederherstellung des Zustands vor/bei Interrupts (teils Hardware, teils Software) 6.1.3 Klassifikation Unterscheidungsmerkmale von Interrupts: 1. interner/externer Interrupt • interner Interrupt (exception, trap) Ausgelöst durch Prozessor oder Memory. • externe Interrupt Quelle ausßerhalb von CPU oder Memory (z.B. ein Gerätertreiber). Nicht deterministisch - Zeitpunkt des Auftretens ist nicht vorhersehbar. 2. (nicht) maskierbar maskierbare Interrupts können per Software ignoriert bzw. abgeschaltet werden. 6 ERWEITERUNGEN ZUR DLX0 96 3. Return Type Sei I die unterbrochene Funktion: • „repeat“: nach ISR wird I ausgeführt • „continue“: nach ISW wird I ′ (die Instruktionsfolge von I, die ohne Interrupt aufgetreten wäre) • „abort“: weder mit I noch mit I ′ weitermachen 4. Priorität Falls zwei Interrupts zeitgleich auftreten wird der Interrupt mit der höchsten Dringlichkeit zuerst behandelt 6.1.4 Interrupts des DLX0 Identifiziere Interrupts mit Nummer j ∈ {0, . . . , 31} j → P rioritt 0: dringend .. . 31: nicht so dringend j 0 1 2 3 4 5 6 6+i | {z } i∈{1,...,25} Abkürzung Name Return-Type reset Reset/Power-Up abort ill Illegal Instruction abort → RA1 pf f Page Fault Fetch repeat pf ls Page Fault Load/Store repeat trap Trap (SW-Interrupt) continue (→ leitet System-Call-routine des OS ein) ovf arithmetic overflow continue/abort exi External I/O continue Maskierbar nein nein Ext/Int ext int nein nein nein int (Mem) int (Mem) int ja ja int ext 6 ERWEITERUNGEN ZUR DLX0 6.1.5 97 Konfiguration / Register c = (pc, spr, gpr, mem) c.pc : {0, 1}32 c.spr : {0, 1}5 → {0, 1}32 c.gpr : {0, 1}5 → {0, 1}32 c.mem : {0, 1}32 → {0, 1}32 PC addr ev[0] SPR data Mem ev[6+i] ev[3] ev[4] GPR ev[0] ev[1] ev[2] ev[5] . . . Abbildung 47: Special Purpose Register Derzeit werden nur SP R′ s benutzt: SP R[0] SP R[1] SP R[2] SP R[3] (4 SP R[5] ∼ ∼ ∼ ∼ → ∼ SR ESR EP R RA1) Edata (Status Register) (Exception Status Register) (Exception Cause Register) (Exception Program Counter) (Exception Data) Berechnung : I I I 3 2 1 ... C2 → C1 → C0 → C 0 Startkonf iguration δ Schrittf unktion (!)statt δ(f r DLX0 ) schreibe nun δn 6.1.6 Definition: δ für DLX0 mit Interrupts δ(c) = ½ δn (c) (plus einige neue Instruktionen) C ′ (neu - siehe unten) falls kein Interrupt sonst 6 ERWEITERUNGEN ZUR DLX0 6.1.7 98 Neue Instruktionen Zur Erinnerung: RS1 = I[25 : 20] RD = I[15 : 11] SA = I[10 : 6] T yp R R R R I I I I 6.1.8 I[31 : 26] 000000 000000 000000 000000 010000 010010 111110 111111 I[5 : 0] 010000 010001 000000 000010 % % % % Mnemonic movsli movi2s add sub addi subi trap rfe Effekt GP R[RD] = SP R[SA] SP R[SA] = GP R[RD] wie addu wie subu wie addiu wie subiu löst trap aus SR = ESR , P C = EP C Interrupts Eventsignale für interne Interrupts: ev[1] = 1 ⇔ I = mem(P C) I keine bekannte Instruktion ev[1] = (add(I) ∨ sub(I) ∨ . . .) | {z } f r alle Instruktionen ev[3] = 1 ev[4] = 1 ev[5] = 1 ev[6] = 1 ⇔ ⇔ nchste V orlesung! nchste V orlesung! trap(I) (add(I) ∨ sub(I) ∨ addi(I) ∨ subi(I)) ∧ ovf (Overflow-Signal aus ALU) Wie bereits erwähnt: ev[1] und ev[6 + i] extern! 6.1.9 Definition: nicht sichtbar Masked Cause Register (MCR): M CA[j] = ½ falls j nicht maskierbar ist sonst ev[j] SR[j] ∧ ev[j] (!) SR[j] bestimmt ob maskierbarer Interrupt auftreten kann. 6.1.10 Definition: JISR-Signal (Jump ISR) JISR = _ M CA[j] j 6.1.11 Definition: Interrupt Level il = min{j|M CA[j] = 1} 6 ERWEITERUNGEN ZUR DLX0 6.1.12 6.1.13 99 Delta-Funktion δ(c) = c′ falls JISR = 1, wobei für c′ gilt: ESR ECR = = EP C = Edata = SR PC = = SR M ½ CR PC falls Interrupt il vom Typ „repeat“ u P C ∗ sonst ½ imm falls trap(I) EA falls lw(I) oder sw(I) 032 SISR Start der ISR (Konstante, z.B. 512) Aufbau der ISR Mem SISR(=512) SAVE DISPATCH RESTORE H[1] H[31] Abbildung 48: Interrupt Service Routine (Aufbau) Ablauf: SAV E DISP AT CH H[il] REST ORE H[0] - sichere Register ermittle il aus ECR (find first one comp) Handler für Interrupt il Register wiederherstellen, rf e zum Beenden der ISR benutzen Sonderbehandlug für reset 6 ERWEITERUNGEN ZUR DLX0 6.1.14 100 Devices & I/O (Geräte & E/A) CPU Mem Dev1 Devl addr data control (read/write) Abbildung 49: Bus-System CP U : „Bus Master“, add und control werden nur durch die CPU gesteuert. data : Kann von allen benutzt werden, sollte aber nur von höchstens einer Komponente gleichzeitig benutzt werden. Seien: k ∈ N, 2k−1 < l < 2k m ∈ N, m + k < 2k Idee: Gerät 1 ≤ u ≤ l, < i[k − l : 0] > = i Gerät über Adressen a[31 : 0] ansprechen mit: a[31 : 32 − m] = 1m a[31 − m : 32 − m − k] = i[k + 1 : 0] 6 ERWEITERUNGEN ZUR DLX0 6.1.15 101 Beispiel: Hard Disk (HD) Festplatte mit Geräteadresse < i[k − 1 : 0] > = i: Abbildung 50: Festplatte • Daten werden abgelekt in Sektoren (zu je 512 Bytes) • Sektoren haben Koordinaten: „c“ylinder: Abstand vom Zentrum „h“ead: „Etage“ (einzelne Platten) „s“ector: Sektor des durch (c, h) bestimmten Kreises Die Festplatte rechnet dies um in die lba (linear block adress): lba ∈ {0, 1}28 : Festplattengröße ≤ 29 × 228 bytes = 128 GB 32 0 Mem devbase1 devbase2 Dev1 Dev2 devbasel Devl Abbildung 51: Devbase 6 ERWEITERUNGEN ZUR DLX0 102 Ab Adresse devbasei = 1k i[k − 1 : 0] 032−m−k blendet die Festplatte Register ein: busy error cmd lba count ien data 6.1.15.1 = = = = = = = = 031 1 031 1 032 031 1 (HD beschäftigt) (letztes Kommando lieferte Fehler) (READ) (WRITE) #Sektor (Festplatte löst Interrupt aus) (32-bit Daten, Read/Write) Lesezugriffe 1. CPU setzt (sw′ ), lba, count 2. CPU setzt cmd = 032 3. HD setzt busy 6= 032 solange sie liest 4. CPU wartet bis busy = 032 (*) 5. CPU prüft error 6= 032 → Fehler, Abbruch 6. CPU liest 128 Wörter (= b 512 Bytes) vom Data Register (**) 7. Schon count Sektoren gelesen? (Nein: → wieder zu Schritt 3) (*) (**) Polling Kopieren ¾ „stupide“ Arbeit f ür die CP U Um die CPU von dieser Arbeit zu entlasten gibt es folgende Möglichkeiten: (*): ien6= 032 → HD löst externen Interrupt exi aus, falls non-busy (**): DMA(direct memory access) → HD kann selbst von/in Memory lesen/schreiben 6.2 Virtueller Speicher(VM) 6.2.1 Motivation RAM ist teuer, dagegen sind Festplatten billig. Es stellt sich also die Frage, ob es möglich ist, mit wenig RAM und einer Festplatte viel RAM zu simulieren (eine voll ausgestatteter DLX0 kann 232 × 4 Bytes = 16 GB adressieren!). Ziel zunächst: Simulation für ein Programm (user-program) Lösung: „Demand Paging“ • lade Teile des Speichers von HD nach, wenn gebraucht • Page: 4KB zusammenhängender Speicher (1024 Worte) • Paging: Pages auf Festplatte speichern bzw. von Festplatte laden 6 ERWEITERUNGEN ZUR DLX0 6.2.2 103 Vergleich zweier Maschinen (die alte) DLX0 : • keine Interrupts • keine Devices • keine SPR’s • memsize ∈ {0, 1}32 : Größe von Mem, nur Zugriffe auf Adressen a ∈ {0, 1}32 mit < a > < < memsize > „erlaubt“ (die neue) DLX0 : • mit Interrupts • mit Devices • mit SPR’s • memsize • Modes & Adress Translation 6.2.3 DLX0 mit Interrupts & Adress Translation Konfiguration: c = (pc, spr, gpr, pm6 , sm7 : {0, 1}32 → {0, 1}32 ) neue SPR’s: 9 10 11 16 pto ptl Emode Mode page-table origin page-table last exception mode mode-flag: 031 1 : user − mode 032 : system − mode Im user-mode (aufgrund einer Page-Table im PM): • leite Speicherzugriff auf Adresse va ∈ {0, 1}32 um auf Adresse pa ∈ {0, 1}32 im PM ODER • löse Interrupt aus (Page Fault - ev[3]/ev[4]), → ISR, Page Fault Handler wird ausgeführt 6 physical 7 swap memory (altes Mem) memory(zusammenhängender Bereich auf HD) 6 ERWEITERUNGEN ZUR DLX0 6.2.4 104 Page Table Lookup va[31 : 0] = (px[21 : 0], wx[9 : 0]) wx px word index page index à à P T (px) | {z } = PM [ptea] | {z } Page Table Entry Page Table Address = hpteai hpto[21 : 0]i.1024 + hpxi 31 9 8 ppx[21:0] v Physical Page Index valid Bit ( mod 232 ) 7 0 Abkürzung : ppx(va), v(va) px[21:0] 10 (pto[21:0],0 ) 22 32 + 10 (pto[21:0],0 ) ppx v ..... PT 6.2.5 Page Fault Exception pf (va) = ∨ (hpx(va)i > hptli) (v(va) = 0) pma(va) = (ppx(va), wx(va)) ∈ {0, 1}32 | {z } | {z } 22 Bit 10 Bit wx[9:0] 6 ERWEITERUNGEN ZUR DLX0 6.2.6 105 Instruktionsausführung 1. mode = 0 : alles wie vorher 2. mode = 1 : "usermode" (a) pf (P C) = 1? → löse pf f Interrupt aus (ev[3]) (b) I = P M [pma(P C)] • ∼ (lw(I) ∨ sw(I)) - wie vorher • pf a(EA) = 1? → löse pf ls Interrupt aus (ev[4]) • lade /speichere von pma(EA) Was passiert bei Interrupt? JISR = 1 ESR ECA = = EPC = EData = PC SR MODE = = = SR MCA ( PC PC n (Masken) (Quelle) typ − repeat typ − continue PC n = PC vor δu (C) ( imm bei Trap EA bei load/store SISR 032 032 (start ISR) EMODE=MODE 6 ERWEITERUNGEN ZUR DLX0 6.2.7 106 Simulation Cv0 0 C0 mode C0 Cα Cβ I1 I2 v → Cv1 v → ··· ··· → 0 C1 → ··· ··· → → → ··· ··· ··· → → → C α−1 Intializierung, Power-up C β−1 User Programm C γ−1 Page Fault Handler Berechnung derDLX0 ohne Interrupts v steht für virtuell → 0 C α−1 → 1 Cα → ··· ··· User Programm und PFH wechseln sich ab. Cv C = = (pcv , gprv , mem) (pc, spr, gpr, pm, sm) π : C → Cv π bildet C-Konfiguration auf Cv -Konfiguration ab. (mode = 1) : mem(va) = 6.2.8 gprv (i) = gpr(i) pcv = pc ( P M [pma(va)] SM [sma(va)] falls pf = 0 sonst Theorem i - Schritt in der Berechnung von DLX0 mit Interrupts. ∼ (pf f i ∨ pf lsi ) - kein page fault fetch, kein page fault lode/store ∼(JISR) modei = 031 1 j - Schritt in der Berechnung von DLXv . π(C i ) = Cvj ⇒ π(C i+1 ) = Cvj+1 → 1 C β−1 → 0 Cβ ··· ··· 7 BETRIEBSSYSTEM-KERN 107 7 Betriebssystem-Kern • abstraktes Modell: CVM (communicating virtual machines) k abstrakter Kern (syntaktisches C0 -Programm) • Implementierung: konkreter Kern (zwangsläufig nicht C0 ): ¾ Benutzerprozesse müssen sichtbar sein Prozessorregister C0A : C0 + Assembler-Makros • Simulationssatz: K + Benutzerprogramme auf physikalischer Maschine simulieren k + Benutzerprogramme vom CVM-Modell 7.1 CVM: Syntax und Semantik Konfigurationen: c = (c.np, c.C, c.vm(p), c.cp) c.np : number of processes (c.np ∈ N) (c.np = 1024) prozess 1: abstrakter Kern, C0 -Maschine c.C : Konfiguration der C0 -Maschine prozess 2: Benutzer-Prozesse (virtuelle DLX0 -Maschinen) c.vm(p) : Konfiguration der virtuellen DLX0 -Maschinen (p = 1, . . . , c.np − 1) c.cp : current process (p ∈ {0, . . . , c.np − 1}) tvm : total virtual memory [Bytes] c.vm(p).ptl : # Pages (je 4K) von der virtuellen Maschine p > 0 (4 GB) 7 BETRIEBSSYSTEM-KERN 108 Kern k vm(1) vm(p) vm(np-1) Abbildung 52: Communicating Virtual Machine Forderung: 4K × c.np−1 X c.vm(p).ptl ≤ tvm p=1 7.1.1 Exkurs: Syntax von k Funktionen die k aufrufen darf: alloc(p, x) : neue Seiten für vm(p) f ree(p, x) : Seiten von vm(p) entfernen Semantik: Sei ⇒ c.cp c.C.pr δ(c) = = = 0 alloc(p, x); r c′ (k läuft) (Aufruf von alloc(. . .)) (nächste CVM-Konfiguration) c′ .C.pr c .vm(p).ptl = = r c.vm(p).ptl + x (abstrakt: alloc(. . .) wird in einem Schritt abgearbeitet) ′ 7 BETRIEBSSYSTEM-KERN 7.1.2 109 Semantik von cp = = c.cp JISR(c.vm(p)) p>0 0 Benutzerprozess p läuft kein Interrupt einer virtuellen Maschine (vm sieht keine PageFaults!) δvm : Nachfolge-Konfiguration von vm: c.vmp(p) c′ .vm(x) c′ C c′ .cp = = = = δvm (c.vmp(p)) c.vm(x) (x 6= p) c.C p c.cp = 0 (k läuft) c.C.pr 6= s; r (s: normales C0 -Statement) ¯ ¯ ¯ (!) Simulation kann Handling ¯ ¯ von Page-Faults efordern ¯ ¯ (Interrupt auf physikalischer Maschine) ¯ start: Statement von k (startet UserProzess ’act’) act: int-Variable von k c′ .C = δc (c.C) δc : Nachfolge-Konfiguration für C0 -Maschinen c′ .vm(p) = c.vm(p) ¾ Kern läuft lokal 7.1.2.1 Kontrolle von k an User Sei c.C.pr = startu; r c′ .C.pr = r p = va(c.C, act) c′ .cp ⇒ = p 7.1.2.2 Kontrolle von vm(p) an k Dies ist nur durch Interrupts (traps!) möglich. 7.1.3 Semantik von Interrupts Speziell: traps = kernel calls (= Prozedur-Aufrufe) Sei ⇒ c.cp JISR(c.vm(p)) trap(c.vm(p)) < imm(c.vm(p)) > = = = = p > 0 1 1 i Aufruf von kernel call i durch abstrakten Kern k (Prädikat wie add.load) (Parameter von trap = i) 7 BETRIEBSSYSTEM-KERN 7.1.4 110 Formalismus zum Spefizieren der Handler von Kernel Calls Analog zur Funktions-Definition in C0 -Konfigurationen: c.C.f d : [0 : nf − 1] → F D nf = # C-Funktionen des Kerns Sei npar(x) = # Parameter der x-ten Funktion von k c.nkc ∈ N c.kcd : [0 : c.nkc − 1] → [0 : c.C.nf − 1] 7.1.4.1 Definition der Wirkung von trap(i) c′ .cp = 0 ′ c .C.rd = c.C.rd + 1 rufe auf: xi = c.kcd[i]-te Funktion von k npar(xi) m (gibt es, function declaration) (number of kernel calls) (kernel call definition) (Kern k läuft) (Funktionsaufruf) (hat npar(xi ) Parameter ≤ 20) local memory für xi -te Funktion j-ter Paramter: c.vm(p).GP R[j] (j ≥ 1) Für kernel calls: Semantik von return(e) nach rds zurückgeben. c′ .C.rds(c′ .C.rd) = p return(e) : Rückgabewert an GP R[1] von p typ der Parameter typ des Rückgabewerts : : int int (aufrufenden Prozess merken) 7 BETRIEBSSYSTEM-KERN 7.2 111 CVM mit I/O-Devices D(0) D(d) D(nd-1) (I/O Devices) Kern k vm(1) vm(p) vm(np-1) Abbildung 53: Communicating Virtual Machine mit I/O Device 7.2.1 IS ES SP Wiederholung: Interrupts ¤ 0 = reset Boot-Routine = = = 1 2 = = ill mal 3 4 = = pf f pf ls 5 = trap 6 7 8 9 10 11 = = = = = = XOV F OV F UNF IN X DBZ IN V 12 = timer 13 .. . = timer = timer [6 : 11] [13 : 31] {1, 2, 12} ¸ ¤ werden vom konkreten Kern behandelt k-Funktion floating point ¤ # Scheduler „goto“ im Benutzer-Programm exti von D(d) (User Prozesse) (IEEE - FP+XOVF) (extern) „special“ (Handler von Kern-Funktionen) 7 BETRIEBSSYSTEM-KERN 7.2.2 112 return klassisch (C: C0 -Konfiguration) Sei C.pr C ′ .rd C.rds(rd) = = = c′ .m.ct[a] = aus kernel call return(e); r C.rd − 1 (m | {z: a}) m ∈ {gm, hm, lms(c.rd − 1} rds va(C.e) c′ .C.rd c.C.rds(c.C.rd) = = c′ .vm(p).GRP [1] = c.C.rd − 1 p va(c.C.e) | {z } (!) typ(c.C.e)=int 7.2.3 Kernel Calls c.cp trap(c.vm(p)) < imm(c.vm(p)) > c.kcd(i) = ∨ = = p > 0 il(c.vm(p)) = 5 i j Sei n = c.C.f d(j) ⇒ • c′ .cp = 0 k läuft Sei n • |c′ .C.rd {z } = = k.nparam c.C.rd + 1 (# Parameter von k) (neues lm und rds) = = = c.C.lms(rd′ ) h.st c.vm(p).GP R[i] (neues top local memory) (Symbol table übernehmen) = = p n.body; c.C.pr (Rückgabe an Prozess p) rd′ tlm(c′ ) • tlm(c′ ).st ′ • tlm(c ).ct[ba(h, i)] | {z } i • c′ .C.rds(rd) • c′ .C.pr 7.2.3.1 Sei (Benutzerprozess) bin26 (i) ) ( trap (k-Funktion mit Restriktor c.C.f d(j) behandelt trap i) i = il(c.vm(p)) ∈ SP („special“) c.shd : SP → [0 : c.C.nf − 1] (special handler definition) j j = = .. . c.shd(j) c.shd(j) Rest weiter wie trap 7.2.3.2 i = il(c.vm(p)) ∈ IS c.ihd : IS → {0, 1}32 ′ c .vm.P C = c.ihd[i] (schlichtes goto) 7 BETRIEBSSYSTEM-KERN 7.2.3.3 i ∈ ES 113 c.hd : ES → { p′ = c′ .cp (= c.hd[i]) c.dbase c.dbase(p) c′ .v,10 [c.dbase(p′ )] : : = [0 : np − 1] → N Start der data section c.vm(p).GP R[10 : 1] c′ .vm(p′ ).P C = 032 1, . . . , np − 1 | {z } } auf ruf ender P rozess (Aufruf des Prozesses) dbase + 10 dbase(p') GPR[1:10] Code Section 0 vm(p').m Abbildung 54: vm(p′ ).m 7 BETRIEBSSYSTEM-KERN 7.2.4 114 „User-Functions“ k: C0 -Programm + startu + vorderfinierte | {z Funktionen} z.B. alloc,f ree • c.cp = 0 k läuft • c.C.pr = setmasks(p, e); r c′ .C.pr = r c′ .vm(va(c.C.p)).SR = va(c.C, e) Notation: x e = va(c.C, x) (x: g-Ausdruck) ⇒ c′ .vm(e p).SR = ee (Status-Register SR speichert Masken) • copy(p1 , p2 , s1 , s2 , l) von p1 (ab s1 ) nach p2 (ab s2 ) l Daten kopieren: c′ .vm(pe2 )el (se2 ) = c.vm(pe1 )el (se1 ) • Handler-Definitionen (sethd(i, j) / setihd(i, j)) c′ .hd(ei) = e j • reset(p) ptl(p) = 0 . . . (einfachste Primitive?) • f ork(p, q) q Kopie von p (einfachste Primitive?) 7 BETRIEBSSYSTEM-KERN 7.2.5 115 Devices c.nd c.dsize : : number of devices [0 : c.nd − 1 → N (# Ports) Definition: I/O-Port: Adresse die von I/O-Devices belegt wird. c.iop[p] : [0 : c.dsize − 1] → {0, 1}32 | | {z } {z } Adressen (Speicher-iop) Inhalt iop verhält sich manchmal wie ein Speicher c.alk[d] ∈ {0, 1} (1: aktiv) c′ .akt[d] testen von c′ .akt[d] typisch: ¾ Device-spezifisch • externer Interrupt von Device d ⇒ akt[d] = 0 • Kommando an Device d ⇒ akt[d] = 1 7 BETRIEBSSYSTEM-KERN Nur bei c.akt[d] = 0 (!): • outcopy(p, d, s1 , s2 , l) e e(se2 ) = c.vm(e p)el (se1 ) c.iop(d) l ′ e ei) = c.iop[d]( e ei) i ∈ [se2 + ei − 1 : se2 ] c .iop[d]( • incopy(d, p, s1 , s2 , l) c′ .vm(e p)el (se2 ) = c.iop(deel (se1 ) c.akt[d] = 0 ∧ c.C.pr 6= outcopty(. . .) c′ .iop[d](i) = c.iop[d](i) | {z } Speichersemantik 7.3 Definition: C0A (C0 mit Assembler-Code) Konkreter Kern K ∈ C0A wird um den abstrakten Kern k herumprogrammiert: • Syntax: neues Statement: asm(s) (Asembler-Marko, s : Folge von DLX0 -Instruktionen) • Compilieren: code(asm(s)) = s • (!) Semantik von C0A -Programmen (nutze abase vom Compiler) • (!) kconsis(k, kbase, K) : K codiert k • Konstruktion von K • Simulationssatz 116 7 BETRIEBSSYSTEM-KERN 7.4 117 Konkreter Kern K K ∈ C0A (= C0 + asm(s)8 ) 7.4.1 Semantik δA (cc9 ) → cc′ | cc.pr = asm(s); r (DLX0 -Konfuguration d sichtbar für K) (! Geht nicht !) δA (cc, d) = cc′ | {z } Eingabe der C0A -Maschine code(K) läuft auf physikalischer DLX0 -Maschine. Die Konfiguration der physikalischen Maschine nennen wir d. d.m (physikalischer Speicher) dtop(0) dbase(0) (=SBASE) Kcbase data(K) code(K) 12 K 8K 0 scratch Boot ROM (read only memory) vm(p').m Abbildung 55: Memory Map 8 Folge 9C von DLX0 -Instruktionen 0 -Konfiguration 7 BETRIEBSSYSTEM-KERN 7.4.2 118 Restriktionen an asm(s) s liest/schreibt aus/in data(K) in Konfiguration d (ea(d) ∈ [dtop(0) : abase(0)]) ⇒ ∃ x = (gm, j)s (globale g-Variable) ea(d) = abase(6 d, x) (bei globalen Variablen unabhängig von d) Definition: abase(x) = abase(d0 , x) cc.pr = asm(s); r δA (cc, d) = cc′ Es gelte d →∗s d′ , d.h.: ∃ T: d0 → d1 → . . . → dT = d ↓ ↓ ↓ definiere: cc0 cc1 ccT = cc′ Fall 1: store(di ) ∧ ea(di ) = abase(c) (x gibt es durch die Restriktion) falls ea(di ) ∈ Data(K) ⇒ va(cci+1 , x) = d.GP R[RS1(di )] Fall 2: d = sonst cci + 1 = cci cc.pr = m; r (im Assembler-Makro) ⇒ cc′ .pr = body(m); r (body(m) aus Makro, Definition: Syntax con C0A ) 7 BETRIEBSSYSTEM-KERN 7.4.3 119 Datenstrukturen des konkreten Kerns K • alle vom abstrakten Kern k • globale Variable act (aktueller Prozess) • Array von processed control Blöcken pcb(p), p ∈ [1 : np − 1] pcb: GPR[31:1] SPR[ : ] vor allem ptl, pto PC spt 0 ihd[ : ] swap page table origin Handler Definition für IS Abbildung 56: Processed Control Block • array hd[ : ]: Handler-Definitionen für il ∈ ES • page-table-array (insgesamt: 4 × tvm / 4K = 4 × 4 GB / 4 k = 4 M B) pp: pt(1) pcb(i).pto pt(i) pcb(i).ptl Abbildung 57: Page Table Array 7 BETRIEBSSYSTEM-KERN 120 • swap memory page-table: sm-pages: 1 MB Größe = 256 × 4Kpages va = (spx(va), sbx(va)) | {z } | {z } 12 bit 20 bit pp: spt(1) pcb(i).spto spt(i) sptl = ptl(i) / 256 Abbildung 58: Swap Page • free list: verlinkte Liste der freien sm-pages x: g-Variable, va(c, x), c: C0 -Konfiguration val(e, x) e : physikalische DLX0 -Konfiguration x global, elementar: val(e, x) = e.b[abase(x)] e → vm(e, p): die von e codierte p-te user-Konfiguration Komponenten: vm(e, p).R CPU-Register (GPR, SPR, PC) vm(e, p).m virtueller Speicher ½ vm(e, p).R e.r : va(e, pcb(p).R) : p „läuft“ in Konfiguration e sonst p läuft in Konfiguration e ↔ emode = 1 ∧ va(e, act) = p ½ vm(e, p).m(va) e.m[pma(e, p, a)] : e.sm[sma(e, p, va)] : valid(e, p, va) sonst physikalischer Speicher e.m ist Cache für swap memory sm. pma(e, p, va) ppx(e, p, va) pte(e, p, va) valid(e, p, va) sma(e, p, va) = = = ¾ (ppx(e, p, va), bx(va)) pte(e, p, va)[31 : 12] va(e, P P [val(e, pcb(p).pto] + ppx(va)) Klausur-Aufgabe 7 BETRIEBSSYSTEM-KERN 7.5 121 Simulationssatz gegeben: C0 : Startkonfiguration von CVM in1 , in2 , . . . (Inputs für physikalische Maschine) Behauptung: ∃ c0 , c1 , c2 , . . . CVM-Rechnung ∃ cc0 , cc1 , cc2 , . . . Folge von C0 -Konfiguration für K ∃ d0 , d1 , d2 , . . . DLX0¾ -Rechnung (physikalische Maschine) ∃ s(0), s(1), s(2), . . . Schrittzahlen ∃ t(0), t(1), t(2), . . . ¾ 0 1 2 ∃ abase , abase , abase , . . . (bekannt!) allocation ∃ kbase0 , kbase1 , kbase2 , . . . (bisher unbekannt!) i i s(i) ∀ i : kconsis | {z } (c .C, kbase , cc ) ebenfalls neu! nach s(i) Schritten von K sind i Schritte von CVM bezüglich k simuliert ∀ i : consis(ccj , abasej , dt(j) ) nach t(j) Schritten von DLX0 sind j Schritte von K simuliert (noch zu definieren: kconsis, kbase) ∀ i, ∀ p : ci .vm(p) = vm(dt(s(i)) , p) ∀ j : ccj+1 = δA (ccj , dt(j) ) „Kindereien“: 7.5.1 t(s(i)) ci .ptl(p) , pcb(p).ptl) ¾ = va(d ihd Bonus-Aufgabe, Klausur ha Definition: konsis(cc, kbase, c) konsis(cc, kbase, c) ↔ e − konsis(cc, kbase, c) ∧ p − konsis(cc, kbase, c) ∧ c − konsis(cc, c) ¯ ¯¯ von Konfiguration c V ar(c) = x ¯¯X Variable ¯ | {z } (m,i) kbase: V ar(c) → V ar(cc) kbase(m, i) = (m, i) (gleiches m) (m, j) von cc kodiert, (m, i) von c 7.5.2 Definition: e − konsis(c, kbase, cc) Sei (m, i)s elementare g-Variable von c: ⇒ va(c, (m, i)s) = va(cc, (kbase(m, i))s) 7 BETRIEBSSYSTEM-KERN 7.5.3 122 Definition: p − konsis(c, kbase, cc) Der heap von c ist isomorth zu einem subgraph von cc: c cc kbase m.ct ba((m, j)s) m' : a m'.ct a va(c,x) Abbildung 59: p − konsis(c, kbase, cc) = t∗ va(c, (m, j)s) x = = m′ : a gv(c, m′ : a, t) va(cc, (kalloc(m, j))s) = = = ba(cc, x) ba(cc, gv(c, m′ : a, t)) ba(cc, gv(c, (m, j)s), t) type((m, j)s) {z } | c va(cc, (kalloc(m, j))s) 7.5.4 später! Definition: c − konsis(c, cc) 7 BETRIEBSSYSTEM-KERN 7.6 1. 123 Korrekturen c0 c1 c2 | CVM 0 1 cc cc cc2 | K 0 1 d d d2 | physikalische DLX0 konsis(ci .C, kbasei , ccs(i) ) c − konsis(ci .C, abasei , dt(i) ) 2. 6 11 SR IS maskierbar durch Benutzer CVM-Funktion in K: SR[11 : 6] = {0, 1}6 3. C0 -Datenstruktur für K 1 lsi(p) np−1 lsi lsi(p): page fault handler (pf f, pf ls) Grund: 4. 7.6.1 last page swapped in for process p swappen lsi(p) nicht raus Terminierung bei zwei Page-Faults in einer Intruktion c → c′ : c.cp = p JISR(c.vm(p)) il = (c.vm(p)) ∈ ES handler: prozess p′ = c′ .cp = c.hd(il) (wie bisher) c.vm(p′ ).R = δd (c.vm(p)).R R ∈ EHR = {EP C, EDAT A, ECAU SE} (error handling register) Notation: body(. . . , . . .) body(main, P ) : body von Funktion main in Programm P 7 BETRIEBSSYSTEM-KERN 7.7 124 body(main, k) 1. initk (initialisieren): • Scheduler-DS (Datenstrukturen) • create root (Haupt-Bestriebssystem-Prozess) | {z } Prozess 1 code, data (laden) platz, zeit (zuweisen) 2. act = 1 3. while 1 do{zstartnextu} | loopa 7.8 body(main, K) 1. initK (initialisieren): • Datenstrukturen für memory management • leere Benutzerprozesse 2. initk 3. act = 1 4. while 1 do {startnextu, dispatch} {z } | 7.9 | {z Makro’s loopc } Definition: c − consis(c, cc) c − consis(c, cc) ↔ c.pr = apr(cc.pr) | {z } aktrakter pr cc.pr r; loopc (disp, startnextu nicht in r) startnextu; disp; loopc disp; loopc Bemerkung: apr streicht disp apr(cc.pr) r; loopa startnextu; loopa loopa 7 BETRIEBSSYSTEM-KERN 7.10 125 Bootstrap e.m boot: (physikalische Maschine) scratch[1:0] = GPR[1:2] reset? nein goto disp ja disp code(K) dispbase load K *code *data SBASE(0) = kcbase scratch[3:2] = dbase, kcbase kcbase dispbase GPR[2] GPR[1] goto kcbase boot Abbildung 60: Bootstrap Bemerkung: Nach boot und initk gilt der Simulationssatz für C0 (Induktions-Anfang) startnextu: pcb(act).R (CPU-Register restaurieren, R 6= P C) e.EP C = pcb(act).EP C rf e disp: 1) 2) CPU-Register in pcb(act) retten:¾ GP R[2 : 1] aus scratch[1 : 0] (asm(. . .)) alle anderen aus CPU il berechnen: m in {pcb(act).ECA[j] = 1} (il 6= 0) scratch 8K 7 BETRIEBSSYSTEM-KERN Fälle: a) il = 5 (trap) i = < pcb(act).EDAT A > (kcall i) Sei n = c.C.f d(kcall(i)).name (Name d. C0 -Funktion von k, Handler von trap i) npar = ( ).npar ≤ 10 (#P arameter) Aufruf: n(pcb(act), GP R[npar : 1]) (!) JISR ist implementiert als Funktionsaufruf b) il = 3 (pf f ) pf h(act, EP C) (page fault handler) c) il = 4 (pf ls) pf h(act, EDAT A) d) il = 12 (timer) call scheduler Bemerkung: • brauche I/O Port um aktuelle Zeit auszulesen • ändert oft act e) il ∈ ES Nächster Prozess: hd(il) pcb(hd(il)).R = pcb(act).R | {z } R ∈ EHR (Korrektur 4, Paramterübergabe) R 6= EP C pcb(hd(il)).EP C = 032 (Anfang von Code des Prozesses hd(il)) act = hd(il) f) il ∈ IS = [11 : 6] pcb(act).EP C = ihd(act, il) 126 ABBILDUNGSVERZEICHNIS 127 Abbildungsverzeichnis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Relation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gatter-Symbole . . . . . . . . . . . . . . . . . . . . . . . . Schaltkreis - XOR Gatter . . . . . . . . . . . . . . . . . . . Eingänge des Gatters . . . . . . . . . . . . . . . . . . . . . Schaltkreis - Zyklen-Problem . . . . . . . . . . . . . . . . Schaltkreis - AND Flip-Flop . . . . . . . . . . . . . . . . . Tiefe (Formal) . . . . . . . . . . . . . . . . . . . . . . . . . Schaltkreis - XOR-Gatters (Tiefe) . . . . . . . . . . . . . . Schaltkreise - Darstellungssatz (Binäre Operationen) . . . Schaltkreise - Darstellungssatz (Negation) . . . . . . . . . Schaltkreise - Polynom . . . . . . . . . . . . . . . . . . . . Schaltkreise - ∧ − 2 Baum . . . . . . . . . . . . . . . . . . Schaltkreise - ∧ − n Baum . . . . . . . . . . . . . . . . . . Vergleich - ∧−Reihe / ∧ − n Baum . . . . . . . . . . . . . Schaltkreise - ∧ − n Baum, falls n keine Zweierpotenz ist Addierer . . . . . . . . . . . . . . . . . . . . . . . . . . . . n-bit Addierer . . . . . . . . . . . . . . . . . . . . . . . . . Schaltkreis - 1-bit Addierer . . . . . . . . . . . . . . . . . . Carry-Chain-Adder . . . . . . . . . . . . . . . . . . . . . . Multiplexer . . . . . . . . . . . . . . . . . . . . . . . . . . 1-bit Multiplexer Schaltkreis . . . . . . . . . . . . . . . . . n-bit Multiplexer . . . . . . . . . . . . . . . . . . . . . . . Multiplexer Symbol . . . . . . . . . . . . . . . . . . . . . . Conditional Carry Adder . . . . . . . . . . . . . . . . . . Arithmetic Unit . . . . . . . . . . . . . . . . . . . . . . . . Erweiterung der Notation . . . . . . . . . . . . . . . . . . Beispiel: Erweiterung der Notation . . . . . . . . . . . . . n-bit-twoc AU (auch für Binärzahlen) . . . . . . . . . . . Arithmetic Logic Unit . . . . . . . . . . . . . . . . . . . . Schaltkreis - Arithmetic Logic Unit . . . . . . . . . . . . . Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Register (Beispiel) . . . . . . . . . . . . . . . . . . . . . . . 2a × d RAM . . . . . . . . . . . . . . . . . . . . . . . . . . 3 − P ort RAM . . . . . . . . . . . . . . . . . . . . . . . . . DLX0 Instruktionssatz . . . . . . . . . . . . . . . . . . . . DLX0 -Hardware Konfiguration in Stufen . . . . . . . . . DLX0 -Beweis (c0 comp) . . . . . . . . . . . . . . . . . . . . DLX0 -Beweis (adcomp) . . . . . . . . . . . . . . . . . . . DLX0 -Beweis (aluoph ) . . . . . . . . . . . . . . . . . . . . Spezifikation - n-Inc . . . . . . . . . . . . . . . . . . . . . . nextP C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . bjtakenh . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispiel - Arbeitsweise von Grammatiken . . . . . . . . . Funktions-Stack . . . . . . . . . . . . . . . . . . . . . . . . Funktions-Frame . . . . . . . . . . . . . . . . . . . . . . . Heap und Stack im DLX0 -Memory . . . . . . . . . . . . . Special Purpose Register . . . . . . . . . . . . . . . . . . . Interrupt Service Routine (Aufbau) . . . . . . . . . . . . . Bus-System . . . . . . . . . . . . . . . . . . . . . . . . . . . Festplatte . . . . . . . . . . . . . . . . . . . . . . . . . . . . Devbase . . . . . . . . . . . . . . . . . . . . . . . . . . . . Communicating Virtual Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 12 12 13 13 13 14 14 16 16 17 18 18 19 19 21 22 23 26 27 27 28 28 28 32 33 33 34 35 36 39 39 40 40 41 46 48 49 50 52 53 54 57 75 76 88 97 99 100 101 101 108 ABBILDUNGSVERZEICHNIS 53 54 55 56 57 58 59 60 Communicating Virtual Machine mit I/O Device vm(p′ ).m . . . . . . . . . . . . . . . . . . . . . . . Memory Map . . . . . . . . . . . . . . . . . . . . Processed Control Block . . . . . . . . . . . . . . Page Table Array . . . . . . . . . . . . . . . . . . Swap Page . . . . . . . . . . . . . . . . . . . . . . p − konsis(c, kbase, cc) . . . . . . . . . . . . . . Bootstrap . . . . . . . . . . . . . . . . . . . . . . . 128 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 113 117 119 119 120 122 125