Sandini Bib
PC-Hardwarebuch
Sandini Bib
Unser Online-Tipp für noch mehr Wissen …
... aktuelles Fachwissen rund um die Uhr – zum Probelesen, Downloaden oder auch auf Papier.
www.InformIT.de
II
Sandini Bib
Hans-Peter Messmer, Klaus Dembowski
PC-Hardwarebuch Aufbau, Funktionsweise, Programmierung Ein Handbuch nicht nur für Profis
7. Auflage
ADDISON-WESLEY An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam
III
Sandini Bib
Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar. Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden. Umwelthinweis: Dieses Produkt wurde auf chlorfrei gebleichtem Papier gedruckt. 10 9 8 7 6 5 4 3 2 1 07 06 05 04 03 ISBN 3-8273-2014-3 © 2003 by Addison-Wesley Verlag, ein Imprint der Pearson Education Deutschland GmbH, Martin-Kollar-Straße 10–12, D-81829 München/Germany Alle Rechte vorbehalten Einbandgestaltung: Barbara Thoben, Köln Lektorat: Rolf Pakendorf,
[email protected] Korrektorat: Friederike Daenecke,
[email protected] Herstellung: Elisabeth Egger,
[email protected] Satz: mediaService, Siegen (www.media-service.tv) Druck und Verarbeitung: Bercker, Kevelaer Printed in Germany
IV
Sandini Bib Inhaltsverzeichnis
V
Inhaltsverzeichnis Teil 1: Grundlegendes und Allgemeines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
Die PC-Komponenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Das PC-Innenleben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Gehäuse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Netzteil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.3 Mainboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.4 CMOS-RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.5 BIOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.6 Laufwerke. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.7 Grafikadapter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.8 Sound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.9 Netzwerke und LAN-Adapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 PC-Peripherie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Tastatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.3 Maus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.4 Drucker und die parallele Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.5 Scanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.6 Modems und die serielle Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.7 ISDN und ADSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 4 4 8 13 17 19 21 28 30 41 45 45 50 52 53 56 58 62
Teil 2: Die Mikroprozessoren der Personal Computer . . . . . . . . . . . . . . . . . . . . . . . . .
67
2
Grundlagen der Mikroprozessortechnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Der Feldeffekttransistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Grundlagen maschinennaher Informationsdarstellung . . . . . . . . . . . . . . . . . . . 2.2.1 Dezimal- und Binärsystem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 ASCII-Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.3 Negative Ganzzahlen und Zweierkomplement . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4 Hexadezimalzahlen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5 BCD-Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.6 Little-Endian- und Big-Endian-Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Logikgatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Grundlegende Logikelemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2 CMOS-Inverter als Low-Power-Elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.3 Ein Beispiel: 1-Bit-Addierer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 Die CPU als zentraler Bestandteil aller Computer . . . . . . . . . . . . . . . . . . . . . . . .
67 68 71 72 73 73 74 75 76 76 77 79 81 81
3
Alles begann mit dem Urvater 8086 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Anschlüsse und Signale des 8086 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 8086-Betriebsmodi und der Buscontroller 8288 . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Der 8086 Real Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Zugriff auf den Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Wortgrenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6 Zugriff auf den I/O-Adressraum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7 8086 Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8 Der 8088 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9 Der 80186/88 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85 85 89 90 90 93 93 94 94 96
1
Sandini Bib VI
Inhaltsverzeichnis
4
Kompatibilität nach unten – der 80286 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Anschlüsse und Signale des 80286 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Die 80286-Register. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Der 80286 Protected Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Die 80286-Speicherverwaltungsregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2 80286-Segmentdeskriptoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.3 80286-Segment- und Zugriffstypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Multitasking, 80286 TSS und das 80286-Task-Gate . . . . . . . . . . . . . . . . . . . . . . . . 4.3.5 80286-Schutz für den I/O-Adressraum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 80286-Buszyklen und -Pipelining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Wortgrenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6 80286-Reset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97 97 100 100 101 102 102 104 105 105 106 107
5
Einstieg in die 32-Bit-Welt – Der 80386. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 Anschlüsse und Signale des 80386 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Der physikalische Speicher- und Portzugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Der Buszyklus für einen Lesezugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.2 Der Buszyklus für einen Schreibzugriff. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3 Waitstates oder Wartezyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.4 Adress-Pipelining oder Pipelined-Adressierung . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.5 Doppelwortgrenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.6 Sonderzyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.7 Datenbus und Duplizierung von Schreibdaten . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.8 I/O-Adressraum und die Peripherie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.9 I/O-Adressierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.10 I/O-Zyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Die Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Die Register in der Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 Segmentierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3 Die Vielzweck- und Segmentregister. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.4 Die Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.5 Steuer- und Speicherverwaltungsregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
109 109 113 115 117 118 119 121 123 124 125 125 126 127 127 129 131 136 139
6
Programmierung und Betriebsarten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 Codesegment und Befehlszähler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Stacksegment und Stack-Zeiger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Datensegment DS und Adressierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Adressierungsarten und Befehlskodierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.1 Programmierung auf Prozessorebene: Mnemonics und der Assembler . . . . . . 6.4.2 Adressierungsarten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.3 Befehlscodierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.4 Einlesen von Befehlen und Prefetching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Der Real Mode, High-Memory-Area und HIMEM.SYS . . . . . . . . . . . . . . . . . . . . 6.6 Interrupts und Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.1 Software-Interrupts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.2 Hardware-Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.3 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7 Der Protected Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7.1 Segmentselektoren, Segmentdeskriptoren und Privilegierungsstufen . . . . . . . 6.7.2 Globale und lokale Deskriptortabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7.3 Umschalten in den Protected Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
143 143 145 146 147 147 148 149 151 153 155 155 157 158 160 160 165 168
Sandini Bib Inhaltsverzeichnis
6.7.4 6.7.5 6.7.6 6.7.7 6.7.8 6.7.9 6.8 6.8.1 6.8.2 6.8.3 6.9 6.9.1 6.9.2 6.9.3 6.9.4
VII
Speicheradressierung im Protected Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Steuerungsübergabe und Call Gates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Interrupt-Deskriptortabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multitasking, TSS und das Task Gate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schutz des I/O-Adressraums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exceptions und Schutzmechanismen im Protected Mode . . . . . . . . . . . . . . . . . Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Logische, lineare, physikalische Adressen und Paging. . . . . . . . . . . . . . . . . . . . Page Directory, Page Tables und Page Frames . . . . . . . . . . . . . . . . . . . . . . . . . . Die Testregister TR6 und TR7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Virtual-8086-Modus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Virtuelle Maschinen und Virtual-8086-Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . Adressen im Virtual-8086-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einstieg in den und Ausstieg aus dem Virtual-8086-Mode . . . . . . . . . . . . . . . . Tasks im Virtual-8086-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
169 170 174 175 179 182 183 183 185 190 192 192 193 193 194
7
Schnell zwischengespeichert – Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1 Cache-Prinzip und Cache-Strategien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Cache-Organisation und Assoziativspeicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Cache-Treffer-Bestimmung und optimale Cache-Größe. . . . . . . . . . . . . . . . . . . 7.4 Ersetzungsstrategien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.5 On-Chip und Second-Level-Caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6 Cache-Kohärenz und das MESI-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.1 Die vier MESI-Zustände . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2 MESI-Zustandsübergänge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.3 L2-Cache-Subsysteme und MESI-Cache-Kohärenzprotokoll . . . . . . . . . . . . . . 7.7 Pipelined Burst Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
199 199 202 205 207 208 209 210 211 213 215
8
Alles in Einem – Der i486. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1 Anschlüsse und Signale des i486 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Der interne Aufbau des i486 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 RISC oder CISC ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1 Die Mikrokodierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 Reduzierung auf das Wesentliche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3 RISC-Kennzeichen auf Hardware-Ebene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4 RISC-Kennzeichen auf Software-Ebene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4 Die Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.5 Der On-Chip-Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6 Unterschiede und Gemeinsamkeiten von i486 und 80386/80387 . . . . . . . . . . . 8.6.1 Unterschiede in Registerstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.2 Unterschiede in der Speicherverwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.3 i486-Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.4 Der i486-Real-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.5 Der i486-Protected-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.6 Der i486-Virtual-8086-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.7 Integer-Core und Gleitkommaeinheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.8 FPU-Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.9 Der Translation Lookaside Buffer (TLB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7 Der i486-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7.1 Burst-Zyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7.2 Sonderzyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7.3 Invalidierungszyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
217 218 224 226 226 230 230 236 238 240 243 243 244 245 246 246 247 247 247 248 248 248 250 250
Sandini Bib VIII
Inhaltsverzeichnis
8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9
Testfunktionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Interne Selbsttest BIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung des TLBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung des On-Chip-Caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tristate-Testmodus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der JTAG-Boundary-Scan-Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der I/O-Adressraum des i486 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
251 251 251 253 255 255 259
9
Coprozessoren und 386/486-CPU-Derivate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1 Mathematische Coprozessoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.1 Zahlenexkurs – die Darstellung von Gleitkommazahlen . . . . . . . . . . . . . . . . . . 9.1.2 Der Standard – IEEE-Formate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.3 Funktionsweise und Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.4 Die Exceptions des 80387 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.5 Protected Mode und die Speicherabbilder der Befehls- und Datenzeiger . . . . 9.2 386-Prozessorderivate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2.1 Abmagerungskur – Die SX-Varianten der Prozessoren . . . . . . . . . . . . . . . . . . . . 9.2.2 386-CPUs anderer Hersteller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2.3 Cyrix-386-Prozessoren (486xLC). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2.4 386- und 486-CPUs in der Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3 486-Prozessorderivate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.1 i486SX und i487SX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.2 i486SX-Upgrade – der i487SX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.3 Die i486DX2-Prozessoren mit interner Taktverdopplung . . . . . . . . . . . . . . . . . . 9.3.4 Der i486DX4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.5 Weitere 486-CPUs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
261 261 263 266 268 275 276 277 278 280 282 283 284 284 286 289 291 297
10
Der Pentium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Interner Aufbau des Pentiums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.1 Die Integer-Pipelines u und v . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.2 Befehlspaarung in den Integer-Pipelines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.3 Die Gleitkomma-Pipeline. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.4 Befehlsserialisierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.5 Dynamische Verzweigungsvorhersage, Branch Prediction Logic. . . . . . . . . . . . 10.2.6 Die Pentium-On-Chip-Caches. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Pentium-Kompatibilität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.1 Erweiterungen der Pentium-Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.2 Modellspezifische Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.3 Das Feature-Steuerregister TR12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.4 Der Pentium-Real-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.5 Der Pentium-Protected-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.6 Der Pentium-Virtual-8086-Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.7 Pentium und Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.8 Debug-Erweiterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.9 Pentium-Reset, Pentium-Init und Selbsttest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.10 CPU-Identifizierung mit CPUID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3.11 Neue Pentium Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4 Der Pentium-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4.1 Einzeltransferzyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4.2 Burst-Zyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
301 302 315 317 320 323 325 326 328 332 332 334 335 336 337 337 339 339 340 342 343 343 344 344
Sandini Bib Inhaltsverzeichnis
10.4.3 10.4.4 10.4.5 10.4.6 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.7.3 10.7.4 10.7.5 10.7.6 10.8 10.9 10.9.1 10.9.2 10.9.3 10.9.4 10.10 10.10.1 10.11 10.11.1 10.11.2 10.11.3
IX
Pentium-Adress-Pipelining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sonderzyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Abfragezyklen und internes Snooping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interne Pentium-Buspuffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der System-Management-Mode des Pentium . . . . . . . . . . . . . . . . . . . . . . . . . . . Die SMM-RAM-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmausführung im System-Management-Mode . . . . . . . . . . . . . . . . . . . Rückkehr aus dem System-Management-Mode. . . . . . . . . . . . . . . . . . . . . . . . . . Code-Optimierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfache Straight-Forward-Optimierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Optimierung mit dem Performance Monitoring . . . . . . . . . . . . . . . . . . . . . . . . . Pentium-Testfunktionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Pentium JTAG Boundary Scan Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erfassung interner Fehler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erfassung von Busfehlern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmausführungsverfolgung oder Execution Tracing . . . . . . . . . . . . . . . Hardware-Debug-Unterstützung und Probe Mode . . . . . . . . . . . . . . . . . . . . . . Die Machine Check Exception. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Pentium-I/O-Adressraum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dual Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Allgemeine Dual-Processing-Struktur mit zwei Pentium-Prozessoren . . . . . . Bus-Arbitrierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cache-Konsistenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . On-Chip-APICs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pentium der dritten Generation – MMX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sockel und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MMX-Technologie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SIMD- und MMX-Datentypen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MMX-Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MMX-Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
347 348 349 350 350 351 352 353 353 353 355 358 358 359 359 360 361 361 362 362 362 363 364 365 366 367 368 369 370 371
11
Pentium-kompatible Mikroprozessoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1 CPUs von Cyrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.1 Der Cyrix 6x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2 Der Cyrix 6x86MX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 CPUs von AMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2.1 Der K5 – 5K86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2.2 Der AMD K6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2.3 AMD-K6-II und AMD K6-III mit Super Sockel 7 . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 IDT WinChip C6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.4 CPU-Übersicht und Einstellungsdaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
373 373 373 392 393 394 405 406 407 408
12
Reine 32-Bit-Technologie – Der PentiumPro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Interner Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1 Die funktionalen Einheiten des PentiumPro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.2 Befehls-Pool und Micro-Ops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3 Die L1- und L2-Caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 PentiumPro-Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1 Befehle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.2 Steuerfunktionen in CR4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
411 412 425 425 426 428 429 429 429
Sandini Bib X
Inhaltsverzeichnis
12.3.3 12.3.4 12.4 12.4.1 12.4.2 12.4.3 12.4.4 12.4.5 12.5 12.6 12.6.1 12.6.2 12.6.3 12.6.4 12.7 12.8
Der 36-Bit-Adressbus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globale Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modellspezifische Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Bereichsregister für den Speichertyp (MTRR). . . . . . . . . . . . . . . . . . . . . . . . . Die Konfigurationsregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Machine-Check-Architektur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Performance-Monitoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Debug-Unterstützung durch modellspezifische Register . . . . . . . . . . . . . . . . . . Reset und Einschaltkonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Bus des PentiumPro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Busphasen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Busarbitrierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deferred-Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bus-Pipelining und PentiumPro-Bursts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multiprozessorbetrieb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CPUID. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
430 433 433 435 440 441 441 444 445 447 447 449 452 452 453 454
13
Pentium II, Pentium III und Celeron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1 Pentium II. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1.2 Pentium II-Bus (GTL+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Celeron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2.2 Celeron für den Sockel 370 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3 Pentium III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.1 Familienbande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.2 Pentium III für den Sockel 370 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.3 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4 Celeron III und Celeron 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.5 VIA-Prozessoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.6 Einstellungsdaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
457 457 458 463 465 466 466 467 468 469 470 473 473 475
14
Athlon und Duron. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1 Das Busprotokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.2 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.3 Interner Aufbau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.4 CPUs für den Sockel A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.4.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.5 Athlon XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
477 479 479 487 489 490 494
15
Pentium 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1 Interner Aufbau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1.1 Caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1.2 Rechenwerke und Pipelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1.3 SSE2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1.4 Businterface und Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1.5 Hyper Threading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.3 CPUID-Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
497 498 498 499 500 500 501 503 511
Sandini Bib Inhaltsverzeichnis
XI
Teil 3: Speicher, Chipsets und Support-Chips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
523
16
Speicherchips – Das Gedächtnis der Computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1 Dynamic Random Access Memory – DRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1.1 Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1.2 Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1.3 Schichtenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1.4 Refresh – Auffrischung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1.5 Organisationsformen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1.6 Betriebsmodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2 Speichermodule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.1 Parität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.2 DIM-Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.3 Synchronous Dynamic RAM – SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.4 Synchronous Graphic RAM – SGRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.5 Double Data Rate SDRAM – DDR-SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.6 RAMBus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.3 SPD-PROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.3.1 SPD-Daten auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.4 Statisches RAM – SRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.4.1 Das Flip-Flop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.4.2 Der Zugriff auf SRAM-Speicherzellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.4.3 Ein typischer SRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.5 Langzeitgedächtnis – ROM, EPROM und andere Speicher . . . . . . . . . . . . . . . . 16.5.1 ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.5.2 EPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.5.3 EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.5.4 Flash-Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
523 524 525 527 531 533 534 536 541 543 543 546 548 548 552 554 557 561 562 564 565 566 566 567 569 570
17
Chipsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.1 486-PCI-Chipset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.2 Intel Pentium-Chipsets für den Sockel 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3 Alternative Sockel 7-Chipsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.4 PentiumPro- und Pentium II-Chipsets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.5 Pentium II/III- und Celeron-Chipsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.5.1 Intel 810-Chipset – Whitney. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.5.2 Intel 820-Chipset – Camino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.5.3 Intel 840-Chipset – Carmel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.5.4 Intel 815-Chipset – Solano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.5.5 Alternative Chipsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.6 Pentium 4-Chipsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.6.1 Chipsets von Intel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.6.2 Chipsets von VIA und SiS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.7 Athlon-Chipsets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
579 579 581 585 587 590 592 595 597 597 599 602 602 604 607
18
Hardware-Interrupts und DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.1 Hardware-Interrupts und programmierbare Interrupt-Controller . . . . . . . . . . 18.1.1 Interrupt-getriebener Datenaustausch und Polling . . . . . . . . . . . . . . . . . . . . . . . 18.1.2 Anschlüsse und Signale des 8259A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.1.3 Interner Aufbau und Interrupt-Acknowledge-Sequenz . . . . . . . . . . . . . . . . . . . 18.1.4 Kaskadierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.1.5 Initialisierung und Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
613 613 613 615 616 619 621
Sandini Bib XII
Inhaltsverzeichnis
18.1.6 18.1.7 18.2 18.2.1 19
Maskierung des NMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multiprozessor-Interrupt-Subsysteme und APIC-Modus . . . . . . . . . . . . . . . . . . Direkter Speicherzugriff mit Peripherie und Speicher . . . . . . . . . . . . . . . . . . . . . Der Standard-DMA-Chip 8237A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
627 629 634 636
Mainboard-Peripherieeinheiten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.1 CMOS-RAM und Echtzeituhr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.1.1 Aufbau und Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.1.2 Der Zugriff über das BIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.1.3 Der Zugriff über Adress- und Datenregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.2 Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.2.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.2.2 Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.3 Super I/O-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.4 Supervisory-Chips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.5 System Management Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.5.1 Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.5.2 Adressen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.5.3 Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
657 658 659 667 667 668 670 672 681 682 686 686 689 690
Teil 4: Personal Computer-Architekturen und -Bussysteme . . . . . . . . . . . . . . . . . . . . 695 20
Bussysteme im PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.1 Die 8-Bit-Architektur – PC-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2 32-Bit-Architekturen – EISA und MCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2.1 Extended Industry Standard Architecture – EISA . . . . . . . . . . . . . . . . . . . . . . . . . 20.2.2 Micro Channel Architecture – MCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.3 Local Bus-Systeme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
695 696 701 702 704 708
21
Die 16-Bit-Architektur – ISA-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1 Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 I/O-Ports und Adressen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 DMA-Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3.1 Speicher-Speicher-Tansfers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Busslots und -Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4.1 PC-Bus-Signale des ISA-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4.2 Input/Output-Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4.3 Signale der ISA-Bus-Erweiterung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4.4 16-Bit-Dekodierung und Programmierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5 ISA-Plug&Play. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5.1 Der Konfigurationsmechanismus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5.2 Linear Feedback Shift Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5.3 Isolation-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5.4 ISA-Plug&Play-Register. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5.5 Der Zugriff auf ISA-Plug&Play-Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
711 714 715 716 718 719 720 722 725 726 728 729 732 733 735 739
22
Der PCI-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.1 PCI-Busstruktur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.2 Buszyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.3 Busarbitrierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.4 DMA und Busmastering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.4.1 Scatter Gather Bus Mastering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
741 742 744 749 750 751
Sandini Bib Inhaltsverzeichnis
22.5 22.6 22.7 22.7.1 22.8 22.9 22.9.1 22.9.2 22.9.3 22.10 22.10.1 22.10.2 22.11 22.12 22.12.1 22.12.2 22.12.3
XIII
Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I/O-Adressraum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konfigurationsraum – Configuration Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PCI-Power Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PCI-Bus-Slots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PCI-Bus-Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Standard-32-Bit-Abschnitt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die 64-Bit-Erweiterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Signalerweiterungen der Spezifikationen 2.2 und 2.3 . . . . . . . . . . . . . . . . . . . . . PCI-spezifische BIOS-Routinen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Interface zum BIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine universelle PCI-Unit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PCI-X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Switched Fabrics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . InfiniBand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PCI-Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HyperTransport. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
751 752 754 764 767 770 770 773 775 776 778 783 799 804 805 806 810
23
Accelerated Graphics Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.1 AGP-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.2 AGP-Slots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.3 AGP-Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.3.1 Signalbeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.4 AGP-3.0-Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.5 Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
821 821 822 824 827 830 834
24
Riser-Slots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.1 Audio Modem Riser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.2 Communication and Networking Riser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.3 Advanced Communication Riser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
839 840 843 846
Teil 5: Laufwerke und ihre Interfaces – EIDE und SCSI . . . . . . . . . . . . . . . . . . . . . . . .
847
Grundlagen der magnetischen Aufzeichnung und Datenorganisation . . . . . . . . . . . . 25.1 Diamagnetismus und Paramagnetismus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.2 Ferromagnetismus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.3 Induktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.4 Funktionsprinzip von Disketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.5 Physikalische Organisation und Aufzeichnung . . . . . . . . . . . . . . . . . . . . . . . . . . 25.5.1 FM- und MFM-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.5.2 Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.6 Logische Organisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.6.1 Der Aufbau von Partitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.7 Dateizuordnungstabelle – FAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.7.1 Fragmentierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.8 32-Bit- und andere Dateizuordnungstabellen. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.8.1 Virtual File Allocation Table – VFAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.8.2 New Technology File System – NTFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.8.3 High Performance File System – HPFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
847 847 848 851 851 856 857 860 862 863 867 869 870 871 871 872
25
Sandini Bib XIV
Inhaltsverzeichnis
26
Festplatten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1 Aufbau und Funktionsweise von Festplatten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1.1 Platten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1.2 Köpfe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1.3 Aktuator mit Schritt- oder Linearmotor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1.4 Luftfilterung und Belüftung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1.5 Interleaving oder Sektorversatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.1.6 Daten von Festplatten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.2 Aufzeichnungsformate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.2.1 MFM und RLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.2.2 Translation und Zonenaufzeichnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.2.3 High-Level-Formatierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.2.4 Low-Level-Formatierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.3 Traditionelle Festplattenschnittstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.3.1 ST412/506. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.3.2 ESDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.4 IDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.4.1 Signale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.4.2 Adressen und Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.4.3 Befehlsphasen und Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.5 Enhanced IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.5.1 Logical Block Addressing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.5.2 EIDE-Anschlüsse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.5.3 PIO-, DMA- und Ultra-DMA-Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26.6 Serial ATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
873 873 875 876 879 882 883 884 888 888 890 891 891 892 892 894 895 896 899 903 907 908 909 909 911
27
SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.1 Funktionsprinzip. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.2 Signale und Datenübertragung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.3 Busphasen und Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.4 Befehle und Programmierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.4.1 Advanced SCSI Programming Interface – ASPI . . . . . . . . . . . . . . . . . . . . . . . . . . 27.4.2 Common Access Method – CAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5 Die verschiedenen SCSI-Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.1 SCSI-I und der CCS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.2 SCSI-II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.3 SCSI-III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.4 Fast SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.5 Wide SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.6 Differential SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.7 Ultra SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.8 Ultra 2 SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.9 Ultra 160 SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27.5.10 Ultra 320 SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
913 913 914 917 922 927 929 930 930 931 931 932 932 933 933 934 935 936
28
Optische Laufwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.1 CD-ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.1.1 ATAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.2 CD-R und CD-R/W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.2.1 CD-RW und die Phase-Change-Technologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.3 Magnetooptische Laufwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.4 Digital Versatile Disc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28.4.1 Realisierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
939 939 942 944 944 945 947 949
Sandini Bib Inhaltsverzeichnis
XV
Teil 6: Schnittstellen, LANs und Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
953
29
Die parallele Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29.1 Aufbau und Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29.2 Direkte Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29.2.1 Druckeransteuerung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29.2.2 Allgemeine Verwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29.3 Der bessere Parallel-Port: IEEE-1284 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
953 954 956 957 959 962
30
Die serielle Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.1 Serielle Datenübertragung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.1.1 Synchrone und asynchrone Übertragung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.1.2 Parität und Baudrate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.1.3 Serialisierung und SDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.2 Die RS-232C-Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.2.1 Simplex-Verbindung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.2.2 Halbduplex-Verbindung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.2.3 Vollduplex-Verbindung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.2.4 RS-232C-Logikpegel und Übertragungsraten. . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.3 Typische Verbindungen – Nullmodem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.4 Universal Asynchronous Receiver and Transmitter – UART. . . . . . . . . . . . . . . 30.4.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.4.2 Aufbau und Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30.4.3 Register und Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
969 969 969 969 970 972 974 975 976 978 979 982 982 986 989
31
999 PCMCIA und Card-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1 Grundsätzliche Funktionsweise und Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999 31.2 Card- und Socket-Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001 31.3 Card Information Structure – CIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006 31.4 Configuration-Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008 31.5 Anschlussbelegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008 31.6 Card-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
32
Universal Serial Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015 32.1 Anschlüsse und Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017 32.2 Identifizierung und Kommunikation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019 32.3 Pakete und Transfers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021 32.4 USB 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1023
33
Firewire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.1 Architektur und Topologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.2 Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.3 Controller und PHY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
Lokale Netzwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033 34.1 Netztopologien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033 34.1.1 Bustopologie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 34.1.2 Ringtopologie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 34.1.3 Sterntopologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 34.2 Zugriffsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 34.2.1 CSMA/CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 34.2.2 Token-Passing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1038 34.2.3 Token-Bus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1039
1025 1025 1027 1029
Sandini Bib XVI
Inhaltsverzeichnis
34.2.4 34.2.5 34.3 34.3.1 34.3.2 34.3.3 34.3.4 34.3.5 34.3.6 34.3.7 34.3.8 34.4 34.5 34.6 34.6.1 34.6.2 34.6.3 34.6.4 34.6.5 34.6.6 34.6.7 34.6.8 34.6.9 34.7 34.7.1 34.7.2 34.7.3 34.7.4 34.8 34.8.1 34.8.2 35
100BaseVG-Any-LAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Asynchronous Transfer Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kopplungselemente für Netzwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das OSI-Schichtenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Repeater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hubs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Switches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bridges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Router . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Brouter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gateways . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Token-Ring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FDDI und CDDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kollisionsdomänen und maximale Ausdehnungen . . . . . . . . . . . . . . . . . . . . . . . Kupferbasierte Netzwerkverbindungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Thick-Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cheapernet oder Thin-Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ethernet mit Twisted-Pair-Kabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fast-Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gigabit-Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lichtwellenleiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-Gigabit-Ethernet – 10GE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufbau und Programmierung von Netzwerkeinheiten . . . . . . . . . . . . . . . . . . . . Ethernet im OSI-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ethernet-Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LAN-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bluetooth und Wireless LANs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IEEE-Wireless LANs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1039 1040 1040 1041 1043 1043 1043 1044 1045 1045 1045 1046 1047 1049 1050 1051 1054 1055 1055 1056 1059 1064 1069 1071 1071 1074 1076 1083 1095 1095 1098
Hardware-Programmierung unter Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.1 Übergang von DOS- zu Windows-Programmen . . . . . . . . . . . . . . . . . . . . . . . . . . 35.1.1 Der Portbaustein 8255 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.1.2 Windows-Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2 Erstellung von DLLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2.1 A/D-Umsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2.2 DLLs für 32-Bit-Betriebssysteme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2.3 Aufruf der DLL mit Visual BASIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2.4 Aufruf der DLL mit Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2.5 Ein paar Worte zu Assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.3 Direkter Hardwarezugriff unter Windows NT . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.3.1 Windows-NT-I/O-Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.4 Windows-Plug&Play . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.5 Programmieren mit dem Windows Driver Model. . . . . . . . . . . . . . . . . . . . . . . . . 35.5.1 IO Request Packets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.5.2 Driver Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.5.3 Installation Information File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.5.4 WDM-Beispieltreiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1107 1107 1109 1112 1114 1119 1123 1125 1127 1128 1129 1131 1136 1137 1139 1140 1141 1143
Sandini Bib Inhaltsverzeichnis
XVII
Anhang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157 A
ASCII- und Tastencodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.1 ASCII-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2 Tastencodes (deutsche Tastaturbelegung) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1157 1157 1160
Glossar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1163
Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Sandini Bib
Sandini Bib
Teil 1: Grundlegendes und Allgemeines In diesem Teil werden die grundlegenden Komponenten eines Personal Computer sowie verschiedene Peripheriegeräte vorgestellt, die heutzutage eigentlich zu einem PC dazugehören. Damit sollen Sie zunächst in die Begriffe der PC-Welt und den grundsätzlichen Aufbau eines PC eingeführt werden. Dieser Teil des Buches wendet sich an Einsteiger, aber auch Fortgeschrittene werden auf die nachfolgenden, technisch anspruchsvolleren Teile des Buches vorbereitet.
1 Die PC-Komponenten Die Bezeichnung Personal Computer oder kurz PC besagt, dass jeder Benutzer mit seinem eigenen, d.h. persönlichen Computer, arbeiten kann. Als der Original-PC von IBM im Jahre 1981 erschien, verfügte er über einen 16-Bit-Mikroprozessor (8088), der mit 4,7 MHz getaktet wurde, und über einen RAM-Speicher von 64 KByte. Es gab außerdem ein Diskettenlaufwerk mit einer Kapazität von 360 KByte, und optional war ein Kassettenrekorder als Massenspeicher anschließbar. Die Monitore flimmerten oft grün oder auch orange, und eine der hauptsächlichen PC-Anwendungen war die Textverarbeitung; der PC fungierte also oft nur als »intelligente Schreibmaschine«. Monitor
Drucker
PC Maus
Tastatur Abb. 1.1: Die PC-Grundausstattung in der 80er Jahren
Wenn Sie sich heute einen PC im Geschäft oder Prospekt ansehen, werden Sie feststellen, dass die eben genannten Daten meilenweit von einem aktuellen PC entfernt sind, auch wenn die Textverarbeitung immer noch ein wichtiges Einsatzgebiet ist. Aber dies ist eben längst noch nicht alles:
Sandini Bib 2
Kapitel 1
Der PC als Spielplattform mit immer realistischerer wirkender 3D-Grafik, der PC als »Rechenknecht«, der PC als Steuerungscomputer für industrielle Anwendungen, der PC als Musik-Kompositionsmaschine, der PC als Videoschnittplatz, der PC als »Internet-Surfbrett« – und Ihnen wird sicher auch noch die eine oder andere (Lieblings-)Anwendung einfallen. Ein PC lässt sich vom Konstruktionsprinzip her mittels unterschiedlicher Hard- und Software derart zusammenzustellen, dass er eben zu einem persönlichen PC werden kann. Im Grunde genommen war ein PC aber jahrelang ein Gerät für Spezialisten mit dem nötigen Kleingeld von anfangs ca. 5.000 €, und erst im Laufe der Zeit ist er zu dieser universell einsetzbaren Maschine geworden. Aufgrund der sich im rasanten Tempo entwickelnden Halbleitertechnologie ist heutzutage die Anschaffung eines Universalgenies zu einem moderaten Preis möglich. Nicht nur die Vorstellungen über die inneren Werte eines PC haben sich im Laufe der Zeit stark geändert, sondern auch die Vorstellungen darüber, was ein PC mindestens an Funktionalität bieten muss, was sich dementsprechend auch in zusätzlichen Peripheriegeräten niederschlägt. Unter Peripheriegeräten oder kurz Peripherie versteht man im Übrigen alle Einheiten, die sich außerhalb des PC-Gehäuses befinden. Zunächst ist aber ein Gehäuse mit dem Netzteil für die Versorgung der Elektronik vorhanden, die sich auf einer Hauptplatine (Mainboard, Motherboard) befindet und als wichtigste Komponenten den Mikroprozessor sowie den Speicher enthält. Das interne Netzteil versorgt außerdem die jeweiligen Laufwerke (Diskettenlaufwerk, Festplatte) mit Strom, und über Einsteckkarten, die in Steckfassungen (Slots) auf dem Mainboard gesteckt werden, wird der (Minimal-)PC mit einer Grafikkarte für die Ansteuerung eines Monitors sowie mit Schnittstellen für den Anschluss von Peripheriegeräten komplettiert. Für die Bedienung ist noch eine Tastatur notwendig, und spätestens seit es Windows gibt (ca. 1988), gehört auch eine Maus dazu. Als wichtigstes Peripheriegerät gilt dann immer noch ein Drucker. An diesem prinzipiellen Aufbau eines PC hat sich im Grunde genommen über die Jahre nichts geändert, und man erhält damit einen typischen PC-Arbeitsplatz. Gleichwohl bietet ein moderner PC heutzutage weit mehr Möglichkeiten, als diese Minimal-Auslegung zu leisten vermag, wie es oben bereits angesprochen wurde, und daher gehören zu einem aktuellen PC außerdem noch ein DVD-Laufwerk, und ein CD-Writer (Brenner) sowie eine Festplatte mit einer Kapazität von typischerweise 80 GByte und mehr, während in den allerersten PCs die Festplatte eine Kapazität von lediglich 10 MByte besaß. Vom obligatorischen Diskettenlaufwerk hat man sich bei den neueren PC-Modellen mittlerweile verabschiedet, weil seine maximale Kapazität von 1,4 MByte ohnehin schon seit einiger Zeit nicht mehr für Programme ausreicht. Als Verbindung zu anderen Computern ist eine Netzwerkkarte üblich sowie ein Modem für den Internetzugang. Eine Soundkarte mit extern angeschlossenen Lautsprechern sorgt für die akustische »PC-Begleitung«, und eine TV-Radio-Karte rundet die Multimedia-Ausstattung dann meist noch ab. Neben den althergebrachten Schnittstellen, die vorwiegend für den Anschluss eines Druckers (Parallel-Port) und einer Maus (serieller Port) zum Einsatz kommen, gibt es nunmehr wesentlich leistungsfähigere wie den Universal Serial Bus (USB), der diese traditionellen Schnittstellen immer überflüssiger zu machen scheint, da sich hierüber auch recht unterschiedliche Peripheriegeräte wie Drucker, Scanner oder Digital-Kameras mit dem PC verbinden lassen. Daneben ist Firewire (IEEE-1394) prädestiniert für den Anschluss von Video-Kameras und generell von Einheiten, die möglichst rasch relativ große Datenmengen mit dem PC austauschen sollen. Die genannten einzelnen PC-Einheiten sind für heutige PCs nichts Besonderes mehr und daher schon als Standard zu betrachten.
Sandini Bib Die PC-Komponenten
A: C: E: G: I: K: M: O: Q: S:
240 V-Netzanschluss PS/2-Tastaturanschluss COM-Port (RS232) Audioeingang (digital) 2x USB-Anschluss 2x Firewire-Anschluss Audioeingang (Line) TV-Out, Composite 2x Monitoranschluss TV-Antenneneingang
3
B: D: F: H: J: L: N: P: R: T:
Stromnetztrennender Schalter PS/2-Mausanschluss Parallel-Port (LPT1) Audioausgang(digital) Netzwerkanschluss (TP) Audioausgänge (6-Kanal) Mikrofoneingang TV-Out, S-Video Modemanschluss Radio-Antenneneingang
Abb. 1.2: Ein aktueller PC bietet an der Rückseite eine Fülle von Anschlussmöglichkeiten.
Entsprechende Komplett-PCs – allerdings meist ohne Monitor und Lautsprecher, die daher separat zu erwerben sind – werden insbesondere durch die bekannten (Lebensmittel-)Discounter in regelmäßigen Zeitabständen auf den Markt gebracht, und diese PCs und auch Notebooks bestechen meist durch ein (sehr) gutes Preis-/Leistungsverhältnis. Dass es hier und da eine Schwachstelle bei den verwendeten Komponenten dieser Komplett-PCs gibt, wie etwa ein eher unterdimensioniertes Netzteil oder einen relativ langsam arbeitenden Speicher oder vielleicht auch eine Grafikkarte, die bei neueren Spielen nicht das Optimum bieten kann, liegt dabei auf der Hand. Letztendlich sind diese PCs aber auch durch das mitgelieferte Betriebssystem und die Software als Rundum-Paket zu verstehen, mit dem auch der PC-Einsteiger sofort die unterschiedlichsten Anwendungen ausführen kann. Obendrein bieten derartige PCs mitunter noch ganz nützliche Optionen, die man bei PCs der so genannten Markenhersteller wie beispielsweise Acer, Dell, Compaq oder HP vergeblich sucht; etwa, dass wichtige Peripherieanschlüsse auch leicht zugänglich auf der Frontplatte angebracht oder Lesegeräte für unterschiedliche Flash-Speicherkarten integriert sind.
A: C: E: G: I:
Kartenleseschächte Firewire-Anschluss Audio-Ausgang(Line-Out) Audio-Eingang (Line-In) S-Video (Eingang/Ausgang)
B: D: F: H:
3x USB-Anschluss Gameport-Anschluss (Joystick) Mikrofoneingang Video-Eingang Composite
Abb. 1.3: Recht praktisch sind an der PC-Frontplatte angebrachte Anschlüsse, sowie Lesegeräte für Speicherkarten.
Sandini Bib 4
Kapitel 1
Gleichwohl sind nach wie vor speziellere und mehr oder weniger individuell ausgestattete PCs mit unterschiedlichster Peripherie für Anwendungen in Handel, Industrie, Bank- und Versicherungsgewerbe, Wissenschaft und Forschung etc. notwendig. Die dort gewünschten PCs sind möglichst optimal auf die jeweiligen Einsatzgebiete zugeschnitten und stellen nicht derartige »Allrounder« dar, wie die oben kurz beschriebenen PCs, die eher als Standard für den privaten und somit universelleren Einsatz ausgelegt sind. Es spielt eigentlich keine Rolle, was man im Einzelnen mit einem PC an Aufgaben bewältigen will, denn er ist letztendlich aufgrund des vor über 20 Jahren von IBM zugrunde gelegten (modularen) Konzeptes (fast) beliebig mit einer Vielzahl von unterschiedlichen Einheiten aufund im Bedarfsfall auch umzubauen, was neben der durchgängigen Software-Kompatibilität der zweite Grund für den damals ungeahnten Erfolg des PC ist. Sie werden in diesem Buch an einigen Stellen den Ausdrücken PC, XT und AT begegnen, was in der Entwicklungsgeschichte des Original-IBM-PC begründet liegt. Das erste Gerät war der PC, von dem ich oben die wichtigsten Daten genannt habe, dann folgte der so genannte XT (eXtended Technology), der gegenüber dem PC als wesentliche Neuerung auch über ein Festplattenlaufwerk verfügte. Darauf folgte der AT (Advanced Technology), der den ersten vollwertigen 16-Bit-Prozessor (80286) einsetzte, und dann wurde es langsam müßig, sich neue Kürzel auszudenken, denn es ging fortan in der Entwicklung Schlag auf Schlag: 386, 486, Pentium usw. bis zum mit über 2 GHz getakteten Pentium 4 von Intel oder auch dem Athlon XP der Firma AMD, um nur einige Typen zu nennen. Heute firmieren die persönlichen Computer alle unter dem ursprünglichen Begriff PC zur Abgrenzung gegenüber anderen Computerarchitekturen wie denen von den Firmen Apple oder auch Sun, deren Computer eben nicht zum gewachsenen PC-Standard kompatibel sind. So unterschiedlich leistungsfähig die PCs der verschiedenen Generationen auch sein mögen, wer die immer schneller fortschreitende PC-Technologie eine Zeit lang verfolgt (hat), wird feststellen, dass sich die Aufgaben und Problemstellungen in der PC-Technik im Kern nicht wesentlich verändern. Neuere Betriebssysteme, die quasi von sich aus immer leistungsfähigere Hardware verlangen, ohne dass man auch nur ein einziges Programm gestartet hat, sollten nicht darüber hinwegtäuschen, dass im PC »nur« eine Vielzahl von elektronischen Schaltkreisen am Werke ist. Die typischen Fehlerquellen und Ansatzpunkte für PC-Reparaturen, -Umbauten und -Aufrüstmaßnahmen sind aus diesem Grunde (fast) unabhängig von der jeweiligen PC-Generation. Zum genauen Verständnis der PC-Funktion ist jedoch ein fundiertes Maß an Hardware-Kenntnissen notwendig, was dann sogar eigene Hardware- und hierfür passende Software-Entwicklungen ermöglicht.
1.1 Das PC-Innenleben In diesem Kapitel werden die verschiedenen Bestandteile des PC näher vorgestellt, die Ihnen nicht unmittelbar zugänglich sind, da sie schließlich in einem geschlossenen Gehäuse untergebracht sind. Da dem Gehäuse insbesondere in Bezug auf eine Erweiterbarkeit eine besondere Bedeutung zukommt, ist es zunächst an der Reihe.
1.1.1
Gehäuse
Die einzelnen Einheiten für einen PC können prinzipiell in unterschiedliche Gehäusetypen eingebaut werden. Größe und Bauform hängen zum einen davon ab, welchem Formfaktor das Mainboard entspricht, und zum anderen davon, wie viele Laufwerke vorgesehen sind, für die im vorderen Teil eines Gehäuses in der Regel passende Metallrahmen angebracht sind. Der klas-
Sandini Bib Die PC-Komponenten
5
sische Typ ist das Desktop-Gehäuse (vg. Abbildung 1.1), auf das sich auch der Monitor platzieren lässt. In den letzen Jahren sind allerdings die Tower-Gehäuse gebräuchlicher, bei denen des Mainboard nicht waagerecht wie bei einem Desktop-Gehäuse eingebaut ist, sondern senkrecht. Von diesen beiden Grundtypen gibt es nun eine Reihe von Ablegern, die unterschiedlich hoch sind und dann beispielsweise als Super-Slim-Line-, Slim-Line-Desktop bzw. Mini-, Midi- oder auch Big-Tower bezeichnet werden.
Abb. 1.4: Verschiedene Gehäusetypen, wobei insbesondere die Tower-Modelle recht verbreitet sind.
Jahrelang herrschte dabei das Einheitsgrau als Farbe bei den Gehäusen vor, und erst in letzter Zeit wird etwas verstärkt Farbe ins Spiel gebracht. Dieses »Farbspiel« scheint dabei eine ganz neue Disziplin initiiert zu haben, die als Case Modding bezeichnet wird. Dabei geht es darum, in das möglichst große Tower-Blechgehäuse mit der Stichsäge Löcher hinzuschneiden, die später, mit farbigem oder gar leuchtendem Einfassband und Plexiglas versehen, als Sichtfenster in das PC-Innere dienen. Damit dies nicht zu langweilig aussieht, wird dann am besten eine Wasserkühlung für die speziellen Kühlerkörper, die zumindest auf der CPU und der Grafikkarte sitzen, mit Plastikschläuchen und einer Aquarienpumpe eingebaut, und das Kühlwasser ist natürlich eingefärbt. Kleine Neonröhren werden dann auch noch im Inneren an imposanten Stellen angeschraubt, und fertig ist der wirklich persönliche Computer. Im Zubehörhandel sind mittlerweile alle einzelnen Komponenten für das Case Modding zu finden, und wer schon keine Wasserkühlung einbauen will, weil er bereits ein Aquarium hat, der kann zumindest ein fertiges Gehäuse mit Sichtfenster nehmen, Kühler mit blauen LEDs einbauen und das langweilige Lüftergitter des Netzteils an der Gehäuserückseite durch ein »kultiges« BiohazzardModell ersetzen. Daneben gibt es aber noch relevantere Gehäuseaspekte, wobei ich mich allerdings nur auf typische PC-Gehäusetypen beziehe und demnach weder spezielle Mini- noch Server-Gehäuse betrachten werde. Wenn Sie einen Komplett-PC erworben haben, verfügt dieser PC natürlich über dasjenige Gehäuse, das der Hersteller für diese Serie ausgewählt hat, und Sie haben hierfür keinerlei Wahlmöglichkeit. Falls Sie einen PC komplett aus Einzelkomponenten selbst oder auch vom PC-Händler Ihres Vertrauens zusammenbauen lassen wollen, gibt es durchaus Wahlmög-
Sandini Bib 6
Kapitel 1
lichkeiten. Unter Beachtung des jeweiligen Formfaktors (BAT, ATX) des Mainboards und persönlicher Vorlieben bleibt im Grunde genommen nur noch als Auswahlkriterium übrig, was hier im Einzelnen an Laufwerken eingebaut werden soll, damit diese dann ihren Platz in einem Einbauschacht finden können. Dabei sollte man ruhig etwas großzügiger kalkulieren, damit später auch noch eine Aufrüstung möglich ist.
Abb. 1.5: Ein Tower-Gehäuse aus Aluminium mit Sichtfenster und interner Beleuchtung als Grundlage für das Case Modding
Es kann außerdem davon ausgegangen werden, dass je größer das Gehäuse ist, desto leistungsfähiger auch das integrierte Netzteil dimensioniert ist, weil PC-Gehäuse und Netzteil meist als Einheit verkauft werden. Bei einem Tower-Gehäusetyp ist das Netzteil demnach für eine höhere Leistung ausgelegt, als dies in einem Mini-Tower- oder Slim-Line-Gehäuse der Fall ist. Zusätzliche Komponenten wie Laufwerke oder auch eine neue »stromhungrigere« Grafikkarte erfordern natürlich einen höheren Strom aus dem Netzteil, so dass diese Komponente bei Aufrüst- und Umbaumaßnahmen besondere Aufmerksamkeit verlangt. Näheres hierzu ist im Kapitel 1.1.2 zu finden. Gehäusetyp
Höhe Breite
Tiefe Netzteil
Mainboards
Super Slim Line Slim Line Desktop Mini-Tower Midi-Tower Tower Big Tower
76 110 160 350 480 620 680
390 420 420 430 400 430 450
Mini-Baby, NLX, LPX Mini-Baby, NLX, LPX AT, BAT, ATX, mini ATX, micro ATX BAT, ATX, mini ATX, micro ATX BAT, ATX, mini ATX, micro ATX AT, BAT, ATX, mini ATX, micro ATX AT, BAT, ATX, mini ATX, micro ATX
406 435 430 180 170 190 230
150 W 180-200 W 200-230 W 180-230 W 180-230 W 200-230 W 230-300 W
Tab. 1.1: Typische Maße von Gehäusetypen und dazu passende Mainboards sowie Netzteile
Unter den oben erwähnten persönlichen Vorlieben möchte ich hier einmal kein Case Modding oder farbliche Aspekte verstehen, sondern die Überlegung, ob das Gehäuse auch servicefreundlich sein soll. Idealerweise ist es auch schallgedämmt, so dass nicht zu viel (Lüfter-)Lärm oder Brummen der Festplatte nach außen dringen kann. Im PC-Zubehörhandel gibt es Schalldämmmaterial in Form von speziellen Matten (Noiseblocker) sowie auch schwingungsgedämpfte Fest-
Sandini Bib Die PC-Komponenten
7
plattenrahmen (NoVibes), allerdings zu verhältnismäßig hohen Preisen. Wer entsprechende Umbaumaßnahmen scheut, plant eine Schalldämmung gleich von vornherein mit ein, damit der Händler diese vielleicht gleich mit vorsieht.
Abb. 1.6: Bei diesem Tower-Gehäuse ist die Frontplatte nur aufgeschnappt, und das Mainboard lässt sich auf einem Blechschlitten nach hinten herausziehen.
Bei den Desktop-Gehäusen ist es möglich, dass hier ein Klappdeckel vorhanden ist, der wie die PKW-Motorhaube geöffnet werden kann, so dass man das PC-Innenleben ohne Schrauberei unmittelbar vor sich hat. Wie erwähnt, sind heutzutage jedoch eher die verschiedenen TowerVarianten üblich, und hier gibt es Typen mit aufzuschiebenden oder auch aufzuklappenden Seitenteilen, wofür zum Öffnen ebenfalls kein Schraubendreher benötigt wird. Das Mainboard kann zudem auf einem herausziehbaren Blech montiert sein, was sich als ganz praktisch für Montage- und Servicezwecke erweisen kann. Andererseits sind einige Gehäusetypen mit einer Vielzahl von nicht immer leicht zu entdeckenden Schrauben versehen, die sich mitunter sogar unter der »aufgeschnappten« PC-Frontplatte befinden. Daher ist diese erst einmal nach vorn abzuziehen, bevor überhaupt die Schrauben sichtbar werden. Gefährlich können im Übrigen scharfe und nicht sauber entgratete Blechkanten werden, an denen man sich schon einmal verletzen kann, so dass man vielleicht auch auf diese Dinge achten sollte, wenn nach einem servicefreundlichen PC-Gehäuse Ausschau gehalten wird. Ob nun beispielsweise ein Desktop-Gehäuse ein paar Millimeter höher oder tiefer ist, spielt für die Montage eines Mainboards nicht die ausschlaggebende Rolle. Vielmehr ist unbedingt darauf zu achten, dass das Mainboard auch problemlos in das Gehäuse hineinpasst und zu befestigen ist. Falls etwa zusätzliche Löcher gebohrt und Öffnungen im Gehäuse hergestellt werden müssen, sollte man von einem Umbau Abstand nehmen, denn es werden mit großer Wahrscheinlichkeit weitere Probleme auftreten, wie etwa, dass die Laufwerke nicht befestigt werden können. Außerdem können dabei die Gehäusestabilität sowie die elektrische Sicherheit (Erdung) auf der Stecke bleiben.
Sandini Bib 8
Kapitel 1
Abb. 1.7: Aufklappbare Seitentüren erlauben ein einfachen Zugang zum PC-Inneren.
1.1.2
Netzteil
Das PC-Netzteil versorgt das Mainboard und die weiteren Komponenten wie die Laufwerke mit den notwendigen Spannungen, wobei verschiedene Netzteiltypen existieren, die sich im Wesentlichen in ihrer Bauform und ihrer Leistung voneinander unterscheiden. Dies wird spätestens dann relevant, wenn ein defektes Netzteil ausgetauscht werden muss. Es sollte natürlich versucht werden, das defekte Netzteil durch ein möglichst identisches zu ersetzen, was jedoch bei älteren PCs zum Problem werden kann, da der betreffende Typ nicht mehr erhältlich ist. Der jeweilige Hersteller des Netzteils spielt dabei keine große Rolle, denn es gibt davon eine Vielzahl. Es darf aber keines mit einer geringeren Leistung als das ursprünglich im PC vorhandene eingebaut werden, und es muss auch genau so wie das alte in den PC passen und entsprechend eingebaut werden können.
Abb. 1.8: Zwei BAT-Netzteile unterschiedlicher Bauform. Das rechte Netzteil besitzt den üblichen externen Netzschalter, der meist an der PC-Gehäusefront montiert ist, während der Schalter beim linken Netzteil, das in älteren PCs zu finden ist, direkt angebracht ist.
Sandini Bib Die PC-Komponenten
9
Temperaturgesteuerte Lüfter, die sich erst dann einschalten, wenn eine bestimmte Temperatur im Netzteil überschritten worden ist, und einem nicht ständig auf die Nerven fallen, sind leider immer noch nicht standardmäßig vorgesehen. Aus diesem Grunde kann man davon ausgehen, dass bei größeren (leistungsfähigeren) Netzteilen eher mit störenden Lüftergeräuschen zu rechnen ist als bei kleineren. Ist der Austausch des Netzteils notwendig, sollte daher – wenn möglich – gleich eines gewählt werden, das über einen temperaturgesteuerten Lüfter verfügt. Ein typisches Standard-Netzteil liefert 150-200 Watt und findet in den Gehäusetypen Desktop, Slim-Line und Mini-Tower seine Anwendung. Problematisch beim Ersatz eines Netzteils sind stets herstellerspezifische PCs, wie beispielsweise von den Firmen Compaq, SNI oder auch Hewlett-Packard, bei denen die Netzteile zum einen meist überteuert und zum anderen auch nicht immer leicht zu beschaffen sind. Eine weitere Unterteilung der Netzteiltypen ergibt sich dadurch, ob sie für BAT-, ATX- oder auch NLX-Gehäuse vorgesehen sind. Diese Standards legen in erster Linie mechanische Abmessungen für Gehäuse, Mainboards sowie Netzteile und zudem elektrische Werte für die beiden letztgenannten Einheiten fest. AT steht bekanntlich für Advanced Technology und weist Mainboards in der ursprünglichen Größe aus, wie sie damals von IBM begründet wurde. Dazu gesellten sich im Laufe der Zeit kleinere Typen, wobei insbesondere die Baby-AT-Form (BAT) sehr lange Zeit sehr gebräuchlich war und daher statt AT meist die Bezeichnung BAT für diesen Standard zu finden ist. In Tabelle 1.2 sind die wichtigsten Daten angegeben. Das Maß der Breite bezieht sich dabei auf die Seite mit dem Tastaturanschluss, der damit auch die Lage des Mainboards im PC-Gehäuse eindeutig bestimmt. Mainboard-Typ
Abmessungen in mm (Breite x Länge)
Übliche Anwendungen (PC-Typen)
AT-Board Baby-Board ¾ Baby Mini-Baby
305 x 335 220 x 330 220 x 275 220 x 220
alte 8088-486-PCs, EISA-PCs ISA-, EISA-, PCI-PCs ISA-, PCI-, VLB-PCs ISA-, VLB-PCs
Tab. 1.2: Die Abmessungen der üblichen Mainboards nach dem (B)AT-Standard
Von einem Netzteil nach dem BAT-Standard werden generell die Spannungen +5 V, -5 V, +12 V und -12 V geliefert. Wie viel Strom die einzelnen Ausgänge abgeben können, hängt von der angegebenen Watt-Zahl (W) des Netzteils ab. Sie errechnet sich aus der Multiplikation der jeweiligen Spannung mit dem entsprechenden Strom und der Addition aller Watt-Angaben (vgl. Tabelle 1.3). Ein BAT-Netzteil weist zwei Stecker (P8, P9) für das Mainboard auf, über die es mit Strom versorgt wird. Die schwarzen Kabel des Netzteils sind stets die Masseleitungen (GND, Ground). Für die Laufwerke und möglicherweise auch das Anzeige-/Bedien-Panel sind die anderen Kabel des Netzteils mit den Leitungsfarben gelb, schwarz und rot vorgesehen. Sie sind zusammengefasst an großen und kleinen Steckern befestigt. Die Anschlüsse sind dabei so konfektioniert, dass Verwechslungen eigentlich ausgeschlossen sind und nur dann mit Gewalt hervorgerufen werden können, wenn versucht wird, den Verpolungsschutz zu überwinden. Es empfiehlt sich daher, an diesen Kabeln keine Änderungen vorzunehmen. Adapterkabel, die von einem großen Anschluss, der für 5,25"-Disketten- und Festplattenlaufwerke vorgesehen ist, den Übergang zu einem kleinen schaffen, der vorwiegend für 3,5"-Disketten- und CD-ROM-Laufwerke eingesetzt wird, sind im Handel für ein paar Euro zu haben.
Sandini Bib 10
Kapitel 1
Spannung
Strom
Watt
Kabelfarbe
+5 V -5 V +12 V -12 V
20 A 0,5 A 8A 0,5 A
100 2,5 96 6
rot weiß gelb blau
Tab. 1.3: Die Daten und die Farbkennzeichnung eines 200 W-BAT-Netzteils
Der Spannungsanschluss für ein BAT-Mainboard besteht, wie es auch in Abbildung 1.9 erkennbar ist, aus den beiden Steckern P8 und P9, die nie vertauscht werden dürfen, da dies die Mainboardelektronik zerstören würde. Entweder merkt man sich, dass sich die schwarzen Leitungen der beiden Stecker immer innen gegenüberstehen müssen. oder man bringt hier einfach eine Markierung an.
Abb. 1.9: Der Spannungsanschluss bei BAT-Mainboards
Eine weitere Leitung des Mainboard-Anschlusskabels (Pin 1 an P8), die üblicherweise orange ist, führt das so genannte Power-Good-Signal. Auf dem Mainboard wird das Power-Good-Signal üblicherweise ausgewertet, und die Adress- und Datenleitungen werden ab- bzw. erst gar nicht eingeschaltet, falls das Signal nicht in Ordnung ist, was anhand eines Low-Pegels erkannt wird. Seit dem Jahre 1995 gibt es den ATX- (AT eXtended) und LPX- (Low Profile eXtended) und seit 1996 den NLX-Standard (New Low Profile eXtended). Alle drei Versionen definieren neue Formfaktoren für Mainboards, Gehäuse und Netzteile, was bedeutet, dass diese Einheiten weder untereinander noch zum BAT-Standard kompatibel sind. Immerhin sind die ATX- und NLXNetzteile sowohl in elektrischer als auch mechanischer Hinsicht meist identisch, und LPX spielt auf dem Markt keine große Rolle mehr, denn es wurde im Prinzip von NLX ersetzt. Eine geschaltete Netzbuchse für den Anschluss eines Monitors gibt es weder bei ATX noch bei NLX. Der Netzschalter ist stets im Netzteil selbst eingebaut und befindet sich auf der Gehäuserückseite. Leider gibt es aber auch ATX-Systeme, die über keinen netztrennenden Schalter auf der PC-Rückseite verfügen, was dazu führt, dass der PC ständig Strom verbraucht, auch wenn er von der PC-Frontplatte her als ausgeschaltet erscheint. Der Ein/Ausschalter an der PC-Frontplatte ist bei ATX nämlich ein Taster und kein Schalter.
Sandini Bib Die PC-Komponenten
11
Abb. 1.10: Der Spannungsanschluss bei ATX-Mainboards
Der Stecker für die Spannungsversorgung des Mainboards wurde neu definiert, während die Stecker für die Laufwerke bei ATX und dessen Ablegern dieselben wie beim BAT-Standard sind. Den nicht vertauschungssicheren Mainboard-Anschluss, der aus den beiden Steckern P8 und P9 besteht, gibt es bei ATX nicht mehr, sondern nur noch einen (siehe Abbildung 1.10), der auf Grund seiner Auslegung auch nicht falsch herum aufgesteckt werden kann. Neben den üblichen Spannungen +5 V, -5 V, +12 V, -12 V, mehreren Masseleitungen (COM=common=gemeinsam) und dem Power-Good-Signal (PW-OK) sind nunmehr auch 3,3 V vorhanden sowie die Signale Power-On (PS-ON) und 5 V-Standby (5 VSB). Das Signal PS-ON dient der An- und Abschaltung des Netzteils und befindet sich üblicherweise mit Hilfe einer Zusatzschaltung auf dem Mainboard auf High-Potenzial. Wird das Signal durch einen Tastendruck auf Masse gezogen, werden damit die Spannungen des Netzteils aktiviert. Ein ATX-Netzteil ist deswegen auch nicht völlig abgeschaltet, wenn nicht der netztrennende Schalter auf der Gehäuserückwand ausgeschaltet ist. Das PS-ON-Signal wird vielfach dazu genutzt, den PC, etwa nach dem Herunterfahren von Windows, automatisch abzuschalten. Kontakt Nr.
Belegung
Farbe
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
3,3 V 3,3 V COM, Masse 5V COM, Masse 5V COM, Masse PW-OK 5 VSB 12 V 3,3 V -12 V COM, Masse PS-ON COM, Masse COM, Masse COM, Masse -5 V 5V 5V
orange orange schwarz rot schwarz rot schwarz grau lila gelb orange blau schwarz grün schwarz schwarz schwarz weiß rot rot
Tab. 1.4: Die Belegung des ATX-Mainboard-Anschlusses mit den üblichen Farben der einzelnen Leitungen.
Sandini Bib 12
Kapitel 1
Die 5 V-Standby-Leitung (5 VSB) ist ebenfalls nicht spannungslos, wenn der PC nicht per Netzschalter oder schaltbarer Steckdosenleiste, die sehr empfehlenswert ist, falls der Schalter am PC nicht vorhanden sein sollte, ausgeschaltet ist. Die 5 VSB-Leitung wird unterschiedlich oder auch gar nicht verwendet. Eine typische Anwendung ist das Einschalten des PC mit Hilfe eines FaxModems, das eingehende Rufe auch bei ausgeschaltetem PC erkennen und das Hochfahren des PC dadurch initiieren kann. Entsprechendes kann auch mit einer Netzwerkkarte praktiziert werden, die hierfür ebenfalls einen entsprechenden Anschluss besitzen muss, der dort auch als Wake On LAN bezeichnet wird. Der Vollständigkeit halber sei erwähnt, dass neben den BAT- und ATX-Netzteilen, die die größte Verbreitung haben, noch einige speziellere existieren, die in der Mehrzahl der Fälle in Servern eingebaut werden. Es gibt Mainboards – meist Dual- oder Multiprozessor-Boards –, für die ganz bestimmte Netzteiltypen explizit vorgeschrieben sind. Diese Mainboards benötigen u.U. zusätzliche Spannungsanschlüsse für die Versorgung der CPU(s), für erweitertes Power-Management oder auch für redundant ausgelegte Netzteile. Von derartigen Typen existiert eine ganze Reihe von Hersteller-spezifischen Lösungen.
Abb. 1.11: Der zusätzliche ATX12 V-Anschluss für die Spannungsversorgung des Pentium 4
Für den ersten Pentium 4-Prozessor im 423-poligen Gehäuse wurde ein neues ATX-Netzteil mit zusätzlichem ATX12 V- und AUX-Anschluss für 3,3 V und 5 V eingeführt, und es wird hierfür auch ein neues ATX-Gehäuse benötigt. Ab dem neueren Pentium 4 im 478-poligen Gehäuse, der sich im Stromverbrauch genügsamer zeigt als der ältere Pentium 4, sind diese zusätzlichen Power-Connectoren nicht mehr zwingend vorgeschrieben. Einige aktuelle Mainboards stellen diese Anschlüsse daher auch nicht mehr zur Verfügung, und diese Boards sollten dann auch mechanisch in übliche ATX-Gehäuse passen. Die neuere Pentium 4-CPU soll nunmehr allein aus der 12 V-Spannung gespeist werden, die auf dem Mainboard mithilfe eines Spannungsreglers auf die jeweilige CPU-Spannung (z.B. 1,6 V) umgesetzt wird, so dass der AUX-Anschluss mit 3,3 V und 5 V eigentlich nicht mehr notwendig ist. Der übliche ATX-Spannungsanschluss ist aber nur für maximal 6 A spezifiziert, so dass es doch sicherer erscheint, wenn zumindest der ATX12 V-Anschluss vorhanden ist, weil eine Pentium 4-CPU durchaus einen Strom von bis zu 8 A ziehen kann. Die Kabel selbst vertragen allerdings durchaus noch 8 A und mehr.
Sandini Bib Die PC-Komponenten
1.1.3
13
Mainboard
Standard ist bei PCs heutzutage ATX, und hiervon ausgehend sind im Laufe der Zeit einige »Ableger« entstanden. Tabelle 1.5 gibt die Maße (in mm) der verschiedenen ATX-Standards an, für die entsprechende Mainboards erhältlich sind. Für ein ATX-Mainboard sind auch ein ATXGehäuse und ein entsprechendes ATX-Netzteil nötig, wobei man das Gehäuse meist zusammen mit einem bereits eingebauten Netzteil erwirbt. Üblicherweise lassen sich in allen heutzutage gebräuchlichen ATX-Gehäusen durchaus die verkleinerten Mainboard-Versionen einbauen. Der umgekehrte Weg – etwa der Einbau eines ATX-Mainboards in ein Micro-ATX-Gehäuse – ist natürlich nicht möglich. Standard
Breite
Länge
ATX Mini-ATX Micro-ATX Flex-ATX
305 284 244 229
244 208 244 191
Tab. 1.5: Maße der verschiedenen ATX-Mainboard-Varianten in Millimeter
Der Einbau eines Baby-AT-Boards in ein ATX-Gehäuse ist, von einigen Ausnahmen abgesehen, in der Regel nicht möglich, und nur wenige ATX-Netzteile und Mainboards bieten einen PowerAnschluss in zwei Varianten (P8, P9 und ATX), und es sind auch entsprechende Adapterkabel erhältlich. Es empfiehlt sich jedoch generell, keine Kombination von Baby-AT- und ATX-Komponenten vorzusehen. Trotz aller möglichen Variationen der Standards stellt ATX in seiner ursprünglichen Auslegung (305 x 244 mm) für die verschiedenen Mainboards und Gehäusetypen die gebräuchlichste Realisierung dar. Andere Gehäuse, beispielsweise für Flex-ATX, sind im einschlägigen PC-Handel eher selten zu finden. Auf die verkleinerten ATX- sowie auch die LPX/NLX-Versionen trifft man daher eher bei (preisgünstigen) Komplett-PCs, die im Inneren vielfach keine Standard-Karten aufnehmen können und sich generell als problematisch für PCErweiterungen und -Umbauten erweisen. Mit ATX wurde ein Baby-AT-Board mechanisch um 90º gedreht, und die Anschlüsse für den Drucker (IEEE-1284), die beiden RS232-Schnittstellen und die Maus (PS/2) sind nun direkt auf dem Mainboard platziert, wodurch keine Flachbandkabel vom betreffenden MainboardAnschluss zu den jeweiligen Slotblechbuchsen mehr geführt werden müssen, wie es bei BATBoard der Fall ist. Bei älteren (BAT-)Boards sind die Schnittstellen-Controller außerdem nicht auf dem Mainboard selbst vorhanden, so dass diese dann über (ISA-)Einsteckkarten im System integriert werden müssen, was ebenfalls für die Laufwerkscontroller gilt. Bei ATX-Boards sind alle üblichen Controller, sei es für die Laufwerke oder auch für die üblichen Schnittstellen, mit auf dem Mainboard untergebracht. Weitere Anschlüsse wie für den Universal Serial Bus (USB), Firewire (IEEE-1394), Netzwerk oder auch Audioverbindungen sind hier ebenfalls üblich. Sie liegen allesamt auf der Gehäuserückseite im so genannten I/O-Bereich (vgl. Abbildung 1.2, Kennzeichnungen C-N). Demnach sind all diejenigen Einheiten unmittelbarer Bestandteil des Mainboards (On-Board-Einheiten), deren Anschlüsse sich in diesem I/O-Bereich befinden.
Sandini Bib 14
Kapitel 1
Abb. 1.12: Ein ATX-Mainboard mit den üblichen Komponenten und Schnittstellen zu Peripheriegeräten, die mit den Anschlüssen im I/O-Bereich verbunden werden. Der I/O-Bereich ist auf der linken oberen Seite des Boards erkennbar und im unteren Bildteil noch einmal gesondert abgebildet.
In der Praxis geht mit dem ATX-Standard allerdings ein mechanisches Problem einher, da es mittlerweile mehrere Versionen davon gibt und der I/O-Bereich (158 x 44 mm), wo sich die Anschlüsse für die auf dem Board integrierten Schnittstellen befinden, zwar definiert ist, es zunächst aber versäumt wurde, die notwendigen Ausschnitte im Gehäuse hierfür festzulegen. Die Folge davon ist, dass die Gehäuse- und Mainboardhersteller verschiedene Abdeckbleche für unterschiedliche Mainboards bereitstellen müssten. Mit der ATX-Spezifikation 2.1 wurde zwar eine universell verwendbare I/O-Blende definiert, allerdings ist mittlerweile eine Vielzahl unterschiedlicher Anschlüsse (Onboard-Sound, -Grafik, -LAN) auf Mainboards üblich, und einige traditionelle Schnittstellen (IEEE-1284, RS232, PS/2 für Maus und Tastatur) werden schon gar nicht vorgesehen, wie es auch der Abbildung 1.12 erkennbar ist. Für den Anschluss von Tastatur und Maus ist dann der USB vorgesehen. Trotz der ATX-Standardisierung kann man daher keineswegs davon ausgehen, dass die I/OBlende eines Gehäuses tatsächlich für die Onboard-Anschlüsse eines bestimmten Mainboards passend ausgeführt ist, so dass das Blech möglicherweise entsprechend mechanisch zu bearbei-
Sandini Bib Die PC-Komponenten
15
ten ist (Durchbrüche herstellen). Da dies nicht jedermanns Sache ist, wird die Blende dann oftmals weggelassen, was zwar keine negativen mechanischen Einflüsse hat, allerdings entspricht der PC dann nicht mehr den EMV-Vorschriften, und er staubt von der Rückseite her zu. Die passenden Abdeckbleche sollten daher eigentlich immer zum Mainboard gehören, denn einzeln sind sie nur schwer zu beschaffen.
Abb. 1.13: Für unterschiedliche ATX-Mainboards sind auch unterschiedliche Abdeckbleche für den I/O-Bereich notwendig.
Ausgehend von einem typischen (ATX-)Mainboard, wie in Abbildung 1.12 zu sehen, möchte ich noch als Überblick die wichtigsten hier vorhandenen Einheiten erläutern, die in den folgenden Kapiteln noch genauer beschrieben werden. Zentraler Bestandteil ist der Prozessor, auch als CPU (Central Processing Unit) bezeichnet. Dieser Prozessor stellt gewissermaßen das »Herz« des Computers dar, in ihm finden alle Datenverarbeitungsvorgänge statt. Der CPU unmittelbar zugeordnet ist der Hauptspeicher oder RAM (Random Access Memory), den der Prozessor zum Abspeichern und Lesen von Zwischenergebnissen der Datenverarbeitung oder von Programmen benötigt. CPU und RAM bilden die wesentlichen Bestandteile eines Mainboards. Die einzelnen RAM-Bausteine sind auf Modulen untergebracht, die in die passenden Speicherslots des Mainboards einzustecken sind. Die CPU gehört in einen Sockel, oder es kommt hier ebenfalls ein spezieller Slot (Slot 1, Slot A) zum Einsatz, wie es eine Zeitlang für Pentium II/III und AthlonCPUs praktiziert wurde; doch heutzutage ist man nach diesem Umweg wieder zu CPU-Sockeldesigns zurückgekehrt. Sowohl für die Speicher als auch für die CPUs gibt es mittlerweile eine Vielzahl unterschiedlicher Realisierungen, und es ist genauestens zu beachten, für welche Typen ein Mainboard geeignet ist, was dem Handbuch zum Board zu entnehmen sein sollte.
Abb. 1.14: Eine Athlon-CPU der Firma AMD ist für einen Sockel A bestimmt und benötigt einen relativ großen Kühlkörper mit Lüfter.
Sandini Bib 16
Kapitel 1
Um größere Datenmengen einzulesen oder dauerhaft zu speichern, sind für einen PC verschiedene Laufwerke notwendig, mindestens jedoch ein Diskettenlaufwerk, das mit einem 34-poligen Flachbandkabel an den Floppy Connector des Mainboards angeschlossen wird. Außerdem benötigt ein Diskettenlaufwerk, wie jedes andere Laufwerk auch, noch eine Stromversorgung, die mit dem bei den Netzteilen erläuterten Stecker des Netzteils zu verbinden ist. Festplatten- und CD/DVD-Laufwerke entsprechen in der Regel EIDE-Einheiten (Enhanced Integrated Disc Electronic), und Mainboards bieten hierfür mindestens zwei EIDE-Anschlüsse (EIDEPorts). Pro Port – der erste wird mit Primary, der zweite mit Secondary ausgewiesen – können jeweils zwei Laufwerke angeschlossen werden, wobei ein Gerät dabei immer als Master und das zweite an dem jeweiligen Port als Slave zu konfigurieren ist, was meist über kleine Steckbrücken (Jumper) an den Laufwerken erfolgt. Bei dem Mainboard in Abbildung 1.12 sind die EIDE-Ports mit Ultra ATA 133 bezeichnet, was eine von mehreren möglichen Betriebsarten ist, mit denen EIDE-Laufwerke ganz allgemein arbeiten können. Der EIDE-Controller dieses Boards bietet eine maximale Transferrate von 133 MByte/s, woher dann eben auch die Bezeichnung herrührt. Es spielt letztendlich aber keine Rolle, auf welche Bezeichnung (es ist auch IDE üblich) Sie bei den EIDE-Ports treffen, sie sind stets 40-polig ausgeführt und unterscheiden sich somit von allen anderen Anschlüssen auf einem Mainboard.
Abb. 1.15: Die beiden IDE-Ports für den Anschluss von Festplatten und CD/DVD-Laufwerken auf einem üblichen Mainboard. Darunter erkennen Sie den Anschluss für das Diskettenlaufwerk.
Außerdem gibt es bei dem als Beispiel herangezogenen Mainboard aus Abbildung 1.12 zusätzlich noch vier Ultra ATA 133 RAID-Connectoren. RAID steht für Redundant Array of Independent Discs, und es lassen sich hier maximal acht Festplatten anschließen, die dann zusammengenommen ein Disc Array bilden. Üblicherweise kennen derartige EIDE-Disc-Array-Controller mindestens zwei verschiedene RAID-Betriebsarten mit den Bezeichnungen RAID-0 (Disk Stripping) und RAID-1 (Mirroring), in denen die Festplatten nach vorheriger Konfiguration betrieben werden können. Bei RAID-0 werden die Daten ohne Redundanz über die vorhandenen Festplatten verteilt, wodurch ein schnellerer Zugriff möglich ist, weil alle Festplatten quasi gleichzeitig nutzbar sind. Allerdings wird die Fehlertoleranz hiermit nicht geringer, sondern höher, weil die Wahrscheinlichkeit, dass eine von acht Festplatten ausfällt, höher ist, als wenn nur eine einzige zum Einsatz kommen würde. RAID-1 ist die einfachste Form für eine erhöhte Sicherheit, die durch Redundanz realisiert werden kann. Dabei werden die Festplatten als »Spiegelplatten« (mirror = Spiegel) verwendet, und daher ist RAID-1 auch unter der Bezeichnung Disk Mirroring bekannt. Die Daten werden immer gleichzeitig auf mindestens zwei Festplatten gespeichert. Fällt eine aus, läuft das System weiter,
Sandini Bib Die PC-Komponenten
17
da die Daten noch auf der zweiten vorhanden sind. Die effektive Kapazität des Arrays wird dabei um die Hälfte reduziert, weil die Daten exakt dupliziert werden müssen.
Abb. 1.16: Die gebräuchlichsten Typen von Busslots auf einem Mainboard: AGP (oben), 3x PCI und unten ISA
Für die Erweiterbarkeit von PCs spielt die Anzahl der auf dem Mainboard vorhandenen Slots eine Rolle, die entsprechende Einsteckkarten aufnehmen können. Das Mainboard in Abbildung 1.12 verfügt lediglich über drei PCI-Slots und einen AGP-Slot, der für die Aufnahme einer AGPGrafikkarte gedacht ist. Da das Board jedoch auch einen USB-, einen Sound-, einen LAN-, einen Firewire- und sogar einen Card-Reader-Controller On-Board hat, mag dies nicht weiter von Bedeutung sein, da damit eigentlich bereits alle wichtigen Einheiten vorhanden sind. Gleichwohl erweisen sich insbesondere die Sound-, LAN- und möglicherweise auch die integrierten Grafikadapter oftmals gegenüber den Typen, die als Einsteckkarten angeboten werden, leistungstechnisch gesehen als unterlegen, so dass man ggf. eine On-Board-Einheit durch eine bessere Kartenlösung ersetzen möchte. Außerdem kann auch noch ein SCSI- oder ein spezieller Controller notwendig werden, so dass es immer gut ist, wenn noch ein paar Einsteckplätze für Erweiterungen zur Verfügung stehen. Problematisch können allerdings ISA-Karten sein, da viele aktuelle Mainboards hierfür keine passenden Slots mehr bieten. Entschärft wird die Erweiterungsproblematik jedoch wieder dadurch, dass es für USB oder Firewire eigentlich alle üblichen Peripheriegeräte gibt, also Drucker, Scanner, Modems, ISDN-Adapter und auch extern anzuschließende Disketten-, ZIP- und Festplattenlaufwerke, so dass auf die eher traditionellen Schnittstellen und Slots immer häufiger verzichtet werden kann.
1.1.4
CMOS-RAM
Ein PC kann prinzipiell mit einer Vielzahl unterschiedlicher Komponenten ausgestattet sein. Beim Einschalten müssen der Speicher, die Laufwerke und alle weiteren Komponenten, die für die grundsätzliche Funktion notwendig sind, initialisiert, d.h. in einen definierten Anfangszustand versetzt werden. In den ersten PCs konnte durch verschiedene Stellungen so genannter DIP-Schalter die Konfiguration eingestellt werden. Beim Einschalten liest der Prozessor die Schalterstellungen und ermittelt somit beispielsweise, welche Laufwerke installiert sind und wie viel Hauptspeicher zur Verfügung steht. Ab den PCs mit 286-CPU werden diese Informationen in einem bestimmten Baustein auf dem Mainboard abgelegt: dem CMOS-RAM. Das Besondere an ihm ist, dass er im Vergleich zu einem normalen Speicherbaustein sehr wenig Strom benötigt. Daher befindet sich in PCs eine Batterie oder ein Akku, die bzw. der diesen CMOS-RAM mit Strom versorgt. Als Batterie wird meist eine Knopfzelle verwendet, die sich mitunter auch im CMOS-RAM-Chip selbst
Sandini Bib 18
Kapitel 1
befindet. Alle Einstellungen, die Sie mit Hilfe des BIOS-Setups vornehmen, landen als Eintrag im CMOS-RAM, und diese Daten werden nach dem Einschalten des PC dann automatisch aktiviert. Demnach sind für die Festlegung, ob und welche Diskettenlaufwerke vorhanden sind, welche Schnittstellen aktiviert sein sollen oder welchem Typ die Festplatte entspricht, keine Schalter zu betätigen, sondern dies wird bequem per Software mittels BIOS-Setup durchgeführt. Der CMOS-Baustein besitzt aber noch eine weitere Funktion: Er stellt eine Echtzeituhr dar. Auch während der PC ausgeschaltet ist, wird diese Uhr von der Batterie bzw. dem Akku mit Strom versorgt und zählt Uhrzeit und Datum weiter. Sie brauchen heutzutage beim Einschalten des PC also weder Uhrzeit noch Datum einzugeben. Stattdessen liest der Computer den CMOS-RAM aus (in dem neben den Konfigurationsdaten auch Uhrzeit und Datum abgespeichert werden) und setzt die Systemuhr automatisch. Eine korrekte Systemzeit ist notwendig, da jedes Betriebssystem alle Dateien mit einer Zeitmarke versieht, die beispielsweise angibt, wann die letzte Änderung der Daten stattgefunden hat.
Abb. 1.17: Für die Pufferung des CMOS-RAMs wird hier eine Knopfzellenbatterie verwendet. Der CMOS-RAM befindet sich dabei hier im Bridge-Baustein (links oben) des Mainboard-Chipsets.
Bei aktuellen Mainboards werden Sie keinen speziellen Chip mehr erkennen können, der das CMOS-RAM nebst Echtzeituhr beherbergt, denn diese Einheiten sind wie viele andere auch (z.B. DMA- und Interrupt-Controller) mittlerweile funktionell im Chipset des Mainboards integriert. Genaueres zu den Chipsets erfahren Sie in Kapitel 17. Was bleibt, ist der Akku bzw. die (Knopfzellen-)Batterie, die man auch bei aktuellen Mainboards ausmachen kann, und falls der PC einmal sein Gedächtnis verloren hat, ist dies ein Indiz dafür, dass die Batterie für die Pufferung des CMOS-RAM-Inhaltes zu schwach ist und demnach zu ersetzen ist. In der Regel muss sie eine Spannung von ca. 3 V liefern können. Wie Sie in Abbildung 1.18 erkennen können, können sich auch auf aktuellen Mainboards DIPSchalter oder alternativ Steckbrücken (Jumper) befinden, die aber eine andere Aufgabe haben als in früheren Zeiten. Sie sind für die Einstellung der CPU-Taktfrequenz und der jeweiligen Versorgungsspannung vorgesehen. Hiermit wird einmal der Takt für das Mainboard (der Systemtakt, z.B. 100 MHz) festgelegt und des Weiteren ein Multiplikationsfaktor wie etwa x5, wenn Sie eine 500-MHz-CPU verwenden. Außerdem ist mitunter auch die CPU-Spannung per DIP-Schalter zu bestimmen. Je nach Mainboard- und BIOS-Typ sind diese Einstellungen ebenfalls oder ausschließlich im BIOS-Setup festzulegen, wie es ab dem Pentium II möglich ist, denn er kann seine benötigten Einstellungsdaten dem Chipset und somit dem CMOS-RAM automatisch mitteilen.
Sandini Bib Die PC-Komponenten
19
Abb. 1.18: Der DIP-Schalter dient der Festlegung der CPU-Taktfrequenz, die mit Hilfe der darüber befindlichen Schaltung erzeugt wird.
1.1.5
BIOS
Die Abkürzung BIOS steht für Basic Input Output System, was so viel wie grundlegendes Eingabe/Ausgabe-System heißt. Was sich zunächst sehr allgemein anhört, ist jedoch neben dem Mikroprozessor letztendlich das wichtigste Teil in einem Personal Computer, ohne das der Mikroprozessor und damit auch der PC überhaupt nicht funktionieren kann. In dem zunächst als ROM (Read Only Memory) ausgeführten Chip ist eine Software abgespeichert, die sich aus einer Vielzahl von einzelnen Programmroutinen zusammensetzt und eben für die grundlegende Kommunikation mit der gesamten PC-Hardware zuständig ist.
Abb. 1.19: Das Zusammenspiel von Hard- und Software mithilfe des BIOS
Da sich die Hardware von PC zu PC stark unterscheiden kann – es kommen beispielsweise unterschiedliche Prozessoren, Speichertypen und Chipsets zum Einsatz –, obliegt es der im BIOS abgespeicherten Software, die Kompatibilität zur Software-Seite hin herzustellen, was im einfachsten Fall DOS (Disk Operating System) bedeutet. DOS setzt also auf die BIOS-Routinen auf. Nach unten – zur Hardware-Seite – hin sind die BIOS-Routinen entsprechend an die mehr oder weniger individuelle Hardware angepasst und kommunizieren mit den dazugehörigen Registern der CPU,
Sandini Bib 20
Kapitel 1
des Chipsets, den Controllern und allen anderen grundlegenden Hardware-Einheiten. Ein DOSProgramm funktioniert daher mit einem 8086 genauso wie mit einem Pentium 4, obwohl die Hardware eben recht unterschiedlich ist. Andere Betriebssysteme wie aktuelle Windows-Versionen benötigen die BIOS-Routinen nur für die grundsätzliche Initialisierung und teilweise auch für den Boot-Vorgang, um beim Laden dann eigene, leistungsfähigere Software ins Spiel zu bringen. Das BIOS erledigt jedoch noch einige weitere, wichtige Funktionen, und zusammengefasst sind die wichtigsten im Folgenden dargestellt:
: : : :
Durchführung des Power on Self Test (POST, Selbsttest): System zurücksetzen und die Hardware überprüfen. BIOS-Routinen für die Kommunikation mit der Hardware initialisieren. Bereitstellung des BIOS-Setups: Aufblenden der Meldung und Anwendereingriff zulassen. Implementierung von Diagnose- und Testfunktionen: Beispielsweise die automatische Detektierung der Festplatten-Typen sowie die fortlaufende Kontrolle von Betriebsspannungen und Temperaturen (Hardware-Monitoring)
Womit Sie als Anwender auf jeden Fall unmittelbar in Kontakt treten werden, ist das BIOSSetup, während die anderen Funktionen mehr oder weniger unauffällig ihre Arbeit verrichten. Ein korrekter BIOS-Setup ist die erste Voraussetzung für einen ordentlich funktionierenden PC, und wenn im BIOS-Setup womöglich ein Laufwerk nicht korrekt eingeschaltet worden ist, wird es auch von Windows nicht erkannt und steht somit nicht zur Verfügung, da kann man noch so viele Windows-Konfigurationsversuche unternehmen. Mithilfe des BIOS-Setup-Programms, das durch eine bestimmte Taste oder auch Tastenkombination aufgerufen wird, sind die entsprechenden Hardware-Einstellungen vorzunehmen, die dann im CMOS-RAM abgespeichert werden. Die dabei einzustellenden Daten müssen stets mit der tatsächlichen Hardware-Ausstattung des PC übereinstimmen. Bevor das Betriebssystem bootet, wird üblicherweise ein Monitorbild aufgeblendet, das den Hersteller des BIOS anzeigt und angibt, mit welcher Taste man in den BIOS-Setup gelangt. Hierfür ist üblicherweise die (Entf)
bzw. (Del)-Taste zu betätigen. Bei einer anders lautenden Taste oder auch Tastenkombination wird diese in der Regel kurzzeitig aufgeblendet.
Abb. 1.20: Auf dieser BIOS-Setup-Seite werden die Onboard-Einheiten (Integrated Peripherals) eingeschaltet und konfiguriert.
Sandini Bib Die PC-Komponenten
21
Das BIOS-Setup erstreckt sich über mehrere Seiten, auf denen Sie – je nach PC-Typ – unterschiedlich viele Optionen finden, wobei leider nicht immer deutlich wird, was sie eigentlich bewirken. Üblicherweise kennt das BIOS-Setup auch eine gewisse Automatik, d.h., hier werden bestimmte Voreinstellungen getroffen, die einerseits zwar dafür sorgen, dass der PC immerhin rudimentär funktioniert, andererseits jedoch nie die optimale Einstellung bieten. Mittlerweile ist es (fast) zur Routine geworden, einen BIOS-Update ausführen zu müssen. Durch diesen Vorgang werden Teile der internen BIOS-Routinen durch aktualisierte und fehlerbereinigte Versionen ersetzt. Dies mag an den immer kürzeren Zeitabständen liegen, in denen neue Mainboards auf den Markt kommen, so dass sich bei den Herstellern hier und da einfach Fehler einschleichen, oder es gibt neue CPU-Versionen oder auch neuere IDE-Modi (Ultra ATA, UDMA), die die Hardware – der Chipset – zwar prinzipiell unterstützt, gleichwohl muss das BIOS hierfür noch programmtechnisch angepasst werden. Programme für den BIOS-Update und die passenden BIOS-Dateien findet man auf den Internetseiten der Mainboard-Hersteller. Ein BIOS-Update sollte generell aber nur dann durchgeführt werden, wenn es auch einen triftigen Grund dafür gibt, denn falls bei diesem Vorgang etwas schief gehen sollte, hat man es mit einem »zerschossenen« BIOS zu tun, und der PC verweigert jegliche Arbeit.
Abb. 1.21: Unterschiedliche Flash-Speicher, die das BIOS enthalten
Ein BIOS-Update ist technisch bei (fast) jedem aktuellen PC möglich, da sich das BIOS heutzutage nicht mehr in einem ROM-Baustein befindet, dessen Inhalt sich nach der Programmierung (durch den Hersteller) nicht mehr verändern lässt, sondern es wird hierfür meist ein Flash-Speicher verwendet, der sich elektrisch löschen und auch wieder beschreiben lässt.
1.1.6
Laufwerke
Unter dem Begriff Laufwerke möchte ich hier kurz auf die üblichen Laufwerke bei einem PC eingehen; zumindest eines davon wird auch in Ihrem PC eingebaut sein. Wird der PC ausgeschaltet oder fällt der Strom auch nur kurzzeitig aus, sind alle Daten im RAM verloren. Damit ist der RAM zur Langzeitspeicherung von Daten und Programmen völlig ungeeignet. Schon sehr früh wurden daher magnetische Speicher entwickelt. Vor der Erfindung und dem Siegeszug der Halbleitertechnologie und der integrierten Speicherchips bestand sogar der Hauptspeicher aus Magnettrommeln. Später wurden diese durch Magnetkernspeicher ersetzt, winzige Magnetringe, durch die Schreib- und Lesedrähte laufen.
Sandini Bib 22
Kapitel 1
Der ursprüngliche IBM-PC verfügte über ein Diskettenlaufwerk (5¼”) mit einer maximalen Kapazität von 360 KByte, und für größere Speichermengen konnte zusätzlich ein Cassettenrecorder (!) angeschlossen werden. Erst einige Jahre später (ca. 1984) war für den IBM-AT auch eine Festplatte mit einer Kapazität von 10 MByte verfügbar. Diskettenlaufwerke gehören zu den so genannten Laufwerken mit wechselbarem Datenträger, da in ein Laufwerk verschiedene Disketten (Datenträger) eingelegt und wieder herausgenommen werden können. Demgegenüber kann bei üblichen Festplatten der Datenträger nicht ausgetauscht werden, er ist also fest im Laufwerk untergebracht. Außerdem sind die Datenträger nicht mehr flexible Scheiben, sondern starre (feste) Platten. Daneben gibt es die so genannten Wechselplatten, bei denen das Speichermedium – im Gegensatz eben zur üblichen einen Festplatte – gewechselt, also aus dem eigentlichen Laufwerk herausgenommen werden kann. Wird eine Festplatte derart modifiziert, dass sich das Speichermedium – die Magnetscheibe – in einer Cartridge befindet und die Schreib-/Leseköpfe sowie die wesentliche Mechanik im Laufwerk, hat man – vereinfacht dargestellt – den Prototyp einer Wechselplatte (auf der Basis der Festplattenspeichertechnologie), wobei hier insbesondere Modelle der Firma Syquest (SparQ), Iomega (Jaz) und Castlewood (Orb) recht beliebt waren. Mittlerweile haben diese Systeme jedoch durch CD- und DVD-RW an Bedeutung verloren. Die eigentliche Diskette besteht aus einer runden, flexiblen Scheibe, die mit einem magnetisierbaren Material beschichtet ist und sich in einer schützenden Hülle befindet. Die größeren Disketten im 5¼”-Format sind von den kleineren im 3½”-Format, die maximal 1,44 MByte an Daten fassen, abgelöst worden. Entsprechende Diskettenlaufwerke wurden seit 1986 bevorzugt in PCs eingebaut, und es mag erstaunlich sein, dass dieser Typ bis heute als das Standard-Diskettenlaufwerk gilt. Erst seit dem Jahre 2001 wird dieses Diskettenlaufwerk nicht mehr bei allen PCs serienmäßig eingebaut; die üblichen Mainboards unterstützen es allerdings weiterhin mit dem entsprechenden Controller und dem 34-poligen Anschluss, so dass es bei Bedarf auch nachgerüstet werden kann. Der Controller unterstützt stets zwei Diskettenlaufwerke, wobei es mehrere Möglichkeiten gibt, die Reihenfolge der Laufwerke (welches ist A: welches ist B: ?) zu bestimmen.
Abb. 1.22: Ein übliches Verbindungskabel für Diskettenlaufwerke
Am einfachsten ist es, alle an den Laufwerken vorhandenen Jumper – soweit überhaupt vorhanden – in der von der Fabrik festgelegten Position zu belassen, denn die Laufwerke sind meist so eingestellt, dass sie als erstes Laufwerk (also A:) angesprochen werden können. In diesem Fall wird für den Anschluss ein Datenkabel benötigt, bei dem die Leitungen 10 bis 16 gedreht sind (siehe Abbildung 1.22), und hier findet das Diskettenlaufwerk A: dann seinen Anschluss, das
Sandini Bib Die PC-Komponenten
23
Laufwerk B: wird am nicht gedrehten Kabelende angeschlossen. Es ist auch möglich, diese Zuordnung im BIOS-Setup zu vertauschen und dann ein nicht gedrehtes Kabel für das einzige Diskettenlaufwerk A: zu verwenden, was aber im Gegensatz zur erstgenannten Methode nicht immer funktioniert. Mit den Jumpern an den Diskettenlaufwerken sollte man sich lieber nicht näher beschäftigen, weil hier fast jeder Hersteller eine andere Bedeutung festgelegt hat.
Abb. 1.23: Ein mit Laufwerken gut ausgestatteter PC, von unten nach oben sind dies: übliches Diskettenlaufwerk, ZIP-Laufwerk, DVD-Writer und DVD-Laufwerk.
Im Laufe der Zeit sind von den Herstellern zahlreiche Versuche unternommen worden, das 3½”Diskettenlaufwerk durch andere Modelle zu ersetzen, die eine höhere Kapazität bieten. Diese Versuche können im Nachhinein alle als gescheitert bezeichnet werden. Bis auf wenige unbedeutende Ausnahmen werden diese »besseren« Laufwerke mit wechselbarem Datenträger, die sich an der Ablösung des traditionellen Diskettenlaufwerkes versucht haben, wie das LS120/240(Panasonic), das HiFD- (Sony) oder auch das ZIP-Laufwerk (IOMEGA), nicht an den Diskettenlaufwerkscontroller (den 34-poligen Anschluss) angeschlossen, sondern an einen IDE-Port (siehe Kapitel 1.1.3). Sie firmieren unter ATAPI-Wechselplatten, auch wenn sie, wie das LS120/240- und das HiFDLaufwerk, neben ihren eigenen Medien die übliche Floppy lesen und beschreiben können. ATAPI steht für AT Attachment Packet Interface, was eine softwaretechnische Standardisierung – einen verbindlichen Kommandosatz – für CD/DVD-Laufwerke und eben auch für Wechselplatten darstellt, die an den IDE-Controller angeschlossen werden. ATAPI gilt als Ergänzung zu ATA, dem Befehlssatz für IDE-Festplatten, und stellt keine hardwaretechnische Änderung gegenüber dem IDE-Anschluss (ATA) dar, sondern lediglich eine softwaretechnische. ATAPI-Befehle sind im Übrigen nichts anderes als SCSI-Kommandos, die eben über die IDE-Schnittstelle und nicht über den SCSI-Bus abgewickelt werden, was im SCSI-Kapitel noch näher erläutert wird. Von der ursprünglichen Intention eines Diskettenlaufwerkes her soll es unmittelbar nach dem Anschluss und der Einschaltung im BIOS-Setup funktionieren und nicht erst einen mehr oder weniger aufwändigen Konfigurationsvorgang mit Treiberinstallation etc. nach sich ziehen, wie
Sandini Bib 24
Kapitel 1
es bei den ATAPI-Wechelplatten durchaus der Fall sein kann, obwohl zumindest das LS120- und auch das ZIP-Laufwerk von den meisten BIOS-Versionen ebenfalls direkt unterstützt werden. Ob das BIOS allerdings derart »schlau« ist, dass diese Laufwerke dann statt des herkömmlichen Diskettenlaufwerkes auch als übliches A:-Bootlaufwerk funktionieren, ist keineswegs allgemein sichergestellt. Außerdem kann auch das Betriebssystem für Probleme sorgen, weil es eben ein Diskettenlaufwerk und keine ATAPI-Wechselplatte unter A: erwartet. Allein das ZIP-Laufwerk, das es in unterschiedlichen Ausführungen mit verschiedenen Schnittstellen (IDE, SCSI, Parallel-Port, USB) gibt und – je nach Typ – mit Medien von 100 MByte, 200 MByte und 750 MByte umgehen kann, hat es auf einen recht hohen Verbreitungsgrad als »hochkapazitive Diskette« gebracht. Und dies, obwohl die Medien verhältnismäßig teuer sind und ein ZIP-Laufwerk keine traditionelle 3,5-Zoll-Diskette lesen kann. Jeder herkömmliche PC verfügt mindestens über eine Festplatte, und Standard sind, wie bereits oben (in Kapitel 1.1.3) erwähnt, die IDE-Festplatten, die unterschiedliche Kapazitäten und Betriebsarten kennen, was im Kapitel über die Festplatten genau erläutert wird. Die Festplatte ist im Gegensatz zu den Laufwerken mit wechselbarem Datenträger, wozu gewissermaßen auch CD- und DVD-Laufwerke zu rechnen sind, nicht von außen zu erkennen, denn sie befindet sich hinter der Abdeckung des Gehäuses in einem Einbauschacht, wo auch die anderen Laufwerke montiert sind.
Abb. 1.24: Die Festplatte ist bei diesem PC mit Metallwinkeln in einem 5,25-Zoll-Ausschnitt unter dem CD-ROMLaufwerk montiert und normalerweise vom Gehäuse oder einem separaten Abdeckrahmen abgedeckt.
Da ein typisches Standard-Mainboard lediglich zwei IDE-Ports bietet und damit maximal vier IDE-Einheiten angeschlossen werden können, kann dies bereits eine Limitierung für die Erweiterung eines PC darstellen, wenn auch noch ein LS120- oder ZIP-Laufwerk und zwei CD/DVDLaufwerke bzw. »Brenner« (CD/DVD-Writer) im PC zum Einsatz kommen sollen. In Abbildung 1.23 ist ein PC gezeigt, bei dem mit den drei ATAPI-Laufwerken (ZIP, DVD-Writer, DVD-Laufwerk) und der internen Festplatte alle vier IDE-Ports belegt sind. In solchen Fällen bietet sich als Zusatz eine separate IDE-Controllerkarte in PCI-Bus-Ausführung an, die am besten auch noch schnellere Betriebsarten als der (ältere) Controller auf dem Mainboard bietet, so dass hier idealerweise auch eine neue und damit schnellere (zusätzliche) Festplatte angeschlossen wird. Der PC muss dabei natürlich noch genügend Platz für die Laufwerke haben, d.h., sie sollten in einem Rahmen zu montieren sein, und das Netzteil muss zudem über eine entsprechende Leistung verfügen. Wer sein PC-Gehäuse mit dem Netzteil mit Bedacht ausgewählt hat (siehe Kapitel 1.1.1 und 1.1.2), sollte dann auf keine Schwierigkeiten stoßen, und das entstehende »Kabelwirrwarr« wird überschaubar bleiben, wenn das Gehäuse dementsprechend großzügig ausgelegt ist.
Sandini Bib Die PC-Komponenten
25
Abb. 1.25: Eine IDE-Controllerkarte für vier zusätzliche Laufwerke
Generell ist bei den IDE-Geräten nicht nur der Master/Slave-Konstellation Rechnung zu tragen, sondern auch den unterschiedlichen Betriebsarten, die im BIOS-Setup entsprechend zu aktivieren sind (z.B. verschiedene PIO- und UDMA-Modi). Als Orientierung sollten schnellere Laufwerke an einem Port und die langsameren am anderen Port zusammengeschlossen werden. In der Abbildung 1.26 erkennen Sie die Anzeige der IDE-Geräte beim Boot des PC und die jeweilige Betriebsart, die verwendet wird. Am ersten IDE-Port befindet sich als Master eine 20 GByte-Festplatte, die im UDMA-Mode-66 arbeitet, und als Slave ist hier ein DVD-Laufwerk angeschlossen, das UDMA-33 verwendet. Der zweite IDE-Port bedient ein CD-ROM-Laufwerk (PIO Mode 4) als Master und ein LS-120-Laufwerk (PIO Mode 3) als Slave.
Abb. 1.26: Die Anzeige der IDE-Laufwerke beim PC-Boot
In den letzten Jahren ist eine Vielzahl weiterer Laufwerke und zugehöriger Datenträger auf den Markt gekommen. Hier sind in erster Linie optische Datenträger zu nennen. Zur Verbreitung großer und unveränderlicher Datenmengen eignet sich besonders die CD-ROM und die Weiterentwicklung davon, die DVD (Digital Versatile Disc), die insbesondere für Videos zum Einsatz kommt. Der Name CD-ROM leitet sich vom bekannten CD-Player (Compact Disc) ab, nur werden hier keine Musiksignale an den PC übertragen, sondern Daten. Im Prinzip ist dies natürlich dasselbe, da auch Musik abstrakt betrachtet eine Datenmenge darstellt. Auf einer üblichen CD-ROM lassen sich üblicherweise maximal 74 Minuten Audio oder 650 MByte (genauer 680 MByte, wenn 1 KByte als 1024 Byte angesehen werden) an Dateninformationen unterbringen, was die CD-ROM daher schnell zum adäquaten Speichermedium für die immer rasanter wachsende PC-Software machte. Es sind verschiedene Bauformen von CD-ROM-Laufwerken möglich. Die gebräuchlichsten lassen sich in einen 5,25-Zoll-Ausschnitt im PC-Gehäuse einbauen und verfügen über einen IDE- oder auch einen SCSI-Anschluss, wofür dann ein SCSI-Controller (Hostadapter) benötigt wird.
Sandini Bib 26
Kapitel 1
Ein CD-ROM-Laufwerk arbeitet mit einem optischen Leseverfahren, wofür ein Laser mit einiger Optik zum Einsatz kommt. Die Dateninformation einer CD wird durch so genannte Pits und Lands (Vertiefungen und Erhöhungen) repräsentiert. Jeder Übergang vom Pit zum Land und umgekehrt wird dabei als Eins interpretiert und eine bestimmte Strecke (300 nm) ohne Zustandsänderung als Null. CD-Writer – auch lax als CD-Brenner bezeichnet – sind in den letzten Jahren drastisch im Preis gefallen. Ein CD-Writer ist ideal zur Anfertigung eigener CDs, die danach auf jedem üblichen CD-ROM-Laufwerk gelesen werden können. Selbst erstellte Audio-CDs können darüber hinaus auch auf jedem CD-Player einer Stereoanlage wiedergegeben werden. Der Aufbau eines Rohlings (CD-R, Compact Disc Recordable) ähnelt dem einer industriell gefertigten CD-ROM, denn beide bestehen aus Polycarbonat und besitzen eine Schutzschicht. Allerdings sind bei der CD-R noch keine Pits und Lands eingepresst, denn diese Dateninformation soll bei einer CD-R ja erst noch geschrieben werden, was durch einen Schreiblaser erfolgt, der mit einer wesentlich höheren Energie als ein Laser arbeitet, der zum Lesen einer CD verwendet wird. Auf einer CD-R ist bereits eine Spur eingeprägt, die den Strahl des Schreiblasers führt und auch Zeitinformationen enthält, damit die Elektronik feststellen kann, an welcher Stelle auf der CD-R sich der Laser gerade befindet, und die Umdrehungsgeschwindigkeit beeinflussen kann, die von der Position des Lese- oder Schreiblasers auf der CD abhängig ist. Die eingeprägte Spur ist mit einer organischen Farbschicht (z.B. Cyanin) überdeckt und stellt die Informationsschicht dar, denn hier werden die Pits und Lands durch den Schreiblaser eingeprägt. Die gegen äußere Einwirkungen (Druck, Kratzer) empfindlichere Seite einer CD ist nicht die Unterseite, wo die Laserabtastung stattfindet, sondern die obere, wo sich der Labelaufdruck befindet, was insbesondere auf »selbst gebrannte« CDs zutrifft. Bei Beschriftungen muss man daher äußerst vorsichtig zu Werke gehen und darf hier keinesfalls starken Druck ausüben, wie etwa mit einem Kugelschreiber. Eine CD-R ist aufgrund der Farbschicht wesentlich empfindlicher als eine industriell gepresste CD, so dass man mit diesen CDs besonders vorsichtig umgehen und sie weder extremer Wärme und noch starker Sonneneinstrahlung aussetzen sollte. Verschiedene Untersuchungen haben zwar gezeigt, dass eine beschriebene CD-R einen Datenerhalt von Jahrzehnten garantieren soll, allerdings sollte man nichts herausfordern. Zumindest sind die CD-R empfindlicher gegen Kratzer als die industriell gefertigten CDs, was ich aus eigener Erfahrung bestätigen kann. Ursprünglich für den Backup von Daten vorgesehen, haben die Firmen Sony und Philips Compact Disc Read and Writeable oder CD ReWritable entwickelt. Hierfür sind dementsprechend auch CD-RW-Schreiber notwendig, und jeder aktuelle CD-Brenner kann sowohl mit CD-R- als auch mit CD-RW-Medien umgehen. Die CD-RW-Scheiben lassen sich wieder löschen und erneut beschreiben, was laut Herstellerangaben mehrere 100.000mal durchführbar sein soll. Aus den Erfahrungen mit der CD-R ist es sicherlich angebracht, eine CD-RW mindestens mit der gleichen Sorgfalt zu behandeln. Ursprünglich als Digital Video Disc angetreten, wird die DVD mittlerweile als Digital Versatile Disc bezeichnet und als nahezu universelles Speichermedium angesehen. Die DVD-ROM-Laufwerke haben die üblichen CD-ROM-Laufwerke vielfach bereits abgelöst und sind bei aktuellen PCs standardmäßig eingebaut, weil die DVD-ROM-Laufwerke auch die üblichen CDs, ob industriell gefertigt oder selbst beschrieben, lesen können (sollten). Insbesondere als DVD-Player für Videos kommen die DVD-Laufwerke zum Einsatz. Eine DVD kann typischerweise – je nach Typ – 4,7 GByte bis hin zu 17 GByte an Daten fassen, wobei der erste Typ der bisher gebräuchlichste ist, und zumindest auf den ersten Blick unterscheidet sich eine DVD nicht von einer CD.
Sandini Bib Die PC-Komponenten
27
Abb. 1.27: Das Plextor-Combo-Laufwerk ist ein CD-Brenner mit 20x/10x/40x und ein DVD-Laufwerk mit 12x.
Für (wieder-)beschreibbare DVDs gibt es unterschiedliche Realisierungen (DVD-R, DVD+RW, DVD-RAM), und die Hersteller haben sich hier noch immer nicht auf einen gemeinsamen Standard einigen können, obwohl nun schon seit Jahren unterschiedliche Verfahren und Geräte angeboten werden. Gemeinsam ist den verschiedenen Varianten allerdings, dass sie alle auf dem Phase-Change-Verfahren wie bei der CD-RW beruhen, und einige neuere DVD-Brenner (z.B. von Sony) können mit den beiden konkurrierenden Verfahren DVD-Minus und DVD-Plus umgehen, was aber leider nichts daran ändert, dass es mit der Kompatibilität der selbst beschriebenen DVDs noch nicht weit her ist, weil es immer wieder zu Leseproblemen mit den üblichen DVD-Laufwerken im PC oder auch im DVD-Player der Stereoanlage kommt. Die Ursachen hierfür sind vielfältiger Natur und liegen im Schichtmaterial, dem Aufzeichnungsformat, der optischen Laser-Wellenlänge und sogar der Writer-Software begründet. Auf Details werde ich im Kapitel über die optischen Massenspeicher noch näher eingehen. DVD-RAM verwendet ein zur DVD-ROM inkompatibles Format und hat seine Bestimmung in erster Line als Backup-Lösung gefunden, so dass dieses System im Konkurrenzkampf um das optimale wiederbeschreibbare DVD-Format im Grunde genommen keine Rolle mehr spielt. Der maßgebliche Hersteller von DVD-Writern für das DVD-Minus-Format (-R, -RW) ist die Firma Pioneer, die zwar in Japan dominiert, in Deutschland und Europa werden jedoch meist DVD-Brenner für das DVD-PlusFormat (+R, +RW) beispielsweise von den Firmen Ricoh und Hewlett-Packard verwendet.
Abb. 1.28: Die Firma Pioneer ist der maßgebliche Hersteller von DVD-Writern für das DVD-Minus-Format (-R, -RW).
Sandini Bib 28
Kapitel 1
Beim Einbau und der Konfigurierung eines DVD-Laufwerks, das in der Regel als ATAPI-Typ ausgeführt ist, sind die gleichen Dinge (IDE-Kabel, Master/Slave) zu beachten wie bei einem gewöhnlichen CD-ROM-Laufwerk, was auch für die Writer – egal, ob für CD oder DVD – gilt. Diese Laufwerke erscheinen beispielsweise unter Windows bei den CD-ROM-Laufwerken, und die jeweilige Schreibfunktionalität des Laufwerks wird nicht durch Windows, sondern durch die zum Brenner dazugehörige Writer-Software zur Verfügung gestellt.
1.1.7
Grafikadapter
Ein für den Benutzer wesentlicher Bestandteil eines Personal Computers ist der Monitor, (Bildschirm) zusammen mit dem dazugehörigen Grafikadapter, der üblicherweise als AGP-Grafikkarte ausgeführt ist und seinen Platz daher im AGP-Slot des Mainboards findet. Nach Grafikadaptern für PCI und erst recht für die noch älteren Slots wie ISA oder VLB wird man im Handel meist vergeblich suchen, denn diese Grafikkadapter sind quasi ausgestorben, auch wenn eine PCIGrafikkarte keineswegs schlechter sein muss als eine AGP-Grafikkarte, insbesondere dann, wenn keine Spiele als Hauptanwendung vorgesehen sind. Bei einigen Mainboards ist der Grafikadapter auch in der Mainboard-Elektronik, dem Chipset, integriert, was sich in der Praxis jedoch als weniger flexibel erweist und zudem eine PC-Umrüstung erschweren oder sogar unmöglich machen kann. Insbesondere Anwender aktueller Spiele (»Gamer«) profitieren von der rasanten Fortentwicklung der Grafiktechnologie, die Anwendern, die damit eher weniger im Sinn haben und vielleicht bevorzugt Office-Applikationen einsetzen, programmieren oder auch das Internet nutzen, oftmals verborgen bleibt.
Abb. 1.29: Grafikkarten gibt es von zahlreichen Herstellern mit unterschiedlicher Ausstattung.
Ein Gamer wird aber nicht umhinkommen, seine Grafikkarte des Öfteren zu ersetzen, damit die aktuellen Spiele mit optimaler dreidimensionaler Grafik dargestellt werden können. Dies kann durchaus dazu führen, dass gleich ein neuer PC notwendig wird, weil die neue Grafikkarte etwa
Sandini Bib Die PC-Komponenten
29
mit AGP8x laufen soll, das Mainboard jedoch nur den AGP-2.0-Standard unterstützt, was eben ein neues Mainboard erfordert, das auch nicht mehr mit SDRAM, sondern ausschließlich mit DDR-SDRAM funktioniert. Außerdem muss die CPU von ihrer Leistung her mit der Grafikkarte gut harmonieren (skalieren), damit von dieser Seite hier keine »Bremse« im System vorhanden ist. Weil es leider üblich ist, dass eine neuere Grafikkarte auch meist mehr Strom verbraucht als eine ältere, ist zudem die maximale Leistung, die das Netzteil bietet, zu beachten, und u.U. ist dann auch ein neues Netzteil fällig, am besten gleich in einem schallgedämmten Gehäuse, weil die Lüfter der CPU, des Chipsets und der Grafikkarte doch einen ganz gehörigen Lärm verursachen können. Wer dann auch noch gern eine größere und schnellere Festplatte hätte, ist tatsächlich meist besser beraten, wenn der PC mit der älteren Grafikkarte dann gar nicht erst umgerüstet wird, sondern ein gleich ein neuer PC auf den Wunschzettel gesetzt wird. Bei genauerer Betrachtung aktueller Grafikkarten fällt auf, dass zwar eine beachtliche Anzahl von Herstellern unterschiedliche Grafikkarten anbietet, die verwendeten Chips jedoch zumeist von den Firmen Nvidia oder ATI stammen. Variationen entstehen dabei dadurch, dass die Chips unterschiedlich schnell getaktet werden und auch unterschiedliche Speicherchips zum Einsatz kommen. Unter Beachtung dieser Punkte wird es nicht verwundern, dass aktuelle Grafikkarten unterschiedlicher Hersteller sich leistungstechnisch gesehen kaum voreinander unterscheiden, wenn eben das wesentliche Bauteil – der Grafikbeschleuniger – der gleiche ist. Deshalb lohnt es, die einzelnen Features der Grafikkarten verschiedener Hersteller gründlich miteinander zu vergleichen, weil sich dadurch bares Geld sparen lässt. Bei dieser Betrachtung sollten aber auch optionale Funktionen, auf die man vielleicht Wert legt, mit ins Kalkül gezogen werden. In erster Linie gehören dazu Dinge wie Dual-Monitor-Betrieb, digitaler Monitoranschluss (DVI, für ein TFT-Display) und ein TV-Out-Anschluss, damit die Videos auch am heimischen Fernseher betrachtet werden können. Außerdem kann sich im Lieferumfang der Grafikkarten auch unterschiedliche Software befinden, beispielsweise DVD-Player-Software oder diverse Spiele, was ebenfalls mit zur Kaufentscheidung beitragen kann.
Abb. 1.30: Grafikkarten mit unterschiedlichen Anschlüssen
Die dreidimensionale Bildschirmdarstellung stellt an eine Grafikkarte besonders hohe Anforderungen. Aus diesem Grunde ist auf einer 3D-Karte ein spezieller 3D-Beschleunigerchip (Accelerator) im Einsatz. Ältere Grafikkarten besitzen lediglich einen 2D-Accelerator, der die CPU des PC von Aufgaben wie Verschieben von Fensterinhalten (Bit-Blit), Zeichnen von Linien oder Füllen von Polygonen (Polygon Fill) entlastet. Alle neueren Grafikkarten enthalten neben dem 2D- auch einen 3DBeschleunigerchip, oder beide Bausteine sind in einem Gehäuse kombiniert untergebracht, was
Sandini Bib 30
Kapitel 1
dem allgemeinen Stand der Technik entspricht. Um eine dreidimensionale Szenerie auf einem zweidimensionalen Monitor möglichst gut wiedergeben zu können, sind geradezu ein Unmenge an mathematischen Berechnungsschritten notwendig, und die 3D-Chips enthalten – je nach Typ – mehr oder weniger Funktionen für die dreidimensionale Darstellung in »Silizium gegossen«.
1.1.8
Sound
Jeder aktuelle PC verfügt über die Möglichkeit, Sound auszugeben. Den Begriff Sound verwende ich hier als Oberbegriff für Sprache, Musik und Geräusche aller Art, die ein PC mithilfe einer Soundkarte auf die Lautsprecher geben kann. Diese befinden sich meist nicht im Lieferumfang eines PCs, sondern sind separat zu beschaffen. Wer keine besonderen Ansprüche an die Klangqualität stellt und vielleicht nur Windows-Systemklänge zu Gehör bringen will, ist zumeist mit den kleinen Lautsprechern zufrieden, die als Paar mit Steckernetzteil bereits für ca. 10 Euro zu haben sind. Diese sehen oftmals auch etwas primitiv aus und machen zumindest auf dem (Büro-) Schreibtisch nichts her, so dass es sich möglicherweise empfiehlt, einen Monitor mit integrierten Lautsprechern zu verwenden. Anschlüsse Die Anschlüsse der Sound-Elektronik befinden sich im ATX-I/O-Bereich, wie es auch in der Abbildung 1.2 zu erkennen ist, wenn es sich um Onboard-Sound handelt – diese Elektronik also mit auf dem Mainboard integriert ist. Idealerweise sind auch einige Anschlüsse nach vorn geführt (Abbildung 1.3), was ebenfalls möglich ist, wenn eine separate Soundkarte verwendet wird, die typischerweise als PCI-Karte ausgeführt ist. Der auffälligste Soundkartenanschluss mag zunächst die 15-polige Gameport-Verbindung sein, die auf den ersten Blick erst einmal nichts mit Sound zu tun hat. Im Abschnitt MIDI-Standard in diesem Kapitel erfahren Sie Näheres hierzu. In Abbildung 1.31 sind zunächst die gebräuchlichen Soundkartenanschlüsse zu erkennen, wie sie bei einfachen On-Board- und bei Einsteckkarten-Sound-Lösungen zu finden sind.
Abb. 1.31: Die typischen Soundkartenanschlüsse
Etwas schwieriger als der Gameport sind die Audioanschlüsse zu identifizieren, was schon an den nicht immer klar erkennbaren Symbolen liegt. Diese Anschlüsse sind seit einiger Zeit jedoch oftmals farbig gekennzeichnet, was den jeweiligen Anschluss deutlich machen soll. Line-Out (grüne Buchse) wird an die Stereoanlage (Line-In) oder an Lautsprecher mit integriertem Verstärker, so genannte aktive Lautsprecher, angeschlossen. Es sei erwähnt, dass es Sound-Realisierungen gibt, die auch explizit über einen Lautsprecheranschluss (Speaker-Out) verfügen, und
Sandini Bib Die PC-Komponenten
31
hier können dann auch einfache Lautsprecher ohne integrierten Verstärker angeschlossen werden, weil sich der NF-Endverstärker eben auf der Soundkarte selbst befindet. Der Mikrofoneingang (rote Buchse), der meist nur in Mono ausgeführt ist, eignet sich in der Regel lediglich für einfachste dynamische Mikrophone und liefert eher schlechte Ergebnisse, was in erster Linie daran liegt, dass die hierfür zuständige Verstärkerschaltung der Soundkarte von minderwertiger Qualität ist, was zu starkem Rauschen und Störgeräuschen bei Signalaufnahmen führt. Die Line-In-Buchse (blau oder auch schwarz) der Soundkarte kann mit einer Stereoanlage (LineOut) oder mit anderen Audio-Geräten, von denen man aufnehmen möchte, verbunden werden. Die Audio-Buchsen der Soundkarten sind in der Regel für die kleinen 3,5-mm-Stecker (Mini-Klinke) vorgesehen, während sich an Stereoanlagen oder anderen Audiogeräten meist die Cinch- oder auch 5-poligen DIN-Buchsen befinden. Demnach sind entsprechende Adapter oder Adapterkabel vonnöten, die im HiFi- und Elektronik-Fachhandel zu erwerben sind. Einige Soundkarten verfügen über zusätzliche Anschlüsse, die nicht am Slotblech anliegen, sondern direkt auf der Platine als Stiftleisten oder mit Buchsen ausgeführt sind. Hier handelt es sich meist um den Audioanschluss für ein CD-ROM-Laufwerk, um einen zusätzlichen Aux-Eingang, um die Anschlüsse für die PC-Lautsprecherverbindung oder auch um Eingänge, die mit MODEM oder TV bezeichnet und dann meist in Mono ausgeführt sind. Was beim Anschluss der Audioquellen immer wieder gern vergessen wird, ist die Audioverbindung vom CD-ROM-Laufwerk zur Soundkarte. Die Wiedergabe von CD-ROM-Audio-Files, wie es mit dem üblichen CD-Player der Stereoanlage ebenfalls praktiziert wird, ist zwar auch ohne diese Verbindung möglich, jedoch keine Wiedergabe von WAV- oder MIDI-Files. Die Audioverbindung vom CD-ROM-Laufwerk zur Soundkarte wird über ein relativ dünnes Kabel hergestellt, und ältere Laufwerke sowie Soundkarten können hierfür unterschiedliche Buchsen aufweisen. Im Elektronikfachhandel gibt es eine Reihe von speziellen Audio-Adapterkabeln, die verschiedene CD-ROM-Laufwerke und Soundkarten miteinander verbinden können. Generell werden aber drei Signale (links, rechts und Masse) geführt. Mit dem Multimedia-Standard der dritten Revision (MPC-Level 3) ist die Belegung dieses Audio-Anschlusses standardisiert worden, und die beiden inneren Kontakte liegen auf Massepotenzial.
Abb. 1.32: Die wichtigsten Elemente einer einfachen Soundkarte
Neben diesen analogen Ein- und Ausgängen einer Soundkarte gibt es auch digitale Verbindungsmöglichkeiten, so dass die Signale nicht erst mit Qualitätsverlusten aufgenommen – von analog in digital umgesetzt – werden müssen, wenn Sie etwa Musik von Ihrem MiniDisc-Player auf den PC überspielen möchten. Standard ist hierfür ein SPDIF-Anschluss (Sony Philips Digital
Sandini Bib 32
Kapitel 1
InterFace), der beispielsweise ab der Soundblaster Live! üblich ist. SPDIF kann in zwei unterschiedlichen Varianten ausgeführt sein: koaxial oder optisch. Der Koaxialanschluss sieht zwar aus wie ein üblicher Cinch-Anschluss, ist jedoch nicht mit diesem kompatibel. Für die optische Verbindung kommen spezielle Glasfaserverbindungsleitungen zum Einsatz. Dies ist mit dem Vorteil der galvanischen Trennung der verschiedenen Geräte verbunden, so dass durch diese Verbindungsart keine Brummschleifen entstehen können. Mehrkanal-Sound Insbesondere für Spiele legt man oftmals Wert auf einen Mehrkanal-Sound, d.h., es sind nicht nur zwei Lautsprecher für Stereo, sondern dann mindestens vier notwendig. Diese Möglichkeit firmiert zuweilen ganz allgemein unter dem Begriff 3D-Sound oder auch Raumklang. Hierfür gibt es verschiedene Standards wie A3D von Aureal, EAX von Creative Labs und Direct Sound 3D von Microsoft, um nur einige zu nennen. Die Soundkartenhersteller unterstützen oftmals mehrere dieser 3D-Sound-Implementierungen, so dass man sich selbst das optimale Verfahren aussuchen kann, was letztendlich davon abhängig ist, welches Verfahren vom jeweiligen Spiel unterstützt wird. Environmetal Audio Extension (EAX) stellt dabei den Standard im Spielesektor dar und ist als Vierkanal-System ausgelegt. Bei DVD-Videos ist ebenfalls eine Form von 3D-Sound möglich, denn auf den üblichen Video-DVDs ist Audio meist sowohl im Dolby Surround- als auch im Dolby AC-3-Format abgespeichert. Dolby Surround ist vom Kino und auch bereits von Videocassetten her bekannt. Es ist auf einer DVD im PCM-Format (Pulse Code Modulation) abgelegt. Aus der stereophonen Audioinformation werden mit Hilfe eines Dolby Prologic-Decoders sechs Kanäle generiert: vorne links, vorne rechts, Mitte, Tiefbass (Subwoofer) und hinten, wobei die Informationen für die hinteren beiden Lautsprecher identisch sind. Demgegenüber enthält Dolby AC-3 »von Hause aus« bereits die getrennte Information für sechs Kanäle, und zwar als Bitstream, d.h. als digitale, serielle Dateninformation, die ähnlich wie MP-3 dekodiert wird und trotz Datenreduktion ein besseres Klangergebnis als das analog arbeitende Dolby Prologic liefern kann. Für beide Verfahren werden zusätzliche Decoder benötigt, die in den DVD-Geräten der HiFi-Industrie – je nach Modell – bereits enthalten sind.
Abb. 1.33: Ein Raumklangsystem (Dolby Prologic) der Firma Video Logic
Sandini Bib Die PC-Komponenten
33
EAX-unterstützende Soundkarten der Firma Creative Labs (z.B. Live! Player) bieten neben der entsprechenden Spieleunterstützung auch Surround-Sound für DVD-Filme, jedoch keinen echten 5.1-Sound, der für DVD-Filme zur Zeit als das Maß der Dinge gilt. Um diesen sechs-KanalSound etwa auf vier Lautsprechern nachzubilden – zu emulieren – oder auch Stereo-Signale in 5.1-Sound umzusetzen, gibt es wiederum verschiedene Verfahren wie beispielsweise QMSS (QSound Multispeaker System) oder Sensaura, was sich mehr oder weniger »gut anhört«, jedoch klanglich sowie vom räumlichen Eindruck her nicht an eine richtige Dolby-Lösung heranreicht. Für die Übermittlung von 5.1-Sound sind mehrere Möglichkeiten gegeben. Falls die Soundkarte selbst über einen entsprechenden Decoder verfügt, können die drei stereophonen Ausgänge (meist Mini-Klinke) der Soundkarte direkt an das 5.1-Boxenset gegeben werden, das dementsprechend keinen Decoder benötigt. Bei einer Soundkarte mit digitalem SPDIF-Ausgang (optisch oder koaxial) wird entweder ein Boxenset mit Decoder oder ein HiFi-Surround-Verstärker benötigt, an dem die sechs Boxen angeschlossen sind und der einen integrierten Decoder besitzt. Ein HiFi-Surround-Verstärker verfügt in der Regel aber auch über analoge Eingänge, so dass eine Soundkarte ohne Decoder – aber mit sechs Ausgängen – ihn entsprechend ansteuern kann. Eine relativ neue Möglichkeit bietet der USB, denn es gibt Surround-Verstärker (z.B. von Yamaha), die die Audiodaten per USB empfangen und auf die Lautsprecher geben können. Für diese Lösung wird demnach noch nicht einmal eine Soundkarte im PC benötigt. Obwohl 5.1-Surround bisher als das gebräuchlichste Raumklangsystem gilt, das auch von HiFi-Geräten unterstützt wird, gibt es daneben noch einige andere wie 6.1- oder 7.1-Surround (8-Kanal), wobei hierfür stets passendes (DVD-)Klangmaterial sowie auch entsprechende Decoder-Software notwendig ist, die bisher allerdings noch nicht allgemein zur Verfügung steht. Soundkarten-Funktionen im Überblick Den Onboard-Sound-Lösungen wird oftmals ein eher mäßiger Klang bescheinigt, der jedoch nicht schlechter als der von preisgünstigen Sound-Einsteckkarten ausfallen muss. Grundsätzlich gibt es zwei verschiedene Möglichkeiten für die Soundverarbeitung, und zwar mithilfe von CODECs oder mit einem Synthesizer-Chip, wobei diese beiden Disziplinen von allen gebräuchlichen Standard-Soundkarten beherrscht werden. Ein typischer CODEC (Coder/Decoder, Signalumsetzer) enthält mindestens einen A/D- und einen D/A-Wandler sowie einen Mixerchip für das Mischen verschiedener Audiosignale. Die üblichen Soundkarten verwenden einen CODEC, der eine Auflösung von 16 Bit bietet und den Duplex-Mode (Enhanced) unterstützt, womit gleichzeitige Signalwiedergabe und -aufnahme möglich ist, was für die Erstellung eigener Klangkreationen und auch von Voice-ModemAnwendungen notwendig ist. Das Standardformat für Daten, die von einem CODEC verarbeitet werden, ist das Wave-Format (*.wav). Der Synthesizer-Chip einer Soundkarte erzeugt demgegenüber Klänge auf elektronischem – synthetischem – Wege, und hierfür ist das MIDI-Format als Standard anzusehen. In einer MIDI-Datei (*.mid) steckt lediglich die Information über den Instrumententyp, Note An/Aus, Lautstärke usw. und kein Instrumentenklang, der eben erst aus diesen Informationen vom Synthesizer-Chip erzeugt wird. Aus diesem Grunde sind MIDI-Dateien von ihrer Größe her auch wesentlich kleiner als Wave-Dateien bei vergleichbarer Spieldauer. Je nach Qualität des jeweiligen Synthesizer-Chips hören sich die Instrumente dann mehr oder weniger natürlich an. Weiterführende Informationen finden Sie hierzu in diesem Kapitel im Abschnitt Synthesizer.
Sandini Bib 34
Kapitel 1
Wer mit den Möglichkeiten, den der Onboard-Sound oder auch übliche preisgünstige Soundkarten bieten, zufrieden ist, wird dem Thema Sound nicht viel mehr abgewinnen können, wenn es primär um rudimentäre Wiedergabefunktionen geht. Anders sieht es jedoch bei PC-Anwendern aus, die musikalische Ambitionen haben, oder Musikern, die den PC als Basis für ein (semiprofessionelles) Tonstudio ansehen. Auch wenn die so genannten High-End-Soundkarten sich in ganz anderen Preisregionen bewegen (ca. 200 – 600 Euro), bieten sie bei genauerer Betrachtung jedoch Studiotechnik zu verhältnismäßig günstigen Preisen. Zunächst werden mehr Kanäle als für (einkanaliges) Stereo benötigt, und für die typischerweise vier bis acht analogen Ein- und Ausgänge kommen keine Miniklinken-Stecker als Anschluss in Frage, sondern Cinch- oder auch XLR-Connectoren, wie man sie von den Stereoanlagen bzw. aus der Studiotechnik her kennt. Auf den üblichen Slot-Blechen sind diese Anschlüsse mechanisch nicht mehr unterzubringen, so dass dann entweder Kabelpeitschen mit den notwendigen Anschlüssen zum Einsatz kommen oder auch Panels, die sich in einem 5,25-Zoll-Ausschnitt des PC montieren lassen. Professioneller erscheinen externe, so genannte Break-Out-Boxen, die sogar als 19”-Einschübe ausgelegt sein können. Über spezielle Kabel werden diese Anschlusssysteme dann mit der Soundkarte verbunden. Dabei ist zu beachten, dass der CODEC am besten im externen System untergebracht sein sollte, so dass über das Kabel zur Soundkarte die bereits digitalisierten Daten fließen, denn die Kabellängen haben einen negativen Einfluss auf die analogen Signale.
Abb. 1.34: Ein Profisoundsystem der Firma Terratec
Parametern wie Störabstand, Linearität und Dynamikumfang wird bei derartigen Soundsystemen wesentlich stärker Rechnung getragen, als dies bei den Standard-Soundkarten der Fall ist. Die Auflösungen der Wandler betragen dann typischerweise maximal 20 bis 24 Bit bei Abtastraten von 48 oder auch 96 kHz. Im folgenden Abschnitt wird auf das Sampling noch etwas näher eingegangen, wobei ich an dieser Stelle jedoch noch auf einen wichtigen Parameter für Profi-Soundkarten hinweisen möchte: die Latenz, die quasi diejenige Zeit beschreibt, in der ein analoges Signal durch den PC »wandert«. Diese Latenz beträgt bei Standardkarten bestenfalls 50 ms, und bei Profikarten sollte sie idealerweise bei ca. 10 ms liegen, weil dies meist nicht mehr als störende Verzögerung wahrgenommen wird. Wichtig ist die Latenz, wenn gleichzeitig Sounds aufgenommen und wiedergegeben werden sollen, was praktisch ein Muss bei Musikeranwendungen ist. Wenn zu einer bereits fertig gestellten Tonspur eines Sequencer-Programms (MIDI oder Wave) weitere Tonspuren live eingespielt werden sollen, dürfen die Töne der einzelnen Spuren eben nicht »auseinander laufen«, sondern müssen möglichst exakt gleichzeitig erklingen. Neben der Hardware muss dabei die Software, d.h. Windows, ebenfalls mitspielen, das aufgrund seiner Architektur aber selbst eine kaum vorhersagbare Latenz mit sich bringt. Die hierfür in Windows zuständige Software-Schnittstelle MME (MultiMedia Extensions) ist schlicht zu langsam. Direct Sound aus DirectX kann hier
Sandini Bib Die PC-Komponenten
35
zwar prinzipiell Abhilfe schaffen, wobei für »Profikarten« jedoch bereits seit ca. 1995 eigene Software-Interfaces für latenzarmes Sampeln existieren. Audio Streaming Input Output – kurz ASIO – der Firma Steinberg gilt hier als Standard-Software-Schnittstelle, und eine »bessere« Soundkarte sollte hierfür die entsprechende Unterstützung in Form geeigneter Treiber mitbringen. Einen »ordentlichen« Mikrofoneingang in (Stereo) und/oder die Möglichkeit auch ElektretMikrofone anschließen zu können, die ihre Versorgungsspannung aus dem Mikrofonanschluss beziehen, sollten diese besseren Soundkarten ebenfalls bieten können. Richtige MID-Interfaces mit 5-poligen DIN-Anschlüssen sowie SPDIF-Anschlüsse gehören dann meist auch noch dazu. Sampling Mit einer Soundkarte ist es möglich, Sprache, Musik oder Geräusche über ein Mikrofon oder auch einen Line-In-Eingang der Stereoanlage aufzunehmen, wofür auf der Karte ein Analog/DigitalWandler verwendet wird, der diese analogen Signale in eine digitale und damit in eine durch den PC zu verarbeitende Form bringt. Zur Umsetzung eines analogen Signals in ein digitales, was auch Sampling genannt wird, wird das analoge Signal zu bestimmten Zeitpunkten abgetastet, was durch die Sampling-Rate oder die Sampling-Frequenz zu bestimmen ist. Mit den üblichen Programmen (z.B. WaveStudio) zur Signalaufnahme, die den Soundkarten üblicherweise beiliegen, kann dieser Parameter neben der Auflösung für eine Aufnahme festgelegt werden. Je höher diese Einstellungen gewählt werden, desto unverfälschter ist die digitale Abbildung des analogen Signals. Mit welchen Parametereinstellungen man arbeitet und ob ein Komprimierungsverfahren wie beispielsweise MPEG, ADPCM, A-Law oder µ-Law eingesetzt wird, die prinzipiell für eine Verschlechterung der Klangergebnisse sorgen, hängt von der jeweiligen Anwendung ab. Das somit digitalisierte Analogsignal wird nachfolgend im RAM oder auf der Festplatte des PCs gespeichert. Wie viel Speicher hierfür nötig ist, wird durch die für den Wandler festgelegte Abtastfrequenz und Auflösung bestimmt. Für eine einfache Sprachverarbeitung (in Mono) kommt man mit einer 8-Bit-Auflösung und mit einer Abtastfrequenz von 11,025 kHz aus, wenn man nicht mehr als Telefonqualität verlangt. Sollen hingegen Musikstücke in relativ guter Qualität aufgenommen werden, ist eine 16-Bit-Auflösung mit einer Abtastfrequenz von 44,1 kHz typisch, was einen Speicherplatzbedarf von ca. 10 MByte/min für ein Stereosignal bedeutet. Wichtig für eine gelungene Signalaufnahme ist der optimale Aussteuerungspegel, der entweder direkt im Sample-Programm oder aber separat mit Hilfe eines extra Tools, wie beispielsweise dem Creative Mixer bei Soundblaster-Karten, einzustellen ist. Nicht verwendete Eingänge sollten dabei stumm geschaltet werden, weil sie nur unnötige Störungen und Rauschen mit in das Signal einbringen können. Das Sampling ist eine Aufgabe, die bei Soundkarten die Spreu vom Weizen trennt, denn die Wiedergabe von Wave-Dateien, die sich im Lieferumfang von Windows oder auch (Multimedia-) Applikationen befinden, ist im Grunde genommen eine demgegenüber simple Aufgabe. In der Praxis stellt sich oftmals heraus, dass die Eingangsverstärker, die das Signal zum A/D-Wandler leiten, von minderer Qualität sind, was sich in Störgeräuschen und Verzerrungen bei der Aufnahme bemerkbar machen kann, und insbesondere der Mikrofoneingang neigt oftmals zu starkem Rauschen. Wer also nicht nur Signale wiedergeben, sondern auch in guter Qualität aufnehmen möchte, wird daher zumindest an den Onboard-Lösungen vielfach keine rechte Freude haben. Speichern, verändern, Teile löschen, Teile kopieren und Klangdateien zusammenfügen sind Funktionen, die mit der entsprechenden Software in digitaler Form auf das aufgenommene Signal – den Sample – angewendet werden können.
Sandini Bib 36
Kapitel 1
Abb. 1.35: Die Aufnahme und Bearbeitung von Audiosignalen erfolgt mit einem Wave-Recorder/Editor, der über Funktionen wie Schneiden und Kopieren verfügt sowie das Einfügen von Effekten (Echo, Wellenform invertieren) ermöglicht. Diese Funktionen werden auf digitaler Ebene ausgeführt.
Damit man das Signal hören kann, muss es wieder zurückübersetzt, also in eine analoge Form gebracht werden, was durch einen auf der Karte eingebauten Digital-Analog-Wandler erfolgt. Ein Audio-Verstärker auf der Karte »hebt« das analoge Signal dabei nachfolgend an, damit die Verbindung zu einer Stereoanlage über die Line-Anschlüsse herzustellen oder auch direkt ein Lautsprecher anzuschließen ist. MIDI-Standard Oben wurden bereits die MIDI-Dateien erwähnt, also Daten, die von einem Synthesizer-Chip verarbeitet werden. Korrekterweise muss man hinzufügen, dass es für diese Soundchips auch eine ganze Reihe herstellerspezifischer Formate (SBI, INS, CMF) zur Anwendung kommen können, auf die ich allerdings nicht weiter eingehen möchte, denn MIDI ist hierfür ein allgemein gebräuchliches Format. MIDI steht für Musical Instrument Digital Interface und beschreibt zunächst ein serielles Interface, das aus dem Musik- und nicht etwa aus dem PC-Bereich stammt. Durch die Soundkarten der Firma Creative Labs (Soundblaster) ist es üblich geworden, dass eine Soundkarte auch über ein MID-Interface verfügt, das aus zwei seriellen Signalen, MIDI-In und MIDI-Out, besteht, die am Gameport anliegen. Der Gameport ist am PC als 15-polige Buchse ausgeführt und wird auch als Joystickinterface bezeichnet. Demnach wird hier vorwiegend ein Joystick, ein Gamepad oder auch eine Fahrkonsole angeschlossen. Üblicherweise lassen sich mithilfe eines Adapters maximal zwei Joysticks am Gameport verwenden.
Sandini Bib Die PC-Komponenten
37
Pin Nr.
Funktion-Standard (PC-Schnittstellenkarte)
Funktion mit MIDI (Soundkarte)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
5V Joystick 1, Fire Button 1 Joystick 1, X-Richtung GND GND Joystick 1, Y-Richtung Joystick 1, Fire Button 2 5V 5V Joystick 2, Fire Button 1 Joystick 2, X-Richtung GND Joystick 2, Y-Richtung Joystick 2, Fire Button 2 5V
5V Joystick 1, Fire Button 1 Joystick 1, X-Richtung GND GND Joystick 1, Y-Richtung Joystick 1, Fire Button 2 5V 5V Joystick 2, Fire Button 1 Joystick 2, X-Richtung MIDI-TXD (MIDI-Out) Joystick 2, Y-Richtung Joystick 2, Fire Button 2 MIDI-RXD (MIDI-In)
Tab. 1.6: Die Belegung des Joystickinterface-Anschlusses mit und ohne MIDI-Signale
Die üblichen MIDI-Anschlüsse an Musikinstrumenten wie Keyboards oder Drum-Machines sind jedoch als 5-polige DIN-Buchsen ausgeführt, wie man sie von HiFi-Geräten und auch vom ursprünglichen PC-Tastaturanschluss her kennt, so dass auch ein übliches Audio-DIN-Kabel als MIDI-Verbindung zum Einsatz kommen kann. Zum Anschluss dieser zwei MIDI-Kabel (MidiIn, Midi-Out) an einen Gameport wird demnach ein Adapter benötigt. Fast jeder Soundkartenhersteller bietet zur Herstellung eines richtigen MID-Interfaces entsprechende Geräte an, die beispielsweise als MIDI-Box oder MIDI-Mate bezeichnet werden. Die Joysticks können dann meist ebenfalls hier angeschlossen werden. Mithilfe der beiden MIDI-Leitungen wären jedoch nur zwei Geräte miteinander zu koppeln, und aus diesem Grunde gibt es vielfach noch einen dritten Anschluss: MIDI-Thru. Das MIDI-In-Signal wird im jeweiligen Gerät einfach über diesen Anschluss durchgeschleift und dient dann als MIDI-In für ein drittes Gerät. Der MIDI-Leitungsweg ist als Bussystem zu verstehen, das jedoch nicht mit Spannungspegel arbeitet, sondern als Stromschnittstelle ausgeführt ist, damit relativ lange Kabelwege möglichst verlustfrei überbrückt werden können. Ein einzelnes MIDI-Kabel darf üblicherweise nicht länger als 15 Meter sein. Aus diesem Grunde ist eine Schaltung nötig, die das MIDI-RXD- und das -TXDSpannungssignal, die an der Anschlussbuchse der Soundkarte zur Verfügung stehen, in Stromschleifensignale umsetzt und auf einzelne DIN-Anschlussbuchsen führt. In den oben erwähnten MIDI-Boxen befindet sich daher eine Converter-Schaltung, die dies bewerkstelligt. Außerdem sind die MIDI-Eingänge vom MIDI-Bus jeweils über Optokoppler »galvanisch« getrennt, es gibt somit keine direkte elektrische MIDI-Verbindung zwischen den einzelnen Geräten. Dies ist deshalb vorgesehen, damit nicht etwa ein MIDI-Gerät mit einer defekten Isolierung die Netzspannung auf den Bus geben kann und die MIDI-Geräte dadurch beschädigt werden oder – was weitaus schlimmer wäre – der Musiker einen (tödlichen) Stromschlag erleiden könnte. Des Weiteren wird durch die Potenzialtrennung generell das Auftreten von Brummschleifen vermieden. In den meisten Fällen befindet sich aber kein Optokoppler mit der weiteren MIDI-Elektronik auf einer Soundkarte. Der notwendige Optokoppler für den MIDI-In-Anschluss ist dann eben nicht vorhanden, und er muss sich demnach in einer MIDI-Box oder auch einem aktiven MIDI-Kabel befinden. Diese aktiven Adapter sind demnach auch teurer als etwa simple Adapterkabel ohne jegliche Elektronik. Zu der Soundblaster AWE 32 wird beispielsweise ein aktives MIDI-Kabel mitgeliefert, dem von außen nicht anzusehen ist, dass sich hier ein Teil der MIDI-Elektronik ver-
Sandini Bib 38
Kapitel 1
birgt, denn es sieht genauso aus wie ein passives MIDI-Kabel. Ein passives MIDI-Kabel darf aber nur dann verwendet werden, wenn sich der Optokoppler auf der Soundkarte selbst befindet. Da aktuelle Joysticks, Gamepads etc. auch den USB unterstützen, erscheint der Gameport mittlerweile hierfür als überholt, so dass er bei neueren PCs und auch auf Soundkarten nicht mehr zu finden ist, womit auch das Soundkarten-MID-Interface verschwunden ist, das nach Herstellermeinung in der Vergangenheit ohnehin nur von ambitionierten (Hobby-)Musikern verwendet wurde. Stattdessen werden USB-MIDI-Converter angeboten, die zudem den Vorteil haben, dass sie auch mit Notebooks zu verwenden sind, denn einen Gameport hat man hier eigentlich schon immer vergeblich gesucht. Der MIDI-Standard definiert zwar das elektrische Interface und auch, wie die Daten aufgebaut sein müssen, allerdings kann es durchaus passieren, dass das eine MIDI-Gerät einen PianoKlang erschallen lässt, und bei der Übertragung auf ein anderes MIDI-Gerät wird daraus der Klang eines Glockenspiels. Deshalb wurde zur weiteren Standardisierung im Jahre 1991 die General MIDI-Spezifikation (GM) definiert. GM legt eine Reihe von Anforderungen fest, die von einem GM-kompatiblen Gerät unterstützt werden müssen.
Tab. 1.7: Die mit General MIDI festgelegten allgemeinen Klänge
Das Wichtigste ist dabei eine Instrumenten-Zuordnungstabelle (Patch Map), die 128 verschiedenen Klängen jeweils eine bestimmte Nummer zuordnet. Dies bedeutet beispielsweise, dass zwei General MIDI-konforme Geräte unter der Nummer (Patch Number) 56 immer einen Trompetenklang
Sandini Bib Die PC-Komponenten
39
erzeugen. Dieser Trompetenklang kann sich dennoch recht unterschiedlich anhören, denn dieser Sound wird eben vom jeweiligen Synthesizer-Chip erzeugt, und MIDI übermittelt lediglich die Daten anhand genau definierter Messages. Fast jeder Hersteller hat nun Sounds definiert, die über GM hinausgehen, so dass General MIDI quasi als der kleinste gemeinsame Nenner der Klänge gilt. Im Zusammenhang mit MIDI stößt man des Öfteren auf die Bezeichnung MPU-401. Zu Beginn des »MIDI-Zeitalters« stellte die Firma Roland eine so genannte MIDI Processing Unit, die MPU401, in Form einer PC-Einsteckkarte vor. Dieses Interface erfuhr von Programmierern eine breite Unterstützung, was auch daran lag, dass damals andere Standards fehlten. Die Original MPU401 kann in zwei Betriebsarten arbeiten. Im »eigenintelligenten« Modus übernimmt sie selbst einige der MIDI-Aufgaben wie die Erzeugung von Timing-Daten, die Nachrichtenfilterung und die Zwischenspeicherung der MIDI-Daten. Sie entlastet somit die CPU des Computers, was in den achtziger Jahren durchaus sinnvoll war, da die PCs noch nicht die heute übliche Leistungsfähigkeit besaßen. In einem zweiten Modus, der als UART- (Universal Asynchronous Receiver Transmitter) oder auch als »Pass Through« bezeichnet wird, werden die MIDI-Daten hingegen nicht von der Einheit in irgendeiner Weise selbst verarbeitet, sondern einfach nur weitergeleitet, und die Dateninterpretation und Manipulation wird der CPU überlassen. Dieses ist die heute allgemein übliche Betriebsart der MIDI-Schnittstelle für die Kommunikation mit externen MIDIGeräten. Als verlässliche Angabe dafür, dass auch MIDI-Musikinstrumente problemlos mit der MIDI-Schnittstelle einer Soundkarte kommunizieren können, gilt jedoch weiterhin die Bezeichnung MPU-401-kompatibel, auch wenn diese Funktionalität (softwaretechnisch) nachgebildet wird. Eine ganze Reihe von Soundkarten erfüllt diese Disziplin in der Praxis allerdings nicht, wozu auch einige Soundblaster-Karten gehören. Synthesizer Die ersten Synthesizer-Chips auf Soundkarten wie der OPL2 oder der OPL3 der Firma Yamaha, die beispielsweise auf den älteren Soundblaster-Karten von Creative Labs zum Einsatz kommen, verwenden als Grundlage für die Klangerzeugung die Frequenzmodulationssynthese (FM), und Klangvariationen werden durch die Manipulation von Hüllkurvenparametern erreicht, was sich für heutige Verhältnisse recht künstlich und quäkig anhört. Der Trend ging jedoch auch bei den Soundkarten-Einstiegsmodellen in Richtung der Klangerzeugungschips, die nach dem Wavetableoder auch als PCM bezeichneten Prinzip (Pulse Code Modulation) arbeiten. Die Grundlage des Wavetable-Verfahrens sind relativ kurze Samples, also aufgenommene Töne, die von echten Instrumenten stammen. Sie sind in der Regel in einem ROM abgelegt und können dann elektronisch – per Software – manipuliert werden, woraus sich die verschiedenen Tonhöhen und Klangvariationen ergeben.
Abb. 1.36: Der OPL3 (YMF262) und der dazugehörige D/A-Wandler (YAC512)
Sandini Bib 40
Kapitel 1
Eine Wave-Table- oder PCM-Soundkarte verfügt oftmals über ein spezielles RAM. Dieser als Sample- oder auch Wave-RAM bezeichnete Speicher kann selbst kreierte Wave-Sounds speichern, die dann vom Synthesizerchip, wie dem im ROM standardmäßig vorhandenen, verarbeitet werden können. Übliche Kapazitäten des Sample-RAMs sind 512 KByte bis hin zu 16 MByte, wie es beispielsweise die AWE64-Soundkarte von Creative Labs ermöglicht. Seitdem der PCI-Bus auch für Soundkarten als Standard gilt, muss das Sample-RAM nicht mehr mit separaten Speicherchips auf der ISA-Soundkarte, wie etwa der AWE-64, realisiert werden, sondern hierfür kann der übliche Arbeitsspeicher angezapft werden, wie es beispielsweise Creative Labs ab der Soundblaster Live! praktiziert. Die »Klangdaten« können per PCI-Bus-Transfer schnell genug vom PCSpeicher zum Synthesizer-Chips auf der Soundkarte transportiert werden, ohne dass dies mit akustischen Verzögerungen oder ähnlichen Effekten verbunden wäre.
Abb. 1.37: Diese Soundkarte verwendet ein übliches Speicher-SIMM als Sample- RAM.
Das bekannteste Programm, das die Erstellung und Bearbeitung eigener Sounds für das SampleRAM von Creative Labs-Karten ermöglicht, die den Emu-Synthesizer-Chip verwenden, ist Vienna. Mithilfe von so genannten MIDI-Sequencer-Programmen wie Steinbergs Cubasis oder auch Cakewalks Pro Audio lässt sich dann auf der Basis der mitgelieferten MIDI-Soundbänke oder eben auch der selbst erstellten am PC komponieren. Typische Onboard-Sound-Chips unterstützen in der Regel kein Sample-RAM, zumindest mangelt es an der entsprechenden Software-Unterstützung, um hiermit selbst kreativ werden zu können. Der OPL4 (Abbildung 1.38) der Firma Yamaha unterstützt beispielsweise auch ROMund RAM-Samples und wurde auch auf einigen Mainboards wie dem Intel AL4440LX verbaut, die sich in den Aldi-PCs aus dem Jahre 1999 wiederfinden. Vergleichbare Software wie etwa Vienna sucht man hierfür jedoch vergeblich.
Abb. 1.38: On-Board-Sound mit Chips von Yamaha
Eine andere Möglichkeit der Klangerzeugung, die im Grunde genommen auch die WavetableKarten vom Markt verdrängt hat (wenn man einmal von den Profi-Varianten wie von Yamaha oder Roland absieht), ist das Verfahren des virtuellen Synthesizers, bei dem man sich die hohe Rechenleistung der heutigen CPUs zunutze macht, was dann auch unter AC-97-Sound firmiert.
Sandini Bib Die PC-Komponenten
41
Per spezieller Algorithmen errechnet die CPU während der Klangausgabe den typischen Klangverlauf der Instrumente und gibt die Signale über einen D/A-Umsetzer (CODEC) aus, wodurch quasi der Synthesizer-Chip eingespart wird. Der Klang steht und fällt somit auch mit der Rechenleistung der CPU, der Anzahl der verwendeten Stimmen und der Effektivität der mathematischen Instrumentenmodelle. Bei den üblichen Anwendungen reicht aber selbst noch ein Pentium 133 aus, um hiermit MIDI-Klänge produzieren zu können. Mithilfe des virtuellen Synthesizers erhöhen die Hersteller auch die Stimmenanzahl ihrer Soundkarten für MIDI. Beispielsweise wird so aus einer Soundblaster AWE32 (32 MIDI-Stimmen) eine AWE64, die insgesamt 64 MIDI-Stimmen bietet, wovon 32 eben per Softwaresynthesizer und nicht per MIDI-Chip generiert werden. Bei den Soundkarten von Creative Labs werden ab der Soundblaster AWE32 und somit auch bei der Soundblaster Live! sowie bei der Soundblaster Audigy unterschiedliche Synthesizer-Chips verwendet, die als EMU (8000, 10K, 20K) bezeichnet werden. Bereits vor einigen Jahren hat Creative Labs die Firma EMU, die in Musikerkreisen einen ausgezeichneten Ruf für ihre elektronischen Musikinstrumente genoss, aufgekauft, was dazu geführt hat, dass die genannten Soundkarten über ausgezeichnete MIDI-Klangeigenschaften mit zahlreichen optionalen Funktionen verfügen, die man bei anderen Soundkarten in dieser Form – zu derart günstigen Preisen – nicht findet. Allerdings kann die analoge Audio-Sektion dieser Karten den Profi eher nicht überzeugen, was an den vergleichsweise eher mäßigen Sampling-Eigenschaften, der begrenzten Anzahl von Analogeingängen und der relativ hohen Latenz liegt.
1.1.9
Netzwerke und LAN-Adapter
Netzwerke oder LANs – Local Area Networks – gab es natürlich bereits, bevor der PC die gesamte Computerwelt revolutionierte. Damals waren Netzwerke allerdings fast ausschließlich im professionellen Einsatz wie bei Banken, Versicherungen und größeren Firmen vorzufinden, und mit der Installation sowie mit der Wartung der Hard- und Software waren vorwiegend spezialisierte Ingenieure und Informatiker beschäftigt. Ein damaliges klassisches LAN setzte sich im Wesentlichen aus einem Zentralcomputer und Terminals zusammen, die über Netzwerkkabel mit ihm verbunden waren. Der Zentralcomputer – LAN-Server – , über den sämtliche Kommunikation im LAN ablief, konnte auf der anderen Seite auch eine Verbindung zu einem Host-System und außerdem zum Weitbereichsnetz (WAN) herstellen, was zumeist firmeneigene Netze waren. Auch die Anbindung von Druckern und anderen Peripherie-Geräten, die den ArbeitsPCs im LAN zur Verfügung stehen sollten, erfolgte dabei über den LAN-Server. Zunächst hat der PC die Terminals ersetzt, die ohne jegliche Speichereinheiten ausgestattet waren, und heutzutage kann auch ein Server in PC-Technologie realisiert sein. Das hierarchisch organisierte LAN von damals, in dem die Intelligenz allein im Server untergebracht war, hat allerdings auch heute noch Vorteile, denn der Datenbestand ist dabei an zentraler Stelle lokalisiert, wodurch sich Datensicherungen (Backups) relativ leicht organisieren lassen, und jeder Benutzer muss dem System mit Namen und Passwort eindeutig bekannt sein. Aus diesem Grunde ist ein Server nach wie vor – zumindest in etwas größeren Netzen – ein immanenter Bestandteil –, um die Daten und Benutzer unter Kontrolle zu haben. Dieses Prinzip bezeichnet man gemeinhin als Client-Server. Daneben gibt es aber auch Netze nach dem Peer-to-Peer-Prinzip, in denen kein zentraler Server existiert, sondern gleichberechtigte Computer zum Einsatz kommen, die entweder momentan als Server oder als Workstation arbeiten, je nachdem, ob sie Ressourcen (Verzeichnisse, Daten, Peripherie) zur Verfügung stellen oder Ressourcen von anderen Computern benötigen. Insbesondere mit den Microsoft-Implementierungen ab Windows for Workgroups hat dieses Prinzip eine weite Verbreitung gefunden.
Sandini Bib 42
Kapitel 1
Host-System
LAN-Server
LAN-Drucker
Arbeits-PC (Netzknoten) Abb. 1.39: Aufbau eines klassischen LANs
Beide Prinzipien (Client-Server oder Peer-to-Peer) sind dabei ungeachtet der jeweiligen Netzwerktopologie (Bus, Ring, Stern) oder ganz allgemein der verwendeten Hardware verwendbar. Es ist letztendlich nur eine Software- bzw. Netzwerk-Betriebssystem-technische Zuordnung der Computer und Benutzer. Ob Client-Server oder Peer-to-Peer das richtige Netzwerk ist, hängt maßgeblich von der Anzahl der Arbeitsstationen und der Frage ab, ob viele unterschiedliche Anwendungen auf den einzelnen Stationen stattfinden sollen. Peer-to-Peer ist vorwiegend für Anwendungen geeignet, die sich in Workgroups zusammenfassen lassen und unter denen ein reger Datenaustausch sinnvoll erscheint. Also werden beispielsweise alle Arbeitsplätze, die sich mit Textverarbeitung, und alle, die sich mit Grafikanwendungen beschäftigen, jeweils zu einer eigenständigen Workgroup (softwaretechnisch) zusammengeschlossen. Die Einrichtung der Zugriffsrechte erfolgt derart, dass ein PC einem anderen oder mehreren PCs den Zugriff auf einzelne Verzeichnisse gewährt – die Verzeichnisse werden freigegeben. Den anderen PCs muss, ebenfalls per Konfiguration, diese Zugriffsmöglichkeit erst gegeben werden – das Verzeichnis wird verbunden. Mit Peripheriegeräten funktioniert es prinzipiell auf die gleiche Art und Weise. Es ist sicher vorstellbar, dass man bereits bei drei oder mehr PCs, die die unterschiedlichsten Verzeichnisse nur zum Lesen oder nur zum Schreiben oder für beides freigeben oder verbinden dürfen, sehr leicht den Überblick darüber verliert, welche Station welche Rechte wo innehat. Peer-to-Peer-Netzwerke sind daher eher für relativ kleine Gruppen geeignet und generell schwer zu warten. Das ist bei Client-Server-Netzen aufgrund der strengen Hierarchie einfacher und auch für 100 und mehr Stationen noch überschaubar.
Sandini Bib Die PC-Komponenten
43
In einigen Fällen kann es durchaus sinnvoll sein, in einem Netzwerk sowohl Peer-to-Peer als auch Client-Server walten zu lassen. Die einzelnen Gruppen arbeiten untereinander Peer-toPeer, belasten somit nicht den Server für ihren Datenaustausch untereinander, und erst wenn ein Datenaustausch mit einer anderen Gruppe notwendig ist, erfolgt dies über den Server. Die Administration derartiger Netzwerke ist jedoch sehr aufwändig und sicherheitstechnisch gesehen äußerst problematisch, zumal PCs ja meist auch über eigene (lokale) Laufwerke verfügen und die Anwender somit unerwünschte Programme und Viren zwischen lokalen Netzwerken und Netzwerklaufwerken im Firmennetz austauschen könnten. Ein LAN ist heutzutage mit einfachsten und preiswerten Mitteln zu realisieren und damit auch für private Anwendungen geeignet, wobei Peer-to-Peer hier auf jeden Fall die günstigste Methode ist, da eben kein zentraler Server benötigt wird. Ganz allgemein bieten sich mit Netzwerken die folgenden Möglichkeiten:
: : : : : : : : : : :
Zentrale Verwaltung und Speicherung von Datenbeständen. Für die Benutzer eines Netzwerkes können individuelle Reglementierungen für die jeweiligen Rechte (z.B. Speicherplatz, Gerätebenutzung) getroffen werden. Es lassen sich Sicherheitsmechanismen (gegen Vireneinschleusung, Benutzung nicht erwünschter Programme etc.) für ein Netzwerk zentral bestimmen. Die Computer können eine unterschiedliche Ausstattung (z.B. verschiedene Betriebssysteme) und Funktionalität haben und sich im Netzwerk dennoch als kompatibel zu anderen darstellen. Gemeinsame Nutzung unterschiedlicher Ressourcen wie einzelner Geräte oder auch Laufwerke oder Daten (Verzeichnisse). Ein Computer mit einem Modem oder einem ISDN-Adapter kann anderen PCs im LAN einen Internetzugang zur Verfügung stellen. Prinzipiell ist es möglich, eine (fast) beliebige Anzahl von Computern miteinander kommunizieren zu lassen. Bei den vernetzten Computern muss es sich nicht zwangsläufig um Personal Computer handeln, sondern es können auch völlig unterschiedliche Rechnerarchitekturen (Apple, Sun, Hewlett-Packard, DEC/Compaq) zum Einsatz kommen. Die Netzwerkfunktionalität ist räumlich nicht beschränkt und kann sich prinzipiell als weltumspannend (Internet) darstellen. Es ist möglich, Computerspiele im Netzverbund mit mehreren Partnern zu spielen, sei es nur im LAN oder auch im weltweiten Netz (WAN), dem Internet. In der Netzwerktechnik existieren zahlreiche definierte Standards (z.B. Protokolle, Übertragungsmechanismen), die somit herstellerunabhängige Kommunikationsmöglichkeiten eröffnen.
Im Kapitel Lokale Netzwerke wird insbesondere auf den letzten Punkt der Aufzählung noch sehr ausführlich eingegangen, so dass ich in diesem einführenden Kapitel nur noch kurz auf LANAdapter eingehen möchte. Der klassische Netzwerkadapter ist eine Netzwerkkarte, die als ISAKarte oder vorzugsweise als PCI-Karte ausgeführt ist und somit ihren Platz in einem PCI-Slot findet. Bei den meisten aktuellen PCs ist ein LAN-Adapter auch gleich mit OnBoard. Er ist für Fast-Ethernet (100 MBit/s) ausgelegt, und der Anschluss ist als RJ45-Buchse für ein TwistedPair-Kabel (TP) ausgeführt.
Sandini Bib 44
Kapitel 1
Abb. 1.40: Die grundlegende Einheit für den Aufbau von Netzwerken ist eine Netzwerkkarte.
Für die Kopplung von lediglich zwei PCs können diese PCs mithilfe eines TP-Cross-Kabels verbunden werden. Es unterscheidet sich von einem üblichen TP-Kabel (Link- oder Patch-Kabel) dadurch, dass hier – wie es die Bezeichnung bereits andeutet – die Signalleitungen gekreuzt verdrahtet sind, damit die Sendeleitung des einen PC der Empfangsleitung des anderen PC entspricht und umgekehrt. Um mehr als zwei PCs in einem LAN verbinden zu können, wird ein Hub oder ein Switch benötigt, und die Verbindungen werden dabei sternförmig mit üblichen TP-Kabeln realisiert. Ob so oder so können sich durch den Einsatz »richtiger« Netzwerkkarten und der entsprechenden Konfigurierung der Clients (Protokoll, Dienste usw.) die oben in der Aufzählung angegebenen Möglichkeiten ergeben. Für einfache 1:1-Kopplungen, etwa für den Datentransfer zwischen Notebook und Desktop-PC, lassen sich prinzipiell auch die serielle (RS232), die parallele Schnittstelle oder die InfrarotSchnittstelle einsetzen, was unter Windows mit der PC-Direktverbindung zu bewerkstelligen ist. Eine Netzwerkfunktionalität ergibt sich dadurch allerdings nicht. Dies kann aber wiederum durch den Einsatz des USB oder auch von Firewire möglich werden. Für den USB wird jedoch ein spezielles Kabel (z.B. USB Link oder USB Net Cable) mit integriertem Controller benötigt, denn in einem USB-System darf es immer nur einen Host-Controller geben, so dass es mit einem einfachen USB-Kabel nicht möglich ist, zwei oder sogar mehrere PCs miteinander zu koppeln. Außerdem hängt es vom jeweiligen »USB-Controller-Kabel« ab, ob sich hiermit tatsächlich eine Netzwerkfunktionalität in dem Sinne realisieren lässt, dass hier etwa TCP/IP verwendet werden kann und dieses USB-System dann auch unter den Netzwerkeinheiten und nicht unter einem Spezialadapter firmiert. Es existieren jedoch auch ausgesprochene USB-Ethernet-Adapter, die diese Bedingungen erfüllen, demgegenüber jedoch teurer sind, weil hier ein »richtiger« LAN-Controller am Werke ist, der eben nicht an den ISA- oder den PCI-Bus, sondern an den USB gekoppelt ist. Dabei ist jedoch die maximale Übertragungsrate des USB mit zu beachten, die laut der USB 1.1-Spezifikation lediglich 12 MBit/s beträgt. Erst mit USB 2.0 sind im High-Speed-Modus maximal 480 MBit/s möglich, was daher auch kein »Ausbremsen« der Netzwerkdaten zur Folge hat. Bei einigen neueren Mainboards ist die Firewire-Elektronik gleich mit integriert (vgl. Abbildung 1.2), so dass dann noch nicht einmal eine entsprechende Erweiterungskarte benötigt wird. Firewire (IEEE-1394) ist ein etablierter Standard, der insbesondere für die Übertragung von Videodaten zwischen Kameras und PCs sowie auf Notebooks zum Einsatz kommt und von vornherein mindestens 400 MBit/s an Datenübertragungsrate bietet. Das Besondere ist in diesem Zusammenhang, dass Windows Me sowie Windows XP hierfür auch automatisch einen Netz-
Sandini Bib Die PC-Komponenten
45
werktreiber zur Verfügung stellen, so dass sich hiermit problemlos – nur mithilfe üblicher Firewire-Kabel – ein Netzwerk mit einer Datenübertragungsrate von rasanten 400 MBit/s realisieren lässt. Für Windows 2000 und die älteren Windows-Versionen wird diese Funktion von Microsoft allerdings nicht automatisch (Treiber für NDIS 1394 Netzwerkadapter) geboten, so dass dann vom Hersteller der Firewire-Karte ein entsprechender Treiber benötigt wird.
Abb. 1.41: Der Firewire-Adapter (NDIS 1394 Netzwerkadapter) wird unter den Netzwerkkarten geführt, und es wird hierfür das TCP/IP-Protokoll verwendet.
1.2 PC-Peripherie Nachdem wir uns mit dem Innenleben eines PC auseinander gesetzt haben, geht es in diesem Abschnitt um die Einheiten, die extern an den PC angeschlossen werden. Ein Muss sind dabei ein Monitor sowie eine Tastatur und eine Maus. Ein Drucker und ein Scanner sind meist die nächsten Einheiten, die sich ein PC-Anwender wünscht. Dazu kommt ein Modem oder ein ISDN-Adapter für die Verbindung zum Internet. Auch wenn ein Modem bereits als Schaltung auf dem Mainboard oder per Einsteckkarte im System integriert sein kann, lasse ich es hier einmal unter der Peripherie laufen, zumal der Einsatzweck der gleiche ist wie bei einem ISDNAdapter, der in der Regel eben nicht Bestandteil eines Standard-PC ist. Thematisch gehören Modem und ISDN-Adapter jedenfalls zusammen.
1.2.1
Monitor
Bei der Betrachtung von Abbildung 1.30 in Kapitel 1.1.7 mag auffallen, dass die Grafikkarten zwar über unterschiedliche Anschlüsse verfügen, alle haben jedoch einen 15-poligen DSUBAnschluss, der die bisher üblichste Verbindung mit einem Monitor darstellt. Die Bezeichnung hierfür lautet VGA-Anschluss, und VGA steht für Video Graphics Array.
Sandini Bib 46
Kapitel 1
Wie vieles in der PC-Technik so stammt auch diese Bezeichnung aus grauer Vorzeit. In den 80er Jahren gab es zunächst monochrome Grafikadapter, später dann welche, die auch Farbe auf den jeweils hierfür geeigneten Monitor abbilden konnten. Es begann mit dem MDA (Monochrome Display Adapter) mit 25 Zeilen x 80 Zeichen über CGA (Color Graphic Adapter) mit 320 x 200 Bildpunkten (Pixeln) in vier Farben und fand zunächst einen Höhepunkt mit dem Enhanced Graphics Adapter (EGA), der 640 x 350 Pixel in 16 Farben auf einem EGA-Monitor darstellen konnte. Gemein ist diesen Lösungen, neben der Tatsache, dass sie allesamt als veraltet anzusehen sind, dass die Informationen zwischen Grafikadapter und Monitor in digitaler Form ausgetauscht werden und hierfür üblicherweise eine 9-polige DSUB-Verbindung zum Einsatz kommt. Die erste VGA-Lösung wurde von IBM (ca. 1987) für die PCs mit MicroChannel Architecture (MCA) präsentiert. Das Besondere an der VGA-Karte war nun, dass sie den Monitor nicht wie die Vorläufer mit digitalen Signalen ansteuert, sondern mit analogen. Der Grund für diese analoge Signalübergabe ist die auf diese Art und Weise erheblich verbesserte Darstellung der Farbinformation. Ein Monitor mit digitalem Eingang, wie es bis EGA üblich ist, kann jedoch nichts mit den analogen Signalen von VGA anfangen, was dementsprechend auch für die umgekehrte Konfiguration gilt. Die Farben werden auf einer alten VGA-Karte von einem Digital/Analog-Wandler – auch als Digital Analog Converter bezeichnet, DAC – in 64 verschiedene Stufen für jeweils rot, grün und blau umgesetzt. Damit sind theoretisch 643 = 262.144 Farben möglich. Natürlich muss der Monitor für die analogen Eingangssignale vorgesehen sein. Wird kein VGA-Farbmonitor verwendet, sondern ein VGA-Schwarzweiß-Monitor, werden die Farben über eine Formel im BIOS so verändert, dass auf dem Monitor 64 verschiedene Graustufen entstehen. Der Monitor darf dann also nicht vom einfachen Typ monochrom sein, sondern muss explizit auch Graustufen unterstützen. Auf den VGA-Karten befindet sich wie beim Vorläufer – der EGA-Karte – ein Speicherbaustein, der das BIOS der VGA-Karte enthält, das die Registerkompatibilität zu EGA wahrt. Im Grafikmodus sind 256 Farben gleichzeitig darstellbar, mit einer Auflösung von 640 x 480 Bildpunkten. Der Speicher der VGA-Karte muss hierfür mindestens 512 KByte bieten, und die Bildwiederholfrequenz beträgt 50 Hz. Obwohl aktuelle Grafiksysteme (Adapter plus Monitor) demgegenüber weit höhere Auflösungen und Bildwiederholfrequenzen bieten, hat sich die VGA-Bezeichnung mit dem damals definierten 15-poligen VGA-Anschluss bis heute gehalten. Der Monitor wird oftmals mit dem PC als Komplettsystem erworben, wobei ihm nicht immer die Aufmerksamkeit geschenkt wird, die er eigentlich verdient. Ähnlich wie bei einer Stereoanlage, die mit relativ schlechten Lautsprecherboxen ausgestattet ist, verhält es sich mit einem PC und seinem Ausgabemedium – dem Monitor. Die beste 3D-Grafikkarte ist herausgeschmissenes Geld, wenn der Monitor die gelieferten Daten nicht adäquat weiterverarbeiten kann. Aktuelle Grafikkarten sind den meisten gebräuchlichen Monitoren technisch überlegen, dennoch gibt der Monitor und nicht die Grafikkarte die machbare Bildqualität vor.
Abb. 1.42: Monitorgrößen im Vergleich
Sandini Bib Die PC-Komponenten
47
Das augenscheinlichste Merkmal eines Monitors, das im Wesentlichen auch für die Preisunterschiede der verschiedenen Modelle verantwortlich ist, ist die Größe des Bildschirms, dessen Bildschirmdiagonale in Zoll (") oder in cm (1 Zoll = 1 Inch = 2,54 cm) angegeben wird. Die kleinste übliche Monitorgröße ist 14", die größte liegt zurzeit bei 28". Dass sich diese Angaben immer auf die Bildschirmdiagonale beziehen, sollte man nie außer Acht lassen. So hat beispielsweise ein 14"-Monitor eine Bildröhrenbreite von ca. 27 cm, was demnach lediglich ca. 10" in der Breite entspricht. Ein relativ kleiner Monitor (14" oder 15") reicht für Standardanwendungen allein unter DOS wie Textverarbeitung oder Tabellenkalkulation sicher aus. Für Windows und andere grafische Oberflächen stellt ein VGA-Monitor, der mit einer Auflösung von 640 x 480 (Spaltenanzahl x Zeilenanzahl) Bildpunkten (Pixel) und einer Bildwiederholfrequenz von mindestens 70 oder auch 75 Hz arbeitet, den absolut unteren Standard dar. Eine sinnvolle Auflösung orientiert sich immer an der Bildschirmgröße des Monitors. Ein 17"-Monitor stellt sich vielfach als guter Kompromiss zwischen Preis und Größe heraus, wobei hier eine typische Auflösung von 1024 x 768 Bildpunkten gewählt wird. Auflösungen von 1600 x 1280 und mehr Bildpunkten sind erst bei einem 21"-Monitor sinnvoll, wobei diese Angaben auf einen universellen Einsatz abzielen, und außerdem gibt es hierfür natürlich auch noch persönliche Vorlieben.
Abb. 1.43: Die prinzipielle Anordnung der Zeilen und Spalten auf einem Monitor
Neben der Bildschirmgröße sind die Bildwiederholfrequenz und die Zeilenfrequenz die weiteren entscheidenden Größen eines Monitors, die seine mögliche Auflösung bestimmen. Die Bildwiederholfrequenz (vertikale Frequenz) gibt an, wie oft das Bild pro Sekunde aufgebaut wird. Sie sollte mindestens 75 Hz betragen, was üblicherweise nicht mehr als Bildflackern wahrgenommen wird. Es gibt jedoch auch Anwender, die erst ab 85 Hz, also bei einem 85maligen Bildaufbau pro Sekunde, das Bild als angenehm empfinden und damit auch über längere Zeit ohne Kopfschmerzen arbeiten können. Die folgende Liste zeigt die wichtigsten Daten, die einen Monitor beschreiben, und diese sollten mit den Angaben zur jeweiligen Grafikkarte verglichen werden.
: : : : : : :
Bildschirmdiagonale (typisch: 14–21 Zoll) Auflösung (typisch: 640 x 480 bis 1280 x 1024 Bildpunkte) maximale Horizontalfrequenz (typisch: 31,5–130 kHz) maximale Vertikalfrequenz (typisch: 60–120 Hz) maximale Pixelrate (typisch: 25–160 MHz) Größe der Lochmaske (typisch: 0,31–0,21 mm) Standard für Strahlungsarmut und Ergonomie (MPR, TCO)
Sandini Bib 48
Kapitel 1
Alle aktuellen Monitore unterstützen Plug&Play, d.h., Grafikkarte und Monitor können sich selbstständig über die möglichen Betriebsarten einigen, was mithilfe spezieller Leitungen (Monitor-Identifikations-Bits) des VGA-Anschlusses erfolgt. Außerdem gibt es in jedem aktuellen Betriebssystem eine Vielzahl von speziellen Monitortreibern, die auch manuell zu selektieren sind. Dabei kann es aber insbesondere mit älteren Monitoren durchaus passieren, dass eine zu optimistisch gewählte Auflösung oder Frequenz den Monitor ernsthaft beschädigen kann, weil er mit den Signalen der Grafikkarte überfordert ist. Daher ist es wichtig zu wissen, mit welchen Daten sich ein Monitor maximal betreiben lässt, um ihn nicht zu überfordern. Was die Grafikkarte zu leisten vermag, muss ein Monitor eben nicht unbedingt gleichermaßen können. Typische Monitore arbeiten wie Fernseher mit einer Kathodenstrahlröhre – auch Braun‘sche Röhre genannt –, deren Oberfläche als Bildschirm sichtbar ist. Dies sind also Röhrenmonitore, und die Hersteller setzen hier unterschiedliche Röhrentypen (Delta, Trinitron, In-Line, Chromaclear) ein, wobei hier jeder Typ mit gewissen Vor- und Nachteilen behaftet ist. Wichtiger erscheint hingegen ein optimaler Abgleich des Monitors, was in der Praxis einen deutlicheren Einfluss auf die optimale Bildqualität hat. Ist der Monitor optimal eingestellt – auch vom Werk her, was leider nicht immer der Fall ist –, ist es vielfach nur eine Geschmacksfrage, welchem Typ der Vorzug zu geben ist, was man am besten selbst in Augenschein nimmt. Generell gilt jedoch, dass ein Bildflimmern bei größeren Monitoren eher wahrgenommen wird, als wenn die gleiche Frequenz bei einem kleineren Monitor verwendet wird. Einige hochauflösende Grafikkarten mit 1280 x 1024 Bildpunkten und mehr steuern entsprechend leistungsfähige Monitore durch ein analoges Signal an, das aus technischen Gründen über mehrere BNC-Kabel übertragen wird. Damit soll verhindert werden, dass einerseits die Ansteuerungssignale bei der Übertragung verwischt werden und andererseits das Übertragungskabel wie eine Sendeantenne wirkt und andere Geräte stört. Die einzelnen BNC-Leitungen führen die Signale rot, grün, blau, horizontale und vertikale Synchronisation. Üblicherweise wird nur ein Synchronisierungssignal (meist horizontal) verwendet, was allerdings vom jeweiligen Monitor abhängig ist, der unter Umständen die Information für die vertikale Synchronisation aus einem Farbsignal (meist rot) gewinnt. Aktuelle Standard-Grafikkarten verfügen nicht über BNC-Anschlüsse, und wer im Besitz eines Monitors ist, der ausschließlich diese Verbindung nutzen kann, muss sich ein entsprechendes Adapterkabel (BNC auf VGA) im Computerzubehörhandel beschaffen. Zu beachten ist bei der Verwendung der BNC-Anschlüsse, dass hiermit kein Plug&Play möglich ist, d.h., Sie müssen genau wissen, mit welchen Daten der Monitor zu betreiben ist.
Abb. 1.44: Dieser Monitor besitzt gleich drei verschiedene Anschlussmöglichkeiten: zwei unterschiedliche DSUB 15und fünf einzelne BNC-Anschlüsse. Über das Bedien-Panel des Monitors wird festgelegt, welcher der Anschlüsse zum Einsatz kommen soll.
Ein erfreulicher Nebeneffekt bei Monitoren, die sowohl einen DSUB-Anschluss als auch BNCAnschlüsse besitzen, ist der, dass sich zwei PCs einen Monitor teilen können. Falls der betreffende Monitor diese Funktion unterstützt, befindet sich meist an der Frontplatte – manchmal
Sandini Bib Die PC-Komponenten
49
auch versteckt auf der Monitorrückseite – eine Taste oder ein Schalter, der zwischen dem DSUBAnschluss und den BNC-Anschlüssen als Eingangssignal umschalten kann. Der eine Monitor ist daher über DSUB, der andere über BNC – eventuell mit Adapterkabel – zu verbinden. Das gleiche Prinzip lässt sich meist auch mit einem TFT-Display anwenden, wenn es sowohl über einen VGA- als auch einen digitalen Eingang verfügt. Neben den Monitoren, die mit einer Kathodenstrahlröhre arbeiten, werden die so genannten »Flachbildschirme« (TFT-Displays) immer beliebter, obwohl sie gegenüber vergleichbaren konventionellen analogen Monitoren (wesentlich) teurer sind. Als Vorteile gelten, dass sie auf der gesamten Darstellungsfläche gleich scharf sind und dass sie weder geometrische Verzerrungen noch Konvergenzprobleme kennen und auch generell unempfindlich gegen magnetische Felder sind. Die LC-Displays (Liquid Crystal), wie sie auch allgemein genannt werden, sind zudem recht flach und können prinzipiell wie ein Bild an die Wand gehängt werden. Sie sind energiesparender, sie geben längst nicht so viel Wärme ab wie die Röhrenmonitore, und Bildflackern gibt es hier prinzipiell auch nicht, obwohl die LCD-Monitore typischerweise nur mit 60 Hz arbeiten. Falls ein LCD-Monitor dennoch einmal »flimmern« sollte, hat dies einem anderen Grund als bei Röhrenmonitoren, und es liegt an einer nicht korrekten Synchronisierung zwischen der Grafikkarte und der im Display befindlichen Ansteuerelektronik begründet. Einige LCD-Monitore bieten hierfür eine Auto-Adjust-Option, vielfach muss die passende Einstellung jedoch manuell hergestellt werden. Bei der Verwendung einer digitalen Schnittstelle (DVI o.ä., siehe unten) gibt es diese Probleme allerdings nicht. Diese Flachbildschirme, die ebenfalls in Notebooks verwendet werden, werden auch als Flüssigkeitskristall-Bildschirme bezeichnet, und es gibt hier verschiedene Typen, wobei die aktuellen als Thin-Film-Transistor Liquid Crystal Displays (TFT-LCD) realisiert werden, die auch unter der Bezeichnung Aktiv-Matrix-LCDs firmieren. Neben dem höheren Preis gegenüber den analogen Monitoren gibt es jedoch einige Dinge, die als Nachteile der LCDs angesehen werden können. »Können« deshalb, weil der jeweilige Einsatzzweck letztlich bestimmt, welche Art von Monitor am besten geeignet ist. Nach wie vor kann die Darstellung bei Spielen und die Betrachtung von Videos mitunter doch enttäuschen, weil das Display zu träge wirkt, und durch die Bewegungen führt dies auch zu lästigen Unschärfeeindrücken. Ein Maß für die Umschaltgeschwindigkeit zwischen Hell und Dunkel der Pixel, das eben für diese Eindrücke verantwortlich ist, wird als Response Time (Reaktionszeit) bei den TFT-Monitoren ausgewiesen. Je niedriger dieser Wert ausfällt, desto optimaler kommt ein TFT-Monitor an die Reaktionszeit eines analogen Monitors heran, der keine Reaktionszeit in diesem Sinne kennt. Typischerweise verfügen TFT-Monitore über eine Response Time von 50-40 ms, und aktuelle Displays schaffen hier sogar bis zu 25 ms, was auch von »Gamern« als akzeptabel angesehen wird, damit die Bilddarstellung bei ActionSpielen gegenüber einem konventionellen Monitor bei schnellen Bildwechseln nicht abfällt. Wer vorhat, ein TFT-Display für derartige Anwendungen einzusetzen, ist daher gut beraten, es vor dem Kauf daraufhin zu testen. Es ist also ein sorgfältiges Abwägen der einzelnen Vor- und Nachteile bezogen auf die bevorzugten Anwendungen notwendig. Für die Ansteuerung eines TFT-Monitors, der rein digital arbeitet, empfiehlt sich die Verwendung einer digitalen Schnittstelle. Es macht im Prinzip keinen Sinn, das Signal auf der Grafikkarte per RAMDAC in analoge Signale umzusetzen und per Kabel zum TFT-Monitor zu übertragen, der das analoge Signal dann intern wieder in ein digitales umsetzt. Diese Signalumsetzung könnte man sich also sparen, wobei eine Grafikkarte, die sowohl den analogen VGA- als auch einen digitalen Anschluss besitzt, mit beiden Monitortypen (Röhre, TFT) umgehen kann. Diese hierfür notwendigen digitalen Signale haben jedoch nichts mit den digitalen Signalen der uralten Grafikadapter und Monitore (MDA, EGA) zu tun.
Sandini Bib 50
Kapitel 1
Abb. 1.45: Ein moderner PC-Arbeitsplatz mit Flachbildschirm, drahtloser Tastatur und Maus
Für die digitale Kopplung von aktuellen Grafikadaptern und TFT-Monitoren gibt es (leider) verschiedene Standards, die jedoch alle auf dem Transition Minimized Differential Signaling-Protokoll (TMDS) basieren. Als Digitalverbindung zwischen Grafikkarte und digitalem Monitor kommen hierfür spezielle Panel-Link-ICs zum Einsatz. Der Sender erzeugt aus den 24-Bit-Signalen drei serielle Signale, die differenziell (+/- 0,5 V) auf je zwei Leitungen (RGB) übertragen werden, und zwei weitere Leitungen transportieren das Taktsignal. Im Monitor befindet sich ein Panel-LinkEmpfänger, der dann wieder die ursprünglichen Grafik- und Steuersignale generiert. In Abbildung 1.30 verfügt die untere Grafikkarte auch über einen so genannten DVI-Connector. Das Digital Visual Interface ist rein digital ausgeführt und besitzt einen 24-poligen Anschluss, was als DVI-D (D für digital) gekennzeichnet wird. Daneben gibt es auch einen 29-poligen DVIAnschluss, der auch analoge Signale für einen üblichen Monitor führt, der sich über einen DVIVGA-Adapter anschließen lässt. Die beiden anderen Realisierungen der Digital Flat Panel (DFP) mit 20-poliger Schnittstelle sowie der Plug&Display-Port haben sich dagegen nicht auf breiter Front durchsetzen können. Letzterer (P&D-Port) führt neben den digitalen Signalen, die im Prinzip denen des DFP entsprechen, auch analoge Monitorsignale und des Weiteren USB- und IEEE1394-Signale an einem gemeinsamen 34-poligen Molex-Anschluss, der als Enhanced Video Connector (EVC) bezeichnet wird. Im Grunde genommen hat bisher aber nur IBM den teureren Plug&Display-Port verwendet, und die Firma ATI hat zunächst bevorzugt auf DFP gesetzt, ist jetzt aber auch auf DVI umgeschwenkt, so dass der DVI-Anschluss sich mittlerweile als Standard etabliert hat.
1.2.2
Tastatur
Die Tastatur ist trotz der grafisch orientierten Benutzeroberflächen das wichtigste Eingabemedium überhaupt. Bei älteren PCs wird das Tastaturkabel mit der 5-poligen DIN-Anschlussbuchse verbunden, die sich auf dem Mainboard befindet und hinten am Gehäuse zugänglich ist.
Sandini Bib Die PC-Komponenten
51
Mittlerweile sind die meisten Tastaturen mit einem PS/2-Stecker ausgestattet, und über entsprechende Adapter, die im Übrigen nicht zwangsläufig auch für eine Maus (siehe Kapitel 1.2.3) funktionieren müssen, lassen sich entsprechende Übergänge zwischen diesen beiden Anschlussvarianten schaffen. Der DIN- und der PS/2-Anschluss für eine Tastatur unterscheiden sich lediglich mechanisch, nicht jedoch elektrisch voneinander. Außerdem verfügen neuere Tastaturen möglicherweise auch über einen USB-Anschluss, und da der USB völlig anders funktioniert als die klassische Tastaturschnittstelle, kann es hierfür keine simple Adapterlösung geben. Der in der Tastatur vorhandene Controller ist bei derartigen Tastaturen, je nach Anschluss, eben in der Lage, beide Protokolle ausführen zu können. Das grundlegende Funktionsprinzip einer PC-Tastatur hat sich über die Jahre nicht geändert, auch wenn es – abhängig vom jeweiligen Modell – spezielle Tasten geben kann, die der dazugehörige Treiber im Betriebssystem entsprechend auswertet. Falls dieser Treiber aus irgendeinem Grunde nicht geladen ist oder nicht funktioniert, verhält sich diese speziellere Tastatur wie eine herkömmliche und unterstützt nur die üblichen Tasten. Zentraler Bestandteil einer Tastatur ist ein Mikrocontroller, beispielsweise ein 8048 bei den einfacheren Tastaturmodellen. Er überwacht die so genannte Scan-Matrix der Tastatur. Diese wird von sich kreuzenden Leitungen gebildet, die jeweils mit dem Tastaturprozessor verbunden sind. An den Kreuzungspunkten befinden sich kleine Schalter. Auf jedem dieser Schalter sitzt eine Taste. Wenn Sie nun eine Taste betätigen, schließt der Schalter einen Kontakt zwischen zwei sich kreuzenden Leitungen der Scan-Matrix. Die Tastaturschnittstelle wirkt unmittelbar auf den Prozessor des PC ein (für kundigere Leser: löst einen Hardware-Interrupt aus) und teilt diesem mit, dass ein Zeichen eingegeben worden ist. Die CPU kann das Zeichen dann einlesen und entsprechend bearbeiten, d.h., es werden die Koordinaten des gedrückten Schalters und damit die betätigte Taste ermittelt, was in Form eines Scan-Codes geschieht. Dieser Scan-Code wird über einen Puffer an die Tastaturschnittstelle auf dem Mainboard übergeben, und die CPU weiß, welche Taste betätigt worden ist. Die Umwandlung des Scan-Codes in das zugehörige Zeichen erfolgt durch ein Programm, den Tastaturtreiber (im Falle von DOS: keyb.com). Hierdurch lässt sich eine Vielfalt möglicher Tastenbelegungen realisieren. Ohne die Hardware der Tastatur und insbesondere die Scan-Matrix verändern zu müssen, können Tastaturen für verschiedenste Sprachen allein durch einen anderen, der jeweiligen Sprache angepassten Tastaturtreiber realisiert werden.
Tastaturschnittstelle
Mainboard
Tastatur
Tastaturprozessor Puffer
ScanMatrix
Abb. 1.46: Prinzipschaltbild einer Tastatur: Eine Tastatur weist einen Tastaturprozessor zur Überwachung der ScanMatrix und einen Puffer für die Zeichen auf. Die Zeichen werden zur Tastaturschnittstelle auf dem Mainboard übergeben. Die üblichen programmierbaren Tastaturen können auch Daten vom Mainboard empfangen.
Sandini Bib 52
1.2.3
Kapitel 1
Maus
Durch die grafischen Benutzeroberflächen haben sich neben der Tastatur die so genannten Zeigeeinrichtungen (engl. Pointing Devices) durchgesetzt. Die älteste Zeigeeinrichtung ist die Maus, deren Bezeichnung sich unschwer aus der runden Form und dem langen Schwanz ableiten lässt. Mäuse werden meist entweder an eine der seriellen Schnittstellen (RS232) des PC, an einen PS/2Mausport oder auch an den USB angeschlossen. Wie bereits bei den Tastaturen erwähnt wurde, gibt es auch hierfür verschiedene Adapterlösungen. Dabei ist jedoch zu beachten, dass eine Maus, die etwa für den RS232-Anschluss ausgelegt ist, nicht einfach per PS/2-Adapter (oder gar USB) verwendet werden kann. Alle drei Schnittstellen arbeiten auf verschiedene Art und Weise, und die Mauselektronik (der Controller) muss explizit für die jeweilige Anschlussart ausgelegt sein. Wenn sich im Lieferumfang einer RS232- oder auch einer USB-Maus ein PS/2-Adapter befindet, kann man davon ausgehen, dass diese Maus mit diesen beiden Schnittstellen sowohl vom Controller als auch vom Treiber her unterstützt wird. Allgemein funktioniert dies jedoch nicht. Um den Mauszeiger (meist ein Pfeil oder ein Viereck auf dem Bildschirm) bewegen zu können, benötigt jede Maus einen Maustreiber. Dieser wandelt die von der Maus kommenden Signale in Anweisungen an die CPU auf dem Mainboard um, die dann wiederum den Grafikadapter so ansteuert, dass sich der Zeiger auch tatsächlich bewegt. Wie Sie bereits von außen erkennen können, befindet sich in der Maus eine gummierte Kugel. In Abbildung 1.47 sehen Sie das Innenleben einer Maus. Die Kugel steht mit zwei kleinen Walzen in Kontakt. Wird die Maus verschoben, dreht sich die Kugel entsprechend. Die Bewegung überträgt sich auf die kleinen Walzen. Am anderen Ende der Walzenachse befindet sich eine Scheibe mit kleinen Öffnungen in regelmäßigem Abstand. Auf den beiden Seiten der Scheibe befinden sich Sender und Empfänger einer Lichtschranke. Werden die Walzen von der Kugel gedreht, unterbricht die Scheibe die Lichtschranke bzw. gibt sie frei, wenn sich zwischen Sender und Empfänger der Lichtschranke eine Öffnung der Scheibe befindet. Die Zahl dieser Unterbrechungen ist dabei proportional zur Zahl der Umdrehungen der Kugel und damit zu der Strecke, die Sie die Maus verschieben. Da die beiden Walzen senkrecht zueinander angeordnet sind, wird eine beliebige, schräge Bewegung der Maus von der Steuerelektronik in zwei Zahlen umgesetzt, die die Zahl der Freigaben der Lichtschranke für jede der beiden Scheiben angeben. Damit weiß die Maus genau, wie weit sie verschoben worden ist, nicht aber die absolute Position. Diese Werte werden nun wie eventuelle Tastenbetätigungen an der Maus zur jeweiligen Schnittstelle übertragen und von dieser an die CPU übergeben. Des Weiteren sind Maus- und auch Tastaturmodelle (vg. Abbildung 1.45) erhältlich, die keine Kabelverbindung benötigen, was dann unter drahtloser Maus bzw. kabelloser Tastatur firmiert. Drahtlos bedeutet jedoch, dass gleichwohl eine Kabelverbindung zum PC (an RS232, PS/2, USB) notwendig ist, die allerdings zu einem kleinen Kästchen führt, das die Signale von der Maus per Infrarotlicht oder auch per Funk empfängt. Demnach muss sich in der Maus eine Batterie oder ein Akku befinden, um die notwendige Spannung für den Sender zur Verfügung stellen zu können. Die Datenübertragung per Funk (typisch sind 27 MHz) hat gegenüber der Übertragung per Infrarotlicht den Vorteil, dass die Reichweite dabei größer ist (ca. 2 m) und dass keine direkte »Sichtverbindung« zwischen Sender und Empfänger notwendig ist. Wichtig erscheint in diesem Zusammenhang, dass sich bei Funkmäusen am besten auch der Übertragungskanal umschalten lassen sollte, damit sich etwa im Büro, wo mehrere derartiger Mäuse zum Einsatz kommen, keine Phänomene der Art ergeben, dass der Kollege mit seiner Maus den Mauszeiger auf Ihrem Monitor bewegt.
Sandini Bib Die PC-Komponenten
53
Abb. 1.47: Die geöffnete Maus lässt die Kugel und die beiden Lichtschranken zur Erfassung der Mausbewegung erkennen.
In den letzten Jahren sind so genannte optische Mäuse verstärkt auf den Markt gekommen, die es für unterschiedliche Schnittstellen (auch drahtlos) gibt. Diese Mäuse besitzen in ihrem Inneren keine Kugel mehr, sondern ermitteln Richtung und Umfang ihrer Verschiebung mithilfe einer Bildverarbeitungselektronik sowie einer Beleuchtungsoptik, die die Bewegung sehr genau detektieren kann. Die hierfür notwendigen (Bild-)Sensoren (CCDs) sind dabei im Gegensatz zu den Walzen einer normalen Maus keinerlei Abnutzung mehr ausgesetzt, und durch die fehlende Stahlkugel sind diese Maus-Typen (z.B. Microsoft Intelli Mouse) auch leichter. Allerdings ist diese Umsetzung recht kompliziert und erfordert einen höheren Aufwand an Elektronik. Ältere optische Mäuse orientieren sich anhand des Musters einer besonderen Unterlage (Maus-Pad), auf der sie bewegt werden, was bei den erläuterten aktuellen Typen nicht notwendig ist. Gleichwohl funktionieren diese nicht (gut) auf extrem glatten oder auch spiegelnden Oberflächen. Wenn Sie Ihre Maus auf den Rücken legen, so haben Sie fast schon einen Trackball vor sich. Tatsächlich ist das Innenleben eines Trackballs dem einer Maus sehr ähnlich. Im Allgemeinen ist der Ball aber erheblich größer als die Kugel einer Maus. Mit den Fingern können Sie diesen Ball in verschiedene Richtungen drehen und damit wie durch die Verschiebung einer Maus auf einer glatten Fläche den Mauszeiger auf dem Bildschirm bewegen. In manchen Tastaturen ist der Trackball bereits integriert.
1.2.4
Drucker und die parallele Schnittstelle
Für die Ausgabe von Texten und Bildern wird ein Drucker benötigt, der üblicher Bestandteil eines PC-Arbeitsplatzes ist. Auch wenn ein Drucker meist an die parallele Schnittstelle angeschlossen wird, gibt es im Aufbau von Druckern natürlich recht große Unterschiede, was davon abhängt, welches Druckverfahren zur Anwendung kommt, und letztendlich auch die Qualität der Ausdrucke bestimmt. Die bekanntesten Druckerarten sind die folgenden:
: :
Typenraddrucker: Dieser Drucker arbeitet im Prinzip wie eine Schreibmaschine mit einem Typenrad. Er ist nicht grafikfähig und mittlerweile als veraltet anzusehen. Nadeldrucker: Ein Nadeldrucker arbeitet mit einzelnen Nadeln im Druckkopf (typischerweise mit 9 oder 24 Stück), die in Form einer Matrix angeordnet sind, woher auch die Bezeichnung Matrixdrucker rührt. Die Nadeln schlagen wie bei einer Schreibmaschine gegen ein Farbband, und daher wird dieser Druckertyp meist dort eingesetzt, wo Durchschläge
Sandini Bib 54
:
:
:
:
Kapitel 1
benötigt werden, etwa in Behörden und Werkstätten. Nadeldrucker sind im Unterhalt unerreicht preiswert und nahezu unverwüstlich. Thermodrucker: Entweder ist dies ein Drucker, der mit einem speziellen wärmeempfindlichen Papier arbeitet, wie es bei Kassen oder Fax-Geräten der Fall ist. Diese Ausdrucke sind von relativ schlechter Qualität. Oder es handelt sich um einen hochwertigen Drucker, der sich insbesondere für fotorealistische Ausdrucke eignet. Diese Typen werden als Thermotransfer- oder Thermosublimationsdrucker bezeichnet und arbeiten mit speziellen Folien und Wachsen. Sie liefern brillante Farben, sind jedoch in der Anschaffung und im Verbrauch vergleichsweise teuer. Tintenstrahldrucker: Dies sind die beliebtesten Drucker überhaupt, und sie werden von zahlreichen Herstellern recht preisgünstig angeboten. Sie arbeiten typischerweise auch mit Farbpatronen und eignen sich demnach für kostengünstige Farbausdrucke. Die Drucktechnik beruht ebenfalls im Wesentlichen auf einer Matrixanordnung zur Zeichendarstellung. Die Zeichen gelangen jedoch nicht mit Hilfe von Nadeln über ein Farbband auf das Papier, sondern über kleine Düsen, die die Tinte direkt auf das Papier spritzen. Optimale Ausdrucke ergeben sich vielfach nur durch die Verwendung spezieller Papiere (des Druckerherstellers), die genau auf den Typ der Tinte abgestimmt sein müssen. Laserdrucker: Laserdrucker arbeiten nach dem Prinzip eines Fotokopierers mit einer Bildtrommel, die das Druckbild elektrisch (durch Aufladung) aufzeichnet, wobei das giftige Ozon entstehen kann. Ihr Vorteil besteht vor allem in der hohen Druckqualität. Der Anschaffungspreis liegt zwar meist über dem von Tintenstrahldruckern, allerdings sind die Kosten für die Verbrauchsmaterialien (Toner) bei einem relativ hohen Druckvolumen weitaus geringer. Farblaserdrucker: Sie funktionieren ähnlich wie die üblichen Laserdrucker, arbeiten demgegenüber jedoch nicht nur mit der Tonerfarbe Schwarz, sondern außerdem mit den Farben Cyan, Magenta und Yellow (CMY), die entsprechend mit der Farbe Schwarz gemischt werden. Es sind keine speziellen Papiersorten zur Erlangung einer guten Druckqualität notwendig, und es ist ein vollflächiger Farbdruck ohne Qualitätseinbußen möglich. Die Farben können nicht eintrocknen, und das Mischungsverhältnis der Farben ist stets konstant. Für Ausdrucke in Fotoqualität ist ein Farblaserdrucker allerdings nicht optimal, so dass ein guter Tintenstrahler hier meist die bessere Qualität bietet.
Für private Anwendungen stellt ein Farbtintenstrahldrucker den preisgünstigsten Druckertyp dar, der universell einsetzbar ist und sowohl Texte als auch Grafiken und Fotos ausdrucken kann. Diese Vielseitigkeit geht jedoch zu Lasten der Druckqualität, die als Kompromiss aus diesen drei verschiedenen Druckdisziplinen verstanden werden muss. Ein Schwarz-Weiß-Laserdrucker bietet demgegenüber für Texte ein besseres Schriftbild, ist auch wesentlich schneller, und ein spezieller Fotodrucker liefert einen fotorealistischeren Ausdruck. Bei einem Tintenstrahldrucker wird die optimale Druckqualität meist nur mit den speziellen Papiersorten – passend zum jeweiligen Drucker – erreicht, die nicht immer besonders preiswert erscheinen. Das Gleiche trifft auf die Patronen zu, und mitunter übersteigt der Preis für eine neue Schwarz- und Farbpatrone den Anschaffungspreis des Druckers, der bei Auslieferung auch nur über halb gefüllte Patronen verfügt. Demnach sollten nicht nur der Anschaffungspreis des Druckers, sondern auch die Verbrauchsmaterialien (Papier, Patronen) mit ins Kalkül gezogen werden, um keine böse Überraschung zu erleben. Unabhängig vom Typ wird ein Drucker zumeist an den Parallel-Port des PC angeschlossen. Daneben kann ein Drucker (zusätzlich) auch über eine RS232-Schnittstelle, einen USB-Anschluss oder auch ein Netzwerkinterface verfügen. Der Parallel-Port wird auch als LPT-Port (Line-Printer) oder als Centronics-Schnittstelle bezeichnet, wobei diese Bezeichnung vom Druckerhersteller Centronics stammt, der diese Druckerschnittstelle ursprünglich eingeführt hat.
Sandini Bib Die PC-Komponenten
55
Parallele Schnittstelle In einem PC ist der Parallel-Port 25-polig als Buchse ausgeführt, was bei älteren PCs des Öfteren zu Verwechslungen mit dem Anschluss der seriellen Schnittstelle (RS232) führte, die nicht wie heute üblich einen 9-poligen, sondern ebenfalls einen 25-poligen Anschluss aufwies. Beide Anschlüsse (25-polig RS232 und Parallel-Port) besitzen die gleichen mechanischen Abmessungen, allerdings ist der Parallel-Port mit Buchsen- und RS232 mit Steckkontakten am PC ausgeführt.
Abb. 1.48: Der Parallel-Port ist am PC als 25-polige Buchse ausgeführt und dient dem Druckeranschluss. Darunter erkennen Sie die zwei seriellen Schnittstellen.
Am Drucker ist bei der Centronics-Schnittstelle ein 36-poliger Anschluss als Buchse eingebaut. Das Verbindungskabel zwischen PC und Drucker sollte nicht länger als 5 m sein, doch auch bei kürzeren Kabeln kann es durchaus Übertragungsprobleme geben, was an einer minderwertigen Qualität des Verbindungskabels liegt. Da ein passendes Kabel meist weder dem Drucker noch dem PC beiliegt, ist es einzeln zu erwerben, und man sollte unbedingt darauf achten, dass es dem IEEE1284-Standard entspricht, der eine vollständige Verdrahtung aller notwendigen Signalleitungen garantiert. Das ist bei den besonders preiswert erscheinenden Druckerkabeln eben nicht der Fall und hat zur Folge, dass der Drucker nicht korrekt funktioniert. Die parallele und die seriellen Schnittstellen sind in den meisten Fällen als Onboard-Einheit ausgeführt, und es sollte nicht vergessen werden, die entsprechenden Controller im BIOS-Setup auch einzuschalten. Die Daten für die parallele Schnittstelle werden in Einheiten zu Bytes übertragen. Die Busschnittstelle einer parallelen Schnittstelle ist aus diesem Grund immer ein Byte (oder acht Bit) breit. Das bedeutet, dass auf einmal stets ein Byte bzw. acht Bit an die Schnittstelle übergeben werden. Das gilt prinzipiell auch für Controller und andere Einsteckkarten. Diesen können Daten in Portionen zu einem Byte übergeben werden. Einer Grafikkarte für den 32-PCIBus können also z.B. vier solcher Portionen auf einmal übergeben werden, während zu einer Karte für den 8-Bit-Bus vier solcher Portionen hintereinander übertragen werden müssen. Der I/O-Chip der parallelen Schnittstelle nimmt diese acht Bit auf einmal an und überträgt sie auf einmal, d.h. parallel zum angeschlossenen Gerät (meistens einem Drucker), so dass acht Datenleitungen vorhanden sind. Neben diesem Datenbyte werden ferner auch Steuersignale übertragen, die anzeigen, ob die Daten auch angekommen sind, was auch als Handshake-Verfahren bezeichnet wird. Das heißt, der Empfänger bestätigt dem Sender den Erhalt eines jeden Datenbytes, und außerdem wird ein Taktsignal (Strobe) zusammen mit den Datensignalen übertragen.
Sandini Bib 56
Kapitel 1
Busschnittstelle
Parallelschnittstelle (LPT1, ...)
I/O-Chip
Centronics-Stecker
(Computer)
(Drucker)
Abb. 1.49: Prinzip einer parallelen Schnittstelle: Die Schnittstellenkarte oder das Mainboard weist einen I/O-Chip oder eine äquivalente Schaltung auf, die Daten an einen Drucker abgibt oder von ihm entgegennimmt.
Der Drucker nimmt die übertragenen Daten entgegen und druckt einen Text oder eine entsprechende Grafik aus. Dabei reagiert er im Allgemeinen auf bestimmte Datenmuster im empfangenen Datenstrom. Genauer gesagt überprüft er, ob so genannte Druckersteuerzeichen oder Escape-Sequenzen auftreten, die eine Steueranweisung an den Drucker darstellen, und reagiert entsprechend. Beispielsweise bedeutet die Zeichenfolge 0dh 0ah einen Wagenrücklauf (CR = Carriage Return, dt. Wagenrücklauf; LF = Line Feed, dt. Zeilenvorschub). An eine parallele Schnittstelle können neben Druckern auch andere Peripheriegeräte (Scanner, ZIP-Laufwerk) angeschlossen werden, vorausgesetzt, dass die Schnittstelle und das jeweilige Peripheriegerät dem gleichen Standard entsprechen. Dabei gibt die traditionelle parallele Schnittstelle normalerweise nur Daten ab, empfängt aber keine. Aktuelle Versionen dieser Chips können jedoch auch Daten empfangen, und es ist z.B. möglich, über die parallele Schnittstelle (und geeignete Software) Daten zwischen zwei Computern auszutauschen oder eben auch Daten von einem Scanner zu empfangen. Der Standard, der den alten (nur unidirektionalen Modus) ablöst, firmiert unter der Bezeichnung IEEE-1284 und ist in Teil 6 näher erläutert.
1.2.5
Scanner
Texte und ganz allgemein Bilder ausdrucken zu können ist die eine Seite. Auf der anderen Seite möchte man auch Bilder und Texte auf den PC transferieren. So genannte Scanner dienen der Übertragung verschiedener Vorlagen wie Grafiken, Pläne, Fotos oder auch Texte auf den PC. Die Vorlagen werden durch einen Scanner in eine digitale Form gebracht und können daraufhin in einer Datei (*.BMP, *.TIF) gespeichert und mit den PC-üblichen Bildbearbeitungsprogrammen weiterverarbeitet werden. Falls es sich um Texte handelt, müssen diese vom Bildformat mittels eines OCR-Programms (Optical Character Recognition) in eine Textdatei umgesetzt werden, was Ihnen mühseliges Abtippen von Texten ersparen kann. Scanner gibt es prinzipiell in vier Bauformen: Handscanner, Einzugsscanner, Trommelscanner und Flachbettscanner, wobei der letztgenannte Typ am weitesten verbreitet ist. Bei diesem wird die Vorlage wie auf einen Fotokopierer gelegt. Dies können daher einzelne Blätter, Zeitungen, Bücher oder auch flache Gegenstände sein, wie beispielsweise auch eine Platine oder eine Festplatte. Im Inneren fährt ein Schlitten mit der Optik und der Umsetzerelektronik unter einer Glasscheibe hindurch.
Sandini Bib Die PC-Komponenten
57
Abb. 1.50: Bei einem Flachbettscanner wird mit der Vorlage wie bei einem Fotokopierer umgegangen.
Die Flachbettscanner sind heute bereits sehr günstig und bieten dann mindestens Auflösungen von 600 x 1200 dpi. Beim Kauf eines Scanners sollte diese maximale physikalische (tatsächliche) Auflösung beachtet werden, denn je höher sie ist, desto feiner kann die Vorlage abgetastet – gescannt – werden. Die Hersteller geben vielfach jedoch wesentlich höhere Auflösungen an, wobei es sich dann um interpolierte Werte handelt. Höhere Auflösungen als die durch den Scanner physikalisch machbaren werden eben durch Interpolation gewonnen, wobei diese Funktionalität im Softwaretreiber des Scanners oder auch der Scannersoftware implementiert ist. Diese Interpolation bedeutet nichts anderes, als dass die Software von den gescannten Punkten auf weitere schließt: Es wird also nur vermutet, dass sich zwischen zwei tatsächlichen Punkten einer bestimmten Intensität ein weiterer befindet, der in seiner Farbe und Intensität dem Mittelwert der beiden vorhandenen Punkte entspricht. Durch Interpolation wächst also nicht der Informationsgehalt des Bildes, sondern es ist gewissermaßen ein Softwaretrick, dem man in der Praxis aber keine große Beachtung schenken sollte. Die Standard-Schnittstelle für Scanner war eine Zeit lang SCSI, was viele Leute abgeschreckt haben mag, da ein üblicher SCSI-Hostadapter immer schon recht teuer war. Aus diesem Grund sind die Hersteller dazu übergegangen, ihren Scannern entsprechende SCSI-Controllerkarten mit beizulegen, wobei diese allerdings oftmals mit Vorsicht zu betrachten sind. Sie entsprechen nicht immer dem genormten SCSI-Standard, was in der Praxis zu Konfigurationsproblemen führen kann, und andere SCSI-Geräte, außer dem dazugehörigen Scanner, lassen sich hiermit auch nicht immer verwenden. Eine Kostenersparnis ergibt sich bei Scannern für die Hersteller, wenn überhaupt keine Einsteckkarte mitzuliefern ist, sondern der Scanner für den Anschluss an die parallele Schnittstelle (Druckerport, Centronics, s.o.) ausgelegt wird. Dies führt gegenüber SCSI jedoch meist zu schlechteren Datenübertragungsraten, und die gesamte Scanprozedur kann zum Geduldsspiel ausarten. Noch schlimmer sieht es allerdings bei Scannern mit USB der Version 1.0 aus, insbesondere dann, wenn noch andere USB-Geräte angeschlossen sind, die sich den USB quasi teilen müssen. Aus diesem Grunde verfügen die besseren Modelle über eine Firewire-Schnittstelle oder über den USB der Version 2.0, was sich in schnelleren Scan-Prozeduren bemerkbar macht.
Sandini Bib 58
Kapitel 1
Abb. 1.51: Der Anschluss eines Parallel-Port-Scanners erfolgt derart, dass der Scanner mit dem PC (Host-Anschluss) und der Drucker mit dem Scanner (Printer-Anschluss) verbunden wird.
Probleme mit einem Parallel-Port-Scanner ergeben sich vielfach, wenn der PC nur über einen einzigen Parallel-Port verfügt, denn hier ist meist der Drucker angeschlossen. Die Signale des Parallel-Ports müssen dann durch den Scanner zum Drucker durchgeschleift werden. Es kommt leider vor, dass das Durchschleifen der Parallel-Port-Signale beim Scanner entweder gar nicht vorgesehen ist oder der Drucker dann nicht mehr korrekt funktioniert, wie es auch beim ZIP-Laufwerk vorkommt, wenn es mit dem Drucker zusammen am Parallel-Port betrieben wird. Einmal vorausgesetzt, dass der Scanner über einen Druckeranschluss verfügt, muss der Scanner ebenfalls eingeschaltet sein, auch wenn nur der Drucker verwendet werden soll. Für den Betrieb eines Scanners an der Druckerschnittstelle muss des Weiteren der optimale IEEE1284-Mode im BIOS-Setup eingestellt werden. Welche Betriebsart für das jeweilige Scannermodell die richtige ist, kann leider nicht allgemein festgestellt werden, doch das Handbuch zum Scanner sollte die entsprechende Information preisgeben.
1.2.6
Modems und die serielle Schnittstelle
Heutzutage will wohl jedermann ins Internet, sei es wegen der elektronischen Post (EMail), zur Erledigung von Bankgeschäften per heimischem PC (Homebanking), zur Informations- und Treiberbeschaffung oder auch einfach nur zum Spaß (zum »Surfen«). Viele aktuelle PCs bringen daher auch gleich die notwendigen Voraussetzungen hierfür mit. Dies sind in der Regel ein Modem und die spezielle Software eines Providers, der einem den Internetzugang mittels Telefonleitung ermöglicht. Neben der Verbindung zum Internet über einen Provider lässt sich ein übliches Modem auch als Fax-Gerät und Anrufbeantworter (voice/fax-Modem) sowie für die Kommunikation mit Mailboxen – beispielsweise mit Hilfe des Windows-Programms Hyperterminal – verwenden, was im Internet-Zeitalter jedoch kaum noch praktiziert wird, zumal auch nur noch relativ wenige Mailboxen existieren.
Sandini Bib Die PC-Komponenten
59
Modems Die Bezeichnung Modem setzt sich aus den beiden Begriffen Modulator und Demodulator zusammen. Die vom PC gelieferten digitalen Informationen werden vom Modem in Schwingungen umgesetzt, wodurch die Spannung, mit der das analoge Telefonnetz arbeitet, moduliert wird. Beispielsweise entspricht eine »0« der Frequenz 2100 Hz und eine »1« der Frequenz 1200 Hz. Auf der Empfängerseite erfolgt dementsprechend der umgekehrte Vorgang – die Demodulation –, wo gewissermaßen aus den »Tönen« wieder digitale Signale erzeugt werden. Die Modems arbeiten, im Gegensatz etwa zum ADSL-Verfahren (siehe weiter unten), im Sprachband des üblichen Telefonnetzes. Für die Datenübertragung in öffentlichen Fernsprechnetzen sind eine Reihe von Standards definiert worden, die auf amerikanischen, europäischen und auch herstellerspezifischen Festlegungen beruhen. Des Weiteren existiert ein Quasi-Standard für Modem-Befehle (Hayes).
: : : : :
Allgemeine Übertragungsarten (Bell, V.21, V.34, V.90) Fehlerkorrekturprotokolle (V.42, V.42bis, MNP) Fax-Standards (Klasse 1 bis 4) Modem-Befehle (Hayes Commands) Voice-Betrieb (Modem als Anrufbeantworter)
Im Handbuch zum Modem sollte angegeben sein, welche Funktionen im Einzelnen nach welchen Standards unterstützt werden. Leider ist dies nicht immer klar ersichtlich, und einige Optionen lassen sich nur dann verwenden, wenn sich an beiden Seiten der Modem-Verbindung identische Modems desselben Herstellers befinden. Dies kommt insbesondere dann vor, wenn die Hersteller bereits Funktionen in ihren Modems implementiert haben, die noch nicht in einem allgemein verbindlichen Standard festgeschrieben worden sind und die über die bis dato spezifizierten hinausgehen. Tabelle 1.8 zeigt einige Beispiele von anerkannten US- und europäischen Standards sowie auch einige herstellerspezifische Implementierungen. Bezeichnung
Typ
Maximale Geschwindigkeit
Bell 103 Bell 212A HST Dynamic Duo K56 Flex
US-Standard US-Standard Eigenes Protokoll der Firma US Robotics Eigenes Protokoll der Firma Boca Eigenes Protokoll der Firma Hayes
PEP Shotgun Turbo PEP V.21 V.22 V.22bis V.23 V.32 V.32bis V.32ter V.34 Fast V.34 Fast Class
Eigenes Protokoll der Firma Telebit Eigenes Protokoll der Firma Diamond Eigenes Protokoll der Firma Telebit Internationaler Standard Europäischer Standard Internationaler Standard Europäischer Standard Internationaler Standard Internationaler Standard V.32bis-Erweiterung der Firma AT&T Europäischer Standard Herstellerspezifisch, Vorstufe zu V.34 Fast
300 BPS 1200 BPS unterschiedlich 112 kBPS (2 Kanäle) 56000 BPS (download) 33600 BPS (upload) 14400 BPS 112 kBPS (Multichannel-Protokoll) 23000 BPS 300 BPS 1200 BPS 2400 BPS 1200/75 BPS 9600 BPS 14400/1200 BPS 23300 BPS 28800 BPS 28800 BPS
Tab. 1.8: Datenfernübertragungsprotokolle in der Übersicht
Sandini Bib 60
Kapitel 1
Bezeichnung
Typ
Maximale Geschwindigkeit
V.34 (V.Fast) X2
Internationaler Standard Eigenes Protokoll der Firma US Robotics
V.90
Internationaler Standard
V.92
Internationaler Standard
33600 BPS 56000 BPS (download) 33600 BPS (upload) 56000 BPS (download) 33600 BPS (upload) 56000 BPS (download) 48000 BPS (upload)
Tab. 1.8: Datenfernübertragungsprotokolle in der Übersicht (Forts.)
Ein Modem sollte mindestens dem V.90-Standard entsprechen. V.90 löst den jahrelang gültigen V.34-Standard ab, der maximal 33600 BPS (Bits Per Second) in beiden Richtungen bietet. Für V.34 gibt es genau genommen unterschiedliche Implementierungen (+, Fast Class, V.Fast), wobei man heutzutage darunter jedoch den internationalen Standard mit 33600 BPS versteht. An der Ablösung dieses Standards haben sich zunächst zwei verschiedene Verfahren konkurrierender Firmen versucht, und zwar K56Flex (Rockwell, Motorola, Lucent) sowie X2 (3COM, US Robotics). Im Jahre 1998 wurde als Kompromiss beider, nicht zueinander kompatiblen Verfahren der V.90Standard von der ITU (International Telecommunication Union) verabschiedet. Allen drei Verfahren (K56Flex, X2, V.90) ist gemeinsam, dass die theoretisch möglichen 56000 Bit/s nur in der Richtung vom Host – dem Internet-Provider – zum Anwender möglich sind. Wegen des eingeschränkten Frequenzbereichs (300–4000 Hz) des Fernsprechnetzes funktioniert dies ohne weiteres weder in umgekehrter Richtung, noch können sich zwei V.90-Modems mit dieser Bitrate »unterhalten«. In beiden Richtungen physikalisch machbar sind lediglich die 33600 BPS des V.34-Standards. Die V.90-Modems basieren auf der Voraussetzung, dass der Internet-Provider einen digitalen Anschluss zum Internet verwendet und die Vermittlungsstelle, mit der der Anwender ganz allgemein kommuniziert, ebenfalls digitalisiert ist, was laut Telekom überall in Deutschland der Fall sein sollte. Der Provider überträgt die Daten komplett in digitaler Form bis zur Vermittlungsstelle der Telekom. Hier werden sie dann in analoge Signale (die Sprache ist bekanntlich immer noch ein analoges Signal) umgesetzt, was im Grunde bedeutet, dass die Vermittlungsstelle einem vorgelagerten V.90-Sender-Interface entspricht. Es wird nun davon ausgegangen, dass der (analoge) Weg von der Vermittlungsstelle zum Anwender so kurz ist, dass die Dateninformation als einzelne Spannungswerte zu senden ist und keine Modulation (wie bei V.34) notwendig ist, wodurch sich, da hierfür eben keine Demodulierung nötig ist, die höhere Geschwindigkeit ergeben kann. In der anderen Richtung – vom Anwender zum Provider – funktioniert dies nicht, und daher sind hier nach wie vor die 33600 BPS laut dem V.34-Standard das Maximum, was für die Kommunikation mit einem Internet Provider meist jedoch nicht gravierend ist, da man (relativ große) Datenmengen eher aus dem Internet lädt, als dass man sie dorthin sendet. Der Standard V.92 bietet als wesentliche Verbesserungen gegenüber V.90, dass nunmehr in Upstream-Richtung 48 KBit/s möglich sein sollen, in Downstream-Richtung bleibt es allerdings bei maximal 56 KBit/s. Möglich ist die höhere Datentransferrate, da das letzte Stück der Strecke (zum Anwender) nun ebenfalls digital kodiert wird und hier keine analogen Werte mehr zu transportieren sind. Des Weiteren ist mit V.92 die Möglichkeit gegeben, dass bei einer aktiven Modemverbindung ein einkommender Telefonanruf angenommen werden kann; das Modem gibt die Leitung frei, und nach beendetem Gespräch wird die Modem-Kommunikation an derjenigen Stelle weitergeführt, wo sie zuvor unterbrochen worden war (Modem on Hold). Die dritte neue Funktion führt die Bezeichnung Quick Connect und sorgt dafür, dass der Verbindungsaufbau zum Provider wesentlich schneller vonstatten gehen soll, da sich das Modem die Verbindungsparameter für den jeweiligen Provider »merken« kann und eine erneute Anwahl deshalb
Sandini Bib Die PC-Komponenten
61
schneller abläuft, weil diese Parameter nicht erneut ausgehandelt werden müssen. Der Übergang von V.90 zu V.92 verläuft bei den Providern eher etwas zögerlich, und vielfach ist lediglich der abwärtskompatible V.90-Modus nutzbar.
Abb. 1.52: Ein extern anzuschließendes Modem bietet zur Anzeige einige Leuchtdioden, auf denen sich der Status des Gerätes direkt ablesen lässt, was sich insbesondere für die Fehlersuche bewährt hat.
Ein Modem kann entweder als Einsteckkarte oder als eigenständiges, extern anzuschließendes Gerät ausgeführt sein. Bei einigen PCs ist die Modemschaltung auch gleich mit auf dem Mainboard integriert, was aber nichts am Prinzip ändert und daher ebenfalls als Einsteckkarte angesehen werden kann. Ob intern oder extern macht zunächst keinen Unterschied, denn in beiden Fällen kann ein Modem eine serielle Schnittstelle des PC verwenden. Ein externes Modem wird üblicherweise an COM2 angeschlossen, wenn die Maus den anderen Port – COM1 – belegt. Ein Modem als Einsteckkarte bringt demgegenüber eine eigene serielle Schnittstelle mit, die üblicherweise als COM3 oder COM4 für den PC konfiguriert wird. Für Notebooks gibt es außerdem PCMCIAEinsteckkarten (Card-Bus) mit Modemfunktion, die mitunter auch mit einer Netzwerkkarte kombiniert sind. Sowohl externe als auch interne Modems haben durchaus ihre Vor- und Nachteile. Die auf der Frontplatte eines externen Modems angebrachten Leuchtdioden bieten hilfreiche Informationen zum aktuellen Status des Gerätes, was insbesondere bei der Analyse von Kommunikationsproblemen äußerst nützlich sein kann. Dieses Feature gibt es bei einem internen – als Einsteckkarte ausgeführten – Modem hingegen nicht. Vielfach sind die internen Modems jedoch preiswerter als die externen. Der Anschluss eines Modems erfolgt auf der anderen Seite üblicherweise an die TAE-N-Dose (der Telekom) mithilfe eines Adapterkabels, denn an einem Modem finden Sie in der Regel hierfür eine Buchse für einen Western-Stecker vom Typ RJ11. Diese Buchse ähnelt dem RJ45Anschluss, wie er für LAN- und auch ISDN-Verbindungen verwendet wird, ist jedoch mechanisch kleiner und verfügt nur über vier statt acht Kontakte. Serielle Schnittstelle Neben einer parallelen Schnittstelle weist ein PC meist auch eine oder mehrere serielle Schnittstellen (vgl. Abbildung 1.48) auf. In Abbildung 1.53 ist das Prinzipschaltbild einer seriellen Schnittstelle angegeben.
Sandini Bib 62
Kapitel 1
Busschnittstelle
Serielle Schnittstelle (COM1, ...)
UART: 8250 16450 16550
Modem
RS-232C-Stecker
25-Pin
9-Pin
Abb. 1.53: Prinzip einer seriellen Schnittstelle: Sie besteht im Wesentlichen aus einem UART, der die Umwandlung von oder in serielle Daten ausführt. An eine serielle Schnittstelle lässt sich z.B. ein Modem zur Datenkommunikation anschließen.
Zentraler Bestandteil ist ein so genannter UART (Universal Asynchronous Receiver Transmitter). Über die Busschnittstelle kann die CPU auf ihn zugreifen und verschiedene Daten lesen und übertragen. Auch im Fall einer seriellen Schnittstelle werden Daten in Form eines Bytes zur Busschnittstelle und von dieser zum UART übertragen. Der UART leitet die Daten aber im Gegensatz zur parallelen Schnittstelle nicht parallel an ein Peripheriegerät weiter, sondern wandelt das Byte in einen seriellen Strom einzelner Bits um. Dieser »Datenstrom« wird über eine einzige Datenleitung und nicht wie bei der parallelen Schnittstelle über acht Datenleitungen übertragen. Außerdem fügt der UART ggf. weitere Bits hinzu: Start-, Stop- und Paritätsbit. Dadurch entsteht ein Datenpaket aus acht Datenbits und den zusätzlichen Steuerbits vom UART. Die Zahl der Änderungen des Signals pro Sekunde wird als Baudrate bezeichnet. Das Paritätsbit dient einer einfachen Gültigkeitsprüfung der übertragenen Daten. Damit sind wesentlich größere Übertragungsdistanzen als bei der parallelen Schnittstelle möglich. Serielle Schnittstellen in PCs genügen den (minimalen) Anforderungen des RS232C-Standards, der die Belegung und Bedeutung der Anschlüsse festlegt. Dieser Standard fordert insgesamt 25 Anschlüsse. Bei seriellen Schnittstellen für Personal Computer sind von diesen 25 jedoch maximal 14 belegt, auch wenn der zugehörige Stecker 25 Stifte aufweist. Ferner gibt es noch eine Version mit neun Stiften, die für die festgelegte Verwendung in PCs ausreicht und heute die übliche PC-Implementierung darstellt. Das Besondere am UART und damit an der seriellen Schnittstelle ist, dass Ausgabe und Empfang der Daten völlig asynchron erfolgen können: Laufen Daten ein, wird der UART ohne Einwirkung der CPU aktiv und nimmt die Daten entgegen. Anschließend teilt er dem Prozessor mit, dass er Daten empfangen hat und diese weitergeben möchte. Das funktioniert natürlich nur dann korrekt, wenn die Übertragungsparameter (Baudrate, Zahl und Wert der Start-, Stop- und Paritätsbits) der beiden seriellen Schnittstellen, von PC und Peripherie bzw. von den beiden über den COM-Port gekoppelten PCs, übereinstimmen.
1.2.7
ISDN und ADSL
Neben den klassischen analogen Modems (siehe Kapitel 1.2.6) und ISDN gibt es eine Reihe weiterer Technologien, die für den Internetzugang verwendet werden können. Möglich ist die Datenübertragung durch Energieversorgungsleitungen (Powerline), über Satelliten oder auch
Sandini Bib Die PC-Komponenten
63
über Breitbandkabel (TV), wofür so genannte Kabelmodems zum Einsatz kommen, die mit dem bekannten Modem nicht viel gemeinsam haben, außer dass die Signale hier ebenfalls moduliert und demoduliert werden. In diesem Kapitel möchte ich mich allerdings auf ISDN und ADSL, die beiden gebräuchlichsten Alternativen zu einem klassischen Modem, beschränken. ISDN Ein Modem arbeitet, wie erläutert, auf analoger Basis, während das Integrated Services Digital Network (ISDN) für die digitale Datenübertragung vorgesehen ist und eine schnellere (64 KBit/s), störungssicherere Übertragung sowie eine Reihe spezieller Dienste bietet, die von den unterschiedlichsten ISDN-Geräten sowie auch von einem Telefon oder Faxgerät verwendet werden können. Um ISDN nutzen zu können, wird ein (digitaler) ISDN-Hausanschluss benötigt, wobei die gleichen Leitungen (der Telekom) verwendet werden, wie es bei der analogen Übertragung der Fall ist. Die Telekom schaltet lediglich den entsprechenden Kundenanschluss in der Vermittlungsstelle auf den digitalen Betrieb um. ISDN bietet drei verschiedene, gleichzeitig nutzbare Informationskanäle, und zwar zwei so genannte B-Kanäle (B1, B2) für Wählverbindungen mit 64 KBit/s und einen D-Kanal mit 16 KBit/s für Steuerinformationen. Dem Anwender stehen die beiden B-Kanäle zur Verfügung, und mit geeigneter Software ist es auch möglich, eine Kanalbündelung vorzunehmen, wodurch eine Transferrate von maximal 128 KBit/s zur Verfügung steht, was jedoch mit doppelten Kosten verbunden ist. Die Gegenstelle muss allerdings ebenfalls diese Option zur Verfügung stellen. Oftmals ist es sogar nötig, dass auf beiden Seiten die gleichen Geräte verwendet werden. Ein ISDN-Adapter für den PC ist vielfach als Einsteckkarte (ISA, PCI) ausgeführt, wobei es mittlerweile aber auch externe Geräte für den USB gibt, was eine entsprechende PC-Erweiterung vereinfacht. Außerdem sind ISDN-Einheiten für Bluetooth in Form einer Basisstation und kleinen USB-Bluetooth-Adaptern erhältlich, womit typischerweise bis zu sieben PCs mit einer drahtlosen ISDN-Verbindung versorgt werden können. Die ISDN-Verbindungen werden mit Western-Steckern (RJ45) hergestellt, wie sie auch bei Netzwerkkarten üblich sind, daher kann es schon einmal passieren, dass man aus Versehen die falsche Buchse für den Anschluss der ISDN-Leitung erwischt.
Abb. 1.54: Insbesondere die ISDN-Karten (Fritz!) der Firma AVM sind für PCs sehr verbreitet.
Die Leitungen der Telekom werden üblicherweise an einen Network Terminator (NT) geführt, was gewissermaßen dem Anschlusskasten entspricht. Hier befindet sich der für den Anwender wichtige Anschlusspunkt, der aus vier Leitungen besteht und als S0-Bus bezeichnet wird. Für
Sandini Bib 64
Kapitel 1
den Anschluss von Endgeräten sind prinzipiell mehrere Möglichkeiten gegeben: Entweder werden sie direkt mit dem S0-Bus verbunden, wobei maximal zwölf Dosen (Mehrgeräteanschluss) installiert und gleichzeitig acht Geräte betrieben werden können, oder es wird nur eine S0-Dose für den Anschluss einer Telekommunikationsanlage (TK) verwendet. Für den S0-Bus gilt, wie generell für Bussysteme, dass das erste und das letzte Gerät am Bus zu terminieren ist. Hierfür werden in den entsprechenden IAE-Dosen (ISDN-Anschluss-Einheit) jeweils zwei Widerstände von 100 Ohm eingesetzt. Die eingeschalteten ISDN-Geräte identifizieren sich am S0-Bus mit einer Diensterkennung. Das auf dem D-Kanal arbeitende D-Kanal-Protokoll sorgt dann beispielsweise dafür, dass ein Anruf immer zum richtigen Endgerät geleitet wird. Das Telefon klingelt bei einem Sprachdienst, und bei einem eintreffenden Fax wird das Faxgerät aktiv. Das D-Kanal-Protokoll ist allgemein für die Verarbeitung der Steuerinformationen zuständig und auch für die Limitierung auf maximal acht Endgeräte verantwortlich. ADSL ADSL steht für Asymmetrical Digital Subscriber Line. ADSL, das bei der Telekom als T-DSL bezeichnet wird, beruht auf dem Prinzip, dass man die analoge Signalübertragung – für die Sprache und die konventionelle Modemübertragung – unverändert lässt (im Bereich von 300– 4000 Hz) und darüber (ab ca. 130 kHz) ein spezielles Modulationsverfahren (QAM, QuadraturAmplituden-Modulation) einsetzt, das im Prinzip ebenfalls in einer analogen Datenübertragung auf den Leitungen resultiert, wie es auch bei einem konventionellen Modem der Fall ist. In Abbildung 1.55 sind die Frequenzbänder angegeben, wie sie für POTS (Plain Old Telephone System, das herkömmliche Telefon), ISDN und ADSL laut dem ITU-Standard verwendet werden.
POTS
ISDN
4 kHz
130 kHz
ADSL ..... Upstream
275 kHz
ADSL ..... Downstream
1 MHz
Abb. 1.55: Die genutzten Frequenzbänder für die Sprachübertragung, ISDN und ADSL
Aus diesem Grunde ist es durchaus möglich, ADSL an einem herkömmlichen analogen Anschluss zu verwenden, der von der Telekom entsprechend eingerichtet wurde. Die Telekom kombiniert ADSL meist mit ISDN, was dann unter T-ISDN firmiert. Die andere Variante, ADSL mit der Anschlussmöglichkeit für analoge Endgeräte (Telefon, Fax), wird demgegenüber als T-Net bezeichnet. ADSL ist aber nur eine (asymmetrische) Variante des Digital Subscriber Line-Verfahrens. Asymmetrisch deshalb, weil die Datenübertragungsrate in Kundenrichtung (downstream) und aus Kundenrichtung (upstream) unterschiedlich ist. Es gibt eine ganze Reihe anderer DSL-Implementierungen, was dann in allgemeiner Form als xDSL bezeichnet wird, und das »x« kennzeichnet dabei die jeweilige DSL-Technologie. Was der jeweilige Anbieter für Datenübertragungsraten anbietet, liegt in seinem Ermessen, und in Tabelle 1.9 ist angegeben, was zurzeit technisch machbar erscheint.
Sandini Bib Die PC-Komponenten
65
Kürzel
Bezeichnung
max. Datenrate
max. Reichweite
HDSL ADSL
High Bitrate DSL Asymmetrical DSL
5 km 5 km
SDSL VDSL
Single Pair DSL Very High Bitrate DSL
2 MBit/s 8 MBit/s (downstream) 0,8 MBit/s (upstream) 2 MBit/s 52 MBit/s (downstream) 2,3 MBit/s (upstream)
3,5 km 300 m
Tab. 1.9: Die bekannten xDSL-Varianten mit den wichtigsten Kenndaten
Zur Trennung der Telefon- von den Datenfrequenzen kommt ein so genannter Splitter zum Einsatz. Die Amtsleitung (Amt) führt in den Splitter hinein, und als Anschlüsse stehen auf der Frontplatte des Splitters meist drei TAE-Buchsen für ISDN- oder aber analoge Geräte zur Verfügung sowie eine RJ45-Buchse, von der aus mit einem entsprechenden Kabel die Verbindung zum ADSL-Modem hergestellt wird. Die möglicherweise vorhandenen ISDN-Geräte werden mit diesem Anschluss genauso betrieben, wie es zuvor erläutert wurde. Ironie des Schicksals ist bei ISDN, dass die mit Macht vorangetriebene Digitalisierung und Verlegung von Glasfaserleitungen für ADSL eigentlich gar nicht notwendig und teilweise sogar hinderlich ist, weil das gesamte ISDN-Leistungsspektrum sich mit in ADSL unterbringen lässt, das vereinfacht gesagt wie ein übliches Modem arbeitet, mit der wichtigen Neuerung eben, dass für die Modulation nicht das Sprachband, sondern höhere Frequenzen verwendet werden.
Splitter TAE: ISDN/Analog Sprache
Amtsanschluss
Telefon ISDN
RJ11 RJ45 Daten RJ45
ADSLModem RJ45
LAN TCP/IP
PPPoE RJ45
RJ45
LAN-Karte 1
LAN-Karte 2
Personal Computer Abb. 1.56: Die prinzipielle Geräteanordnung mit ADSL
Ein ADSL-Modem verfügt zumeist über RJ45-Buchsen, wie sie auch bei Netzwerkkarten gebräuchlich sind, und demnach passt hier auch ein gewöhnliches Twisted Pair-Kabel hinein, mit dem die Verbindung zur Netzwerkkarte eines PC hergestellt wird. Bei der Netzwerkkarte
Sandini Bib 66
Kapitel 1
kann es sich um eine übliche 10-MBit-Karte handeln, denn Fast-Ethernet wird vom ADSLModem nicht unterstützt und wäre auch gar nicht notwendig. Die Datenübertragungsrate beträgt bei T-ISDN dsl 768 KBit/s zum Kunden (downstream) und 128 KBit/s (upstream) in der Gegenrichtung. Neben der Telekom bieten auch andere Firmen, mitunter auf eine bestimmte Region beschränkt, einen ADSL-Anschluss an, der teilweise höhere Datenübertragungsraten bietet als T-DSL, und es sind dann auch andere Leistungsklassen wie etwa mit 1,5 MBit/s downstream und 192 KBit/s upstream möglich. Für den Einsatz von ADSL muss lediglich die Netzwerkkarte korrekt im System eingebunden sein, und für die software-technische ADSL-Anbindung kommt zumeist das Point-to-Point-Protocol over Ethernet (PPPoE) zum Einsatz. Wenn der PC über zwei Netzwerkkarten verfügt, also eine für den Anschluss des ADSL-Modems und eine für ein LAN, kann dieser PC als Router zwischen dem LAN und dem ADSL-Internet-Anschluss fungieren. Mit Hilfe der Internet-Freigabe (ab Windows 98) ist es auch möglich, die ADSL-Verbindung in einem LAN für die gemeinsame Nutzung freizugeben.
Abb. 1.57: Ein xDSL-Router kann in einem LAN auch als Switch fungieren und zudem noch weitere Aufgaben übernehmen (Firewall, DHCP, DNS), was vom jeweiligen Typ abhängig ist.
Für die gemeinsame Nutzung eines ADSL-Zugangs ist ein eigenständiger ADSL-Router empfehlenswert, der verhältnismäßig günstig von allen bekannten Herstellern von Netzwerkeinheiten, wie etwa 3Com, D-Link, Netgear oder auch Allied Telesyn angeboten wird. Dadurch ist es nicht nötig, einen extra PC für das Routing einsetzen zu müssen. Ein ADSL-Router fügt sich nahtlos in eine bereits bestehende Netzwerkinfrastruktur ein und kann – je nach Modell – zudem auch noch die Funktion eines Switch, eines DHCP- und eines DN-Servers im LAN mit übernehmen. Bei den einzelnen PCs im Netzwerk, die lediglich einen gewöhnlichen Router/Gateway sehen, was bei den Eigenschaften für TCP/IP jeweils festzulegen ist, ist dann weder eine spezielle Software zu installieren, noch sind sonstige Änderungen notwendig. Auf der LAN-Seite kann dann komplett (weiter) mit TCP/IP-Adressen gearbeitet werden, ohne irgendwelche speziellen ADSL-Anpassungen vorzunehmen.
Sandini Bib
Teil 2: Die Mikroprozessoren der Personal Computer Prozessor und Speicher sind üblicherweise neben dem Chipset die wesentlichen Bestandteile des Mainboards. Dieses enthält alle Komponenten, die man gemeinhin als Computer bezeichnet. Auf dem Mainboard und insbesondere zwischen Prozessor und Speicher finden alle wesentlichen Vorgänge statt, die einen Computer ausmachen. Der Prozessor – häufig auch als CPU bezeichnet – bildet dabei das Herzstück oder das Gehirn des PC. In ihm findet die gesamte Datenverarbeitung statt, die wenigstens ein Minimum an Intelligenz erfordert. Alle anderen und teilweise recht kompliziert anmutenden Chips sind nur die Sklaven des Prozessors. Er gehört neben den Speicherchips zu den höchstintegrierten Bauteilen des PC, und seine Intelligenz schöpft er letztendlich aus einer Vielzahl von Feldeffekttransistoren, auf die ich im Folgenden kurz eingehen möchte, gefolgt von den Grundlagen der maschinennahen Informationsdarstellung und den Logikgattern, was alles in Kombination zu einem Mikroprozessor führt.
2 Grundlagen der Mikroprozessortechnik Bekanntermaßen gibt es mittlerweile zahlreiche unterschiedlich leistungsfähige CPUs für PCs, und wenn Sie sich heute einen neuen PC kaufen, wird sich die darin vorhandene CPU von ihren Leistungsdaten her gesehen von einem »Uralt-Mikroprozessor« wie dem 8086 drastisch unterscheiden. Dies gilt ebenfalls für die damit einhergehende Elektronik auf dem Mainboard wie etwa Speicher, Chipset und Bussysteme. Da mag man sich berechtigterweise fragen, ob ältere Systeme überhaupt noch von Bedeutung sind. Ich möchte behaupten ja, und zwar gleich aus mehreren Gründen. Zum einen erscheint der Einstieg in die Technik etwa anhand eines Pentium IV ohne entsprechende Vorkenntnisse kaum ernsthaft zu bewältigen zu sein; man wird von den Features geradezu erschlagen, ohne wirklich zu verstehen, was da im Einzelnen vor sich geht. Zum anderen kann auch ein Pentium 4 wie eine 8086-CPU arbeiten, wie sinnvoll dies auch immer sein mag. Gleichwohl bleiben die Programme hierfür überschaubar und sind ideal als Einstieg, um sich dann an die Weiterentwicklungen zu wagen, die von CPU- zu CPU-Generation eingeführt worden sind. Sie werden feststellen, dass einige Dinge wie die Speicherverwaltung oder die recht knapp bemessenen PC-Ressourcen (z.B. die Anzahl der möglichen Interrupt-Kanäle) als »Altlasten« des ursprünglichen PC-Designs zu sehen sind, was auch so manches aktuelles PC-Problem erklärt. Des Weiteren werden diejenigen CPUs, die in aktuellen PCs nicht mehr zu finden sind, weiterhin eingesetzt, und zwar in industriellen Steuerungen und Regelungen und auch auf PC-Einsteckkarten wie ISDN-Adaptern oder auch in Einheiten für die Messdatenerfassung, um nur einige Beispiele zu nennen. Die PC-Technik gilt ganz allgemein als »Triebfeder« der (Halbleiter-)Technologie, und im Nu wird aktuelle PC-Technik – zumindest aus der Sicht der PC-Hersteller – zum alten
Sandini Bib 68
Kapitel 2
Eisen. Aus den genannten Gründen wird es daher zunächst um die ganz grundlegenden Dinge der Mikroprozessor-Technik gehen, und nachfolgend wird konsequent eine CPU nach der anderen behandelt.
2.1 Der Feldeffekttransistor Für hochintegrierte Schaltkreise wie Mikroprozessoren oder Speicherchips eignet sich der MOSFeldeffekttransistor (oder kurz MOSFET) besonders, da er einerseits klein und einfach herzustellen ist und andererseits eine geringe Leistungsaufnahme besitzt. Die Leistungsaufnahme ist dabei die Differenz zwischen zugeführter Leistung (beispielsweise durch eine Batterie) und der vom Schaltkreis abgegebenen Leistung (z.B. zum Betreiben einer Glühlampe). Diese Differenz wird vollständig in Wärme umgewandelt und heizt den Schaltkreis auf. Bei einer Million Transistoren, die jeweils nur ein hunderttausendstel Watt verbrauchen, fallen z.B. bereits 10 W Gesamtverlustleistung an. In diesem Zusammenhang möchte ich anmerken, dass nicht primär ein hoher Strom den Schaltkreis zerstört, sondern die durch den Überstrom verursachte Aufheizung lässt die Bausteine »durchbrennen«. In Abbildung 2.1 finden Sie ein Diagramm eines n-Kanal- und eines p-Kanal-MOSFETs. Kennlinie ID
ID Vst Vth
Vst
Vth
UGS
UGS
Halbleiterschichten Source
Gate
Drain
Source
n+
p+
Kanal
n+
p+
n
ID
+ -
Drain
Kanal
p
Schaltbild
Gate
ID
+ -
n-Kanal-MOSFET
+
+
p-Kanal-MOSFET
Abb. 2.1: Die Kennlinien von n-Kanal- und p-Kanal-MOSFET sind komplementär. Ein Feldeffekttransistor besteht aus zwei dotierten Bereichen, Source und Drain, in einem schwach dotierten Substrat. Die Leitfähigkeit des Kanals zwischen Source und Drain wird durch die Spannung am Gate verändert.
Der n-Kanal-MOSFET besteht aus einem p-dotierten Siliziumsubstrat, in dem in geringem Abstand (in ICs etwa 0,5-5 µm) zwei n+-dotierte Bereiche, die Source bzw. Drain, gebildet sind. p-Dotierung bedeutet, dass im Substrat als Ladungsträger für den Stromfluss mehr positive Ionen als negative Elektronen vorhanden sind. Dies wird durch die Einlagerung von Fremd-
Sandini Bib Grundlagen der Mikroprozessortechnik
69
atomen oder Störstellen erreicht, die als Atom weniger (p-Dotierung mit Bor u.a.) oder mehr (nDotierung mit Phosphor, Arsen u.a.) Elektronen als das Siliziumatom aufweisen. Das + deutet an, dass die Bereiche sehr stark dotiert sind (d.h., dass eine hohe Konzentration dieser Störstellen vorliegt). Zwischen den beiden Bereichen befindet sich der so genannte Kanal. Die Leitfähigkeit des Kanals (und somit der Widerstand des MOSFET) wird durch ein aus Metall oder polykristallinem Silizium gebildetes Gate gesteuert, das vom Substrat durch eine Oxidschicht getrennt (und damit auch isoliert) ist. Von oben nach unten lautet die Schichtfolge somit Metall-Oxid-Halbleiter, daher die Bezeichnung MOS-Transistor (engl. Semiconductor = dt. Halbleiter). Wird an das Gate eine Steuerspannung angelegt, so bilden sich im Kanal durch einen »Saugeffekt« freie Ladungsträger. Je kräftiger die Spannung ist, desto mehr Ladungsträger stehen zur Verfügung, d.h. desto geringer ist der Widerstand des Kanals. Man beachte in diesem Zusammenhang, dass Transistor die Abkürzung für Transfer Resistor, dt. Übertragung des Widerstands, ist. Legt man zwischen Gate und Source eine Spannung UGS an, so ist der Strom ID zwischen Source und Drain (und daher natürlich auch die vom MOSFET abgegebene Spannung) von der Spannung des Gates abhängig. Erst wenn die Schwellenspannung Vth (Theshold-Spannung) überschritten ist, beginnt der Stromfluss. Wird der Sättigungswert Vst überschritten, so erhöht sich der Strom durch den MOSFET auch bei erheblich steigender Spannung UGS zwischen Source und Gate nicht mehr. Der MOSFET arbeitet dann im Sättigungsbereich. Der eben beschriebene MOSFET wird genauer gesagt als n-Kanal-Anreicherungs-MOSFET mit isoliertem Gate bezeichnet (Abbildung 2.1, links). In gleicher Weise kann ein p-Kanal-Anreicherungs-MOSFET konstruiert werden, wenn man die n- und p-Schichten austauscht (siehe Abbildung 2.1, rechts). Ein sehr bedeutender Unterschied zwischen diesen besteht im konträren Verlauf der Leitfähigkeit mit der Spannung UGS zwischen Gate und Source: Mit wachsendem UGS steigt die Leitfähigkeit des n-Kanal-MOSFET an, die des p-Kanal MOSFET fällt jedoch auf Null ab. Bildlich gesprochen bedeutet dies, dass die Spannung des Gates die Ladungsträger aus dem Kanal »verdrängt« und somit dessen Widerstand erhöht. Aus der Kennlinie ist ersichtlich, dass zwischen der Schwellenspannung Vth und der Sättigungsspannung Vst ein (nahezu) linearer Zusammenhang zwischen der angelegten Spannung und dem Strom durch den MOSFET (und damit auch der vom MOSFET abgegebenen Spannung) besteht. In diesem Proportionalbereich wird der MOSFET betrieben, wenn er in analogen Schaltkreisen eingesetzt werden soll. Dies ist beispielsweise in einem Radio- oder Fernsehempfänger der Fall. Damit steht eine unendliche Zahl von Zwischenabstufungen zwischen Minimal- und Maximalwert (beispielsweise minimaler und maximaler Lautstärke eines Musikstücks) zur Verfügung. Da aber der Strom über den MOSFET (und damit dessen Widerstand) nur bis auf eine endliche, d.h. unscharfe Messgenauigkeit bestimmt werden kann, verwischen sich die Zwischenabstufungen. Damit kann kein absolut exakter Wert der Zwischenabstufung, sondern nur ihr Bereich angegeben werden. In einem digitalen Schaltkreis wird der MOSFET hingegen völlig anders betrieben. Hier liegt die Spannung UGS zwischen Gate und Source entweder unterhalb (oder im Bereich) der Schwellenspannung Vth oder über (oder im Bereich) der Sättigungsspannung Vst. Damit sind zwei stabile und eindeutige Zustände des Transistors definiert: der Sperr- bzw. der Durchlasszustand. Im Sperrzustand ist der MOSFET vollständig gesperrt (weist einen unendlichen Widerstand auf), und es besteht eine maximale Spannung zwischen Source und Drain. Im Durchlasszustand lässt er den maximalen Strom durch (weist den Widerstand Null auf), und die Spannung zwischen Source und Drain ist minimal (nämlich gleich der Schwellenspannung Vth). Der Transistor wird
Sandini Bib 70
Kapitel 2
somit als Schalter mit zwei Stellungen (ein/aus) benutzt. Durch die zwei klar definierten und unterscheidbaren Schaltzustände (und damit durch die abgegebenen Ströme und Spannungen) erhalten wir digitale Schaltkreise mit dualer oder binärer (d.h. zweiwertiger) Logik. Der Vollständigkeit halber sei noch erwähnt, dass bei besonders schnellen Schaltkreisen statt Silizium ein Substrat aus Galliumarsenid (GaAs) verwendet wird. Außerdem verwendet man manchmal auch Bipolartransistoren in z.B. ECL- oder BiCMOS-Schaltungen, um die Arbeitsgeschwindigkeit zu erhöhen, allerdings um den Preis einer mindestens dreifachen Leistungsaufnahme gegenüber einer Implementierung in reiner CMOS-Technologie. Anwendungen sind der Pentium (BiCMOS) oder R6000 (ECL). Die Logikzustände ein/aus des MOS-Transistors werden durch entsprechende Vorspannungen, Widerstandskombinationen etc. auf bestimmte Spannungswerte abgebildet. In Tabelle 2.1 sind die Spannungen für eine logische 1 bzw. logische 0 für die NMOS- und CMOS-Familie sowie drei weitere Bipolarfamilien angegeben. Familie
U0 [V]
U1 [V]
NMOS CMOS TTL ECL IIL
-1...+1 1...2 0...0,5 ca. 3 ca. 1
5...10 4...15 2,5...5 4...5 2...5
NMOS: Logik mit n-Kanal-MOS-Transistoren CMOS: Logik mit komplementären MOS-Transistoren TTL: (bipolare) Transistor-Transistor-Logik ECL: (bipolare) emittergekoppelte Logik IIL: (bipolare) integrierte Injektionslogik
Tab. 2.1: Logikpegel für verschiedene Logikfamilien
Im Laufe der Jahre hat sich die Halbleitertechnologie und damit auch der Aufbau eines MOSFETs zwar verändert, aber er funktioniert prinzipiell nach wie vor so, wie es oben erläutert ist. Weniger Stromverbrauch und kleinere Strukturen sind dabei die beiden maßgeblichen Faktoren der Weiterentwicklungen. So regelmäßig wie eine physikalische Grenze für diese beiden Parameter vorhergesagt wurde, genauso regelmäßig wurden neue Konzepte und Materialien gefunden, um die Grenze wieder weiter hinauszuschieben. Bereits Mitte der sechziger Jahre postulierte der Intel-Gründer Gordon Moore, dass sich alle 18 Monate die Anzahl der Bauelemente in den integrierten Schaltungen verdoppeln lassen wird (Moores Law), was bis heute gültig ist und somit beispielsweise alle drei Jahre eine neue Generation von Speicherchips erscheinen lässt. Die erste CPU von Intel aus dem Jahre 1971 besaß 2300 integrierte MOS-Tansistoren und bot eine Rechenleistung wie der legendäre ENIAC-Rechner von 1946 mit 18.000 Röhren. Ein 4k-BitDRAM-Speicher wurde in den siebziger Jahren mit einer Strukturgröße von 10 µm realisiert, in den Achtzigern 1 MBit-RAMs mit unter 1 µm, während wir uns heute bei 1 GBit-DRAMs mit einer Strukturgröße von um 100 nm bewegen. Entsprechend stieg die Integrationsdichte bei den Mikroprozessoren, was Sie auch anhand der Tabelle 2.2 erkennen können, wobei bei den aktuellen CPUs eine Strukturbreite von 0,13 µm der Standard ist.
Sandini Bib Grundlagen der Mikroprozessortechnik
Prozessor
Anzahl der Transistoren
8086 80286 80386DX 80386SX 486DX 486SX 486DX2 Pentium 486DX4 PentiumPro Pentium MMX Pentium II AMD K6 Celeron Pentium III AMD Athlon (K7) AMD Athlon (Thunderbird) Pentium 4 (Willamette) Pentium 4 (Northwood) 64-Bit-CPUs (Itanium, Hammer)
29.000 130.000 280.000 275.000 1,2 Mio 1,185 Mio 1,2 Mio 3,2 Mio 1,6 Mio 5 Mio 4,5 Mio 7,5 Mio 8,8 Mio 7,5 Mio 9,5 Mio 22 Mio 37 Mio 42 Mio 55 Mio ca. 50-200 Mio
71
Erscheinungsjahr 1980 1982 1985 1987 1989 1991 1992 1993 1994 1995 1996 1997 1997 1998 1999 1999 2001 2001 2002 2001
Tab. 2.2: Die Anzahl der verwendeten Transistoren in den Prozessoren verdeutlicht die rasante technologische Weiterentwicklung der Mikroprozessoren.
2.2 Grundlagen maschinennaher Informationsdarstellung Ein wesentlicher Punkt im vorigen Abschnitt war die Aussage, dass ein Transistor in einer digitalen Schaltung (und hierzu gehören Prozessor, Speicher, Controller etc. Ihres PC) nur in den beiden Zuständen ein/aus betrieben wird. Damit ergibt sich in natürlicher Weise eine binäre (zweiwertige) Darstellung der Information. Jegliche Art von Information muss somit in einer Folge der Zustände ein/aus oder 1/0 ausgedrückt werden. Dies erscheint auf den ersten Blick vielleicht etwas abstrakt. Aber auch im täglichen Leben begegnet uns diese Denkweise ständig. Nur haben wir uns so stark daran gewöhnt, dass uns dies nicht mehr bewusst wird. Beispielsweise wird in diesem Buch die Information über PCHardware durch eine Folge von Buchstaben und Satzzeichen ausgedrückt. Der Unterschied besteht lediglich darin, dass 26 verschiedene Buchstaben (a bis z) und sechs Satzzeichen (.,:;?!) zur Verfügung stehen, wohingegen die Elektronikchips Ihres PC eben nur die beiden Zustände ein/aus oder 1/0 kennen. Dies bedeutet, dass die Buchstaben und Satzzeichen in 1/0-Zustände umgewandelt werden müssen. Diese Umwandlung geschieht mittels eines Codes. Wenn Sie die folgende Zeile betrachten
5 so vermuten Sie wahrscheinlich, dass zwei völlig verschiedene Dinge gemeint sind: einmal die Zahl fünf und das andere Mal ein Kringel. Je nach Blickwinkel ist dies jedoch nicht richtig. Der »Kringel« stellt das arabische Zeichen für die Zahl fünf dar. Damit bedeuten die beiden Zeichen dasselbe, werden aber verschieden dargestellt. Auch bei einem Geheimcode gilt dies. Der Text bedeutet nach der Verschlüsselung dasselbe wie vorher, nur hat sich die Darstellung so verändert, dass er für die meisten Leute völlig unverständlich wird. Natürlich existieren auch im Com-
Sandini Bib 72
Kapitel 2
puterbereich verschiedene Codes. Der am weitesten verbreitete Code ist der ASCII-Code. Er ordnet bestimmten Zeichen eine Nummer oder Zahl (nämlich den Code) zu.
2.2.1
Dezimal- und Binärsystem
Neben Zeichen sollen auch Zahlen dargestellt werden. Verwechseln Sie dabei nicht die Begriffe Ziffer und Zahl. Ziffer bedeutet eines der Zeichen 0 bis 9, wohingegen eine Zahl einen Wert angibt. Die uns geläufigen Dezimalzahlen werden mit Hilfe der (zehn, daher Dezimalzahlen) Ziffern 0 bis 9 dargestellt. Mit anderen Worten können zehn verschiedene Zustände, 0 bis 9, unterschieden werden. Für den Computer stehen aber nur zwei solche Zustände zur Verfügung: 0 und 1. Um die Zahlendarstellung in einem Computer zu verstehen, müssen wir zuerst die Interpretation einer Dezimalzahl analysieren. Unser Zahlensystem wird auch als Stellensystem bezeichnet, da jede Stelle einer Dezimalzahl einem bestimmten Wert entspricht. Allgemein weist die von rechts gesehen erste Stelle den Wert eins, die zweite Stelle von rechts den Wert zehn, die dritte Stelle von rechts den Wert hundert etc. auf. Die Anzahl solcher Werte je Stelle wird durch die betreffende Ziffer angegeben. Beispiel: Die Interpretation der Zahl 318 lautet 3x100+1x10+8x1 oder in Potenzen ausgedrückt 3x102+1x101+8x100
Dieses Schema lässt sich natürlich zu beliebig hohen Zahlen fortsetzen. Die Zehn stellt dabei die Basis des Zahlensystems dar und stimmt mit der Zahl unterscheidbarer Ziffern überein. Im Computer stehen nun aber nicht zehn, sondern nur zwei solche Ziffern als Basis zur Verfügung. Daher muss die Zehn durch die Zwei ersetzt werden. Dies führt zum Binär- oder Dualsystem. Zahlen im Binärsystem werden durch ein nachgestelltes b gekennzeichnet. Beispiel: Die Zahl 100111110b bedeutet 1x28+0x27+0x26+1x25+1x24+1x23+1x22+1x21+1x20 oder ausführlicher geschrieben 1x256+0x128+0x64+1x32+1x16+1x8+1x4+1x2+0x1 = 318
Wir erhalten somit zwei verschiedene Darstellungen des dezimalen Wertes 318: 318 im Dezimalsystem und 100111110b im Binär- oder Dualsystem. Auch das binäre Schema lässt sich wie bei den Dezimalzahlen zu beliebig großen Werten fortsetzen. Man erkennt aber sofort einen großen Nachteil des Binär- gegenüber dem Dezimalsystem: die Zahlen werden erheblich länger, d.h. man benötigt mehr Platz, um sie niederzuschreiben. In der Computertechnologie hat sich eingebürgert, acht solche Stellen oder Bits (von Binary Digit, dt. binäre Ziffer oder Stelle) zu einem Byte zusammenzufassen. Ein halbes Byte oder vier Bits werden als Nibble, zwei Bytes als Wort (oder engl. Word) und vier Bytes als Doppelwort (bzw. Double Word) bezeichnet. Damit lassen sich mit einem Byte insgesamt 28 = 256 verschiedene Zahlen von 0 bis 255 darstellen. Durch die Gruppierung von mehreren Bytes lassen sich auch größere Zahlen darstellen. Beispielsweise liefert die Gruppierung von zwei Bytes zu einem Wort Zahlen im Bereich von 0 bis 65.535 (216-1), die als vorzeichenlose Ganzzahlen (engl. unsigned integer oder kurz unsigned) bezeichnet werden. Mit einem Doppelwort zu vier Bytes lassen sich Zahlen von 0 bis 4.294.967.295 (232-1) ausdrücken. Diese Gruppierung führt zu vorzeichenlosen langen Ganzzahlen (engl. unsigned long integer oder kurz unsigned long).
Sandini Bib Grundlagen der Mikroprozessortechnik
2.2.2
73
ASCII-Code
Im ASCII-Code wird nun jedem dieser 256 verschiedenen Werte eines Bytes ein Zeichen zugeordnet, d.h. es werden 256 ausgewählte Zeichen durchnummeriert. Streng genommen definiert der ASCII-Code nur 128 Zeichen, von denen die ersten 32 so genannte Steuercodes darstellen. Diese dienen dazu, dem Empfänger Mitteilungen über die gesendeten Daten zu machen. Beispielsweise gibt das Steuerzeichen End of Transmission (EOT=04h) das Ende der Datenübertragung an. Im PC-Bereich hat sich der von IBM eingeführte erweiterte ASCII-Code eingebürgert, bei dem auch die Codes 128 bis 255 mit festgelegten Zeichen belegt sind und den ersten 32 Codes (0 bis 31) bestimmte Symbole zugewiesen werden. Es sei bemerkt, dass diese Zuordnung von Nummern und Zeichen völlig willkürlich vorgenommen wurde. Über praktische Erwägungen (man benötigt nun einmal Buchstaben und Zahlen) hinaus gibt es keinen tieferen Sinn, weshalb beispielsweise dem Code 65 der Großbuchstabe A zugeordnet wird. Beispiel: ASCII-Code 65: erweiterter ASCII-Code 203: ASCII-Code 10 (LF):
Großbuchstabe A Grafikzeichen Steuercode für Zeilenvorschub
Der ASCII-Code eignet sich also ausgezeichnet zur Darstellung von Texten (tatsächlich werden Textdateien zuweilen auch als ASCII-Dateien bezeichnet). Bildet man eine Kette aus mehreren aufeinander folgenden ASCII-Codes oder, anders ausgedrückt, eine Kette aufeinander folgender Zeichen, so erhält man eine Zeichenkette oder einen String. Da Zeichenketten (die beispielsweise einem Satz entsprechen) unterschiedlich lang sein können, muss üblicherweise noch die Länge der Zeichenkette angegeben werden.
2.2.3
Negative Ganzzahlen und Zweierkomplement
In der Arithmetik sind neben den positiven auch die negativen ganzen Zahlen von großer Bedeutung. Man könnte versucht sein, negative ganze Zahlen einfach durch ein vorangestelltes Bit einzuführen, das angibt, ob das Vorzeichen positiv (Vorzeichenbit = 1) oder negativ (Vorzeichenbit = 0) ist. In der Computertechnik hat sich aus praktischen Gründen jedoch die Zweierkomplementdarstellung durchgesetzt. Eine negative ganze Zahl wird dargestellt, indem bei der entsprechenden positiven ganzen Zahl alle Nullen durch Einsen und alle Einsen durch Nullen ersetzt werden (das Komplement gebildet wird) und zu dem so gewonnenen Ergebnis eins addiert wird. Beispiel: positive ganze Zahl 256: negative ganze Zahl -256 komplementieren: eins addieren: Ergebnis:
0000 0001 0000 0000b +
1111 1110 1111 1111b 1b 1111 1111 0000 0000b
Zu beachten ist, dass vorzeichenbehaftete Ganzzahlen (engl. signed integer oder kurz integer) Werte von -32.768 (-215) bis 32.767 (215-1) annehmen können. Ist das höchstwertige (das am weitesten links stehende) Bit gleich 1, so ist die dargestellte vorzeichenbehaftete Zahl negativ. Die Interpretation solcher vorzeichenbehafteter Ganzzahlen ist dabei von der Interpretation vorzeichenloser Ganzzahlen sehr verschieden.
Sandini Bib 74
Kapitel 2
Beispiel: Binärzahl: 1111 1111 1111 1111b Interpretation als vorzeichenlose Ganzzahl: 1*215+1*214+...+1*21+1*20 = 65.535
Interpretation als vorzeichenbehaftete Ganzzahl: höchstwertiges Bit ist 1, daher ist die Zahl negativ; somit muss die Prozedur des obigen Beispiels umgekehrt werden: binär: eins subtrahieren: komplementieren: Ergebnis:
1111 1111 1111 1111b 1111 1111 1111 1110b 0000 0000 0000 0001b -1
Zwar ist bei der Zweierkomplementdarstellung vorzeichenbehafteter Ganzzahlen eine Art Vorzeichenbit (das höchstwertige Bit) vorhanden. Der Rest der Zahl darf aber nicht als Betrag der Zahl interpretiert werden (dies würde im oben angeführten Beispiel zum Wert -32.766 führen). Die Zweierkomplementdarstellung wird in gleicher Weise auch bei vorzeichenbehafteten langen Ganzzahlen angewandt. Diese weisen damit einen Wertebereich von -2.147.483.648 (-231) bis +2.147.483.647 (231-1) auf. Der Grund für die Verwendung der Zweierkomplementdarstellung für negative Zahlen ist, dass die Subtraktion einer Zahl (dem Subtrahenden) von einer anderen Zahl (dem Minuenden) auf die Addition des Zweierkomplements des Subtrahenden und des Minuenden zurückgeführt werden kann. Ein eventuell auftretender Übertrag wird ignoriert. Streng mathematisch gesehen ist dies in ähnlicher Form auch bei der normalen Addition der Fall: die Subtraktion einer Zahl wird auf die Addition ihres Inversen (ausgedrückt als -Zahl) zurückgeführt. Damit lautet die Subtraktionsregel für Binärzahlen: Minuend – Subtrahend = Minuend + Zweierkomplement (Subtrahend) Beispiel: Differenz 15 - 1 berechnen: 15d 1d 2er-Komplement(1d) damit ist 15 - 1
= = = =
0000 0000 1111 0000 +1111 1 0000
0000 0000 1111 0000 1111 0000
0000 0000 1111 0000 1111 0000
1111b 0001b 1111b 1111b 1111b 1110b
Die führende 1 (Übertrag) wird ignoriert; damit lautet das Ergebnis 0000 0000 0000 1110b oder 14 dezimal.
2.2.4
Hexadezimalzahlen
Die Darstellung von Zahlen durch eine Folge von Nullen und Einsen erscheint nicht nur Ihnen sehr umständlich. Bei längeren Folgen verliert man schnell den Überblick. Es hat sich daher eingebürgert, jeweils vier Bits (ein Nibble) zusammenzufassen und daher ein Zahlensystem zur Basis 16 einzuführen. Mit vier Bits lassen sich nämlich 16 Zahlen (0 bis 15) darstellen. Das Nibble bildet somit die Grundlage des Hexadezimalsystems oder Sedezimalsystems. Alle Informationsmengen (Byte, Wort, Doppelwort) sind ein Vielfaches eines Nibbles. Da unser geläufiges Dezimalsystem nur die Ziffern 0 bis 9 kennt, müssen für die Hexadezimalziffern 10 bis 15 neue Symbole hinzugefügt werden. Hierzu verwendet man die (Groß- oder Klein-)Buchstaben a (10) bis f (15). Um eine Hexadezimalzahl zu kennzeichnen, wird ihr entweder ein h oder H (für hexadezimal) nach- (z.B. 2Fh) oder ein
Sandini Bib Grundlagen der Mikroprozessortechnik
75
0x vorangestellt (z.B. 0x2F in C). Die Umwandlung in das Dezimalsystem geschieht wie die Umwandlung von Binärzahlen, nur dass als Basis jetzt 16 statt 2 auftaucht. Beispiel: vorzeichenlose dezimale Ganzzahl: 65.535 Binärzahl: 1111 1111 1111 1111b Hexadezimalzahl: ffffh
Beispiel: Hexadezimalzahl: Binärzahl: Dezimalzahl: vorzeichenlose Ganzzahl vorzeichenbehaftete Ganzzahl
9BE7h 1001 1011 1110 0111b 9*163+11*162+14*161+7*160 = 39.911 oder = -25.625
Somit ist eine wesentlich kompaktere Schreibweise möglich, ohne den Bezug zur Computerhardware zu verlieren (die ja nur in Nullen und Einsen »denkt«), da sich jede Stelle einer Hexadezimalzahl durch ein Nibble (vier Bits, ein halbes Byte) ausdrücken lässt. Daher kann eine Hexadezimalzahl einfach und schnell in eine Binärzahl (und damit beispielsweise in den Inhalt eines Registers) umgewandelt werden. Zu beachten ist dabei, dass eine Hexadezimalzahl wie ihr binäres Pendant vorzeichenlos ist. Es existiert kein Minuszeichen; erst die Interpretation einer Binär- oder Hexadezimalzahl entscheidet, ob sie positiv oder negativ ist.
2.2.5
BCD-Zahlen
Eine weitere Darstellung von Zahlen mit großer Bedeutung sind die so genannten binärcodierten Dezimalzahlen oder kurz BCD(-Zahlen). Bei diesen stellt der Wert eines Bytes den Wert der entsprechenden Dezimalstelle dar. Beispiel: Dezimalzahl: 28 BCD: 0000 0010
0000 1000
Das erste Byte 0000 0010 gibt hierbei die Ziffer 2, das zweite Byte 0000 1000 die Ziffer 8 an.
Der große Vorteil binärcodierter Dezimalzahlen besteht darin, dass keine Umwandlung von Dezimal- in Binärzahlen erfolgen muss, da jede Ziffer durch ein eigenes Byte dargestellt wird. Man beachte, dass die Bytes den binären Wert der Ziffer und nicht deren ASCII-Code angeben. Der große Nachteil springt natürlich sofort ins Auge: Mit einem Byte lassen sich 256 verschiedene Zahlen (oder Ziffern) darstellen, BCD-Zahlen verwenden jedoch nur zehn davon. Um diese Verschwendung zu verringern, werden häufig gepackte BCD-Zahlen verwendet. Bei diesen gibt jedes Nibble (zu je vier Bits) eines Bytes eine Ziffer an. Beispiel: Dezimalzahl: 28 (vergleiche das vorangegangene Beispiel) gepackte BCD: 0010 1000 Das erste Nibble 0010 des Bytes gibt hierbei die Ziffer 2, das zweite Nibble 1000 die Ziffer 8 an.
Man beachte auch hier, dass die Nibbles den binären Wert der jeweiligen Ziffer angeben. Mit einem Byte lassen sich hier 100 Zahlen (von 0 bis 99) darstellen. Dabei ist natürlich selbstverständlich, dass die Interpretation eines Bytes als (gepackte) binärcodierte Dezimalzahl einen völlig anderen Wert liefert als die Interpretation als Binärzahl (im Beispiel ergäbe sich 24).
Sandini Bib 76
Kapitel 2
In einem kurzen Vorgriff sei angemerkt, dass natürlich noch andere Interpretationen von Bytes, Worten und anderen Informationseinheiten existieren. Von besonderer Bedeutung sind die Befehlscodes an den Prozessor. Ein Befehlscode setzt sich aus einem oder mehreren Bytes zusammen, die den Prozessor anweisen, einen bestimmten Vorgang auszuführen (Daten übertragen, vergleichen, addieren etc.). Sie erkennen, dass ein paar »nackte« Bytes in Abhängigkeit von ihrer Interpretation sehr unterschiedliche Bedeutungen und Auswirkungen haben können.
2.2.6
Little-Endian- und Big-Endian-Notation
Die Intel-Prozessoren verwenden das so genannte Little-Endian-Format. Das bedeutet, dass ein Wort oder Doppelwort stets mit dem niederwertigen Byte beginnt und mit dem höchstwertigen endet. Mit anderen Worten wird das höherwertige Byte einer Mehr-Byte-Größe an einer höheren Adresse gespeichert als das niederwertigere Byte. Wenn wir ein Wort oder Doppelwort niederschreiben, so setzen wir das höchstwertige Byte an die am weitesten links stehende Position und das niederwertigste Byte an die am weitesten rechts liegende Stelle. Niedergeschriebene Speicheradressen steigen aber von links nach rechts an. Daher scheinen die Intel-Prozessoren und die hierzu kompatiblen CPUs die einzelnen Bytes im Vergleich zu ihrer »natürlichen Reihenfolge« in Worten oder Doppelworten zu vertauschen. Weil der Prozessor Daten in derselben Weise im Hauptspeicher oder auf der Festplatte abspeichert, erscheinen sie auch hier vertauscht zu sein (wie Sie leicht mit einem Hex-Editor bestätigen können). Das hat aber nur Auswirkungen, wenn das Wort oder Doppelwort eine Zahl darstellt und Sie diese Zahl in die einzelnen Ziffern aufspalten möchten, da nur hier die Reihenfolge wesentlich ist (erinnern Sie sich daran, dass alle benutzten Zahlensysteme so genannte Stellensysteme sind). Beispiel: hexadezimales Wort 1234h (dezimal 4660) wird im Speicher und auf Diskette/Festplatte abgelegt als 3412h; hexadezimales Doppelwort 12345678h (dezimal 405.419.896) wird abgelegt als 78563412h.
Im Gegensatz dazu beginnt ein Wort oder Doppelwort im Big-Endian-Format stets mit dem HighByte und endet mit dem niederwertigsten Byte. Mit anderen Worten wird das High-Byte einer Mehr-Byte-Größe an einer niedrigeren Adresse gespeichert als das niederwertigere Byte. Die 68000er-Familie von Motorola verwendet beispielsweise das Big-Endian-Format, und dies ist auch der Grund dafür, warum die Daten im BIOS für eine PCI-Karte für einen PC und für einen Apple-Computer unterschiedlich abgelegt werden müssen, obwohl PCI als systemübergreifendes Bussystem ausgelegt ist, einmal abgesehen davon, dass eine Intel-CPU nicht den Befehlssatz von Motorola und umgekehrt verstehen kann.
2.3 Logikgatter Mikroprozessoren und vor allem Speicherchips sind heute die am höchsten integrierten Schaltkreise. Man benötigt für sie möglichst kleine elektronische Bauelemente. Das Wichtigste davon haben wir schon kennen gelernt: den MOS-Feldeffekttransistor. Aber ein solches Element reicht für die komplexen Logikoperationen natürlich noch nicht aus. Vielmehr wird eine sehr große Menge solcher MOSFETs zusammengeschaltet, um die gewünschten Logikschaltungen aufzubauen, so z.B. UND-Gatter oder Volladdierer.
Sandini Bib Grundlagen der Mikroprozessortechnik
2.3.1
77
Grundlegende Logikelemente
Gegenstand dieses Abschnitts sind die zwei grundlegenden Elemente von elektronischen Logikschaltungen: das UND- und das ODER-Gatter. Sie implementieren die abstrakte UND- bzw. ODER-Verknüpfung zweier Eingangsgrößen E1 und E2 durch eine elektronische Schaltung mit zwei Signalen und erzeugen eine Ausgangsgröße A, die ebenfalls als Signal (oder genauer gesagt: als dessen Pegel) ausgedrückt wird. Tabelle 2.3 zeigt zunächst die Wahrheitstafeln für die UND- und für die ODER-Verknüpfung. E1
E2
0 0 1 1
0 1 0 1
UND-Wert A
ODER-Wert A
0 0 0 1
0 1 1 1
Tab. 2.3: Wahrheitstafel für UND- und ODER-Verknüpfung
Die ODER-Operation ist also das Abbild des logischen ODER und nicht unseres umgangssprachlichen Entweder-Oder (das wird von der XODER-Operation implementiert). Aus den UND- und ODER-Operationen und unter Hinzunahme des Inverters lassen sich sämtliche Logikoperationen aufbauen. UND und ODER übernehmen dadurch dieselbe Rolle wie 0 und 1 bei den natürlichen Zahlen. In der folgenden Beschreibung nehme ich an, dass eine logische 1 durch ein Signal mit hohem Pegel und eine logische 0 durch ein Signal mit niedrigem Pegel dargestellt wird. Für die UNDOperation muss man also eine Schaltung konstruieren, die nur für zwei hohe Signalpegel an beiden Eingängen E1 und E2 einen hohen Signalpegel am Ausgang A liefert, für die ODER-Operation dagegen eine, die bereits bei einem hohen Signalpegel an einem Eingang E1 oder E2 einen hohen Signalpegel am Ausgang A bereitstellt. In Abbildung 2.2 sehen Sie eine einfache Implementierung dieser Forderung mit MOSFETs. Die beiden n-Kanal-MOSFETs Tr1 und Tr2 in Abbildung 2.2 (links) schalten nur dann die Versorgungsspannung Vcc zum Ausgang A durch, wenn beide Eingangssignale E1 und E2 auf einem hohen Pegel liegen, also eine logische 1 angeben. Ist auch nur eines der Signale E1 und E2 gleich 0, dann sperrt der Transistor Tr1 oder Tr2, und der Ausgang A gibt ein Signal mit niedrigem Pegel ab, das eine logische 0 darstellt. Die Schaltung von Abbildung 2.2 (links) implementiert also eine UND-Operation für die Eingangssignale E1 und E2. E1 E2
E1
UND
A
E1 Tr1
ODER
Tr2
E2
A
Tr1 A
A Vcc
Vcc E2
E1 E2
Tr2
Abb. 2.2: Implementierung von UND und ODER mit MOSFETs
In Abbildung 2.2 (rechts) realisieren die beiden n-Kanal-MOSFETs Tr1 und Tr2 ein ODER-Gatter, weil es genügt, dass einer der zwei MOSFETs durchgeschaltet wird, um dem Ausgang A ein Signal mit hohem Pegel zuzuführen. Es reicht also aus, dass E1 oder E2 auf einem hohen Pegel liegt.
Sandini Bib 78
Kapitel 2
Die dargestellten Logikgatter sind 2-Eingangs-UND- bzw. 2-Eingangs-ODER-Gatter. Die Schaltungen lassen sich aber ohne Problem auf n-Eingangs-UND- sowie n-Eingangs-ODER-Gatter erweitern, indem man einfach n MOSFETs zwischen Vcc und dem Ausgang A in Reihe (UND) oder parallel (ODER) schaltet. Eingang
Ausgang
E1
E2
AND
NAND
OR
NOR
EXOR
EXNOR
0 0 1 1
0 1 0 1
0 0 0 1
1 1 1 0
0 1 1 1
1 0 0 0
0 1 1 0
1 0 0 1
Tab. 2.4: Wahrheitstafel für die logischen Verknüpfungen
Wie erwähnt lassen sich durch das UND, das ODER und den Inverter (siehe folgendes Kapitel) sämtliche Logikoperationen realisieren, wie es einmal zusammengefasst in der Tabelle 2.4 dargestellt ist. Abbildung 2.3 zeigt die hierfür üblichen Logiksymbole, wobei nach wie vor sowohl die Normsymbole, wie sie für Europa gültig sind, als auch die Symbole laut amerikanischem Standard zur Anwendung kommen.
Abb. 2.3: Die üblichen Symboldarstellungen
Sandini Bib Grundlagen der Mikroprozessortechnik
2.3.2
79
CMOS-Inverter als Low-Power-Elemente
Der bereits mehrfach erwähnte MOSFET hat zwar im Vergleich zu einem Bipolartransistor (dessen Leitfähigkeit nicht durch eine Gate-Spannung, sondern einen Basisstrom gesteuert wird) eine sehr geringe Leistungsaufnahme. Durch die Integration von mittlerweile mehreren Millionen Transistoren auf einem Chip ist die Leistungsaufnahme dennoch ganz beachtlich. Ganz besonders gilt das für schnell getaktete Prozessoren, weil dort die MOSFETs schnell und häufig umgeschaltet werden. Es besteht also ein Bedarf, den Stromverbrauch weiter zu reduzieren. Dazu dient die so genannte CMOS-Technik mit dem CMOS-Inverter als grundlegendem Bauelement. Ein CMOS-Inverter wird einfach durch Parallelschalten von einem p-Kanal- und einem n-Kanal-MOSFET gebildet, so wie es in Abbildung 2.4 gezeigt ist. Schaltbild
Kennlinie Vcc
UA
p-Kanal MOSFET
E
A
Vcc
Vcc/2
n-Kanal MOSFET Vcc-Vth
Vth
Vcc/2
Vcc UE
Abb. 2.4: Der CMOS-Inverter besteht aus zwei zwischen Masse und Vcc geschalteten MOSFETs mit entgegengesetzter Leitfähigkeit. Dadurch erhält man eine Kennlinie mit scharfem Übergang.
Die beiden MOSFETs sind zwischen Masse und Versorgungsspannung Vcc in Reihe geschaltet. Das Gate des p- oder n-Kanal-MOSFET ist durch eine dünne Oxidschicht vom Substrat und damit von Source und Drain getrennt, so dass über das Gate kein Strom fließen kann. Für einen Stromfluss wäre es erforderlich, dass beide Transistoren gleichzeitig leitend sind, um einen Strompfad zwischen Masse und der Versorgungsspannung zu schaffen. Wenn Sie die beiden Kennlinien der Abbildung 2.1 betrachten, so erkennen Sie, dass es keine Überschneidung der Leitfähigkeit von p- und n-Kanal-MOSFETs gibt. Mit anderen Worten: Es ist stets einer der beiden MOSFETs gesperrt. Ist die Spannung UE am Eingang E ausreichend positiv (d.h. größer als die Schwellenspannung Vthn des n-Kanal-MOSFET Trn), dann leitet der n-KanalMOSFET Trn, der p-Kanal-MOSFET Trp aber sperrt. Bei ausreichend negativer Spannung UE (kleiner als die Schwellenspannung Vthp des p-Kanal-MOSFET Trp) leitet stattdessen der p-Kanal-MOSFET Trp und der n-Kanal-MOSFET Trn sperrt. Zwischen Vthn und Vthp sperren beide Transistoren. Entscheidend für die Verwendung in der (digitalen) Computertechnik ist, dass sich die Spannung UA am Ausgang A mit einer Schwankung der Eingangsspannung UE im Bereich zwischen der Versorgungsspannung Vcc und der Masse ändert. MOSFETs werden ja nicht durch einen Gate-Strom, sondern durch die Gate-Spannung gesteuert. Man kann die am Ausgang A abgegebene Spannung UA dann dazu benutzen, MOSFETs in nachfolgenden Stufen der Logikschaltung zu steuern und dadurch Signale (oder Daten) zu verarbeiten:
: :
Ist UE ausreichend negativ, dann leitet Trp und Trn sperrt; der Ausgang A liegt auf Vcc, und der CMOS-Inverter gibt eine logische 1 aus (oder logische 0 bei negativer Logik). Ist UE genügend positiv, so leitet stattdessen Trn und Trp sperrt; der Ausgang A liegt auf Masse, und der CMOS-Inverter gibt eine logische 0 aus (oder logische 1 bei negativer Logik).
Sandini Bib 80
Kapitel 2
Für den Einsatz in Computern mit zwei klar definierten Zuständen ist es sehr günstig, dass der Übergangsbereich zwischen Vcc und Masse der Kennlinie außerordentlich scharf ist (siehe Abbildung 2.4). Computer mit CMOS-Bausteinen arbeiten deshalb sehr zuverlässig. Ein großer Vorteil von CMOS-Bausteinen gegenüber normalen MOS-Chips ist der geringere Stromverbrauch. Nur beim Umschalten zwischen Vcc und Masse fließt ein Strom, um die jeweiligen Schichten des CMOS-Transistors entsprechend ihrer Kapazität aufzuladen oder zu entladen. Die sehr geringe statische Leistungsaufnahme ergibt sich hauptsächlich aus den Leckströmen durch die (niemals vollständig) isolierende Oxidschicht unter dem Gate hindurch. Klappt die Spannung UA am Ausgang A durch einen schnellen Wechsel der Eingangsspannung UE um, so führt das Umklappen aufgrund der Umladung der Halbleiterschichten zu einer zusätzlichen dynamischen Leistungsaufnahme. Da mit jedem Umklappen die Halbleiterschichten einmal aufgeladen bzw. entladen werden, ist die dynamische Leistungsaufnahme proportional zur Umklappfrequenz (P~v). Schnell getaktete CMOS-Bausteine verbrauchen also mehr Strom als niedriger getaktete. Die simpelste Form eines Stromsparverfahrens ist es daher, dass man im Power-down-Mode einfach die Taktfrequenz auf Null absenkt, wie es etwa bei Notebooks praktiziert wird. Dadurch bleibt nur noch die sehr geringe statische Leistungsaufnahme übrig. Die Stromeinsparung kann bis zu 99,99% (kein Druckfehler!) betragen. Die CPU muss hierfür über keinen speziellen Stromsparmodus verfügen, obwohl alle aktuellen CPUs einen solchen Modus besitzen, und andere Komponenten im PC (z.B. Display, Festplatten) können mit Hilfe des BIOS (ACPI) ebenfalls in einen Stromsparmodus umgeschaltet werden. Ein großes Problem bei der Realisierung immer größerer Packungsdichten und damit beispielsweise größerer Kapazität von Speicherchips ist neben der Miniaturisierung der Bauelemente der Anstieg der Leistungsaufnahme. Die Größe und in der Folge die Leistungsaufnahme der einzelnen Elemente auf dem Chip nimmt zwar ab; da die Zahl der Elemente aber gewaltig angestiegen ist, ergibt sich im Endeffekt eine größere Leistungsaufnahme. Beispielsweise braucht ein 80386 etwa 3 W, der Standard-Pentium trotz modernerer Technologie 13 W und ein Athlon XP (2800+) sogar über 70 W. Die aufgenommene Leistung wird zu 100% in Wärme umgesetzt und heizt den Chip auf. Wahre Arbeitstiere und somit auch Stromfresser. Kann die in einem Chip entstehende Wärme nicht mehr abgeführt werden, so »verschluckt« sich der Prozessor zunächst durch Rechenfehler aufgrund überhitzter Transistoren: Der Computer stürzt ab und ist erst nach Abkühlung wieder betriebsbereit. Ein weiterer Temperaturanstieg kann schließlich zur Zerstörung der Halbleiterschichten und damit des gesamten Chips führen. Natürlich hat auch die CMOS-Technik Nachteile: Ein CMOS-Inverter weist stets zwei MOSFETs auf, ein MOS-Transistor aber nur einen (nämlich sich selbst). Die Integrationsdichte von CMOSInvertern gegenüber MOS-Transistoren ist also geringer. Durch eine geschickte Anordnung der verschiedenen Schichten auf dem Substrat erreicht man aber fast gleich hohe Zahlen, nur ist der technologische Aufwand größer. Außerdem schalten CMOS-Elemente nicht so schnell wie Bipolartransistoren. Ab dem Pentium wird daher aus Geschwindigkeitsgründen wieder von der reinen CMOS-Implementierung abgewichen. Damit diese Prozessoren die hohen Taktraten verkraften, werden sie teilweise (Pentium: BiCMOS) oder ganz (R6000: ECL) mit Bipolartransistoren realisiert. Das steigert zwar die Rechenleistung, macht aber die Kühlung wieder zu einem zentralen Problem.
Sandini Bib Grundlagen der Mikroprozessortechnik
2.3.3
81
Ein Beispiel: 1-Bit-Addierer
Im Folgenden möchte ich Ihnen eine Anwendung der UND-, ODER- und XODER-Gatter vorstellen, nämlich einen 1-Bit-Addierer mit Übertrag. Er dient zur Addition zweier Binärzahlen. Abbildung 2.5 zeigt als Beispiel die Verknüpfung von UND-, ODER- und XODER-Gattern, um die Summe und den Übertrag zu ermitteln, die sich aus zwei Summanden Ax und Bx sowie einem Eingangsübertrag Übx ergeben. Ax Ax Bx
XODER XODER
Übx
UND
Bx
UND
Übx
UND
ODER
Übertrag
Cx
Abb. 2.5: 1-Bit-Addierer mit Übertrag
Zur Summenbildung werden zunächst die beiden Summandenbits Ax und Bx einem XODERGatter zugeführt. Das Ausgangssignal dieses ersten XODER-Gatters und das Übertragbit Übx von einer vorherigen Stufe werden dann an ein zweites XODER-Gatter angelegt. Das resultierende Ausgangssignal gibt dann das entsprechende Summenbit Cx an. Das Übertragbit kann z.B. durch drei UND-Gatter, die ermitteln, ob von den zugeführten Bits Ax, Bx und Übx mindestens zwei gleich 1 sind, und die Kombinierung in einem ODER-Gatter bestimmt werden. Wenn Sie die Schaltung nach ihrem Logikverhalten auswerten, erhalten Sie die Verknüpfung von Tabelle 2.5 der Addiererwahrheitstafel. Ax
Bx
1. Summand 0 0 0 0 1 1 1 1
2. Summand 0 0 1 1 0 0 1 1
Übx
Cx
Übertrag
Eingangsübertrag 0 1 0 1 0 1 0 1
Summe 0 1 1 0 1 0 0 1
0 0 0 1 0 1 1 1
Tab. 2.5: Verknüpfung von Summanden- und Übertragbit im 1-Bit-Addierer
Um einen 32-Bit-Volladdierer mit Parallelübertrag zu konstruieren, müssen Sie »lediglich« 32 dieser 1-Bit-Addierer in Reihe schalten und jeweils den Übertragausgang des vorherigen mit dem Übertrageingang des nachfolgenden Addierers verbinden.
2.4 Die CPU als zentraler Bestandteil aller Computer Die CPU stellt den wesentlichsten Teil eines PC dar. In ihr werden alle logischen und arithmetischen Operationen ausgeführt. Generell liest der Prozessor Daten aus dem Speicher, bearbeitet sie in der von einem Befehl vorgeschriebenen Weise und speichert das Ergebnis wieder ab. Im Folgenden möchte ich kurz den allgemeinen Aufbau eines Mikroprozessors beschreiben.
Sandini Bib 82
Kapitel 2
Um die oben erwähnten logischen und arithmetischen Operationen (Prozesse) auszuführen, besitzt ein Mikroprozessor (siehe Abbildung 2.7) eine Busschnittstelle (BU = Bus Unit), eine Befehlseinheit (IU = Instruction Unit), eine Ausführungseinheit (EU = Execution Unit) sowie eine Adressierungseinheit (AU = Addressing Unit).
Abb. 2.6: Mit dem Prozessor 8088 begann der Siegeszug des PC. In die untere leere Fassung lässt sich zusätzlich noch ein mathematischer Coprozessor (8087) einsetzen.
Neben anderen Bestandteilen weist die Busschnittstelle eine so genannte Prefetch-Queue auf. Die Ausführungseinheit ist für die Datenverarbeitung (addieren, vergleichen etc.) zuständig und umfasst zu diesem Zweck eine Steuereinheit (CU = Control Unit), eine arithmetische und logische Einheit (ALU) und verschiedene Register. Die Adressierungseinheit besitzt häufig noch eine Speicherverwaltungseinheit (MMU = Memory Management Unit). Sie umfasst z.B. beim 80386 eine Segmentierungs- (SU) und eine Paging-Einheit (PU = Paging Unit). Die Busschnittstelle bildet die Verbindung zur Außenwelt, d.h. zum Daten-, Adress- und Steuerbus. Sie liest Befehle aus dem Speicher in die Prefetch-Queue, die diese an die Befehlseinheit weitergibt. Die IU wiederum steuert die Ausführungseinheit an, damit die eingelesenen Befehle von der ALU auch tatsächlich ausgeführt werden. Hier überwacht die Steuereinheit CU die Register sowie die ALU, um einen reibungslosen Ablauf zu gewährleisten. Mikroprozessor
Adressierungseinheit Addressing Unit (AU)
Ausführungseinheit Execution Unit (EU)
Bus
Busschnittstelle Bus Unit (BU)
Speicher
Adresse Daten
Prefetch-Queue
ALU Register
Steuereinheit Control Unit (CU)
Befehlseinheit Instruction Unit (IU)
Abb. 2.7: Ein Mikroprozessor weist eine Busschnittstelle zum Einlesen und Ausgeben von Daten und Befehlen mit einer Prefetch-Queue, eine Befehlseinheit zur Ansteuerung der Ausführungseinheit mit den Registern und eine Adressierungseinheit für die Erzeugung von Speicher- und I/O-Adressen auf.
Der Mikroprozessor kann über den Datenbus die Daten aus dem Speicher lesen oder in den Speicher schreiben. Die auszulesende oder zu beschreibende Speicherstelle wird dabei über eine Adresse angesprochen, die der Prozessor in der Adressierungseinheit berechnet und über den Adressbus an die Speicherbausteine übermittelt. Das Lesen und Schreiben erfolgt dabei über die
Sandini Bib Grundlagen der Mikroprozessortechnik
83
Busschnittstelle. Hierzu gibt die BU die Adresse und die zu schreibenden Daten aus bzw. liest die zu lesenden Daten ein. In gleicher Weise wird der Speicher adressiert, um einen Befehl zu lesen. Nur wandern die gelesenen Daten (die Befehle) in die Prefetch-Queue und nicht in eines oder mehrere der Register der Ausführungseinheit. Die Befehlseinheit liest den Befehl aus der Prefetch-Queue, dekodiert ihn und reicht den dekodierten Befehl an die Ausführungseinheit weiter. Ein wesentlicher Punkt hierbei ist, dass sich Befehle und Daten im selben Speicher befinden. Dies bedeutet, dass es keine strikte Trennung zwischen Befehls- und Datenspeicher gibt: Jeder Speicherbaustein kann sowohl als Daten- als auch als Befehlsspeicher dienen. Dies ist nicht selbstverständlich. Die Z4 von Konrad Zuse (der erste frei programmierbare elektromechanische Computer für numerische Anwendungen) besaß einen Programm- und einen Datenspeicher, die streng voneinander getrennt waren). Im Befehlsspeicher können nur Befehle, im Datenspeicher nur Daten abgelegt werden, was unter dem Stichwort Harvard-Architektur bekannt ist. Nach diesem Prinzip arbeiten zahlreiche Mikrocontroller und digitale Signalprozessoren (DSP), während der Mathematiker John von Neumann das Konzept von gemischtem Daten- und Programmspeicher entwickelte, wie es bei den PCs zur Anwendung kommt. In Tabelle 2.6 erhalten Sie vorab schon einmal einen Überblick über die wichtigsten Daten der einzelnen PC-Prozessoren. Die Tabelle gibt den Prozessortyp, die interne Registerbreite, die Breite von Adress- und Datenbus, den maximal möglichen Adressraum und die typischen Taktfrequenzen an. Prozessor
Registerbreite
Adressbusbreite
Datenbusbreite
Adressraum
Taktfrequenzen
8088 8086 80188 80186 80286 386SX 386DX 486 486DX2 486DX4 486SX/487SX Pentium, 1. Generation Pentium, 2. Generation Pentium, 3. Generation Pentium Pro Pentium II Pentium III Athlon Pentium 4
16 Bits 16 Bits 16 Bits 16 Bits 16 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits
20 Bits 20 Bits 20 Bits 20 Bits 24 Bits 24 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 36 Bits 36 Bits 36 Bits 43 Bits 36 Bits
8 Bits 16 Bits 8 Bits 16 Bits 16 Bits 16 Bits 32 Bits 32 Bits 32 Bits 32 Bits 32 Bits 64 Bits 64 Bits 64 Bits 64 Bits 64 Bits 64 Bits 64 Bits 64 Bits
1 MByte 1 MByte 1 MByte 1 MByte 16 MByte 16 MByte 4 GByte 4 GByte 4 GByte 4 GByte 4 GByte 4 GByte 4 GByte 4 GByte 64 GByte 64 GByte 64 GByte 8 TByte 64 GByte
4,7...8 MHz 4,7...10 MHz 5...16 MHz 5...16 MHz 12...25 MHz 12...20 MHz 16...40 MHz 25...50 MHz 50...80 MHz 50...133 MHz 16...33 MHz 60...66 MHz 75...200 MHz 166...233 MHz 150...200 MHz 233...400 MHz 500...1400 MHz 500...2000 MHz 1400...3000 MHz
Tab. 2.6: Kennzeichen der verschiedenen Prozessoren für PC
Ab dem PentiumPro beträgt die Adressbusbreite bei Intel-CPUs 36 Bits, womit sich prinzipiell 64 GByte adressieren lassen, was sich in der Praxis als Theorie herausstellt, genauso wie die 8 TByte, die ein Athlon von AMD zu adressieren vermag. Die physikalisch adressierbare Speichergröße wird durch den Chipset (Memory-Controller, Northbridge) begrenzt. Einige Ableger der in der Tabelle genannten CPUs realisieren außerdem auch nur einen 32-Bit-Adressbus, was somit zu maximal 4 GByte führt, was prinzipiell bereits ab dem 386DX möglich ist. Aber selbst diese Speichergröße lässt sich bei üblichen PCs (noch) nicht bestücken.
Sandini Bib
Sandini Bib
3 Alles begann mit dem Urvater 8086 Der 8086 wurde als Nachfolger des erfolgreichen 8-Bit-Prozessors 8080 vorgestellt und war mit seiner 16-Bit-Architektur 1978 dieselbe Sensation wie fast zehn Jahre später der i386. Der Befehlssatz für den 8086 umfasste bereits 123 Befehle. Hierunter befinden sich auch sehr leistungsfähige Anweisungen wie die Übertragung einer ganzen Zeichenkette mit Hilfe des Source- und Destination-Index, der Aufruf einer Unterfunktion mit CALL oder der explizite Aufruf eines SoftwareInterrupts mit INT. Zwei Besonderheiten des 8086 sind der gemultiplexte Daten/Adressbus und die beiden Betriebsmodi Maximum und Minimum. Intel hat beides mit dem 80286 aufgegeben, weil sie Relikte aus den Zeiten einfacher 8-Bit-Prozessoren darstellen.
3.1 Anschlüsse und Signale des 8086 Im Folgenden möchte ich Ihnen die Anschlüsse des 8086 und die Bedeutung der entsprechenden Signale erläutern. Zuerst sollen die Pins behandelt werden, die sowohl im Maximum- als auch im Minimummodus dieselbe Bedeutung besitzen. Abbildung 3.1 zeigt das Anschlussschema des 8086. Er wird in einem DIP-Gehäuse mit 40 Anschlüssen ausgeliefert. Maximummodus GND
40
1
Vcc
AD14
AD15
AD13
A16/S3
AD12
A17/S4
AD11
A18/S5
AD10
A19/S6
AD9
BHE/S7
AD8
MN/MX
AD7
Minimummodus
RD
8086 CPU
RQ/GT0
(HOLD)
RQ/GT1
(HLDA)
AD4
LOCK
(WR)
AD3
S2
(IO/M)
AD2
S1
(DT/R)
AD1
S0
(DEN)
AD0
QS0
(ALE)
NMI
QS1
(INTA)
AD6 AD5
TEST
INTR
READY
CLK GND
20
21
RESET
Abb. 3.1: Der 8086 ist in einem Standard-DIP-Gehäuse mit 40 Pins untergebracht. Manche Anschlüsse geben im Minimummodus andere Signale ab als im Maximummodus.
Sandini Bib 86
Kapitel 3
AD15–AD0 (I/O) Anschlüsse 2–16, 39 Diese 16 Anschlüsse bilden die 16 Datenbits beim Lesen und Schreiben von Daten sowie die 16 niederwertigen Adressbits zum Adressieren von Speicher und Peripherie. Zuerst werden immer die Adresssignale ausgegeben und zu einem späteren Zeitpunkt die Datensignale bereitgestellt oder eingelesen. Die 16 Anschlüsse bilden also einen zeitlich gemultiplexten Adress- und Datenbus. A19–A16/S6–S3 (O) Anschlüsse 35–38 Die vier Signale bilden die vier höherwertigen Bits des Adressbusses sowie vier Statussignale, die Auskunft über die Prozessoraktivität geben. Auch diese vier Leitungen bilden einen zeitlich gemultiplexten Adress- und Steuerbus. Geben die Pins Statusinformationen aus, so geben S5 (Pin 36) den Wert des Interrupt Flags im Flag-Register des Prozessors und S4/S3 das Segmentregister, das für den Zugriff verwendet wird, entsprechend der folgenden Liste an: A17/S4
A16/S3
0 0 0 1 1 0 1 1 S5: Status des IE-Flags (Interrupt Enable) S6: stets gleich 0
Register für den Datenzugriff ES SS CS oder keines DS
BHE/S7 (O) Anschluss 34 Das Bus-High-Enable-Signal gibt zusammen mit A0 an, ob ein ganzes Wort (2 Byte) oder nur ein Byte übertragen wird. Für die Kombinationen (BHE/S7, A0) gelten folgende Bedeutungen:
: : : :
(00)
ein ganzes Wort (2 Byte) wird über D15–D0 übertragen
(01)
ein Byte auf D15–D8 wird von/zu ungerader Byte-Adresse übertragen
(10)
ein Byte auf D7–D0 wird von/zu gerader Byte-Adresse übertragen
(11)
ungültig
CLK (I) Anschluss 19 Dem CLK-Anschluss wird das Taktsignal für den Prozessor zugeführt. Er verwendet es ohne weitere Teilung. INTR (I) Anschluss 18 Dieser Interrupt-Anschluss wird nach dem Abschluss eines jeden Befehls abgetastet, um zu ermitteln, ob eine Interrupt-Anforderung durch einen Hardware-Baustein vorliegt. Die Abtastung kann durch ein gelöschtes Interrupt Flag verhindert (maskiert) werden. MN/MX (I) Anschluss 33 Das Signal an diesem Minimum/Maximum-Anschluss legt den Betriebsmodus fest. Liegt MN/ MX auf Masse, so arbeitet der 8086 im Maximummodus. Ist der Anschluss auf Vcc festgeklemmt, so wird der 8086 im Minimummodus betrieben.
Sandini Bib Alles begann mit dem Urvater 8086
87
NMI (I) Anschluss 17 Ein Übergang des Signals an diesem Anschluss von einem niedrigen zu einem hohen Pegel bewirkt einen Interrupt 2. Dieser Interrupt kann durch das Interrupt Flag nicht maskiert werden und wird sofort nach der Vervollständigung des laufenden Befehls ausgeführt. RD (O) Anschluss 32 Ein aktives Read-Signal mit hohem Pegel zeigt an, dass der Prozessor Daten aus dem Speicher oder einem I/O-Register liest. Für RD=0 schreibt der 8086 Daten. READY (I) Anschluss 22 Hat der angesprochene Speicher oder das Peripheriegerät die Datenübertragung vom oder zum Speicher bzw. Peripheriegerät abgeschlossen, so legt er an den READY-Anschluss ein Signal mit hohem Pegel an. Speicherbausteine oder Peripheriegeräte können den Prozessor dadurch veranlassen, Wartezyklen (Wait-States) einzusetzen. Beachten Sie, dass das READY-Signal beim 8086 aktiv hoch ist. RESET (I) Anschluss 21 Wird diesem Eingang wenigstens vier Taktzyklen lang ein Signal mit hohem Pegel zugeführt, dann beendet der 8086 sofort seine Tätigkeit und führt einen Reset aus. Alle internen Register werden auf einen definierten Wert gesetzt und der Prozessor beginnt die Ausführung bei 0f000:fff0. TEST (I) Anschluss 23 Dieser Anschluss wird durch einen WAIT-Befehl ständig abgetastet. Liegt TEST auf einem niedrigen Pegel, so fährt der Prozessor mit der Abarbeitung des Programms fort. Ansonsten führt er eine Art Leerlauf aus, bis TEST auf einen niedrigen Pegel sinkt. Damit kann durch den Befehl WAIT der Prozessor solange angehalten werden, bis der Coprozessor eine Berechnung abgeschlossen hat, ohne dass Hardware-Interrupt-Anforderungen über den Anschluss INTR deaktiviert werden. Vcc (I) Anschluss 40 Diesem Anschluss wird die Versorgungsspannung von +5 V zugeführt. GND Anschlüsse 1, 20 Dieser Pin liegt auf Masse (normalerweise 0 V). Die folgenden Signale und Pin-Belegungen gelten nur für den Betrieb des 8086 im Maximummodus. S2, S1, S0 (O) Anschlüsse 26–28 Der Buscontroller verwendet diese drei Steuersignale, um die notwendigen Speicher- und I/OSteuersignale für einen lesenden und schreibenden Zugriff auf den Speicher und den I/OBereich zu erzeugen. Für die Kombinationen (S2, S1, S0) gelten folgende Bedeutungen:
Sandini Bib 88
: : : : : : : :
Kapitel 3
(000)
INTA-Sequenz
(001)
ein I/O-Port wird gelesen
(010)
ein I/O-Port wird geschrieben
(011)
HALT-Zustand
(100)
Befehls-Prefetching
(101)
es werden Daten aus dem Speicher gelesen
(110)
es werden Daten in den Speicher geschrieben
(111)
passiver Zustand
RQ/GT0, RQ/GT1 (I/O) Anschlüsse 30, 31 Diese Request/Grant-Signale dienen zur Aufteilung des lokalen Busses zwischen verschiedenen Busmastern. Der Anschluss RQ/GT0 besitzt eine höhere Priorität als RQ/GT1. Möchte ein anderer Prozessor die Kontrolle über den lokalen Bus übernehmen, so gibt er über RQ/GTx (x=0,1) ein aktives Request-Signal mit niedrigem Pegel an den gerade aktiven Prozessor aus. Kann dieser nach einer eventuellen Abarbeitung von mehreren Befehlen die Kontrolle abgeben, so vermittelt er über denselben RQ/GTx-Pin ein Acknowledge-Signal. Der anfordernde Prozessor übernimmt nun die Kontrolle und Steuerung des lokalen Busses. Ab dem 80286 übernehmen die HOLD/HLDA-Signale diese Arbitrierungsaufgabe. LOCK (O) Anschluss 29 Gibt der LOCK-Anschluss ein aktives Signal mit niedrigem Pegel ab, so kann der Prozessor den lokalen Bus nicht an einen anderen Prozessor übergeben. Der 8086 reagiert auf eine Anforderung über RQ/GTx nicht mit einem Acknowledge. Das Signal LOCK kann explizit durch den Befehl LOCK aktiviert werden. Manche speicherkritischen Befehle wie XCHG aktivieren das Signal LOCK selbstständig. QS1, QS0 (O) Anschlüsse 24, 25 Diese beiden Queue-Status-Signale geben den Status der Prefetch-Queue an. Damit kann die interne Prefetch-Queue des 8086 extern überwacht werden. Für die möglichen Kombinationen (QS1, QS0) gelten folgenden Interpretationen:
: : : :
(00)
die Prefetch-Queue ist inaktiv.
(01)
das erste Byte des Opcodes in der Prefetch-Queue wird verarbeitet.
(10)
die Prefetch-Queue wird geleert.
(11)
es wird ein folgendes Byte des Opcodes in der Prefetch-Queue verarbeitet.
Die im Folgenden aufgeführten Signale und Anschlussbelegungen gelten nur für den Betrieb des 8086 im Minimummodus. ALE (O) Anschluss 25 Das Address-Latch-Enable-Signal aktiviert den Adresspuffer, damit dieser die vom Prozessor ausgegebene Adresse übernimmt und verriegelt. Damit steht die Adresse während des gesamten Buszyklus zur Verfügung und wird erst mit einem neuen Signal ALE verändert.
Sandini Bib Alles begann mit dem Urvater 8086
89
DEN (O) Anschluss 26 Liegt dieser Data-Enable-Pin auf einem niedrigen Pegel, so werden Daten in den externen Datenpuffer gelesen und dort verriegelt. DT/R (O) Anschluss 27 Liegt dieser Data-Transmit/Receive-Pin auf einem hohen Pegel, so schreibt der 8086 Daten, liegt er auf Masse, so werden Daten gelesen. DT/R gibt also die Richtung der Datenübertragung auf dem Bus an. HOLD, HLDA (I, O) Anschlüsse 31, 30 Diese Signale dienen in bekannter Weise zur Arbitrierung des lokalen Busses zwischen verschiedenen Busmastern. Möchte ein anderer Busmaster die Kontrolle über den Bus übernehmen, so führt er dem 8086 ein aktives HOLD-Anforderungssignal zu. Kann dieser die Kontrolle abgeben, so gibt er über den HLDA-Pin ein Hold-Acknowledge-Signal aus. Der anfordernde Prozessor übernimmt die Kontrolle, bis er das Signal an den HOLD-Eingang des 8086 wieder deaktiviert. Der 8086 deaktiviert seinerseits HLDA und übernimmt erneut die Kontrolle über den lokalen Bus. INTA (O) Anschluss 24 Ein aktives Interrupt-Acknowledge-Signal mit niedrigem Pegel bestätigt die Annahme eines Hardware-Interrupts. M/IO, W/R (O, O) Anschlüsse 28, 29 Die Signale Memory/IO und Write/Read an diesen Pins legen die Art des gegenwärtigen Buszyklus fest. Die möglichen Signalkombinationen haben folgende Bedeutungen:
: : : :
(00)
Lesen eines I/O-Ports
(01)
Schreiben eines I/O-Ports
(10)
Lesen von Daten aus dem Speicher
(11)
Schreiben von Daten in den Speicher
3.2 8086-Betriebsmodi und der Buscontroller 8288 Eine Besonderheit von 8086 (und auch 8088) gegenüber den anderen Prozessoren der 80x86Familie besteht darin, dass diese in einem Maximum- und einem Minimummodus betrieben werden können. Die Wahl erfolgt über den MN/MX-Pin 33. Wird er auf der Versorgungsspannung Vcc von +5 V festgeklemmt, so arbeitet der 8086/88 im Maximummodus, liegt er auf Masse 0 V (GND), so wird der 8086/88 im Minimummodus betrieben. Da sich der Aufbau eines Computers in Abhängigkeit vom Betriebsmodus des Prozessors sehr stark unterscheidet, wird dieser Pin bei der Herstellung des Computers normalerweise auf einem dieser beiden Potentiale festgelötet. Im PC mit 8088-Prozessor und XT mit 8086-Prozessor arbeitet die CPU stets im Maximummodus. In anderen Rechnern, die einen 8086/88 verwenden, kann der Prozessor aber auch im Minimummodus betrieben werden.
Sandini Bib 90
Kapitel 3
Der Unterschied zwischen Minimum- und Maximummodus besteht in der Ansteuerung des Busses. Im Minimummodus erzeugt der 8086/88 selbst die erforderlichen Steuersignale für den Bus. Im Maximummodus gibt er an den zugehörigen Buscontroller nur Statussignale aus. Der Buscontroller interpretiert diese Statussignale und erzeugt seinerseits die notwendigen Signale für den Bus. Die Vorgänger des 8086/88 waren einfachere 8-Bit-Prozessoren (wie beispielsweise der 8080), die ihre Bussignale selbst erzeugten. Diese Chips wurden in für heutige Verhältnisse einfachen Computern ohne große Erweiterungsmöglichkeit und geringem Speicherausbau verwendet, sodass die Chips keine großen Ströme für die Ansteuerung der einzelnen Komponenten aufbringen mussten. Aus diesem Grund war kein zusätzlicher Buscontroller erforderlich. Mit dem 8086/88 im Minimummodus ließ sich daher ein sehr kompakter Computer bauen. Das flexible und umfangreichere Design des PCs erforderte jedoch einen zusätzlichen Buscontroller, um alle Bussignale mit ausreichender Stärke zur Verfügung stellen zu können. Außerdem führte Intel mit dem 8086 ein neues Busdesign mit der Bezeichnung MULTIBUS ein. Dieses Design erlaubt die Zusammenarbeit mehrerer Prozessoren. Diese Möglichkeit wird im PC mit Ausnahme eines zusätzlichen Coprozessors jedoch nicht genutzt.
3.3 Der 8086 Real Mode Der Real Mode ist der einzige Adressierungsmodus, den der 8086 beherrscht. Da der erste IBM Personal Computer mit einem 8086 bzw. 8088 ausgestattet war, bildet dieser Real Mode die Grundlage von DOS bis hinauf zum Pentium. Zur Bildung einer physikalischen Adresse verschiebt der 8086 wie üblich den Segmentregisterwert um vier Bits (multipliziert den Wert mit 16) und addiert den Offset hinzu, der in einem Vielzweckregister bereitgehalten wird. Das Ergebnis ist eine echte 20-Bit-Adresse, weil der 8086 nur einen 20-Bit-Adressbus aufweist. Übersteigt 16*Segment+Offset den Wert fffffh, dann tritt ein Wrap-Around nach 00000h auf. Adressen jenseits von fffffh können also im Gegensatz zum 80286 und höher nicht erzeugt werden, die 1-MGrenze wird niemals durchbrochen.
3.4 Zugriff auf den Speicher Wie ich bereits in Kapitel 3.1 erwähnt habe, besitzt der 8086 einen gemultiplexten Daten- und Adressbus, die entsprechenden Leitungen werden also zur Daten- und Adressübergabe verwendet. Im Fall eines Schreibvorgangs würden also Adresse und Schreibdaten kollidieren. Der Buszyklus des 8086 weicht somit natürlicherweise von dem der späteren Prozessoren ab. In Abbildung 3.2 sehen Sie den zeitlichen Verlauf der wichtigsten Signale auf dem Systembus zum Lesen und Schreiben von Daten. Für den Speicherzugriff sind vier Signale wesentlich:
: : : :
Taktsignal CLK vom Taktgenerator, Adress- und Statussignale ADDR/Status vom Prozessor, Adress- und Datensignale ADDR/DATA vom Prozessor bzw. Speicher und READY-Signal, um die Ausführung des Datenlesens anzuzeigen.
Sandini Bib Alles begann mit dem Urvater 8086
91
T Zyklus T1
T3
T2
T4
CLK ADDR/ Status ADDR/ DATA
BHE, A19-A16
S7-S3
Bus reserviert
A15-A0
D15-D0 gültig
(a)
bereit
READY Speicherzugriffszeit
ADDR/ DATA
A15-A0
Schreibdaten D15-D0
(b)
Abb. 3.2: Der 8086-Buszyklus: (a) Lesen ohne Wartezyklen: Der 8086 gibt zunächst die Adresse aus und wartet dann auf die Daten vom Hauptspeicher. (b) Schreiben ohne Wartezyklen: Der Prozessor gibt die Adresse und anschließend sofort die Daten aus. Beide Buszyklen sind in vier Taktzyklen abgeschlossen, es wird also kein Wartezyklus Twait eingelegt.
Ein Buszyklus ist in vier Teile zu je einem Taktzyklus eingeteilt: T1 bis T4. Weil hier ein Taktzyklus gleich einem Prozessortakt PCLK ist, dauert ein 8086-Buszyklus also vier Prozessortakte. Ab dem 80286 ist der Buszyklus auf zwei Prozessortakte verkürzt worden. Im Zyklus T1 gibt der 8086 die Adresse der zu lesenden Daten aus. Diese Daten werden während der Zyklen T3 und T4 an den Prozessor übergeben. Während des Zyklus T2 erfolgt eine Umkehr der Übertragungsrichtung des Busses. Im Folgenden möchte ich diese vier Zyklen kurz erläutern, weil sie von den Zyklen der späteren Prozessoren deutlich abweichen. Ursache ist der gemultiplexte Daten-/Adressbus. T1 Der Prozessor gibt die Steuersignale S2 bis S0 an den Buscontroller ab, der die Adress- und Datenpuffer des Zugriffspfads aktiviert. Anschließend wird über die Pins A0 bis A199 die Adresse der Daten ausgegeben und in den Adresspuffer übertragen. Das Signal BHE gibt an, ob ein ganzes Wort oder nur ein Byte gelesen werden soll. Der Lesevorgang ist damit eingeleitet worden und das READY-Signal sinkt auf einen niedrigen Pegel ab. Die Speichersteuerung leitet einen internen Lesevorgang des Hauptspeichers ein. Dieser Adressierung- und Lesevorgang benötigt eine gewisse Zeit. T2 Nun findet eine Richtungsumkehr des Busses statt. Bisher hat der Prozessor eine Adresse ausgegeben, nun soll er Daten einlesen. Dazu werden die Leitungen BHE und A19–A16 vom Prozessor so umgeschaltet, dass sie die entsprechenden Statusinformationen ausgeben. Der kombinierte Daten-/Adressbus AD15–AD0 wird vom Adressbusmodus in den Datenbusmodus umgeschaltet. T3 Nun beginnt der Datenübertragungszyklus. Zunächst wird der Datenbus (ADDR/DATA) für die Datenübertragung vom Speicher reserviert. Er wartet, bis die Daten übergeben werden. In diesem Zustand sind D15–D0 noch nicht gültig. Ferner werden weiterhin die Statussignale S7–S3 ausgegeben. Hat der Speicher seinen internen Lesevorgang beendet und die Daten an den Spei-
Sandini Bib 92
Kapitel 3
cherpuffer übergeben, hebt die Speichersteuerung das Signal READY auf einen hohen Pegel an. Damit sind die Daten an den 8086-Pins AD15–AD0 gültig und der Prozessor übernimmt sie. T4 Der Prozessor beendet nach etwa dem halben Taktzyklus den Einlesevorgang. Die Puffer werden deaktiviert, wobei der Prozessor jedoch weiter die Statussignale S7–S3 ausgibt. Nach dem Ende des Zyklus T4 befindet sich der Systembus wieder im Anfangszustand. Es kann nun ein neuer Lesevorgang oder ein Schreibvorgang beginnen. Sollen keine Daten übertragen werden, so verbleibt der Bus in einem Wartezustand, bis der Prozessor erneut signalisiert, dass Daten gelesen oder geschrieben werden sollen. Die Zugriffszeit der Speicherbausteine darf beim PC und XT ohne Wait-States höchstens zwei Taktzyklen betragen, nämlich die Zeitspanne von der Ausgabe der Adresse bis zur Gültigkeit der Daten auf dem Bus. Da die Signallaufzeiten in den Pufferschaltkreisen hinzukommen, können in der Praxis nur Speicherbausteine verwendet werden, deren Zugriffszeit etwa die Hälfte dieser Speicherzugriffszeit beträgt. In einem 4,77-MHz Ur-PC konnten daher Bausteine mit einer Zugriffszeit von 200 ns verwendet werden. Zum Vergleich: Moderne DRAMs erreichen im Page oder Static Column Mode Zugriffszeiten von 30 bis 35 ns. Weil der 8086 für jeden Datentransfer mindestens vier Prozessortaktzyklen benötigt, kann ein 10MHz-XT maximal 2,5 Millionen Buszyklen je Sekunde ausführen. Das führt mit dem 16-Bit-Datenbus zu einer Transferrate von 5 MByte/s. Der Ur-PC mit einem 4,77-MHZ-8088 erreichte dagegen wegen des 8-Bit-Datenbus nur etwa 1,1 MByte/s (vergleichen Sie das einmal mit den 504 MByte/s im Pipelined-Burst-Modus des 66 MHz-Pentium). Selbst 1b-Festplatten sind heute schneller. Ein Adress-Pipelining ist beim 8086 nicht möglich, weil der 8086 einen kombinierten Adress-/ Datenbus aufweist und die ADx-Pins ständig durch die Adresse oder die Daten belegt sind. Der 8086 kann also die Adresse für den folgenden Buszyklus nicht ausgeben, während der gegenwärtige Datentransfer noch im Gange ist. Beim Schreiben von Daten in den Speicher ohne Waitstates laufen sehr ähnliche Vorgänge ab. Im Abschnitt (b) der Abbildung 3.2 ist nur das zeitliche Verhalten der Signale ADDR/DATA dargestellt, da alle anderen Signale mit denen beim Datenlesen übereinstimmen. T1 Die Vorgänge sind identisch mit den oben angegebenen, nur dass der Buscontroller entsprechend dem Schreiben von Daten angesteuert wird. Er bereitet also die Puffer und Speichersteuerung auf ein Schreiben von Daten vor. T2 Die Richtung des kombinierten Adress-/Datenbusses (ADDR/DATA) muss nicht umgeschaltet werden, da ja sowohl die Adresse als auch die Daten ausgegeben werden sollen. Daher kann der Prozessor unmittelbar nach der Adresse in T2 die Schreibdaten ausgeben. T3 Hat der Hauptspeicher seinen internen Schreibvorgang beendet, so hebt die Speichersteuerung das Signal READY an, um dem Prozessor die Beendigung mitzuteilen. T4 Der Prozessor beendet den Schreibvorgang. Die Puffer werden deaktiviert, wobei der Prozessor jedoch weiter die Statussignale S7–S3 ausgibt. Nach dem Ende des Zyklus T4 befindet sich der Systembus wieder im Anfangszustand.
Sandini Bib Alles begann mit dem Urvater 8086
93
Das Signal READY gestattet wie bei allen anderen 80x86-Prozessoren eine flexible Reaktion auf Verzögerungen im angesprochenen Speicher. Der 8086 legt dann zwischen T3 und T4 Wartezyklen ein, bis READY einen hohen Pegel erreicht.
3.5 Wortgrenzen Da der 8086 einen 16-Bit-Prozessor mit 16-Bit-Datenbus darstellt, ist der Hauptspeicher wie beim 80286 physikalisch als 16-Bit-Speicher organisiert. Dies bedeutet, dass der 8086 den Speicher physikalisch stets an den Byte-Adressen 0, 2, 4, ..., 1.048.574 anspricht. Logisch können Datenworte (16-Bit) zwar an ungeraden Adressen beginnen, physikalisch kann das Wort an der ungeraden Adresse jedoch nicht auf einmal angesprochen werden. Soll ein Wort an einer ungeraden Adresse abgespeichert oder gelesen werden, so teilt die Busschnittstelle des 8086 diesen Wortzugriff in zwei einzelne Byte-Zugriffe auf. Dieser Vorgang ist für die Software vollständig transparent, die Hardware erledigt die Aufteilung und den zweifachen Speicherzugriff ohne Einwirkung der Software. Damit kann der Programmierer Daten in beliebiger Form anordnen, ohne dass er sich um Wortgrenzen kümmern muss. Bei den zwei Byte-Zugriffen wird der Speicher physikalisch in ganzzahligen Portionen adressiert, jedoch nur das jeweils benötigte Byte eingelesen. Dies teilt der Prozessor der Speichersteuerung über BHE und A0 (das niederwertigste Adressbit) mit. Damit kann ein einzelnes Byte an eine gerade Adresse 0, 2, ... (BHE=1, A0=0) oder eine ungerade Adresse 1, 3, ... (BHE=0, A0=1) geschrieben bzw. gelesen werden. Dasselbe gilt für BHE und A0 natürlich auch dann, wenn nur ein Byte gelesen (beispielsweise über MOV al, [bx]) oder geschrieben werden soll. Sie erkennen, dass das Lesen oder Schreiben eines Wortes an einer ungeraden Adresse zwei Buszyklen, der Zugriff auf ein Wort an einer geraden Adresse aber nur einen Buszyklus benötigt. Es ist daher günstig, wenn auch, wie schon gesagt, nicht notwendig, Datenworte stets so anzuordnen, dass sie bei geraden Speicheradressen beginnen. Diese Ausführungen gelten nur für Datenworte. Die Prefetch-Queue liest den Code stets in Worten ein, die an geraden Speicheradressen beginnen. Aus diesem Grund wird die Prefetch-Queue immer erst dann nachgeladen, wenn in ihr mindestens zwei Byte frei sind. Um auf gerade Speicheradressen zu kommen, liest der Prozessor gegebenenfalls zuerst ein einzelnes Byte ein.
3.6 Zugriff auf den I/O-Adressraum Möchte der 8086 auf einen Port zugreifen, so aktiviert und setzt er die Steuersignale S2–S0 entsprechend:
: :
S2=0, S1=0, S0=1: Der 8086 liest einen I/O-Port. S2=0, S1=1, S0=0: Der 8086 schreibt einen I/O-Port.
Das Schreiben von Daten in einen Port oder das Lesen von einem Port wird in gleicher Weise wie das Schreiben von Daten in den Speicher oder das Lesen vom Speicher ausgeführt. Wie beim Lesen und Schreiben von Daten aus dem bzw. in den Hauptspeicher gibt die CPU eine Adresse an den Adresspuffer aus und steuert den Buscontroller über die Statussignale an. Sollen Daten an einen Port (mit OUT) übertragen werden, so gibt er während der Zeitspanne T2 außerdem noch Daten an den Datenpuffer ab. Anhand der Steuersignale kann die Logik auf dem Motherboard erkennen, dass ein Zugriff auf den I/O-Adressbereich und nicht auf den Speicher
Sandini Bib 94
Kapitel 3
stattfinden soll. Daher wird statt der Speichersteuerung die I/O-Steuerung aktiviert, die das Adresssignal vom Adresspuffer decodiert und den entsprechenden Port anspricht. Da der 8086 maximal 64k Ports ansprechen kann, liegen die vier höherwertigen Adressleitungen A19–A16 bei einem Zugriff über Ports stets auf low. Im PC sind darüber hinaus auch die Adressleitungen A15 bis A10 gleich 0, da nur die ersten 1024 Ports benutzt werden. Der Buszyklus und die zugehörigen Signale stimmen mit denen der Abbildung 3.2 völlig überein. Auch in diesem Fall wird das Signal READY dazu benutzt, um ggfs. Wartezyklen einzusetzen. Das ist auch notwendig, da gerade der Zugriff auf Register in einem Chip auf einem Peripherieadapter (wie z.B. dem Festplattencontroller) gegenüber einem Zugriff auf den Hauptspeicher ganz erheblich langsamer ist.
3.7 8086 Reset Ein Reset des 8086 wird ausgelöst, wenn der Anschlusspin RESET für mindestens vier Taktzyklen auf einem hohen Pegel liegt. Nachdem das Signal auf einen niedrigen Pegel zurückgekehrt ist, findet im Prozessor eine interne Initialisierung statt, in deren Verlauf die Register mit den in Tabelle 3.1 angegebenen Werten geladen werden. Register
Wert
Flag IP CS DS ES SS
0002h fff0h f000h 0000h 0000h 0000h
Tab. 3.1: Registerinhalte nach einem 8086-Reset
Nach der internen Initialisierung weist das Paar CS:IP auf die Speicheradresse f000:fff0 oder zusammengefasst ffff0h. An dieser Stelle befindet sich üblicherweise die Einsprungadresse der Startroutine des BIOS. Da von ffff0h bis zum Adressierungslimit fffffh (=1MByte) nur 16 Bytes zur Verfügung stehen, besteht einer der ersten Befehle meist aus einem Sprungbefehl (JMP) auf den »eigentlichen« Einsprungpunkt. Das BIOS bootet nun den PC.
3.8 Der 8088 Der 8088 stellt eine etwas »abgespeckte« Version des 8086 dar. Sein interner Aufbau mit Busschnittstelle, Befehlseinheit etc. stimmt nahezu vollkommen mit der des 8086 überein. Auch besitzt er denselben Befehlsvorrat, kennt dieselben Adressierungsarten und arbeitet in gleicher Weise mit Segmenten und Offsets. Wie der 8086 ist der 8088 ein 16-Bit-Prozessor, d.h. er verarbeitet die Daten mit einer maximalen Breite von 16 Bit (ein Wort). Der einzige Unterschied besteht darin, dass der 8088 nur einen 8-Bit-Datenbus aufweist (siehe Abbildung 3.3). Sie erinnern sich, dass der 8086 dagegen einen 16-Bit-Datenbus besitzt. Da über einen 8-Bit-Datenbus natürlich auch nur ein Byte auf einmal übertragen werden kann, muss der 8088 beim Lesen oder Schreiben eines 16-Bit-Wortes zweimal auf den Speicher oder einen Port zugreifen.
Sandini Bib Alles begann mit dem Urvater 8086
Maximummodus GND
40
1
Minimummodus
Vcc
A14
A15
A13
A16/S3
A12
A17/S4
A11
A18/S5
A10
A19/S6
A9
high
A8
MN/MX
AD7
(SS0)
RD
8088 CPU
RQ/GT0
(HOLD)
RQ/GT1
(HLDA)
AD4
LOCK
(WR)
AD3
S2
(IO/M)
AD2
S1
(DT/R)
AD1
S0
(DEN)
AD0
QS0
(ALE)
NMI
QS1
(INTA)
AD6 AD5
TEST
INTR
READY
CLK GND
95
20
21
RESET
Abb. 3.3: Das Anschlussschema des 8088: Der 8088 ist in einem Standard-DIP-Gehäuse mit 40 Pins untergebracht. Manche Anschlüsse geben im Minimummodus andere Signale als im Maximummodus ab.
Beispiel: Bei einem Befehl MOV ax, [bx] greift der 8088 zweimal auf den Speicher zu, um das Wort bei Offset [bx] in den 16-Bit-Akkumulator ax zu laden. Dieser zweimalige Zugriff ist für die Software völlig transparent, d.h. die Busschnittstelle spricht den Speicher oder Port automatisch zweimal hintereinander an, wenn ein ganzes Wort übertragen werden soll. Damit sind hier natürlich auch die Betrachtungen hinsichtlich der Wortgrenze beim 8086 gegenstandslos. Unabhängig davon, ob das Datenwort an einer geraden oder ungeraden Adresse beginnt, werden stets zwei Buszyklen benötigt, um ein 16-Bit-Wort zu übertragen. Die Buszyklen laufen dabei in gleicher Weise wie beim 8086 ab. Gegenüber dem 8086 benötigen daher alle Befehle, die den Transfer eines 16-Bit-Wortes beinhalten, mindestens vier Taktzyklen mehr Zeit (entsprechend einem Buszyklus ohne Waitstates). Der 8088 arbeitet im Durchschnitt also langsamer. Beispiel: MOV ax, [bx] benötigt mindestens vier zusätzliche Taktzyklen gegenüber dem 8086; MOV al, [bx] benötigt dagegen gleich viel, da nur ein Byte vom Speicher in den 8-Bit-Akkumu-
lator übertragen wird. Ein weiterer Unterschied des 8088 gegenüber dem 8086 besteht darin, dass die Prefetch-Queue hier nur vier Byte (gegenüber sechs Bytes beim 8086) groß ist. Aufgrund des 8-Bit-Datenbusses wird die Prefetch-Queue bereits nachgeladen, wenn nur ein Byte frei ist (zwei Byte beim 8086). Durch die kleinere Prefetch-Queue und die langsamere Datenübertragung kann es daher vorkommen, dass die Arbeitsgeschwindigkeit des Prozessors nicht durch die interne Befehlsverarbeitung, sondern durch die Geschwindigkeit, mit der die Prefetch-Queue nachgeladen wird, beschränkt ist. Treten mehrere in wenigen Taktzyklen ausführbare Befehle (wie z.B. CLC, AND, CBW) hintereinander auf, so
Sandini Bib 96
Kapitel 3
hat der Prozessor den Befehl bereits nach zwei Taktzyklen beendet, während die Busschnittstelle mindestens vier Taktzyklen benötigt, um die Prefetch-Queue nachzuladen. Der Prozessor muss darauf warten, dass die Busschnittstelle den nächsten Befehl einliest. Die Entwicklung eines »8086« mit 8-Bit-Datenbus (eben dem 8088) hat historische Gründe. Als der 8086 Mitte der siebziger Jahre auf den Markt kam und die damals verbreiteten 8-Bit-Prozessoren ablösen sollte, waren kaum Peripheriechips mit einer Datenbreite von 16 Bit verfügbar, oder zumindest waren sie sehr teuer. Außerdem ist die Konstruktion einer Platine mit einem durchgehenden 16-Bit-Datenbus natürlich wesentlich aufwändiger als mit einem 8-Bit-Datenbus. Beispielsweise müssen alle Datenpuffer die doppelte Kapazität aufweisen. Um dem 8086 die Chance zu geben, die bereits vorhandenen 8-Bit-Technologien weiter benutzen zu können, wurde der 16-Bit-Datenpuffer daher auf dem Prozessorchip integriert, sodass der Prozessor gegenüber der Peripherie nun als 8-Bit-Modell erschien. Das Ergebnis war der 8088. Bevor man diese Lösung als blödsinnig abtut, sollte man sich die rasante technologische Entwicklung der letzten 15 Jahre vor Augen halten. Die gesamte PC-Welt wurde von dieser Entwicklung förmlich selbst überrollt. Ergebnisse sind u.a. die 640kB-Grenze von MS-DOS, die 8-Bit-DMA-Chips im AT und der Real-Mode-Betrieb eines Pentium.
3.9 Der 80186/88 Der Vollständigkeit halber möchte ich an dieser Stelle noch kurz auf den Nachfolger des 8086/ 88, den 80186/88 eingehen. 80186 und 80188 stehen im gleichen Verhältnis zueinander wie der 8086 und 8088: Der einzige Unterschied ist, dass der 80186 einen 16-Bit-Datenbus, der 80188 dagegen nur einen 8-Bit-Datenbus besitzt. Der 80186/88 ist aber nicht nur ein Mikroprozessor, sondern Intel hat zusätzlich noch einen Interrupt Controller, einen DMA-Chip und einen TimerBaustein in dem 80186/88 integriert. Der 80186/88 ist also eher ein integrierter Mikrocontroller. Der Befehlsumfang wurde gegenüber dem 8086/88 erweitert und manche Befehle optimiert, sodass ein 80186/88 etwa 25% schneller arbeitet als ein äquivalenter 8086/88. Wie der 8086/88 arbeitet auch der 80186/88 ausschließlich im Real Mode und weist einen 1-MByte-Adressraum auf. Erst mit dem 80286 wurde der Protected-Mode eingeführt und der Adressraum auf 16 MByte erweitert. Der große Nachteil für einen Einsatz des 80186/88 im PC ist, dass die Adressen der Register von Interrupt-, DMA- und Timer-Chip inkompatibel mit den entsprechenden Registeradressen im PC sind. Eine Einbindung ist also nur über eine zusätzliche Dekodierlogik möglich. Der 80186/ 88 hat aus diesem Grund im PC/XT und Kompatiblen nur sehr wenig Verwendung gefunden. Als eigenständiger Mikroprozessor auf Adapterkarten für den Personal Computer, wie z.B. Modem-, ISDN- und Messdatenerfassungskarten sowie auch Adaptern für Feldbussysteme ist der 80186/88 aber durchaus beliebt – Inkompatibilitäten mit dem 8086/88 und den SupportChips auf dem Motherboard spielen hier ja keine Rolle. Der Vorteil des 80186/88 auf einer Adapterkarte ist der, dass die jeweilige Aufgabe (z.B. Fax empfangen, Messdaten aufnehmen) von der CPU des PCs an den Mikrocontroller übergeben werden kann und dieser dann quasi als PC im PC wirkt, da er während seines Jobs unabhängig vom PC-Mikroprozessor arbeitet, sich also nicht etwa durch irgendwelche Windows-Aktivitäten aus dem Tritt bringen lässt. Außerdem können für die Programmentwicklung die PC-üblichen Programmiersprachen und Tools verwendet werden, die im Gegensatz zur Software für speziellere Mikrocontroller sehr preiswert sind.
Sandini Bib
4 Kompatibilität nach unten – der 80286 Wie seine Vorgänger 8086 und 8088 stellt der 80286 zwar ebenfalls nur einen 16-Bit-Prozessor mit 16 Bits breiten Registern dar, der technologische Sprung war aber der mit ihm eingeführte Protected Virtual Address Mode oder kurz Protected Mode. Von außen nicht zu erkennen, hat Intel eine ganz enorme Funktionsvielfalt integriert, sodass die Zugriffsprüfungen des Protected Modes ohne Verzögerung ablaufen. Gegenüber dem 80386 fehlen aber nicht nur die 32-Bit-Register, sondern auch die Paging-Einheit und der Virtual-8086-Mode. Der 80286 weist einen 24-Bit-Adressbus und einen 16-Bit-Datenbus auf. Damit lassen sich im Protected Mode bis zu 16 MB Speicher adressieren. Im Real Mode arbeitet der 80286 wie ein schneller 8086. Die höhere Arbeitsgeschwindigkeit ergibt sich aus der höheren Taktfrequenz des Prozessors (neue Modelle erreichen bis zu 25 MHz) und durch optimierte elektronische Schaltungen in der Befehls-, Ausführungs- und Adressierungseinheit, sodass weniger Taktzyklen für die Ausführung eines Befehls notwendig sind. Auch ein Buszyklus, der schneller als beim 8086 Daten lesen und schreiben kann, steigert die Leistung des 80286 gegenüber dem 8086. Der 80286 ist vollständig mikrocodiert, RISC-Elemente sucht man vergeblich. Der 80286-I/O-Adressbereich umfasst 64k 8-Bit-Ports mit den Adressen 0 bis 65.535 oder 32k 16-Bit-Ports mit den Adressen 0, 2, 4, ... bis 65.532, 65.534 oder eine äquivalente Mischung von 8- und 16-Bit-Ports. Die 32-Bit-Ports fehlen hier natürlich.
4.1 Anschlüsse und Signale des 80286 Ausgeliefert wird der 80286 in zwei verschiedenen Gehäusevarianten: einem Plastic Leaded Chip Carrier oder einem Pin Grid Array. Der innere Aufbau des Prozessors ist in beiden Fällen identisch, nur die Fassungen, in die er eingesetzt wird, unterscheiden sich in Form und Anschlussschema. Durch die größere Stiftdichte ist das Pin-Grid-Gehäuse kleiner. In Abbildung 4.1 sehen Sie das Anschlussschema des 80286.
68
1
52
18
1
68
51
80286 (PLCC)
17
BHE LOCK frei
34
35
D15 D7 D14 D6 D13 D5 D12 D4 D11 D3 D10 D2 D9 D1 D8 D0 GND
2
frei
S0
3
5
A23 GND A20
A18
A16
11
13
15
17
A21
A19
A17
A15
A12
6
10
12
14
16
4
7
8
COD/ INTA M/IO 66
67
HOLD HLDA 64
65
Vcc READY 62
A14
9
S1 PEACK A22
63
80286 (PGA)
GND PEREQ
A13
19
18
A10
A11
21
20
A8
A9
23
22
A6
A7
25
24
A4
A5
27
26
60
61
frei
NMI
58
59
29
28
frei
INTR
CLK
Vcc
56
57
31
30
A1
A2
RESET A3
BUSY frei 54
55
CAP ERROR D7 52
53
50
D15 D14 51
49
33
32
D6
D5
D4
D3
D2
D1
D0
A0
48
46
44
42
40
38
36
34
D13
D12
D11
D10
D9
D8
GND
47
45
43
41
39
37
35
A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 RESET Vcc CLK A2 A1 A0
BHE frei frei S1 S0 PEACK A23 A22 GND A21 A20 A19 A18 A17 A16 A15 A14
LOCK M/IO COD/INTA HLDA HOLD READY Vcc PEREQ GND NMI frei INTR frei frei BUSY ERROR CAP
Markierung für Pin 1
Abb. 4.1: Das Anschlussschema des 80286: Der 80286 wird in einem PLCC- oder einem PGA-Gehäuse mit 68 Kontakten ausgeliefert.
Sandini Bib 98
Kapitel 4
Im Folgenden möchte ich nun die Anschlüsse des 80286 beschreiben. Anschlüsse und Signale, die auch beim 80386 bis Pentium vorkommen, werden nur kurz aufgeführt. Näheres finden Sie im entsprechenden Kapitel. A23–A0 (O) Anschlüsse 7, 8, 10–28, 32–34 Diese 24 Anschlüsse bilden die 24 Adressbits des Adressbus. BHE (O) Anschluss 1 Das Bus-High-Enable-Signal an diesem Pin zeigt zusammen mit A0 an, ob ein ganzes Wort oder nur ein Byte auf dem höher- bzw. niederwertigen Datenbus übertragen wird. Gibt BHE ein aktives Signal mit niedrigem Pegel ab, so überträgt der höherwertige Anteil des Datenbusses in jedem Fall ein Byte. Für (BHE, A0) gelten folgende Bedeutungen:
: : : :
(00)
ein Wort (2 Byte) wird über D15–D0 übertragen
(01)
ein Byte auf D15–D8 wird von/zu einer ungeraden Byte-Adresse übertragen
(10)
ein Byte auf D7–D0 wird von/zu einer geraden Byte-Adresse übertragen
(11)
ungültig
BUSY, ERROR (I, I) Anschlüsse 54, 53 Die Signale teilen dem 80286 den Status des Coprozessors mit. Ist BUSY aktiv, so bedeutet dies, dass der Coprozessor gerade einen Befehl abarbeitet. Der Betrieb des 80286 wird dann bei manchen ESC-Befehlen für den Coprozessor angehalten. Liegt das Signal ERROR auf einem aktiven, niedrigen Pegel, so löst der 80286 einen Coprozessor-Interrupt 10h aus, wenn er bestimmte ESCBefehle oder einen WAIT-Befehl ausführt. CAP (I) Anschluss 52 Zwischen diesem Anschluss und Masse (0 V) muss ein Kondensator mit einer Kapazität von 0,047 µF geschaltet sein, sodass der interne Vorspannungsgenerator des 80286 korrekt arbeitet. CLK (I) Anschluss 31 Dem CLK-Anschluss wird das Taktsignal zugeführt. Der 80286 teilt CLK durch zwei, um den internen Prozessortakt PCLK zu erzeugen; er wird also wie der 80386 von einem x2-Taktsignal versorgt. COD/INTA, M/IO, S1, S0 (O, O, O, O) Anschlüsse 66, 67, 4, 5 Die Signale definieren zusammen den Status des aktiven Buszyklus. Die Kombinationen (COD/ INTA, M/IO, S1, S0) haben folgende Bedeutungen:
: : :
(0000)
INTA-Sequenz
(0100)
HALT für A1=1, Shutdown für A1=0
(0101)
Daten werden aus dem Speicher gelesen
Sandini Bib Kompatibilität nach unten – der 80286
: : : :
(0110)
Daten werden in den Speicher geschrieben
(1001)
ein I/O-Port wird gelesen
(1010)
ein I/O-Port wird geschrieben
(1101)
Befehls-Prefetching
99
Alle anderen Kombinationen sind ungültig. D15–D0 (I/O) Anschlüsse 36–51 Diese 16 Anschlüsse bilden den bidirektionalen Datenbus des 80286. HOLD, HLDA (I, O) Anschlüsse 64, 65 Diese Signale dienen in bekannter Weise zur Arbitrierung des lokalen Busses zwischen verschiedenen Busmastern. Möchte ein anderer Busmaster die Kontrolle über den Bus übernehmen, so führt er dem 80286 ein aktives HOLD-Anforderungssignal zu. Kann dieser die Kontrolle abgeben, gibt er über den HLDA-Pin ein Hold-Acknowledge-Signal aus. Der anfordernde Prozessor übernimmt die Kontrolle, bis er das Signal an den HOLD-Eingang des 80286 wieder deaktiviert. Der 80286 deaktiviert seinerseits HLDA und übernimmt erneut die Kontrolle über den lokalen Bus. INTR (I) Anschluss 57 Über den INTR-Anschluss kann ein Interrupt Controller eine Hardware-Interrupt-Anforderung auslösen. Die Abtastung von INTR wird durch ein gelöschtes Interrupt Flag IE verhindert (maskiert). LOCK (O) Anschluss 68 Ist LOCK aktiv, also auf einem niedrigen Pegel, so gibt der 80286 den lokalen Bus nicht an einen anderen Busmaster ab, wenn er eine Busanforderung HOLD von einem anderen Master empfängt. Er reagiert auf eine Anforderung (HOLD) nicht mit einem Acknowledge (HLDA). NMI (I) Anschluss 59 Ein Übergang des Signals an diesem Anschluss von einem niedrigen zu einem hohen Pegel führt zu einem Interrupt 2. Der 80286 bricht die Programmausführung ab und ruft den entsprechenden Handler auf. PEREQ, PEACK (I, O) Anschlüsse 61, 6 Möchte der Coprozessor 80287 Daten aus dem Speicher lesen oder in diesen schreiben, so aktiviert er das Processor-Extension-Request-Signal PEREQ. Hat der 80286 die Daten vom oder zum Speicher übertragen, so legt er ein aktives Processor-Extension-Acknowledge-Signal PEACK an den 80287 an. PEREQ, PEACK (I, O) Anschlüsse 61, 6 Möchte der Coprozessor 80287 Daten aus dem Speicher lesen oder in diesen schreiben, so aktiviert er das Processor-Extension-Request-Signal PEREQ. Hat der 80286 die Daten vom oder zum
Sandini Bib 100
Kapitel 4
Speicher übertragen, so legt er ein aktives Processor-Extension-Acknowledge-Signal PEACK an den 80287 an. READY (I) Anschluss 63 Das Signal an diesem Pin gibt an, ob das adressierte Peripheriesystem, z.B. der Hauptspeicher oder ein I/O-Gerät, den Zugriff ausgeführt hat (READY auf niedrigem Pegel) oder dazu noch mehr Zeit benötigt (READY auf hohem Pegel). Der 80286 kann also wie z.B. der 80386 flexibel Wartezyklen einlegen. RESET (I) Anschluss 29 Liegt dieser Eingang mindestens 16 CLK-Zyklen auf einem hohen Pegel, so bricht der 80286 seine Tätigkeit sofort ab und führt einen Prozessor-Reset aus. Vcc (I) Anschlüsse 30, 62 Diesen Anschlüssen wird die Versorgungsspannung (üblicherweise +5 V) zugeführt. GND (I) Anschlüsse 9, 35, 60 Diese Pins liegen auf Masse (üblicherweise 0 V).
4.2 Die 80286-Register Alle Vielzweckregister sind beim 80286 16 Bit groß. Wenn Sie sich in Abbildung 5.10 auf Register ohne vorangestelltes E beschränken, erhalten Sie alle Vielzweckregister des 80286. Das sind also AX, BX, CX, DX, SI, DI und BP. Dazu kommen noch der Befehlszähler IP, der Stapelzeiger SP und die Flags. Der 80286 besitzt weder die Debug-, Steuer- noch Testregister des 80386. Lediglich das Maschinenstatuswort ist bereits als Teil von CR0 implementiert. Die 80286-Register sind zusammenfassend in Abbildung 4.2 dargestellt.
4.3 Der 80286 Protected Mode Der Protected Mode des 80286 stimmt hinsichtlich seiner Funktion völlig mit dem des 80386 überein. Es überrascht aber sicher nicht, wenn alle Register- und Deskriptorstrukturen auf die 16-Bit-Architektur des 80286 abgestimmt sind. Schließlich ist der 80386 und dadurch auch der 80386 Protected Mode eine spätere Erweiterung der Urform im 80286. In den folgenden Abschnitten möchte ich mich daher im Wesentlichen auf die Unterschiede und Einschränkungen gegenüber dem Protected Mode des 80386 beschränken.
Sandini Bib Kompatibilität nach unten – der 80286
101
Befehlszähler/Stack-Zeiger
Flag-Register
15
15
0
IP
0
FLAG
SP
Segmentregister
Vielzweckregister 15
15
0
0
CS
AL
AH BH
BL
SS
CH DH
CL DL
DS ES
SI DI BP
Speicherverwaltungsregister 15
0 23
TSS-Selektor LDT-Selektor
TR LDTR
0 15
TSS-Basisadresse LDT-Basisadresse IDT-Basisadresse GDT-Basisadresse
IDTR GDTR
0
TSS-Limit LDT-Limit IDT-Limit GDT-Limit
Maschinenstatuswort 15
0
MSW
Abb. 4.2: Die 80286-Register
4.3.1
Die 80286-Speicherverwaltungsregister
Für den Protected Mode weist der 80286 die fünf Register Maschinenstatuswort (MSW), TaskRegister (TR) und die Register für die lokale Deskriptortabelle (LDT), die Interrupt-Deskriptortabelle (IDT) und die globale Deskriptortabelle (GDT) auf. Sie sind zusammen mit den anderen 80286-Registern in Abbildung 4.2 dargestellt. Entsprechend der 16-Bit-Architektur des 80286 umfasst das Maschinenstatuswort MSW nur 16 Bits. Es ist beim 80386 Bestandteil des Steuerregisters CR0 (siehe Abbildung 6.8). Ist der 80286 einmal durch Setzen des PE-Bits in den Protected Mode umgeschaltet worden, dann kann er nur durch einen Prozessor-Reset wieder in den Real Mode zurückgeschaltet werden. Dadurch wird die Initialisierungsroutine aufgerufen und der Prozessor arbeitet wieder im Real Mode. Das ist natürlich recht aufwändig. Das ROM-BIOS des ATs erkennt an einem Eintrag Shutdown-Status im CMOS-RAM, ob der PC gebootet oder nur ein Zurückschalten zum Real Mode stattfinden soll. Auch die Einträge in den vier Deskriptor- und Task-Registern sind an den 80286 angepasst. Die Basisadresse umfasst entsprechend dem 24-Bit-Adressbus ebenfalls 24 Bit, der Limiteintrag wegen der 16-Bit-Offsetregister 16 Bit. Beim 80286 dürfen Segmente also nur 64 KByte groß sein. Die Segmentselektoren stimmen mit denen des 80386 überein, schließlich sind auch beim 80386 alle Segmentregister nur 16 Bit breit. Die Segmentselektorstruktur nach Abbildung 6.4 ist auch für den 80286 gültig.
Sandini Bib 102
4.3.2
Kapitel 4
80286-Segmentdeskriptoren
Die 80286-Segmentdeskriptoren müssen den 16-Bit-Aufbau des 80286 widerspiegeln. Beispielsweise sind 32-Bit-Basiseinträge wegen des 24-Bit-Adressbusses unmöglich. In Abbildung 4.3 sehen Sie die Struktur eines 80286-Segmentdeskriptors, er umfasst wie beim 80386 (in weiser Voraussicht) acht Byte. Offset 15 14 13 12 11
8
7
0
+6
P DPL
DT
reserviert Typ
Basis 23...16
+4
Basis 15...0
+2
Limit 15...0
0
Abb. 4.3: Der Aufbau eines 80286-Segmentdeskriptors
Die 24 Basisbits geben die Startadresse des Segments im Speicher an und entsprechen den 24 Adressleitungen des 80286. Damit kann der 80286 im Protected Mode 224 Byte oder 16 MByte adressieren. Die 16 Bits des Limiteintrags geben die Größe des Segments in Byte an, sodass auch im Protected Mode Segmente mit einer maximalen Größe von 64 KByte möglich sind. Weil das Granularity-Bit fehlt, können keine größeren Segmente konstruiert werden. Das ist aber wegen der 16-Bit-Offsets sowieso unmöglich. Das Bit DT gibt an, um welchen Deskriptortyp es sich handelt, das Typ-Feld definiert die Art und DPL die Privilegierungsstufe des Segments. Schließlich ist das Bit P ein Indikator dafür, ob sich das Segment auch tatsächlich im Speicher befindet. Diese Einträge sind auch im 80386-Segmentdeskriptor vorhanden. Die beiden höherwertigen Bytes sind reserviert. Dort befinden sich beim 80386-Segmentdeskriptor das Granularity-Bit G, das Segmentgrößenbit DB, die fehlenden acht Basisbits 31..24 für eine 32-Bit-Basisadresse und vier Limitbits 19..16 für das 20-Bit-Limit beim 80386. Für eine Kompatibilität mit dem 80386 und späteren Prozessoren sollten sie die beiden höherwertigen Bytes stets auf 0 setzen. Dann ist das Bit DB stets gleich 0 und der 80286-Code kann ohne Probleme auf die 32-Bit-Architektur des 80386 übertragen werden, weil er dadurch alle Operanden und Adressen standardmäßig als 16-Bit-Größen behandelt.
4.3.3
80286-Segment- und Zugriffstypen
Für den 80286 gibt es zwei Arten von Segmenten, nämlich Applikations- und Systemsegmente. Das Bit DT sowie die vier Typbits des Segmentdeskriptors legen Art und Möglichkeit für einen Zugriff auf das beschriebene Segment fest. Ist DT gleich 1, so handelt es sich um ein Applikationssegment, sonst um ein Systemsegment. Applikationssegmente Die Definition der Applikationssegmente erfolgt wie beim 80386, das Feld Typ im Segmentdeskriptor hat also folgenden Aufbau: Bit: Belegung:
11
10
9
EXE E/C W/R
8
A
Sandini Bib Kompatibilität nach unten – der 80286
103
Die Aufschlüsselung aller Felder und die zugeordneten Applikationssegmente finden Sie in Kapitel 5 über den 80386. Hinsichtlich der Applikationssegmente besteht also kein Unterschied zwischen dem 80286 und dem 80386. Dies ist bei den Systemsegmenten anders. Systemsegmente und Gates Der 80286 kennt insgesamt sieben Systemsegmenttypen (siehe Tabelle 4.1). Die Task-State-Segmente (TSS) definieren den Zustand aktiver oder unterbrochener (verfügbarer) Tasks. Auch beim 80286 sind TSS- und LDT-Deskriptoren als Systemsegmente nur in der GDT zulässig. Die vier Gates dienen wie beim 80386 zu einer kontrollierten Steuerungsübergabe zwischen Tasks verschiedener Privilegierungsstufe. Typ
Bedeutung
Typ
1 2 3 4 5 6 7
verfügbares 80286 TSS LDT aktives 80286 TSS 80286 Call Gate Task Gate 80286 Interrupt Gate 80286 Trap Gate
Systemsegment Systemsegment Systemsegment Gate Gate Gate Gate
Tab. 4.1:
80286-Systemsegmenttypen (DT=0)
Alle anderen für den 80386 gültigen Werte sind hier ungültig. Der Aufbau der Gate-Dekriptoren für den 80286 ist in Abbildung 4.4 dargestellt. Call-Gates werden aber nicht nur für ProzedurAufrufe, sondern auch für alle unbedingten und bedingten Sprunganweisungen verwendet, sie können in der lokalen oder globalen Deskriptortabelle, nicht aber in der Interrupt-Deskriptortabelle auftreten. Dort sind nur Interrupt-, Trap- und Task-Gates erlaubt. Offset 15 14 13 12 11
8
7
5
4
0
reserviert P DPL 0
Typ
0 0 0 Word-Count
+6 +4
Segmentselektor
+2
Offset in Segment 15...0
0
Abb. 4.4: 80286-Gate-Deskriptor
Die 80286-Gates unterscheiden sich von den 80386-Gates darin, dass die Bits 31 bis 16 für den Zieloffset des Aufrufs oder Sprungs nicht vorhanden sind und das Feld Word Count keine Doppelworte, sondern gewöhnliche 16-Bit-Worte angibt. Ursache für diese Einschränkungen ist wiederum die 16-Bit-Architektur des 80286. Aus Kompatibilitätsgründen kann der 80386 auch 80286-Gates verarbeiten. Trifft der 80386 auf ein 80286-Gate, dann interpretiert er das Feld DWord-Count als Word-Count und kopiert nur entsprechend viele Worte (zu je 16 Bit).
Sandini Bib 104
4.3.4
Kapitel 4
Multitasking, 80286 TSS und das 80286-Task-Gate
Auch der 80286 Protected Mode dient zur Unterstützung von Multitasking-Systemen. Zu diesem Zweck ist ein der 80286-Architektur angepasstes Task State Segment vorgesehen, dessen Struktur Sie in Abbildung 4.5 sehen. Offset 15
0
Task-LDT-Selektor
+42 (2ah)
DS-Selektor
+40 (28h)
SS-Selektor
+38 (26h)
CS-Selektor
+36 (24h)
ES-Selektor
+34 (22h)
DI
+32 (20h)
SI
+30 (1eh)
BP
+28 (1ch)
SP
+26 (1ah)
BX
+24 (18h)
DX
+22 (16h)
CX
+20 (14h)
AX
+18 (12h)
Flag
+16 (10h)
IP
+14 (eh)
SS für CPL2
+12 (ch)
SP für CPL2
+10 (ah)
SS für CPL1
+8
(8h)
SP für CPL1
+6
(6h)
SS für CPL0
+4
(4h)
SP für CPL0
+2
(2h)
Back Link auf vorheriges TSS
0
(0h)
Abb. 4.5: Das 80286-Task-State-Segment (TSS)
Es verwundert nicht, dass das 80286-TSS kleiner ausgefallen ist als sein 80386-Pendant. Es müssen ja nur 16-Bit-Register gerettet werden. Dennoch sind zwei wesentliche Unterschiede zu erkennen: es fehlen die Einträge I/O-Map-Basis und CR3 sowie das T-Bit. Der 80286 schützt seinen I/O-Adressbereich ausschließlich über das IOPL-Flag, eine I/O-Map ist nicht vorgesehen und wurde erst mit dem 80386 implementiert. Außerdem weist der 80286 keine Paging-Einheit auf, der Page Directory-Basiseintrag im (auch nicht vorhandenen) Steuerregister CR3 ist also sinnlos. Beim 80286 ist nicht vorgesehen, dass bei einem Task Switch (also beim Laden des TSS) eine Debug-Exception entsprechend Interrupt 1 ausgelöst werden soll. Die dafür notwendigen Debug-Register fehlen. Das Task Gate unterscheidet sich zwischen 80286 und 80386 nicht. Schließlich ist im Task-GateDeskriptor nur der TSS-Segmentselektor abgelegt und die Selektorstruktur hat sich beim Übergang vom 80286 zum 80386 nicht geändert. Die Funktion des Task State Segments sowie der Task Gates zum Umschalten zwischen verschiedenen Tasks ist identisch beim 80386. Alle dort erläuterten Vorgänge sind im Prinzip (nach Angleichung an die 16-Bit-Architektur des 80286) auch hier gültig.
Sandini Bib Kompatibilität nach unten – der 80286
4.3.5
105
80286-Schutz für den I/O-Adressraum
Wie ich bereits erwähnt habe, werden die I/O-Ports beim 80286 nur das IOPL-Flag im FlagRegister geschützt. Der Wert des IOPL-Flags gibt wie üblich die Privilegierungsstufe an, die ein Code-Segment mindestens aufweisen muss, um auf den I/O-Adressraum zugreifen zu können, d.h. es muss gelten CPL ¾ IOPL. Ist der CPL des aktuellen Tasks größer (niedrigere Privilegierungsstufe), so führen die IOPL-sensitiven Befehle IN, OUT, INS, OUTS, CLI und STI zu einer bereits hinlänglich bekannten Exception »allgemeiner Protection-Fehler«. Der 80286 implementiert also nur eine Strategie der globalen Absicherung des I/O-Adressbereichs über das IOPL-Flag. Ein zusätzlicher individueller Schutz der Ports wie beim 80386 über eine I/O-Map ist nicht vorhanden. Das ist aber auch verständlich, weil die I/O-Map vor allem im Hinblick auf den Virtual-8086-Mode implementiert worden ist.
4.4 80286-Buszyklen und -Pipelining Der Buszyklus des 80286 unterscheidet sich kaum von dem des 80386. Es werden lediglich teilweise andere Steuersignale getrieben, die aber nach einer Dekodierung dieselben Auswirkungen haben. Dazu gehören z.B. die Adresssignale A23–A0 und das BHE-Signal. Beim 80386 fehlen die beiden Adresssignale A1 und A0 und müssen aus den BEx-Signalen decodiert werden. Der Buszyklus des 80286 dauert ohne Wartezyklen zwei PCLK-Takte, was vier CLK-Taktzyklen entspricht. Ein 10 MHz 80286 kann also 5 Millionen Buszyklen je Sekunde ausführen. Das bedeutet eine Übertragungsrate von 10 MByte/s. Kann der Speicher oder das Peripheriegerät in der zur Verfügung stehenden Zeit die Lese- oder Schreibanforderung nicht ausführen, so hält es wie beim 80386 das READY-Signal auf hohem Pegel. Damit wird dem 80286 signalisiert, dass er einen Wartezyklus einlegen soll, um dem Speicher oder Peripheriegerät mehr Zeit zu geben, den Zyklus zu vollenden. Sonderzyklen Neben den drei »normalen« Buszyklen zum Lesen und Schreiben von Daten sowie dem passiven Buszyklus (wenn weder die Prefetch-Queue geladen werden muss, noch der gerade abgearbeitete Befehl einen Speicher- oder I/O-Zugriff verlangt) kennt der 80286 noch die beiden Sonderzyklen Shutdown und Halt. Sie werden durch die Kombination (0100) der Signale COD/INTA, M/IO, S1, S0 angezeigt und durch den Wert von A1 unterschieden. Der Shutdown-Zyklus tritt ein, wenn bei der Ausführung eines Befehls mehrere Exceptions auftreten und der Prozessor überfordert ist. Der Halt-Zustand kann durch den Befehl HLT ausgelöst werden. Auch in diesem Fall ist der Prozessor angehalten und führt keine weiteren Befehle aus. In Tabelle 4.2 sind die Sonderzyklen zusammengefasst. Beachten Sie, dass auch Sonderzyklen durch ein READY quittiert werden müssen. A1
Sonderzyklus
1 0
Halt-Zyklus Shutdown-Zyklus
Tab. 4.2:
Sonderzyklen des 80286 (COD/INTA=0, M/IO=1, S1=S0=0)
Sandini Bib 106
Kapitel 4
Sind die Hardware-IRQs aktiviert, ist also das IE-Flag gesetzt, kann der Prozessor gezwungen werden, den Halt-Zustand zu verlassen, indem man einen Hardware-IRQ auslöst. Im PC wird z.B. durch Betätigen der Tastatur ein solcher IRQ aktiviert. Den Shutdown-Zustand beeinflusst das nicht, der Prozessor ignoriert die Anforderung. Um den Shutdown-Zustand zu beenden, muss entweder ein NMI oder ein Prozessor-Reset ausgelöst werden. Diese beenden auch den Halt-Zustand. Der Unterschied zwischen beiden besteht darin, dass bei einem NMI der Prozessormodus nicht verändert wird: Arbeitete der 80286 vor dem Shutdown im Protected Mode, so wird der Betrieb nach einem NMI auch wieder im Protected Mode aufgenommen und der Interrupt-Handler 2 entsprechend dem NMI angesprungen. Demgegenüber versetzt ein Reset den Prozessor stets in den Real Mode und der 80286 beginnt bei CS=f000h, IP=fff0h und zusätzlich aktivierten Adressleitungen A23–A20 mit der Programmausführung. Pipelining Um den Zugriff auf Speicher und Ports möglichst schnell ausführen zu können, unterstützt auch die Busschnittstelle des 80286 ein Adress-Pipelining. Im Gegensatz zum 80386 ist dazu kein NASignal (Next Address) vorgesehen. Der 80286 führt nämlich immer eine Pipelined-Adressierung aus. Das Decodiersystem muss also auf ein solches Pipelining vorbereitet sein. Der 80286 übergibt der Dekodierungslogik die neue Adresse bereits einen Prozessortaktzyklus PCLK vor dem Ende des aktuellen Buszyklusses. Eigentlich dauern die aufeinanderfolgenden Buszyklen drei Prozessorzyklen, durch die Verzahnung der Buszyklen wird die effektive Zeit aber auf zwei Zyklen reduziert.
4.5 Wortgrenzen Der 80286 kann wie alle 80x86-Prozessoren den Speicher byteweise adressieren, obwohl er einen 16-Bit-Datenbus aufweist und der Speicher dadurch als 16-Bit-Speicher organisiert ist. Wir sind also hier mit dem Problem der Wortgrenzen konfrontiert. Bei einem Zugriff auf ein 16-Bit-Wort mit ungerader Adresse muss der 80286 zwei Buszyklen ausführen. Das geschieht in analoger Weise wie beim 80386, wenn dieser Prozessor auf ein Doppelwort zugreift, das nicht an einer Doppelwortgrenze ausgerichtet ist. Auch der 80286 erledigt diesen zweifachen Zugriff selbstständig, sodass Fehlausrichtungen für die Software völlig transparent sind. Die Busschnittstelle setzt die beiden gelesenen Bytes zu einem Wort zusammen (Lesen) bzw. teilt das zu schreibende Wort in zwei Byte auf (Schreiben). Bytes mit gerader Adresse werden dabei über die Leitungen D7 bis D0 des Datenbusses und Bytes ungerader Adresse über D15 bis D8 übertragen. Soll ein Wort mit gerader Adresse transferiert werden, so benutzt der 80286 die Datenpins D15 bis D0 und erledigt den Transfer in einem Buszyklus. Ungerade Worte werden demgegenüber in zwei Buszyklen übertragen, wobei der erste Zugriff über D15–D8 (Byte ungerader Adresse des Wortes) und der zweite Zugriff über D7–D0 (Byte gerader Adresse) erfolgt. Bei den zwei Byte-Zugriffen wird der Speicher physikalisch mit geradzahligen Adressen angesprochen, jedoch nur das jeweils benötigte Byte eingelesen. Dies teilt der Prozessor der Speichersteuerung über BHE und A0 (das niederwertige Adressbit) mit. Damit kann ein einzelnes Byte an eine gerade Adresse 0, 2, ... (BHE=1, A0=0) oder eine ungerade Adresse 1, 3, ... (BHE=0, A0=1) geschrieben bzw. von dieser gelesen werden.
Sandini Bib Kompatibilität nach unten – der 80286
107
Beachten Sie, dass die Prefetch-Queue auch beim 80286 den Code stets in 16-Bit-Worten einliest, die an geraden Speicheradressen beginnen. Aus diesem Grund wird die Prefetch-Queue immer erst dann nachgeladen, wenn in ihr mindestens zwei Byte frei sind. Um auf gerade Speicheradressen zu kommen, liest der Prozessor gegebenenfalls zuerst ein einzelnes Byte ein.
4.6 80286-Reset Ein 80286-Reset wird ausgelöst, indem die Systemsteuerung dem Anschlusspin RESET für mindestens 16 CLK-Zyklen ein Signal mit hohem Pegel zuführt. Kehrt das Signal anschließend auf einen niedrigen Pegel zurück, dann führt der 80286 eine interne Initialisierung aus. In deren Verlauf werden die Register mit den in der Tabelle 4.3 angegebenen Werten geladen. Register
Sonderzyklus Wert
Flag IP CS DS SS ES MSW alle anderen
00000000 00000010 = 0002h 11111111 11110000 = fff0h 00000000 00000010 = f000h1) 00000000 00000000 = 0000h 00000000 00000000 = 0000h 00000000 00000000 = 0000h 11111111 11110000 = fff0h2) 00000000 00000000 = 0000h
1) Basisadresse = ff0000h, Limit = ffffh (Segmentdeskriptor-Cache-Register) 2) PE=MP=EM=RS=0, alle reservierten gleich 1
Tab. 4.3:
80286-Registerinhalte nach einem Reset
Nach einem Reset beginnt der 80286 wegen PE=0 im Maschinenstatuswort stets im Real-Mode. Die GDTR, LDTR und das Task-Register besitzen keine Bedeutung. Damit nimmt der 80286 zunächst wie der 8086 seine Arbeit auf. Nach einem Reset werden außerdem die vier höchstwertigen Adressleitungen A23 bis A20 aktiviert, weil der CS-Basiseintrag im SegmentdeskriptorCache-Register auf ff0000h gesetzt ist. Damit beginnt der 80286 bei der physikalischen 24-BitAdresse fffff0h (16 Bytes unterhalb von 16MByte) mit der Programmausführung. Die vier Adressleitungen A23 bis A20 werden aktiviert, sobald das Code-Segment CS verändert worden ist, beispielsweise durch einen FAR-Sprung. Der Einsprungpunkt des Start-BIOS befindet sich also am oberen Ende des physikalischen Adressraums des 80286. Nach der ersten Änderung des Code-Segments ist dieser Punkt nicht mehr erreichbar. Im 80286 sind im Gegensatz zum 80386 und höher keinerlei Routinen für einen internen Selbsttest implementiert.
Sandini Bib
Sandini Bib
5 Einstieg in die 32-Bit-Welt – Der 80386 Der 80386 ist der erste 32-Bit-Mikroprozessor, der in PCs verwendet wird. Seine grundlegende Architektur wird mit den Nachfolgemodellen (486 bis Pentium III) weitergeführt und jeweils um einige On-Chip-Schaltungselemente (mathematischer Coprozessor, Cache) erweitert, wie es in den entsprechenden Kapiteln genau erläutert ist. Der erste Hersteller der einen Computer mit 80386 erstmalig präsentierte, war nicht IBM, wie es bei den Vorgängermodellen (8088/8086, 80286) der Fall war, sondern die Firma Compaq. Zunächst eine kurze Zusammenfassung der wesentlichsten Eigenschaften dieses 32-Bit-Prozessors:
: : : : : : : :
32-Bit-Vielzweck- und Offsetregister 16-Byte-Prefetch-Queue Speicherverwaltungseinheit (MMU) mit Segmentierungs- und Paging Unit (PU) 32-Bit-Daten- und Adressbus 4 GByte physikalischer Adressraum 64 TByte virtueller Adressraum 64k 8-, 16- oder 32-Bit-Ports Implementierung von Real, Protected und Virtual-8086-Mode
5.1 Anschlüsse und Signale des 80386 Die Steuersignale und Versorgungspannungen werden beim 80386 über insgesamt 124 Anschlüsse ausgetauscht und übernommen. Der 80386 wird in einem Pin-Grid-Array-Gehäuse (PGA) mit 132 Anschlussstiften ausgeliefert. Durch den Fortschritt bei der Integration von elektronischen Schaltkreisen belegen die Anschlüsse eines Chips heute mehr Platz als der Chip selbst. Pin Grid Arrays gehen, im Gegensatz zu Gehäusen mit seitlichen (z.B. DIP) oder umlaufenden Kontakten (z.B. PLCC), sparsam mit dem Platz um, da sie durch die flächenmäßig angeordneten Pins die zweite Dimension erschließen. In Abbildung 5.1 sehen Sie das Anschlussschema des 80386. Im Folgenden möchte ich Ihnen die Anschlüsse und Signale des 80386 vorstellen, über die die CPU mit seiner Umgebung, d.h. dem Hauptspeicher und den verschiedenen Controllern und Treibern, kommuniziert. In der Auflistung bedeutet »I«, dass der 80386 ein Signal am entsprechenden Pin empfängt und »O«, dass er ein Signal am zugehörigen Anschluss abgibt. Ein logisch hoher Pegel ist im Allgemeinen gleich Vcc, d.h. +5 V, ein logisch niedriger Pegel liegt dagegen im Allgemeinen auf Masse (GND) oder 0 V. Bei LV-Modellen (LV für Low Voltage) ist Vcc nur gleich 3,3 V. Dadurch wird die Leistungsaufnahme um etwa 50% vermindert. Ein Signal ohne Querstrich (wie Signal) ist bei aktiv-hoch. Es hat also bei einem hohen Pegel die angegebene Auswirkung oder zeigt bei einem hohen Pegel den entsprechenden Status an. Ein Signal mit Querstrich (wie in Signal) ist dagegen aktiv-niedrig. In der Mikroelektronik werden invertierte Signale entweder durch einen Querstrich (Signal), einen vorangestellten Schrägstrich (/ Signal), einen nachgestellten Stern (Signal*), ein nachgestelltes Nummernzeichen (Signal#) oder eine nachgestellte Tilde (Signal~) gekennzeichnet. In der Auflistung sind die Anschlüsse alphabetisch geordnet.
Sandini Bib 110
Kapitel 5
Markierung für Pin A1 A
B
C
D
E
F
G
H
J
K
L
M
N
P
A15
A16
A17
A20
Vcc GND
A8
A11
A14
A21
A23
A26
A27
A30
GND
A5
A7
A10
A13 GND Vcc
A18 GND A22
A24
A29
A31
Vcc
A3
A4
A6
A9
A12 GND Vcc
A19 GND A25
A28
frei
frei
A2
GND Vcc
D29
Vcc
D31
D27
D26
frei
D28
D25 GND
Vcc
Vcc
1 2 Vcc GND D30
3 4 Vcc GND
5 GND
frei
6 Vcc INTR
i386
frei
D24
7
Pin Grid Array (132 Pins)
ERROR NMI PEREQ
8
GND D23
Vcc
D21
D22
GND D17
D19
D15
D16
D18
GND BUSYRESET
D20
Vcc
9 W/R LOCK
10 D/C GND GND
11 D0
GND
D7
Vcc
D10
D12
D14
frei READY D1
GND
D5
D8
Vcc
D11
D13
D3
D4
D6 HLDA D9
GND
M/IO
frei
Vcc
Vcc
BE0 CLK2 Vcc
BE3
BE2
BE1
NA
frei
12 13 Vcc GND BS16 HOLD ADS GND Vcc
D2
14
Abb. 5.1: Das Anschlussschema des 80386
A31–A2 (O) Anschlüsse A3, B3–B2, C4–C1, D3–D1, E3–E1, F1, G1, H3–H1, J1, K1–K3, L1–L3, M1–M2, N1–N2, P1 Diese 30 Pins bilden die 30 höherwertigen Bits des 32-Bit-Adressbusses. Die zwei niederwertigsten Adressbits A1 und A0 müssen aus den Signalen an den Pins BE0–BE3 ermittelt werden. ADS (O) Anschluss E14 Durch einen niedrigen Pegel des Address-Status-Signals an diesem Pin zeigt der 80386 an, dass die Anschlüsse W/R, D/C und M/IO im Moment gültige Signale zur Definition des Buszyklus und die Pins BE0–BE3 und A31–A2 gültige Adresssignale abgeben. Bei einem hohen Pegel am ADS-Anschluss liegen an den genannten Pins normalerweise nicht-definierte Signale an. BE0–BE3 (O) Anschlüsse A13, B13, C13, E12 Die Byte-Enable-Signale an diesen vier Pins geben an, welche Byte-Gruppen des 32-Bit-Datenbusses im gegenwärtigen Buszyklus auch wirklich gültige Daten übertragen, also aktiv sind. BE0 entspricht dabei dem niederwertigen Datenbyte D0–D7, BE3 dem höchstwertigen Datenbyte D24–D31. Erlaubt sind alle Kombinationen der BEx (x=0 bis 3), solange nicht zwischen zwei aktiven BEx ein inaktives BEx liegt. Wenn der 80386 z.B. ein Wort (2 Byte) über die Datenpins D23–D8 ausgibt, so setzt er BE2 und BE1 auf einen niedrigen (aktiven) und BE3 und BE0 auf einen hohen (inaktiven) Pegel. Aus BE0–BE3 können Sie problemlos die zwei niederwertigsten Adressbits A1 und A0 ermitteln.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
111
BS16 (I) Anschluss C14 Wenn ein externer Treiber oder eine externe Logik diesem Pin (Bus Size 16) ein Signal mit niedrigem Pegel zuführt, betreibt der 80386 seinen Datenbus mit einer Breite von nur 16 statt der üblichen 32 Bit. Hierdurch kann der 80386 direkt mit einem System verbunden werden, das nur einen 16-Bit-Datenbus aufweist. Es sind keine zusätzlichen externen Bausteine erforderlich, um einen 32-Bit-Wert in zwei 16-Bit-Werte zu zerlegen oder umgekehrt zwei 16-Bit-Werte zu einem 32-Bit-Wert zusammenzufügen, das macht die Buseinheit im 80386 automatisch. Beim 8086 und 80286 z.B. ist ein 16/8-Bit-Datenumsetzer notwendig, um dem Prozessor mit 16-Bit-Datenbus einen Zugriff auf die Slots mit einer Datenbusbreite von 8 Bit zu ermöglichen. BUSY, ERROR (I, I) Anschlüsse B9, A8 Die Signale teilen dem 80386 den Status eines Coprozessors (i. Allg. des 80387) mit. Ist BUSY aktiv, so arbeitet der Coprozessor gerade einen Befehl ab und kann keine weiteren Befehle annehmen. Ist das Signal ERROR aktiv, so löst der 80386 einen Coprozessor-Interrupt aus, wenn er bestimmte ESC-Sequenzen oder einen WAIT-Befehl ausführt. CLK2 (I) Anschluss F12 Diesem Pin wird das Taktsignal eines externen Oszillators zugeführt. Der 80386 teilt das externe Taktsignal CLK2 intern durch zwei, um den effektiven Prozessortakt PCLK zu bilden. CLK2 ist also doppelt so hoch wie der Prozessortakt (daher auch die »2«). Achtung: Alle Taktangaben und die Angabe der Taktzyklen zur Ausführung eines Befehls beziehen sich auf den Prozessortakt PCLK. D31–D0 (I/O) Anschlüsse H12–H14, J14, K14–K12, L14–L13, M12–M11, M9, M6, M5, N14–N8, N6, N5, P13–P9, P7, P5–P3 Die 32 Pins bilden den bidirektionalen 32-Bit-Datenbus des 80386 zur Datenein- und Datenausgabe. Der Datenbus kann durch den BS16-Eingang als 32-Bit- oder 16-Bit-Datenbus konfiguriert werden. Beachten Sie aber, dass der 80386 bei Schreiboperationen stets alle 32 Signale treibt, auch wenn die Busgröße nur 16 Bit beträgt. HOLD, HLDA (I, O) Anschlüsse D14, M14 Die zwei Bus-Hold-Request- und Bus-Hold-Acknowledge-Anschlüsse dienen zur Busarbitrierung, d.h. zur kontrollierten Übergabe der Steuerung des lokalen Busses zwischen verschiedenen lokalen Busmastern. Möchte ein anderer Busmaster als die CPU die Steuerung übernehmen, so aktiviert er den HOLD-Eingang des 80386. Kann dieser die Steuerung abgeben, ist die Abgabe also z.B. nicht durch ein LOCK gesperrt, so reagiert er mit einem Signal HLDA, um dem anfordernden Busmaster die Steuerung des lokalen Busses zu übergeben. Der neue Busmaster hält das Signal HOLD solange aktiv, wie er die Kontrolle über den lokalen Bus benötigt. Anschließend deaktiviert er HOLD und der 80386 kann den lokalen Bus erneut übernehmen, um z.B. Daten aus dem Speicher zu lesen.
Sandini Bib 112
Kapitel 5
INTR (I) Anschluss B7 Dieses Eingangssignal wird nach dem Abschluss eines jeden Befehls abgetastet, um zu ermitteln, ob eine Interrupt-Anforderung eines Hardware-Bausteins vorliegt. Ein hoher Pegel zeigt an, dass gerade eine Interrupt-Anforderung durch eine Hardware-Einheit vorliegt. Die Abtastung (und dadurch die IRQ-Erkennung) kann durch ein gelöschtes Interrupt-Flag IE verhindert (maskiert) werden. LOCK (O) Anschluss C10 Ist LOCK aktiv (auf einem niedrigen Pegel), so kann der Prozessor den lokalen Bus nicht an einen anderen Prozessor abgeben. Der 80386 führt dann einen Locked-Buszyklus (oder gesperrten Buszyklus) aus und reagiert auf die HOLD-Anforderung nicht mit einem Acknowledge (HLDA). M/IO, D/C, W/R (O, O, O) Anschlüsse A12, A11, B10 Die Signale Memory/IO, Data/Control und Write/Read an diesen Pins legen die Art des gegenwärtigen Buszyklus fest. Die möglichen Signalkombinationen haben folgende Bedeutungen:
: : : : : : : :
(000)
Interrupt-Acknowledge-Sequenz
(001)
ungültig
(010)
Lesen eines I/O-Ports
(011)
Schreiben eines I/O-Ports
(100)
Lesen eines Befehls aus dem Speicher (Befehls-Prefetching)
(101)
HALT, wenn BE0=BE1=BE3=high, BE2=low oder Shutdown, wenn BE0=low, BE1=BE2=BE3=high
(110)
Lesen von Daten aus dem Speicher
(111)
Schreiben von Daten in den Speicher
NA (I) Anschluss D13 Das Next-Address-Signal dient zur Implementierung eines Adress-Pipelinings. Das Adressdekodiersystem des Computers zeigt durch ein Signal mit niedrigem Pegel an diesen Pin an, dass es bereits neue Werte für BE0–BE3, A2–A31, W/R, D/C und M/IO zum Dekodieren übernehmen kann, auch wenn der gegenwärtige Buszyklus noch nicht durch ein READY beendet worden ist. Dadurch führt der 80386 ein Adress-Pipelining aus. NMI (I) Anschluss B8 Wird diesem Anschluss ein Signal mit hohem Pegel zugeführt, so löst der 80386 einen Interrupt 2 aus, der im Gegensatz zu INTR durch das Interrupt-Flag IE nicht maskiert werden kann. Es handelt sich also um einen nicht-maskierbaren Interrupt (Non Maskable Interrupt, NMI). Nach Abschluss des gerade ausgeführten Befehls unterbricht der 80386 in jedem Fall die Programmausführung und bedient zunächst den Interrupt.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
113
PEREQ (I) Anschluss C8 Ein aktives Processor-Extension-Request-Signal an diesem Pin zeigt dem 80386 an, dass der Coprozessor Daten zum 80386 übertragen möchte. Weil der 80387 keine Speicherverwaltungsund Paging-Einheit besitzt, muss der 80386 alle Speicherzugriffe für den 80387 erledigen, um die Zugriffsberechtigungen zu kontrollieren und das Paging auszuführen. READY (I) Anschluss G13 Das Signal an diesem Pin gibt an, ob das adressierte Peripheriesystem, z.B. der Hauptspeicher oder ein I/O-Gerät, den Zugriff ausgeführt hat (READY auf niedrigem Pegel) oder dazu noch mehr Zeit benötigt (READY auf hohem Pegel). Speicherbausteine oder Peripheriegeräte, die für die hohe Taktrate des 80386 zu langsam reagieren, weisen den 80386 mit Hilfe des READY-Signals an, einen oder mehrere Wartezyklen (Waitstates) einzulegen. Der 80386 wartet also, bis das adressierte Subsystem den Zugriff abgeschlossen hat. Ein Waitstate ist ein Prozessortaktzyklus oder zwei CLK2-Taktzyklen lang. RESET (I) Anschluss C9 Liegt dieser Eingang mindestens 15 CLK2-Zyklen lang auf einem hohen Pegel, dann bricht der 80386 seine Tätigkeit vollständig ab und führt einen internen Prozessor-Reset aus. Vcc (I) Anschlüsse A1, A5, A7, A10, A14, C5, C12, D12, G2–G3, G12, G14, L12, M3, M7, M13, N4, N7, P2, P8 Diesen Anschlüssen wird die Versorgungsspannung (üblicherweise +5 V) zugeführt, um den 80386 mit Strom zu versorgen. GND (I) Anschlüsse A2, A6, A9, B1, B5, B11, B14, C11, F2–F3, F14, J2–J3, J12–J13, M4, M8, M10, N3, P6, P14 Diese Anschlüsse liegen auf Masse (üblicherweise 0 V). frei Anschlüsse A4, B4, B6, B12, C6–C7, E13, F13 Die Anschlüsse sollten stets in einem freien (schwebenden) Zustand gehalten werden und werden nicht auf ein festes Potential (GND, Vcc) gelegt.
5.2 Der physikalische Speicher- und Portzugriff Die oben beschriebenen Signale des Prozessorchips benötigen einen entsprechenden Verbindungsweg zum Speicher und zu den Support-Chips. Der Prozessor kann für sich allein zunächst also überhaupt nichts bewirken, weil ihm die Verbindung zu den weiteren wichtigen Komponenten eines Computers fehlt, nämlich der CPU-Bus. Der Bus ist üblicherweise in einen Datenbus zur Übertragung von Daten zwischen dem 80386 und dem Hauptspeicher, einen Adressbus, dessen Signale angeben, welche Daten angesprochen (adressiert) werden sollen und einen Steuerbus, der die für einen reibungslosen Ablauf der Übertragung notwendigen Steuersignale zur Verfügung stellt, gegliedert. Der 80386 besitzt einen 32-Bit-Datenbus, kann also vier Byte in einem Rutsch verschieben. Adressiert werden die Daten über einen 32-Bit-Adressbus, sodass 232 = 4 GByte Dateneinheiten zugänglich sind. Außerdem gibt der 80386 insgesamt 17 Steuersignale ab oder nimmt sie entgegen, er weist einen 17-Bit-Steuerbus auf.
Sandini Bib 114
Kapitel 5
Ein Buszyklus, bei dem Daten gelesen oder geschrieben werden, folgt einer eindeutig und streng definierten Abfolge von Adress-, Daten- und Steuersignalen. Um einen reibungslosen Ablauf der Datenübertragungen zu ermöglichen, werden die Signale vom Mikroprozessor normalerweise nicht direkt zur Ansteuerung des Speichers oder des Systembusses verwendet. Vielmehr ist ein zusätzlicher Buscontroller vorhanden, der alle Bussignale für das Speichersubsystem mit ausreichender Stärke zur Verfügung stellt. Der Buscontroller ist auf Grund der erzielten Hochintegration heute zusammen mit den Adressund Datenpuffern sowie zusätzlichen Steuerschaltungen Bestandteil eines einzigen Systemcontrollers. Er umfasst außerdem die Funktionen früherer Supportchips, wie z.B. dem DMA-Chip 8237, dem programmierbaren Intervall-Timer 8253/8254 und dem programmierbaren Interrupt-Controller 8259. Abbildung 5.2 zeigt den prinzipiellen Signalpfad zwischen Prozessor und Speicher. CLK
AdressmultiAdreßmultiplexer plexer Speicherpuffer
BEx, ADS, ...
Speichersteuerung
i386 80386
D31..D0
Datenpuffer
A31...A2
Bussteuerung
CLK
Adresspuffer Adreßpuffer
Taktgenerator
A10...A0
Din Dout
Hauptspeicher
RAS, CAS, WE, ...
Systemcontroller Abb. 5.2: Der Pfad zwischen Prozessor und Hauptspeicher: Der Prozessor greift normalerweise nicht unmittelbar auf den Speicher zu. Stattdessen befinden sich zwischen der CPU und dem RAM ein Buscontroller zur Erzeugung der Steuersignale für den Bus und verschiedene Puffer zur Zwischenspeicherung und Verstärkung der Daten- und Adresssignale. Die Speichersteuerung kontrolliert den Hauptspeicher, sodass dieser auch die korrekten Daten liefert oder an der richtigen Stelle schreibt. Die in der Abbildung als individuelle Komponenten dargestellten Puffer- und Steuerbausteine sind heute Teil eines einzigen hochintegrierten Systemcontrollers.
Möchte die CPU Daten aus dem Speicher lesen, so gibt sie über ihren Adressbus eine Adresse an den Adresspuffer aus. Dieser nimmt die Adressbits an und verriegelt sie, wenn das Signal ADS aktiv ist. BE0–BE3 definieren hier noch, welche Datenbusleitungen auch tatsächlich Daten übertragen sollen. Um das richtige Wort im Hauptspeicher ansprechen zu können, ist ein Adressmultiplexer vorhanden, der mit Unterstützung der Speichersteuerung das gewünschte Wort im Hauptspeicher auswählt. Die so gelesenen Daten werden vom Hauptspeicher zum Speicherpuffer übergeben. Anschließend überträgt der Speicherpuffer die gelesenen Daten an den Datenpuffer, aus dem wiederum der 80386 die Daten einlesen kann. Das dargestellte Schema betrifft ein Speichersystem ohne zwischengeschalteten Cache. Außerdem können Speicher- und Datenpuffer identisch sein, sodass keine Extraübertragung vom Speicher- zum Datenpuffer auftritt.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
115
Die Abstimmung all dieser Vorgänge, d.h. die Ansteuerung der Puffer- und Steuerschaltkreise, geschieht durch das Taktsignal vom Taktgenerator. Ohne dieses Signal würde ein vollkommenes Durcheinander herrschen, eine geordnete Übertragung von Daten wäre unmöglich. Die Taktsignale bewirken aber eine korrekte Ausführung und lassen den jeweiligen Schaltkreisen genügend Zeit, ihre Aufgabe zu erfüllen. Erhöht man die Taktrate, so wird irgendwann der Punkt erreicht, an dem ein Chip oder auch mehrere nicht mehr »mitkommen« und es werden völlig unvorhersehbare Werte eingelesen. Der Rechner stürzt ab. Wie Sie in Abbildung 5.2 sehen, können Daten- und Steuerbus Signale in beide Richtungen übertragen. Sie bilden daher einen bidirektionalen Bus. Auf dem Steuerbus werden in erster Linie das READY- und die verschiedenen Signale zur Definition des gegenwärtigen Buszyklus (M/IO, D/C, W/R) übertragen. Demgegenüber gibt der 80386 zwar Adressen aus, liest aber natürlich niemals welche ein. Dieser Teil des Systembus ist daher unidirektional.
5.2.1
Der Buszyklus für einen Lesezugriff
In Abbildung 5.3 sehen Sie den zeitlichen Verlauf der wichtigsten Signale auf dem Systembus zum Lesen von Daten. Der 80386 kann den Zugriff wahlweise ohne oder mit Pipelined-Adressierung ausführen, entscheidend ist der Pegel des Signals NA. Für das Lesen von Daten ohne Adress-Pipelining und Waitstates sind beim 80386 die folgenden Signale maßgeblich:
: : : :
das externe Taktsignal CLK2 vom Taktgenerator, die Adress- und Statussignale BE0–BE3, A2–A31 und ADS vom Prozessor, das Signal NA vom Systemcontroller zur Steuerung des Adress-Pipelinings, die Datensignale D0–D31 vom Speicher und das READY-Signal, um den Abschluss des Datenlesevorgangs im Speicher anzuzeigen.
Der in Abbildung 5.3 gezeigte typische Buszyklus des 80386 zum Lesen von Daten aus dem Speicher ohne Waitstates benötigt für einen solchen Buszyklus mindestens vier Taktzyklen von CLK2, das entspricht zwei Prozessortaktzyklen PCLK. Ein 40-MHz-80386 kann also 20 Millionen Buszyklen je Sekunde ausführen. Theoretisch erreicht der 80386 mit seinem 32-Bit-Datenbus eine Übertragungsrate von 80 MByte pro Sekunde. Jeder Buszyklus ist in zwei Abschnitte T1 und T2 aufgeteilt. T1 bezeichnet den so genannten Statuszyklus, T2 den Befehlszyklus (Command-Cycle). Die beiden Zyklen sind jeweils genau einen Prozessortaktzyklus PCLK oder zwei Systemtaktzyklen CLK2 lang. Im Verlauf des Statuszyklus T1 gibt der 80386 die Steuer- und Adresssignale aus, beim Schreiben von Daten zusätzlich auch die Datensignale D31 bis D0. Das Signal NA wird vom Systemcontroller getrieben und zur Steuerung des Adress-Pipelinings verwendet. Ein aktives Signal NA (mit niedrigem Pegel) weist den 80386 an, die Adresse für den folgenden Buszyklus dem Systemcontroller bereits vor dem Abschluss des gegenwärtigen Zyklus zur Verfügung zu stellen. Details hierzu erfahren Sie im weiteren Verlauf des Kapitels.
Sandini Bib 116
Kapitel 5
Lesezyklus 1
Lesezyklus 2
Lesezyklus 3
T1
T1
T1
T2
T2
T2
CLK2 PCLK BE0-BE3,A2-A31
gültig (Zyklus 1)
gültig (Zyklus 2)
gültig (Zyklus 3)
ADS NA READY D0-D31
Daten(1)
Daten(2)
Daten(3)
Zugriffszeit
(a) Lesezyklus ohne Adress-Pipelining Lesezyklus 1
Lesezyklus 2
Lesezyklus 3
T1
T1
T1
T2
T2
T2
CLK2 PCLK BE0-BE3,A2-A31
gültig (Zyklus 1)
gültig (Zyklus 2)
gültig (Zyklus 3)
Daten(1)
Daten(2)
ADS NA READY D0-D31
Daten(3)
Zugriffszeit
(b) Lesezyklus mit Adress-Pipelining Abb. 5.3: Der 80386 kann wahlweise ohne (Abbildung 5.3 (a)) und mit Pipelined-Adressierung (Abbildung 5.3 (b)) arbeiten. Der Prozessor gibt zunächst die Adresse aus und wartet dann auf die Daten vom Hauptspeicher. Die Zugriffszeit ist die Zeitspanne zwischen der Ausgabe der Adresse durch den 80386 und der Übergabe der Daten vom Hauptspeicher.
Die Adresssignale A31 bis A2 definieren die Adresse eines Doppelworts im Speicher (bei Vernachlässigung der Adressbits A1 und A0 ist jede Adresse A31–A2 ein Vielfaches von vier, referiert also ein Doppelwort zu 32 Bit). Die Signale BE0 bis BE3 geben an, ob ein einzelnes Byte, ein Wort oder ein Doppelwort gelesen werden soll und legen das oder die jeweils gültigen Byte innerhalb des adressierten Doppelwortes fest. Das Signal ADS vom 80386 zeigt an, dass die Adress- und Steuersignale nun gültig sind. Der Lesevorgang ist damit eingeleitet worden, und das READY-Signal steigt auf einen hohen Pegel an, wird also inaktiv. Es wird erst wieder auf einen niedrigen Pegel sinken, wenn der Speicher die gewünschten Daten an den Datenpuffer ausgegeben hat. Die Speichersteuerung leitet einen internen Lesevorgang des Hauptspeichers ein und der Adressmultiplexer adressiert die entsprechenden Daten im Hauptspeicher.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
117
Im Verlauf des Befehlszyklus T2 führt der Speicher (oder eine andere Peripherieeinheit) die Leseanforderung des 80386 aus, übergibt den Datenpuffern die gelesenen Datenbytes und zieht READY auf einen niedrigen Pegel, um die Vervollständigung des internen Lesevorgangs anzuzeigen. Der Datenpuffer verstärkt und verriegelt die Daten. Anschließend liest der 80386 die Daten aus dem Datenpuffer ein und schließt den Buszyklus ab. Nach dem Ende des Zyklus T2 befindet sich der Systembus wieder im Anfangszustand. Es kann nun ein neuer Lesevorgang oder ein Schreibvorgang beginnen. Sollen keine Daten übertragen werden, dann bleibt der Bus zunächst in einem Wartezustand, bis der 80386 durch entsprechende Steuersignale anzeigt, dass er erneut Daten lesen oder schreiben möchte. Abbildung 5.3 zeigt auch die Zugriffszeit auf den Speicher, d.h. die Zeit, die verstreicht, bis der Speicher eine Leseanforderung mit der Ausgabe der Daten beantwortet hat. Die Zugriffszeit ist die Zeitspanne zwischen dem Anlegen eines gültigen Adresssignals an den Speicher und der Ausgabe gültiger Daten durch ihn. Die Taktfrequenz und Reaktionszeiten der Schaltkreise zwischen Prozessor und Hauptspeicher sind vom elektronischen Design des Computersystems fest vorgegeben. Der Speicher muss sich also nach der geforderten Zugriffszeit richten, und nicht die CPU. In Abbildung 5.3 erkennen Sie, dass die Zugriffszeit der Speicherbausteine ohne Waitstates höchstens drei Taktzyklen CLK2 oder 1,5 Prozessortaktzyklen PCLK betragen darf, nämlich die Zeitspanne von der Ausgabe der Adresse bis zur Gültigkeit der Daten auf dem Bus. Außerdem kommen Signallaufzeiten in den Pufferschaltkreisen hinzu, sodass in der Praxis die für die Speicherbausteine geforderte Zugriffszeit sogar noch kürzer ist. Wenn die Speicher-Chips diese Forderung nicht erfüllen können, muss der 80386 warten, was durch READY gesteuert wird.
5.2.2
Der Buszyklus für einen Schreibzugriff
Beim Schreiben von Daten in den Speicher laufen ähnliche Vorgänge wie beim Lesen ab. In Abbildung 5.4 sehen Sie den Verlauf der wichtigsten Signale für einen 80386-Schreibzyklus ohne Adress-Pipelining. Schreibzyklus 1 T1
T2
Schreibzyklus 2 T1
T2
Schreibzyklus 3 T1
T2
CLK2 PCLK BE0-BE3,A2-A31
gültig (Zyklus
1)
gültig (Zyklus
2)
gültig (Zyklus
3)
ADS W/R NA READY D0-D31
Schreibdaten(1)
Schreibdaten(2)
Schreibdaten(3)
Abb. 5.4: Im Gegensatz zum Lesezyklus gibt der 80386 bei einem Schreibvorgang nicht nur die Speicheradresse, sondern bereits kurz danach auch die Schreibdaten aus.
Sandini Bib 118
Kapitel 5
Über das Steuersignal W/R mit hohem Pegel (W=Write ist also maßgeblich, nicht R=Read) zeigt der 80386 dem Adressierungs- und Speichersubsystem an, dass er Daten in den Speicher schreiben möchte. Zu Beginn von T1 gibt der Prozessor dann zunächst die Adresse auf den Adressbus und am Ende des ersten CLK2-Zyklus von T1 zusätzlich die Schreibdaten auf den Datenbus aus. Der Datenpuffer nimmt die Schreibdaten mit einem aktiven ADS an und überträgt sie an den Speicherpuffer. Gleichzeitig steuert die Speichersteuerung den Hauptspeicher an, um die internen Speicherzellen zu adressieren und den internen Schreibvorgang auszuführen. Wenn das Speichersubsystem den internen Schreibvorgang abgeschlossen hat, senkt die Speichersteuerung das Signal READY auf einen niedrigen Pegel ab, um dem Prozessor die Ausführung des Schreibzugriffs mitzuteilen. Der 80386 beendet den Schreibvorgang, indem er die Puffer deaktiviert und den Systembus wieder in den Anfangszustand versetzt. Auch beim Schreiben ermöglicht das Signal READY eine flexible Reaktion auf Verzögerungen im angesprochenen Speicher, indem der Speicher Wartezyklen anfordert. Dazu im folgenden Abschnitt mehr.
5.2.3
Waitstates oder Wartezyklen
Können der Speicher oder die Peripherie-Chips innerhalb der beiden Zyklen T1 und T2 eine Lese- oder Schreibanforderung nicht abschließen, dann hält die Speichersteuerung (oder allgemeiner: die Steuerung der adressierten Einheit) das READY-Signal an den 80386 auf einem hohen Pegel. Damit wird dem 80386 signalisiert, dass er einen weiteren Befehlszyklus T2 einlegen soll, um dem Speicher oder dem Peripherie-Chip mehr Zeit zu geben, die Anforderung auszuführen. Das bezeichnet man als Wartezyklus oder Waitstate. Wenn auch nach Abschluss des zusätzlichen T2s das READY-Signal weiter auf einem hohen Pegel liegt, legt der Prozessor einfach noch einen Wartezyklus ein (oder noch einen und noch einen ...). In Abbildung 5.5 sehen Sie einen Schreibbuszyklus mit einem Waitstate (oder Wartezyklus). Schreibzyklus T1
Lesezyklus #n+1
#n T2
T2
T1
T2
CLK PCLK Transfer in 2 PCLK-Zyklen
Transfer in 3 PCLK-Zyklen Zugriffszeit: 3,5 PCLK-Zyklen
A31...A2
Adresse
#n
gültig
Adresse
#n+1
gültig
ADS READY D31...D0 Schreibdaten
#n
gültig
Lesedaten
#n+1
gültig
Abb. 5.5: Der Prozessor fügt einen oder mehrere Waitstates ein, wenn die adressierte Einheit dem schnell getakteten Prozessor nicht folgen kann und das READY-Signal nicht schnell genug deaktiviert.
Der n-te Buszyklus führt in der Abbildung zu einem Wartezyklus, der (n+1)-te jedoch nicht. Der 80386 hält die Schreibdaten bis zum Ende des ersten Systemtaktes CLK2 nach dem letzten T2 des
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
119
gegenwärtigen Buszyklus aktiv. Folgen zwei Buszyklen unmittelbar aufeinander, dann heißt das, dass die Schreibdaten mindestens bis zum Ende des ersten Systemtaktes CLK2 des nächsten Buszyklus aktiv sind. Natürlich kann sich die Anzahl der Wartezyklen für das Schreiben von Daten von derjenigen beim Datenlesen unterscheiden. DRAM-Hauptspeicher können Daten nämlich häufig schneller schreiben als lesen. Ursache ist, dass es beim Schreiben eigentlich genügt, der Speichersteuerung Adresse und Wert der Datenbytes zu übergeben. Die Speichersteuerung führt den Schreibvorgang mit den im Daten- oder Speicherpuffer abgelegten Daten selbstständig aus, während sich der 80386 bereits einem anderen Vorgang widmen kann und nicht erst auf den Abschluss des Schreibvorgangs durch das relativ langsame Speichersubsystem warten muss. Demgegenüber bleibt der CPU beim Lesen nichts anderes übrig, als bis zum Abschluss des internen Lesevorgangs im Hauptspeicher zu warten. Vorher stehen keine Daten zur Verfügung. Die Anzahl der Wartezyklen kann auch noch vom Ort des Speichers abhängig sein. Der Hauptspeicher auf dem Motherboard läuft üblicherweise mit erheblich weniger Waitstates wie z.B. der Video-RAM auf dem Grafikadapter, der beim PC ebenfalls Bestandteil des physikalischen 80386Adressraums ist. Hier können dann durchaus bis zu zehn Waitstates auftreten. Die Ursache ist aber nicht, dass schlechte Speicherchips verwendet werden, sondern die niedrige Taktrate von 8 MHz der Steckkartenverbindung (ISA-Bus) zum Adapter. Früher war die Anzahl der Waitstates durch das Board-Design fest vorgegeben oder konnte durch einen Jumper gewählt werden, je nachdem wie schnell die eingesetzten Speicherchips waren. Die Speichersteuerung reagierte dann standardmäßig mit einer festgelegten Verzögerung des READY-Signals. Dieses Verfahren ist heute veraltet. Moderne und leistungsfähige Konzepte wie Cache-Speicher oder Page-Interleaved-Speicher, beruhen auf statistischen Überlegungen und verlangen dadurch eine flexible Ausgabe des READY-Signals, weil die genaue Anzahl von Wartezyklen für den einzelnen Speicherzugriff nicht exakt vorhersehbar ist. Sie fordern in Abhängigkeit von der konkreten Situation eine flexible Zahl von Wartezyklen. So ist auch bei einem mit 40 MHz getaktetem 80386-PC z.B. beim Zugriff auf den Cache-Speicher kein Wartezyklus notwendig, während ein Zugriff auf den normalen Hauptspeicher typischerweise zwei Wartezyklen erfordert.
5.2.4
Adress-Pipelining oder Pipelined-Adressierung
Um den Zugriff auf Speicher und Ports möglichst schnell ausführen zu können, unterstützt die Busschnittstelle des 80386 ein Adress-Pipelining. Sehen wir uns hierzu Abbildung 5.3 (b) an. In der Abbildung erkennen Sie, dass der 80386 die Adresssignale für den nächsten Buszyklus bereits vor dem Ende des gegenwärtigen Buszyklus ausgibt. Das ist möglich, weil der Prozessor die Adresse der anzusprechenden Speicherstelle nur im Statuszyklus bereitstellen muss. Die Signale werden ja mit der Aktivierung von ADS in die Adresspuffer übernommen und vom Adressdekoder dekodiert. Dabei ist wichtig, dass der Dekoder seine Arbeit beendet, d.h. die Adresse dekodiert hat, bevor der Speicher Daten annimmt (Schreiben) oder Daten an den Prozessor übergibt (Lesen). Während der Hauptspeicher die ausgewählte Speicherstelle intern liest (oder schreibt) ist die Adressierungslogik in der Verbindung Prozessor-Speicher praktisch »arbeitslos« und wartet lediglich auf die nächste zu dekodierende Adresse. In gleicher Weise ist die Datenübertragungslogik nicht aktiv, wenn der Adressdekoder die nächste Adresse dekodiert. Der 80386 kann also dem Adressdekoder bereits die nächste Adresse übergeben, während die Datenübertragungslogik noch mit dem Lesen oder Schreiben von Daten beschäftigt ist. Die Dekodierlogik und die Adresspuffer können daher schon im Voraus arbeiten. Aufeinanderfol-
Sandini Bib 120
Kapitel 5
gende Zugriffe werden verzahnt: die Adressierungslogik erhält die neue Adresse bereits einen Prozessortaktzyklus PCLK vor dem Ende des gegenwärtigen Buszyklus. Dadurch dauern die aufeinanderfolgenden Buszyklen eigentlich drei Prozessorzyklen, durch die Verzahnung der Buszyklen wird die effektive Zeit aber auf zwei PCLK-Zyklen reduziert. Diese verzahnte oder überlappende Ein- und Ausgabe von Daten und Adressen aufeinanderfolgender Buszyklen wird als Pipelined-Adressierung oder Adress-Pipelining bezeichnet. Die Signale »fließen« wie in einer Pipeline unaufhörlich. Abbildung 5.6 zeigt diese Überlappung von Buszyklen. 2
PCLK-Zyklen
2
PCLK-Zyklen
2
PCLK-Zyklen
CLK
us
#N-2 Buszyklus
#N-1 Buszyklus
#N
z
y
k
l
e
n
PCLK
#N+1 Buszyk
B
u
s
Buszyklus
Abb. 5.6: Bei aktiver Pipelined-Adressierung gibt der Prozessor die folgende Adresse aus, bevor der gegenwärtige Buszyklus abgeschlossen ist. Dadurch kann die adressierte Einheit die neue Adresse bereits dekodieren, während die vorherigen Daten noch übertragen werden.
Die Pipelined-Adressierung hat aber nur dann einen Vorteil, wenn mehrere Speicherzugriffe hintereinander ausgeführt werden. Beim ersten Zugriff muss der Prozessor das Pipelining zunächst »anwerfen«, indem er die Adresse des ersten Zugriffs ausgibt. Ähnliches gilt auch für das Fließband von Automobilherstellern: Bis das erste Auto das Fließband fertig verlässt, sind mehrere Stunden vergangen. Wurde das Fließband (oder die »Auto-Pipeline«) einmal geladen, so verlässt alle paar Minuten ein Wagen die Montagehalle. Die Pipelined-Adressierung ist also vor allem bei umfangreichen Speicherzugriffen vorteilhaft, wie sie z.B. bei einem Task Switch oder dem Laden der Cache-Register des Prozessors im Protected Mode auftreten. Die Pipelined-Adressierung wird durch das (externe) Steuersignal NA für den 80386 gesteuert. Der Systemdesigner kann dadurch flexibel zwischen einer Adressierung mit und ohne AdressPipelining wählen. Das Besondere ist, dass die Wahl während des 80386-Betriebs quasi online individuell für jeden Buszyklus erfolgen kann. Der 80386 kann also zwischen einem Zugriff mit und ohne Adress-Pipelining umgeschaltet werden. Betrachten Sie dazu nochmals Abbildung 5.3. Sie erkennen, dass ohne Adress-Pipelining das Signal NA stets auf einem hohen Pegel liegt, d.h. inaktiv ist. Die Adresssignale BE0–BE3 und A31–A2 werden zu Beginn des Lesezyklus ausgegeben und sind bis zum Ende des jeweiligen Lesezyklus gültig. Der Abstand zwischen der Ausgabe der Adresssignale und der Übergabe der Daten (also die Zugriffszeit) beträgt hier etwa drei CLK2-Zyklen.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
121
Nur wenn NA von der externen Speicheradressierungslogik rechtzeitig auf einen niedrigen Pegel gezogen wird, führt der 80386 ein Adress-Pipelining aus. Der 80386 gibt dann die erforderlichen Adresssignale schon während der zweiten Hälfte des vorangegangenen Buszyklus aus. Der Abstand zwischen Ausgabe der Adresse und Empfang der Daten beträgt in diesem Fall fünf CLK2-Zyklen. Für den Zugriff stehen also zwei CLK2-Zyklen oder ein interner Prozessortakt PCLK mehr zur Verfügung, ohne dass die Datenübertragungsrate zwischen CPU und Speicher sinken würde. Anders ausgedrückt: Die Zahl der Wartezyklen beim Zugriff auf den Speicher kann um eins vermindert oder es können langsamere Bausteine verwendet werden, ohne dass die Anzahl der Waitstates zunimmt. Adress-Pipelining ist für den Zugriff auf langsame Speicherbausteine vorteilhaft. Im Allgemeinen arbeitet der 80386 bei der Adressierung von langsamen DRAM-Bausteinen mit Adress-Pipelining. Ist ein Cache-Speicher mit sehr geringer Zugriffszeit vorhanden, so ist kein Adress-Pipelining erforderlich, da die SRAM-Bausteine des Caches schnell genug sind, um die Daten auch ohne Adress-Pipelining mit 0 Wartezyklen auszugeben. Das Pipelining wurde mit dem 80286 (allerdings in einer nicht ganz so flexiblen Weise wie beim 80386) eingeführt. Der Ur-80x86-Prozessor, nämlich der 8086, konnte das noch nicht, weil er im Gegensatz zum 80286 einen kombinierten Adress-/Datenbus aufweist. Der Bus ist also während der späteren Datenübertragungsphase von den Daten belegt und kann nicht zu einer frühzeitigen Übergabe der folgenden Adresse verwendet werden.
5.2.5
Doppelwortgrenze
Der 80386 stellt einen 32-Bit-Prozessor mit 32-Bit-Datenbus dar. Dadurch ist der Hauptspeicher physikalisch üblicherweise als 32-Bit-Speicher organisiert (eine 16-Bit-Organisation wie beim Vorgänger 80286 würde die Busbandbreite ja halbieren). Das bedeutet, dass der 80386 den Speicher physikalisch stets an den Byte-Adressen 0, 4, 8, ..., 4G-4 anspricht. Logisch können Doppelworte (32-Bit) zwar an Adressen beginnen, die nicht ein Vielfaches von vier sind. Physikalisch kann das Doppelwort an einer solchen Adresse jedoch nicht auf einmal gelesen oder geschrieben werden. Soll ein Doppelwort an einer Adresse abgespeichert oder gelesen werden, die keine solche Doppelwortadresse darstellt, so teilt die Busschnittstelle des 80386 diesen Doppelwortzugriff in zwei Zugriffe auf. Der erste Zugriff liest oder schreibt den niederwertigen Anteil des Doppelworts, der zweite den höherwertigen Anteil. Ein solcher Doppelwortanteil ist zwischen einem und drei Byte lang (vier Byte würden ja einen einfachen Doppelwortzugriff an einer Doppelwortadresse bedeuten). Dieser Vorgang ist für die Software vollständig transparent, die Hardware des 80386 erledigt die Aufteilung und den zweifachen Speicherzugriff ohne Einwirkung der Software. Damit kann der Programmierer Daten in beliebiger Form anordnen, ohne dass er sich um Doppelwortgrenzen kümmern muss. Bei den zwei Teilzugriffen wird der Speicher physikalisch zwar mit Doppelwortadressen 0, 4, etc. adressiert, aber nur die durch BE0 bis BE3 festgelegten Bytes werden gelesen oder geschrieben. Nebenbei bemerkt kann der 80386 dadurch auch einzelne Bytes oder 16-Bit-Worte schreiben und lesen. Wenn er nicht gerade ein 16-Bit-Datenwort eine Doppelwortgrenze überschreitet, genügt dann auch in jedem Fall ein einziger Zugriff.
Sandini Bib 122
Kapitel 5
1.Buszyklus
2.Buszyklus
2f0b 2f0a 2f09 2f08 2f07 2f06 2f05 2f04
2f0b 2f0a 2f09 2f08 2f07 2f06 2f05 2f04
BE1=0
ag en 2f07 2f06 2f05
adress ieren
BE0=0
2f08 2f07 2f06 2f05
i386
übe rtr
BE0=1
BE1=1
i386
BE2=0
BE2=1
übertr agen
BE3=0
BE3=1
adressieren
Abb. 5.7: Weil der Speicher des 32-Bit-Prozessors 80386 in 32-Bit-Abschnitten organisiert ist, kann der 80386 nicht unmittelbar auf Doppelworte zugreifen, die nicht an Doppelwortgrenzen beginnen. Stattdessen muss der Prozessor einen solchen Zugriff in zwei aufeinanderfolgende Zugriffe aufteilen. Dabei wird zwar jedes Mal ein ganzes Doppelwort adressiert, aber jeweils nur die benötigten ein bis drei Byte auch tatsächlich in den Prozessor übernommen und dort zum 32-Bit-Doppelwort zusammengesetzt. Die Busschnittstelle des 80386 führt den zweimaligen Zugriff automatisch aus.
In Abbildung 5.7 ist dies für einen lesenden Zugriff dargestellt. Beim Zugriff auf das Wort mit der ungeraden Adresse 2f05h führt die Busschnittstelle einen zweimaligen Zugriff aus. Zuerst werden die drei Byte mit den Adressen 2f05h, 2f06h und 2f07h eingelesen. Dies geschieht, indem der Prozessor die Adresse 2f04h ausgibt und gleichzeitig die Byte-Enable-Signale folgendermaßen setzt: BE0=1, BE1=0, BE2=0, BE3=0. Damit werden die drei niederwertigen Byte des Doppelworts mit der Adresse 2f05h eingelesen. Unmittelbar danach gibt die CPU die Adresse 2f08h aus und setzt gleichzeitig BE0=0, BE1=1, BE2=1, BE3=1. Damit wird das Byte an der Adresse 2f08h eingelesen. Die Busschnittstelle kombiniert die drei zuerst und das zuletzt gelesene Byte zum Doppelwort an der Adresse 2f05h. Der 80386 hat durch den zweifachen Zugriff, also ein Doppelwort angesprochen, das nicht an einer Doppelwortadresse beginnt. Um ein Wort an einer solchen Adresse zu schreiben, wird derselbe Vorgang umgekehrt durchlaufen. Bytes mit der Adresse 4n (n=0 bis G-1) werden also immer über die Leitungen D7 bis D0 des Datenbusses, Bytes mit der Adresse 4n+1 über D15 bis D8 übertragen. Dasselbe gilt für Bytes mit der Adresse 4n+2, die stets über die Leitungen D23 bis D16 und Bytes mit der Adresse 4n+3, die über D31 bis D24 übergeben werden. Ähnliches gilt auch für Ports. Im Allgemeinen führt die Speichersteuerung bei beiden Teilzugriffen einen vollen 32-Bit-Zugriff aus und kann auch jeweils alle 32 Bits auf den Datenbus ausgeben. Entweder der Systemcontroller oder der 80386 nehmen jedoch nur diejenigen Byte an, für die BEx (x=0-3) auf einem niedrigen Pegel liegt. Sie erkennen, dass das Lesen oder Schreiben eines Doppelwortes an einer Adresse, die kein Vielfaches von vier ist, stets zwei Buszyklen, der Zugriff auf ein Doppelwort an einer Doppelwortadresse
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
123
aber nur einen Buszyklus in Anspruch nimmt. Es ist daher günstig, wenn auch, wie schon gesagt, nicht notwendig, die Daten stets so im Speicher anzuordnen, dass Doppelworte bei Doppelwortadressen beginnen und gewöhnliche 16-Bit-Worte eine solche Doppelwortadresse zumindest nicht überschreiten. Die erläuterten Ausführungen gelten im übrigen nur für Daten. Die Prefetch-Queue liest den Code stets in Portionen zu Doppelworten ein, die an Doppelwortadressen beginnen. Aus diesem Grund wird die Prefetch-Queue immer erst dann nachgeladen, wenn in ihr mindestens vier Byte frei sind. Um auf Doppelwortadressen zu kommen, liest der Prozessor gegebenenfalls zuerst ein bis drei Bytes ein.
5.2.6
Sonderzyklen
Neben den drei »normalen« Buszyklen zum Lesen und Schreiben von Daten sowie dem passiven Buszyklus (wenn weder die Prefetch-Queue geladen werden muss, noch der gerade abgearbeitete Befehl einen Speicher- oder I/O-Zugriff verlangt), gibt es noch den Shutdown- und den Halt-Zyklus. Diese werden durch die Kombination (101) der Signale M/IO, D/C, W/R angegeben und durch die Pegel von BE0 bis BE3 unterschieden. Der Shutdown-Zyklus (BE0=0, BE1=BE2=BE3=1) tritt ein, wenn bei der Ausführung eines Befehls mehrere Exceptions auftreten und der Prozessor überfordert ist, diese zu behandeln: er »streikt«. Der Halt-Zustand (BE0=BE1=BE3=1, BE2=0) kann durch den Befehl HLT ausgelöst werden. Auch in diesem Fall ist der Prozessor angehalten und führt keine weiteren Befehle aus. In Tabelle 5.1 sind die Sonderzyklen zusammengefasst angegeben. Beachten Sie, dass Sonderzyklen wie gewöhnliche Buszyklen mit einem READY vom System quittiert werden müssen. BE3
BE2
BE1
BE0
Sonderzyklus
1 1
0 1
1 1
1 0
Halt-Zyklus Shutdown-Zyklus
Tab. 5.1:
Sonderzyklen des 80386-Busses (Signale M/IO=1, D/C=0, W/R=1)
Sind die Hardware-IRQs aktiviert, ist also das IE-Flag gesetzt (siehe auch Kapitel Die Flags), kann der Prozessor gezwungen werden, den Halt-Zustand zu verlassen, indem man einen HardwareIRQ auslöst. Im PC wird z.B. durch Betätigen der Tastatur ein solcher IRQ aktiviert. Den Shutdown-Zustand beeinflusst das nicht, der Prozessor ignoriert die Anforderung. Um den Shutdown-Zustand zu beenden, muss entweder ein NMI oder ein Prozessor-Reset ausgelöst werden. Beide beenden auch den Halt-Zustand. Der Unterschied zwischen beiden ist, dass ein NMI den Prozessormodus nicht verändert: Wenn der 80386 vor dem Shutdown im Protected Mode lief, wird der Betrieb nach einem NMI auch wieder im Protected Mode aufgenommen und der Interrupt Handler 2 entsprechend dem NMI angesprungen. Demgegenüber versetzt ein Prozessor-Reset den Prozessor in den Real Mode und der 80386 beginnt bei CS=f000h, IP=0000fff0h und zusätzlich aktivierten Adressleitungen A31–A20 mit der Programmausführung. Ein Shutdown tritt nur nach einem sehr ernsten Problem auf, das seine Ursache meistens in einer umfangreichen Hardware-Fehlfunktion hat. Hervorgerufen werden können solche ernsten Fehlfunktionen z.B. durch Stromausfall, Blitzschlag oder die Zerstörung von Chips. Mit der externen Auslösung eines NMIs oder Resets springt der Prozessor meist eine so genannte Wiederanlaufroutine an, um zu retten, was noch zu retten ist. Anwendungsprogrammierer werden mit diesen Problemen aber kaum konfrontiert. Wiederanlauf- und Behandlungsroutinen für einen Shutdown-Status sind Bestandteil des Betriebssystems.
Sandini Bib 124
5.2.7
Kapitel 5
Datenbus und Duplizierung von Schreibdaten
Bei der Einführung des 80386 mit 32-Bit-Datenbus waren 32-Bit-Peripheriechips entweder sehr teuer oder schlicht nicht existent. Intel hat dem 80386 daher einen sehr flexiblen Datenbus spendiert, der wahlweise mit einer Breite von 16 Bit oder vollen 32 Bit betrieben werden kann. Der 80386 kann dadurch problemlos in ein 16-Bit-System integriert werden und 16-Bit-Peripheriechips nutzen, wenn das gerechtfertigt erscheint. Durch die flexible Auslegung des Busses kann der 80386 auch direkt mit einem 16- und gleichzeitig mit einem 32-Bit-Datenbus verbunden sein, da die Umschaltung nicht durch eine feste Verdrahtung erfolgt, sondern flexibel für jeden Buszyklus wählbar ist. Es ist also z.B. möglich, den 80386 für einen Zugriff auf den Hauptspeicher mit einem 32-Bit-Datenbus und für den Zugriff auf den I/O-Adressbereich oder die ISA-Busslots in einem PC mit 16-Bit-Datenbus zu betreiben. Legt man an den Pin BS16 ein Signal mit niedrigem Pegel an, so wird der aktuelle Buszyklus auf die unteren 16 Bit D15–D0 des Datenbusses beschränkt. Etwaige Adressierungen über BE2 und BE3, die die höherwertigen 16 Bit D31–D16 des Datenbusses betreffen, werden in geeigneter Weise auf die niederwertigen Bits D15–D0 umgeleitet. Sollen Werte übertragen werden, die größer als 16 Bit sind, dann führt der 80386 selbstständig mehrere Buszyklen hintereinander aus, bis der Datenaustausch vollständig ist. BE3
BE2
BE1
BE0
D31–D24
D23–D16
D15–D8
D7–D0
Dupliz.
low low low low high high high high high high
low low low high high high low high low low
low low high high high low low low low high
low high high high low low low high high high
B31–B24 B23–B16 B15–B8 B7–B0 n.def. n.def. n.def. n.def. n.def. n.def.
B23–B16 B15–B8 B7–B0 n.def. n.def. n.def. B23–B16 n.def. B15–B8 B7–B0
B15–B8 B7–B0 B15–B8 B7–B0 n.def. B15–B8 B15–B8 B7–B0 B7–B0 n.def.
B7–B0 n.def. B7–B0 n.def. B7–B0 B7–B0 B7–B0 n.def. n.def. B7–B0
nein nein ja ja nein nein nein nein nein ja
low: niedriger Pegel; high: hoher Pegel B31–B24: Bits 31–24 der Schreibdaten B23–B16: Bits 23–16 der Schreibdaten B15–B8: Bits 15–8 der Schreibdaten B7–B0: Bits 7–0 der Schreibdaten n.def.: Werte sind nicht definiert
Tab. 5.2:
Schreibdatenduplizierung beim 80386
Eine weitere Besonderheit des 80386 zur Erhöhung des Systemdurchsatzes ist die automatische Duplizierung von Schreibdaten. Mit den Signalen BE0–BE3 legt der Prozessor fest, welche 8-BitGruppen seines 32-Bit-Datenbusses gültige Daten übertragen. Löst der Prozessor einen Buszyklus zum Schreiben von Daten aus, bei dem die Schreibdaten nur auf dem höherwertigen Wort (D31–D16) des Datenbusses auftreten, d.h. nur BE2 und BE3 aktiv sind, so gibt der 80386 automatisch dieselben Daten auf der niederwertigen Hälfte D15–D0 des Datenbusses aus. Bei einem System mit 16-Bit-Datenbus kann auf diese Weise unabhängig von BS16 der Durchsatz verbessert werden, da der 16/32-Bit-Busumsetzer des 16-Bit-Bussystems erst die Datenbytes auf der höherwertigen Hälfte auf die Datenbytes der niederwertigen Hälfte umladen muss. Durch die automatische Schreibdatenduplizierung entfällt diese Umladung, das Bussystem arbeitet
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
125
schneller. Werden die Schreibdaten nur auf der niederwertigen Hälfte D15–D0 des Datenbusses ausgegeben, so findet keine Schreibdatenduplizierung auf der höherwertigen Hälfte statt. In Tabelle 5.2 ist der Zusammenhang zwischen den Signalen BE0–BE3 und der Schreibdatenduplizierung angegeben.
5.2.8
I/O-Adressraum und die Peripherie
Neben dem Speicherbereich weist der 80386 noch einen so genannten I/O-Adressraum auf, auf den über Ports mit den Maschinenbefehlen IN, OUT etc. byte-, wort- oder doppelwortweise zugegriffen werden kann. Der 80386 kann insgesamt 65.536 (=64 k) 8-Bit-Ports mit den Adressen 0 bis 65.535, 32.768 (=32k) 16-Bit-Ports mit den Adressen 0, 2, 4, ..., 65.532, 65.534 oder 16.384 (16k) 32-Bit-Ports 0, 4, ..., 65.532 adressieren. Auch eine Mischung von 8-, 16- und 32-Bit-Ports ist möglich. Das entsprechende 8-Bit-Äquivalent darf aber 64 k nicht übersteigen. Somit erhält man für den 80386 zwei völlig voneinander getrennte Adressbereiche: den Speicher- und den I/OBereich, beide werden über den Daten- und Adressbus adressiert. Ein Speicher- wird von einem I/O-Zugriff durch das Steuersignal M/IO unterschieden. Einen Speicherzugriff signalisiert der 80386 durch einen hohen Pegel (M ist gültig), einen I/O-Zugriff durch einen niedrigen Pegel (I/O ist relevant). Der I/O-Adressbereich ist logisch nur mittels des Akkumulators, der Speicher dagegen mit allen Registern adressierbar. Außerdem sind die Segmentregister (siehe Unterkapitel 5.3 Die Register) für den I/O-Adressbereich ohne Bedeutung. Man könnte sich aber auf den Standpunkt stellen, dass die 64k-Ports ein eigenes Segment darstellen, das mit IN und OUT angesprochen wird. In den alten PCs werden nur die unteren 1024 (1 k) Ports von 0 bis 3ffh verwendet. EISA-, Mikrokanal- und PCI-PCs erweitern den I/O-Adressumfang aber typischerweise bis hin zu ffffh (64 KByte). Die Ports und der I/O-Adressbereich werden meist dazu verwendet, Register in Peripherieeinheiten anzusprechen. Der IN- oder OUT-Befehl und seine Abwandlungen stellen eine direkte Verbindung zwischen dem Akkumulator im Prozessor und dem Register der Peripherieeinheit her und übertragen Daten zwischen diesen. Das bedeutet, dass der 80386 eine I/O-Mapped I/O oder I/O-Mapped Ein-/Ausgabe ausführt, die Register liegen im I/O-Adressraum. Bei der so genannten Memory-Mapped I/O befinden sich die Register der Peripherieeinheiten dagegen im gewöhnlichen Speicheradressraum. Sie werden also durch die normalen Speicherbefehle, wie z.B. MOV mem, reg, angesprochen. Eine geeignete Dekodier- und Steuerlogik greift dann auf ein Register anstatt auf eine Speicherzelle zu.
5.2.9
I/O-Adressierung
Soll der 80386 einen Port ansprechen, so gibt er das Ausgangssignal M/IO mit einem niedrigen Pegel aus. Der Systemcontroller erkennt daran, dass ein Zugriff auf den I/O-Adressraum ausgeführt werden soll. Über W/R wird zusätzlich noch die Übertragungsrichtung 80386->Port (W/ R=1) oder Port->80386 (W/R=0) festgelegt. Das Schreiben von Daten in einen Port oder das Lesen von einem Port wird in ähnlicher Weise wie das Schreiben von Daten in den Speicher oder das Lesen aus dem Speicher ausgeführt. Abbildung 5.8 zeigt den Pfad für die Datenübertragung zwischen Prozessor und Ports.
Sandini Bib 126
Kapitel 5
D31...D0
i386 80386
Datenpuffer
A15 ... A2
Datenpuffer
CLK
Adresspuffer Adreßpuffer
CLK
Taktgenerator
Din Dout
Buscontroller
BEx, ADS, ...
I/O-Steuerung I/O-Dekoder
Ports A15...A0 IORD IOWR
Systemcontroller Abb. 5.8: Der 80386 greift nicht unmittelbar auf den I/O-Adressbereich zu, sondern wie beim Hauptspeicher nur mittelbar über den Buscontroller, der die Steuersignale für den Bus erzeugt und verschiedene Puffer zur Zwischenspeicherung und Verstärkung der Daten- und Adresssignale. Diese Zwischenschaltkreise sind heute in einen einzigen Systemcontroller integriert.
Wie beim Lesen und Schreiben von Daten aus dem bzw. in den Hauptspeicher gibt die CPU eine Adresse an den Adresspuffer aus und steuert den Buscontroller über die Statussignale M/IO, D/C, W/R an. Sollen Daten an einen Port (z.B. mit OUT) übertragen werden, so stellt der 80386 außerdem noch Daten bereit. Anhand des Steuersignals M/IO erkennt die Logik des Buscontrollers, dass ein Zugriff auf den I/O-Adressbereich und nicht auf den Speicherbereich stattfinden soll. Daher wird statt der Speichersteuerung die I/O-Steuerung aktiviert, die das Adresssignal vom Adresspuffer dekodiert und den entsprechenden Port anspricht. Dieser weist meist auf ein Register in einem Peripheriegerät (z.B. Tastatur oder Festplatte) oder in einem Hardware-Baustein (wie z.B. das Steuerregister in einem UART-Chip). Damit können Daten zwischen dem Prozessor und einem Register im I/O-Adressbereich des PCs ausgetauscht werden. Der 80386 kann maximal 64k 8-BitPorts ansprechen, sodass die 16 höherwertigen Adressleitungen A31–A16 bei einem Zugriff auf einen Port stets auf einem niedrigen Pegel liegen.
5.2.10 I/O-Zyklen In Abbildung 5.9 sehen Sie den Buszyklus für einen schreibenden Zugriff auf den I/O-Adressraum. Ein Vergleich mit Abbildung 5.3 zeigt, dass der Buszyklus und die zugehörigen Signale mit Ausnahme von M/IO mit denen für einen Schreibzugriff auf den Speicher übereinstimmen. Weil Ports meistens auf Steuer- und Statusregister von Hardware-Komponenten verweisen, die überdies häufig auf einer (eher langsamen) Steckkarte in einem Busslot sitzen, legt der 80386 bei Port-Zugriffen häufig mehr Wartezyklen als bei Speicherzugriffen ein. Auch hier verwendet die adressierte Einheit das Signal READY dazu, von der CPU zusätzliche Wartezyklen anzufordern. Dadurch steigt natürlich auch die I/O-Zugriffszeit an. Ansonsten gibt es abgesehen davon, dass andere Puffer und DeKoder angesprochen werden, keine Unterschiede zu einem Speicherzyklus.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
Schreibzyklus 1 T1
T2
127
Schreibzyklus 2 T1
Schreibzyklus 3
T2
T1
T2
CLK2 PCLK BE0-BE3,A2-A31
gültig (Zyklus
1)
gültig (Zyklus
2)
gültig (Zyklus
3)
ADS W/R M/IO NA READY D0-D31
Schreibdaten(1)
Schreibdaten(2)
Schreibdaten(3)
Abb. 5.9: Der Buszyklus für einen schreibenden Zugriff auf den I/O-Adressraum
5.3 Die Register Auch der 80386 folgt dem grundlegenden Aufbau von Mikroprozessoren, wie er in der Abbildung 2.7 dargestellt ist. Neben der Steuereinheit weist er mehrere Register auf. Zusätzlich stehen noch Register für die Speicherverwaltung zur Verfügung, die jedoch erst im Protected Mode (Kapitel 6.7) von Bedeutung sind. Alle verfügbaren Register sind als Übersicht in der Abbildung 5.10 angegeben.
5.3.1
Die Register in der Übersicht
Hier möchte ich zunächst die Register des 80386 kurz vorstellen, die im Real Mode benutzt werden können. Natürlich hat der Prozessor auch eine Vielzahl interner Register, beispielsweise zur Speicherung von Zwischenergebnissen. Diese sind dem Programmierer aber nicht zugänglich und werden daher hier auch nicht näher besprochen. Die so genannten Vielzweckregister dienen als schnelle interne Datenspeicher der CPU. Die Ausführungseinheit liest Werte aus einem oder mehreren von diesen Registern, führt sie der ALU zu, um Manipulationen vorzunehmen und legt das Ergebnis schließlich wieder in einem oder mehreren Registern ab. Das wäre ein Beispiel für eine so genannte Register-Register-Operation, weil Quelle und Ziel der bearbeiteten Daten eben Register sind. Der 80386 kann aber als Quelle und Ziel auch Werte direkt aus dem Speicher entnehmen oder in ihm ablegen. Das wäre dann eine Speicher-Speicher-, Register-Speicher- oder Speicher-Register-Operation. Neben den Vielzweckregistern gibt es noch die Segmentregister zur Speicherverwaltung, die Steuerregister sowie diverse andere Register.
Sandini Bib 128
Kapitel 5
EFLAG-Register
Befehlszähler/Stack-Zeiger 31
16 15
0
EIP ESP
31
Vielzweckregister 31
16 15
EFLAG
IP SP
0
FLAG
Segmentregister
16 15
0
15
EAX
AH
AL
CS
EBX ECX EDX ESI EDI EBP
BH CH DH
BL CL DL
SS DS ES FS GS
SI DI BP
0
Speicherverwaltungsregister 15
TR LDTR
0 31
TSS-Selektor LDT-Selektor IDTR GDTR
0 19
TSS-Basisadresse LDT-Basisadresse IDT-Basisadresse GDT-Basisadresse
Debug-Register
Steuerregister 31
16 15
0
CR3 CR2 CR1 CR0
31
16 15
0
DR7 DR6 DR5 DR4
Testregister 31
TR7 TR6
0
TSS-Limit LDT-Limit IDT-Limit GDT-Limit
16 15
0
DR3 DR2 DR1 DR0
Abb. 5.10: Die Register des 80386: Die Vielzweckregister des 80386 sind 32 Bit breit, können jedoch auch als 16-Bitoder teilweise 8-Bit-Einheiten angesprochen werden. Daneben gibt es sechs Segmentregister sowie den Befehlszähler, der auf den nächsten abzuarbeitenden Befehl zeigt, ein Flagregister mit den aktuellen StatusFlags des Prozessors und diverse Steuer- und Testregister.
Der 80386 liest über seinen 32-Bit-Datenbus Daten aus dem Speicher oder schreibt sie mit Hilfe des Datenbusses in den Speicher. Die betreffende Stelle im Speicher wird dabei durch eine 32-BitAdresse festgelegt, die der Prozessor mit Hilfe der Adressierungseinheit berechnet und über den 32-Bit-Adressbus an das Speichersubsystem übergibt. Die Adressberechnung ist je nach Betriebsmodus des 80386 – Real Mode, Protected Mode oder Virtual-8086-Mode – unterschiedlich aufwändig, dazu später mehr. Der Lese- oder Schreibvorgang läuft wie bei Mikroprozessoren üblich über eine Busschnittstelle ab, wozu die BU die Adresse und gegebenenfalls den Wert der zu schreibenden Daten ausgibt oder den
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
129
vom Speicher gelieferten Wert entsprechend der Adresse einliest. Der 80386 spricht in gleicher Weise den Speicher an, um einen Befehl zu lesen. Dieses Befehls-Fetching wird aber nicht durch einen expliziten Lesebefehl ausgelöst, vielmehr führt die BU dies automatisch aus. Die gelesenen Daten, d.h. also die Befehle, werden auch nicht in ein Register der Ausführungseinheit, sondern in die Prefetch-Queue übertragen. In einem späteren Schritt liest die Befehlseinheit den Befehl aus der Prefetch-Queue, dekodiert ihn und übergibt diesen dekodierten Befehl an seine Ausführungseinheit.
5.3.2
Segmentierung
Befehle und Daten befinden im selben physikalischen Speicher, wobei aber dieser eine physikalische Speicher bei der 80x86-Familie und dadurch auch beim 80386 logisch in mehrere verschiedene Abschnitte (die so genannten Segmente) aufgeteilt ist und die Abschnitte Programmcodes oder Daten enthalten. Bereits der 8086 als erste 80x86-CPU teilte den zur Verfügung stehenden Speicher in die Segmente auf. Dies praktizieren auch die folgenden Prozessoren bis hin zum Pentium III. Da der 8086 insgesamt aber nur 20 Adressleitungen gegenüber den 32 des 80386 aufweist, kann er maximal 220 Byte = 1 MByte Speicher adressieren. Somit besteht sein physikalischer Adressraum aus 1 MByte Speicher. Jedes der Vielzweckregister im 16-Bit-Prozessor 8086 (zur damaligen Zeit der 8-Bit-Chips dieselbe Sensation wie später der Übergang von 16 auf 32 Bit mit dem 80386) ist jedoch nur 16 Bit lang und kann damit maximal 216 Byte = 64 KByte adressieren. Der 8086 unterteilt also den physikalischen Adressraum in 64k-Segmente mit einer Größe von jeweils 64 KByte. Innerhalb eines Segmentes wird die Stelle eines Bytes durch einen Offset angegeben. Offsets werden in den Vielzweckregistern gespeichert. Demgegenüber werden die Segmente über die Segmentregister CS bis ES angesprochen (beim 80386 sind zusätzlich noch die beiden Segmentregister FS und GS hinzugekommen). Die CPU bildet für den Zugriff auf den Speicher so genannte Segment-Offset-Paare: Das Segment eines bestimmten Speicherobjekts (Byte, Wort, Doppelwort etc.) wird durch das Segmentregister, der Offset innerhalb des so festgelegten Segments dann noch durch das beteiligte Vielzweckregister angegeben. 1.048.560 Byte
32 Byte 16 Byte
Segment
ffffh
Segment 0002h Segment 0001h Segment 0000h
PD[ .%\WH
max. 64 kByte
Abb. 5.11: Der 8086 unterteilt seinen Adressraum von 1 MByte in 64k-Segmente zu je 64 KByte. Dadurch sind aufeinanderfolgende Segmente um jeweils 16 Bytes gegeneinander verschoben und überlappen sich in regelmäßigen Abständen von 16 Bytes, sie sind »verzahnt«.
Sandini Bib 130
Kapitel 5
Die 16-Bit-Segmentregister können wie die 16-Bit-Offsetregister des 8086 64k = 65.536 Segmente adressieren, die jeweils 64 KByte groß sind. Der theoretisch mögliche Adressraum umfasst daher 64k x64 KByte = 4 GByte. Das ist mit dem 20-Bit-Adressbus des 8086 aber nicht zu realisieren, er ist nur in der Lage, 1 MByte anzusprechen. Die Segmente werden in einem Abstand von 16 Byte verzahnt (siehe Abbildung 5.11). Erhöht sich der Wert eines Segmentregisters um eins, so verschiebt sich das Segment damit lediglich um 16 Byte, nicht um ein »ganzes« Segment von 64 KByte. Demgegenüber verschiebt eine Erhöhung des Offsetregisters um den Wert eins das Speicherobjekt nur um eine Stelle (d.h. 1 Byte). Änderungen der Segmentregisterwerte führen also zu einem wesentlich größeren (genau gesagt zum 16-fachen) Versatz als Änderungen der Offsetregisterwerte. Die eben beschriebene Festlegung von Segment und Offset ist charakteristisch für den Real Mode. Der 8086 kann nur in diesem Real Mode arbeiten, der 80386 beginnt zumindest nach dem Einschalten oder einem Prozessor-Reset im Real Mode, kann aber durch einen expliziten Befehl in den Protected oder Virtual-8086-Mode umgeschaltet werden. Dann werden aber auch die Adressen völlig anders berechnet. Die Adresse eines Objekts wird im Real Mode also durch die einfache Formel 16 * Segment + Offset oder gleichwertig 10h * Segment + Offset berechnet. Anders ausgedrückt bedeutet das eine Verschiebung des Segmentregisters um vier Bit nach links und eine Addition des Offsets. Die quasi aus dem Nichts auftretenden vier Bit bei der Segmentregisterverschiebung werden auf Null gesetzt. Die Adressierungseinheit führt genau diesen Verschiebungs- und Additionsprozess aus: Nach einer Verschiebung der Segmentadresse um vier Bit nach links summiert ein Addierer in der Adressierungseinheit die verschobene Segmentadresse und den Offset, um die betreffende lineare Adresse zu bilden (siehe Abbildung 5.12). Adreßbus /7088-:88
20-Bit-Adresse
aaaaaaaaaaaaaaaaaaaa
Addierer
Linksverschiebung Segment
s s s s s s s s s s s s s s s s0000
ssssssssssssssss
oooooooooooooooo
Offset
Abb. 5.12: Im Real Mode verschiebt die Adressierungseinheit den Wert des Segmentregisters um vier Bit nach links, multipliziert den Segmentwert also mit 16 und addiert den Offset hinzu. Ergebnis ist eine 20-Bit-Adresse.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
131
Segment und Offset werden meist hexadezimal in der Schreibweise Segment:Offset angegeben. Beispiel: 1F36:0A5D steht für Segment 1F36, Offset 0A5D; nach der oben angeführten Formel ergibt sich für die lineare Adresse: 1F36h * 16 + 0A5Dh = 7990 * 16 + 2653 = 130.493 Alternativ kann man auch mit einer Verschiebung des Segmentes um vier Bit arbeiten: 1F360h + 0A5Dh 1FDBDh = 130.493
Beachten Sie, dass zwei verschiedene Segment-Offset-Paare im Real Mode durchaus dieselbe Speicherstelle bezeichnen können (im Protected Mode ist das aus verschiedenen Gründen im Allgemeinen nicht möglich). Beispiel: 1FB1:02AD bedeutet Segment 1FB1, Offset 02AD damit ergibt sich als Adresse 1FB1h * 16 + 02ADh = 8113 * 16 + 685 = 130.493
Wie bereits erwähnt, ist diese Art der Adressberechnung charakteristisch für den Real Mode oder eben auch für DOS, das ausschließlich in diesem Mode arbeiten kann. Das DOS unter Windows 9.x arbeitet hingegen im Protected-Mode. In dieser Betriebsart, die als wesentliche Neuerung bereits mit dem 80286 eingeführt wurde, sind Segment und Offset hingegen vollständig entkoppelt. Die Segmentregister besitzen eine völlig andere Bedeutung, es findet keine Abbildung nach der oben angegebenen einfachen Formel statt. Dadurch ist beim 80286 ein logischer Adressraum von maximal 1 GByte und beim 80386 64 TByte je Task (Programm) möglich. Dieser logische Adressraum wird jedoch von der Segmentierungslogik beim 80286 auf einen physikalischen Adressraum von maximal 16 MByte entsprechend seinen 24 Adressleitungen abgebildet (224=16 M). Beim 80386 stehen bereits 4 GByte zur Verfügung (232=4 GByte). Beachten Sie aber, dass der tatsächliche Speicherausbau des Computers meist unter diesen maximalen Werten liegt. Der mit dem 80386 implementierte Virtual-8086-Mode stellt eine erhebliche Innovation im Hinblick auf die Betreibung von Real-Mode-Programmen in der geschützten Umgebung des Protected Modes dar. Der 80386 führt in diesem Modus die Adressberechnung nach der oben beschriebenen Formel des Real Modes aus, wobei aber der tatsächliche Zugriff auf den Speicher und die Peripherie durch dieselben Mechanismen überwacht und gegen unerlaubte und fehlerhafte Versuche geschützt wird, wie sie für den Protected Mode charakteristisch sind.
5.3.3
Die Vielzweck- und Segmentregister
Die Vielzweckregister sind beim 80386 32 Bit breit, können aber aus Kompatibilitätsgründen mit den 16-Bit-Vorgängern 8086/186/286 auch als 16- oder 8-Bit-Register angesprochen werden. Die Register für die Speicherverwaltung sind erst im Protected Mode von Bedeutung. Zur Einführung möchte ich hier nun etwas eingehender die Register des 80386 vorstellen, die schon im Real Mode benutzt werden können. Das sind die Vielzweck- und Segmentregister, das Flag-Register und das Steuerregister CR0. Das niederwertige Wort des Steuerregisters CR0 ist beim 80286 als Maschinenstatuswort MSW implementiert, das die Umschaltung in den Protected Mode regelt und Statusinformationen bereithält, die im Protected Mode von Bedeutung sind. Der 80386 weist sieben Vielzweckregister EAX bis EBP, sechs Segmentregister CS bis GS, einen Befehlszähler EIP, einen Stack-Zeiger ESP sowie ein Flagregister EFlag auf. Vielzweckregister,
Sandini Bib 132
Kapitel 5
Befehlszähler, Stack-Zeiger und das Flagregister sind jeweils 32 Bit breit, die Segmentregister nur 16 Bit. Durch die maximale Größe der Vielzweckregister von 32 Bit sind beim 80386 Offsets mit einer Länge von 32 Bit möglich und Segmente können beim 80386 demnach wesentlich größer als beim 8086 sein. Bei allen 32-Bit-Registern ist es möglich, auch nur die zwei niederwertigen Bytes anzusprechen. Sie werden mit AX bis DI (Vielzweckregister), IP (Befehlszähler), SP (StackZeiger) und Flag (Flagregister) bezeichnet. Das niederwertige Wort der vier Vielzweckregister AX bis DX kann sogar noch weiter in zwei Registerbytes aufgeteilt werden, z.B. nämlich AH und AL für das Register AX. Dadurch kann der 80386 auch einzelne Datenbytes bearbeiten. Das Register EAX mit den Unterteilungen AX und AH, AL nimmt als so genannter Akkumulator eine Sonderstellung ein. Für EAX (oder auch die Teilregister AX und AH, AL) stehen die meisten und höchstoptimierten Befehle zur Verfügung. Das Register ECX (oder CX) dient häufig als Zählregister (Count Register) bei der Programmierung und Ausführung von Schleifen. Jeder Schleifendurchlauf erniedrigt den Wert von CX um eins, bis CX den Wert Null erreicht. In Tabelle 5.3 finden Sie eine Auflistung der Vielzweck-, Segment- und Flag-Register zusammen mit ihrer hauptsächlichen Verwendung. Register 32 Bit 16 Bit 8 Bit
Bezeichnung
Aufgabe
EAX EBX ECX EDX EBP ESI EDI ESP
Akkumulator Base-Register Zählregister Datenregister Base-Pointer Source-Index Destination-Index Stack-Pointer Codesegment Datensegment Stacksegment Extrasegment Extrasegment Extrasegment Befehlszähler
Multiplikation/Division, I/O, schnelle Verschiebung Zeiger auf Basisadresse im Datensegment Zählwerte für Wiederholen, Verschieben, Rotieren Multiplikation, Division, I/O Zeiger auf Basisadresse im Stacksegment Quellzeichenkette und Indexzeiger Zielzeichenkette und Indexzeiger Stackzeiger Segment der Befehle Standardsegment der Daten Segment des Stacks frei verwendbares Segment frei verwendbares Segment frei verwendbares Segment Offset der Befehle Indikatoren für Prozessorstatus und Operationsergebnisse
AX BX CX DX BP SI DI SP CS DS SS ES FS GS EIP IP EFlag FLAG Tab. 5.3:
AH, AL BH, BL CH, CL DH, DL
Flags
Die 80386-Register und ihre Verwendung
Da der 32-Bit-Prozessor 80386 den Nachfolger der 16-Bit-CPU 80286 darstellt, ist er voll kompatibel mit dem 80286. Dazu ist es notwendig, dass der 80386 seine 32-Bit-Register eben auch mit einer Breite von nur 16 Bit ansprechen kann. Die vollen 32-Bit-Register werden daher mit einem vorangestellten E (für erweitert) gekennzeichnet. Der 80286 besitzt dagegen nur die »gewöhnlichen« Register AX etc. Die Verwendung der 80386-Register mit einer Standardbreite von 32 oder 16 Bits hängt vom Betriebsmodus ab und kann explizit eingestellt werden. Näheres dazu erfahren Sie im weiteren Verlauf des Kapitels. Eine weitere Eigenschaft des 80386 ist seine Abwärtskompatibilität mit allen vorherigen 80x86Prozessoren, also dem 8086 und 80286. Der 80386 kann daher alles, was auch der 8086 oder der 80286 vor ihm schon konnte. Im Folgenden möchte ich nun die Vielzweck- und Segmentregister (vgl. Abbildung 5.10) des 80386 genauer erläutern.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
133
Akkumulator EAX Der Akkumulator wird am häufigsten zum temporären Speichern von Daten verwendet. Die Sonderstellung des Akkumulators hat historische Gründe, da es in den älteren und damit einfacheren Mikroprozessoren nur ein Register gab (eben den Akkumulator), um beispielsweise Daten zu addieren (akkumulieren). Heute ist von dieser Einschränkung übrig geblieben, dass einige Befehle nur für den Akkumulator Geschwindigkeits-optimiert sind und damit bei einer Referenz des Akkumulators schneller arbeiten. Auch sind manche Befehle mit Registerreferenz nur für den Akkumulator gültig (wie z.B. Ein-/Ausgabe von/an Ports). Bei der Multiplikation enthält der Akkumulator vor der Ausführung einen der Faktoren und anschließend einen Teil oder das gesamte Ergebnis. Bei der Division speichert der Akkumulator vor der Teilung den gesamten oder einen Teil des Divisors und nach der Ausführung der Operation den Quotienten. Sollen Daten über I/O-Ports ein- oder ausgegeben werden, so nimmt der Akkumulator die Daten entgegen bzw. hält die auszugebenden Daten bereit. Der 32-Bit-Akkumulator EAX kann zu einem 16-Bit-Akkumulator AX verkürzt werden. Außerdem kann er noch in zwei 8-Bit-Teilakkumulatoren AH, dem höherwertigen Akkumulatorbyte von AX, und AL, dem niederwertigen Akkumulatorbyte von AX, unterteilt werden. Ursache dafür ist, dass bei den 16-Bit-Prozessoren 8086 bis 80286 der Akkumulator AX in die beiden 8-Bit-Teilakkumulatoren AH (höherwertiges Byte von AX) und AL (niederwertiges Byte von AL) unterteilt war. Beispiel: OUT 70h, al
; über Port 70h wird der Wert des ; Akkumulators al ausgegeben
Basisregister EBX Das Basisregister kann zur temporären Speicherung von Daten oder als Zeiger auf die Basis von Datenobjekten (beispielsweise den Beginn eines Feldes) bei indirekter Adressierung verwendet werden. Genaueres zu den Adresssierungsarten erfahren Sie im Kapitel 6.4. Auch das 32-BitRegister EBX kann zu einem 16-Bit-Register verkürzt werden, nämlich BX, und weiter zu den 8-Bit-Registern BL und BH. Beispiel: MOV ecx, [ebx]
; 32-Bit-Zählregister ECX mit dem Wert laden, der ; an der Basisadresse EBX gespeichert ist
Zählregister ECX Das Zählregister speichert üblicherweise die Zahl der Wiederholungen von Schleifen (LOOP), Zeichenkettenbefehlen (REP) oder Verschiebungen und Rotierungen (SHL, ROL etc.). Bei dieser Verwendung wird der Wert von ECX bei jedem Schleifendurchlauf (z.B. mit jedem LOOP) um eins vermindert. Sie können ECX oder CX aber auch als gewöhnliches Vielzweckregister verwenden, um z.B. Daten temporär abzulegen. Wie EAX und EBX kann auch das 32-Bit-Register ECX zum 16-Bit-Register CX und weiter zu den 8-Bit-Registern CL und CH verkürzt werden. Beispiel: MOV ecx, 10h anfang: OUT 70h, al LOOP anfang
; ; ; ;
ECX mit 10h (=16) laden Label für Rücksprung al über Port 70h ausgeben 16 Wiederholungen (bis ECX gleich 0)
Sandini Bib 134
Kapitel 5
Datenregister EDX Das Datenregister wird am häufigsten zur temporären Speicherung von Daten verwendet. Bei der Multiplikation zweier 32-Bit-Zahlen enthält EDX nach der Ausführung das höherwertige Doppelwort des Ergebnisses. Beim Dividieren von 32-Bit-Zahlen in den 16-Bit-Prozessoren 8086 bis 80286 speichert DX vor der Teilung das höherwertige Wort der Zahl und nach der Operation den Teilungsrest. Ferner enthält EDX bei Ein- und Ausgaben von bzw. an Ports die I/O-Adresse (von 0 bis 65.535) des anzusprechenden Ports. Der Weg über das Register EDX ist dabei die einzige Möglichkeit, Ports mit I/O-Adressen größer als 255 anzusprechen. Auch das 32-Bit-Register EDX kann zu einem 16-Bit-Register DX und weiter zu 8-Bit-Registern DL und DH verkürzt werden. Beispiel: MUL EBX ; ; ; ;
Multiplikation von EBX mit EAX (implizit) nach der Multiplikation ist in EDX:EAX das Produkt enthalten (höherwertiges Doppelwort in EDX, niederwertiges Doppelwort in EAX)
Basiszeiger EBP Auch wenn der Basiszeiger (engl. Base Pointer) ähnlich wie EBX, EDX oder ECX zur allgemeinen temporären Speicherung von Daten benutzt werden kann, liegt seine Stärke in der Verwendung als Zeiger. In diesem Fall dient er meist als Zeiger auf die Basis eines Stack-Frames und wird zum Ansprechen der Argumente von Prozeduren verwendet. Hierzu wird das Stacksegment SS als zugeordnetes Segmentregister angenommen, d.h. für einen Speicherzugriff gilt stets das Paar SS:EBP. Durch eine so genannte Segmentüberschreibung kann das Stacksegment SS aber natürlich durch ein anderes Segment ersetzt werden, z.B. das Extrasegment ES. Beispiel: Prozeduraufruf mit EBP als Stack-Frame-Basis (MASM 5.0) PUSH PUSH PUSH CALL
sum1 sum2 sum3 addition
addition PROC NEAR
; ; ; ;
; ; PUSH ebp ; MOV ebp, esp ; ; ; MOV eax, [ebp+16] ; ADD eax, [ebp+12] ; ADD eax, [ebp+8] ; POP ebp ; RET ; addition ENDP
ersten Summand auf Stack ablegen zweiten Summand auf Stack ablegen dritten Summand auf Stack ablegen alle drei Werte addieren Near-Call mit vier Byte für alten ebp als Rückkehradresse Basiszeiger sichern Stack-Zeiger in Basiszeiger schieben; esp zeigt auf alten Basiszeiger ebp auf dem Stack; sum1, sum2, sum3 sind lokale Variablen sum1 in eax laden sum2 zu sum1 in eax addieren sum3 zu sum1+sum2 in eax addieren alten Basiszeiger wiederherstellen Rücksprung
Source-Index ESI Ähnlich wie EBP kann der Source-Index ESI als allgemeiner temporärer Datenspeicher und als Zeiger benutzt werden. Meist wird SI als Index eines Datenobjekts innerhalb eines Feldes oder einer ähnlichen Struktur verwendet, dessen Basis dabei häufig durch das Basisregister EBX angegeben wird. Bei Zeichenkettenbefehlen zeigt ESI auf einzelne Bytes, Worte oder Doppelworte innerhalb der Ausgangs- (Source-) Zeichenkette und wird bei wiederholter Ausführung des Befehls (durch REP) in Abhängigkeit vom Direction-Flag automatisch erhöht oder vermindert. Ein MOVS-Befehl mit dem REP-Präfix ist die schnellste Möglichkeit, mit dem Prozessor Daten zwischen zwei Stellen im Speicher zu übertragen.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
135
Beispiel: Zeichenkette »abcdefghij« unterstrichen (-=ASCII-Code 1 für das Attribut unterstrichen) in monochromer Darstellung mit MOVSW ausgeben string MOV MOV MOV MOV CLD MOV MOV MOV REP
DB
- -c-d-e-f-g-h-i-j-')
20 DUP ('a b ; eax, @data ; ds, eax ; eax, b800h ; es, eax ; ; ecx, 5 ; esi, OFFSET string ; edi, 00h ; ; MOVSW ;
zu verschiebende Zeichenkette Datensegment von string in eax laden ds auf Datensegment einstellen Segment des Monochrom-Video-RAM in eax laden Videosegment in Extrasegment es laden von a nach j (aufsteigend) vorgehen 5 Worte à 4 Byte übertragen Adresse von string in Source-Index laden string links oben auf dem Bildschirm ausgeben (entsprechend Offset 0 im Video-RAM) fünf Mal ein Wort übertragen
Durch den Befehl REP MOVSW werden edi und esi nach jedem übertragenen Wort um zwei Byte erhöht und zeigen damit auf das nächste zu übertragende Wort. Destination-Index EDI Der Destination-Index EDI stellt das Pendant zum Source-Index ESI dar und kann als allgemeiner temporärer Datenspeicher und als Zeiger benutzt werden. Meist wird EDI als Index auf ein Datenobjekt innerhalb eines Feldes oder einer ähnlichen Struktur verwendet, dessen Basis dabei häufig durch das Basisregister EBX angegeben wird. Bei Zeichenkettenbefehlen zeigt EDI auf die einzelnen Bytes, Worte oder Doppelworte innerhalb der Ziel- (Destination-) Zeichenkette und wird bei wiederholter Ausführung des Befehls (durch REP) in Abhängigkeit vom Direction-Flag automatisch erhöht oder vermindert. Beispiel: siehe Source-Index. Neben den Vielzweckregistern besitzen alle 80x86-Prozessoren auch so genannte Segmentregister. Der 80386 ist mit sechs ausgerüstet, nämlich CS, DS, SS, ES, FS und GS. Bei den 16-Bit-Vorgängern, dem 8086 und 80286, fehlen die zwei Extrasegmentregister FS und GS. Im Gegensatz zu den Vielzweckregistern sind die Segmentregister beim Übergang von 80286 zum 80386 nicht auf 32 Bit angewachsen, sie sind jeweils 16 Bit lang. Codesegment CS Das Codesegment enthält die Befehle und Daten, die unmittelbar (immediate) adressiert werden. Die Befehle innerhalb des Segments werden durch den Befehlszähler EIP (Extended Instruction Pointer) adressiert. Das Codesegment wird bei einem Far-Aufruf (Far-Call) und einem INT automatisch verändert. Im Protected Mode prüft der 80386 bei einer Änderung des Inhalts eines Segmentregisters automatisch, ob der aufrufende Task auch eine Zugangsberechtigung für das neue Segment besitzt. Datensegment DS Das Datensegment enthält Daten, die dem gerade laufenden Programm zugeordnet sind. Viele Befehle (z.B. MOV) verwenden das Datensegment implizit, um Daten im Speicher zu adressieren. Erst eine Überschreibung mit einem anderen (Extra-) Segment hebt diese automatische Segmentadressierung auf. Die Verwendung von DS als Standarddatensegment macht den Programmcode kompakter, weil nicht bei jedem Befehl das zugehörige Datensegment explizit angegeben werden muss. Stacksegment SS Das Stacksegment enthält Daten, auf die mittels der Stack-Befehle wie PUSH, POP, PUSHALL etc. zugegriffen wird. Diese Befehle benutzen den Wert von SS automatisch, um Daten im Spei-
Sandini Bib 136
Kapitel 5
cher (auf dem Stack) abzulegen oder aus diesem zu lesen. Auch die so genannten lokalen Variablen oder lokalen Daten von Prozeduren werden normalerweise auf dem Stack abgelegt. Sie werden dann nach einer Rückkehr von der Prozedur von einer anderen Prozedur wieder überschrieben. Beim Abspeichern von Daten auf dem Stapel wird der zugehörige Stapelzeiger ESP (Stack Pointer) automatisch entsprechend dem Umfang der abgelegten Daten vermindert. Damit wächst der Stapel von höheren zu niedrigeren Speicheradressen. Extra Segmente ES, FS, GS Diese Segmentadressen stehen für Zeichenkettenbefehle zur Verfügung. Außerdem können ES, FS und GS dazu benutzt werden, das Standarddatensegment DS zu überschreiben, um die Daten einer Speicherzelle anzusprechen, die nicht in DS liegt, ohne den Wert von DS zu verändern. Es stehen beim 80386 also vier Datensegmente zur Verfügung: DS als Standarddatensegment und die drei Extrasegmente ES, FS und GS. ES wird von DOS und vom BIOS häufig dazu verwendet, das Segment einer Zeichenkette oder eines Puffers an eine Funktion zu übergeben. Beispielsweise muss bei einem Aufruf von INT13h, Funktion 02h zum Lesen von einem oder mehreren Sektoren von Diskette oder Festplatte ein Puffer für die zu lesenden Daten bereitgestellt werden, dessen Segment der Funktion im Register ES übergeben wird. Die sechs Segmentregister sind in allen drei Betriebsmodi für die Organisation und Adressierung des Speichers von erheblicher Bedeutung. Näheres hierzu erfahren Sie in Kapitel 6.4 über die logische Adressierung des Speichers.
5.3.4
Die Flags
Bedingten Sprüngen oder Verzweigungen geht nahezu immer ein logischer Vergleich zweier Größen (die Prüfung einer Bedingung) voraus, wie schon das Wort bedingt impliziert. Diese Befehle entsprechen in etwa Anweisungen wie GOTO... oder IF...THEN GOTO... in einer Programmiersprache wie BASIC. Von großer Bedeutung in diesem Zusammenhang ist das Flag-Register, da bestimmte Flags in Abhängigkeit vom Ergebnis des Vergleichs gesetzt (Flag gleich 1) oder gelöscht (Flag gleich 0) werden. Auch setzen und löschen bestimmte Befehle (wie ADC, d.h. Addition mit Übertrag) bestimmte Flags. In Abbildung 5.13 sind die Flags des 80386 dargestellt, die auch als EFlag bezeichnet werden, weil nur die 16 niederwertigen Flag-Bits beim 8086 vorhanden waren. 31
16 15
7
0
r r r r r r r r r r r r r r V R 0 N IOP O D I T S Z 0 A 0 P 1 C
C: P: A: Z:
Carry Parity Auxiliary Zero
S: T: I: D:
Sign Trap Interrupt-Enable Direction
O: IOP: N: R: V:
Overflow I/O-Protection-Level Nested Task Resume Virtual-8086-Mode
Abb. 5.13: Der 80386 weist mehrere Flags auf, die das Ergebnis der vorherigen Operation oder den aktuellen Status des Prozessors angeben. Durch die drei verschiedenen Betriebsmodi des 80386 ist die Anzahl der Flags gegenüber dem 8086 deutlich größer.
Carry (Übertrag; ab 8086) Carry wird gesetzt, wenn ein Vorgang einen Übertrag oder ein Borrow für den Zieloperanden erzeugt. Carry kann durch den Befehl STC (Set Carry) gesetzt, durch CLC (Clear Carry) gelöscht und durch CMC (Complement Carry) komplementiert werden.
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
137
Parity (Parität; ab 8086) Parity wird gesetzt, falls das Ergebnis einer Operation eine gerade Zahl von gesetzten Bits aufweist. Parity wird vom Prozessor gesetzt. Auxiliary Carry (zusätzlicher Übertrag; ab 8086) Das Flag wird für Arithmetik mit BCD-Zahlen verwendet und gesetzt, wenn eine Operaion einen Übertrag oder ein Borrow für die unteren vier Bits (BCD-Zahlen belegen nur die unteren vier Bits eines Bytes) eines Operanden erzeugt. Zero (Null; ab 8086) Zero wird vom Prozessor gesetzt, falls das Ergebnis einer Operation Null ergibt. Ein Beispiel hierfür liefert die Subtraktion gleich großer Zahlen oder das bitweise logische UND eines Wertes mit Null. Sign (Vorzeichen; ab 8086) Sign ist gleich dem höchstwertigen Bit des Operationsergebnisses (0 = positives, 1 = negatives Ergebnis) und hat damit nur einen Sinn für vorzeichenbehaftete Zahlen. Ist die Differenz zweier Zahlen negativ, so wird Sign vom Prozessor auf eins gesetzt. Damit können beispielsweise zwei Zahlen miteinander verglichen werden. Trap (Einzelschritt; ab 8086) Ist Trap gesetzt, so erzeugt der Prozessor nach jedem Schritt einen Interrupt 1. Trap gehört also zur Klasse der Exceptions (Interrupts und Exceptions werden im weiteren Verlauf des Kapitels erläutert). Viele Debug-Programme setzen Trap und fangen den Interrupt ab, um ein Programm schrittweise auszuführen. Damit können die Auswirkungen der einzelnen Programmschritte untersucht werden. Trap kann nicht direkt durch einen Befehl gesetzt oder gelöscht werden. Eine Möglichkeit ist der Umweg über die Befehle PUSHF (Flags auf dem Stack ablegen) und POPF (Flags vom Stack in das Flag-Register zurückschreiben). Hierbei werden die Flags mit PUSHF auf dem Stack abgelegt, dort manipuliert und die manipulierten Flags mit POPF in das FlagRegister zurückgegeben. Interrupt Enable (Interrupt erlauben; ab 8086) Ist Interrupt Enable gesetzt, so akzeptiert der Prozessor Hardware-Interrupt-Anforderungen, d.h. er reagiert auf ein aktives Signal am Eingang INTR. Das führt zu einer INTA-Sequenz mit dem Interrupt-Controller. Im Gegensatz zu Trap können Sie dieses Flag explizit mit dem Befehl CLI löschen und mit STI setzen. Interrupts müssen bei Anwendungen gesperrt werden, die keine Unterbrechung erlauben. Eine zu lange Sperrung kann jedoch zu Problemen führen (beispielsweise kann ein an der seriellen Schnittstelle empfangenes Byte verlorengehen). Normalerweise sollte nur das Betriebssystem dieses Flag verändern. Das gilt vor allem für MultitaskingUmgebungen, die den Protected Mode benutzen. Direction (Richtung; ab 8086) Direction bestimmt die Richtung von String-Operationen (wie z.B. MOVS). Ist Direction gesetzt, so werden die Zeichenketten von hoher zu niedriger Adresse bearbeitet, ansonsten von niedriger zu hoher Adresse. Das Direction-Flag kann mit STD gesetzt und mit CLD gelöscht werden. Overflow (Überlauf; ab 8086) Overflow wird vom Prozessor gesetzt, falls das Ergebnis einer Operation für den Zieloperanden zu groß oder zu klein ist. Beispielsweise kann die Addition zweier 16-Bit-Zahlen zu einem Wert führen, der nicht mehr in ein 16-Bit-Register passt.
Sandini Bib 138
Kapitel 5
Die bisher beschriebenen neun Flags waren bereits beim 8086 vorhanden. Die beiden folgenden sind mit dem 80286 neu hinzugekommen, um den Protected Mode zu unterstützen und einen Schutz für den I/O-Adressbereich zu implementieren. I/O-Protection-Level (I/O-Schutzebene; ab 80286) Dieses 2-Bit-Flag gibt im Protected Mode die minimal benötigte Schutzebene für Ein- und Ausgabeoperationen für den I/O-Adressraum an und wird vom Betriebssystem verwaltet. Im Real Mode hat das Flag keine Bedeutung. Nested Task (geschachtelter Task; 80286) Nested Task dient im Protected Mode zur Überwachung der Verkettung unterbrochener und aufgerufener Tasks und wird vom Betriebssystem verwaltet. Ein gesetztes NT-Flag zeigt an, dass mindestens ein Task Switch aufgetreten ist und sich im Speicher ein inaktives TSS befindet. Weitere Informationen finden Sie in Kapitel 6.7.9. Beim 80386 sind im Flag-Register noch zwei Einträge hinzugekommen, die einerseits die implementierte Debugger-Unterstützung und andererseits den Virtual-8086-Mode betreffen. Das sind die beiden folgenden Flags. Resume (Wiederanlauf; ab 80386) Das Resume-Flag steuert den Wiederanlauf eines Tasks nach einer Breakpoint-Unterbrechung über die Debug-Register des 80386. Ist Resume gesetzt, so werden die Breakpoints temporär deaktiviert. Das bedeutet, dass die Programmausführung an der Unterbrechungsstelle wieder aufgenommen werden kann, ohne dass eine erneute Debug-Exception auftritt (der 80386 würde sich sonst bei einem einmaligen Auftreten eines Breakpoints in der Schleife Breakpoint-Exception-Resume, Breakpoint...fangen). Virtual-8086-Mode (virtueller 8086 Modus; ab 80386) Um den 80386 in den Virtual-8086-Mode umzuschalten, muss das Betriebssystem das VM-Flag setzen. Das ist nur im Protected Mode und hier nur über ein Gate möglich. In Kapitel 6.8 erfahren Sie genaueres zu diesem Thema. Ist das Virtual-8086-Mode Flag gesetzt, so arbeitet der 80386 im Virtual Mode. Er führt dann die vom 8086 her bekannte einfache Real-Mode-Adressberechnung aus und kann dadurch Real-Mode-Anwendungen (wie beispielsweise DOS-Programme) ausführen. Das alles geschieht aber im Gegensatz zum Real Mode in einer geschützten Umgebung. Bei aktivem Paging kann der 80386 dann im Prinzip auch beliebig viele 8086-Programme parallel ausführen, d.h. er führt ein geschütztes Multitasking mit Programmen aus, die eigentlich nur für eine ungeschützte Singletasking-Umgebung konzipiert wurden. Salopper ausgedrückt ist ein 80386 im Virtual-8086-Mode mit aktiver Paging Unit (und einem reichlich komplizierten Betriebssystem) einer Vielzahl von 8086-Prozessoren äquivalent. Ist das VM-Flag dagegen gelöscht, so arbeitet der 80386 im gewöhnlichen Protected Mode. Im Real Mode hat VM keine Bedeutung. Nahezu alle Befehle zu bedingten Sprüngen testen die Werte des Flags, das das Ergebnis des vorherigen Vergleiches widerspiegelt. Das macht die besondere Bedeutung des Flag-Registers aus. Beispiel: Ist der Wert des Registers EAX gleich 5, so soll zu TARAMTATAM verzweigt werden: CMP eax, 5 ; Register EAX mit dem Wert 5 vergleichen JZ TARAMTATAM ; Sprung zu TARAMTATAM
Der 80386 führt den Vergleich CMP eax, 5 aus, indem er den Wert 5 von EAX subtrahiert und die Flags entsprechend setzt. In unserem Beispiel wird daher 5 vom Wert des Registers EAX subtra-
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
139
hiert. Ist EAX gleich 5, so wird das Flag Zero gesetzt. Ist EAX größer als 5 (Ergebnis der Subtraktion größer 0), so setzt die CPU die Flags Sign und Zero auf 0. Ist EAX demgegenüber kleiner als 5 (Ergebnis der Subtraktion kleiner 0), so wird Zero auf 0 und Sign auf 1 (negatives Ergebnis) gesetzt. Einige Befehle (wie beispielsweise JBE = Jump if Below or Equal) testen mehrere Flags (hier: Sign und Zero), um zu ermitteln, ob die Sprungbedingung erfüllt ist oder nicht. Die Flags vermitteln damit erhebliche Information über den Zustand des Prozessors oder das Ergebnis einer Operation. Die Flags vermitteln also reichlich Information über den Zustand des Prozessors (Trap, Interrupt Enable, Direction, Resume, Virtual-8086-Mode), des aktiven Tasks (I/O Protection Level, Nested Task) oder das Ergebnis einer Operation (Carry, Parity, Auxiliary Carry, Zero, Sign, Overflow).
5.3.5
Steuer- und Speicherverwaltungsregister
Der 80386 besitzt vier eigentliche Steuerregister sowie vier Speicherverwaltungsregister für den Protected Mode und außerdem acht Debug-Register (DR0–DR7), die die Unterstützung von Debuggern im Protected oder Virtual-8086-Mode auf Hardwarebene unterstützen. Zunächst möchte ich mich den Steuerregistern CR0 bis CR3 zuwenden, deren Aufbau Sie in Abbildung 5.14 erkennen können. 23
31
CR3
12 11
Page-Directory-Basisregister
CR2
lineare
CR1
Adresse
7
4
0
reserviert des
Page-Fault
reserviert
ET TS EM MP PE
reserviert
PG
CR0
15
Abb. 5.14: Die Steuerregister
Das bereits mit dem 80286 implementierte Maschinenstatuswort (MSW) für die Unterstützung des 16-Bit Protected Modes beim 80286 ist im niederwertigen Wort des Steuerregisters CR0 aufgegangen. Die Bedeutung der Bits TS, EM, MP und PE ist daher dieselbe wie beim 80286 (vgl. auch Kapitel 4.3). Aus Kompatibilitätsgründen können Sie das niederwertige MSW-Wort des CR0-Registers weiterhin über die 80286-Befehle LMSW (Load MSW) und SMSW (Store MSW) ansprechen. Das Paging-Bit ist dadurch aber nicht zugänglich. PE (Protection Enable, Protected Mode aktivieren; ab 80286) Wenn Sie dieses Bit setzen, schaltet der 80386 in den Protected Mode um. Beim 80286 war eine Rückkehr zum Real Mode nur über einen Prozessor-Reset oder einen Dreifach-Fehler (TripleFault) möglich; beim 80386 können Sie das explizit durch einen Befehl ausführen, der das PE-Bit löscht. Dies darf aber nur das Betriebssystem duchführen, sonst wird eine Exception ausgelöst. MP (Monitor Coprocessor, Coprozessor überwachen; ab 80286) Wenn dieses Bit MP gesetzt ist, dann löst der WAIT-Befehl die Exception »kein Coprozessor vorhanden« aus, die zu einem Interrupt 7 führt. EM (Emulate Coprocessor, Coprozessoremulation; ab 80286) Ein gesetztes Bit EM teilt dem 80386 mit, dass alle Coprozessorfunktionen durch Software emuliert werden müssen, d.h. keine Datenübertragung zwischen der CPU und dem Coprozessor ausgeführt wird. Stattdessen führt jeder ESC-Befehl für den Coprozessor zu einer Exception 7,
Sandini Bib 140
Kapitel 5
deren Handler dann den entsprechenden Befehl mit der Ganzzahlarithmetik des 80386 ausführt. Beispielsweise wird der Logarithmus dann nicht vom Coprozessor 80387 berechnet, sondern von einer mathematischen Funktionsbibliothek, die nur auf die Ganzzahlarithmetik des 80386 zurückgreift. TS (Task Switched, Taskwechsel; ab 80286) Ist dieses Bit gesetzt, so ist ein Task Switch aufgetreten; der 80386 ist also im Protected Mode mindestens einmal auf ein Task Gate gestoßen. Das TS-Bit ist wichtig, um zu ermitteln, ob der Coprozessor möglicherweise noch einen Befehl für den alten Task oder schon einen für den neu aktivierten berechnet. Die vier beschriebenen Bits des CR0-Registers sind bereits im 80286-MSW implementiert. Beim 80386 sind zwei Bits hinzugekommen, die zur Festlegung des Coprozessors als 80387 oder 80287 und zur Aktivierung oder Deaktivierung der Paging Unit dienen. ET (Extension Type; ab 80386) Mit dem ET-Bit legen Sie fest, ob der installierte Coprozessor ein 80387 (ET = 1) oder ein 80287 (ET = 0) ist. Der 80386 kann mit beiden zusammenarbeiten, weil die Schnittstelle zwischen beiden und das Protokoll für den Datenaustausch identisch sind. Dagegen ist die Breite des Datenbusses für den 80287 mit 16 Bit geringer. Dementsprechend mehr I/O-Zyklen müssen der 80386 und 80287 ausführen, um Codes und Daten auszutauschen. PG (Paging; ab 80386) Mit dem Bit PG aktivieren (PG = 1) oder deaktivieren (PG = 0) Sie die Paging Unit (PU) in der Speicherverwaltungseinheit des 80386. Bei deaktivierter PU führt der 80386 keine Adresstransformation aus, die lineare Adresse nach Addition von Offset und Segmentbasis stellt automatisch die physikalische Adresse des Speicherobjektes dar, so wie der 80386 über seine Adressleitungen den Speicher physikalisch adressiert. Bei aktivierter Paging Unit führt der 80386 dagegen zusätzlich zur (schon aufwändig genug erscheinenden) Segmentierung noch eine weitere Adresstransformation aus, um aus der linearen Adresse eine physikalische Adresse zu bilden. Paging kann nur im Protected Mode genutzt werden. In Kapitel 6 erfahren Sie hierzu mehr. Wie ich bereits erwähnt habe, stehen für den Zugriff auf das MSW zwei besondere Befehle zur Verfügung, nämlich LMSW und SMSW. Wenn Sie aber auf das Bit PG des Registers CR0 oder die Register CR1–CR3 zugreifen möchten, so müssen Sie die vier Steuerregister im 80386 durch einen MOV-Befehl ansprechen. Die Befehle LMSW und SMSW sind also mehr oder weniger eine Art »Unterbefehl« der Befehle MOV CR0, wert bzw. MOV wert, CR0. Beispiel: Der 80386 soll durch Setzen des PE-Bits in CR0 in den Protected Mode versetzt werden. 1. Möglichkeit: 2. Möglichkeit:
MOV CR0, 0001h ; ; LMSW 01h ; ;
PE-Bit durch MOV-Befehl mit 32Bit-Operanden setzen PE-Bit durch LMSW-Befehl mit 16Bit-Operanden setzen
Im Steuerregister CR3 legt der 80386 bei aktivierter Paging Unit die 20 höchstwertigen Bits der Adresse des Page-Directories, d.h. des Page Tables erster Ordnung, ab. Tritt bei der Ausführung eines Befehls ein Page-Fehler auf, so speichert der 80386 im Register CR2 die lineare Adresse, die den Page-Fehler verursacht hat. In Kapitel 6 erfahren Sie mehr zu den Begriffen Page Directory, Page Table und Page-Fehler. Neben den Steuerregistern besitzt der 80386 vier Speicherverwaltungsregister (siehe Abbildung 5.15). Sie dienen zur Verwaltung des Speichers und dessen Aufteilung in Segmente im Protected
Sandini Bib Einstieg in die 32-Bit-Welt – Der 80386
141
Mode. Ich möchte sie daher im Zusammenhang mit der Segmentierung im Protected Mode in Kapitel 6.7 diskutieren. Die beiden Testregister TR6 und TR7 dienen zur Prüfung eines internen Puffers, des so genannten Translation-Lookaside-Buffers (TLB), der zum Caching von Page Table-Einträgen bei aktiver Paging Unit dient, was im Kapitel 6.8.3 ausgeführt wird. 15
0 31
0 19
0
TR
TSS-Selektor
TSS-Basisadresse
TSS-Limit
LDTR
LDT-Selektor
LDT-Basisadresse
LDT-Limit
IDT-Basisadresse GDT-Basisadresse
IDT-Limit GDT-Limit
IDTR GDTR
Abb. 5.15: Die 80386-Speicherverwaltungsregister für den Protected Mode
Sandini Bib
Sandini Bib
6 Programmierung und Betriebsarten Dieses Kapitel behandelt in erster Linie die logische Adressierung des Speichers und hier findet sich somit auch der Schlüssel für die mitunter recht eigentümlich anmutende Speicherverwaltung, die mit den Prozessoren für PCs einhergeht, was oft zu Missverständnissen und Fehlinterpretationen führt. Demnach ist eine eingehende Untersuchung der (segmentierten) Speicherorganisation und der beteiligten Register notwendig, was durch entsprechende Programmierbeispiele verdeutlicht wird. Außerdem unterscheidet sich die Speicheradressierung abhängig vom aktiven Betriebsmodus, d.h. je nachdem, ob die CPU (ab 80386) im Real, Protected oder Virtual 8086 Modus arbeitet und ob die Paging Unit aktiv ist oder nicht.
6.1 Codesegment und Befehlszähler Im vorherigen Kapitel habe ich bereits erwähnt, dass der Prozessor zur Programmausführung Befehle aus dem Speicher holt (auch als Befehls-Fetching bezeichnet) und ausführt. Grundlage für dieses automatische Lesen bilden Codesegment und Befehlszähler. Das Codesegment gibt dabei (natürlich) das Segment an, aus dem der nächste Befehl gelesen werden soll. Der Befehlszähler ist der Offset des nächsten zu lesenden Befehls. Die Bezeichnung Befehlszähler hat historische Gründe. Das Paar Codesegment:Befehlszähler bildet somit die Adresse des nächsten auszuführenden Befehls im Speicher. Der Prozessor kann damit diesen Befehl einlesen und ausführen. Am Code des Befehls erkennt der Prozessor, wie viele Bytes er einlesen muss, damit sich der vollständige Befehl im Prozessor befindet. Befehle für den 80x86 sind zwischen einem und 15 Byte lang. Ist der Befehl ausgeführt worden, so wird der Befehlszähler um die Zahl der Bytes inkrementiert, die der gerade ausgeführte Befehl aufwies. Bei einem kurzen 2-Byte-Befehl wird der Befehlszähler also um zwei erhöht, das Paar Codesegment:Befehlszähler verweist dann auf den nächsten auszuführenden Befehl. Dieser wird in gleicher Weise eingelesen und ausgeführt. Anschließend inkrementiert der Prozessor seinen Befehlszähler erneut. Dieses Einlesen und Inkrementieren führt der Mikroprozessor dabei völlig selbstständig aus, es ist kein Eingriff eines Steuerprogramms oder gar des Benutzers notwendig. Einmal »angestoßen«, fährt die CPU damit ständig fort, Befehle einzulesen und auszuführen. Für das Befehls-Fetching spielen Prefetch-Queue und Busschnittstelle eine wichtige Rolle. Wie ich bereits erläutert habe, werden Befehle zuerst in die Prefetch-Queue eingelesen, die diese dann an die Befehlseinheit weitergibt. Sind in der Prefetch-Queue durch die ständige Weitergabe der Befehlsbytes an die Steuereinheit so viele Bytes frei geworden, wie der Breite des Prozessordatenbusses entspricht, dann liest die Busschnittstelle entsprechend viele Bytes aus dem Speicher in die Prefetch-Queue ein. Der 80386 beispielsweise besitzt einen Datenbus, der vier Byte (32 Bit) breit ist. Er liest also immer dann selbstständig vier Bytes ein, wenn in der Prefetch-Queue vier Byte frei sind. Dadurch nutzt der Prozessor den Datenbus in optimaler Weise: Wenn der 80386 gerade einen Befehl ausführt, der keinen unmittelbaren Speicherzugriff erfordert (z.B. die Addition zweier Register), kann die Busschnittstelle die Prefetch-Queue nachladen, ohne dass die Abarbeitung des gerade aktiven Befehls behindert wird. Damit steht sofort nach der Abarbeitung des gerade aktiven Befehls bereits der nächste Befehl zur Verfügung und muss nicht erst aus dem Speicher gelesen werden.
Sandini Bib 144
Kapitel 6
Selbstverständlich hat ein Speicherzugriff durch einen aktiven Befehl (beispielsweise als Folge der Anweisung MOV register, speicher) Vorrang vor dem Nachladen der Prefetch-Queue. Parallel zur Ausführung des gerade aktiven Befehls und dem Nachladen der Prefetch-Queue dekodiert die Befehlseinheit den nächsten Befehl und bereitet ihn für die EU zur Ausführung vor. Die Ausführungseinheit führt den Befehl nun in einer bestimmten Zahl von Taktzyklen aus. Einfache Befehle wie CLC benötigen hierzu zwei Taktzyklen, umfangreichere wie ein Task Switch über ein Gate im Protected Mode dagegen bis über 300 Taktzyklen. Man erhält somit einen gleichmäßigen Befehlsstrom vom Speicher zum Prozessor. Anders ausgedrückt wird ein Programm Schritt für Schritt sequenziell ausgeführt. Ab dem Pentium wird allerdings versucht möglichst viele, aber voneinander unabhängige Schritte parallel auszuführen, um die Leistung des Computers zu steigern. Der Pentium z.B. weist hierfür drei unabhängige Pipelines auf, die parallel arbeiten können. Der gleichmäßige Befehlsstrom kann durch bedingte und unbedingte Sprünge und Verzweigungen unterbrochen und an einer anderen Stelle fortgesetzt werden. Hierzu muss nur der Wert des Befehlszählers und ggf. des Codesegments verändert werden. Bei einem Near-Aufruf oder -Sprung bleibt das Codesegment unverändert, es wird nur der Wert des EIPs neu geladen. Demgegenüber wird bei einem Far-Aufruf oder Sprung auch der Wert des Codesegments verändert und ein so genannter Intersegmentaufruf oder -sprung ausgeführt. Der Prozessor fährt an einer anderen Stelle des im Speicher befindlichen Programms fort. Durch einen solchen Sprung wird außerdem die Prefetch-Queue vollständig geleert, da die im Vorgriff eingelesenen Bytes nicht dem neu angesprungenen Befehl entsprechen. Sprünge, Aufrufe – allgemeiner auch als Verzweigungen oder Branches bezeichnet – sind für den logischen Aufbau von Programmen sehr wichtig, weil ein Computer häufig in Abhängigkeit von bestimmten Bedingungen verschiedene Dinge ausführen soll. Beispiel: Der Wert des Codesegments CS lautet 24D5, der Wert des Befehlszählers 0108. Der nächste Befehl befindet sich damit bei der Adresse 24D5:0108. Der Code an dieser Adresse lautet 8CC0. Die Steuereinheit CU dekodiert diesen Code und ermittelt den Befehl MOV EAX, ES
Es soll also der Wert des Extrasegments ES in das 32-Bit-Akkumulatorregister EAX übertragen werden. Nach der Ausführung des Befehls wird der Wert des Befehlszählers um zwei erhöht, da MOV EAX, ES ein Zwei-Byte-Befehl war. Der Wert von EIP lautet somit 10a0, der Wert des Codesegments CS bleibt unverändert. Beispiel: Der Wert des Codesegments CS lautet 80B8, der Wert des Befehlszählers 019D. Der nächste Befehl befindet sich damit bei der Adresse 80B8:019D. Der Code an dieser Adresse lautet 7506. Die Steuereinheit CU dekodiert diesen Code und ermittelt den Befehl JNZ 01A5
Es handelt sich also um eine bedingte Verzweigung (Jump if Not Zero) zum Befehl bei der Adresse 01A5. Das Codesegment wird dabei auf keinen Fall verändert. Für solche bedingten Verzweigungen ist das Flagregister von großer Bedeutung. Einer bedingten Verzweigung geht üblicherweise ein Vergleich zwischen zwei Werten voraus. Entsprechend dem Vergleichsergebnis werden bestimmte Flags im Flagregister gesetzt oder gelöscht. Hat der Vergleich zu einem »ungleich Null« geführt, so wird verzweigt: Der Befehlszähler EIP wird mit dem Wert 01A5 geladen. Somit setzt der Prozessor die Arbeit bei 80B8:01A5 fort. Führte der Vergleich zu einem »gleich Null«, so findet keine Verzweigung statt, der Befehlsstrom wird gleichmäßig fortgesetzt. Hierzu wird EIP um zwei auf 019F erhöht, da es sich um einen Zwei-Byte-Befehl handelte.
Sandini Bib Programmierung und Betriebsarten
145
Mit dem 32-Bit-Befehlszähler EIP wären Programme von höchstens 4 GByte Größe möglich, beim 16-Bit-Vorgänger 80286 durch die 16-Bit-Offsetregister darüber hinaus nur Programme mit 64 KByte Größe. Durch Ändern des Codesegments mit einem gesonderten Befehl (Laden von CS mit einem bestimmten Wert) werden umfangreichere Programme möglich. Beachten Sie, dass zwar das Codesegment CS, nicht aber der Befehlszähler EIP explizit verändert werden kann. Es gibt keinen direkten Ladebefehl mit EIP als Ziel. Der Wert des Befehlszählers EIP kann nur implizit über einen bedingten oder unbedingten Sprung sowie einen Call zu einem Unterprogramm verändert werden. FAR-Calls und FAR-Sprünge beeinflussen zusätzlich auch den Wert im Codesegmentregister CS. Bereits der 80386-Befehlssatz ist mit 206 Befehlen und zusätzlich vielen Befehlsvariationen hinsichtlich Registerbreite und Adressierungsart sehr umfangreich. Es ist daher unmittelbar ersichtlich, dass eine eingehende Erläuterung aller möglichen Befehle den Rahmen des Buches sprengen würden. Bei der Behandlung der folgenden Mikroprozessoren wird jedoch auf besondere Befehle noch im Zusammenhang eingegangen.
6.2 Stacksegment und Stack-Zeiger Eine besondere Bedeutung besitzt das Stacksegment sowie der zugehörige Stack-Pointer oder Stapelzeiger. Jedes Programm besitzt normalerweise ein eigenes Stacksegment, auf dem mit PUSH der Wert eines Registers oder eines Speicherwortes abgelegt werden kann. Mit PUSHF können die Flags und ab dem 80186 mit PUSHA alle Vielzweckregister auf dem Stack gespeichert werden. Umgekehrt werden mit POP, POPF bzw. POPA (ab 80186) die entsprechenden Daten vom Stack wieder abgenommen.
Abb. 6.1: Der Stack wird vor Allem als Ablage für Rücksprungadressen und zur Zwischenspeicherung von Registerwerten verwendet. Ein Befehl PUSH EAX legt den Wert des Akkumulators EAX auf dem Stack ab und der Stapelzeiger wird um vier erniedrigt. Der Stack wächst also nach unten, d.h. zu kleineren Adressen.
Beachten Sie, dass der Stack nach unten »wächst«, d.h. zu kleineren Werten des Stapelzeigers SP (Abbildung 6.1). Werden Daten auf dem Stack abgelegt, so vermindert sich der Wert von ESP um vier, weil immer ein ganzes Doppelwort (vier Byte) auf den Stack geschoben wird. Wenn Sie einen 80386 im 16-Bit-Modus betreiben, so werden natürlich stets nur zwei Byte auf dem Stack abgelegt und der Wert von SP mit jedem PUSH nur um zwei vermindert. Das gilt natürlich auch für die 16-Bit-Vorgänger 8086 und 80286. Ist der Stack leer, dann nimmt der Stapelzeiger ESP seinen größten Wert an. Nach dem Ablegen des Wortes zeigt der Stapelzeiger auf das zuletzt abgelegte Wort auf dem Stack. Ein Befehl PUSH vermindert also zuerst den Wert des Stapelzeigers ESP und anschließend wird der Register- oder Speicherwert auf dem Stack abgelegt.
Sandini Bib 146
Kapitel 6
Durch das Wachsen des Stacks nach unten kann ein Stapelüberlauf auf einfache Weise erkannt werden: Nimmt ESP den Wert 0 an, so ist der Stack erschöpft und bei entsprechend programmierten Anwendungsprogrammen, die den Stack laufend überprüfen, erscheint die Mitteilung Stapelüberlauf! oder Stack Overflow!. Programmierer sehen jedoch meist einen ausreichend großen Stack (ausreichend großen anfänglichen Wert für ESP) vor, sodass ein solcher Stapelüberlauf nur bei einem Programmfehler oder einer fehlerhaften Programmbedienung auftreten sollte. Nachteilig ist, dass im Real Mode das Anwendungsprogramm vor jedem PUSH explizit prüfen muss, ob noch ausreichend Kapazität auf dem Stack frei ist. Im Protected Mode wird die Prüfung, ob ein Stacküberlauf vorliegt, von der Hardware des Prozessors erledigt. Damit ist eine sehr schnelle Prüfung möglich, ohne dass zusätzliche Software-Routinen notwendig sind. Der Stack kann als Zwischenspeicher für Daten benutzt werden, die ohne PUSH und POP nur schwierig anzusprechen sind (wie beispielsweise das Trap-Flag). Am häufigsten wird der Stack jedoch zur Übergabe von Parametern an Prozeduren und Subroutinen verwendet. Hierzu schiebt das aufrufende Programm die zu übergebenden Parameter mit einem oder mehreren PUSH-Befehlen auf den Stack. Die aufgerufene Prozedur holt sich diese Parameter über einen oder mehrere entsprechende POP-Befehle oder mittels einer Adressierung über den Basiszeiger EBP. Für die Erstellung dieses »Prozedur-Stacks« ist ab dem 80386 ein eigenes Befehlspaar vorgesehen, nämlich ENTER (Stack-Frame erstellen) und LEAVE (Stack-Frame entfernen). Außerdem legt die aufgerufene Prozedur ihre lokalen Variablen auf dem Stack ab. Je nach Programmiersprache bereinigt bei einer Rückkehr die aufgerufene Prozedur oder das aufrufende Programm den Stack, d.h. stellt den Zustand vor dem Aufruf der Prozedur wieder her. Damit werden spätestens beim nächsten Aufruf einer Prozedur oder Subroutine mit Parameterübergabe die zuvor auf dem Stack abgelegten Parameter und lokalen temporären Variablen zerstört. Bei der Ausführung des Befehles PUSH SP (d.h. es wird der Stapelzeiger SP selbst auf den Stack geschoben) zwischen dem 8086/88 und allen anderen 80x86-Prozessoren besteht ein wesentlicher Unterschied:
: :
Beim 8086/88 wird zuerst SP aktualisiert (um zwei vermindert) und dann auf den Stack kopiert. Ab dem 80186/88 wird zuerst SP auf den Stack geschoben und erst anschließend aktualisiert (um zwei oder vier vermindert).
6.3 Datensegment DS und Adressierung Neben dem Code- und Stacksegmentregister hat auch das Datensegmentregister DS eine besondere Bedeutung. Es ist immer dann wichtig, wenn ein Befehl Daten aus dem Speicher liest oder in ihm abspeichert, d.h. wenn Speicheroperanden betroffen sind. Der Offset des Speicheroperanden wird üblicherweise in einem der Vielzweckregister bereitgehalten und das Paar DS:Offset verweist auf den anzusprechenden Wert. Das Datensegmentregister DS wird standardmäßig als das einem Offset zugeordnete Segmentregister verwendet. Wenn Sie dagegen einen Wert in einem anderen Segment schreiben oder lesen möchten, müssen Sie das Segmentregister DS mit dem Wert des neuen Segments laden oder ein Segmentpräfix benutzen, das das Datenregister DS durch eines der Extrasegmentregister ES bis GS ersetzt. Hierzu erfahren Sie in den nächsten Abschnitten mehr.
Sandini Bib Programmierung und Betriebsarten
147
Die Daten des Codesegments sollten dabei nur ausführbar und höchstens noch lesbar, nicht aber überschreibbar sein. Ein Überschreiben von Code führt notwendigerweise zum Absturz eines Programms. Nur-ausführbare Daten sind zwar in die Prefetch-Queue, nicht aber in ein Vielzweck- oder Segmentregister einlesbar. Ein Programm kann sie also nicht im Sinne von Daten verwenden, die bearbeitet werden. Die Verwendung verschiedener Segmente für Code, Stack und Daten gestattet eine Trennung der verschiedenen Abschnitte eines Programms. Im Protected Mode wird davon intensiv Gebrauch gemacht, um ein versehentliches Überschreiben von Code durch einen Programmfehler (eine häufige Ursache hängender Programme) zu vermeiden. Selbstverständlich können alle Segmentregister denselben Wert aufweisen. In diesem Fall findet keine Trennung von Code, Stack und Daten statt. Die .COM-Programme unter MS-DOS sind in dieser Weise strukturiert. Sie sind Relikte aus den Zeiten von CP/M, einem Betriebssystem für einfachere 8-Bit-Prozessoren. Sie unterstützten keinen in Segmente aufgeteilten Speicher. Segmentregister in .COM-Programmen haben also keine Bedeutung, es wird nur mit den Offsets gearbeitet und alle Segmentregister besitzen denselben Wert. Damit ist der Adressraum für Code und Daten auf zusammen 64 KByte (ein Segment) begrenzt.
6.4 Adressierungsarten und Befehlskodierung In den vorangegangenen Abschnitten wurden bereits Befehle wie JNZ, MOV oder CALL genannt. Wenn Sie ein Programm mit einem geeigneten Editor oder dem DOS-Befehl TYPE betrachten, so werden Sie allerdings vergeblich nach solchen Befehlen suchen. JNZ, MOV etc. werden als mnemonische Codes oder kurz Mnemonics bezeichnet. Sie dienen nur dazu, dem Programmierer eine Gedächtnisstütze zu liefern, da die Mnemonics die Operation des entsprechenden Befehls in verkürzter Form angeben (wie schön ist da eine selbstgestrickte Routine in C mit der Bezeichnung _nun_wollen_wir_Daten_einlesen).
6.4.1
Programmierung auf Prozessorebene: Mnemonics und der Assembler
Ein Assembler versteht diesen mnemonischen Code und führt eine entsprechende Kodierung in einen Maschinenbefehl aus. Maschinenbefehle sind – wie könnte es anders sein – eine Folge von Nullen und Einsen mit einem oder mehreren Byte Länge. Mit einem Assembler lassen sich aber viele Dinge erleichtern. Beispielsweise können die üblichen Assembler Makros verdauen (daher auch die Bezeichnung Makroassembler), unterschiedlichste Adressierungen ausführen und Variablen, Sprungstellen (JNZ hier_gehts_weiter) sowie Prozeduren (CALL subroutine) symbolisch ansprechen. Der Assembler setzt diese Anweisungen dann in entsprechende Maschinenbefehle um. Ein Assembler ist die maschinennaheste Möglichkeit, Programme zu erstellen. Damit können Sie auf Registerebene unmittelbar auf die Hardware einwirken. In Assembler geschriebene Programme sind im Allgemeinen sehr kompakt und äußerst schnell (wichtig bei Echtzeitanwendungen zur Maschinensteuerung). Reine Programmierung in Maschinensprache würde keine weitere Kontrolle über den Mikroprozessor bringen, sondern die Angelegenheit nur verkomplizieren und fehleranfälliger machen. In der weiteren Beschreibung von Maschinenbefehlen werden ich daher stets die mnemonischen Codes und Elemente der Assemblerprogrammierung (wie beispielsweise symbolische Sprungstellen oder Bezeichnungen von Prozeduren) benutzen.
Sandini Bib 148
6.4.2
Kapitel 6
Adressierungsarten
Soll ein Register (hier beispielsweise der Akkumulator EAX) über MOV EAX, wert mit einem Wert geladen werden, dann stehen drei Möglichkeiten zur Verfügung:
:
: :
Unmittelbarer Operand (Immediate): MOV EAX, 6a02h Das Akkumulatorregister EAX wird mit dem Wert 6a02h geladen. Dieser Wert wird zur Programmierzeit fest vorgegeben und ist Bestandteil des Programmcodes, d.h. er erscheint als Bestandteil des Befehlsstroms, der von der Busschnittstelle in die Prefetch-Queue geladen wird. Das zugeordnete Segment ist also das Codesegment CS und nicht das Datensegment DS oder ein Extrasegment. Die Steuereinheit gibt ihn aber an das Register EAX und nicht an die Ausführungseinheit weiter, wie das für einen Befehl der Fall ist. Registeroperand: MOV EAX, EBX Das Register EAX wird mit dem Wert im Register EBX geladen. Auch im obigen Beispiel war EAX ein Registeroperand (nämlich der Ziel- oder Destination-Operand). Hier ist auch der Quellen- oder Source-Operand ein Register (nämlich EBX). Speicheroperand: MOV EAX, mem32 Anstelle von mem32 muss in diesem Fall die effektive Adresse (siehe unten) des symbolischen Operanden stehen, der in den Akkumulator übertragen werden soll. Ist die effektive Adresse fest, d.h. eine bereits zur Assemblierzeit bekannte Größe, wird sie bereits vom Assembler berechnet. mem32 ist in diesem Fall ein direkter Speicheroperand. Direkte Speicheroperanden werden in einem Makroassembler meist mit einem festen Symbol bezeichnet (wie array). Weist die effektive Adresse einen veränderlichen Anteil auf, wie beispielsweise ein Register mit veränderlichem Wert, so berechnet die CPU zur Laufzeit die effektive Adresse. In diesem Fall stellt mem32 einen indirekten Speicheroperanden dar.
Als effektive Adresse bezeichnet man den Offset des Operanden innerhalb des ausgewählten Segments (hier: DS). Die effektive Adresse setzt sich aus bis zu vier Elementen zusammen:
:
:
Displacement: MOV EAX, array[0] Das erste Element des Feldes array wird in den Akkumulator geladen. array[0] ist eine symbolische Bezeichnung, wie sie ein Makroassembler verarbeiten kann, um dem Programmierer die Arbeit zu erleichtern. Im assemblierten Programm steht anstelle von array[0] eine Zahl, die die Adresse des symbolischen array[0] angibt. Befindet sich array[0] beispielsweise bei der Adresse 0f2h, so lautet der Befehl in diesem Fall MOV EAX, [0f2h]. Verwechseln Sie dies nicht mit einem unmittelbaren Operanden: Bei einem Displacement wird der Wert an der angegebenen Adresse und nicht der Wert selbst angesprochen. In unserem Beispiel wird also der Wert im Segment DS bei Offset 0f2h geladen und nicht der Wert 0f2h selbst. Basisregister: MOV EAX, [EBX] Der Befehl lädt den Operanden im Segment DS bei dem Offset, den der Wert im Register EBX angibt, in den Akkumulator. Weist EBX beispielsweise den Wert 0f2h auf, so ist dieser Befehl äquivalent zu MOV EAX, array[0]. Der Unterschied zwischen [EBX] und array[0] besteht darin, dass der Wert von EBX vom Programm dynamisch geändert werden kann, array[0] jedoch einen während des Programmablaufs stets festen und konstanten Wert darstellt. Durch eine Veränderung von EBX kann bei Verwendung einer Schleife beispielsweise das gesamte Feld array abgearbeitet werden. Das ist der Anweisung FOR I=0 TO 99 ... NEXT I in BASIC ähnlich. Als Basisregister sind EBX und EBP gültig.
Sandini Bib Programmierung und Betriebsarten
: :
149
Indexregister: MOV EAX, [ESI] In dieser Grundform ist die Verwendung des Indexregisters identisch mit der Benutzung des Basisregisters. Zusätzlich haben Sie aber beim Indexregister noch die Möglichkeit, einen Skalierungsfaktor zuzuordnen. Als Indexregister sind ESI und EDI gültig. Skalierungsfaktor: MOV EAX, [ESI*4] Um die effektive Adresse zu berechnen, wird beim angegebenen Beispiel der Wert des Indexregisters ESI mit vier multipliziert. Hierdurch können beispielsweise Felder indiziert werden, deren Elemente vier Byte lang sind. Der Prozessor führt die Skalierung (oder anders ausgedrückt: Multiplikation) mit einem Faktor größer als 1 ohne Verzögerung aus. Für den Skalierungsfaktor können Sie die Werte 1, 2, 4 und 8 verwenden. Der Skalierungsfaktor wurde mit dem 80386 in die Adressierung eingeführt.
Displacement, Basisregister, Indexregister und Skalierungsfaktor können Sie in beliebiger Kombination verwenden. Damit können Sie eine sehr ausgeklügelte und mehrdimensionale Adressierung beispielsweise von Feldelementen definieren. Beispiel: Gegeben sei ein Feld mit 10 Elementen, das 10 verschiedene Körper bezeichnet; jedes Element besitzt den Aufbau Höhe:Breite:Tiefe:Querschnitt. Die Teilelemente Höhe etc. umfassen jeweils 1 Byte. Das Feld beginnt bei 0c224h. Durch das folgende Programmfragment können die Tiefen der Elemente in den Akkumulator EAX geladen werden: MOV EBX, 0c224h ;Laden der Basisadresse in EBX MOV ESI, nr ;Laden der Elementnummer in ESI MOV EAX, [EBX+ESI*4+2] ;Tiefe (Displacement 2 gegenüber dem Beginn) des Elementes ;nr (Elementgröße=4 Byte, daher Skalierung 4) ;des Feldes (beginnend bei der Basisadresse in EBX) ;in den Akkumulator EAX laden
Beim oben angeführten Beispiel verwendet der Prozessor standardmäßig das Segmentregister DS (bzw. SS im Fall von EBP als Basisregister). Der 80386 besitzt aber noch die drei Extrasegmentregister ES bis GS und das Codesegmentregister CS. Anstelle dieser Segmentregister können auch sie benutzt werden, wenn man den Wert von ES oder CS beispielsweise in das Register DS lädt. Eine weitere Möglichkeit, das Register ES zu benutzen, bildet die Segmentüberschreibung (Segment-Override). Der Assembler erkennt eine solche Überschreibung, indem man die Bezeichnung des zu verwendenden Segments dem Speicheroperanden, abgetrennt durch einen Doppelpunkt, voranstellt. Wenn wir im oben angeführten Beispiel ein Feld in einem Segment ansprechen wollen, das durch den Wert im Segmentregister ES definiert wird, müssen wir den Befehl MOV EAX, ES:[EBX+ESI*4+2] benutzen. Eine Segmentüberschreibung ist vor allem dann vorteilhaft, wenn ein Segment nur selten angesprochen werden soll. Greifen dagegen viele aufeinanderfolgende Befehle auf das ES-Segment zu, dann ist es besser, den Wert von ES in DS zu laden. Nun wird der in DS abgelegte Wert von ES standardmäßig benutzt und Sie können sich (und dem Prozessor) die ständigen Overrides ES: sparen.
6.4.3
Befehlscodierung
Im vorherigen Abschnitt (Addresierungsarten) über das Displacement habe ich kurz erwähnt, dass der Assembler den Befehl MOV EAX, array[0] im angegebenen Beispiel in MOV EAX, 0f2h umsetzt. Wie aber erkennt der Prozessor, dass 02fh ein Displacement (eine Adresse) und keinen Wert darstellt, er also den Wert an der Adresse DS:02fh und nicht den Wert 02fh selbst in das Register AX laden soll? Den Schlüssel hierzu bildet die Kodierung der Befehle.
Sandini Bib 150
Kapitel 6
Der Prozessor kennt keine Anweisungen wie MOV AX, ES:[BX+SI*4+2] (deren ASCII-Kodierung ja auch viel zu aufwändig wäre), sondern nur Bytes und Folgen von Bytes. Daher muss der Assembler (oder Compiler im Falle von Hochsprachen) die im »Klartext« geschriebenen Befehle in eine mehr oder weniger lange Folge von Bytes umsetzen. Hierzu ist jeder Befehl in vier Hauptbestandteile aufgeteilt: Prefix(es)
Opcode
Operand(s)
Displacement/Data
Zentraler Bestandteil ist der so genannte Opcode (Operationscode). Er umfasst ein bis zwei Byte und kennzeichnet die Befehle in eindeutiger Weise. Lautet das erste Byte 00001111b, so besteht der Opcode aus zwei Byte. Einfache Befehle ohne Operanden wie CLC (Clear Carry = Carry-Flag löschen) bestehen nur aus dem Opcode und sind somit nur ein Byte lang. Umfangreiche Befehle mit Präfixen und mehreren Operanden/Displacement/Daten können hingegen bis zu 15 Byte umfassen. Präfix, Operand(en) und Displacement/Daten sind angegeben, wenn der Opcode anzeigt, dass der Prozessor derartige Informationen benötigt. Die zwei niederwertigen Bits des Opcode geben häufig die Richtung eines Datentransfers (Register nach Register/Speicher oder Speicher nach Register) sowie die Verwendung von 8-/16-Bit-Operanden (z.B. AL, AX oder EAX) an. Im Feld Operand(en) ist abgelegt, welche Register und gegebenenfalls welche direkten oder indirekten Speicheroperanden verwendet werden. Das Feld Displacement/Daten gibt ein zur Assemblierzeit festes Displacement oder einen unmittelbaren Operanden (Immediate) an. Beispiel: Die Kodierung für den oben erwähnten Befehl MOV EAX, 02fh ist je nachdem, ob 02fh ein Displacement oder einen unmittelbaren Operanden darstellt, im Opcode verschieden: Displacement: Opcode 10100011 00101111 Immediate: Opcode 10111000 00101111
Das Byte 00101111 stellt einmal das Displacement 02fh, das andere Mal den unmittelbaren Operanden (Wert) 02fh dar. Die Befehlseinheit (IU) kann anhand des unterschiedlichen Opcodes feststellen, ob ein MOVBefehl mit Displacement oder mit einem unmittelbaren Operanden vorliegt. Die IU steuert daher die Ausführungseinheit (EU) entsprechend an, sodass sie den MOV-Befehl mit Displacement oder unmittelbarem Operanden ausführt. Liegt ein Displacement vor, so steuert die EU die Adressierungseinheit an, um über die Busschnittstelle den Wert bei der Adresse DS:02fh aus dem Speicher in den Akkumulator zu übertragen. Bei 02fh als einem unmittelbaren Operanden lädt der Prozessor den Wert 02fh als Bestandteil des Befehlsstroms aus der Prefetch-Queue nach EAX. Im ersten Fall ist also ein zusätzlicher Speicherzugriff erforderlich, während die EU den unmittelbaren Operanden sofort verarbeitet. Um bei einem Displacement den Operand an der Offsetadresse 02fh im Extrasegment ES, FS oder GS statt dem standardmäßigen Datensegment DS zu verwenden, wird bei der Befehlskodierung nicht etwa ein anderer Opcode erzeugt, sondern ein Präfix vorangestellt. Dieses Segment-Override-Präfix bewirkt eine Segmentüberschreibung, d.h. eine Überschreibung des Standarddatensegments DS durch ein Extrasegment (oder auch SS oder CS). In Tabelle 6.1 finden Sie als Beispiel alle ab dem 80386 gültigen Segmentüberschreibungspräfixe.
Sandini Bib Programmierung und Betriebsarten
Segment
Präfix
CS DS SS ES FS GS
00101110 (2eh) 00111110 (3eh) 00110110 (36h) 00100110 (26h) 01100100 (64h) 01100101 (65h)
151
Tab. 6.1: Segmentüberschreibungspräfixe
Neben den Segmentüberschreibungspräfixen werden auch Wiederholungen von Stringoperationen (durch REP), die Verriegelung des Busses (durch LOCK) und ab dem 80386 die Änderung der Operanden- (16 oder 32 Bit) und Adressgröße (16 oder 32 Bit) durch ein Präfix angegeben. Der Vorteil von Präfixen gegenüber einer Kodierung im Opcode liegt auf der Hand: Präfixe werden nur eingesetzt, wenn eine Operation dies auch erfordert. Eine Kodierung im Opcode würde durch das Ansteigen der Kodierungspositionen, um auch die Information der Präfixe unterbringen zu können, unweigerlich zu einem Opcode mit einer Länge von mindestens zwei Byte führen. Damit benötigt die fallweise Kodierung mit Präfixen weniger Speicherplatz und die Programme sind kompakter. Abgesehen von einem umfangreicheren Speicherzugriff durch das Segmentüberschreibungspräfix werden Befehle mit Bezug auf ein anderes als das Standarddatensegment in derselben Zeit ausgeführt. Da die Prefetch-Queue im Hintergrund ständig nachgeladen wird, verlangsamt selbst der zusätzliche Speicherzugriff die Arbeitsgeschwindigkeit nur unter ungünstigen Umständen, beispielsweise wenn die Prefetch-Queue nach einem Sprung oder Prozeduraufruf geleert worden ist. Assembler erkennen an Bezeichnungen wie EAX oder ES: automatisch, um welche Operandengröße bzw. welches Segment es sich handelt und führen eine entsprechende Kodierung von Opcode, Operand(en) und Displacement/Daten aus sowie das Einsetzen der erforderlichen Präfixe.
6.4.4
Einlesen von Befehlen und Prefetching
Wie ich bereits erwähnt habe, dient die Prefetch-Queue der Entlastung des Bussystems, weil der Prefetcher ständig neue Befehle aus dem Speicher liest, sobald in der Prefetch-Queue ausreichend Platz ist. Ab dem 80386 wird durch sein 32-Bit-Bussystem immer dann ein Doppelwort eingelesen, wenn in der Queue vier Byte frei sind. Dieses automatische Befehls-Fetching läuft linear ab, d.h. der Prefetcher liest beginnend mit einer Startadresse immer aufeinanderfolgende Doppelworte ein. Es bleibt festzuhalten, dass der Prefetcher Sprünge und Verzweigungen ignoriert. Für bedingte Sprünge ist das auch logisch, weil der Prozessor ja zunächst die Sprungbedingung auswerten muss. Das kann aber möglicherweise eine ganze Zeit nach dem Einlesen des Sprungbefehls erfolgen. Anders sieht das bei unbedingten Verzweigungen und Subroutinenaufrufen aus: Sie werden ja immer ausgeführt. Tatsächlich haben sich die Hardware-Ingenieure für CPUs ab dem Pentium auch eine ganze Menge einfallen lassen, um den Prefetcher dazu zu zwingen, das Befehls-Fetching entsprechend den Sprungbefehlen auszuführen. Ein magisches Stichwort wäre Branch Prediction oder Verzweigungsvorhersage. Dazu erfahren Sie mehr im Kapitel 10 über den Pentium.
Sandini Bib 152
Kapitel 6
Zurück zum Befehls-Prefetching: Da der Zugriff des Prefetchers üblicherweise auf Doppelworte mit Adressen erfolgt, die ein Vielfaches von vier sind, liest die Busschnittstelle in der Regel ein ganzes Doppelwort an einer Doppelwortadresse ein. Die einzige Ausnahme betrifft den Fall, dass ein CALL- oder Sprungbefehl zu einer Speicheradresse erfolgt, die keine Doppelwortadresse darstellt. In diesem Fall liest der Prefetcher über die Buseinheit nur ein bis drei Byte ein, bis für den nächsten Zugriff wieder eine Doppelwortadresse erreicht ist. Anschließend wird stets ein ganzes 32-Bit-Doppelwort mit Doppelwortadresse eingelesen (sofern in der Prefetch-Queue vier Byte frei sind). Speicherzugriffe durch einen Maschinenbefehl wie z.B. MOV reg, mem haben natürlich Vorrang vor dem Befehls-Fetching. Führt der Prozessor einen solchen Befehl aus, dann muss der Prefetcher warten, bis der Speicherzugriff abgeschlossen ist. Während der Ausführung von Befehlen ohne Speicherzugriff, wie z.B. ADD reg, reg, und der internen Abarbeitung eines Befehls in einer Phase, die keinen Speicherzugriff benötigt, kann der Prefetcher dagegen ungestört und ohne die Befehlsausführung im Prozessor zu stören, ein Doppelwort in die Prefetch-Queue einlesen. Das sichert eine maximale Auslastung des Speicherbusses und eine fast immer gefüllte Prefetch Queue. Der Prozessor bricht das Prefetching ab, wenn die Befehlseinheit (IU) einen CALL- oder Sprungbefehl erfasst und den Aufruf bzw. Sprung auch tatsächlich anweist (d.h. die Aufruf- oder Sprungbedingung ist erfüllt). In diesem Fall leert der Prozessor seine Prefetch Queue, invalidiert die bereits dekodierten Befehle in der Befehlseinheit IU und beginnt an der Sprungadresse mit dem Einlesen der neuen Befehle. Auch jetzt wird das Prefetching wieder linear ausgeführt, bis ein weiterer CALL- oder Sprungbefehl ausgeführt wird. Gleiches gilt natürlich auch für REToder IRET-Befehle. Das Problem ist, dass der nächste Befehl nicht nur zuerst eingelesen, sondern auch dekodiert werden muss. Beachten Sie, dass Befehle bis zu 15 Byte umfassen können, sodass zum Einlesen eines Befehls bis zu vier Buszyklen notwendig sind. Diese Zyklen kommen dann zur Dekodier- und Ausführungszeit dazu. Die in den Handbüchern angegebenen Ausführungszeiten beziehen sich stets auf die reine Ausführungszeit. Sie sind also nur dann gültig, wenn der Befehl bereits vollständig eingelesen und dekodiert worden ist. Das Prefetching sorgt dafür, dass in den meisten Fällen die Befehle rechtzeitig in dekodierter Form zur Ausführung bereitstehen. Wenn Sie sich vorstellen, dass sich ohne Prefetching für jeden Befehl noch die Befehlslese- und Befehlsdekodierzeit bemerkbar machen würden, dann erkennen Sie, welchen PerformanceGewinn man durch das relativ einfach zu realisierende Prefetching erzielt. Bei einem Sprung oder Prozeduraufruf zu einer Adresse, die außerhalb des vom Prefetcher bereits eingelesenen Codebereichs liegt, muss die Steuereinheit recht lange auf den nächsten dekodierten Befehl warten. Liegt das Sprungziel noch innerhalb der Queue und umfasst der Befehl auch nur wenige Byte, sodass er bereits vollständig eingelesen worden ist, dann muss er nur noch dekodiert werden, der Befehlslesezyklus entfällt. Wird überhaupt kein Sprung ausgeführt (weil die Sprungbedingung für z.B. JNE nicht erfüllt ist), dann macht der Prozessor ohne Verzögerung weiter. Wenn Sie einmal mit einem Debugger ein compiliertes Programm untersuchen, so werden Sie feststellen, dass es vor lauter JUMPs und CALLs nur so wimmelt, z.B. setzen Compiler die CASE-Anweisung der Sprache C häufig in eine Vielzahl von bedingten JUMPs um. Liegt die Zieladresse außerhalb des Bereichs, der durch die Prefetch-Queue abgedeckt ist, muss der Prozessor mit dem Befehls-Fetching und der Dekodierung von vorne beginnen. Die Umsetzung des Source-Codes in eine ungünstige Folge von JUMP-Befehlen kann die Ausführungszeit eines Programms sehr nachteilig beeinflussen.
Sandini Bib Programmierung und Betriebsarten
153
6.5 Der Real Mode, High-Memory-Area und HIMEM.SYS Der 80386 und die Weiterentwicklungen können aus Kompatibilitätsgründen neben den moderneren Modi Protected und Virtual 8086 auch im Real Mode betrieben werden. Er bildet dann wie der 8086 eine lineare Adresse durch Multiplikation des Segmentregisterwerts mit 16 und Addition des Offsets. Beim 8086 ist die ausgegebene Adresse streng auf unter 1M begrenzt, weil in der Adressierungseinheit aufgrund des 20-Bit-Adressbusses nur ein 20-Bit-Addierer zur Verfügung steht. Da sowohl die Segment- als auch die Offsetregister eine Breite von 16 Bit aufweisen, ist ihr maximaler Wert jeweils gleich ffffh. Addiert man das Segment ffffh und den Offset ffffh im Real Mode, um eine physikalische Adresse zu ermitteln, so erhält man folgenden Wert: Segment (* 24) + Offset phys. Adresse
ffff0h ffffh 10ffefh
Da der 8086/88 nur einen 20-Bit-Adressbus und damit in der Adressierungseinheit (AU) nur einen 20-Bit-Adressaddierer besitzt, fällt die führende 1 als Übertrag weg und wird ignoriert. Es bleibt damit ffefh als physikalische Adresse übrig. Diese fällt in das erste 64 KByte-Segment des Adressraums, es findet ein so genanntes Wrap-around statt. Ab dem 80386 fällt die Beschränkung auf 20 Bit natürlich weg, weil der 80386 erstmalig durch seinen 32-Bit-Adressbus auch einen 32-Bit-Addierer in der Adressierungseinheit besitzt und dadurch lineare Adressen mit 32 Bit erzeugen kann. Daher wird die führende 1 hier nicht als Übertrag ignoriert, sondern es werden insgesamt 21 Adressleitungen aktiviert, sodass die CPU im Real Mode mit einem »beschränkten« 21-Bit-Adressbus arbeitet. Aus diesem Grund können die Bytes mit den Adressen 10000h bis 10ffefh im Extended Memory angesprochen werden. Die 1-MByte-Grenze im Real Mode ist also um fff0h (65.520) Bytes oder knapp 64 KByte durchbrochen worden (siehe Abbildung 6.2). Diesen Speicherbereich bezeichnet man als High Memory Area. Er kann von DOS und Real-Mode-Anwendungsprogrammen als 10%ige Speichererweiterung über die 640 KByte Basisspeicher hinaus verwendet werden. Typischerweise werden dort Teile von DOS und Treiber abgelegt. Die Ausgabe der Adresse 10ffefh entspricht natürlich nicht einem »echten« 21-Bit-Adressbus, da mit 21 Adressbits ja die Bytes von 00000h bis 1fffffh und nicht nur bis 10ffefh angesprochen werden können. Der Gerätetreiber HIMEM.SYS wurde beginnend mit der DOS-Version 4.00 ausgeliefert, um diese knapp ersten 64 KByte über der 1-MByte-Grenze in klar definierter Weise im Real Mode ansprechen zu können. Da auch Gerätetreiber wie SMARTDRV.SYS oder RAMDRIVE.SYS diesen Speicherabschnitt benutzen, kann es bei einem Zugriff darauf ohne HIMEM.SYS zu einer Kollision der Daten kommen. Ein weiteres Problem entsteht mit bestimmten MS-DOS-Versionen: Manche internen und nicht dokumentierten Funktionen verlassen sich auf den Wrap-around des 8086/8088. Ab einem 80386 findet dieser aber niemals statt. Man kann die CPU dann aber überlisten, indem man die Adressleitung A20 mit dem 21. Adressbit durch ein externes Gatter auf low (0) zwingt. Der Speicher wird dann effektiv wie mit einem Wrap-around bei einer Adresse über 1 MByte adressiert. Die Steuerung des Gatters zum Aktivieren und Deaktivieren der Adressleitung A20 erfolgte ursprünglich über den Tastaturcontroller und wird nunmehr mit Hilfe einer Schaltung im Chipset realisiert. HIMEM.SYS ist neben anderen Aufgaben auch dafür zuständig, dass nur bei einem gewollten Zugriff auf die ersten 64 KByte des Extended Memories die Leitung A20 aktiviert und ansonsten durch eine Deaktivierung von A20 ein Wrap-around im Prozessor emuliert wird. SMARTDRV.SYS und RAMDRIVE.SYS verwenden dagegen den Protected Mode, um auf den Extended Memory zuzugreifen. Das darf aber nicht zu einer Kollision mit den Daten in den ersten 64 KByte der High Memory Area führen. Im Protected Mode stehen
Sandini Bib 154
Kapitel 6
alle 32 Adressleitungen des Adressbusses uneingeschränkt zur Verfügung. Auch bestimmte Funktionen von HIMEM.SYS können dazu benutzt werden, auf den Extended Memory im Protected Mode zuzugreifen. Speicher 1000000h
Extended Memory
i386 32-Bit-CPU
8086 10ffefh 100000h
Offset
ffffh
Segment
ffffh
65.520 Byte 1MB-Grenze UMBs 640kB-Grenze
ffffh
Offset
ffffh
Segment
ffefh
65.520 Byte
0h
Abb. 6.2: Wenn im Real Mode der Wert des Segmentregisters mit 16 multipliziert und der Offset hinzuaddiert wird, kann das Ergebnis größer als 1M sein. Durch die 32 Adressleitungen wird diese Adresse über 1M im Gegensatz zum 8086 mit einem 20-Bit-Adressbus auch nach Außen abgegeben.
Die Adresserzeugung im Real Mode unterscheidet sich bei 32-Bit-CPUs aber noch in einem weiteren Punkt von der beim 8086 oder seinem Nachfolger 80286. Durch die 32-Bit-Offsetregister kann die 32-Bit-CPU mit Hilfe von Adresspräfixen eigentlich 32-Bit-Adressen ausgeben. Wird der Inhalt eines 32-Bit-Offsetregisters als Adresse verwendet und liegt der Wert der erzeugten effektiven Adresse über ffffh, so erzeugt z.B. der 80386 jedoch eine so genannte Pseudo-Protection-Exception ohne Fehlercode, die zu einem Interrupt 12 oder 13 führt (siehe nächstes Kapitel). Dadurch wird die Erzeugung von linearen Adressen jenseits von 10ffefh unterbunden (schade, sonst würde bereits im Real Mode der gesamte Adressraum von 4 GByte statt der jämmerlichen 1 MByte zur Verfügung stehen). Zu den ungültigen Opcodes zählen im Real Mode übrigens auch alle Befehle, die rein für den Protected Mode vorgesehen sind, so z.B. LLDT zum Laden der lokalen Deskriptortabelle (einer Datenstruktur, die nur im Protected Mode verwendet wird). Erwähnen möchte ich an dieser Stelle noch, dass es neben der High auch eine Upper Memory Area gibt. Der für ROMs vorgesehene Adressbereich zwischen 640 KByte und 1 MByte des RealMode-Adressraums ist ja nur in seltenen Fällen auch von ROMs komplett belegt. Speichercontroller können dann einen RAM-Abschnitt in den ROM-Bereich einblenden, wenn dort kein ROM installiert ist. Somit hat der Prozessor im Real Mode die Möglichkeit, mit Hilfe des Speichercontrollers zusätzlich ein paar KBytes anzusprechen, die möglicherweise aber wichtig sind, damit speicherresidente Programme (Maustreiber u.ä.) nicht den Hauptspeicher belegen und Windows dadurch nicht starten kann.
Sandini Bib Programmierung und Betriebsarten
155
6.6 Interrupts und Exceptions Aus dem Zusammenwirken von Busschnittstelle, Prefetch-Queue, Ausführungseinheit etc. des Prozessors ist unschwer zu erkennen, dass der Prozessor unaufhörlich Befehle ausführt. Hat er einen Befehl abgearbeitet, so wird der nächste geladen und ausgeführt. Auch wenn Ihr PC scheinbar darauf wartet, dass Sie einen Befehl oder Text eingeben, bedeutet das nicht, dass der Prozessor auch wirklich angehalten wird, um erst mit Ihrer Eingabe die Arbeit wieder aufzunehmen. Vielmehr läuft im Hintergrund eine Routine ab, die ständig die Tastatur überprüft, um zu ermitteln, ob Sie bereits ein Zeichen eingetippt haben. Es wird also eine Programmschleife ausgeführt. In Abhängigkeit von der Quelle einer Unterbrechung (der deutsche Ausdruck für Interrupt) unterscheidet man drei Kategorien von Interrupts:
: : :
Software-Interrupts Hardware-Interrupts Exceptions (Ausnahmen)
6.6.1
Software-Interrupts
Ein Software-Interrupt wird gezielt durch einen INT-Befehl ausgelöst. Z.B. ruft der Befehl INT 10h den Interrupt mit der Hex-Nummer 10h auf. Abbildung 6.3 zeigt die Prozedur, die bei einem Interrupt im Real Mode ausgeführt wird. Speicher
ge
le
ab
i386 CPU
n
n ge
ab
ab
le
le
ge
n
Stack
Interrupt-Handler Einsprungpunkt (IP)
EFlags
CS
EIP
Verweis
en lad den la
Interrupt-Vektortabelle EIP255 CS255 ... ... EIP2 CS2 EIP1 CS1 EIP0 CS0
Verweis
CS
Interrupt ... Interrupt Interrupt Interrupt
255 2 1 0
Abb. 6.3: Wenn ein Interrupt ausgelöst wird, legt die CPU automatisch die aktuellen Flags, den Befehlszähler EIP und das Codesegment CS auf dem Stack ab. Die Nummer des Interrupts wird intern mit vier multipliziert und liefert dadurch denjenigen Offset im Segment 00h, bei dem sich der Interrupt-Vektor zur Bedienung des Interrupts befindet. Ein Interrupt-Vektor ist eine Adresse im Format Segment:Offset, die auf den Einsprungpunkt des zugehörigen Handlers zeigt. Der 80386 lädt EIP und CS mit den Werten in der Tabelle.
Sandini Bib 156
Kapitel 6
Im Real-Mode-Adressraum sind die ersten 1024 (1k) Byte für die Interrupt-Vektortabelle reserviert. Diese Tabelle weist für jeden der 256 möglichen Interrupts einen so genannten InterruptVektor auf. Von allen Speicherverwaltungsregistern besitzt das Interrupt-Deskriptor-Table-Register IDTR bereits im Real Mode eine Bedeutung. Es speichert nämlich die Basisadresse und das Limit der Real-Mode-Deskriptortabelle. Nach einem Prozessor-Reset wird das IDTR standardmäßig mit den Werten 00000000h für die Basis und 03ffh für das Limit geladen. Das entspricht exakt einer 1KByte-Tabelle bei Segment 0000h, Offset 0000h. Durch die beiden Befehle LIDT (Load IDTR) und SIDT (Store IDTR) können die beiden Werte aber verändert und die Tabelle dadurch mit anderer Größe an eine beliebige Stelle des Real-Mode-Adressraums verschoben werden. Achten Sie aber darauf, dass die Tabelle auch alle Vektoren für die möglicherweise auftretenden Interrupts aufnehmen kann. Sonst ist eine Exception 8 die Folge (siehe unten). Jeder Interrupt-Vektor ist vier Byte lang und gibt im Intel-Format die Adresse Segment:Offset des Interrupt-Handlers an, der den Interrupt bedient. Da ein Interrupt meist eine bestimmte Ursache hat, wie die Anforderung einer Betriebssystemfunktion, der Empfang eines Zeichens über die serielle Schnittstelle etc., behandelt der Interrupt-Handler diese Ursachen in geeigneter Weise. Er führt also beispielsweise die Betriebssystemfunktion aus oder nimmt das empfangene Zeichen entgegen. Durch Ersetzen des Handlers kann einem Interrupt auf einfache Weise eine andere Funktion zugeordnet werden. Die Zuordnung von Interrupt und Interrupt-Vektor erfolgt auf einer eins-zu-eins-Basis, d.h. dem Interrupt 0 wird der Interrupt-Vektor 0 (an der Adresse 0000:0000), dem Interrupt 1 der Interrupt-Vektor 1 (an der Adresse 0000:0004) usw. zugeordnet. Damit muss nur die Nummer des Interrupts mit 4 multipliziert werden und man erhält den Offset des Interruptvektors im Segment 0000h. Der Prozessor führt genau diese Multiplikation aus, um aus der Interruptnummer dessen Adresse zu ermitteln. Neben dem Bereich f000:fff0 bis f000:ffff für den Prozessor-RESET existiert damit ein zweiter für den Prozessor reservierter Adressbereich. Diese Adressbereiche stehen für Anwendungsprogramme nicht zur Verfügung. Ein Überschreiben der Interrupt-Vektortabelle mit ungültigen Werten hat katastrophale Folgen: Beim nächsten Interrupt stürzt der Rechner ab. Beim Aufruf eines Interrupts läuft nun folgende Prozedur (siehe Abbildung 6.3) ab, die ab dem 80386 automatisch und ohne weiteres Eingreifen eines Programms ausführt wird:
: : :
Die CPU schiebt die EFlags, CS und EIP – in dieser Reihenfolge – auf den Stack (im 16-BitModus natürlich nur Flags, CS und IP). Das Interrupt- und Trap-Flag werden gelöscht. Die CPU adressiert den Interrupt-Vektor in der Interrupt-Vektortabelle entsprechend der Nummer des Interrupts und lädt EIP (oder IP im 16-Bit-Modus) sowie CS aus der Tabelle.
CS:EIP des Interrupt-Vektors gibt den Einsprungpunkt des Interrupt Handlers an. Damit setzt der Prozessor seine Arbeit mit dem Interrupt Handler fort. Die Rückkehr zum aufrufenden Programm erfolgt über ein IRET. Beispiel: INT 10h Der Prozessor schiebt die aktuellen Flags, CS und EIP auf den Stack, löscht das Interrupt- und Trap-Flag und liest den Interrupt-Vektor an der Adresse 0000:0040. Die zwei Bytes bei 0000:0040 werden in EIP, die beiden Bytes bei 0000:0042 in CS geladen (beachten Sie das INTEL-Format low-high).
Sandini Bib Programmierung und Betriebsarten
157
Die CPU lädt den Offsetwert des Handlers im 32-Bit-Modus zwar in EIP, aber der Offset in der Interrupt-Vektortabelle umfasst aus Kompatibilitätsgründen mit den 16-Bit-Vorgängern 8086 und 80286 des 80386 nur 16 Bit. Die zwei höherwertigen Bytes in EIP werden dann einfach mit dem Wert 0000h aufgefüllt. Von Interesse ist auch die Kodierung eines INT-Befehls. Sie lautet: INI 3
INI 0..2, 4..255
11001100
11001101 vvvvvvvv
11001100 bzw. 11001101 stellt den Opcode dar und vvvvvvvv gibt die Nummer des Interrupts an: Der Befehl INT 3 besteht also aus nur einem Byte. Im Abschnitt Exceptions erfahren Sie Näheres zu diesem Interrupt. Für alle anderen INT-Befehle ist nur eine unmittelbare Adressierung möglich, d.h. die Nummer des Interrupt-Vektors ist Teil des Befehlsstroms. Damit kann die Nummer des Interrupts nicht in einem Register oder Speicheroperanden bereitgehalten werden. Software-Interrupts treten synchron zur Programmausführung auf, d.h. jedesmal, wenn das Programm den Punkt mit dem INT-Befehl erreicht, wird ein Interrupt ausgelöst. Das unterscheidet sie wesentlich von den Hardware-Interrupts und Exceptions.
6.6.2
Hardware-Interrupts
Wie schon der Name sagt, werden diese Unterbrechungen durch einen Hardware-Baustein oder ein Peripheriegerät wie beispielsweise eine Schnittstellenkarte ausgelöst. Man unterscheidet zwei grundsätzlich verschiedene Arten von Hardware-Interrupts: den nicht maskierbaren Interrupt NMI sowie (maskierbare) Interrupt-Anforderungen IRQ. Für die Bedienung eines solchen IRQs spielt der Interruptcontroller eine große Rolle, denn er verwaltet mehrere Interrupt-Anforderungen und gibt sie geordnet nach ihrer Priorität gezielt an den Prozessor weiter. Löst der Computer einen NMI aus, so wird dem NMI-Anschluss des Prozessors ein aktives Signal zugeführt. Die CPU arbeitet den gerade ausgeführten Befehl ab und führt unmittelbar anschließend in gleicher Weise wie oben einen Interrupt 2 aus. Beim PC wird ein NMI ausgelöst, wenn beim Lesen von Daten aus dem Speicher ein Paritätsfehler oder ein anderes ernstes Hardware-Problem, wie z.B. eine fehlerhafte Busarbitrierung, auftritt. Der Computer meldet sich dann bei einem Paritätsfehler mit der folgenden (oder einer ähnlichen) Nachricht: Paritätsfehler bei xxxx:xxxx
xxxx:xxxx gibt das Byte mit dem Paritätsfehler an. Die Besonderheit des NMIs ist, dass er (wie auch hier bereits der Name ausdrückt) nicht unterdrückt, d.h. maskiert, werden kann. Ein NMI drängelt sich immer nach vorne. Da er normalerweise nur bei einer wirklich schwerwiegenden Fehlfunktion der Hardware ausgelöst wird, ist dies aber verständlich und auch richtig. Demgegenüber können Interrupt-Anforderungen IRQ maskiert werden, indem man mit CLI das Interrupt-Flag IE löscht. Alle Interrupt-Anforderungen über den Anschluss INTR (Pin B7, beim 80386) werden ignoriert. Erst durch den umgekehrten Befehl STI werden solche Interrupts wieder zugelassen. Beachten Sie dabei, dass der Software-Befehl INT xx implizit ein CLI ausführt. Sie müssen also nach einem INT-Befehl explizit mit einem STI Interrupt-Anforderungen wieder zulassen, sonst wird der Computer taub. Interrupt-Anforderungen werden üblicherweise durch ein Peripheriegerät ausgelöst, beispielsweise, wenn die serielle Schnittstelle dem Prozessor mitteilen möchte, dass sie gerade ein Zeichen empfangen hat.
Sandini Bib 158
Kapitel 6
Hardware-Interrupt-Anforderungen werden durch den Interrupt-Controller (im Chipset) verwaltet. Empfängt dieser ein Signal, das anzeigt, dass ein Hardware-Interrupt ausgelöst werden soll, so führt er dem INTR-Eingang der CPU ein Anforderungssignal (Interrupt-Request) zu. Kann der Prozessor den Interrupt bedienen (ist IE gesetzt), gibt er ein Bestätigungssignal INTA (Interrupt Acknowledge) aus, indem er die Steuersignale M/IO, D/C und W/R jeweils auf einen niedrigen Pegel setzt. Die CPU erhält dann vom Interruptcontroller die Nummer des auszuführenden Interrupts. Der Prozessor fährt nun in gleicher Weise wie oben beschrieben fort und ruft den entsprechenden Interrupt-Handler auf. Hardware-Interrupts (NMI und IRQ) sind im Gegensatz zu Software-Interrupts völlig asynchron zur Programmausführung. Beispielsweise benötigt die Festplatte in Abhängigkeit von der Ausgangsstellung der Schreib-/Leseköpfe eine unterschiedliche Zeitspanne, bis die Daten zum Prozessor übertragen werden können. Dies macht die Erfassung von Programmfehlern sehr schwierig, wenn sie nur im Zusammenwirken mit Hardware-Interrupts auftreten.
6.6.3
Exceptions
Zwei Quellen für Interrupts haben wir bereits kennen gelernt, eine dritte bildet der Prozessor selbst. Interrupts, die vom Prozessor erzeugt werden, bezeichnet man als Exceptions (Ausnahmen). Die Auswirkungen einer Exception entsprechen dabei einem Software-Interrupt, d.h. es wird ein Interrupt aufgerufen, dessen Nummer in diesem Fall vom Prozessor selbst angegeben wird. Ursache für eine Exception ist im Allgemeinen eine Prozessor-interne Fehlerbedingung, die den Eingriff von Systemsoftware erfordert und vom Prozessor nicht mehr allein behandelt werden kann. Exceptions werden nach drei Klassen unterschieden: Faults, Traps und Aborts. Im Folgenden möchte ich kurz die Kennzeichen der drei Klassen beschreiben.
:
:
:
Fault: Ein Fault löst eine Exception aus, bevor der Befehl vollständig ausgeführt wird. Der gesicherte EIP-Wert zeigt damit auf den Befehl, der die Exception ausgelöst hat. Durch Laden des gesicherten EIP-Wertes (z.B. über IRET) kann der Prozessor den Befehl nochmals ausführen, hoffentlich ohne erneut eine Exception auszulösen. Ein Beispiel für einen Fault wäre die Exception »Segment nicht vorhanden«. Der Prozessor hat dann die Möglichkeit, das Segment nachzuladen und einen erneuten Zugriffsversuch zu wagen. Trap: Ein Trap löst dagegen eine Exception aus, nachdem der Befehl ausgeführt worden ist. Der gesicherte EIP-Wert zeigt also auf den Befehl unmittelbar nach dem Befehl, der die Exception ausgelöst hat. Der Befehl wird also nicht nochmals ausgeführt. Traps sind günstig, wenn der Befehl zwar korrekt ausgeführt worden ist, aber das Programm trotzdem unterbrochen werden soll. Das gilt z.B. für die Haltepunkte eines Debuggers; hier sollen die Befehle ja ausgeführt werden und nur der Debugger prüft dann die Registerinhalte etc. Ein nochmaliges Ausführen des entsprechenden Befehls würde zu einem fehlerhaften Befehlsfluss führen. Abort: Ein Abort liefert im Gegensatz zu Faults und Traps nicht immer die Adresse des Fehlers. Dadurch kann nach einem Abort die Programmausführung mitunter nicht wieder aufgenommen werden. Aborts werden nur dazu benutzt, äußerst schwerwiegende Fehlfunktionen anzuzeigen, wie z.B. Hardwareausfälle oder ungültige Systemtabellen.
Ein großer Teil der Exceptions ist für den Betrieb im Protected Mode vorgesehen. Im Real Mode sind nur die folgenden Exceptions von Bedeutung:
Sandini Bib Programmierung und Betriebsarten
: :
:
: : :
: : : : :
159
Division durch 0 (Exception 0): Ist bei einem Befehl DIV oder IDIV der Divisor gleich Null, dann ist das Ergebnis der Operation nicht einmal mathematisch definiert. Ist eine Division nicht nach einer bestimmten Zahl von Taktzyklen beendet, ermittelt die Steuereinheit eine Division durch 0 und löst eine Exception 0 aus. Einzelschritt (Exception 1): Ist das Trap-Flag gesetzt worden, so löst der Prozessor nach jedem einzelnen ausgeführten Befehl eine Exception 1 aus. Da das Trap-Flag beim Aufruf eines Interrupts automatisch gelöscht wird, kann der Prozessor die Interrupt-Routine ohne Unterbrechung ausführen. Häufig setzen Debugger das Trap-Flag und fangen den Interrupt ab, um ein Programm schrittweise ausführen zu können. Breakpoint (Exception 3): Eine Breakpoint-Exception kann prinzipiell auf zweierlei Weise zustande kommen. Die CPUs besitzen interne Debug-Register, mit deren Hilfe sie unter bestimmten Umständen einen Interrupt 3 erzeugen. Außerdem kann ein Debugger an der Stelle eines Befehls einen Breakpoint setzen, indem er den Befehl (oder dessen erstes Byte) mit dem Opcode 11001100 für den Befehl INT 3 überschreibt. Erreicht die Ausführung des Programms diesen Punkt, so wird eine Exception 3 ausgelöst, der Programmablauf also unterbrochen. Um das Programm fortzusetzen, überschreibt der Debugger den Opcode 11001100 mit dem ursprünglich an dieser Stelle vorhandenen Byte und führt ein IRET aus. Natürlich kann der Prozessor auch durch einen expliziten Befehl INT 3 einen SoftwareInterrupt 3 auslösen. Das geht auch bei allen anderen Exceptions, nur liegt eigentlich kein Grund für den folgenden Interrupt vor, weil die Quelle des Interrupts nicht in einer Fehlerbedingung im Prozessor liegt, sondern in einem expliziten Software-Interrupt. Überlauferfassung mit INTO (Exception 4): Ist das Overflow-Flag gesetzt und wird der Befehl INTO ausgeführt, so erzeugt der Prozessor eine Exception 4. BOUND (Exception 5): Liegt der mit dem Befehl BOUND geprüfte Index in ein Feld außerhalb der Grenzen des Feldes, so wird eine Exception 5 erzeugt. Ungültiger Opcode (Exception 6): Stößt die Befehlseinheit auf einen Opcode, dem kein Befehl zugeordnet werden kann, so löst der Prozessor eine Exception 6 aus. Ursache für ungültige Opcodes sind meistens fehlerhafte Assembler oder Compiler oder ein Programmfehler, der zu einem Sprung an eine Stelle führt, bei der eigentlich kein Opcode, sondern z.B. ein Datenwort steht, die Befehlseinheit das Datenwort entsprechend dem Programmfluss aber als Opcode interpretiert. Kein Coprozessor vorhanden (Exception 7): Erfasst die Befehlseinheit einen Opcode, der einen Befehl für den Coprozessor angibt (also einen ESC-Befehl) und ist gar kein Coprozessor vorhanden, so löst die CPU eine Exception 7 aus. IDT-Limit zu klein (Exception 8): Ist das Limit der IDT zu klein, um den Vektor des ausgelösten Interrupts aufzunehmen, dann führt das zu einer Exception 8. Das ist meist der Fall, wenn ein Programm die IDT angesprochen und in unkorrekter Weise verändert hat. Stack-Exception (Exception 12): Der Stapelzeiger ESP lieferte einen größeren Wert als ffffh für den Stack-Zugriff. Das kann vorkommen, weil ESP ein 32-Bit-Register darstellt und sein Wert nicht auf unter 1M beschränkt ist. Eine Exception 12 ist die Folge, um die Erzeugung von linearen Adressen über 10ffefh im Real Mode zu unterbinden. Allgemeiner Protection-Fehler (Exception 13): Ein 32-Bit-Offsetregister lieferte eine größere effektive Adresse als ffffh für einen Speicherzugriff. Wie für den Stapelzeiger ESP wird dadurch die Erzeugung von linearen Adressen über 10ffefh im Real Mode unterbunden und der Prozessor löst eine Exception 13 aus. Coprozessor-Fehler (Exception 16): Im Coprozessor(teil) ist ein Fehler aufgetreten und der Prozessor hat das dadurch aktivierte Signal ERROR erfasst. Die Folge ist ein Interrupt 16.
Sandini Bib 160
Kapitel 6
6.7 Der Protected Mode Der Protected Virtual Address Mode oder kurz Protected Mode wurde beginnend mit dem 80286 implementiert, um (wie der Name schon sagt) die verschiedenen Tasks unter einem Multitasking-Betriebssystem zu schützen. Zu diesem Zweck prüft die Prozessor-Hardware den Zugriff eines Programms auf Daten und Codes und vergibt Berechtigungen für einen solchen Zugriff auf insgesamt vier Schutzebenen. Damit sind Daten und Code geschützt und ein kompletter Systemabsturz des PCs ist normalerweise nicht möglich. In der Praxis wird unter Windows der Beweis angetreten, dass dies dennoch möglich ist. Da dies unter Linux aber nicht der Fall ist, kann man sicher die Frage aufwerfen, ob sich Windows auch konsequent an die (Intel)Vorschriften des Protected Modes hält. Die Zugriffsprüfungen im Protected Mode dienen vor allem zur Hardwareunterstützung eines Multitasking-Betriebssystems; typische Vertreter sind OS/2, Linux und Windows NT bzw. Windows 2000. Unter einem Multitasking-Betriebssystem laufen mehrere Programme (Tasks) scheinbar parallel ab. Genauer gesagt werden die einzelnen Tasks vom Betriebssystem in kurzen Zeitabständen aktiviert, laufen eine kurze Zeit ab und werden dann vom Betriebssystem wieder unterbrochen, sodass dieses einen anderen Task aktivieren kann. Im Gegensatz zu den TSR-Programmen unter MS-DOS (beispielsweise PRINT) werden die Programme also gezielt vom Betriebssystem aufgerufen, TSR-Programme dagegen aktivieren sich selbst, indem sie beispielsweise den periodischen Timer-Interrupt abfangen. In einem Multitasking-Betriebssystem wird also häufig in kurzer Zeit zwischen den einzelnen Tasks umgeschaltet, d.h. es wird ein Task Switch ausgeführt, sodass der Benutzer den Eindruck hat, die Programme würden parallel arbeiten. Durch die Hardware-Unterstützung der CPUs im Protected Mode können diese Task-Switches schnell und effektiv ausgeführt werden. Ein weiterer wesentlicher Unterschied des Protected Modes gegenüber dem Real Mode ist die andersartige Berechnung der linearen Adresse eines Speicherobjekts. In den folgenden Abschnitten wollen wir uns den Besonderheiten des Protected Modes im Detail zuwenden.
6.7.1
Segmentselektoren, Segmentdeskriptoren und Privilegierungsstufen
Wie oben beschrieben, multipliziert die Adressierungseinheit der CPU im Real Mode den Wert des Segmentregisters einfach mit dem Wert 16, um die lineare Basisadresse des betreffenden Segments zu ermitteln. Die Adresse innerhalb eines solchen 64 KByte-großen Segments wird dann durch den Offset in einem Vielzweckregister angegeben. Im Protected Mode werden die Werte in den Segmentregistern völlig anders interpretiert, sie stellen keine Basisadressen, sondern so genannte Selektoren dar. In Abbildung 6.4 ist der Aufbau eines solchen Segmentselektors angegeben. 15
3
Index Index: TI: RPL:
Index in GDT oder LDT Tabellenindikator 0=GDT 1=LDT Requested-Privilege-Level 00=0 01=1 10=2 11=3
Abb. 6.4: Der Aufbau eines Segmentselektors
2
1
0
TI RPL
Sandini Bib Programmierung und Betriebsarten
161
Der Selektor ist wie im Real Mode 16 Bit lang und wird in einem 16-Bit-Segmentregister gespeichert. Die beiden niederwertigsten Bits 0 und 1 geben die Selektor- oder geforderte Privilegierungsstufe an (RPL: Requested Privilege Level), ab der ein Programm auf das Segment zugreifen darf – wir sind hier erstmals mit einer Zugriffsprüfung des Protected Modes konfrontiert. Der Wert des Feldes RPL im Segmentselektor des Code-Segments CS wird als gegenwärtige Privilegierungsstufe oder Current-Privilege-Level (CPL) bezeichnet, da dem gegenwärtig aktiven Programmcode diese Privilegierungsstufe zugewiesen ist. Das aktive Programm kann also auf Datensegmente zugreifen, deren Wert der Privilegierungsstufe gleich wie oder größer als CPL ist. Dabei kann der Wert von RPL größer als CPL sein, d.h. auf das vom Selektor festgelegte Segment wird mit einer geringeren Privilegierungsstufe zugegriffen. Der größere der beiden Werte CPL und RPL definiert die effektive Privilegierungsstufe (EPL) des Tasks. Der Prozessor (ab 80286) kennt insgesamt vier Privilegierungsstufen (PL) 0 bis 3. Die Null kennzeichnet die höchste und die drei die niedrigste Stufe. Beachten Sie also, dass ein größerer Wert eine niedrigere Privilegierung und umgekehrt bedeutet. Ein RPL mit dem Wert 0 schränkt also die Privilegierungsstufe eines Tasks nicht ein, wohingegen ein Selektor mit einem RPL von 3 unabhängig vom CPL nur Segmente ansprechen kann, die eine Privilegierungsstufe von 3 aufweisen. Programme mit niedrigerer Privilegierungsstufe (höherem CPL) dürfen nur in Ausnahmefällen auf Segmente mit höherer Stufe (kleinerem CPL) zugreifen. Hierzu dienen so genannte Gates (Tore). Damit wird der Schutz (Protection) innerhalb eines Tasks durch die verschiedenen Privilegierungsstufen vermittelt. In Abbildung 6.5 ist das Konzept der abgestuften Pivilegierungsstufen grafisch dargestellt.
Gate Gate
r Treibe r -E BS
Kernel PL=0
2 =3
P we L=1 L= i te r ungen P PL
Abb. 6.5: Um die verschiedenen Tasks in einer Multitasking-Umgebung vor Fehlern in einem anderen Task zu schützen, wird jedem Task eine von vier Privilegierungsstufen zugeordnet. Der Betriebssystem-Kernel besitzt die höchste Privilegierung PL=0, Anwendungsprogramme dagegen die geringste Stufe PL=3. Ein Sprung zu einem Task höherer Privilegierungsstufe ist nur über ein Gate möglich.
Die höchste Privilegierungsstufe 0 besitzt üblicherweise der kritische Teil oder Kernel des Betriebssystems. Dieser umfasst zumeist die Routinen zur Speicherverwaltung, dem Ausführen von Task-Switches, die Behandlung von kritischen Fehlern etc. Viele Befehle, die den Status des Prozessors oder Computers direkt betreffen, wie beispielsweise LGDT (globale Deskriptortabelle laden) oder LMSW (MSW laden) können im Protected Mode nur von einem Programm ausgeführt werden, das die Privilegierungsstufe 0 aufweist. Damit soll verhindert werden, dass Anwendungsprogramme durch einen Programmierfehler das Betriebssystem zerstören oder Hacker unkontrollierten Zugriff auf Daten bekommen.
Sandini Bib 162
Kapitel 6
Betriebssysteme verwalten aber den Computer nicht nur, sondern stellen auch bestimmte Funktionen zur Datenverwaltung, Zeichenausgabe etc. zur Verfügung. In einem PC unter DOS geschieht dies beispielsweise durch den Interrupt 21h, dem DOS-Funktionsverteiler. Solche Betriebssystemfunktionen laufen meist mit PL=1. Auch Einheiten- und Gerätetreiber (beispielsweise zum Ansteuern der Schnittstellen und Laufwerke) arbeiten häufig auf dieser Stufe. Weniger kritische Betriebssystemfunktionen, z.B. Unterstützungen für eine grafische Benutzeroberfläche (API), können dagegen die Stufe 2 aufweisen. Die niedrigste Privilegierungsstufe aller Tasks besitzen Anwendungsprogramme, da diese den Computer nur benutzen, nicht aber steuern und kontrollieren sollen. Durch die niedrige Stufe (hohen PL) sind die Daten und Codes anderer Programme und des Betriebssystems sehr gut gegen Programmfehler geschützt. Unter DOS führt beispielsweise ein Programmierfehler, der versehentlich die Interrupt-Vektortabelle überschreibt, zu einem völligen Systemabsturz. Im Protected Mode reagiert das Betriebssystem auf einen solchen Vorgang unter Ausgabe einer Fehlermeldung nur mit einem Abbruch des fehlerhaften Programms, alle anderen Tasks laufen unbeschädigt und unbeeinflusst weiter. Damit können Bugs, d.h. Programmfehler, besser entdeckt werden. Dies alles setzt natürlich voraus, dass das Betriebssystem (beispielsweise OS/2, Linux oder Windows NT) fehlerfrei ist, was wegen der Komplexität von Multitasking-Betriebssystemen leider keine Selbstverständlichkeit darstellt. In der folgenden Beschreibung tritt öfters der Begriff Task auf. Zunächst also ein paar erklärende Worte zu diesem Begriff. Ein Task umfasst das zugeordnete Programm (z.B. Word), dessen Daten (den Text) sowie die erforderlichen Systemfunktionen (z.B. die zur Datenverwaltung auf Festplattenebene). Unter Windows können Sie z.B. Word für Windows starten und einen Text laden. Um eine weitere Textdatei zu bearbeiten, können Sie einmal den Text in das bereits gestartete Word laden und zwischen den Word-Fenstern wechseln. Sie haben zwei Texte in ein Programm geladen, Word und die beiden Texte bilden einen Task. Eine andere Möglichkeit zur Bearbeitung des zweiten Textes ist, Word nochmals zu starten und ihm unter Windows ein zweites Fenster zuzuweisen. Den zweiten Text laden Sie in die zuletzt gestartete Word-Version. Auch in diesem Fall können Sie zwischen zwei Fenstern hin- und herspringen. Der große Unterschied zu vorher besteht aber darin, dass Sie nun zwei Programme gestartet haben, nämlich zweimal Word, und in jedes der Programme einen Text geladen haben. Jedes Programm bildet zusammen mit dem zugehörigen geladenen Text einen Task. Obwohl Sie beidesmal dasselbe Programm gestartet haben, laufen in ihrem PC zwei Tasks ab. Ab dem 80386 wird für jede Privilegierungsstufe PL=0 bis PL=3 eines Tasks ein eigenes Stack vorgesehen. Für das angeführte Beispiel wäre also jeweils ein Stack für das Anwendungsprogramm Word (PL=3), die Funktionen der Benutzeroberfläche (PL=2), die Betriebssystemfunktionen zur Datenverwaltung (PL=1) und den Kernel (PL=0) vorhanden. Für einen kontrollierten Zugriff von Programmen auf Daten und Code in Segmenten höherer Privilegierungsstufe stehen Gates zur Verfügung. Diese geben einen maximalen Schutz vor einem unberechtigten oder fehlerhaften Zugriff auf fremde Daten und Programme. Wenn z.B. ein Anwendungsprogramm Betriebssystemfunktionen in Anspruch nimmt, um Dateien zu öffnen oder zu schließen – es also auf fremde Funktionen zugreift – garantieren die Gates, dass der Zugriff fehlerfrei verläuft. Würde das Anwendungsprogramm versuchen, die Funktionen mit einer falschen Einsprungadresse aufzurufen, so wäre ein unvorhersehbares Verhalten des Computers wahrscheinlich. Die Gates definieren daher »Tore«, durch die das Anwendungsprogramm Zugriff auf fremde Routinen hat. Das Bit 2 im Segmentselektor (Abbildung 6.4) gibt als so genannter Tabellenindikator (TI) an, ob die globale (TI=0) oder lokale (TI=1) Deskriptortabelle für die Lokalisierung des Segments im
Sandini Bib Programmierung und Betriebsarten
163
Speicher benutzt werden soll. Diese beiden Tabellen sind wesentlich für die Segmentierung des Speichers im Protected Mode. Der Prozessor verwendet im Protected Mode die Segmentselektoren in den Segmentregistern nämlich als Index in die globale oder lokale Deskriptortabelle. Die globale Deskriptortabelle ist eine Liste im Speicher, die in Form von Segmentdeskriptoren Größe und Adresse von Segmenten im Speicher beschreibt. Der Aufbau eines solchen Segmentdeskriptors ist in Abbildung 6.6 dargestellt. Jeder Deskriptor umfasst acht Byte. Diese Deskriptortabelle wird als global bezeichnet, weil sie Segmente beschreibt, die üblicherweise allen Tasks zur Verfügung stehen (wenn deren Privilegierungsstufen oder entsprechende Gates einen Zugriff gestatten). Auch die lokale Deskriptortabelle ist eine Liste mit gleichartig aufgebauten Segmentdeskriptoren. Im Gegensatz zur globalen steht die lokale Deskriptortabelle aber normalerweise nur dem gerade aktiven Task zur Verfügung, d.h. bei einem Task-Wechsel wird auch die lokale Deskriptortabelle gewechselt.
31...24 Basis
G
16 15 14 13 12 11
vf Limit 19..16 P DPL
15...0
DT
Basis
DB res
24 23 22 21 20 19
31
8 7
Typ
0
Basis
Limit 15...0
23...16
Offset +4 +0
Basis Basis23...16, 23...16, 15...0: Segmentbasis Basis 31...24, 31...24, Basis BasisBasis 15...0: Segmentbasis Limit Limit 15...0: Segmentlimit Limit 19...16, 19...16, Limit 15...0: Segmentlimit G: Granularität G: Granularität 0=Byte-Granularität 1=Page-Granularität 0=Byte-Granularität 1=Page-Granularität DB: Segmentgröße (Default/Big) DB: Segmentgröße (Default/Big)(Default) 0=16-Bit-Operanden/Adressen 1=32-Bit-Operanden/Adressen (Big) 0=16-Bit-Operanden/Adressen (Default) 1=32-Bit-Operanden/Adressen (Big) r: reserviert vf: verfügbar für Betriebssystem r: reserviert P: Segment im Speicher (Present) vf: verfügbar 0=Segment für nichtBetriebssystem im Speicher 1=Segment im Speicher DPL: Segment Deskriptorprivilegierungsstufe P: im Speicher (Present) 00=0 01=1 10=2 11=3 0=Segment nicht im Speicher 1=Segment im Speicher DT: Deskriptortyp DPL: Deskriptorprivilegierungsstufe 0=Systemsegment 1=Applikationssegment 01=1 10=2oder 11=3 Typ: 00=0 Typ des SystemApplikationssegments DT: Deskriptortyp 0=Systemsegment 1=Applikationssegment Typ: Typ des System- oder Applikationssegments Abb. 6.6: Aufbau des Segmentdeskriptors
Die 32 Basisbit des Segmentdeskriptors geben die Startadresse des beschriebenen Segments im Speicher an (siehe Abbildung 6.7). Diese 32 Bit der Basisadresse entsprechen den 32 Adressleitungen. Damit können im Protected Mode 232 Byte oder 4 GByte adressiert werden. Der Basiseintrag eines Segmentdeskriptors gibt die Startadresse des betreffenden Segments in diesem Adressraum an. Im Real Mode ist jedes Segment 64 KByte groß, selbst wenn nur wenige Daten in einem Segment gespeichert werden. Durch die festgelegte Verzahnung der Segmente bleiben aber höchstens 15 Byte ungenutzt, da die Segmente mit 16 Byte Abstand aufeinander folgen. Die völlige Entkopplung der Segmente im Protected Mode ändert das vollkommen, weil nun entsprechend dem Selektorwert im Segmentregister aufeinanderfolgende Segmente in keiner Weise auch physikalisch im Speicher aufeinanderfolgen müssen. Jeder Segmentdeskriptor weist daher einen Eintrag Limit im niederwertigsten Byte des Deskriptors auf, um die tatsächliche Größe des Segments in Byte zu definieren (siehe Abbildung 6.7). Bei gelöschtem G-Bit (Byte-Granularität) sind durch die 20 Bit des Limiteintrags im Protected Mode also Segmente mit einer maximalen Größe von
Sandini Bib 164
Kapitel 6
220*1 Byte (=1 MByte) möglich, bei gesetztem G-Bit (Page-Granularität) hingegen Segmente mit einer Größe von bis zu 220*4 KByte (=4 GByte). Das tatsächliche Segmentlimit (oder gleichbedeutend die Größe) des vom Deskriptor beschriebenen Segments hängt also neben dem 20-BitLimiteintrag noch vom Granularity-Bit G ab. Beispiel: Limit=1000, G=0: Limit=1000, G=1:
Segmentlimit 1000 Byte Segmentlimit 1000*4 KByte=4.096.000Byte
OS/2 und auch Windows verwenden aber ein so genanntes flaches Speichermodell, bei dem ein einziges 4 GByte-großes Segment alle Tasks aufnimmt, d.h. die Segmentierung spielt hier fast keine Rolle mehr. Stattdessen wird eine Speicheraufteilung in Pages vorgenommen, für die weitere Schutzmechanismen existieren (siehe Kapitel 6.8).
Speicher
Segmentdeskriptor Basis Basis
Basis
Limit
Basis
+ Limit
Limit
beschriebenes Segment Basis
Abb. 6.7: Basis und Limit der Segmentdeskriptoren: Im Protected Mode beschreibt ein Segmentdeskriptor ein Segment: Die Basisadresse gibt den physikalischen Beginn des Segments im Speicher, das Limit seine Größe an.
Das Bit DT im Segmentdeskriptor gibt an, um welchen Deskriptortyp es sich handelt. Ist DT gleich 0, so beschreibt der Deskriptor ein Systemsegment, ansonsten ein Applikationssegment. Das Feld Typ im Segmentdeskriptor gibt die Art und DPL die Privilegierungsstufe (von 0 bis 3) des Segments an. DPL wird auch als Deskriptorprivilegierungsstufe bezeichnet. Schließlich ist das Bit P ein Indikator dafür, ob sich das Segment auch tatsächlich im Speicher befindet. Das Bit vf im Segmentdeskriptor kann der Anwender oder das Betriebssystem frei benutzen und kommt nicht für spezielle CPU-Funktionen zum Einsatz. Sie erinnern sich, dass die 32-Bit-Offsetregister EAX etc. zu 16-Bit-Registern (z.B. AX) und weiter zu 8-Bit-Teilregistern (z.B. AH, AL) verkürzt werden können. Außerdem arbeitet natürlich jeder Programmcode, der für die 16-Bit-Prozessoren 8086 und 80286 entwickelt worden ist, ausschließlich mit 16-Bit-Adressen. Aus Kompatibilitätsgründen muss ein 32-Bit-Prozessor aber auch solchen Programmcode neben neu erstelltem 32-Bit-Programmcode verarbeiten können. Dazu ist
Sandini Bib Programmierung und Betriebsarten
165
das Bit DB wichtig. Es gibt nämlich an, ob der Prozessor das vom Deskriptor beschriebene Segment standardmäßig 16- oder 32-Bit-Operanden im Fall eines Datensegments bzw. 16- oder 32Bit-Adressen für ein Codesegment verwenden soll. Ist DB=0, so benutzt die CPU 16-Bit-Operanden oder 16-Bit-Adressen. Beachten Sie, dass in den angegebenen Standardwerten für einen 80286-Segmentdeskriptor das Bit DB stets gleich 0 ist. Der 80286-Code kann daher ohne Probleme auf die 32-Bit-Architektur eines 80386 übertragen werden, da er alle Operanden und Adressen standardmäßig als 16-Bit-Größen behandelt. Auch die anderen 80286-Standardwerte tragen der 16-Bit-Architektur mit 24-Bit-Adressbus Rechnung. Operanden und Adressen können bei gelöschtem Bit DB aber durch ein so genanntes Operandengrößenpräfix 66h bzw. ein Adressgrößenpräfix 67h für einen bestimmten Befehl auf 32 Bit erweitert werden. Das Operandengrößenpräfix kehrt nämlich die Größenfestlegung durch das DB-Bit des gültigen Datensegments, das Adressgrößenpräfix die Festlegung durch das DB-Bit des Codesegments um. Ist DB gelöscht, d.h. das betreffende Segment arbeitet mit 16-Bit-Größen (Operanden bzw. Adressen), so zwingen die Präfixe den 32-Bit-Prozessor statt der üblichen 16-Bit-Größen eine 32-Bit-Größe zu verwenden. Ist das DB-Bit dagegen gesetzt, so verwendet das Segment standardmäßig 32-Bit-Größen. Ein Operanden- oder Adressgrößenpräfix zwingt den 32-Bit-Prozessor dann, anstelle der 32-Bit-Größen einen 16-Bit-Operanden bzw. eine 16-Bit-Adresse zu verwenden. Durch das DB-Bit und die Präfixe benötigt der Prosessor keine unterschiedlichen Opcodes für gleichartige Befehle wie z.B. MOV ax, mem16 und MOV eax, mem32, die einmal eine 16- und einmal eine 32-Bit-Größe verarbeiten. Das vermindert die Anzahl der notwendigen Opcodes, um einen umfangreichen Befehlssatz zu implementieren und somit auch den durchschnittlichen Kodierungsaufwand. Diese Präfixe führen also genauso wie die Segmentüberschreibungspräfixe zu kompakteren Programmen. Beispiel: Der Opcode für die beiden Befehle MOV eax, [01h] und MOV ax, [01h] unterscheidet sich nicht, er lautet beidesmal 10111000. Der 32-Bit-Prozessor unterscheidet die beiden anhand von DB-Bit und Operandengrößenpräfix. Angenommen, das DB-Bit im Codesegmentdeskriptor ist gelöscht, d.h. der Prozessor verwendet standardmäßig 16-Bit-Displacements. Bei gelöschtem DB-Bit im Datensegmentdeskriptor muss ein Assembler im ersten Fall also das Operandengrößenpräfix 66h vor dem Opcode einfügen. Wir erhalten dadurch die folgenden Befehlskodierungen: MOV eax, 01h: 66 b8 00 01 (Der Befehl überträgt den in den 32-Bit-Akkumulator MOV ax, 01h: b8 00 01 (Der Befehl überträgt den in den 16-Bit-Akkumulator
32-Bit-Wert bei Offset 01h eax.) 16-Bit-Wert bei Offset 01h eax.)
Ist DB im betreffenden Datensegmentdeskriptor dagegen gesetzt, so fügt der Assembler im zweiten Fall das Operandengrößenpräfix 66h vor dem Opcode ein, weil der Prozessor jetzt standardmäßig 32-Bit-Größen verwendet. Die Kodierungen lauten: MOV eax, 01h: b8 00 01 MOV ax, 01h:
6.7.2
(Der Befehl überträgt den in den 32-Bit-Akkumulator 66 b8 00 01 (Der Befehl überträgt den in den 16-Bit-Akkumulator
32-Bit-Wert bei Offset 01h eax.) 16-Bit-Wert bei Offset 01h eax.)
Globale und lokale Deskriptortabelle
Für die Verwaltung der lokalen und globalen Deskriptortabelle sowie der weiter unten beschriebenen Interrupt-Deskriptortabelle und der Tasks werden ab dem 80386 mindestens fünf Register implementiert, die Sie in Abbildung 6.8 sehen. Das sind das Steuerregister CR0 und die vier Speicherverwaltungsregister Task-Register (TR) sowie die Register für die lokale Deskriptortabelle (LDTR), die Interrupt-Deskriptortabelle (IDTR) und die globale Deskriptortabelle (GDTR).
Sandini Bib 166
Kapitel 6
15
0 31
0 19
0
TR
TSS-Selektor
TSS-Basisadresse
TSS-Limit
LDTR
LDT-Selektor
LDT-Basisadresse
LDT-Limit
IDT-Basisadresse
IDT-Limit
GDTR
GDT-Basisadresse
GDT-Limit
23
15
12 11
Page-Directory-Basisregister lineare Adresse des Page-Fault
CR1
reserviert
reserviert
CR0
PG
CR2
0
7
res TS EM MP PE
31
CR3
IDTR
PG:
Paging 0=Paging-Unit deaktiviert 1=Paging aktiv Paging PG: 0=Paging-Unit deaktiviert 1=Paging aktiv Task-Switched TS: Task-Switched 0=kein Task-Switch 1=Task-Switch erfolgt 0=kein Task-Switch 1=Task-Switch erfolgt Coprozessor emulieren (Emulate Coprocessor) EM: Coprozessor emulieren (Emulate Coprocessor) 0=keine Emulation 1=i387 emulieren 0=keine Emulation 1=i387 emulieren MP: Coprozessor (Math Present) Coprozessor (Math Present) 0=kein Coprozessor 1=i387 installiert 0=kein Coprozessor 1=i387 installiert PE: Protected-Mode (Protection Enable) 0=i386 läuft im(Protection Real-Mode 1=i386 läuft im Protected-Mode Protected-Mode Enable) 0=i386 läuft im Real-Mode 1=i386 läuft im Protected-Mode
TS: EM: MP: PE:
reserviert
Abb. 6.8: Die Speicherverwaltungs- und das Steuerregister für den Protected Mode am Beispiel des 80386
Der Index, d.h. die höherwertigen 13 Bit des Segmentselektors (siehe Abbildung 6.4) geben nun die Nummer des Segmentdeskriptors in der Deskriptortabelle an, der das zugehörige Segment beschreibt. Mit 13 Bit sind maximal 8192 verschiedene Indizes möglich, sodass die globale und lokale Deskriptortabelle jeweils maximal 8192 Einträge zu 8 Byte oder 64 KByte umfassen können. Die Tabellen beschreiben damit jeweils bis zu 8192 verschiedene Segmente. Aufbau und Größe der Segmentdeskriptoren für die lokale Deskriptortabelle (LDT) und die globale Deskriptortabelle (GDT) stimmen überein. Ob sich der Segmentselektor in einem Segmentregister auf die GDT oder die LDT bezieht, gibt ja der Tabellenindikator TI im Selektor an. Möchte der Prozessor auf einen Eintrag in der GDT oder LDT zugreifen, multipliziert er den Indexwert des Selektors mit 8 (Anzahl der Byte je Deskriptor) und addiert das Ergebnis zur Basisadresse der entsprechenden Deskriptortabelle. Das niederwertige Wort des Steuerregisters ist bereits beim 80286 als Maschinenstatuswort (MSW) vorhanden und kann beim 80386 aus Kompatibilitätsgründen genauso adressiert werden. Das höchstwertige PG-Bit aktiviert die Paging-Einheit oder legt sie still. Dazu mehr in Kapitel 6.8. Die Bedeutung der Bits des Steuerregisters CR0 habe ich bereits im Zusammenhang mit den Steuerregistern erläutert. Von besonderer Bedeutung für den Protected Mode ist das Bit PE (Protection Enable). Wenn Sie es auf 1 setzen, schaltet die CPU sofort in den Protected Mode um. Löschen können Sie es entweder explizit durch einen Befehl MOV CR0, xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx0b, einen Prozessor-Reset oder einen Triple-Fault des Prozessors.
Sandini Bib Programmierung und Betriebsarten
167
Die Basisadresse der globalen und lokalen Deskriptortabelle ist im GDT- bzw. LDT-Register abgelegt. Diese Register werden von der Laderoutine des Betriebssystems (GDTR) oder dem Betriebssystem selbst (LDTR) mit den entsprechenden Werten geladen. Im Gegensatz zur LDT darf beim Aufbau der GDT der nullte Eintrag (beginnend bei der Basisadresse der GDT) nicht benutzt werden. Ein Bezug auf den nullten Eintrag führt sofort zu einer Exception »allgemeiner Protection-Fehler«. Dadurch wird verhindert, dass ein noch nicht initialisiertes GDTR benutzt wird. Wesentlich an der GDT ist, dass die gesamte Segment- und damit Speicherverwaltung aus ihr aufgebaut wird. Im GDTR (Abbildung 6.8) sind sowohl die Basisadresse als auch das Limit (die Größe der GDT in Byte) der globalen Deskriptortabelle gespeichert – das GDTR weist somit auf die GDT im Speicher. Im Gegensatz dazu verwaltet der Prozessor die lokale Deskriptortabelle dynamisch, wodurch mehrere LDTs möglich sind (dagegen ist nur eine einzige GDT vorhanden). Für jede lokale Deskriptortabelle existiert ein Eintrag in der GDT, die LDTs werden dadurch ähnlich wie Segmente verwaltet (siehe Abbildung 6.9). Das GDTR enthält also einen Segmentdeskriptor, das LDTR aber einen Segmentselektor. Das GDTR kann durch den Befehl LGDT mem64 mit dem Segmentdeskriptor mem64 geladen werden. Dieser Schritt ist notwendig, bevor der Betriebssystemlader den Prozessor in den Protected Mode umschaltet. Ansonsten hängt die Speicherverwaltung in der Luft. Demgegenüber wird das LDTR über den Befehl LLDT reg16 oder LLDT mem16 mit einem Segmentselektor geladen. Dieser Segmentselektor gibt den Eintrag in der globalen Deskriptortabelle an, der den Deskriptor für die lokale Deskriptortabelle enthält. Die konsistente Verwaltung der Deskriptortabellen ist alleinige Aufgabe des Betriebssystems (Linux, Windows NT etc.), der Anwendungsprogrammierer hat keinerlei Einwirkungsmöglichkeit auf diesen Vorgang. Die Befehle zum Laden der Deskriptortabellenregister LDTR und GDTR müssen im Protected Mode von einem Task mit Privilegierungsstufe 0 ausgeführt werden, üblicherweise also vom Kernel des Betriebssystems. Das verwundert auch nicht, weil die Speicherverwaltung eine ureigene Aufgabe des Betriebssystems ist. Alle Versuche, die Deskriptortabellenregister von einem Anwendungsprogramm mit PL=3 aus zu verändern, führen zu einer Exception »allgemeiner Protection-Fehler« und damit zu einem Interrupt 0dh. Das Betriebssystem liefert für einen Task sowohl die globale als auch eine lokale Deskriptortabelle. Günstig ist es, von mehreren Tasks gemeinsam benutzte Segmente (wie beispielsweise Segmente mit Betriebssystemfunktionen) in der GDT und ausschließlich vom jeweiligen Task belegte Segmente (z.B. Programmcode und Programmdaten) in der LDT zu beschreiben. Mit diesem Verfahren können die verschiedenen Tasks voneinander isoliert werden und es stehen für einen Task maximal zwei vollständige Deskriptortabellen à 8192 Einträge oder 16.384 Segmente zur Verfügung, wobei der nullte Eintrag in der GDT nicht benutzt wird. Das führt zu einem Maximum von 16.383 Segmenten. Jedes Segment kann bis zu 1 MByte (Granularity-Bit gleich 0) oder 4 GByte (G-Bit gesetzt) umfassen. Wir erhalten damit einen maximalen logischen oder virtuellen Adressraum von 16 GByte bzw. 64 TByte pro Task. Dieser Wert ist kann wesentlich größer sein als der physikalische Adressraum des Prozessors mit 4 GByte. Vor allem die 64 TByte sind eine immense Datenmenge: Würde man ein gesetztes Bit durch ein Reiskorn mit 10 mg Masse darstellen, wären für 64 TByte zu je acht Bit mehr als 5 Billionen Tonnen Reis notwendig. Damit könnte man beim gegenwärtigen Reisverbrauch die gesamte Menschheit 1000 Jahre lang versorgen.
Sandini Bib 168
Kapitel 6
Speicher
2. LDT Segmentdeskriptor Segmentdeskriptor
32-Bit-CPU
Segmentdeskriptor
i386
LDTR 1. LDT Segmentdeskriptor
GDTR
Segmentdeskriptor
Basisadresse
Segmentdeskriptor
GDT Segmentdeskriptor
Basisadresse
Segmentdeskriptor
Segmentdeskriptor Segmentdeskriptor Segmentdeskriptor
Abb. 6.9: Globale und lokale Deskriptortabelle: Das GDTR zeigt auf die GDT im Speicher, die auch Segmentdeskriptoren für verschiedene LDTs enthält. Das LDTR gibt dann (ähnlich wie ein Segmentselektor) die Nummer desjenigen Segmentdeskriptors in der GDT an, der die betreffende LDT definiert.
Aber schon bei Byte-Granularität mit einem virtuellen Adressraum von 16 GByte können nicht mehr alle Segmente im Speicher vorhanden sein. Wird ein Segment beispielsweise vom Betriebssystem auf die Festplatte ausgelagert, so setzt dieses das P-Bit im Segmentdeskriptor der entsprechenden Deskriptortabelle LDT oder GDT auf 0. Möchte der Prozessor auf dieses Segment zugreifen, so löst die Hardware eine Exception »Segment nicht vorhanden«, entsprechend Interrupt 0bh, aus. Der aufgerufene Interrupt-Handler kann dann das gewünschte Segment erneut in den Speicher laden, wobei er u.U. ein anderes Segment auslagert. Die CPU-Hardware unterstützt dieses Swapping oder den Swap-Vorgang, indem es die Exceptions auslöst. Das eigentliche Laden und Auslagern der Segmente muss aber das Betriebssystem erledigen. Der Prozessor liefert also nur einen Trigger (nämlich die Exception) dafür. Der große virtuelle Adressraum setzt sich dann physikalisch aus dem kleinen internen Hauptspeicher (den RAM-Chips) und einem großen externen Massenspeicher (der Festplatte) zusammen.
6.7.3
Umschalten in den Protected Mode
Soll der Prozessor in den Protected Mode umgeschaltet werden, muss das Betriebssystem oder das ROM-BIOS die erforderlichen Tabellen im Speicher aufbauen und wenigstens die beiden Register GDTR und IDTR mit geeigneten Werten initialisieren. Ist das geschehen, so setzt das System oder das ROM-BIOS über den Befehl MOV CR0, wert das Bit PE im Steuerregister CR0.
Sandini Bib Programmierung und Betriebsarten
169
Der Prozessor arbeitet nun im Protected Mode. Außerdem kann die CPU auch über die Funktion 89h des Interrupts INT 15h in den Protected Mode umschalten. Aus Kompatibilitätsgründen mit dem 80286 kann eine 32-Bit-CPU zudem über den 80286-Befehl LMSW (Lade Maschinenstatuswort) in den Protected Mode versetzt werden. Beachten Sie aber, dass LMSW nur das niederwertige Wort des Steuerregisters CR0 anspricht. Im Gegensatz zu MOV CR0, wert können Sie also z.B. das Paging (Kapitel 6.8) nicht aktivieren. Der Protected Mode kann auf einfache Weise verlassen werden, indem ein Task mit PL=0 (also der höchsten Privilegierungsstufe) das PE-Bit durch einen Befehl MOV CR0, wert löscht. Der Prozessor schaltet dann sofort in den Real Mode zurück. Beim 80286 ist das nicht möglich.
6.7.4
Speicheradressierung im Protected Mode
Im Real Mode war die Ermittlung einer linearen Speicheradresse ganz einfach: Der Wert des entsprechenden Segmentregisters wurde mit 16 multipliziert und in einem Addierer dem Offset hinzugezählt. Im Protected Mode ist dieser Vorgang erheblich umfangreicher. Es laufen folgende Schritte ab (siehe auch Abbildung 6.10).
: : : : : :
Anhand des Segmentselektors im entsprechenden Segmentregister wird ermittelt, ob die globale oder die lokale Deskriptortabelle benutzt werden soll; Mit Hilfe des Speicherverwaltungsregisters GDTR oder LDTR wird die Basisadresse der globalen bzw. lokalen Deskriptortabelle ermittelt; Der Index des Segmentselektors wird mit 8 multipliziert und das Ergebnis zur Basisadresse der Deskriptortabelle addiert und es wird ermittelt, ob der so erhaltene Wert das Limit nicht übersteigt; tut er das, so löst der Prozessor einen Interrupt 0dh (Exception »allgemeiner Protection-Fehler«) aus; Anhand des Segmentdeskriptors (8 Byte) in der Deskriptortabelle werden Basisadresse und Limit des Segments ermittelt; Im Adressaddierer in der Adressierungseinheit werden diese Basisadresse und der Offset addiert und es wird ermittelt, ob der erhaltene Wert das Limit des betreffenden Segments nicht übersteigt; ist dies der Fall, löst der Prozessor einen Interrupt 0dh (Exception »allgemeiner Protection-Fehler«) aus; Die so ermittelte Adresse wird als lineare (und ohne Paging auch als physikalische) Adresse ausgegeben.
Durch die Segmentdeskriptor-Cache-Register müssen in den oben aufgeführten Schritten die Deskriptoren meistens nicht eingelesen werden. Vielmehr sind deren Werte bereits nach einem ersten Zugriff auf das Segment in den Cache-Registern, die die CPU automatisch verwaltet und für den Anwender nicht sichtbar sind, gespeichert. Alle späteren Zugriffe können dann diese On-Chip-Werte benutzen. Der beschriebene Weg gibt aber das logische Vorgehen des Prozessors an, wenn er eine lineare (oder auch physikalische) Adresse ermittelt. Da alle Prüfungen parallel mit den Berechnungen erfolgen und außerdem alle wichtigen Daten in den Cache-Registern bereitstehen, verursacht diese umfangreiche Berechnungs- und Prüfprozedur keine Verzögerung gegenüber der einfachen Adressberechnung im Real Mode. Mit Ausnahme der Befehle, die explizit oder implizit einen neuen Segmentdeskriptor laden, werden alle Speicherzugriffe im Protected wie im Real Mode gleich schnell ausgeführt.
Sandini Bib 170
Kapitel 6
Speicher
32-Bit-Speicheradresse
Speicherobjekt
CPU i386
Offset TI=1
Basis
32-Bit-Basisadresse
DS LDT
LDTR 13-Bit-Index
Segmentdeskriptor Segmentdeskriptor Segmentdeskriptor Segmentdeskriptor Segmentdeskriptor
32-Bit-Table-Adresse
Abb. 6.10: Die Ermittlung einer Speicheradresse im Protected Mode
6.7.5
Steuerungsübergabe und Call Gates
Bei einem Near-Call oder einem Near-Sprung wird die Steuerung an eine Prozedur oder einen Sprungpunkt übergeben, die bzw. der sich im gleichen Segment wie der entsprechende CALLoder JMP-Befehl befindet. Ein solcher Transfer verändert also nur den Wert des Befehlszählers EIP und der Prozessor prüft lediglich, ob EIP das Limit des Segments übersteigt. Ist der Offset gültig, so wird der Aufruf bzw. Sprung ausgeführt, ansonsten löst die CPU eine Exception »allgemeiner Protection-Fehler« aus. Tasks bestehen nun aber selten aus nur einem Codesegment. In der Regel sind mehrere Codesegmente vorhanden. Ein Zugriff auf ein anderes Codesegment innerhalb des Tasks findet beispielsweise bei einem Far-Call, einem Far-Sprung oder einem Interrupt statt. In allen drei Fällen wird das Codesegment mit einem neuen Segmentselektor geladen. Im Real Mode werden bei einem solchen Intersegment-Aufruf einfach der Befehlszähler EIP und das Codesegment CS mit neuen Werten geladen, die den Einsprungpunkt der Routine angeben. Im Protected Mode ist dies etwas komplizierter, schließlich verlangt das Laden eines Codesegments eine umfangreiche Prüfprozedur. Für einen Far-Call oder Far-Sprung stehen drei Möglichkeiten zur Verfügung:
:
:
Besitzt das Zielsegment dieselbe Privilegierungsstufe (PL) wie das Ausgangssegment, so kann der Far-Call durch das Laden des Zielsegmentselektors in das Codesegment CS direkt ausgeführt werden. Der Prozessor prüft in diesem Fall lediglich, ob der neue Wert des Befehlszählers EIP das Limit des Zielsegments nicht übersteigt und ob der Typ des Zielsegments (EXE=0 oder 1) mit dem Aufruf konsistent ist. Ist das Zielsegment als Conforming gekennzeichnet und ist seine Privilegierungsstufe größer (der Wert von PL kleiner) als die des Ausgangssegments, so wird der Far-Aufruf in gleicher Weise wie oben ausgeführt. Der Code des Conforming-Segments wird dann allerdings mit einer Privilegierungsstufe CPL ausgeführt, die der weniger privilegierten Ebene des aufru-
Sandini Bib Programmierung und Betriebsarten
:
171
fenden Programmes und nicht der höher privilegierten Stufe des Conforming-Segments entspricht. Das verhindert, dass sich weniger privilegierte Programme über die Hintertür eines Conforming-Segments eine höhere Privilegierungsstufe beschaffen und dadurch einen Zugriff auf geschützte Systembereiche erlangen. Besitzt das Zielsegment eine andere Privilegierungsstufe als das Ausgangssegment und ist es nicht als Conforming gekennzeichnet, so bleibt nur der Weg über ein Call-Gate.
In den ersten beiden Fällen lädt der Prozessor einfach den Zielsegmentselektor in das Register CS und den neuen Befehlszählerwert in EIP und fährt dann mit der Programmausführung fort. Das ist (mit Ausnahme der Überprüfungen) einem Far-Aufruf oder Far-Sprung im Real Mode ähnlich. Im letzten Fall zeigt der neue Segmentselektor nicht auf das Zielsegment selbst, sondern auf ein so genanntes Call-Gate. Die Behandlung von Interrupts ist im Allgemeinen eine ureigene und auch kritische Aufgabe des Betriebssystem-Kernels, weil Interrupts den Computer unmittelbar beeinflussen. Ein Interrupt-Aufruf führt dadurch meist zu einer Änderung der Privilegierungsstufe (z.B. wenn ein Anwendungsprogramm mit PL=3 durch einen Interrupt unterbrochen und ein Interrupt Handler im Kernel mit PL=0 aufgerufen wird). Der Interrupt muss daher ein Interrupt oder Trap Gate benutzen, um den Interrupt Handler zu aktivieren (siehe unten). Die Bedeutung der Task-Gates wird im Abschnitt über Multitasking erläutert. Die Call, Interrupt und Trap Gates bilden »Tore« für den Einsprung in eine Routine eines anderen Segments mit anderer Privilegierungsstufe. Gates werden durch ein Bit DT=0 im Segmentdeskriptor und einen Wert des Typfeldes von 4 bis 7 und 12 bis 15 definiert. Sie sind also Teil der Systemsegmente. In Tabelle 6.2 finden Sie die gültigen Gate-Diskriptoren. Typ
Bedeutung
Typ
1–7 8 9 10 11 12 13 14 15
für 80286 reserviert verfügbares TSS reserviert aktives TSS Call-Gate reserviert Interrupt-Gate Trap-Gate
Systemsegment bzw. GateGate Systemsegment Systemsegment Gate Gate Gate
Tab. 6.2: Systemsegment- und Gate-Typen (DT=0), die für 32-Bit-CPUs gelten. Die Typen 1–7 sind für die Abwärtskompatibilität mit dem 80286 vorgesehen.
In Abbildung 6.11 finden Sie das Format der Gate-Deskriptoren. Call Gates werden nicht nur für Prozedur-Aufrufe über einen Far-Call, sondern auch für alle unbedingten und bedingten Sprunganweisungen mit einem Far-Jump verwendet. Call Gates dürfen in der lokalen oder globalen Deskriptortabelle, nicht aber in der Interrupt-Deskriptortabelle auftreten. Dort sind nur Interrupt, Trap und Task Gates erlaubt.
Sandini Bib 172
Kapitel 6
31
16 15 14 13 12 11
Offset
im Zielsegment
31...16
Zielsegmentselektor
P DPL 0 Offset
8 7 6 5 4
Typ
0
0 0 0 DWord-Count
im Zielsegment
15...0
Offset +4 +0
Abb. 6.11: Format des Gate-Deskriptors
Wie Abbildung 6.11 bereits auf den ersten Blick zeigt, unterscheidet sich der Aufbau eines GateDeskriptors ganz erheblich von dem eines »normalen« Segmentdeskriptors: Es fehlt z.B. die Basisadresse des Segments. Stattdessen ist ein 5-Bit-Feld DWord-Count vorgesehen, und die Bits 5 bis 7 im zweiten Deskriptordoppelwort sind auf 0 gesetzt. Außerdem ist das zweite Wort für einen Segmentselektor reserviert. Er definiert das Zielsegment für den Far-Aufruf oder Far-Sprung und gibt zusammen mit dem Offset im niederwertigen und höchstwertigen Wort die Einsprungadresse an. Damit werden bei einem Far-Call über ein Call-Gate zwei Segmentdeskriptorreferenzen ausgeführt (siehe Abbildung 6.12): die erste, um den Gate-Deskriptor zu laden und die zweite, um die Basisadresse des betreffenden Segments zu ermitteln. Das Gate enthält ja wiederum nur einen Zielsegmentselektor, nicht aber dessen lineare Adresse. Die Adressierungseinheit addiert die Basisadresse des durch den Segmentselektor im Gate-Deskriptor festgelegten Zielsegments und den im Gate-Deskriptor angegebenen Offset. Der ermittelte Wert stellt die lineare Einsprungadresse dar. Der Prozessor erkennt am Eintrag im Typfeld, ob der Zielsegmentselektor für das CS-Register bei einem Far-Call oder Far-Sprung direkt ein Code-Segment oder einen Gate-Deskriptor darstellt. Im ersten Fall prüft der Prozessor, ob der direkte Aufruf erlaubt ist (ob z.B. das Zielsegment als Conforming gekennzeichnet ist) und führt ihn abhängig davon aus oder erzeugt eine Exception. In letzterem Fall lädt er dagegen zunächst den Segmentdeskriptor, der im Call Gate angegeben ist. Sinn und Zweck dieses Vorgehens liegen auf der Hand: Es ist ein exakt definierter Einsprungspunkt vorgegeben, sodass das aufrufende Programm versehentlich keinen falschen Einsprungpunkt angeben kann. Das ist besonders wichtig, wenn Funktionen des Betriebssystems aufgerufen werden: Ein falscher Einsprungpunkt in diese Routinen führt gewöhnlich zu einem totalen Systemabsturz, die Angabe eines falschen Gates dagegen nur zum Abbruch des Tasks und der Ausgabe einer Fehlermeldung. Ich habe bereits erwähnt, dass jeder Task für die vier verschiedenen Privilegierungsebenen jeweils einen eigenen Stack anlegt. Zwischen diesen Stacks müssen natürlich häufig Daten ausgetauscht werden, damit die Routine einer anderen Stufe Zugriff auf die Daten des aufrufenden Programms hat. Um diesen Zugriff zu ermöglichen, trägt das System oder der Compiler/Assembler in das Feld DWord-Count die Anzahl der zu kopierenden Doppelworte (à vier Byte) ein. Der Prozessor überträgt diese Doppelworte dann bei einem Aufruf des Call-Gates automatisch vom Stack der aufrufenden zum Stack der aufgerufenen Prozedur. Mit fünf Bits lassen sich so maximal 31 Doppelworte, d.h. 124 Byte übergeben. Aus Kompatibilitätsgründen kann ein 32-Bit-Prozessor auch 80286-Gates (Typ 1–7) verarbeiten. Die 80286-Gates unterscheiden sich nur darin, dass die Bits 31 bis 16 für den Zieloffset des Aufrufs oder Sprungs reserviert (d.h. gleich 0) sind und das Feld DWord-Count keine Doppelworte, sondern gewöhnliche 16-Bit-Worte angibt. Grund für diese Einschränkungen ist die 16-BitArchitektur des 80286. Trifft der 80386 auf ein 80286-Gate, dann interpretiert er das Feld DWordCount als Word-Count und kopiert nur entsprechend viele Worte (zu je 16 Bit).
Sandini Bib Programmierung und Betriebsarten
173
Speicher
Zielsegment mit Prozedur 32-Bit-Speicheradresse
Einsprungpunkt der Prozedur
i386 CPU
Call-Gate
CS 13-Bit-Index
GDTR
13-Bit-Index
Offset 15..0
GDT Segmentdeskriptor Segmentdeskriptor Segmentdeskriptor Segmentdeskriptor
Zeiger auf Gate
Offset 31..16 Selektor
TI=0
Zeiger auf Prozedur
32-Bit-Offsetadresse
EIP
32-Bit-Table-Adresse
Abb. 6.12: Far-Call über einen Gate- und einen Segmentdeskriptor
Selbstverständlich führt der Prozessor auch bei einem Aufruf über Gates eine Prüfung der Zugriffsberechtigung aus. In diese Prüfung gehen folgende Privilegierungsstufen ein:
: : : :
CPL; RPL des Segmentselektors für das Call-Gate; DPL des Gate-Deskriptors; DPL des Segmentdeskriptors für das Zielsegment des Aufrufs oder Sprungs.
Der DPL-Eintrag des Gate-Deskriptors legt fest, von welchen Privilegierungsstufen aus das Gate benutzt werden kann. Gates werden benutzt, um z.B. die Steuerung an privilegiertere Ebenen (z.B. das Betriebssystem) oder Code gleicher Privilegierungsstufe zu übergeben. Für letzteren Fall sind sie zwar nicht zwingend notwendig (siehe oben), aber dieses Vorgehen ist auch möglich. Wichtig ist, dass nur CALL-Befehle Gates dazu verwenden können, Routinen niedrigerer Privilegierungsstufe (mit größeren PL) aufzurufen. Sprung-Befehle können Call-Gates nur dazu benutzen, die Steuerung an ein Code-Segment gleicher Privilegierungsstufe oder an ein Conforming-Segment gleicher oder höherer Stufe zu übergeben. Für einen Sprung-Befehl zu einem nicht als Conforming gekennzeichneten Segment müssen die beiden folgenden Bedingungen erfüllt sein.
: :
Die effektive Privilegierungsstufe EPL (gleich dem Maximum von CPL und RPL) muss kleiner oder gleich dem DPL des Gate-Deskriptors sein; Der DPL des Zielsegmentdeskriptors muss gleich dem CPL des aufrufenden Programms sein.
Sandini Bib 174
Kapitel 6
Für den CALL-Aufruf oder einen Sprung-Befehl zu einem Conforming-Segment müssen dagegen die zwei folgenden Bedingungen erfüllt sein.
: :
Die effektive Privilegierungsstufe EPL (gleich dem Maximum von CPL und RPL) muss kleiner oder gleich dem DPL des Gate-Deskriptors sein; Der DPL des Zielsegmentdeskriptors muss kleiner oder gleich dem CPL des aufrufenden Programms sein.
Bei einem Aufruf einer Prozedur höherer Privilegierungsstufe über ein Call-Gate führt der Prozessor noch folgende Vorgänge aus.
: : :
Der CPL-Wert wird so geändert, dass er die neue Privilegierungsstufe widerspiegelt; Die CPU übergibt die Steuerung an die aufgerufene Prozedur oder den angesprungenen Code; Anstatt des bisherigen Stack wird nun der Stack der neuen Privilegierungsstufe benutzt.
Die Stacks aller Privilegierungsstufen werden dabei durch das Task-State-Segment des jeweiligen Tasks definiert (siehe unten). Wie Sie aus all dem sehen können, wurden bereits dem 80286, der ja dieselben Prüfungen ausführt, nur beschränkt auf 16 Bit, erheblich mehr Funktionen eingepflanzt, als dies zunächst erscheint. Beispielsweise führen der 80286 und der 80386 die Übertragung der Worte zwischen den Stacks automatisch und selbstständig aus, ohne dass entsprechende Software-Befehle im Befehlsstrom vorliegen. Stattdessen sind im Mikrocode-ROM der Prozessoren umfangreiche Mikroprogramme abgelegt, die im Protected Mode alle Zugriffe online überwachen.
6.7.6
Die Interrupt-Deskriptortabelle
Neben den Registern für die globale und lokale Deskriptortabelle sowie das Task-Register ist für die Interrupt-Deskriptortabelle (IDT, siehe Abbildung 6.13) ein spezielles Register implementiert. Im Real Mode waren die 1024 (1k) niederwertigen Byte des Adressraums für die 256 Einträge (entsprechend den 256 Interrupts ab dem 80386) der Interruptvektortabelle reserviert. Jeder Eintrag enthält im Format Segment:Offset die Einsprungadresse (Ziel) des zugehörigen InterruptHandlers. Auch im Protected Mode stehen 256 Interrupts von 0 bis 255 zur Verfügung. Die Interrupt-Handler werden jedoch nicht mehr über ein Doppelwort mit dem Format Segment:Offset angesprochen, sondern über Gates. Als Einträge in der IDT sind nur Task-, Interrupt- und Trap-Gates zulässig. Damit ist jeder Eintrag statt vier nunmehr acht Byte lang. Durch den Eintrag Limit im IDTR (Abbildung 6.8) kann die Größe der Interrupt-Deskriptortabelle jedoch den tatsächlichen Erfordernissen angepasst werden. Benötigt ein System beispielsweise nur die Interrupts 0 bis 63, so genügt eine IDT mit 64 Einträgen zu acht Byte, d.h. insgesamt 512 Byte. Wird ein Interrupt ausgelöst, für den kein Eintrag in der IDT mehr existiert (im angeführten Fall z.B. ein INT 64), so tritt der Prozessor in den Shutdown-Modus ein. Da im IDTR neben dem Limit auch die Basisadresse der IDT angegeben wird, kann sich die Tabelle irgendwo im Speicher befinden (siehe Abbildung 6.13). Bevor der Prozessor in den Protected Mode umgeschaltet wird, muss das im Real Mode laufende Initialisierungsprogramm neben der GDT auch die IDT aufbauen und deren Basisadresse und Limit in das IDTR laden. Geschieht das nicht, so hängt sich der Prozessor mit ziemlicher Sicherheit auf, bevor die IDT im Protected Mode erstellt werden kann, da jede Art von Exception oder Interrupt entweder ins Nirwana weist oder eine weitere Fehler-Exception auslöst, die nicht behandelt werden kann. Beim Einschalten oder einem Prozessor-RESET lädt der Prozessor von
Sandini Bib Programmierung und Betriebsarten
175
sich aus das IDTR mit einem Wert 000000h für die Basisadresse und 03ffh für das Limit. Diese Werte sind konsistent mit dem reservierten Bereich für die Interrupt-Vektortabelle im Real Mode. Die Interrupt-, Trap- und Task-Gates weisen denselben Aufbau wie das Call-Gate auf (siehe Abbildung 6.11), nur besitzt der Eintrag DWord-Count keine Bedeutung. Die Interrupt- und Trap-Gates definieren in gleicher Weise wie das Call-Gate den Einsprungpunkt über die Einträge Offset und Segmentselektor. Der Segmentselektor weist wie beim Call-Gate auf den Segmentdeskriptor in der LDT oder GDT, der die Basisadresse des betreffenden Segments enthält. Damit ist der Einsprungpunkt des Interrupt-Handlers ebenfalls eindeutig definiert. Der Unterschied zwischen Interrupt- und Trap-Gate besteht darin, dass ein Interrupt-Aufruf über ein Interrupt-Gate die Flags IE und T löscht, das Trap-Gate hingegen nicht. Die Besonderheiten, die gelten, wenn der Prozessor bei einem Interrupt oder einem CALL- bzw. Sprungbefehl auf ein Task-Gate trifft, werde ich im folgenden Abschnitt näher erläutern. Speicher
Speicher
INT 2
InterruptVektortabelle Vektor ffh (Seg:Off) ... 03h (Seg:Off) 02h (Seg:Off) 01h (Seg:Off) 00h (Seg:Off)
Vektor Vektor Vektor Vektor
Far-Call mit Sicherung der Flags
i386 Real-Mode (Real-Mode)
InterruptDeskriptortabelle
i386 Protected-Mode (Protected-Mode)
Deskriptor ffh (Interrupt-Gate) ... ... Deskriptor 03h (Interrupt-Gate)
INT 2
Limit Basis
Deskriptor 02h (Interrupt-Gate)
Far-Call über Interrupt-Gate
Interrupt-Handler Interrupt-Handler
Deskriptor 01h (Interrupt-Gate) Deskriptor 00h (Interrupt-Gate)
Abb. 6.13: Interrupt-Tabellen im Real und im Protected Mode: Im Real Mode (links) wird die Nummer des ausgelösten Interrupts einfach mit vier multipliziert, um den Offset im Segment 00h zu ermitteln, bei dem der betreffende Interrupt-Vektor abgelegt ist. Im Protected Mode weist das IDTR dagegen auf eine Deskriptortabelle, die Gates zu den entsprechenden Interrupt-Handlern enthält.
6.7.7
Multitasking, TSS und das Task Gate
Die gesamten Protection-Funktionen dienen in erster Linie einem Ziel: Multitasking. Bei einem PC-System sollen mehrere Tasks mehr oder weniger parallel ablaufen. Tatsächlich erreicht man mit einem Prozessor nur eine scheinbare Parallelität, weil die einzelnen Tasks für kurze Zeit ausgeführt, in kurzen Zeitabständen unterbrochen und nach kurzer Zeit an der gleichen Stelle wieder gestartet werden. Um das zu erreichen, muss der Zustand eines Tasks zum Zeitpunkt der Unterbrechung vollständig gesichert werden, weil der Task ja sonst nicht an derselben Stelle unter den Bedingungen zum Zeitpunkt der Unterbrechung neu aufgenommen werden kann. Ein ähnlicher Vorgang findet auch unter MS-DOS statt: Tritt ein Hardware-Interrupt wie beispielsweise der Timer-Interrupt auf, so werden alle Register auf dem Stack gesichert, der Interrupt bedient und alle Register vom Stack wieder mit den alten Werten geladen. Wichtig ist,
Sandini Bib 176
Kapitel 6
dass das Registerpaar CS:EIP gesichert wird, da es die Stelle im Programm angibt, an der es unterbrochen worden ist. Auf Grund der umfangreichen Protection-Funktionen des Prozessors ist es nicht damit getan ist, einfach nur ein paar Register zu sichern. Hierzu dient vielmehr das noch nicht näher besprochene Systemsegment mit Namen Task State Segment oder kurz TSS. Wie der Name bereits ausdrückt, speichert dieses den Zustand eines Tasks vollständig. Es stellt ein ganzes Segment dar, das ausschließlich zur Speicherung des Task-Zustands dient. In Abbildung 6.14 ist der Aufbau des TSS angegeben.
31
16 15
0
Offset
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 T
+100 (64h)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Task-LDT-Selektor
+96 (60h)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GS-Selektor
+92 (5ch)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
FS-Selektor
+88 (58h)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DS-Selektor
+84 (54h)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SS-Selektor
+80 (50h)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CS-Selektor
+76 (4ch)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ES-Selektor
+72 (48h)
I/O-Map-Basis
EDI
+68 (44h)
ESI
+64 (40h)
EBP
+60 (3ch)
ESP
+56 (38h)
EBX
+52 (34h)
EDX
+48 (30h)
ECX
+44 (2ch)
EAX
+40 (28h)
EFLAG
+36 (24h)
EIP
+32 (20h) +28 (1ch)
CR3 (PDBR)
+24 (18h)
SS für CPL2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+20 (14h)
ESP für CPL2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+16 (10h)
SS für CPL1
+12 (0ch)
ESP für CPL1
+8 (08h)
SS für CPL0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+4 (04h)
ESP für CPL0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Back-Link
auf vorheriges
TSS
+0 (00h)
Abb. 6.14: Task State Segment (TSS)
Im TSS sind neben den gewöhnlichen Offset- und Segmentregistern beispielsweise die Zeiger ESP und Segmente SS für die Stacks der verschiedenen Privilegierungsstufen, die für den Task benutzte lokale Deskriptortabelle und ein Eintrag enthalten, der auf das TSS des zuvor ausgeführten Tasks zeigt. Außerdem ist das CR3-Register abgelegt, das die Basisadresse des Page Directories für den beschriebenen Task angibt (siehe Kapitel 6.8). Der Eintrag I/O-Map-Basis gibt die Adresse einer I/O-Map an, die neben dem IOPL-Flag zum Schutz des I/O-Adressbereichs im Protected Mode dient. Im weiteren Verlauf des Kapitels erfahren Sie mehr hierzu. Das Feld Back Link enthält einen Segmentselektor, der auf das TSS des zuvor unterbrochenen Tasks weist. Der Eintrag ist aber nur dann gültig, wenn das Bit NT (Nested Task) im EFlag-Register gesetzt ist. Wenn das T-Bit (Debug-Trap-Bit) gesetzt ist, erzeugt der Prozessor bei einem Task Switch (d.h. beim Laden des TSS’) eine Debug-Exception entsprechend Interrupt 1.
Sandini Bib Programmierung und Betriebsarten
177
Weist der zugehörige TSS-Deskriptor in der LDT oder GDT im Typfeld den Wert 1 (80286-kompatibles TSS) oder 9 (ab 80386) auf, so ist das durch den Deskriptor beschriebene TSS verfügbar. Dies bedeutet, dass der von diesem TSS beschriebene Task gestartet werden kann. Ist im Typfeld hingegen ein Eintrag 3 (80286-kompatibles TSS) oder 11 (ab 80386) vorhanden, so ist das TSS als aktiv (busy) gekennzeichnet. Der von einem solchen TSS beschriebene Task ist aktiv und muss nicht eigens aktiviert werden. Darüber hinaus darf er nicht einmal aktiviert werden, weil das gespeicherte TSS noch die alten Werte enthält. Tasks sind also im Gegensatz zu Prozeduren prinzipiell nicht reentrant. Erst wenn der gerade laufende (aktive) Task unterbrochen wird, um z.B. einen anderen Task zu aktivieren, sichert der Prozessor alle aktuellen Werte des aktiven Tasks im zugehörigen TSS und lädt die Werte des zu startenden Tasks aus dessen TSS in die Segment-, Offset- und Steuerregister. Das geschieht völlig automatisch und selbstständig ohne einen weiteren Eingriff von Software. Woher »weiß« der Prozessor nun aber, wann er einen Task und welchen neuen er aktivieren soll, d.h. was bildet den Trigger für einen Task Switch? Der Schlüssel liegt in den Task-Gates. Abbildung 6.15 zeigt den Aufbau eines solchen Task Gates. Beachten Sie, dass sich die Struktur der Task Gates zwischen 80286 und 80386 trotz des Übergangs von 16 auf 32 Bit im Gegensatz zu allen anderen Gates und Systemsegmenten nicht geändert hat. 31
16 15 14 13 12
reserviert TSS-Segmentselektor
8 7
P DPL 0 0 1 0 1 reserviert
0
reserviert
Offset +4 +0
Abb. 6.15: Der Task-Gate-Deskriptor
Der TSS-Segmentselektor im Task-Gate weist auf den Segmentdeskriptor, der das TSS des neu zu aktivierenden Tasks definiert. Trifft der Prozessor bei einem CALL-Befehl, einem Sprungbefehl oder einem Interrupt auf ein solches Task-Gate, führt er einen solchen Task-Switch aus, indem er den gegenwärtigen Zustand des aktiven Tasks im TSS abspeichert, das durch das Task-Register TR (siehe Abbildung 6.8) definiert ist und dem Typfeld des zugehörigen TSS-Deskriptors den Wert 1 (80286-kompatibles TSS) oder 9 (80386-TSS) zuweist. Damit ist das TSS als verfügbares TSS gekennzeichnet. Anschließend lädt er den neuen TSS-Segmentselektor aus dem Task-Gate-Deskriptor in das TR und liest aus der LDT oder GDT (je nachdem, welche Tabelle der Segmentselektor im Task Gate referiert) Basisadresse, Limit und Zugriffsrechte des Task-Gate-Deskriptors. Um den Task-Switch zu vollenden, kennzeichnet der Prozessor nun den zugehörigen TSS-Deskriptor im Typfeld als busy, d.h. er schreibt einen Wert 3 (80286-kompatibles TSS) oder 11 (80386-TSS) in dieses Feld. Zuletzt lädt er die im neuen TSS abgelegten Werte für die Segmente und Offsets in die entsprechenden Register. Das Registerpaar CS:EIP zeigt nun auf den Befehl des neu aktivierten Tasks, bei dem dieser zuvor unterbrochen worden ist; seine Ausführung wird also an der Unterbrechungsstelle erneut aufgenommen. Abbildung 6.16 zeigt die vier Möglichkeiten, wie ein Task Switch ausgelöst werden kann, sowie die dazu vom Prozessor durchgeführten Prozesse. Erstmals aktivierte Tasks – also Tasks, die neu geladen werden – aktiviert die CPU in gleicher Weise. Nur zeigt das Registerpaar CS:EIP hier nicht auf den Befehl an der Unterbrechungsstelle, sondern den Startbefehl des Programms.
Sandini Bib 178
Kapitel 6
nein JUMP/CALL zu TaskGate? ja
nein
JUMP/ CALL zu TSS-Deskriptor? ja
Selektor im Gate weist auf TSS-Deskriptor
nein
Interrupt/ Exception zu TaskGate?
nein
IRET mit NT=1?
ja Selektor im Gate weist auf TSS-Deskriptor
ja Back-Link im aktiven TSS ist neuer TSS-Selektor Selektor weist auf TSS-Deskriptor für neuen Task
gegenwärtige Werte für EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS und EFlags im aktiven TSS speichern; Busy-Bit im aktiven TSS löschen
Task-Register TR mit dem Selektor des neuen TSS laden; Busy-Bit im Deskriptor für neues TSS und TS-Bit in CR0 setzen
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS, EFlags und LDT-Selektor aus neuem TSS laden
neuen Task bei CS:EIP beginnen/fortsetzen
Abb. 6.16: Der Prozessor führt einen Task Switch aus, wenn ein JUMP- oder CALL-Befehl auf ein Task Gate oder einen TSS-Deskriptor, ein Interrupt oder eine Exception auf ein Task Gate trifft oder falls eine IRET-Anweisung bei gesetztem NT-Bit auftritt.
Beispiel: Der aktive Task sei das Textverarbeitungsprogramm Word, das gerade damit beschäftigt ist, einen Seitenumbruch auszuführen. Nun tritt ein Timer-Interrupt auf. Im Interrupt-Handler trifft der Prozessor auf ein TaskGate, das auf Excel zeigt. Damit suspendiert der Prozessor Word, indem er alle Register im zugehörigen TSS sichert. Anschließend lädt er alle notwendigen Daten aus dem TSS für Excel und startet diesen bereits früher unterbrochenen Task. Nach kurzer Zeit tritt erneut ein Timer-Interrupt auf, nur wird diesmal Excel angehalten und dafür beispielsweise der C-Compiler aktiviert. Dieses Unterbrechen und Wiederaufnehmen von Tasks findet laufend statt. Wird ein neues Programm gestartet, so stellt das Betriebssystem ein neues TSS für diesen Task zur Verfügung. Sie merken schon, dass ein Multitasking-Betriebssytem sehr komplexe Operationen mit rasender Geschwindigkeit ausführen muss. Um einen TaskSwitch auszuführen, muss das Betriebssystem »nur« ein TaskGate, einen TSS-Deskriptor und ein TSS zur Verfügung stellen. Das Sichern der alten Registerinhalte und das Laden der neuen Werte führt der Prozessor selbstständig und automatisch aus. Es sind keine Software-Anweisungen des Betriebssystems notwendig, d.h. der Prozessor sichert bei einem Task Switch die 104 Byte des alten TSS und lädt die 104 Byte des neuen TSS völlig selbstständig.
Sandini Bib Programmierung und Betriebsarten
179
Betonen möchte ich noch, dass es allein Aufgabe des Betriebssystems ist, den einzelnen Programmen einen entsprechend großen Anteil an der Prozessorzeit zuzuweisen. Die Steuerung der Task Switches ist alleinige Aufgabe des Betriebssystems, die Programme selbst haben bei einem richtigen Multitasking-Betriebssystem wie z.B. Linux, OS/2 oder Windows NT/2000 keine Einflussmöglichkeiten darauf. Windows 3.x weicht davon erheblich ab. Hier entscheidet die Anwendung (und nicht Windows 3.x als Betriebssystemerweiterung), wann sie die Kontrolle an einen anderen Task (ein anderes Programm oder Windows selbst) abgibt. Eine sehr unangenehme Folge davon ist, dass der PC unter Windows 3.x scheinbar nicht oder nur sehr verspätet auf ein gewolltes Umschalten zu einem anderen Task reagiert (z.B. über Strg-Esc). »Richtige« Multitasking-Betriebssysteme führen nämlich ein so genanntes Preemptive Multitasking aus, Windows 3.x dagegen ein Non-Preemptive Multitasking oder kooperatives Multitasking. Ab Windows 95 wird das Multitasking in beiden Formen implementiert, sodass es von den jeweiligen Programmen abhängt (für welche Windows-Version sie ursprünglich geschrieben worden sind), welches Verfahren zum Einsatz kommt, was in der Praxis jedoch leider mit Problemfällen einhergeht, was letztendlich auch vom jeweiligen »Programm-Mix« auf Ihrer Festplatte abhängt. Das Betriebssystem DOS verwendet von den oben beschriebenen Funktionen nicht eine einzige. Auch die Treiber SMARTDRV.SYS und RAMDRIVE.SYS erstellen nur eine GDT und eine IDT, um Bytegruppen zwischen den unteren 1 MByte des Speichers und dem Extended Memory zu verschieben. Task-Switches und die umfangreichen und sehr nützlichen Zugriffsprüfungen werden in keiner Weise ausgenutzt. Neben den bereits im Ansatz geschilderten Prüfungen und Besonderheiten beim Aufruf von Prozeduren oder dem Umschalten zwischen verschiedenen Tasks muss ein Systemprogrammierer noch viele weitere Einschränkungen und Vorsichtsmaßnahmen beachten. Erst dann ist es möglich, ein voll funktionsfähiges Betriebssystem zu programmieren, das eine aktuelle CPU voll ausnutzt. Mit diesem Thema könnte man natürlich ohne Probleme mindestens zwei dicke Bücher füllen. Wir wollen uns mit dieser Einführung begnügen. In den nächsten beiden Abschnitten werden dann noch die Schutzvorkehrungen für den zweiten Adressraum erläutert, nämlich die Zugriffsprüfungen für den I/O-Adressraum.
6.7.8
Schutz des I/O-Adressraums
Über die I/O-Ports werden im allgemeinen Register von Hardwarekomponenten angesprochen. Da die Steuerung und Überwachung eine originäre Aufgabe des Betriebssystems ist und hierzu meist Treiber mit Privilegierungsstufe PL=1 benutzt werden, fällt auch der I/O-Adressraum oder -bereich unter den Zugriffsschutz. Ports werden aber nicht mit Hilfe eines Segmentregisters angesprochen, also steht diese Art des Zugriffsschutzes hier nicht zur Verfügung. Der Schutz des I/O-Adressbereiches erfolgt ab dem 80386 über zwei völlig andere Strategien: einmal das IOPL-Flag im Flag-Register (siehe Abbildung 5.13) und zusätzlich die I/O-Permission-Bit-Map im Task-State-Segment. Zunächst aber zum IOPL-Flag. Das IOPL-Flag Der Wert dieses Flags gibt die Privilegierungsstufe an, die ein Code-Segment mindestens aufweisen muss, um auf den I/O-Adressraum zugreifen zu können, d.h. es muss gelten CPL kleinergleich IOPL. Ist der CPL des aktuellen Tasks größer (niedrigere Privilegierungsstufe), so führen die I/O-Befehle IN, OUT, INS und OUTS zu einer bereits hinlänglich bekannten Exception »allgemeiner Protection-Fehler«, was unter Windows sicher schon fast jedem Anwender als Schutzverletzung begegnet ist. Vernünftige Anwendungsprogramme unter einem »richtigen« Betriebssys-
Sandini Bib 180
Kapitel 6
tem führen solche Zugriffe ausschließlich über das Betriebssystem aus. Weniger vernünftige Anwendungsprogramme versuchen das direkt, um einerseits die Performance zu erhöhen oder andererseits bestimmte Komponenten überhaupt ansprechen zu können. Neben den vier bereits erwähnten I/O-Befehlen sind auch CLI und STI vom IOPL-Flag abhängig. Diese sechs Befehle werden als IOPL-sensitive Befehle bezeichnet, da der Wert des IOPL-Flag einen Einfluss auf ihre Ausführung hat. Sinn und Zweck dieser Einschränkung werden sofort einsichtig, betrachtet man den Fall, dass eine Systemfunktion beispielsweise einen Datensatz von der Festplatte liest, dabei durch einen Task-Switch unterbrochen wird und der neu aufgerufene Task durch einen unmittelbaren Zugriff auf die Steuerregister im Controller »dazwischenfunkt«. In welchem Zustand sich die unterbrochene Systemroutine nach einem erneuten TaskSwitch befindet, ist völlig unvorhersehbar, der PC verabschiedet sich oder zerstört sogar Daten. Ein Task kann das IOPL-Flag nur über die Befehle POPF (POP Flags) und PUSHF (PUSH Flags) verändern. Zur Änderung des IOPL-Flags steht kein expliziter Befehl zur Verfügung (wie z.B. CLI oder STI für das Interrupt-Flag). Die beiden genannten Befehle POPF und PUSHF sind jedoch privilegiert, d.h. sie können nur von einem Code-Segment mit CPL=0 ausgeführt werden. Diese Stufe ist üblicherweise dem Betriebssystem-Kernel vorbehalten – die Anwendungsprogramme können das IOPL-Flag nicht verändern. Bei einem solchen Versuch löst der Prozessor eben eine Exception »allgemeiner Protection-Fehler« aus. Da die Flags jedoch Teil des TSS sind und sich somit von Task zu Task unterscheiden können, ist es durchaus möglich, dass ein Task Zugriff auf den I/O-Adressraum besitzt, ein anderer dagegen nicht. Diese Strategie der globalen Absicherung des I/O-Adressbereichs über das IOPL-Flag ist bereits beim 80286 implementiert. Die nachfolgenden CPUs können die Ports zusätzlich individuell schützen. Diese Schutzstrategie für die Ports ist insbesondere im Hinblick auf den Virtual-8086Mode implementiert worden. Die I/O-Permission-Bit-Map Neben dem globalen Schutz durch das IOPL-Flag kennt eine 32-Bit-CPU einen weiteren Schutzmechanismus für Zugriffe auf den I/O-Adressbereich, nämlich die so genannte I/O-PermissionBit-Map. Sie ist im TSS des jeweiligen Tasks abgelegt, verschiedene Tasks können also unterschiedliche I/O-Permission-Bit-Maps besitzen. Der Eintrag I/O-Map-Basis im TSS-Deskriptor gibt den Offset innerhalb des TSS an, bei dem die I/O-Permission-Bit-Map beginnt. Sie erstreckt sich bis zum Ende des TSS, wie es im Limiteintrag des TSS-Deskriptors festgelegt ist. Den Raum zwischen dem Eintrag I/O-Map-Basis und dem Beginn der I/O-Permission-Bit-Map kann das Betriebssystem verwenden, um eigene Informationen abzulegen. In Abbildung 6.17 sehen Sie das Schema der I/O-Permission-Bit-Map im 80386-TSS. Die I/O-Permission-Bit-Map muss also nicht unmittelbar nach den Einträgen für die Register im TSS beginnen. Vielmehr kann ein nahezu beliebig großer Raum zwischen dem Eintrag I/O-Map-Basis und dem Beginn der I/OPermission-Bit-Map zur Verwendung durch das Betriebssystem vorgesehen werden, das dort eigene Informationen ablegt. Beachten Sie, dass das höchstwertige Byte der Map, d.h. das Byte unmittelbar vor dem Ende des TSS’, den Wert 11111111b (=0ffh) besitzen muss. Für die I/O-Permission-Bit-Map können Sie nur ein 80386-TSS verwenden, das 80286-TSS ist nicht zugelassen, weil es keinen Eintrag I/O-Map-Basis hat. Eine gültige I/O-Permission-Bit-Map ist immer dann vorhanden, wenn die I/O-Map-Basis im TSS noch innerhalb des TSS’ liegt. Zeigt der Wert der Basis über das TSS hinaus, so ignoriert der Prozessor alle Prüfungen im Zusammenhang mit der I/O-Permission-Bit-Map, der Zugriffsschutz für den I/O-Adressbereich erfolgt allein durch das IOPL-Flag.
Sandini Bib Programmierung und Betriebsarten
181
Die I/O-Permission-Bit-Map stellt praktisch einen Zugriffsschutz zweiter Ebene dar: Wenn die Werte von CPL und IOPL dem aktiven Task einen Zugriff auf den I/O-Adressbereich gestatten, so untersucht der Prozessor anschließend zusätzlich noch die I/O-Permission-Bit-Map, um zu ermitteln, ob der gewünschte Port auch tatsächlich angesprochen werden kann. Das geschieht auf der Basis einer eins-zu-eins-Zuordnung von I/O-Adresse und dem entsprechenden Bit in der Map. Dem Port mit der Adresse 0 ist das Bit mit Offset 0 innerhalb der Map, dem Port mit der Adresse 1 das Bit mit Offset 1 usw. zugeordnet. Ist das einem Port entsprechende Bit in der Map gesetzt, also gleich 1, so löst die CPU bei einem Zugriff auf den zugehörigen Port eine Exception »allgemeiner Protection-Fehler« aus. Ist das Bit gelöscht, so fährt der Prozessor mit der I/O-Operation fort. Task-State-Segment 11111111
I/O-Permission-Bit-Map
verfügbar für das Betriebssystem
Task-Register
I/O-Map-Basis
000000000000000T
0000000000000000
LDT-Selektor
0000000000000000
GS-Selektor
Selekt. Segmentbasis Limit
0000000000000000 SS für CPL0 ESP für 0000000000000000
CPL0 Back-Link
Abb. 6.17: Der Prozessor schützt den I/O-Adressbereich nicht nur global über das IOPL-Flag, sondern zusätzlich noch über eine I/O-Permission-Bit-Map, die im TSS abgelegt wird. Ein gesetztes Bit schützt den zugehörigen Port und löst bei einem illegalen Zugriff eine Exception aus.
Die Länge der Map bestimmt die Zahl der so zusätzlich geschützten Ports. Es ist also nicht erforderlich, dass die I/O-Permission-Bit-Map alle I/O-Adressen abdecken muss. Allen von der Map nicht erfassten I/O-Ports wird automatisch ein gesetztes Bit zugeordnet, d.h. ein Zugriff auf die außerhalb der Map liegenden Ports führt automatisch zu einer Exception. In einem ISA-PC reicht es z.B. aus, die 3ffh niederwertigsten Ports durch eine Map abzudecken. Ein Zugriff auf Ports mit höherer Adresse löst eine Exception aus. Sie sehen erneut, dass die Schutzmechanismen des Protected Modes nicht nur Programme und das System schützen, sondern auch eine wesentlich einfachere Lokalisierung von Bugs ermöglichen. Um den gesamten I/O-Adressraum abzudecken, sind insgesamt (64k Ports)/(8 Bit je Byte) + (8 Bit 11111111), d.h. 8193 Byte notwendig. Beachten Sie, dass 16-Bit-Ports zwei und 32-Bit-Ports vier aufeinanderfolgenden Bits zugeordnet sind. Nur wenn beide bzw. alle vier zugeordneten Bits gleichzeitig gelöscht sind, kann der Prozessor die I/O-Operation fortsetzen. Ist auch nur eines der Bits gleich 1, so löst der Prozessor eine Exception aus.
Sandini Bib 182
Kapitel 6
Beispiel: Die Bit-Map lautet: 11111111 11001101 00110000 11010100 1. Fall: 8-Bit-Ports geschützte Ports 2, 4, 6, 7, 12, 13, 16, 18, 19, 22, 23 nicht geschützte Ports 0, 1, 3, 5, 8, 9, 10, 11 14, 15, 17, 20, 21 2. Fall: 16-Bit-Ports geschützte Ports 2, 4, 6, 12, 16, 18, 22 nicht geschützte Ports 0, 8, 10, 14, 20 3. Fall: 32-Bit-Ports geschützte Ports 0, 4, nicht geschützte Ports 8
12, 16, 20
Die 8-, 16- und 32-Bit-Ports können natürlich auch gemischt sein, je nachdem an welcher Adresse sich ein I/O-Gerät mit welcher Registerbreite befindet.
Erwähnen möchte ich an dieser Stelle, dass ein 32-Bit-Prozessor im Virtual-8086-Mode das IOPLFlag nicht benutzt, sondern den Schutz des I/O-Adressbereichs ausschließlich über die I/O-Permission-Bit-Map bewerkstelligt. Dadurch kann die CPU für ein 8086-Programm, das unter einem Protected-Mode-Betriebssystem im Virtual 8086 Modus läuft, das I/O-Verhalten des 8086 emulieren. Die I/O-Permission-Bit-Map wurde besonders im Hinblick auf den Virtual-8086Mode implementiert.
6.7.9
Exceptions und Schutzmechanismen im Protected Mode
Im Protected Mode sind gegenüber dem Real Mode weitere Exceptions möglich, die in erster Linie Fehlerbedingungen anzeigen, deren Ursache in einer Verletzung der Schutzbedingungen des Protected Modes liegen. Im Folgenden finden Sie eine Auflistung der neuen Exceptions.
:
: : : :
Zweifacher Fehler (Exception 8): Treten zwei Exceptions hintereinander auf (z.B. eine Exception beim Aufruf des Handlers für eine vorherige Exception), bevor diese behandelt werden kann und ist es dem Prozessor nicht möglich, beide Exceptions hintereinander auszuführen, dann löst die CPU einen Interrupt 8 aus. Der Prozessor kann die beiden Exceptions immer dann nicht sequenziell behandeln, wenn beide jeweils eine Exception 0 (Division durch 0), 9 (Coprozessor-Segmentüberlauf), 10 (Ungültiges Task-State-Segment), 11 (Segment nicht vorhanden), 12 (Stack-Exception) oder 13 (Allgemeiner Protection-Fehler) darstellen. Zum Beispiel führt das Auftreten der Exceptions 11 und 13 zu einer Exception 8; Coprozessor-Segmentüberlauf (Exception 9): Ist ein Teil eines Coprozessoroperanden geschützt oder nicht vorhanden, dann löst die CPU einen Interrupt 9 aus; Ungültiges Task-State-Segment (Exception 10): Jeder Task Switch mit einem ungültigen TSS löst einen Interrupt 10 (0ah) aus. Die Ursache liegt in einer inneren Inkonsistenz des TSS (z.B. ist das durch CS bezeichnete Segment nicht ausführbar oder ein Selektor übersteigt das zugehörige Tabellenlimit); Segment nicht vorhanden (Exception 11): Wenn der Prozessor versucht, auf ein Segment zuzugreifen, das aus dem Speicher ausgelagert ist, d.h. im zugehörigen Deskriptor ist das Present-Bit P gelöscht, dann ist ein Interrupt 11 (0bh) die Folge; Stack-Exception (Exception 12): Versucht ein Befehl, das Stack-Segmentlimit zu überschreiten oder ist das durch SS bezeichnete Segment z.B. nach einem Task Switch im Speicher nicht vorhanden , dann löst der Prozessor einen Interrupt 12 (0ch) aus;
Sandini Bib Programmierung und Betriebsarten
: :
183
Allgemeiner Protection-Fehler (Exception 13): Erfasst die CPU eine Verletzung der Schutzregeln des Protected Modes, wobei sich die Ursache nicht einer der Exceptions 8-12 zuordnen lässt, dann ist ein Interrupt 13 (0dh) die Folge; Page-Fehler (Exception 14): Wenn die Paging Unit (vgl. Kapitel 6.8) bei der Umsetzung einer linearen in eine physikalische Adresse ermittelt, dass die benötigte PageTable oder die Page selbst ausgelagert ist oder wenn der Task, der Daten in einer Page ansprechen möchte, nur auf der User-Ebene läuft, die Page aber als Supervisor gekennzeichnet ist, dann löst der Prozessor eine Exception entsprechend Interrupt 14 (0eh) aus. Das Betriebssystem lädt kann die betreffende PageTable oder Page in den Speicher, oder es meldet einen Zugriffsfehler.
Von den Schutzmechanismen im Protected Mode sind in erster Linie Befehle betroffen, die den Zustand der CPU steuern und lesen und auf Code- und Datensegmente zugreifen. Es soll verhindert werden, dass eine fehlerhafte oder inadäquate Anweisung die CPU aufhängt oder blockiert (wie z.B. der HLT-Befehl) bzw. Daten- und Code-Segmente in unsauberer Weise benutzt werden und dadurch die Systemintegrität zerstört wird. Zu diesem Zweck sind drei Gruppen von Schutzmechanismen vorgesehen.
: :
:
Beschränkte Nutzung von Segmenten: Beispielsweise können Codesegmente prinzipiell nicht und Datensegmente nur bei gesetztem Schreibbit (Bit W) beschrieben werden. Alle ansprechbaren Segmente sind durch die GDT oder LDT beschrieben, die anderen Segmente sind nicht erreichbar; Beschränkter Zugriff auf Segmente: Durch die verschiedenen Privilegierungsstufen und die Verwendung von CPL, DPL, EPL und RPL ist der Zugriff von Programmen einer bestimmten Privilegierungsstufe (CPL, RPL, EPL) auf Daten und Codes anderer Segmente (DPL) beschränkt. Ausnahmen sind nur durch zuverlässige Aufrufmechanismen (CallGate etc.) zulässig; Privilegierte Befehle: Befehle, die den Zustand der CPU unmittelbar beeinflussen (wie LGDT und LLDT) oder die Änderung von Deskriptortabellen können nur von Programmen ausgeführt werden, deren CPL oder IOPL eine hohe Privilegierungsstufe angeben;
Verletzt im Protected Mode ein Vorgang einen dieser Schutzmechanismen, dann löst der Prozessor sofort eine Fehler-Exception aus.
6.8 Paging Eine wesentliche Erweiterung der 32-Bit-CPUs gegenüber dem 80286 neben der 32-Bit-Architektur war die Integration einer Paging-Unit in der Speicherverwaltungseinheit. Was es mit Paging auf sich hat und welche neuen Möglichkeiten sich damit auftun, erfahren Sie daher in den nächsten Abschnitten.
6.8.1
Logische, lineare, physikalische Adressen und Paging
Durch die 32-Bit-Offsetregister und die 16-Bit-Segmentregister besitzt bereits der 80386 einen logischen Adressraum von 64 TByte je Task. Da die Basisadresse in den Segmentdeskriptoren 32 Bit breit ist, werden diese 64 TByte auf einen Adressraum mit einer Größe von maximal 4 GByte abgebildet. Die Kombination von Basisadresse eines Segments und Offsets innerhalb des Segments im Adressaddierer führt zu einer so genannten linearen Adresse. Dies bedeutet, dass die Adresse die Stelle eines Speicherobjektes in linearer Weise angibt, bei einer größeren Adresse finden Sie das Speicherobjekt auch weiter oben im Speicher. Die Segmentnummer, d.h. der Seg-
Sandini Bib 184
Kapitel 6
mentselektor, sagt dagegen hierüber nichts aus. Ein größerer Selektor kann ohne weiteres auf ein Segment weit unten im Speicher zeigen. Die Abbildung der 64 TByte auf die 4 GByte ist möglich, da nicht alle Segmente der 64 TByte auch tatsächlich vorhanden sein müssen (P-Bit der Segmentdeskriptoren). Der Rest kann beispielsweise auf die Festplatte ausgelagert sein. Werden alle 32 Adressleitungen benutzt, so kann diese lineare 32-Bit-Adresse in eine physikalische Adresse umgesetzt werden, die ebenfalls 32 Bit umfasst. Jeder Adresse im logischen Adressraum von 4 GByte entspricht dann ein Speicherobjekt in einem der Speicherchips. Eine Möglichkeit, den virtuellen Adressaum größer als den tatsächlich vorhanden physikalischen Speicher zu machen, haben wir bereits beim Protected Mode und den damit verbundenen Segmentdeskriptoren kennen gelernt. In den Segmentdeskriptoren ist ein Bit P (Present) vorhanden, das angibt, ob sich das Segment auch tatsächlich im Speicher befindet. Versucht der Prozessor ein Segment anzusprechen, dessen P-Bit gelöscht ist, d.h. es befindet sich nicht im Speicher, so wird die Exception »Segment nicht vorhanden« ausgelöst. Das Betriebssystem kann das fragliche Segment nun in den Speicher laden und dem Befehl erneut die Chance geben, auf das Segment zuzugreifen. Damit ist es möglich, für ein Programm mehr Segmente zu erzeugen als auf einmal in den Speicher passen. Die ausgelagerten Segmente werden bei Bedarf einfach eingelesen. Ist im Speicher nicht mehr genügend Platz vorhanden, so müssen ein oder mehrere andere Segmente ausgelagert werden, um Raum für das neu eingelesene zu schaffen. Damit beginnen aber nun schon die Probleme. Die Daten können nur segmentweise ausgelagert und eingelesen werden und zudem stimmt die Größe der Segmente mit der Größe der Datenstrukturen überein, die sie enthalten. Das Datensegment für eine umfangreiche Zeichnung oder das Codesegment für ein leistungsstarkes Programmmodul können sehr groß sein. Demgegenüber ist ein Datensegment, das nur eine Anredefloskel für einen Brief enthält oder ein Codesegment, das eine einfache Prozedur speichert, meist sehr klein. Soll nun ein großes Segment von Festplatte in den Speicher geladen werden, sind möglicherweise eine Vielzahl kleinerer Segmente auszulagern. Besonders ärgerlich wird die ganze Angelegenheit, wenn in dem eingelesenen Segment nur ein einziges Byte oder Wort angesprochen werden muss, aber anschließend sofort ein Zugriff auf den Code oder die Daten in einem der ausgelagerten Segmente erfolgen soll: das Segment also erneut auslagern, das Codesegment einlesen. Benötigt das Programm nochmals Daten vom jetzt erneut ausgelagerten Datensegment, dann nochmals alles von vorne – usw. Ein weiteres Problem tritt bei sparsamem Speicherausbau auf: Für das Datenbanksegment bleibt vom physikalischen Hauptspeicher nur der Platz, den Betriebssystem, Treiber, Systemtabellen und wenigstens ein Codesegment des aktuellen Programms übriggelassen haben. Ist das ausgelagerte Segment nun größer als dieser restliche Speicher, so kann es nicht eingelesen werden. Stehen beispielsweise maximal 990 KByte zur Verfügung, besitzt das Datenbanksegment aber eine Größe von 1 MByte, so kann das Segment nicht eingelesen und das Programm damit nicht ausgeführt werden. Das Betriebssystem muss daher eine ganz ordentliche Menge an Arbeit leisten: ermitteln, welches Segment denn am besten ausgelagert wird, ob der jetzt freie Speicher ausreicht, ggf. ein weiteres Segment auslagern etc. Entsprechend zäh kann der Swap-Vorgang ablaufen, was Sie unter Windows an der unentwegten Beschäftigung der Festplatte vernehmen können. Es gibt aber eine bessere Möglichkeit: Paging. Da sich alle Segmente im vorhandenen physikalischen Speicher befinden müssen, der kleiner als 4 GByte ist, liegen auch die Basisadressen aller Segmente bisher innerhalb des Adressbereichs des physikalischen Speichers. Bei einem Hauptspeicher von beispielsweise 4 MByte sind damit alle Basisadressen kleiner als 4 MByte, d.h. der gesamte lineare Adressbereich von 4M bis 4G
Sandini Bib Programmierung und Betriebsarten
185
wird nicht benutzt. Mit anderen Worten – ca. 99,9% des linearen Adressbereichs sind ungenutzt. Eine Menge Speicher für viele, viele Segmente! Beim Paging wird ein sehr großer virtueller Adressraum auf einen viel kleineren physikalischen Adressraum des Hauptspeichers sowie den großen Adressraum eines externen Massenspeichers (im Allgemeinen eine Festplatte) abgebildet. Diese Abbildung erfolgt in »Portionen« fester Größe, die eben als Pages (Seiten) bezeichnet werden. Ab dem 80386 ist eine Page-Größe von 4 KByte festgelegt. Diese Größe ist durch Prozessorhardware definiert und kann nicht verändert werden. Der gesamte virtuelle Adressraum besteht also aus einer Million Pages. Meistens sind natürlich bei weitem nicht alle auch tatsächlich von Daten belegt. Die von Daten belegten Pages befinden sich entweder im Speicher oder sind auf die Festplatte ausgelagert. Ob der Prozessor diese Paging-Mechanismen auch tatsächlich benutzt, wird durch das PG-Bit des CR0-Registers bestimmt. Ist PG gesetzt, so findet Paging statt, ansonsten nicht. Da das Betriebssystem die Pages verwalten und ggf. auslagern oder einlesen muss, ist es mit dem gesetzten PG-Bit allein nicht getan. Die CPU-Hardware unterstützt Paging vielmehr in ähnlicher Weise wie die Protection- und Task-Switch-Mechanismen. Das Betriebssystem muss die PagingExceptions abfangen und entsprechend bedienen, die ausgelagerten Pages suchen und wieder einlesen etc. Im Prozessor findet somit eine zweifache Adressenabbildung statt: Einmal werden Segment und Offset eines Speicherobjektes zu einer linearen Adresse im linearen Adressraum von 4 GByte entsprechend einer Million Pages kombiniert. Anschließend werden die eine Million Pages entsprechend der linearen Adresse in eine physikalische Adresse oder eine Exception »Page nicht vorhanden« zum Einlesen der betreffenden Page umgesetzt.
6.8.2
Page Directory, Page Tables und Page Frames
Für die Ermittlung einer linearen Adresse aus Segment und Offset muss bekannt sein, wo das betreffende Segment beginnt. Diese Information wird in den Deskriptortabellen abgelegt. Dabei gibt es zwei Ebenen solcher Tabellen: die globale Deskriptortabelle GDT bildet das »Stammverzeichnis«, in dem die lokalen Deskriptortabellen LDT als »Unterverzeichnisse« auftreten können. Die Adresse der Deskriptortabellen wird im GDTR bzw. LDTR abgelegt. Mit den darin abgelegten Informationen können Segment und Offset zu einer linearen 32-Bit-Adresse kombiniert werden, die in unveränderter Weise als physikalische Adresse verwendet wird. Zum Beispiel ein PC mit 4 MByte Hauptspeicher: Das Segment beginnt bei 1b0000h, der Offset beträgt d23a0h. Damit lautet die lineare Adresse 2823a0h. Es wird damit das Byte mit der Nummer 2.630.560 bzw. 0000 0000 0010 1000 0010 0011 1010 0000b adressiert. Da der Hauptspeicher nur auf 4 MByte ausgebaut ist, sind die zehn höchstwertigen Adressbits stets gleich 0, d.h. die Adresse lautet immer 0000 0000 00xx xxxx xxxx xxxx xxxx xxxx. An der Stelle der x steht eine Binärzahl von 0 bis 1. 31
22 21
Directory
0
12 11
Page
Offset
Abb. 6.18: Interpretation der linearen Adresse bei aktivem Paging
In ähnlicher Weise wird auch die Abbildung von linearer auf physikalische Adresse durch ein zweistufiges Verzeichnis und ein Register, das das »Stammverzeichnis« angibt, implementiert.
Sandini Bib 186
Kapitel 6
Eine Tabelle definiert die Abbildung zwischen linearer und physikalischer Adresse. Hierzu ist aber eine andere Interpretation der linearen Adresse notwendig (siehe Abbildung 6.18). Bei aktivem Paging geben die zehn höchstwertigen Bits der linearen Adresse die Nummer der betreffenden Page Table im Page Directory an, die der aktuellen linearen Adresse entspricht. Die nächsten zehn Bits definieren die Nummer der Page in der festgelegten Page Table. Schließlich geben die zwölf niederwertigsten Bits in unveränderter Weise den Offset innerhalb der so definierten Page an. Sie reichen aus, weil eine Page ja nur 212=4.096 Bit umfasst, für ein Segment ist dagegen ein 32-Bit-Offset notwendig. Damit wird eine lineare Adresse auf eine physikalische Adresse abgebildet, indem durch DIR eine Page Table, durch Page eine Page in dieser Page Table und schließlich durch Offset ein Offset innerhalb dieser Page angegeben wird (siehe Abbildung 6.19). Man könnte das auch folgendermaßen ausdrücken: Durch Paging werden die 20 höchstwertigen Adressbits auf neue Werte abgebildet, während die zwölf niederwertigsten Adressbits als Offset unverändert übernommen werden.
DIR
PAGE
lineare Adresse
OFFSET
Eintrag 1023 ... ... Eintrag 3 Eintrag 2 Eintrag 1 Eintrag 0
Page 1023 ... ... ... ... ... Page 0
PageDirectory
Page 2047 ... ... ... ... ... Page 1024
Page 3071 ... ... ... ... ... Page 2048
Page 4095 ... ... ... ... ... Page 3072
PageFrame
PageFrame
PageFrame
PageFrame
PageFrame
(Daten, Code)
(Daten, Code)
(Daten, Code)
(Daten, Code)
(Daten, Code)
Page 1048575 ... ... ... ... ... Page 1047552
PageTables
PageFrames physikalische Adresse
Abb. 6.19: Die Abbildung lineare Adresse -> physikalische Adresse bei aktivem Paging: Nach Kombination von Segment und Offset zu einer linearen Adresse wird die so erhaltene lineare Adresse bei aktivem Paging in eine 10-Bit-Page Directory-Adresse, eine 10-Bit-Page-Adresse und einen 12-Bit-Offset aufgespaltet. Jede Page ist 4 KByte groß, sodass der gesamte Adressraum beim Paging in 4-KByte-Blöcke unterteilt wird.
Der Sinn zweier solcher Ebenen von Page Tables ist unschwer zu erkennen. Jeder Page Table-Eintrag ist vier Byte lang (siehe Abbildung 6.20). Würde jede Page (zu 4 KB) des linearen Adressraums von 4 GByte entsprechend einer Million Pages durch eine einzelne Page Table im Speicher abgebildet, so wären hierzu 4 MByte Speicher allein für die Page Tables notwendig. Die Bildung zweier Ebenen erlaubt es aber nun, die Page Tables niedrigerer Ebene wie Pages selbst zu verwalten, da sie wie eine »normale« Page 4 KByte groß sind. Die Page Tables zweiter Ebene können damit wie normale Pages ein- und ausgelagert werden. Nur das Page Directory mit 4 KByte muss also ständig im Speicher gehalten werden. Dessen Basisadresse wird im CR3-Register gespeichert.
Sandini Bib Programmierung und Betriebsarten
187
Sowohl Page Directory als auch Page Table weisen jeweils 1.024 (1k) Page Table-Einträge mit einer Länge von jeweils 4 Byte auf. In Abbildung 6.20 ist der Aufbau eines solchen Page TableEintrags angegeben.
Page-Frame-Adresse 31...12
9 8 7 6 5 4 3 2 1 0
AVAIL
res D A res
U/S R/W
12 11
31
P
Page-Frame-Adresse: Adressbits 31...12 des Page Frames AVAIL: verfügbar für das Betriebssystem (available) D: (beschrieben) Dirty 0=Page wurde noch nicht beschrieben 1=Page wurde beschrieben A: Accessed 0=Page wurde noch nicht angesprochen 1=Page wurde bereits angesprochen U/S: Zugriffsebene der Page (User/Supervisor) 0=Supervisor (CPL=0..2) 1=User (CPL=3) R/W: Schreibschutz (Read/Write) 0=Page nur lesbar 1=Page kann auch beschrieben werden P: Page Present 0=Page ausgelagert 1=Page im Speicher res: reserviert (gleich 0) Abb. 6.20: Die Struktur eines Page Table-Eintrags
Das P-Bit (Page Present) gibt an, ob sich die betreffende Page auch tatsächlich im Speicher befindet (P=1) oder ausgelagert ist (P=0). In letzterem Fall enthalten die restlichen 31 Bit des Page Table-Eintrags Informationen darüber, wo die Page auf der Festplatte oder einem anderen Massenspeicher zu finden ist. Die nachfolgend aufgeführten Einträge besitzen dann keine Bedeutung. Befindet sich die Page im Speicher, d.h. ist P=1, so geben die 20 höchstwertigen Bit die Adresse des Page Frames an. Als Page Frame bezeichnet man in diesem Zusammenhang einen Speicherbereich in der Größe einer Page (4KByte), der die Daten einer Page aufnimmt. Die Adressen solcher Page Frames sind stets ganzzahlige Vielfache von 4096 (1000h): 0, 4096, 8192, ... bzw. 0000h, 1000h, 2000h, ... Sie können sich das ruhig bildlich als Page-Rahmen vorstellen: Wie man ein Blatt Papier (Page) mit Informationen in einen Rahmen einlegen kann, so »legt« der Paging-Mechanismus Pages mit verschiedenem Inhalt in die Page Frames ein. Die Rahmen bleiben gleich (und hängen sehr bildlich ausgedrückt an derselben Wand), die Information wird ausgetauscht. Damit werden in der physikalischen 32-Bit-Adresse die 20 höherwertigen Adressbits vom Paging-Mechanismus durch diese 20 Bit der Page-Frame-Adresse ersetzt. Die zwölf niederwertigen Bit der physikalischen Adresse geben den Offset des Speicherobjekts innerhalb der Page an. Im Page Table-Eintrag dienen die zwölf niederwertigen Bit dagegen zur Verwaltung der Page. Ist Paging aktiv, so fügt der Prozessor die 20 Bit der Page-Frame-Adresse und die zwölf Offsetbit der physikalischen Adresse zu einer physikalischen 32-Bit-Adresse zusammen. Ist die Page ausgelagert (P=0), so löst die CPU eine Exception »Page-Fehler« entsprechend Interrupt 0eh aus. Damit kann die Paging-Routine des Betriebssystems die erforderliche Page in einen freien PageFrame laden. Dieses über die Page-Fehler-Exception getriggerte Ein- und Auslagern von Pages funktioniert auch dann, wenn ein Speicherobjekt, wie z.B. ein Doppelwort, nicht mehr vollständig in eine Page passt und auf zwei Pages verteilt ist.
Sandini Bib 188
Kapitel 6
Beispiel: ein Doppelwort (4 Byte) mit Offset fffdh (dezimal 4094). Die zwei niederwertigen Bytes des Doppelwortes sind in den zwei höchstwertigen Byte der Page abgelegt. Die beiden höherwertigen Byte des Doppelwortes befinden sich aber bereits in einer anderen Page, die möglicherweise sogar ausgelagert ist. Ein 32-Bit-Prozessor spricht den Speicher im Allgemeinen physikalisch stets an den Doppelwortadressen 0, 4, 8, ... an. Beginnt ein Doppelwort nicht an einer solchen Doppelwortgrenze, so führt der Prozessor zwei Speicherzugriffe aus, die jeweils an einer Doppelwortgrenze beginnen. Im oben angegebenen Beispiel werden damit zuerst die letzten vier Byte der Page angesprochen, in denen sich die zwei höherwertigen Byte des Doppelworts befinden. Anschließend greift der Prozessor auf die ersten vier Bytes der nächsten Page zu. Befindet sich diese Page nicht im Speicher, so wird sie nachgeladen. Damit kann der Prozessor auch die zwei niederwertigen Byte des Doppelworts ansprechen. Die Vorteile gegenüber einer Auslagerung von kompletten Segmenten besteht darin, dass die sich die kleinen Portionen zu 4 KByte schnell einlesen oder abspeichern lassen. Außerdem greifen Programme meist auf relativ eng beieinander liegende Daten zu. Damit ist trotz der relativ geringen Größe von 4 KByte gegenüber einem virtuellen Adressraum von 4 GByte, d.h. einem Faktor 1 Million, die Wahrscheinlichkeit groß, dass sich die Daten im Speicher befinden und nicht ausgelagert sind. Bei großen Segmenten müssen nur die Bruchstücke geladen sein, die gerade bearbeitet werden. Eine komplette Auslagerung und das sofortige erneute Einlesen, wie eingangs beschrieben worden ist, tritt damit bei Paging nicht auf – der Computer arbeitet dadurch schneller. Man könnte nun meinen, dass die zusätzliche Adressenumsetzung beim Paging zusätzlich zur Bildung der linearen Adresse aus Segment und Offset zu Verzögerungen bei der Adressenberechnung führt. Das trifft in den meisten Fällen jedoch nicht zu, da bereits der 80386 einen Cache-Speicher aufweist, in dem die zuletzt benutzten Page Table-Einträge gespeichert sind. Dieser Cache-Speicher wird als Translation Lookaside Buffer (TLB) bezeichnet. Nur wenn ein Page Table-Eintrag benutzt werden soll, der sich noch nicht im TLB befindet und somit erst aus dem Speicher gelesen werden muss, verzögert sich die Adressenumsetzung durch den Speicherzugriff etwas. Ist die Page Table mit dem Eintrag allerdings auf Platte ausgelagert, dauert der Zugriff erheblich länger, da die Page Table erst in den Speicher und der Eintrag von diesem in den Prozessor gelesen werden muss. Durch intelligente Algorithmen für die Verwaltung von Page Tables und deren Einträgen durch das Betriebssystem ist dieser Fall aber glücklicherweise relativ selten und führt also nur zu sehr geringen Verzögerungen. Der Gewinn eines sehr großen virtuellen Adressraums gegenüber einem kleinen physikalischen Adressraum durch Paging ist überaus groß. Für die Verwaltung der Pages und Page Tables der zweiten Ebene sind mehrere Bits in den Page Table-Einträgen reserviert (siehe Abbildung 6.20). Hat der Prozessor einmal auf eine Page zugegriffen, d.h. Daten gelesen oder geschrieben, so wird das A-Bit (Accessed) im zugehörigen Page Table-Eintrag gesetzt. Löscht das Betriebssystem in regelmäßigem Abstand diese A-Bits, so kann es erkennen, welche Pages häufig benutzt werden. Es lagert dann nur die weniger häufig benutzten Pages aus, um möglichst wenig Schreib- und Lesezugriffe der Festplatte zu verursachen. Damit läuft das Paging fast ohne Verzögerung ab. Das D-Bit (Dirty-Bit) kennzeichnet Pages, deren Inhalt verändert – überschrieben – wurde. Ist das Bit gelöscht, so muss die Page beim Auslagern nicht auf die Festplatte geschrieben werden, da sich auf dieser ja noch die unveränderte alte Kopie befindet. Ist das D-Bit jedoch gesetzt, so erkennt das Betriebssystem eine Veränderung der Daten und schreibt neben den Informationen, die dazu dienen, die Page später wiederzufinden, auch die Daten der Page selbst auf Platte.
Sandini Bib Programmierung und Betriebsarten
189
Ähnlich wie Segmente können auch Pages vor einem Zugriff durch Programme geschützt werden. Im Gegensatz zu den Segmenten, für die vier Privilegierungsebenen von 0 bis 3 zur Verfügung stehen, kennt der Schutzmechanismus für Paging derer nur zwei: User und Supervisor. Programme mit den Privilegierungsstufen CPL=0 bis CPL=2, d.h. Betriebssystem, Einheitentreiber und Betriebssystemerweiterungen, besitzen die Stufe Supervisor. Anwendungsprogramme dagegen die Stufe User. Die Privilegierungsstufe von Pages wird durch das U/S-Bit (User/ Supervisor) angegeben. U/S=0 gilt damit für Betriebssystem, Systemsoftware etc. (CPL=0, 1, 2), U/S=1 für Applikationscode und -daten (CPL=3). Durch das R/W-Bit (Read/Write) werden Pages als nur-lesbar (R/W=0) oder als les- und überschreibbar (R/W=1) gekennzeichnet. Eine Verletzung, z.B. ein Schreibzugriff auf eine nur-lesbare Page (R/W=0), führt zu einer Exception »Page-Fehler«. Der Segmentierungsmechanismus schützt im Protected Mode die Daten dagegen auf einer Segmentbasis. Eine Verletzung der Paging-Schutzmechanismen, z.B. durch einen Schreibzugriff auf eine nur-lesbare Page (R/ W=0) oder einen User-Zugriff auf eine Supervisor-Page, führt ebenfalls zur Exception »Page-Fehler« und damit zu einem Interrupt 0eh. Die drei Bits AVAIL stehen dem Betriebssystem für die Verwaltung der Pages zur Verfügung, alle anderen Bits sind reserviert. 0 31
logische (virtuelle) Adresse
0
Selektor
Offset
Segmentierung
Deskriptortabelle
Segmentdeskriptor
+
GDTR/LDTR
DIR
Page-Directory
PAGE
lineare Adresse
Offset
Page-Table
Page-Frame
Speicherobjekt Page
Frame
CR3
Paging
15
physikalische Adresse
Abb. 6.21: Die zweifache Adressenumsetzung mit Segmentierung und Paging
Segmentierung und Paging bewirken damit eine zweifache Adressenumsetzung. Bei der Segmentierung wird anhand der Deskriptortabellen und Segmentdeskriptoren die Basisadresse des Segments bestimmt und durch Addition des Offsets eine lineare Adresse in einem großen virtuellen Adressraum gebildet. Paging setzt diese lineare Adresse in eine physikalische Adresse des sehr viel kleineren physikalischen Adressraums oder eine Exception »Page-Fehler« um. Dieser Vorgang ist in Abbildung 6.21 dargestellt. Durch die Segmentdeskriptor-Cache-Register und den TranslationLookaside-Puffer erfolgt diese Umsetzung in den meisten Fällen ohne Zeitverzögerung.
Sandini Bib 190
6.8.3
Kapitel 6
Die Testregister TR6 und TR7
Weil die beiden Testregister TR6 und TR7 ausschließlich zum Prüfen des Translation Lookaside Buffers (TLB) implementiert sind, möchte ich sie zusammen mit dem TLB selbst an dieser Stelle erläutern. Wenn Sie noch nicht mit Cache-Speichern vertraut sind, sollten Sie sich zunächst Kapitel 7 ansehen. Der TLB ist als 4-Wege-Set-Assoziativspeicher implementiert und verwendet eine RandomErsetzungsstrategie für seine Einträge. Er ist einschließlich der Cache-Steuerung bereits vollständig auf dem 80386-Chip integriert und benötigt somit keinen externen SRAM-Speicher. Ähnlich wie bei anderen Cache-Speichern auch, umfasst jeder Eintrag in den vier Sets 0 bis 3 ein 24-BitTag und den eigentlichen 12-Bit-Cache-Wert. Jedes Set umfasst acht Einträge, der ganze TLB kann also 32 Einträge aufnehmen und ist insgesamt 144 Bytes groß. 32 Einträge für jeweils eine 4-KByte-Page bedeuten, dass 128 KByte Speicher vom TLB abgedeckt wird. Jedes Tag (zu 24 Bit) speichert die 20 höherwertigen Bit der linearen Adresse (also DIR- und Page-Anteil), ein Gültigkeitsbit und drei Attributbits. Der Dateneintrag enthält die 12 höherwertigen Bit der zugeordneten physikalischen Adresse. Wenn bei einem Page Table-Zugriff die physikalische Adresse des Page Frames bereits im TLB gespeichert ist, verwendet der Prozessor sie intern, um die physikalische 32-Bit-Adresse zu erzeugen. Ansonsten muss der Prozessor den Page Table-Eintrag erst aus dem Speicher einlesen. Für den TLB gibt Intel eine 98%ige Trefferwahrscheinlichkeit an, d.h. 98% aller Speicherzugriffe auf Code und Daten referieren eine Page, deren Frame-Adresse vom TLB bereitgehalten wird. Zur Prüfung des Translation-Lookaside-Buffers sind die zwei Testregister TR6 und TR7 vorhanden. Sie werden als Test-Command-Register (TR6) und Testdatenregister (TR7) bezeichnet. In der Abbildung 6.22 sehen Sie deren Struktur. Die TLB-Prüfung unterteilt sich in zwei Vorgänge: Einträge in den TLB schreiben und TLB-Einträge lesen (TLB-Lookup ausführen). Die Einträge in den Testregistern haben dabei folgende Bedeutung. Das Bit C im Test-Command-Register gibt an, ob ein Schreiben in den TLB (C=0) oder ein TLBLookup (C=1) ausgeführt werden soll. Die lineare Adresse stellt das Tag-Feld des TLBs dar. Bei einem Schreiben in den TLB wird dieser linearen Adresse ein TLB-Eintrag zugeordnet und dem so zugeordneten Eintrag wird der Inhalt von TR6 und TR7 übergeben. Bei einem TLB-Lookup prüft die Testlogik, ob diese lineare Adresse und die Attributbits mit genau einem TLB-Eintrag übereinstimmen. Ist das der Fall, werden die restlichen Felder von TR6 und das Testregister TR7 aus dem ermittelten Eintrag im TLB geladen. Die Bedeutung von PL ist abhängig von C unterschiedlich. Wird ein Eintrag des TLBs geschrieben (C=0) und ist PL=1, dann legt REP den Assoziativblock des TLBs fest, der beschrieben wird. Ist PL in diesem Fall gelöscht (PL=0), so wählt ein interner Zeiger in der Paging Unit den zu schreibenden TLB-Block aus. Bei einem TLB-Lookup (C=1) gibt der Wert von PL an, ob der Lookup zu einem Treffer (PL=1) oder Fehltreffer (PL=0) geführt hat.
Sandini Bib Programmierung und Betriebsarten
31
191
16 15
TR7
physikalische Adresse 31...12
TR6
lineare Adresse 31...12
12 11 10
9
8
7
6
5
4
3
2
0 0 0 0 0 0 0 PL REP
1
0
0 0
V D D U U W W 0 0 0 0 C
TR6 V: Gültigkeit (Valid) 0=Eintrag ungültig 1=Eintrag gültig D, D: Dirty-Bit, komplementäres Dirty-Bit U, U: U/S-Bit, komplementäres U/S-Bit W, W: R/W-Bit, komplementäres R/W-Bit C: Befehlsbit (Command) 0=TLB-Schreiben 1=TLB-Lookup TR7 PL: TLB-Schreiben (C=0): Zeigerauswahl für TLB-Eintrag 0=interner Zeiger 1=Wert aus REP-Feld TLB-Lookup (C=1): Treffer/Fehltreffer für TLB-Eintrag 0=Fehltreffer 1=Treffer REP:Ersetzungszeiger (Replace Pointer) TLB-Schreiben (C=0): Zeiger auf TLB-Eintrag TLB-Lookup (C=1): Tag-Angabe (nur für Treffer) Abb. 6.22: Die Struktur der Testregister TR6 und TR7
V ist das Gültigkeitsbit für den TLB-Eintrag. Ein gesetztes V-Bit gibt an, dass der Eintrag gültig, ein gelöschtes, dass der Eintrag ungültig ist. Die restlichen Bits des TR6-Registers entsprechen den Attributbits eines Page Table-Eintrags. D, D stellen das Dirty-Bit, U, U das User/SupervisorBit und W, W das Schreibschutzbit für den entsprechenden TLB-Eintrag dar. Die drei Bit sind in normaler und komplementärer Form angegeben (siehe Tabelle 6.3). Man erhält dadurch bei Table-Lookups z.B. die Möglichkeit, die Testlogik anzuweisen, den Wert der Bits für einen Lookup zu ignorieren (wenn beide gesetzt sind, findet die Logik immer eine Übereinstimmung). Sind nämlich sowohl das Attributbit als auch das dazu komplementäre gesetzt (=1), dann ermittelt die Logik für das entsprechende Attribut stets einen Treffer. Anders ausgedrückt ist der Attributwert in diesem Fall unerheblich. D, U, W
D, U, W
Auswirkung für TLB-Lookup
Wert im TLB nach dem Schreiben
0 0 1 1
0 1 0 1
stets Fehltreffer für D, U, W Treffer für D, U, W=0 Treffer für D, U, W=1 stets Treffer für D, U, W
D, U, W nicht definiert D, U, W gesetzt (=1) D, U, W gelöscht (=0) D, U, W nicht definiert
Tab. 6.3: Auswirkung der komplementären Bitpaare
Die Prüfung des TLBs erfolgt durch Schreiben und Lesen (TLB-Lookup) der Testregister TR6 und TR7. Um einen TLB-Eintrag für einen Test zu setzen, müssen Sie zunächst TR7 mit den Werten für die physikalische Adresse, PL=1 und REP laden. Anschließend müssen Sie TR6 mit geeigneten Werten für die lineare Adresse und die Attributbits schreiben und das Command-Bit C löschen. Um ein TLB-Lookup auszuführen (d.h. einen TLB-Eintrag zu lesen), laden Sie TR6 mit der entsprechenden linearen Adresse und setzen C. Anschließend lesen Sie die beiden Testregister TR6 und TR7. Das PL-Bit zeigt an, ob ein Treffer (PL=1) oder Fehltreffer (PL=0) erfolgt ist. Im ersten Fall spiegeln die Testregisterwerte den Inhalt des zugehörigen TLB-Eintrags wider. Bei einem Fehltreffer enthalten sie dagegen ungültige Werte.
Sandini Bib 192
Kapitel 6
6.9 Der Virtual-8086-Modus Mit dem 80386 wurde ein neuer Betriebsmodus eingeführt, der ähnlich wie der Protected Mode des 80286 zu allerlei Verwirrung und Mythisierungen führte. In den folgenden Abschnitten möchte ich daher den Virtual Mode etwas entwirren. Der Antrieb zur Implementierung des Virtual Modes lag in der ganz enormen Anzahl von Programmen für den PC unter MS-DOS, einem reinen Real-Mode-Betriebssystem. Auch der leistungsfähigste Pentium arbeitet unter MS-DOS stets im Real Mode und kann damit nur das erste der 4.096 MByte des 32-Bit-Adressraums benutzen. Darüber hinaus werden weder die umfangreichen Schutzmechanismen des Protected Modes noch die Paging-Mechanismen ab dem 80386 benutzt. Der Virtual Mode soll nun einerseits den Betrieb unveränderter Real-Mode-Programme für den 8086 ermöglichen und andererseits die Schutzmechanismen des Protected Modes ausnutzen. Das Besondere dabei ist, dass die virtuellen 8086-Tasks parallel zu anderen virtuellen Tasks ablaufen können, d.h. es findet ein Multitasking mit nicht multitasking-fähigen Programmen statt. 8086-Programme unter MS-DOS sind nicht multitasking-fähig, da DOS als Betriebssystem nicht reentrant ist: Wird eine DOS-Funktion durch einen Interrupt unterbrochen, der ebenfalls eine DOS-Funktion aufruft, so stürzt der PC häufig ab, da nach einem IRET der ursprüngliche Stack zerstört ist. Aus diesem Grund ist die Programmierung von residenten (TSR-) Programmen relativ schwierig. Mit Hilfe des Virtual Modes und Paging lassen sich diese Schwierigkeiten aber elegant umgehen. Den Virtual-8086-Mode nutzen z.B. die DOS-Fenster von Windows oder OS/2 aus.
6.9.1
Virtuelle Maschinen und Virtual-8086-Monitor
Im Virtual Mode bilden die Hardware der CPU und der Virtual-8086-Monitor eine so genannte virtuelle Maschine. Bei einem System mit Multitasking-Unterstützung, kann das System für jeden Task eine eigene virtuelle Maschine bilden. Da die virtuellen Maschinen ständig für kurze Zeit bedient werden, findet Multitasking statt. Damit können beispielsweise ein Compiler, der Drucker-Spooler und ein Editor parallel arbeiten. Windows 9x/NT und OS/2 machen sich solche virtuellen Maschinen auf der Basis des Virtual Modes zu Nutze, um Real-Mode-Programme in der DOS-Box parallel zu den richtigen Protected-Mode-Anwendungen ablaufen zu lassen. Der Virtual-8086-Monitor ist ein Systemprogramm (typischerweise ein Teil des BetriebssystemKernels), das zur Erzeugung und Verwaltung der virtuellen 8086-Tasks dient (engl. to monitor, dt. überwachen). Dabei stellt die Hardware der CPU über ein TSS einen Satz virtueller Register sowie einen virtuellen Speicherbereich entsprechend dem ersten MByte des linearen Adressraums des Tasks zur Verfügung. Außerdem führt der Prozessor die Befehle aus, die diese Register und den Adressraum des Tasks betreffen. Aufgabe des Virtual-8086-Monitors ist es, die Schnittstellen der virtuellen Maschine bzw. des virtuellen 8086-Tasks nach außen hin zu überwachen. Die Schnittstellen werden von Interrupts, Exceptions und den I/O-Anweisungen gebildet, sie übernehmen also die Aufgabe der physikalischen Schnittstellen (z.B. Steuerregister) in einem gewöhnlichen 8086-PC. Der Monitor stellt sicher, dass sich die virtuelle 8086-Maschine als eigenständiger Task in das weit umfangreichere 32-Bit-System im Protected Mode einfügt, ohne andere Tasks oder möglicherweise sogar das Betriebssystem selbst zu stören.
Sandini Bib Programmierung und Betriebsarten
6.9.2
193
Adressen im Virtual-8086-Mode
Auf den ersten Blick besteht der wesentlichste Unterschied zwischen Real und Protected Mode in der Art der Adressberechnung. Im Real Mode wird einfach der Wert des Segmentregisters mit 16 multipliziert. Im Protected Mode dient das Segmentregister dagegen als Index in eine Tabelle, in der die »richtigen« Adressen der Segmente stehen. Dadurch ist es z.B. völlig unmöglich, aus einem Segment- und Offsetregisterwert unmittelbar auf die lineare Adresse des Objekts zu schließen. Genau dies praktizieren jedoch viele alte Real-Mode-Programme, eine ordnungsgemäße Ausführung im Protected Mode ist dadurch unmöglich. Soll der 32-Bit-Prozessor nun im Virtual Mode die Ausführung von 8086-Programmen ermöglichen, so muss er die Adresse wie der 8086 im Real Mode berechnen. Im Virtual-8086-Mode erzeugt der Prozessor also die Adresse, indem er den Wert des Segmentregisters mit 16 multipliziert und den Offset hinzuaddiert. Beachten Sie, dass der 80386 32-Bit-Offsetregister kennt, der 8086 dagegen nicht. Virtuelle 8086-Tasks können daher durch das Address-Override-Präfix lineare 32-Bit-Adressen erzeugen. Übersteigt der Wert eines 80386-Offsetregisters im Virtual Mode den Wert 65.535 oder ffffh, so löst die CPU eine Pseudo-Protection-Exception 0ch oder 0dh aus, ohne einen Fehlercode anzugeben. Die Kombination eines Segments ffffh und eines Offsets ffffh führt wie im gewöhnlichen Real Mode zu einer Adresse 10ffefh. Auch im Virtual Mode wird also die 1 MByte-Grenze um knapp 64 KByte durchbrochen.
6.9.3
Einstieg in den und Ausstieg aus dem Virtual-8086-Mode
Der Prozessor wird in den Virtual Mode versetzt, wenn das Flag VM (Virtual Mode) im EFlagRegister gesetzt wird. Das ist nur durch Codes mit Privilegierungsstufe 0, einen Task Switch mit Hilfe eines 80386-TSS oder eines IRET-Befehls, der die EFlags mit gesetztem VM-Bit vom Stack holt, möglich. Beachten Sie, dass der Prozessor dazu bereits im Protected Mode arbeiten muss. Ein direkter Einstieg vom Real in den Virtual-8086-Mode ist nicht möglich. Ein Task Switch lädt die EFlags automatisch aus dem TSS des neu gestarteten Tasks. Dadurch ist es nicht notwendig, dass das Betriebssystem von sich aus bei jedem Task Switch entscheidet, ob der neu gestartete Task im Protected oder Virtual-8086-Mode ausgeführt werden soll. Vielmehr nimmt das TSS dem Betriebssystem diese Entscheidung ab, es muss nur beim Erstellen des TSS für den Task einmal über den EFlag-Eintrag festlegen, ob der Task dann immer im Virtual-8086-Mode ausgeführt wird. Ein 80286 TSS kann durch die Beschränkung des Flag-Eintrags auf 16 Bit das höherwertige Wort im EFlag-Register, in dem sich das VM-Flag befindet, dagegen nicht verändern. Umgekehrt verlässt der Prozessor den Virtual Mode, wenn das VM-Flag gelöscht wird. Gelöscht wird das VM-Flag durch ein 80386 TSS oder einen Interrupt bzw. eine Exception, die ein Trapoder Interrupt Gate aufruft. Die CPU kehrt dann in den gewöhnlichen Protected Mode zurück, um andere (Protected Mode) Tasks auszuführen. In Abbildung 6.23 ist dies genauer dargestellt. Im Virtual Mode stehen alle 8086-Register, ihre Erweiterungen auf 32 Bit (durch das vorangestellte E) und zusätzlich die spezifisch mit dem 80386 eingeführten Register wie FS, GS, Debug-Register etc. zur Verfügung. Außerdem können auch die mit dem 80186, 80286 und 80386 eingeführten Befehle wie BOUND, LSS etc. benutzt werden. Den Virtual-8086-Mode könnte man ihn also eher als ein Virtual-i386-Real Mode bezeichnen.
Sandini Bib 194
Kapitel 6
System (CPL=0...2)
Anwendungen
IRET mit
Virtual-8086Monitor
VM=1
Interrupt/Exception
mit
VM=0
8086-Programm (Virtual-8086-Mode)
Task-Switch mit VM=1
i386Multitasking-fähiges BetriebsBetriebssystem system
Task-Switch
(CPL=3)
mit
Task-Switch mit VM=0
VM=0
32-Bit Programm i386-Programm (Protected-Mode) (Protected-Mode) Task-Switch
mit
VM=0
Abb. 6.23: Einstieg und Ausstieg beim Virtual-8086-Mode
6.9.4
Tasks im Virtual-8086-Mode
Das 8086-Programm selbst (Real Mode), der Virtual-8086-Monitor (Protected Mode) und die Betriebssystemfunktionen für das 8086-Programm (Real oder Protected Mode) bilden zusammen einen Virtual-8086-Task, der durch ein 80386-TSS dargestellt wird. Dadurch kann der Virtual8086-Task wie ein anderer, speziell für den Protected Mode konzipierter Task durch einen Task Switch mittels des TSS’ aufgerufen werden. Es findet demnach Multitasking mit einem bisher nicht multitasking-fähigen Programm statt, denn das 8086-Programm kann in die MultitaskingUmgebung eingebettet werden. Der Virtual-8086-Monitor läuft im Protected Mode mit der Privilegierungsstufe 0 und weist Routinen auf, um das 8086-Programm zu laden und Interrupts und Exceptions zu behandeln. Demgegenüber läuft das »eigentliche« 8086-Programm mit einer Privilegierungsstufe CPL=3. Wie beim Real Mode sind im Virtual Mode die ersten 10fff0h Byte des linearen Adressraums vom Prozessor (von 4 GByte gleich 100 000 000h) durch das 8086-Programm belegt. An dieser Stelle möchte ich erwähnen, dass der Paging-Mechanismus auch im Virtual-8086-Mode die lineare auf eine völlig andere physikalische Adresse abbildet und dadurch viele lineare Adressräume 0000:0000h bis 1000:fff0h erzeugen kann. Adressen außerhalb dieses Bereiches kann das 8086Programm nicht bilden, sodass die Adressen über 10ffefh für den Virtual-8086-Monitor, das 32Bit-Betriebssystem und andere Software zur Verfügung stehen. Für einen Virtual-8086-Task fehlen nun noch die Betriebssystemfunktionen des 8086-Betriebssystems (beispielsweise MS-DOS). Für deren Implementierung gibt es prinzipiell zwei Möglichkeiten:
: :
Das 8086-Betriebssystem läuft als Teil des 8086-Programms, d.h. das 8086-Programm und MS-DOS bilden eine Einheit. Damit sind automatisch alle benötigten Betriebssystemfunktionen vorhanden. Das 8086-Betriebssystem wird vom Betriebssystem emuliert oder ist schon als Teil in diesem implementiert, wie es etwa bei Windows 9x der Fall ist.
Der Vorteil der ersten Möglichkeit besteht darin, dass das bisherige Real-Mode-Betriebssystem nahezu unverändert übernommen werden kann. Jeder Virtual-8086-Task besitzt seine eigene und exklusiv für ihn reservierte Kopie von MS-DOS oder einem anderen Real-Mode-Betriebssys-
Sandini Bib Programmierung und Betriebsarten
195
tem. Damit können in einem 32-Bit-Prozessor gleichzeitig mehrere verschiedene Betriebssysteme laufen: das alles überwachende Betriebssystem für die Protected-Mode-Programme sowie die verschiedenen 8086-Betriebssysteme für die 8086-Programme im Virtual-8086-Mode. Es gibt aber ein gravierendes Problem: Die Betriebssystemfunktionen von MS-DOS und anderen Systemen werden über Interrupts aufgerufen, Interrupt Handler aber sind höchst kritische Bereiche eines Betriebssystems, das im Protected Mode arbeitet. Wie das Problem gelöst wird, erfahren Sie im weiteren Verlauf des Kapitels. Sollen mehrere Virtual-8086-Tasks parallel ablaufen, so ist deren Koordination einfacher, wenn man von der zweiten Möglichkeit Gebrauch macht. In diesem Fall wird das Real-Mode-Betriebssystem der 8086-Tasks meist durch Aufrufe des 32-Bit-Betriebssystems emuliert. Im Protected Mode reagieren die I/O-Befehle auf den Wert des IOPL-Flags. Ein zu großer Wert von CPL gegenüber IOPL führt zu einer Exception. Im Virtual Mode sind diese I/O-Befehle demgegenüber aber nicht vom IOPL-Flag abhängig – der Schutz des I/O-Bereiches erfolgt allein über die I/O-Permission-Bit-Map. Stattdessen reagieren nun die Befehle PUSHF, POPF, INTn, IRET, CLI und STI auf den Wert von IOPL, da ja die Befehle PUSHF, POPF, CLI und STI Flags verändern können. Die Veränderung der Flags ist in einer 32-Bit-Umgebung alleinige Aufgabe des Virtual8086-Monitors oder des Betriebssystems und nicht des antiquierten und untergeordneten MSDOS-Programms. Durch die Abhängigkeit der Befehle INTn und IRET von IOPL hat der Virtual-8086-Monitor die Möglichkeit, Betriebssystemaufrufe des 8086-Programmes via Interrupts abzufangen. Ist der Wert von IOPL kleiner als 3, dem CPL des 8086-Programms also, so fängt der Monitor den Interrupt ab. Ist das 8086-Betriebssystem Teil des 8086-Programms, so gibt der Monitor den Interrupt an dieses weiter, wobei deren Aufruf und Ergebnis ggf. an die 32-Bit-Umgebung angepasst werden. Ansonsten kann der Monitor die betreffende Funktion des 8086-Betriebssystems direkt emulieren. Beachten Sie aber, dass die Interrupts im Real und Protected Mode sehr verschieden aussehen. Da das 8086-Programm für einen 8086-Prozessor (oder eine andere CPU im Real Mode) geschrieben worden ist, besitzt der Virtual-8086-Task eine Interrupt-Vektortabelle im Real-Mode-Format CS:IP. Sie beginnt bei der linearen Adresse 0h und ist 1 KByte groß. Der 80386 verwendet aber im Virtual8086-Mode diese Tabelle nicht direkt, sondern ruft bei einem INT-Befehl des 8086-Programms erst den entsprechenden Betriebssystem-Handler über die IDT auf. Er verlässt also den Virtual-8086Mode. Den Ablauf eines Interrupts im Virtual-8086-Mode sehen Sie in Abbildung 6.24. Wie normalerweise bei einem Interrupt auch, legt der Prozessor die EFlags auf dem Stack ab. So kann der aufgerufene Handler anhand der abgelegten Flags erkennen, ob vorher das VM-Flag gesetzt worden war, d.h. ob der Interrupt einen Virtual-8086-Task unterbrochen hat. War VM gesetzt, überträgt der Interrupt Handler die Steuerung an den Virtual-8086-Monitor. Dieser kann nun wiederum den Interrupt selbst behandeln oder die Steuerung nochmals weitergeben, nämlich an den Interrupt-Handler des 8086-Programms. Dazu untersucht er die Interrupt-Vektortabelle des unterbrochenen 8086-Tasks, um den Einsprungpunkt des Real Mode Interrupt Handlers zu ermitteln. Durch ein IRET (mit der Privilegierungsstufe PL=0 des Monitors) schaltet der Prozessor wieder in den Virtual-8086-Mode um und ruft diesen Handler auf. Nach Abarbeitung des Real-Mode-Interrupt-Handlers führt der abschließende IRET-Befehl des Real-Mode-Handler erneut zum Virtual-8086-Monitor.
Sandini Bib 196
Kapitel 6
System (CPL=0...2)
1 Exception "allgemeiner Protection-Fehler"
Virtual-8086Monitor i386-BSFunktionsaufruf
Virtual-8086-Anwendung (CPL=3)
8086-Programm (Virtual-8086-Mode)
2
i386Betriebssystem
4
3
i386-BS-Routine
Rückkehr zum 8086-Betriebssystem
Rückkehr zum 8086Programm
8086-Betriebssystem (Virtual-8086-Mode)
i386-BS-Routine i386-BS-Routine
(a) 8086-Betriebssystem ist Teil des 8086-Programms
System (CPL=0...2)
1 Exception "allgemeiner Protection-Fehler"
Virtual-8086Monitor
4
8086Betriebssystem
2
interner Aufruf von i386BS-Routinen
Virtual-8086-Anwendung (CPL=3)
8086-Programm (Virtual-8086-Mode)
hr zum Rückke gramm ro -P 8086
3
i386-BS-Routine i386-BS-Routine
(b) 8086-Betriebssystem wird vom Virtual-8086-Monitor emuliert Abb. 6.24: Ablauf eines Interrupts im Virtual-8086-Mode
Nachdem dieser die Stacks für den Rücksprung angeglichen hat, führt er einen weiteren IRET aus. Damit setzt der Prozessor das vom Interrupt unterbrochene Programm fort. Der Interrupt ist hier über den Umweg IDT-Monitor-Handler vom Real-Mode-Handler des 8086-Tasks bedient worden. Wie Sie unschwer erkennen können, gibt ein Interrupt Anlass zu einer recht umfangreichen und dadurch auch langwierigen Prozedur. Ab dem Pentium ist der Vorgang optimiert worden, worauf ich im entsprechenden Kapitel noch näher eingehe. Viele MS-DOS-Programme setzen und löschen das Interrupt-Flag IE, um die Bedienung von Hardware-Interrupts in kritischen Codeabschnitten zu steuern. Einen solchen Eingriff kann das 32-Bit-Betriebssystem, das für die gesamte Maschine verantwortlich ist, natürlich nicht dulden. Im Virtual-8086-Mode sind daher auch die Befehle PUSHF, POPF, CLI und STI von IOPL abhängig, weil sie direkt (CLI, STI) oder indirekt (PUSHF, POPF) das IE-Flag verändern können. Der Virtual-
Sandini Bib Programmierung und Betriebsarten
197
8086-Monitor fängt solche, die Reaktion des gesamten Systems beeinflussenden, Befehle ab und verarbeitet sie in einer Weise, die das 32-Bit-System nicht nachteilig beeinflussen. Der Eingriff des Monitors bezüglich der von IOPL abhängigen Befehle für das 8086-Programm aber ist völlig transparent: Das 8086-Programm hat den Eindruck, als ob diese Befehle in der gewohnten Weise ausgeführt würden. Einen weiteren für Multitasking-Systeme kritischen Bereich bilden die I/O-Ports, da mit ihrer Hilfe auf die Register der Hardware-Komponenten zugegriffen werden kann. Auch da kann es das Betriebssystem nicht dulden, vom 8086-Programm umgangen zu werden. Viele Real-ModeProgramme greifen nun aber direkt auf I/O-Ports zu – während in Multitasking-Systemen die meisten Programme nur über den Umweg des Betriebssystems, das die Zugriffe koordiniert, auf I/O-Ports zugreifen dürfen. Ein fehlerhafter Task soll ja schließlich nicht auch noch andere Tasks in Mitleidenschaft ziehen. Im Virtual Mode wird dieses Problem gelöst, indem die kritischen Ports durch die I/O Permission Bit Map geschützt werden, nicht aber durch das IOPL-Flag. Damit kann der Virtual-8086-Monitor dem 8086-Programm einerseits erlauben, direkt auf unkritische I/O-Ports zuzugreifen. Wenn z.B. ein 8086-Programm gezielt eine Steckkarte für die Steuerung eines Roboters programmiert, deren Register von keinem anderen Programm benutzt werden, tritt für diese Ports niemals ein Konflikt auf – der Umweg über das Betriebssystem dagegen würde nur zu Verzögerungen führen, aber keinerlei Vorteil bringen. Andererseits werden dadurch kritische Ports wie beispielsweise die Register des Festplattencontrollers geschützt. Der Virtual-8086-Monitor fängt solche Zugriffe ab und behandelt sie in einer Weise, dass sie die anderen Tasks des Systems nicht stören.
Sandini Bib
Sandini Bib
7 Schnell zwischengespeichert – Caching Ab PC mit einer 80386-CPU und einer Taktfrequenz von 25 MHz ist zusätzlich zum Hauptspeicher ein Zwischenspeicher zu finden, denn die »normalen« DRAMs sind im Verhältnis zur CPU-Taktfrequenz zu langsam, wodurch die CPU in zusätzlichen Wartezyklen verweilen muss, um auf die Daten aus dem DRAM zu warten. Aus diesem Grunde wird quasi zwischen dem DRAM und der CPU ein schneller statischer Speicher (SRAM) realisiert, der unter der Bezeichnung Cache bekannt ist. Die Steigerung der Prozessorleistung von einer Generation zur nächsten ist vielfach nur einem vergrößerten Cache zu verdanken und eher weniger anderen neuen Features, die bei der Programmierung entsprechend eingesetzt werden müssen, damit sie »Früchte tragen«, was aber oftmals unterbleibt, wie es beispielsweise bei der mangelhaften MMX-Unterstützung von MultimediaBefehlen (MMX, 3DNOW!, ISSE) bei aktuellen Programmen der Fall ist.
7.1 Cache-Prinzip und Cache-Strategien Beim Caching versucht man, die Vorteile von schnellen SRAMs und billigen DRAMs zu kombinieren, um ein möglichst effektives Speichersystem zu erreichen. In Abbildung 7.1 sehen Sie das Cache-Prinzip. SRAM-Cache
DRAMHauptspeicher
CPU Cache Controller Abb. 7.1: Zwischen CPU und dem Hauptspeicher-DRAM ist ein schneller Cache-SRAM geschaltet, der die häufig benutzten Daten zwischenspeichert und der CPU sehr schnell zur Verfügung stellt. Gesteuert wird der Vorgang durch einen Cache-Controller, der verschiedene Schreibstrategien, wie z.B. Write-Through oder WriteBack, implementieren kann.
Zwischen die CPU und den Hauptspeicher wird eine Cache-Einheit geschaltet, die aus einem Cache-Controller und einem Cache-SRAM besteht. Sie können auf demselben Chip wie die CPU gebildet sein (On-Chip-Cache) oder als externe Bausteine vorliegen. Es gibt auch Mischformen (z.B. beim 386SL), wo der Cache-Controller auf dem CPU-Chip vorhanden ist, der eigentliche Cache-Speicher aber durch externe SRAM-Chips gebildet werden muss. Der Cache-Speicher ist mit typischerweise 128 KByte bis 512 KByte relativ klein gegen die Kapazität des Hauptspeichers. Weil die meisten aufeinanderfolgenden Speicherzugriffe einen relativ kleinen Adressbereich betreffen, werden die häufig angesprochenen Daten in einem kleinen Hochgeschwindigkeitsspeicher bereitgehalten – man hat hier also den Vorteil einer sehr kleinen Zugriffszeit, die summiert
Sandini Bib 200
Kapitel 7
über die vielen eng benachbarten Speicherzugriffe eine erhebliche Geschwindigkeitssteigerung bringt. Der Großteil der Daten wird nur selten hintereinander angesprochen. Es ist also möglich, den Löwenanteil im langsamen Hauptspeicher abzulegen, ohne die Arbeitsgeschwindigkeit stark zu verringern. Das Cache-Prinzip mit einem kleinen Hochgeschwindigkeitsspeicher und einem großen, aber langsamen Hauptspeicher vereinigt also die Vorteile beider Speicher, ohne dass die Kosten explodieren. Wenn die CPU Daten liest, gibt sie wie gewöhnlich die entsprechende Speicheradresse aus. Hier ist aber der Cache-Controller zwischen den Prozessor und den Hauptspeicher geschaltet. Er ermittelt, ob die gesuchten Daten im Cache SRAM vorliegen. Ist das der Fall, so spricht man von einem Cache-Hit oder einem Cache-Treffer. Sind die Daten dagegen nur im Hauptspeicher vorhanden, bezeichnet man das als Cache-Miss oder Cache-Fehltreffer. Im ersten Fall liest der Cache-Controller die Daten aus dem schnellen Cache-Speicher und gibt sie an die CPU weiter. Das geschieht normalerweise ohne Wait State, d.h. mit maximaler Busgeschwindigkeit. Der Lesezugriff wird vom Cache vollkommen abgefangen, der Hauptspeicher merkt davon nichts. Tritt dagegen ein Cache-Miss auf, muss der Cache-Controller die Daten zuerst aus dem Hauptspeicher lesen, also den Lesezugriff zum Hauptspeicher durchschalten. Weil das gewöhnlich länger dauert und dazu mehr oder weniger Wait States notwendig sind, deaktiviert der Cache-Controller das Ready- (oder ein äquivalentes) Signal, sodass die CPU Wartezyklen einlegt. Gleichzeitig adressiert der Cache-Controller den Hauptspeicher. Die interne Organisation der meisten Caches verlangt, dass bei einem Cache-Miss nicht nur die angeforderten Datenbytes, sondern eine vollständige Cache-Line aus dem Hauptspeicher in den Cache-SRAM gelesen werden. Dieser Vorgang wird als Cache-Line Fill bezeichnet. Dazu müssen aber möglicherweise auch veränderte Daten zunächst im Hauptspeicher abgelegt werden, bevor die neuen Daten der Cache-Line in den Cache-SRAM gelesen werden können. Der Cache-Controller ist intelligent genug, um selbstständig Buszyklen zum Schreiben und Lesen von Daten in den bzw. aus dem Hauptspeicher auszuführen. Die von der CPU adressierten Datenbytes werden vom Cache-Controller sofort an die CPU weitergegeben, d.h. bevor die Übertragung der ganzen Cache-Line abgeschlossen ist. Cache-Lines sind typischerweise 16 oder 32 Byte groß. Der Grund dafür ist, dass die Daten und Programmcodes wie bereits erwähnt zur Blockbildung neigen und es dadurch sehr wahrscheinlich ist, dass der nächste Zugriff auf einen Wert innerhalb einer solchen Cache-Line stattfindet. Das erhöht die Trefferwahrscheinlichkeit. Außerdem implementieren die meisten Cache-Controller einen so genannten Burst- oder Blockmodus, durch den ein ganzer Datenblock gelesen wird, der mehr Bytes umfasst, als der Datenbus breit ist (wodurch mehrere aufeinanderfolgende Buszyklen notwendig sind, um den ganzen Block zu lesen). Der Blockmodus verdoppelt die Transferrate auf dem Bus fast, sodass eine komplette Cache-Line viel schneller gelesen werden kann als einzelne Werte. Die Organisation der Caches in Cache-Lines verbessert also die Systemleistung. Schreibt die CPU umgekehrt Daten, so ermittelt der Cache-Controller, ob sich die Daten auch im Cache-SRAM befinden. Ist das der Fall, werden die Daten von der CPU in den Cache-SRAM geschrieben. Für die weitere Vorgehensweise des Cache-Controllers gibt es nun drei verschiedene Strategien: Write-Through, Write-Back (auch als Copy-Back bezeichnet) und Write-Allocate. Die ersten beiden Strategien betreffen einen Cache-Hit, die letzte einen Cache-Fehltreffer. Der einfachste Fall ist die Write-Through-Strategie, wie sie standardmäßig bis hin zu den 486CPUs zum Einsatz kommt. Ein Schreibvorgang der CPU führt hier selbst bei einem Cache-Hit stets zu einer Übertragung der Daten zum Hauptspeicher; alle Schreibvorgänge werden also
Sandini Bib Schnell zwischengespeichert – Caching
201
zum Hauptspeicher durchgeschaltet. Natürlich wird auch der entsprechende Eintrag im Cache beschrieben und damit aktualisiert. Write-Through hat den Nachteil, dass eben alle Schreibvorgänge zum relativ langsamen Hauptspeicher durchgeschaltet werden müssen. Ohne weitere Maßnahmen würde man den Cache für Schreibvorgänge praktisch ausschalten und eine unvertretbar lange Schreibzugriffszeit wäre die Folge. Write-Through-Caches besitzen daher einen schnellen Schreibpuffer, der die Schreibzugriffe abpuffert. Das geht aber in Abhängigkeit von seiner Dimensionierung nur so lange, bis der Puffer voll ist. Viele aufeinander folgende Schreibzugriffe führen also unweigerlich zu Wartezyklen. Andererseits sorgt die Write-Through-Strategie in einem Multiprozessorsystem automatisch für eine Hauptspeicherkonsistenz, weil alle Aktualisierungen zum Hauptspeicher durchgeschaltet werden. Dagegen ist die Cache-Kohärenz in einem Multiprozessorsystem nicht sichergestellt. Es ist möglich, dass eine andere CPU den Hauptspeicher überschreibt; der Cache eines anderen Prozessors erfährt davon aber nichts. Erst ein Inquire-Zyklus stellt die Kohärenz wieder her. Ein Write-Back Cache sammelt praktisch alle Schreibvorgänge und aktualisiert nur die Einträge des Caches, nicht aber den Inhalt des Hauptspeichers. Erst nach einer entsprechenden Anweisung wird eine veränderte Cache-Line in den Hauptspeicher kopiert, um dort die Daten zu aktualisieren. Die Anweisung kann durch Software ausgelöst werden, beim Pentium z.B. durch den Befehl WBINVD (Write Back and Invalidate Data Cache), über ein Hardware-Signal, wie z.B. FLUSH, implizit als Folge eines Cache-Fehltreffers, wenn eine Cache-Line durch eine andere ersetzt wird (siehe unten), oder durch einen internen oder externen Abfragezyklus. Der Nachteil des Write-Back Caches ist, dass die Ersetzung einer Cache-Line länger dauert, weil die Daten zuerst in den Speicher geschrieben werden müssen, bevor die neuen in den Cache gelesen werden können. Normalerweise wird dieser Nachteil aber dadurch mehr als aufgewogen, dass mehrere vorherige Schreibzugriffe nicht auf den relativ langsamen Hauptspeicher durchgeschaltet werden mussten. Die beiden beschriebenen Cache-Strategien klären aber noch nicht das Verhalten, wenn in einem Schreibvorgang ein Fehltreffer auftritt, d.h. die zu beschreibende Adresse nicht im Cache vorliegt. Implementiert der Cache eine Write-Allocate-Strategie, dann belegt der Cache-Controller im Cache einen Platz für die Cache-Line, die die zu schreibende Adresse enthält. Üblicherweise werden die Daten zunächst in den Hauptspeicher durchgeschrieben; anschließend liest der Cache-Controller die zugehörige Cache-Line mit dem so aktualisierten Eintrag in den Cache ein. Weil die Daten zunächst durchgeschrieben werden, kann sich die CPU sofort wieder der Programmausführung widmen. Der Cache-Controller führt das Write Allocate selbstständig und parallel zum CPU-Betrieb aus. Schlimmstenfalls muss er dazu eine veränderte Cache-Line zuerst in den Hauptspeicher schreiben, bevor er sie für die neuen Daten benutzen kann. Aus diesem Grund und wegen der deutlich komplizierteren Cache-Implementierung verwenden die meisten Caches aber keine Write-Allocate-Strategie. Schreibzugriffe, die zu einem Cache-Fehltreffer führen, werden einfach zum Hauptspeicher durchgeschaltet und werden vom Cache ignoriert. Wenn auch andere Systembausteine Zugriff auf den Hauptspeicher haben, wie es z.B. bei DMA der Fall ist, und den Hauptspeicherinhalt überschreiben können, muss der Cache-Controller denjenigen SRAM-Inhalt für ungültig erklären, dessen Pendant im Hauptspeicher verändert worden ist. Man bezeichnet das als Cache-Invalidation. Benutzt der Cache-Controller keine WriteThrough-Strategie, sondern schreibt er Daten von der CPU bei einem Cache-Hit nur in den Cache-SRAM, muss der Cache-Inhalt unter bestimmten Umständen in den Hauptspeicher übertragen werden, z.B. wenn ein DMA-Chip Daten aus dem Hauptspeicher zu einer Peripherieeinheit übertragen soll, die mit ihrem aktuellen Wert nur im SRAM vorliegen. Man bezeichnet diesen Vorgang als Cache Flush oder Cache-Leerung.
Sandini Bib 202
Kapitel 7
Ähnliche Eigenschaften besitzen auch Software-Caches, von denen Ihr PC mit Sicherheit mehrere aufweist. DOS verwendet beispielsweise interne Puffer für Disketten- und Festplattenzugriffe, deren Zahl Sie mit dem CONFIG.SYS-Befehl BUFFERS einstellen können. Diese Puffer wirken als Cache zwischen CPU, Hauptspeicher und dem Disketten- oder Festplattencontroller. Sie verwenden keine Write-Through-Strategie, sodass bei einem Systemabsturz möglicherweise noch geschriebene Daten im Puffer vorliegen, die nicht auf die Festplatte übertragen worden sind. Erst wenn Sie die betreffende Datei schließen oder der Puffer anderweitig benötigt wird, schreibt DOS den Pufferinhalt auch auf das Speichermedium. Mit den Funktionen 0dh, 5d01h und 68h des INT 21h können Sie DOS aber zwingen, ein Puffer-Flush auszuführen. Die meisten SoftwareCaches für Festplatten, wie z.B. ältere Versionen von SMARTDRV, die einen Cache für Festplattenzugriffe im Hauptspeicher emulieren, verwenden dagegen eine Write-Through-Strategie. Dadurch werden alle Schreibvorgänge an die Platte weitergeleitet, ein Lesezugriff spricht aber nur die Kopie im Hauptspeicher an.
7.2 Cache-Organisation und Assoziativspeicher In diesem Abschnitt möchte ich Ihnen verschiedene Cache-Organisationen und die damit zusammenhängenden Begriffe wie z.B. Direct Mapped, 4-Wege, Tag und Assoziativspeicher erläutern. Beschreiben lassen sich diese Dinge am besten anhand eines Beispiels, ich möchte zu diesem Zweck annehmen, dass der Cache für einen 80386 konstruiert ist, eine Größe von 16 KByte aufweist und eine Cache-Line 16 Byte umfasst. Der Cache-Controller teilt intern die 32-Bit-Adresse vom Prozessor in eine 20-Bit-Tag-Adresse A31–A12, eine 8-Bit-Set-Adresse A11–A4 und eine 2-Bit-Doppelwortadresse A3–A2 auf (entsprechend einer 4-Bit-Byteadresse) auf (Abbildung 7.2). Ein Cache-Eintrag besteht aus einem CacheDirectory-Eintrag und dem zugehörigen Cache-Speichereintrag. Das Cache-Directory enthält Informationen, welche Daten im Cache gespeichert sind, die eigentlichen Daten sind in den CacheSpeichereinträgen abgelegt. Das Cache-Directory kann intern im Cache-Controller oder in einem externen SRAM gespeichert sein. Cache-Systeme benötigen daher meistens mehr SRAM-Chips, als das nach ihrer Speicherkapazität eigentlich notwendig wäre. Ursache dafür ist, dass ein oder mehrere SRAM-Chips das Cache-Directory aufnehmen müssen, während die anderen die eigentlichen Daten speichern. Ein Cache-Directory-Eintrag umfasst für den 4-Wege-Cache pro Weg eine 20-BitTag-Adresse sowie typischerweise ein Schreibschutzbit, ein Valid-Bit und drei LRU-Bits (für LastRecently Used, d.h. zuletzt benutzt), die aber gemeinsam für alle Wege des Caches gebildet sind. Der Cache-Speichereintrag, d.h. die zugehörige Cache-Line, ist nach der Voraussetzung 16 Byte groß, weist also vier Doppelworte zu je 32 Bit (der Breite des Datenbusses) auf. Im Folgenden möchte ich Ihnen die wichtigsten Begriffe kurz erläutern. Tag Das Tag ist ein Speicherelement im Cache-Directory, mit dem der Controller bestimmt, ob ein Cache-Hit oder ein Cache-Miss vorliegt. Das Tag speichert die Tag-Adresse, nämlich die Adressbits A31–A12 der zugeordneten Cache-Line (Cache-Speichereintrags). Nur bei einem gesetzten Valid-Bit ist die Tag-Adresse auch gültig, ansonsten enthält sie oder die Cache-Line ungültige Werte. Nach einem Cache-Flush werden die Valid-Bits aller Cache-Lines gelöscht und dadurch alle Einträge als ungültig gekennzeichnet. Bei gesetztem Schreibschutzbit kann die zugeordnete Cache-Line nicht beschrieben werden. Das ist z.B. notwendig, damit ein Cache-Line-Fill ungestört ablaufen kann und der Cache-Line-Fill-Zyklus nicht Daten überschreibt, die von der CPU aktualisiert worden sind, bevor sich die Cache-Line vollständig im SRAM befunden hat.
Sandini Bib Schnell zwischengespeichert – Caching
203
32-Bit-Speicheradresse A16 A15
A31
A4 A3
A12A11
Tag-Adresse
Cache-Speichereintrag LRU
Adresse 20Bit-Tag-Adresse
Byte-Adr.
Set-Adresse
Cache-Directory-Eintrag
A0
Daten
3 Bits DW
1 Schreibschutzbit 1 Bit "gültig"
Daten
Daten
Daten
16Byte-Cache-Line DW DW
DW
Cache-Directory
Set 249 Set Set Set Set Set Set
1 1
20 Bits
TagAdresse
1 1
20 Bits
LRU
TagAdresse
Schreibschutz Tag gültig
20 Bits
Set 247 Set 248
TagAdresse
Weg 3
Schreibschutz Tag gültig
TagAdresse
Weg 2
Schreibschutz Tag gültig
Set-Adresse A4-A11
. . . .
Weg 1
Schreibschutz Tag gültig
Weg 0 Set 0 Set 1
1 1
20 Bits
1 1
3 Bits
250 251 252 253 254 255
Abb. 7.2: Speicheradresse, Cache-Eintrag und 4-Wege-Cache-Directory
Set Jedes Tag und die zugeordnete Cache-Line sind Elemente eines Sets. Die 8-Bit-Set-Adresse A11–A4 bestimmt das gewünschte aus 256 möglichen Sets. Ein Set setzt sich also im Prinzip aus einem Cache-Directory-Eintrag und dem zugehörigen Cache-Speichereintrag für jeden Weg zusammen. Weg Der Begriff Weg (oder auch engl. way) gibt die Assoziativität des Cache-Systems an. Für eine gegebene Set-Adresse werden die Tag-Adressen aller Wege gleichzeitig mit dem Tag-Anteil der von der CPU ausgegebenen Adresse verglichen, um einen Cache-Treffer oder einen Cache-Fehltreffer festzustellen. Im Beispiel ist ein 4-Wege set-assoziativer Cache angegeben, d.h. er weist vier Wege auf. Dadurch kann eine Datengruppe, die einer Cache-Line entspricht, an vier verschiedenen Stellen im Cache gespeichert werden. Jeder Weg im Beispiel-Cache umfasst 256 Sets mit einer Cache-Line-Größe von jeweils 16 Byte. Das ergibt nach der Formel Kapazität gleich Wege mal Sets mal Cache-Line-Größe gerade die 16 KByte-Cache-Speicher. Einem Set-Eintrag für die vier Wege ist zusammen ein LRU-Eintrag zu drei Bits zugeordnet, den der Cache-Controller zur Bestimmung derjenigen der beiden Cache-Lines verwendet, die bei einem Cache-Miss ersetzt werden soll. Dazu gibt es verschiedene Algorithmen.
Sandini Bib 204
Kapitel 7
Beachten Sie in diesem Zusammenhang, dass die Speicheradresse in Abbildung 7.2 (oben) keinen Eintrag für den Weg enthält. Mit dem Weg kommt die Assoziativität ins Spiel. Ein Direct Mapped Cache hat nur einen Weg, ist also nicht assoziativ; eine Datengruppe kann – wenn sie überhaupt im Cache zwischengespeichert ist – entsprechend den zwölf niederwertigen Adressbits nur an einer Stelle im Cache abgelegt werden. Beispielsweise werden die Daten entsprechend der binären Adresse xxxx xxxx xxxx xxxx xxxx ssss ssss xxxxb stets im Set ssss ssss abgelegt. Der dort vorher gespeicherte Eintrag muss durch den neuen ersetzt werden. In einem 4-Wege set-assoziativen Cache werden die Daten entsprechend der binären Adresse xxxx xxxx xxxx xxxx xxxx ssss ssss xxxxb zwar ebenfalls stets im Set ssss ssss abgelegt. Weil für jedes Set hier aber vier Wege zur Verfügung stehen, ist es nicht unbedingt notwendig, den vorherigen Eintrag zu überschreiben. Wenn die Cache-Line eines anderen Weges frei ist, kann der Cache-Controller die Daten im freien Weg ablegen. Das erhöht die Trefferwahrscheinlichkeit des Caches, da vier Einträge für dieselbe SetAdresse vorhanden sind. 8-Wege set-assoziative Caches haben entsprechend eine noch höhere Trefferwahrscheinlichkeit, allerdings steigt der technische Aufwand deutlich an. Die ebenfalls häufig implementierten 2-Wege set-assoziativen Caches weisen dagegen eine deutlich reduzierte Trefferrate auf, der Logikaufwand zur Trefferbestimmung ist aber erheblich geringer und dadurch steigt die Arbeitsgeschwindigkeit an. Sie werden also vor allem bei schnellen Caches verwendet (z.B. für die On-Chip-Caches des Pentiums). Cache-Line Die Cache-Line bildet die »Datenportion«, die als ganzes zwischen Cache und Hauptspeicher ausgetauscht wird. Innerhalb einer Cache-Line wird das Doppelwort für den 32-Bit-Datenbus noch durch die Adressbits A3–A2 angegeben. Eine Cache-Line ist entweder als ganzes gültig oder als ganzes ungültig; teilgültige Cache-Lines gibt es nicht. Selbst wenn die CPU nur ein Byte lesen möchte, müssen alle 16 Byte der betreffenden Cache-Line im Cache-SRAM gespeichert sein, sonst tritt ein Cache-Fehltreffer auf. Die Cache-Lines bilden den eigentlichen Cache-Speicher, das Cache-Directory dient lediglich zu seiner Verwaltung. Cache-Lines umfassen gewöhnlich mehr Daten, als mit einem einzigen Buszyklus übertragen werden können. Daher implementieren die meisten Cache-Controller einen Block- oder Burst-Modus, mit dem durch vorher festgelegte Adressreihenfolgen die Daten schneller über den Bus übertragen werden können. Das ist für Cache-Line-Fills oder das Zurückschreiben von Cache-Lines sehr einfach, weil sie stets einen zusammenhängenden und ausgerichteten Adressbereich darstellen. Assoziativspeicher Im Zusammenhang mit Caches tritt häufig der Begriff Assoziativspeicher auf. Im Englischen bezeichnet man ihn auch als Content Addressable Memory (dt. inhaltsadressierbarer Speicher) oder abgekürzt CAM. Das kennzeichnet bereits sein Arbeitsprinzip. Normalerweise werden Daten in einem Speicher explizit über ihre Adresse angesprochen. Bei einem Assoziativspeicher geschieht das dagegen über einen Teil der im Speicher abgelegten Daten selbst – daher die Bezeichnung CAM. Um Information aus dem CAM zu lesen, wird ein Informationsabschnitt in den Speicher eingegeben, der mit dem entsprechenden Abschnitt der adressierten Daten übereinstimmen soll. Befinden sich Daten im CAM, die an den fraglichen Stellen mit der eingegebenen Adressierungsinformation übereinstimmen, gibt der CAM die gesamte dem Abschnitt zugeordnete Information aus, er »ergänzt« die Teilinformation dadurch mehr oder weniger. Weil der Adressierungsabschnitt nur einen Teil der Information enthält, kann es vorkommen, dass mehrere Informationen »passen« und entsprechend auch ausgegeben werden. Das Ergebnis kann mehrdeutig werden, was bei Assoziationen aber nicht weiter verwundert – Sie selbst assoziieren mit »Meer« ja auch mehrere Dinge, wie z.B. Strand, Freizeit, Schwimmen, Sonnenbrand etc. Ergibt sich keinerlei Übereinstimmung mit gespeicherter Information, dann gibt der CAM keine Daten aus. Auch das
Sandini Bib Schnell zwischengespeichert – Caching
205
ist analog zum richtigen Leben: Eine vernünftige Assoziation zu öavfjnweflkad erscheint zumindest schwierig. Beim Cache wird die Form der Assoziativadressierung nur Set-weise ausgeführt: Die Assoziation erfolgt in den vier Wegen, die Adressierung des Sets aber durch die explizite Angabe der Set-Adresse A4–A11. Der Informationsabschnitt für die Assoziativadressierung ist durch die Tag-Adressen im Set gegeben. Diese Tag-Adressen werden mit der Tag-Adresse A12–A31 von der CPU verglichen. Bei einer Übereinstimmung »assoziiert« der Cache-Controller den gesamten Cache-Eintrag, d.h. die Cache-Line, die zum entsprechenden Weg des Sets mit der korrekten Tag-Adresse gehört. Dazu mehr im folgenden Abschnitt.
7.3 Cache-Treffer-Bestimmung und optimale Cache-Größe In Abbildung 7.3 sehen Sie das Schema für eine Cache-Treffer- oder Cache-Fehltrefferbestimmung im Fall des oben als Beispiel angegebenen 4-Wege set-assoziativen Cache mit 16 KByte Speicherkapazität. %LW$GUHVVEXV 32-Bit-Adreßbus Weg 0 Weg 1 Weg 2 Weg 3
A0-A31
Doppelwortadresse A2-A3
Tag-Adresse A12-A31
Set-Adresse A4-A11 A4-A11
Datenspeicher
Cache-Directory
A4-A11 Set 0: T0-T19 Set 1: T0-T19 ... ... ... Set 254: T0-T19 Set 255: T0-T19
A12-A31
T0-T19
Set 0: D0-D127 Set 1: D0-D127 ... ... ... Set 254: D0-D127 Set 255: D0-D127
Enable 128-Bit-Daten
Tag-Adressenkomparator
Hit/Miss
A2-A3
Datenpuffer
32-Bit-Daten
32-Bit-Datenbus
Abb. 7.3: Die Cache-Trefferbestimmung
Die CPU legt die 32-Bit-Adresse der zu lesenden Daten auf den Adressbus, die vom Cache-Controller übernommen und entsprechend Abbildung 7.3 in Tag-, Set- und Byte-Adresse aufgeteilt wird. Die Tag-Adresse A12–A31 wird sofort zum Tag-Adressenkomparator weitergegeben. Der Controller benutzt die Set-Adresse A4–A11, um im Cache-Directory für jeden Weg 0 bis 3 ein Set auszuwählen und die unter dem Set angegebene Tag-Adresse an den Tag-Adressenkomparator auszugeben. Außerdem benutzt der Cache-Controller die Set-Adresse, um die Cache-Line ent-
Sandini Bib 206
Kapitel 7
sprechend dem angegebenen Set vom SRAM-Datenspeicher in einen 128-Bit-Datenpuffer zu übertragen. Der Datenpuffer wählt über die Doppelwortadresse A2–A3 ein Doppelwort der Cache-Line aus. Der Tag-Adressenkomparator vergleicht – d.h. »assoziiert« – die Tag-Adresse von der CPU mit der Tag-Adresse aus dem Cache-Directory. Stimmen beide überein, dann gibt er ein Enable-Signal an den Datenpuffer aus, damit dieser das betreffende Doppelwort an den 32-Bit-Datenbus übergibt. Sind die beiden Tag-Adressen verschieden, wird die Ausgabe gesperrt und über das Signal Hit/Miss ein Cache-Miss angezeigt. Der Cache-Controller muss dann den Hauptspeicher adressieren, um die Daten an die CPU zu übergeben und ein Cache-Line-Fill zu beginnen. Die beschriebene Auswahl- und Vergleichsoperation wird für alle Wege in gleicher Weise ausgeführt. Stimmt die Tag-Adresse von der CPU mit einer Tag-Adresse in einem beliebigen der vier Wege überein, liegt ein Cache-Hit, ansonsten ein Cache-Miss vor. Es sind also neben anderen Elementen vier Komparatoren, vier Datenpuffer etc. erforderlich. Die Anzahl nimmt mit steigender Assoziativität, d.h. wachsender Wege-Zahl zu. Dadurch sind Direct Mapped Caches am einfachsten, die 8-Wege set-assoziativen Caches am kompliziertesten aufgebaut. Die Tag-Adresse unterteilt den Adressraum der CPU durch ihre Breite von 20 Bit in 220 CachePages zu je 4 KByte Speicherkapazität. Eine Page wird durch die 256 Sets weiter in 16-Byte Cache-Lines unterteilt. Jeder der vier Wege nimmt 256 dieser Cache-Lines auf. Natürlich gibt es auch andere Cache-Organisationen als der beschriebene 4-Wege set-assoziative Cache. Bei einem 2-Wege-Cache gibt es z.B. nur die Wege 0 und 1. Ein Direct Mapped Cache besitzt dagegen nur einen einzigen Weg. Außerdem können natürlich auch andere Set-Mengen gebildet werden als 256. Beispielsweise hat ein typischer L2-Cache mit 512 KByte Speichervermögen, der als 2-Wege Set-assoziativer Cache organisiert ist, bei einer Cache-Line-Größe von 64 Bytes insgesamt 8192 Sets (das ist typisch für einen 64-Bit-Datenbus zwischen Cache und Hauptspeicher). Dadurch sieht auch die Adressenaufteilung nach Abbildung 7.2 anders aus: Die ByteAdresse A5–A0 ist auf sechs Bit erweitert (26=64), die Set-Adresse umfasst die dreizehn Adressbits A18–A6 und die Tag-Adresse die dreizehn höherwertigen Adressbits A31–A19. Für die Implementierung eines großen Caches werden externe SRAMs sowohl für den Tag- als auch den Datenspeicher verwendet. Wie aus der Abbildung 7.3 zu erkennen ist, müssen die Tags viel früher als die Daten zur Verfügung stehen, weil die Tag-Daten ja noch im Komparator mit dem Tag-Anteil der CPU-Adresse verglichen werden müssen. Sie werden auf einem Motherboard, bei extern realisiertem Cache, daher häufig einen oder zwei SRAM-Bausteine mit sehr kurzer Zugriffszeit (ca. 15 ns) und andere mit längerer Zugriffszeit (ca. 20 ns) finden. Die SRAMs mit der kurzen Zugriffszeit speichern dann die Tag-Werte, die SRAMs mit der längeren Zugriffszeit die eigentlichen Cache-Daten. Die Größe des Cache-Speichers hat sich an der installierten Größe des DRAMs zu orientieren, damit ein entsprechend großer DRAM-Bereich cachebar ist. Diese Cacheable-Area hängt vom Chipsatz selbst und auch vom eingebauten TAG-RAM ab. Der Intel 430HX-Chipsatz kann 512 MByte cachen, der (neuere) Intel 430TX hingegen nur 64 MByte. Wird auf einen Speicherbereich zugegriffen, der sich außerhalb der Cacheable-Area befindet, bedeutet dies, dass die Daten direkt aus dem (langsameren) DRAM zu verarbeiten sind. Dies hat aber zur Folge, dass der PC langsamer arbeitet, als wenn er über entsprechend weniger DRAM verfügen würde, da die Cache/DRAM-Verarbeitung (die Daten liegen teilweise im Cache, teilweise aber im DRAM) unnötigerweise Verarbeitungszeit beansprucht. Es hat demnach absolut keinen Sinn einen PC mit 430TX-Chipsatz mit mehr als 64 MByte auszustatten.
Sandini Bib Schnell zwischengespeichert – Caching
207
Aber selbst wenn der Chipsatz den maximal zu installierenden DRAM-Bereich zu cachen vermag, bedeutet dies noch nicht, dass dies auch in der Praxis möglich ist, denn das TAG-RAM muss über eine bestimmte Datenbreite verfügen. Die Motherboard-Hersteller sparen dabei gern ein paar Euro ein und verwenden ein TAG-RAM, welches wieder eine Limitierung der Cacheable-Area zur Folge hat. Welchen Einfluss die Breite des TAG-RAMs auf die Cacheable-Area hat, zeigt die folgende Tabelle 7.1. Cacheable Area 64 MByte 128 MByte 256 MByte 512 MByte 1024 MByte
TAG-RAM-Breite 8 Bit 9 Bit 10 Bit 11 Bit 12 Bit
Tab. 7.1: Die Cacheable Area wird von der Breite des TAG-RAMs bestimmt.
Bei einigen Motherboards – beispielsweise der Firma Gigabyte – ist es möglich das standardmäßig vorhandene 8-Bit-TAG-RAM gegen ein 11-Bit-TAG-RAM zu ersetzen, damit der maximale Bereich von 512 MByte zu cachen ist.
7.4 Ersetzungsstrategien Der Cache-Controller verwendet z.B. die einem Set von Cache-Lines zugeordneten LRU-Bits (siehe Abbildung 7.2) zur Kennzeichnung des zuletzt adressierten Weges des Sets. Eine mögliche LRU-Strategie ist die folgende: Wenn der letzte Zugriff auf Weg 0 oder Weg 1 erfolgt ist, setzt der Controller das LRU-Bit B0. Bei einer Adressierung von Weg 0 wird B1 gesetzt, bei einer Adressierung von Weg 1 wird B1 dagegen gelöscht. Erfolgte der letzte Zugriff auf Weg 2 oder Weg 3, wird B0 gelöscht. Bei einer Adressierung von Weg 2 wird B2 gesetzt, bei einer Adressierung von Weg 3 wird B2 dagegen gelöscht. Die LRU-Bits werden bei jedem Cache-Zugriff aktualisiert und bei einem Cache-Reset oder einem Cache Flush gelöscht. Wenn nun beim Lesen von Daten ein Cache-Miss auftritt, ersetzt der Cache-Controller eine Cache-Line durch die Cache-Line mit den adressierten Daten. Dazu führt der Controller die folgende Pseudo-LRU-Strategie aus, die Sie als Flussdiagramm in Abbildung 7.4 sehen. Anhand von B0 ermittelt der Cache-Controller, ob Weg 0 und 1 oder Weg 2 und 3 am längsten nicht mehr angesprochen worden sind. Anschließend bestimmt der Controller durch B1 bzw. B2, welche der zwei zugeordneten Cache-Lines am längsten nicht mehr adressiert worden ist und markiert die entsprechende Line als ersetzbar. Der Cache-Controller liest nun eine Cache-Line aus dem Hauptspeicher und legt sie an der Stelle der Cache-Line im SRAM ab, die durch den PseudoLRU-Algorithmus als ersetzbar gekennzeichnet worden ist; er führt ein Cache-Line-Fill aus. Bei der LRU-Strategie wird diejenige Cache-Line eines Sets in den Wegen durch die neue überschrieben, die nicht als letzte angesprochen worden ist. Es ist auch möglich, nur ein LRU-Bit zu verwenden, dessen Binärwert anzeigt, welche Cache-Line als letztes benutzt worden ist: Ein Wert 0 gibt den Weg 0, ein Wert 1 den Weg 1 an, etc. Bei einem Direct Mapped Cache ist die LRUStrategie gegenstandslos, weil ja nur ein Weg existiert und der Cache-Controller daher keine Hilfe bei der Auswahl der zu ersetzenden Cache-Line benötigt.
Sandini Bib 208
Kapitel 7
Cache-Eintrag ersetzen
alle Lines gültig?
ungültige Line ersetzen
nein
ja
B0=0?
nein
ja
nein
B1=0? ja
Weg 1 ersetzen
Weg 0 ersetzen
B2=0?
nein
ja Weg 2 ersetzen
Weg 3 ersetzen
Abb. 7.4: Die Pseudo-LRU-Ersetzungsstrategie
Neben der LRU-Strategie kann der Cache-Controller die Cache-Lines auch nach dem Zufallsprinzip ersetzen. Man spricht dann auch von einer Random-Ersetzung oder Random Replacement. Die Häufigkeit der Zugriffe auf die einzelnen Cache-Lines hat dann keinerlei Einfluss auf ihre »Beständigkeit« im Cache. Umfangreiche statistische Untersuchungen haben aber gezeigt, dass in der Effizienz kaum ein Unterschied zwischen einem LRU- und einem Zufallsalgorithmus besteht. Wegen der geringeren Komplexität kann der Zufallsalgorithmus aber einfacher implementiert werden, und er arbeitet auch schneller, weil keine bedingten Operationen notwendig sind. Definition und Implementierung der Ersetzungsstrategie liegt allein im Ermessen des Cache-System-Designers. Welche Cache-Organisation und Ersetzungsstrategie er wählt, kann vom Einsatzbereich, der Cache-Größe und den zur Verfügung stehenden (finanziellen) Mitteln abhängen.
7.5 On-Chip und Second-Level-Caches Der erste Prozessor, der einen On-Chip-Cache – oder kurz L1-Cache – besitzt, ist der 80486 mit einem 8 KByte Speichervermögen. Dies scheint auf den ersten Blick recht wenig zu sein. Dennoch erbringen bereits diese kleinen Caches eine recht ansehnliche Geschwindigkeitssteigerung, vor allem für das Einlesen von CPU-Codes. Aktuelle CPUs wie der Pentium III verfügen über einen L1-Cache von 32 KByte (je 16 KByte für Daten und für Code) und der Athlon sogar über einen 128 KByte großen L1-Cache. Gängige 80486- und auch noch Pentium-Motherboards weisen typischerweise einen externen Cache-Speicher von 128 bis 512 KByte auf, der als Second-Level Cache oder kurz L2-Cache bezeichnet wird: Findet die CPU nämlich die Daten nicht im internen Cache, so sucht er als zweite Stufe im externen Cache-Speicher, der L2-Cache-Controller sucht also zunächst den L2-Cache ab, bevor die Leseanforderung im Fall eines Cache-Fehltreffers zum Hauptspeicher durchgeschaltet wird. Der externe Second-Level Cache kann im Prinzip auf eine beliebige Größe erweitert wer-
Sandini Bib Schnell zwischengespeichert – Caching
209
den, nur muss die externe Cache-Steuerung dies auch gestatten. Den eigentlichen Hauptspeicher finden Sie dann erst nach der zweiten Cache-Stufe. Der L2-Cache wird entweder extern auf dem Motherboard (bei Sockel-7-Typen) realisiert oder aber er ist wie der L1-Cache ebenfalls in der CPU (AMD-K6-3) bzw. im CPU-Modul (ab Pentium II) mit integriert. Der PentiumPro verfügte als erster PC-Mikroprozessor über einen integrierten L2-Cache (Pipelined Burst) mit einer Kapazität von 256 oder 512 KByte, der mit dem vollen CPU-Takt arbeitet, was die Leistung gegenüber einem Pentium-Prozessor maßgeblich steigert. Der Pentium II besitzt ebenfalls einen integrierten L2-Cache (512 KByte), der allerdings nur den halben CPU-Takt verwenden kann, während bei Athlon, Celeron und Pentium III-Coppermine der L2-Cache auch mit dem vollen CPU-Takt arbeitet. Der On-Chip-Cache (L1) des 80486 ist z.B. als 4-Wege set-asoziativer Cache aufgebaut. Er besitzt also vier Wege mit jeweils 128 Sets (oder Cache-Lines) zu je 16 Byte. Das ergibt gerade die oben erwähnten 8 KByte. Ein großer Unterschied zwischen On-Chip und Second-Level Caches ist aber, dass die CPU Daten aus dem On-Chip-Cache üblicherweise in einem einzigen Taktzyklus lesen kann, bei einem Zugriff auf den Second-Level Cache dagegen einen normalen Buszyklus mit einer Länge von mindestens zwei Taktzyklen ausführt. Ein Zugriff auf den On-Chip-Cache ist also wesentlich schneller. Bei reinen CPU- und Speicher-Benchmarks steigert die Aktivierung des On-Chip-Caches die Geschwindigkeit um einen Faktor vier, in der Praxis bringt der OnChip-Cache aber nur für sequenzielle Lesevorgänge diesen großen Vorteil, für verstreute Daten in einem Bereich, der das Fassungsvermögen des L1-Caches überschreitet, ist der Gewinn allerdings nicht so groß. Iterierende mathematische Berechnungen, die sich im Wesentlichen auf zusammenhängende und vielmals durchlaufene Programmschleifen stützen, werden also stark beschleunigt, Datenbankzugriffe hingegen weniger. Eine Line der On-Chip-Caches wird möglichst in einem Burst-Zyklus ausgeführt, wodurch die externen Buszyklen verkürzt werden (Näheres zum Burst- oder Blockmodus erfahren Sie im Kapitel 8.7.1). Zusammengefasst kann man festhalten, dass eine 486-CPU gegenüber einem Cache-losen 80386 bedeutend schneller arbeitet, wenn sich sein Code und seine Daten in einem Bereich befinden, der in den On-Chip-Cache hineinpasst. Eine Verschlechterung tritt bereits auf, wenn Code und Daten so verstreut sind, dass sie nur noch im L2-Cache Platz finden. Die CPU muss dann bei den Lesevorgängen einen doppelt so langen externen Buszyklus einlegen. Schließlich tritt ein deutlicher Sprung zu längeren Ausführungszeiten auf, wenn auch der Second-Level-Cache die Daten nicht mehr aufnehmen kann und die CPU einen gewöhnlichen Hauptspeicherzugriff ausführt.
7.6 Cache-Kohärenz und das MESI-Protokoll Ein erhebliches Problem tritt auf, sobald in einem System mindestens zwei Caches vorhanden sind. Das kann etwa bei einer Kombination aus einem On-Chip-Cache und einem externen L2Cache oder einer Zusammenschaltung von zwei CPUs mit einem On-Chip-Cache vorliegen. Die Schwierigkeit ist, dass die Kohärenz der Daten in den verschiedenen Caches gesichert sein muss. Damit ist gemeint, dass jeder Lesezugriff auf eine Adresse auch den aktuellen Wert an dieser Stelle liefert, z.B. darf die zweite CPU also keine nicht gemeinsam benutzte Speicherstelle überschreiben, ohne die andere darüber zu informieren. Das Problem der Cache-Kohärenz tritt also vor allem in Multiprozessorsystemen auf. Zur Unterstützung der Kohärenz auf Hardware-Ebene ist das MESI-Protokoll für die Cache-Lines definiert worden, das ich Ihnen im Folgenden kurz vorstellen möchte. Es wurde erst mit den On-Chip-Caches des Pentium implementiert, sodass eine konkrete Implementierung erst dort beschrieben wird.
Sandini Bib 210
7.6.1
Kapitel 7
Die vier MESI-Zustände
Das MESI-Protokoll ordnet jeder Cache-Line einen von vier Zuständen zu, die normalerweise mit Hilfe von zwei MESI-Bits verwaltet werden. MESI ist die Abkürzung für Modified Exclusive Shared Invalid. Die vier Begriffe kennzeichnen bereits die vier möglichen Zustände einer CacheLine im MESI-Protokoll. Der Zustand einer Cache-Line kann durch den Prozessor selbst (über Lese- und Schreibvorgänge sowie internes Abfragen oder Snooping) und externe Logikeinheiten, wie z.B. einen anderen Prozessor oder einen L2-Cache-Controller (durch ein externes Snooping), verändert werden. Zu einem gegebenen Zeitpunkt befindet sich eine Cache-Line in genau einem der vier folgenden Zustände. Modified M Die Daten einer als Modified gekennzeichneten Cache-Line sind in nur einem einzigen Cache des gesamten Systems abgelegt. Die Line kann gelesen und geschrieben werden, ohne dass ein Schreibzugriff über den externen Bus erfolgt. Beachten Sie, dass die aktuellen Werte bei einem Write-Back Cache nicht notwendigerweise auch im Hauptspeicher abgelegt sein müssen. Exclusive E Eine Exclusive Cache-Line ist wie die M-Cache-Line in nur einem Cache des ganzen Systems gespeichert, sie ist aber nicht durch einen Schreibzugriff verändert, d.h. modifiziert worden. Die Werte stimmen dadurch mit den entsprechenden Einträgen im Hauptspeicher überein. Weil die Exclusive Cache-Line in nur einem Cache abgelegt ist, kann sie gelesen und überschrieben werden, ohne dass ein externer Buszyklus notwendig ist, um die Kopien der Line in einem anderen Speicher zu aktualisieren. Nach einem Schreibzugriff wird die Cache-Line als Modified gekennzeichnet. Shared S Eine Shared Cache-Line kann auch in anderen Caches des Gesamtsystems gespeichert sein, sie ist – wie der Name bereits andeutet – in mehreren Caches vorhanden. Eine Shared Cache-Line enthält immer den aktuellen Wert; dadurch werden Lesezugriffe vom Cache bedient. Schreibzugriffe auf eine Shared Cache-Line müssen unabhängig von der Cache-Strategie (Write-Through, Write-Back) stets auf den externen Bus durchgeschaltet werden, damit die Kopien der CacheLine in den anderen Caches invalidiert werden. Die während des Buszyklus ausgegebene Adresse invalidiert über einen externen Abfragezyklus die Cache-Lines in die anderen Mitglieder des Cache-Systems. Gleichzeitig wird auch der Hauptspeicherinhalt aktualisiert, der Vorgang ähnelt also einem Write-Through. Der Schreibvorgang in den lokalen Caches selbst aktualisiert den Cache-Inhalt lediglich, er wird hier nicht invalidiert. Invalid I Eine als Invalid gekennzeichnete Cache-Line ist im Cache logisch nicht vorhanden. Ursache kann sein, dass die Cache-Line selbst leer ist oder einen ungültigen Eintrag aufweist, d.h. nicht aktuell ist. Auch ungültige oder leere Tag-Einträge führen dazu, dass eine Cache-Line als Invalid gekennzeichnet wird. Jeder Zugriff auf eine Invalid Cache-Line führt zu einem Cache-Fehltreffer. Im Fall eines lesenden Zugriffs initiiert der Cache-Controller gewöhnlich ein Cache-Line-Fill (wenn die Line cachebar und ihre Übertragung in den Cache nicht gesperrt ist). Ein schreibender Zugriff wird dagegen als Write-Through zum externen Bus durchgeschaltet. Das MESI-Protokoll sieht also kein Write Allocate vor.
Sandini Bib Schnell zwischengespeichert – Caching
211
In der Tabelle 7.2 sind die MESI-Zustände sowie deren Ursachen und Auswirkungen zusammengefasst dargestellt. MESIZustand
Cache-Line gültig?
Werte im Speicher sind
Kopie in anderen Caches vorhanden?
Schreibzugriff betrifft1)
M E S I
ja ja ja nein
ungültig (überholt) gültig gültig unbekannt
nein nein möglicherweise möglicherweise
Cache Cache Cache/Speichersubsystem Speichersubsystem
1) Speichersubsystem bezeichnet einen Hauptspeicher oder L2-Cache
Tab. 7.2: Die vier MESI-Zustände
Die Definition der vier MESI-Zustände zeigt, dass das MESI-Protokoll für einen Write-Back-Cache ohne Write-Allocate-Strategie im Falle von Schreib-Fehltreffern konzipiert ist. Das MESI-Protokoll kann aber auch für einen Write-Through-Cache benutzt werden. Dazu müssen alle gültigen CacheLines im Shared-Zustand gehalten werden; die Zustände Modified und Exclusive treten nicht auf. Nach dem MESI-Protokoll werden somit alle Schreibzugriffe auf den externen Bus durchgeschaltet oder anders ausgedrückt: der Cache arbeitet mit einer Write-Through-Strategie. Bemerken möchte ich an dieser Stelle, dass das MESI-Protokoll bei der 80x86-Familie nur auf Speicherzyklen, nicht aber I/O- und Sonderzyklen angewandt wird. Diese Zyklen werden immer auf den Bus durchgeschaltet, sodass der Cache nicht betroffen ist.
7.6.2
MESI-Zustandsübergänge
Der Zustand einer Cache-Line kann sich bei einem Lesezugriff, einem Schreibzugriff oder einem Abfragezyklus (Snooping) ändern. Für den Übergang der verschiedenen Zustände ineinander sind exakt definierte Regeln vorhanden. Im Folgenden sind sie nach den drei Zugriffsarten getrennt aufgeführt, und die Abbildung 7.5 zeigt das entsprechende Übergangsdiagramm. W4
S7
R6
R3
R5 S
I S6
W5
S5
S1 S2
S4 R4
S3
W3
W1 M
W2
E
R1 Abb. 7.5: Übergänge der MESI-Zustände ineinander
R2
Sandini Bib 212
Kapitel 7
Lesezugriffe:
: : : :
: :
M nach M (R1): Ein Lesezugriff hat zu einem Treffer geführt, die Daten sind im Cache gespeichert und werden der CPU übergeben; E nach E (R2): Auch hier hat der Lesezugriff zu einem Cache-Treffer geführt, und die Daten werden an die CPU übergeben; S nach S (R3): Der Lesezugriff ergab einen Treffer, die Daten werden an die CPU übergeben. Logischerweise führen die drei angeführten Lesezugriffe (R1 bis R3) nicht zu einer Änderung des Cache-Zustands oder der gespeicherten Daten; I nach E (R4): Der Lesezugriff verursachte einen Fehltreffer, die Daten sind nicht im Cache abgelegt. Der Cache-Controller löst einen externen Lesezyklus aus, um die Daten zu lesen. Damit sich die Cache-Line nach dem Lesevorgang im Exclusive-Zustand befindet, müssen die angesprochenen Daten cachebar sein, sonst führt der Cache-Controller kein Line Fill aus. Außerdem muss eine Write-Back-Strategie implementiert sein; I nach S (R5): Der Lesezugriff hat wie oben zu einem Fehltreffer geführt. Der Cache-Controller löst auch hier ein Cache-Line-Fill aus, um die Daten zu lesen. Soll die Cache-Line anschließend im Shared-Zustand sein, müssen die angesprochenen Daten cachebar sein. Außerdem ist es notwendig, ein Write-Through vorzusehen; I nach I (R6): Der Lesezugriff hat zu einem Fehltreffer geführt. Der Cache-Controller kann aber kein Line Fill ausführen (die Daten sind z.B. als Memory-Mapped-Register nicht cachebar), um die Cache-Line zu laden; sie bleibt weiterhin ungültig.
Schreibzugriffe:
:
: :
: :
M nach M (W1): Der Schreibzugriff hat zu einem Cache-Treffer geführt, die Daten sind im Cache vorhanden und werden dort aktualisiert. Nach dem MESI-Protokoll betrifft das einen Write-Back-Cache (für einen Write-Through-Cache sind nur die beiden MESI-Zustände Shared und Invalid gültig, um das Durchschreiben zu erzwingen), sodass kein Schreibzyklus auf den externen Bus gelegt wird; E nach M (W2): Der Schreibzugriff hat einen Treffer auf eine vorher noch nicht überschriebene Cache-Line verursacht. Der Cache-Controller kennzeichnet die Cache-Line nun als modifiziert. Nach dem MESI-Protokoll betrifft auch dieser Fall einen Write-Back-Cache, sodass der Cache-Controller keinen Schreibzyklus auf den externen Bus treibt; S nach E (W3): Der Schreibzugriff hat einen Cache-Treffer ergeben. Weil die ursprünglich Line als Shared gekennzeichnet ist, kann sie auch in anderen Caches als Kopie abgelegt sein. Diese Einträge müssen invalidiert werden, der Cache-Controller treibt daher einen Schreibzyklus auf den externen Bus. Die Line ist dann nur noch im lokalen Cache gespeichert und darf folglich als Exclusive gekennzeichnet werden; S nach S (W4): Der Schreibzugriff hat auch hier einen Cache-Treffer ergeben. Der Übergang W4 betrifft ausschließlich einen Write-Through-Cache (für einen Write-Back-Cache ist der Übergang W3 vorgesehen), sodass die Cache-Line als Shared gekennzeichnet bleibt; I nach I (W5): Der Schreibzugriff hat zu einem Fehltreffer geführt. Das MESI-Protokoll sieht keine Write-Allocate-Strategie vor und somit wird der fehlende Eintrag nicht in den Cache geschrieben, die Cache-Line bleibt weiter ungültig.
Sandini Bib Schnell zwischengespeichert – Caching
213
Abfragezyklen (Snooping): Abfragezyklen werden von einem externen Busmaster ausgelöst, um festzustellen, ob ein Cache eine bestimmte Cache-Line enthält und welchen MESI-Zustand sie gegebenenfalls aufweist.
: : :
:
: : :
M nach S (S1): Der Abfragezyklus hat eine modifizierte Cache-Line getroffen, die nicht invalidiert werden soll. Sie wird trotzdem in den Hauptspeicher zurückgeschrieben; M nach I (S2): Der Abfragezyklus hat wie oben eine Cache-Line im Zustand Modified getroffen. Im Gegensatz zu S2 soll sie hier aber invalidiert werden. Zusätzlich wird sie in den Hauptspeicher zurückgeschrieben; E nach S (S3): Der Abfragezyklus hat eine Cache-Line getroffen, die als Exclusive markiert ist. Sie ist also bisher nicht modifiziert worden und muss somit nicht in den Hauptspeicher zurückgeschrieben werden. Der Zweck von S3 ist, eine vorher nur in einem Cache vorhandene Line auch in einen anderen Cache des Systems zu übertragen. Die Cache-Line kann dann nicht mehr Exclusive sein, sondern muss als Shared gekennzeichnet werden; E nach I (S4): Der Abfragezyklus hat wie bei S3 eine Cache-Line getroffen, die als Exclusive markiert ist. S4 wird ebenfalls dazu verwendet, eine vorher nur in einem Cache vorhandene Line auch in einen anderen Cache zu übertragen. Im Gegensatz zu S3 wird die Line aber invalidiert, sodass sie als Cache-Line im Zustand Exclusive im anderen Cache vorhanden sein kann (sonst ist nur Shared möglich); S nach S (S5): Der Abfragezyklus hat eine Cache-Line getroffen, die als Shared gekennzeichnet ist und somit möglicherweise als Kopie in einem anderen Cache vorliegt. Der Übergang S5 informiert das externe System also lediglich, dass die betreffende Cache-Line im abgefragten Cache vorhanden ist. Es erfolgt keine weitere Busaktivität; S nach I (S6): Der Abfragezyklus hat wie oben zu einem Treffer auf eine als Shared markierte Cache-Line geführt. Sie ist nicht modifiziert worden und muss bei der folgenden Invalidierung auch nicht in den Hauptspeicher zurückgeschrieben werden. Der abfragende externe Busmaster erkennt dann, dass seine Kopie ebenfalls aktuell ist; I nach I (S7): Der Abfragezyklus hat eine Cache-Line ermittelt, die als Invalid markiert ist. Sie enthält somit keine gültigen Daten. Es erfolgt keine weitere Busaktivität und der abfragende Busmaster ignoriert den Inhalt der betreffenden Cache-Line im angesprochenen Cache.
7.6.3
L2-Cache-Subsysteme und MESI-Cache-Kohärenzprotokoll
Bei vorhandenem L1- und L2-Cache ist man bereits mit einem Multi-Cache-System konfrontiert und das MESI-Protokoll kann hierfür Anwendung finden. Das System, bestehend aus der CPU mit On-Chip-Cache (L1) und einem L2-Cache, liefert die Cache-Kohärenz durch Inklusion. Das bedeutet, dass alle Adressen im On-Chip-Cache der CPU auch im L2-Cache vorhanden sind (umgekehrt funktioniert das nicht, weil der L2-Cache viel größer als der L1-Cache ist). Beachten Sie aber, dass das bei einem Write-Back-Cache nicht notwendigerweise bedeutet, dass die Daten der Adressen identisch sind. Der On-Chip-Cache kann aktuellere Werte als der L2-Cache aufweisen. Das Inklusionsschema ist in Abbildung 7.6 gezeigt.
Sandini Bib 214
Kapitel 7
L2-Cache Cache Controller Cache-SRAM-Module
L1-Cache On-Chip Code und Daten-Cache
Abb. 7.6: Cache-Kohärenz durch Inklusion: Alle Adressen im On-Chip-Cache sind auch im L2-Cache vorhanden.
Der Datenaustausch zwischen dem CPU-Cache und dem Hauptspeicher läuft über den L2Cache ab, sodass das MESI-Protokoll auch über die drei Stufen L1-Cache, L2-Cache und Hauptspeicher voll zur Anwendung kommt. Der MESI-Zustand einer Line im L2-Cache eilt dem MESI-Zustand der entsprechenden Line im On-Chip-Cache immer um eine Stufe (entsprechend Tabelle 7.2 und dem MESI-Übergangsdiagramm in Abbildung 7.5) vor. Die Inklusion im L2-Cache wird durch zwei Prozesse realisiert, nämlich Abfrage- und BackInvalidierungszyklen sowie durch eine Einmal-Schreib-Strategie (Write Once Policy). Im Folgenden möchte ich diese Begriffe näher erläutern. In einem Abfragezyklus des L2-Caches an den L1-Cache ermittelt der Cache-Controller, ob eine bestimmte Cache-Line im On-Chip-Cache vorhanden und ob die Line verändert worden ist. Das entspricht einem Cache-Abfragetreffer bzw. einem Cache-Abfragetreffer auf eine Modified Line. In letzterem Fall schreibt die CPU die modifizierte Cache-Line in den L2-Cache zurück und führt somit einen Write-Back-Zyklus zum L2-Cache aus. Die Line wird also im L2-Cache aktualisiert. Fordert der L2-Cache-Controller, der den Abfragezyklus treibt, zusätzlich einen Back-Invalidierungszyklus an, dann führt der Snoop-Zugriff (Abfragezyklus) zusätzlich zu einer Invalidierung der getroffenen Cache-Line, ihr Zustand ändert sich in Invalid. Abfrage- und Back-InvalidationZyklen durch den L2-Cache-Controller werden an die CPU mit On-Chip-Cache in den folgenden Fällen ausgelöst, um die Cache-Kohärenz sicherzustellen.
: : :
Ein externer Abfragezyklus durch die Busaktivität eines anderen Busmasters (d.h. eines anderen Prozessors in einem Multiprozessorsystem) hat eine als M gekennzeichnete Line im L2-Cache getroffen; Ein Cache Flush durch ein externes Steuersignal (meistens FLUSH) trifft eine modifizierte Cache-Line; Im L2-Cache soll eine Cache-Line ersetzt und dadurch ein Cache-Line Fill ausgeführt werden. Befindet sich dieselbe Line auch im L1-Cache, muss sie auch dort ersetzt oder zumindest invalidiert werden.
Schließlich hat die Einmal-Schreib-Strategie (Write Once Policy) die Aufgabe sicherzustellen, dass der Cache-Controller zu jedem Zeitpunkt über die modifizierten Einträge im L1-Chip-Cache informiert ist. Der Cache-Controller kann dem L1-Cache nur dann erlauben, eine Cache-Line in den Exclusive-Zustand zu versetzen, wenn dieselbe Cache-Line im L2-Cache anschließend als Modified gekennzeichnet ist. Die betreffende Cache-Line muss im L2-Cache also vom Exclusive in den Modified-Zustand versetzt werden oder sich bereits im Modified-Zustand befinden. Das
Sandini Bib Schnell zwischengespeichert – Caching
215
Inklusionsprinzip bewirkt, dass jede Exclusive Line im L1-Cache als Modified Line im L2-Cache vorliegt. Dadurch treibt der Cache-Controller für jeden Write-Back-Zyklus unabhängig von seiner Ursache zunächst einen Abfragezyklus an den L1-Cache, um die möglicherweise dort modifizierte Line (wenn der L1-Cache mit einer Write-Back-Strategie arbeitet) in den L2-Cache und anschließend in den Hauptspeicher zurückzuschreiben. Das beschriebene Inklusionsprinzip gewährleistet eine Cache-Kohärenz sowohl über eine einzelne L1-Cache/L2-Cache/Hauptspeicher-Struktur als auch für ein Multiprozessorsystem mit mehreren solchen L1-Cache/L2-Cache/ Hauptspeicher-Einheiten. Der Pentium als von vornherein auf ein Multiprocessing ausgerichteter Prozessor mit zwei unabhängigen On-Chip-Caches für Daten und Codes (L1-Caches) unterstützt zusammen mit dem extra für ihn entwickelten 82496/82491-Cache-Subsystem (L2-Cache) eine solche Inklusion und dadurch die Cache-Kohärenz auf Hardware-Ebene. Beim 80486 ist das noch nicht der Fall und dort ist eine nicht unerhebliche Zusatzlogik oder der Eingriff von spezieller Software notwendig.
7.7 Pipelined Burst Cache Die immer höhere Geschwindigkeit der Prozessoren führt irgendwann auch bei schnellen SRAM-Caches zur Wartezyklen. Insbesondere die Burst-Zugriffe beim Laden oder Zurückschreiben einzelner oder mehrerer Cache-Lines der Caches auf den Prozessorchips selbst verlangen kurze Zugriffszeiten und hohe Datenübertragungsraten. Das kann durch aufwändige synchrone SRAM-Chips mit extrem kurzen Zugriffszeiten (unter 5 ns), die teilweise in ECL-Logik implementiert sind, erreicht werden oder auf preiswertere Weise durch Pipelined Burst SRAM. Die Bezeichnung deutet bereits an, wie diese SRAMs das Datenproblem lösen: Die CPU wird mit Burst-Zyklen bedient, die darüber hinaus verzahnt sind (Pipelining). Dadurch wird die eigentliche Zugriffszeit verlängert, da dieser Cache-Typ bereits »auf Vorrat« Adressen dekodiert und die entsprechenden Zugriffe ausführt. Insbesondere ab dem Pentium, der Speicherzugriffe fast ausschließlich als Burst-Zugriffe ausführt, sind die Pipelined Burst Caches beliebt. Der PipelinedBurst-Betrieb dieser Caches setzt sich dann aus dem Pentium-Burst und einem Adress-Pipelining zusammen, bei dem die erste Adresse des folgenden Bursts mit der letzten Datenein-/ Datenausgabe des vorangegangen Bursts überlappt. Insbesondere Schreibzugriffe profitieren von dieser Cache-Art, gegenüber asynchronem Cache verdoppelt sich die Übertragungsrate. Bei mehreren aufeinanderfolgenden Bursts (Back-to-Back-Vorgänge) lässt sich dann im Durchschnitt fast der theoretische Höchstwert erzielen. Beim Pentium mit 64-Bit-Datenbus und 66 MHz externer Busfrequenz sind dies bereits 528 MioByte/s.
Sandini Bib
Sandini Bib
8 Alles in Einem – Der i486 Der i486 integriert eine verbesserte 80386-CPU, einen leistungsfähigeren 80387-mathematischen Coprozessor und einen Cache-Controller samt 8 KByte Cache-Speicher auf einem Chip. Die Bezeichnung »i486« kennzeichnet, dass es sich um eine CPU von Intel (i) handelt, demgegenüber gibt es diese CPU auch von anderen Herstellern wie Advanced Micro Devices (AMD), Cyrix (Cx) oder Texas Instruments (TI), wobei bei diesen Typen dann das jeweils eigene Firmenkürzel vorangestellt wird. Ab der 80486-CPU, wie sie zunächst auch bezeichnet wurde, hat sich diese Art der Bezeichnung etabliert und ich verwende in diesem Buch meist die Intel-Bezeichnung, was aber nicht bedeuten soll, dass die Erläuterungen nicht auch auf einen AMD486 zutreffen. Grundlegende Unterschiede zwischen den 486-CPUs der verschiedenen Hersteller sind nicht vorhanden, schließlich müssen sie PC-kompatibel sein. Dies ist auch bei den anderen Mikroprozessoren (8088/8086, 80286, 80386) der Fall, die ebenfalls nicht ausschließlich von Intel gefertigt wurden. Völlig identisch sind die Mikroprozessoren einer Leistungsklasse allerdings nicht, worauf ich im Kapitel 10 näher eingehe. Den i486 gibt es für externe Taktfrequenzen von 25 bis hin zu 50 MHz, intern kann er als i486DX4 bis zu 100 MHz erreichen. Zusammen mit dem 32-Bit-Datenbus sind im Burst-Modus Datentransferraten von bis zu 160 MByte/s möglich. Im Gegensatz zum 80386 führt der i486 häufig benutzte Befehle wie z.B. MOV in einem einzigen Taktzyklus aus. Der i486 ist damit etwa um den Faktor drei schneller als ein mit derselben Frequenz getakteter 80386. Der Aufwand ist aber gewaltig: Der 80486 integriert auf einem daumennagelgroßen Chip mehr als eine Million Transistoren, fast fünfzigmal mehr als der Urvater 8086. Natürlich ist der i486 vollständig abwärtskompatibel mit der Kombination 80386/80387. Er kennt dieselben Befehle und Datentypen, den Real, Protected und Virtual-8086-Mode und führt in gleicher Weise eine Segmentierung des Speichers und ein Demand Paging aus. Da sich der Coprozessor auf dem gleichen Chip wie die CPU befindet, läuft auch der Datenaustausch zwischen ihnen schneller ab. Die schnellste 486-CPU von AMD mit 133 MHz (Am486DX2-133) ist bei einigen Anwendungen sogar schneller als ein 75-MHz-Pentium. Zur Einstimmung sehen Sie in Abbildung 8.1 ein Foto des i486DX.
Abb. 8.1: Der i486DX kann mit einem internen Takt von bis zu 50 MHz arbeiten.
Sandini Bib 218
Kapitel 8
8.1 Anschlüsse und Signale des i486 Die vielen verschiedenen Komponenten des i486 müssen stabil mit Betriebsspannungen versorgt werden. Das geschieht über insgesamt 24 Vcc- und 28 Vss-Anschlüsse. Zusammen mit den 116 Signal-Pins benötigt der i486 also 168 Anschlüsse, er ist in einem Pin-Grid-Array-Gehäuse mit 168 Anschlüssen versteckt. In Abbildung 8.2 finden Sie das Anschlussschema des i486. Im Folgenden möchte ich Ihnen die Anschlüsse des i486 erläutern. Anschlüsse und Signale, die bereits beim 80386/i387 vorkommen, werden nur kurz aufgeführt. Näheres finden Sie im entsprechenden Kapitel.
Abb. 8.2: Das Foto zeigt den i486DX.
A31–A2 (O; A31–A4: I/O) Anschlüsse P2–P3, Q1, Q3–Q14, R1–R2, R5, R7, R12–R13, R15, S1–S3, S5, S7, S13, S15–S16 Diese 30 Pins bilden die 30 höherwertigen Bits des 32-Bit-Adressbusses. Die zwei niederwertigsten Adressbits A1 und A0 müssen aus den Signalen an den Pins BE0–BE3 ermittelt werden. Die 28 höherwertigen Adressbits A31–A4 können für Cache-Abfragezyklen auch als Eingabeanschlüsse betrieben werden.
Sandini Bib Alles in Einem – Der i486
219
A20M (I) Anschluss D15 Wird dieser Address-20-Mask-Pin auf einen niedrigen Pegel gelegt, so maskiert der i486 vor jedem Speicherzugriff intern das Adressbit A20. Er emuliert also das Adress-Wrap-Around des 8086, A20M darf daher nur im Real Mode aktiviert werden. ADS (O) Anschluss S17 Das Address-Status-Signal an diesem Pin gibt an, dass der i486 gültige Bussteuersignale W/R, D/C und M/IO und gültige Adresssignale ausgibt, die vom Subsystem übernommen und dekodiert werden können.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
A
B
C
D
E
F
G
H
J
K
L
M
N
P
Q
R
S
D20
D19
D11
D9
GND
DP1
GND
GND
Vcc
GND
GND
GND
D2
D0
A31
A28
A27
D22
D21
D18
D13
Vcc
D8
Vcc
D3
D5
Vcc
D6
Vcc
D1
A29
GND
A25
A26
frei
GND
CLK
D17
D10
D15
D12
DP2
D16
D14
D7
D4
DP0
A30
A17
Vcc
A23
D23
GND
Vcc
Codrg.
A19
GND
frei
DP3
GND
Vcc
A21
A18
A14
D24
D25
D27
A24
Vcc
GND
GND
Vcc
D26
A22
A15
A12
D29
D31
D28
A20
Vcc
GND
GND
Vcc
D30
A16
Vcc
GND
frei
frei
frei
A13
Vcc
GND
GND
Vcc
frei
A9
Vcc
GND
frei
frei
frei
A5
A11
GND
frei
frei
frei
A7
A8
A10
frei
frei
FERR
A2
Vcc
GND
A3
A6
i486DX PGA (168 Pins)
IGNNE NMI FLUSH A20M HOLD KEN
frei
BRDY
BE2
BE0
PWT
D/C
LOCK HLDA BREQ
Vcc
RDY
Vcc
Vcc
BE1
Vcc
Vcc
Vcc
M/IO
Vcc PLOCK BLAST
GND
BE3
GND
GND
PCD
GND
GND
GND
W/R
GND PCHK
E
F
G
H
J
K
L
M
N
INTR
frei
RESET BS8
AHOLD EADS BS16 BOFF
A
B
C
D
P
Q
A4
frei
ADS
R
S
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Abb. 8.3: Das Anschlussschema des i486: Das Gehäuse des i486 ist mit seinen 168 Pins ein wahrer Bolide. Der Chip selbst ist aber kaum größer als der 8086.
AHOLD (I) Anschluss A17 Führt das externe System diesem Address-Hold-Pin ein Signal mit hohem Pegel zu, so kann ein anderer Busmaster auf den Adressbus des i486 zugreifen, um eine Cache-Invalidation im i486 auzuführen. Das ist z.B. für die Cache-Konsistenz im Zusammenwirken mit einem L2-Cache oder in einem Multiprozessorsystem notwendig. Bei aktiviertem AHOLD treibt der i486 seinen Adressbus nicht mehr, sondern erwartet eine externe Adresse; alle anderen Bussignale sind aber weiter aktiv.
Sandini Bib 220
Kapitel 8
BE0–BE3 (O) Anschlüsse F17, J15–J16, K15 Diese vier Byte-Enable-Signale geben wie beim 80386 an, welche Bytes des 32-Bit-Datenbusses im gegenwärtigen Buszyklus aktiv sind. BE0 entspricht dabei dem niederwertigsten Datenbyte D0–D7, BE3 dem höchstwertigen Datenbyte D24–D31. BLAST (O;) Anschluss R16 Das Burst-Last-Signal BLAST gibt an, dass der gegenwärtige Burst-Zyklus mit dem nächsten BRDY abgeschlossen wird. BOFF (I) Anschluss D17 Wird dem Backoff-Anschluss ein Signal mit niedrigem Pegel zugeführt, so deaktiviert der i486 seinen Bus mit dem nächsten Taktzyklus. BRDY (I) Anschluss H15 Das Burst-Ready-Signal BRDY besitzt während eines Burst-Zyklus dieselbe Bedeutung wie RDY bei einem normalen Buszyklus, d.h. das adressierte System hat in einem Burst-Zyklus die Daten auf den Datenbus übergeben oder von diesem angenommen. BREQ (O) Anschluss Q15 Über dieses Bus-Request-Signal zeigt der i486 an, dass er intern den Bus angefordert hat. BS16, BS8 (I, I) Anschlüsse C17, D16 Wird einem dieser Bus-Size-Pins ein Signal mit niedrigem Pegel zugeführt, so betreibt der i486 seinen Datenbus nur mit einer Breite von 16 bzw. 8 statt der standardmäßigen 32 Bit. Die Busschnittstelle führt dann automatisch entsprechend viele Buszyklen aus, um z.B. ein Doppelwort mit 32 Bit zu übertragen. Der i486 kann also direkt mit einem System verbunden werden, das nur einen 16- oder 8-Bit-Datenbus aufweist. Die Busbreite kann dynamisch für jeden einzelnen Buszyklus gewählt werden. Dadurch ist es z.B. möglich, sowohl den 32-Bit-Hauptspeicher als auch den 16-Bit-I/O-Adressbereich ohne externen 32/16-Bit-Wandler anzusprechen. CLK (I) Anschluss C3 Diesem Pin wird das externe Taktsignal zugeführt. Im Gegensatz zum 80386 teilt der i486 das externe Prozessortaktsignal CLK nicht durch zwei, sondern verwendet es ohne weitere Veränderung als internen Prozessortakt. Hierdurch wird die Frequenz des externen Oszillators halbiert. Bei der schnellsten i486-Variante mit externem 50-MHz Takt wäre sonst ein 100-MHz-Oszillator notwendig, das liegt bereits im UKW-Bereich. Die Wellenlänge der 100-Mhz-Schwingung beträgt dann nur noch 3 m und fällt schon in die Größenordnung von Motherboards. Das führt zu sehr unangenehmen elektrodynamischen Effekten wie Signalechos, Reflexionen etc. und verkompliziert das Layout und die Technik der Boards erheblich. Die Halbierung des externen Takts gegenüber dem 80386 schafft daher etwas »Luft« für die Computer-Techniker.
Sandini Bib Alles in Einem – Der i486
221
D31–D0 (I/O) Anschlüsse A1–A2, A4, A6, A8, B1–B2, B6, B8, C1–C2, C6–C9, D1–D3, E3, F2–F3, G3, H2, J2–J3, K3, L2–L3, M3, N1–N2, P1 Die 32 Anschlüsse bilden den bidirektionalen 32-Bit-Datenbus des i486 zur Datenein- und -ausgabe. Der Datenbus kann durch BS16 und BS8 wahlweise als 32-, 16- oder 8-Bit-Datenbus konfiguriert werden. Die Signale an den Pins BE0–BE3 geben an, welche Bytes des Datenbusses gültige Daten übertragen. DP0–DP3 (I/O) Anschlüsse A5, F1, H3, N3 Der i486 unterstützt Paritätsbildung für den Datenbus, d.h. er gibt bei allen Schreibzyklen für jedes Byte des Datenbusses D31–D0 ein Paritätsbit DP3–DP0 aus, sodass gerade Parität erzielt wird. Beim Lesen von Daten muss das System den Data-Parity-Anschlüssen DP3–DP0 Signale zuführen, die zu gerader Parität führen. Unterstützt das externe Subsystem diese Paritätsfunktion nicht, so sollten DP0–DP3 auf Vcc festgeklemmt werden. Die beim Lesen zugeführten Signale beeinflussen den Programmablauf nicht unmittelbar; bei einer Paritätsverletzung wird nur das Signal PCHK aktiviert, das dann z.B. über einen Hardware-Interrupt die Programmausführung abbrechen kann. EADS (I) Anschluss B17 Wird dem External-Address-Anschluss ein aktives Signal, d.h. ein Signal mit niedrigem Pegel, zugeführt, so weiß der i486, dass ein externer Busmaster eine gültige Adresse an seine Adressanschlüsse A31–A2 angelegt hat. Der i486 benutzt diese Adresse für eine interne Cache-Invalidation. FERR (O) Anschluss C14 Wenn ein Fehler in der internen Gleitkommaeinheit des i486 auftritt, aktiviert der Prozessor dieses Floating-Point-Error-Signal. FERR ist dem Signal ERROR des i387 ähnlich. FLUSH (I) Anschluss C15 Aktiviert das externe System das Cache-Flush-Signal FLUSH, dann schreibt der i486 den gesamten Inhalt seines Caches in den Speicher, er führt ein Cache-Flush aus. HOLD, HLDA (I, O) Anschlüsse E15, P15 Die Bus-Hold-Request- und Bus-Hold-Acknowledge-Signale an diesen Pins dienen in der bekannten Weise zur Bus-Arbitration, d.h. zur Übergabe der Kontrolle über den lokalen Bus zwischen verschiedenen Busmastern. IGNNE (I) Anschluss A15 Wird diesem Ignore-Numeric-Error-Anschluss ein Signal mit niedrigem, d.h. aktivem Pegel zugeführt, so ignoriert der i486 numerische Fehler und führt alle Befehle aus, die nicht die Gleitkommaeinheit betreffen. Lediglich FERR wird aktiviert. Ist das Bit NE im Steuerregister CR0 gesetzt, so hat IGNNE keine Auswirkungen.
Sandini Bib 222
Kapitel 8
INTR (I) Anschluss A16 Über den INTR-Anschluss kann ein Interrupt Controller eine Hardware-Interrupt-Anforderung auslösen. Die Abtastung von INTR wird durch ein gelöschtes Interrupt Flag IE verhindert (maskiert). KEN (I) Anschluss F15 Über das Cache-Enable-Signal KEN ermittelt der i486, ob der gegenwärtige Zyklus »cachebar« ist, ob also der adressierte Adressbereich in den Cache übertragen werden kann. Ist das der Fall, dann erweitert der Prozessor den gegenwärtigen Lesezugriff auf einen Cache-Line-Fill-Zyklus, d.h. der i486 liest automatisch eine ganze Cache-Zeile in seinen On-Chip-Cache ein. Über KEN können bestimmte Adressbereiche hardware-mäßig vor einem Caching geschützt werden. LOCK (O) Anschluss N15 Ist LOCK aktiv, also auf einem niedrigen Pegel, so gibt der i486 den lokalen Bus nicht an einen anderen Busmaster ab, wenn er eine Busanforderung HOLD von einem anderen Master empfängt. Er reagiert auf eine Anforderung (HOLD) nicht mit einem Acknowledge (HLDA). M/IO, D/C, W/R (O, O, O) Anschlüsse N16, M15, N17 Die Signale Memory/IO, Data/Control und Write/Read an diesen Anschlüssen definieren den aktuellen Buszyklus. Es gelten folgende Kombinationen:
: : : : : : : : 1)
(000) Interrupt-Acknowledge-Sequenz (001) Sonderzyklus1) (010) Lesen eines I/O-Ports (011) Schreiben eines I/O-Ports (100) Lesen eines Befehls aus dem Speicher (Prefetching) (101) reserviert (110) Lesen von Daten aus dem Speicher (111) Schreiben von Daten in den Speicher BE3=0, BE2=BE1=BE0=1: Write-Back-Zyklus BE2=0, BE3=BE1=BE0=1: Halt-Zyklus BE1=0, BE3=BE2=BE0=1: Flush-Zyklus BE0=0, BE3=BE2=BE1=1: Shutdown-Zyklus
NMI (I) Anschluss B15 Ein Übergang des Signals an diesem Anschluss von einem niedrigen zu einem hohen Pegel führt auch bei gelöschtem IE-Flag zu einem Interrupt 2. Der i486 bricht die Programmausführung nach der Vervollständigung des laufenden Befehls ab und ruft den entsprechenden Handler auf.
Sandini Bib Alles in Einem – Der i486
223
PCHK (O) Anschluss Q17 Nach dem Lesen von Daten gibt der i486 über diesen Parity-Check-Anschluss ein Signal aus, das anzeigt, ob die übergebenen Daten- und Paritätsbits gerade Parität aufweisen. Liegt PCHK auf einem niedrigen Pegel, so hat der i486 einen Paritätsfehler erfasst. PLOCK (O) Anschluss Q16 Durch ein aktives Pseudo-Lock-Signal zeigt der i486 an, dass die gegenwärtige Datenübertragung mehr als einen Buszyklus benötigt. Das ist z.B. beim Lesen von Segmentdeskriptoren mit einer Länge von 64 Bit aus einer Deskriptortabelle oder für ein Cache-Line-Fill des On-ChipCaches der Fall. PWT, PCD (O, O) Anschlüsse L15, J17 Diese beiden Signale Page Write-Through und Page Cache Disable geben den Zustand der PageAttributbits PWT und PCD im Page Table-Eintrag oder dem Page Directory-Eintrag an. Ist Paging nicht aktiv oder handelt es sich um einen Buszyklus, der keinem Paging unterliegt, so geben PWT und PCD den Status der Bits PWT bzw. PCD im Steuerregister CR3 an. RDY (I) Anschluss F16 Ist das Non-Burst-Ready-Signal RDY aktiv, d.h. auf einem niedrigen Pegel, so hat das adressierte System (Speicher, I/O-Register) die Daten auf den Bus ausgegeben oder vom Bus bereits übernommen. RESET (I) Anschluss C16 Liegt dieser Eingang mindestens 15 CLK-Zyklen auf einem hohen Pegel, so bricht der i486 seine Tätigkeit sofort ab und führt einen Prozessor-Reset aus. Vcc (I) Anschlüsse B7, B9, B11, C4–C5, E2, E16, G2, G16, H16, J1, K2, K16, L16, M2, M16, P16, R3, R6, R8– R11, R14 Diesen Anschlüssen wird die Versorgungsspannung (üblicherweise +5 V) zugeführt. GND (I) Anschlüsse A7, A9, A11, B3–B5, E1, E17, G1, G17, H1, H17, K1, K17, L1, L17, M1, M17, P17, Q2, R4, S6, S8–12, S14 Diese Pins liegen auf Masse (üblicherweise 0 V). frei Anschlüsse A3, A10, A12–A14, B10, B12–B14, B16, C10–C13, G15, R17, S4 Diese Anschlüsse sind frei.
Sandini Bib 224
Kapitel 8
8.2 Der interne Aufbau des i486 Durch die Integration von insgesamt drei Prozessoren auf einem Chip, nämlich CPU, Coprozessor und Cache-Steuerung, ist auch der interne Aufbau des i486 gegenüber dem 80386 erheblich komplizierter geworden. Ich möchte daher an dieser Stelle kurz auf den Aufbau des i486 eingehen, der in Abbildung 8.4 schematisch dargestellt ist.
PagingEinheit
Steuereinheit
.%\WH (8 kByte)
Prefetcher
Steuersignale
Busschnittstelle
D31-D0
Cache
Segment.Einheit
A31-A0
Dekodiereinheit
CPU
(32-Byte-Queue)
i486
Register und ALU
Gleitkommaeinheit
Abb. 8.4: Interner Aufbau des i486: Der i486 integriert auf einem Chip nicht nur eine gegenüber dem 80386 verbesserte CPU, sondern auch einen leistungsfähigere Form des i387 sowie einen Cache-Controller und einen 8-KByte-Cache. Die Prefetch Queue ist auf 32 Byte angewachsen.
Die Verbindung zum Rest der (Computer-) Welt stellt die Busschnittstelle her, die über den Datenbus D31–D0 Daten empfängt oder abgibt, über den Adressbus A31–A2, BE3–BE0 die beiden Adressräume adressiert und über den Steuerbus Informationen über den Zustand des i486 abgibt oder Anweisungen von außen annimmt. Mit der Busschnittstelle unmittelbar verbunden ist die Cache Unit. Der integrierte 8-KByte-Cache-Speicher puffert sowohl Daten als auch Befehle und gibt sie an die Register, ALU und Gleitkommaeinheit bzw. den Prefetcher weiter. Im Gegensatz zu Speicherzyklen für einen externen Second-Level-Cache wird ein Zugriff auf den internen Cache in einem Buszyklus ausgeführt, bei externen Cache-Speichern sind dagegen zwei Buszyklen erforderlich. Obwohl der interne Cache mir 8-KByte recht klein ist, bringt er also einen ganz enormen Geschwindigkeitszuwachs. Müssen Daten oder Befehle aus dem Speicher eingelesen werden, die nicht im Cache gepuffert sind, so greifen die Register oder der Prefetcher direkt auf die Busschnittstelle zu. Das kann vorkommen, wenn sehr verstreute Daten verarbeitet werden oder ein Sprungbefehl zu einer weiter entfernten Adresse ausgeführt wird. Hinter dem Cache trennen sich die Wege der Daten und Befehlscodes. Die Datenbytes werden an die Register oder Gleitkommaeinheit weitergegeben, die Befehlsbytes in die Prefetch Queue eingereiht, die beim i486 32 Byte umfasst. Die Decodiereinheit dekodiert die Befehle in der Prefetch
Sandini Bib Alles in Einem – Der i486
225
Queue und gibt sie an die Steuereinheit weiter, die Register, ALU, Segmentierungseinheit und Gleitkommaeinheit steuert. Decodier- und Ausführungseinheit sind bereits Teil der fünfstufigen i486-Pipeline, auf die ich im weiteren Verlauf zurückkommen werde. Manche Befehle werden durch das teilweise festverdrahtete Leitwerk (Steuereinheit) des i486 aber nicht mehr durch ein Mikroprogramm, sondern unmittelbar ausgeführt. Im Befehlsstrom vorhandene unmittelbare Operanden oder Displacements trennt der Prefetcher ab und gibt sie an die ALU bzw. die Adressierungseinheit, die aus der Paging- und Segmentierungseinheit besteht, weiter. Die eingelesenen Datenbytes werden zur Segmentierungseinheit, den Registern, der ALU oder der Geitkommaeinheit übertragen und dort verarbeitet. Die beiden 32-Bit-Datenbusse bilden einen 64-Bit-Datenbus zur Übertragung von Daten zwischen dem CPU-Kern entsprechend dem 80386 und der Gleitkommaeinheit entsprechend dem i387. Im Gegensatz zur Kombination 80386/i387 sind daher zur Übergabe von Daten und Opcodes zwischen CPU und Coprozessor keine I/O-Buszyklen notwendig, außerdem läuft die Datenübergabe intern mit einer Breite von 64 Bit gegenüber dem 32-Bit-Datenbus beim 80386/i387 ab. Das macht sich natürlich in der Ausführungsgeschwindigkeit von Gleitkommabefehlen bemerkbar, der i486 arbeitet ESC-Befehle erheblich schneller ab als die Kombination 80386/i387. Zur Adressbildung verwendet der i486 wie alle früheren Mitglieder der 80x86-Familie ein Segment- und ein Offsetregister. In der Segmentierungseinheit werden die Inhalte der beiden Register zu einer linearen Adresse kombiniert. Gleichzeitig führt die Segmentierungseinheit im Protected Mode die relevanten Zugriffsprüfungen aus, um einen Schutz der einzelnen Tasks und des Systems zu gewährleisten. Bei aktivem Paging wird die in der Segmentierungseinheit ermittelte lineare Adresse schließlich noch in der Paging Unit in eine physikalische Adresse umgewandelt. Ohne Paging bedeutet die lineare Adresse gleichzeitig die physikalische Adresse. Die Busschnittstelle gibt dann die physikalische Adresse und gegebenenfalls die zu schreibenden Daten aus oder liest die adressierten Daten ein. Der i486 weist außerdem vier Schreibpuffer auf. Wenn der i486-Bus gerade nicht zur Verfügung steht, z.B. weil der i486 ein Cache-Line-Fill ausführt, schreibt der Prozessor die Daten zunächst in einen Schreibpuffer. Die Puffer können mit einer Geschwindigkeit von einem Schreibvorgang je Taktzyklus gefüllt werden. Die Daten werden in der Reihenfolge in den vier Puffern abgelegt, in der sie vom i486 ausgegeben werden sollen. Steht der Bus später zur Verfügung, so übertragen die Schreibpuffer die Daten selbstständig zum Bus. Steht der i486-Bus dagegen bei einem Schreibvorgang sofort zur Verfügung, werden die Schreibpuffer umgangen und die Schreibdaten unmittelbar an den Bus übergeben. Wenn der Schreibvorgang einen Cache-Treffer darstellt, werden die Daten in beiden Fällen sofort im On-Chip-Cache abgelegt. Zusätzlich kann der i486 die Reihenfolge von Lese- und Schreibzugriffen der Busschnittstelle verändern, um die Leistung weiter zu steigern. Das ist der Fall, wenn alle Schreibzugriffe, die in den Schreibpuffern auf ihre Abarbeitung warten, Cache-Treffer darstellen und der Lesezugriff ein Cache-Miss ist. Der i486 führt dann den Lesezugriff aus und erst anschließend die Schreibzugriffe. Das ist möglich, weil der Lesezugriff keine Speicherstelle betrifft, die von einem der Schreibzugriffe erst aktualisiert werden muss. Die Schreibpuffer erhöhen also die Leistung des i486-Busses bei mehreren aufeinanderfolgenden Schreibvorgängen. Wenn der Bus kurzzeitig nicht zur Verfügung steht, muss die CPU nicht warten, sondern schreibt die Daten einfach in den Puffer. Der 80386 besitzt demgegenüber keine Schreibpuffer, der Buszugriff kann sich verzögern, und die Leistung des 80386 ist dadurch geringer. Neben den Schreibpuffern weist der i486 auch noch einen Cache-Line-Fill-Puffer mit einer Breite von 128 Bit oder 16 Byte auf. Wenn nach einem Cache-Fehltreffer eine Cache-Line nachgeladen werden muss, schreibt die Busschnittstelle die 4-Byte-Portionen nicht unmittelbar in die betref-
Sandini Bib 226
Kapitel 8
fende Cache-Line, sondern zunächst in den Cache-Line-Fill-Puffer. Erst wenn dieser Puffer voll ist, also die gesamte Cache-Line aus dem externen Speicher gelesen worden ist, überträgt die Steuerlogik den Inhalt des Cache-Line-Fill-Puffers auf einmal in die entsprechende Cache-Line. Ich habe oben erwähnt, dass der i486 eine fünfstufige Befehls-Pipeline aufweist. Sie führt die Befehle aus und ist ein charakteristisches Element von RISC-Prozessoren. Im folgenden Abschnitt möchte näher auf dieses magische Kürzel eingehen.
8.3 RISC oder CISC ? Die beiden Schlagworte zur Kennzeichnung einer grundlegenden Mikroprozessor-Architektur lauten RISC und CISC, was für Reduced Instruction Set Computer und Complex Instruction Set Computer steht. Letzterer Ausdruck bezieht sich auf Mikroprozessoren wie die 80x86-Familie von Intel oder die 68000er-Generation von Motorola. Kennzeichnend für diese Prozessoren ist ihr geradezu gewaltiger Befehlsumfang von weit mehr als 300 Maschinenbefehlen, ihre komplexen Adressierungsmöglichkeiten und die Mikrokodierung der Prozessorbefehle. Demgegenüber weisen RISC-Prozessoren wie z.B. der i860 von Intel, die MIPS R2000, R3000 und R4000, SPARC-Prozessoren oder auch digitale Signalprozessoren (DSP) einen wesentlich geringeren, d.h. reduzierten Befehlsumfang auf. Die jahrelangen Diskussionen, welches Prinzip denn nun das Beste sei, werden mittlerweile nicht mehr derart hitzig geführt, denn wie so oft liegt die Lösung gewissermaßen in einem »Mix« beider Ansätze und schließlich gibt es nie das Beste in Reinkultur und was sich für die eine Anwendung als optimal darstellt, muss eben nicht für eine andere gelten.
8.3.1
Die Mikrokodierung
Befehle werden bei einer CPU für PCs in eine Prefetch-Queue eingelesen und von einer Dekodiereinheit dekodiert. Jeder Befehl wird nicht unmittelbar ausgeführt, sondern liegt als so genanntes Mikroprogramm in einem ROM innerhalb des Prozessors bereit. Das ist ein wesentliches Kennzeichen der CISCs. Ohne diese Mikroprogrammierung oder -Kodierung wären der umfangreiche Befehlssatz und die komplexen Adressierungsmöglichkeiten nicht zu realisieren. Der Prozessor muss die kodierten Bitströme nun intern verarbeiten, um die angeforderten Befehle mit den notwendigen Daten auszuführen. Außerdem erfordern die zahlreichen internen Schaltungen eine genaue Abstimmung ihrer Funktionen, was durch die Mikrokodierung von Maschinenbefehlen realisiert wird. Die Befehle werden in eine Prefetch-Queue eingelesen und die angeschlossene Dekodiereinheit dekodiert diese Bitströme daraufhin. Da jeder Befehl nicht unmittelbar ausgeführt wird, sondern eben als Mikroprogramm in einem Mikrocode-ROM vorliegt, ist innerhalb des Prozessors eine weitere Umsetzung notwendig, bis der Befehl auch tatsächlich ausgeführt wird und ein Ergebnis erzeugt. Abbildung 8.5 zeigt ein Schema des zugrundeliegenden Konzepts. Die Dekodiereinheit im Prozessor muss also den eingelesenen Befehl zunächst dekodieren, d.h. in den eigentlichen Befehl, die Adressierungsart, Umfang und Art der betroffenen Register etc. aufspalten. Diese Informationen sind im Opcode, Präfix, Operand und Displacement/Daten enthalten. In Abhängigkeit von den jeweiligen Werten ruft die Steuereinheit die erforderlichen Mikroprogramme auf, um den Befehl mit Hilfe der ALU, Register usw. auszuführen. Es leuchtet ein, dass auch der Dekodiervorgang und die Vorbereitungen zum Ausführen des Mikroprogramms eine gewisse Zeit benötigen. Die Dekodierzeit kann durchaus gleich lange oder sogar länger als die eigentliche Ausführungsdauer des Befehls sein.
Sandini Bib Alles in Einem – Der i486
227
Coprozessor
MikrocodeROM
Steuereinheit
MikrocodeQueue
Ausführungseinheit
Dekodiereinheit
Prefetch-Queue
Busschnittstelle
CISC-Mikroprozessor Register Register Register Register Register
ALU
Abb. 8.5: Bei der Mikroprogrammierung liest der Prozessor über die Busschnittstelle die Befehle in eine Prefetch Queue ein, die sie an die Dekodiereinheit weitergibt. Die Dekodiereinheit zerlegt einen Maschinenbefehl in eine Vielzahl elementarerer Mikrobefehle und übergibt sie an eine Mikrocode-Queue. Aus der MikrocodeQueue werden die Mikrobefehle an die Steuer- und Ausführungseinheit weitergegeben, sodass die ALU und Register entsprechend angesteuert werden.
Die Ausführungszeit eines Befehls setzt sich also aus der Dekodierzeit und der Ausführungsdauer für den Befehl zusammen (beachten Sie, dass die in Manuals angegebenen Zeiten im Allgemeinen reine Ausführungszeiten ohne Dekodierung entsprechen, d.h. der Befehl muss bereits in dekodierter Form vorliegen). Die Prefetch Queue spielt dabei neben der Entlastung der Busschnittstelle eine weitere wesentliche Rolle. Da in ihr die nächsten Befehle bereits vor der Abarbeitung des gegenwärtigen Befehls vorliegen, kann die Dekodiereinheit quasi auf Vorrat arbeiten und schon die nächsten Befehle dekodieren und zur Ausführung in der Steuereinheit vorbereiten, während diese noch mit dem gegenwärtigen Befehl beschäftigt ist. Eine große Prefetch-Queue steigert also die Leistungsfähigkeit des Prozessors. Das ist ein Grund dafür, dass der i486 mit seiner 32-Byte-Queue schneller als der 80386 mit einer Prefetch-Queue von nur 16 Byte ist. Wenn Sie sich vorstellen, dass sich ohne Prefetching für jeden Befehl noch die Befehlslese- und Befehlsdekodierzeit bemerkbar machen würden, dann erkennen Sie, welchen Performance-Gewinn man durch das relativ einfach zu realisierende Prefetching erzielt. Das funktioniert alles sehr gut, solange die Prefetch Queue laufend mit derselben Geschwindigkeit nachgefüllt wird, mit der der Prozessor die Befehle abarbeitet. Bei einem Sprung oder einem Prozeduraufruf, der über die Grenzen der Prefetch Queue hinausgehen – und das ist sehr häufig der Fall – muss der Prozessor seine Prefetch Queue leeren und an der Zieladresse mit dem Einlesen der neuen Befehlsbytes beginnen. Gleiches gilt natürlich auch für RET- oder IRET-Befehle. Ein Problem ist, dass der nächste Befehl nicht nur zuerst eingelesen, sondern auch dekodiert werden muss. Die Steuereinheit hat also bei einem Sprung oder Prozeduraufruf recht lange auf den nächsten dekodierten Befehl zu warten. Liegt das Sprungziel noch innerhalb der Queue und umfasst der Befehl auch nur wenige Bytes, sodass er bereits vollständig eingelesen worden ist, dann muss er nur noch dekodiert werden, der Befehlslesezyklus entfällt. Wird überhaupt kein Sprung ausgeführt (weil die Sprungbedingung für z.B. JNE nicht erfüllt ist), dann macht der Prozessor ohne Verzögerung weiter. Wenn Sie einmal mit einem Debugger ein compiliertes Programm untersuchen, so werden Sie feststellen, dass es vor lauter JMPs und CALLs nur so wimmelt, z.B. setzen Compiler die CASE-Anweisung der Sprache C häufig in eine Vielzahl von bedingten JMPs um. Liegt die Zieladresse außerhalb des Bereichs, der durch die Prefetch Queue
Sandini Bib 228
Kapitel 8
abgedeckt ist, muss der Prozessor also mit der Dekodierung von vorne beginnen. Die Umsetzung des Source-Codes in eine ungünstige Folge von JMP-Befehlen kann die Ausführungszeit eines Programms sehr nachteilig beeinflussen. Im Folgenden möchte ich kurz die ausgeführten Schritte für den Befehl MOVS/MOVSB/MOVSW/ MOVSD (Move Data from String to String) darlegen. Dieser Befehl gehört zu den mächtigen Maschinenbefehlen und ist typisch für einen CISC-Prozessor mit mikrocodierter Steuereinheit. IF (Befehl = MOVSD) OR (Doppelwortoperanden vorhanden) THEN OperandenGrösse <- 32; ELSE OperandenGrösse <- 16; FI; IF AdressGrösse = 16 THEN SI=SourceIndex und DI=DestinationIndex; ELSE ESI=SourceIndex und EDI=DestinationIndex; FI; IF Operation vom Byte-Typ THEN [DestinationIndex] <- [SourceIndex]; IF DF=0 THEN IncDec <- 1 ELSE IncDec <- -1 FI; ELSE IF OperandenGrösse = 16 THEN [DestinationIndex] <- [SourceIndex]; IF DF=0 THEN IncDec <- 2 ELSE IncDec <- -2 FI; ELSE [DestinationIndex] <- [SourceIndex]; IF DF=0 THEN IncDec <- 4 ELSE IncDec <- -4 FI; FI; FI; SourceIndex <- SourceIndex + IncDec DestinationIndex <- DestinationIndex + IncDec
Die einzelnen Operationen werden durch entsprechende Mikrocodes im Mikrocode-ROM dargestellt und von der Ausführungseinheit EU mit Hilfe von Logikgattern, ALU und Busschnittstelle ausgeführt. Sie sehen, dass für den Befehl MOVSx eine ganze Menge an internen Mikrobefehlen ausgeführt wird. Wird der Befehl durch ein Präfix REPxx mehrfach ausgeführt, so benötigt zwar die erste Ausführung von MOVSx acht Taktzyklen, jede folgende aber nur noch vier. Der gesamte IF-THEN-ELSE-FI-Block muss nämlich nur am Anfang durchlaufen werden, um die Operanden-, Adress- und IncDec-Größe festzulegen. Jeder folgende Durchlauf verschiebt nur noch die Daten vom Source- zum Destination-Operanden. Dafür genügen dann (einschließlich der Prüfung, ob bereits alle Wiederholungen abgeschlossen sind) vier Prozessortaktzyklen. Um diesen Ablauf als festverdrahtete Logik zu implementieren, wäre eine sehr komplexe Schaltung notwendig. Dagegen greifen die Mikrocodes auf dieselben Hardware-Logikelemente wiederholt zu. Die Ausführungseinheit weist einen Mikrobefehlszähler analog zum Befehlszähler EIP des »Gesamtprozessors« auf, der die Mikrobefehle im Mikroprogrammspeicher adressiert. Die Komplexität des Befehls MOVSx steckt also als binäre Kodierung im Mikrocode-ROM und nicht in einem Schaltungs-Layout. Ähnliche Gesichtspunkte führten ja auch zur Entwicklung
Sandini Bib Alles in Einem – Der i486
229
des Mikroprozessors oder frei programmierbaren Computers ganz allgemein. Auch dort wird eine einmal festgelegte und (relativ) einfache Schaltungsstruktur von einem Programm mehrfach benutzt, das in einem Speicher abgelegt ist. Ein Nachteil der Mikrokodierung ist sofort zu sehen: Die Ausführungsgeschwindigkeit ist viel geringer als bei einer direkten Implementierung in Hardware. Grund dafür ist z.B., dass viele Einzelschritte und Einzelentscheidungen notwendig sind (also viele Taktzyklen), während eine reine Hardware-Implementierung den ganzen Befehl in einem Rutsch erledigt. Bei derartigen Nachteilen der Mikroprogrammierung könnte man den Eindruck gewinnen, die Entwickler haben sich keine Gedanken gemacht. Dem ist natürlich nicht so, vielmehr ist die Mikroprogrammierung historisch entstanden und besitzt durchaus auch Vorteile. Ein großer Vorteil ist, dass bei einer sehr kompakten Befehlskodierung die Größe der Befehle und damit auch deren Speicherbedarf klein ist. In einem Byte können Sie bis zu 256 verschiedene Befehlscodes unterbringen, wenn man jede Abwandlung der Adressierungsart, beteiligten Register etc. als eigenständigen Befehl ansieht. Auch heute noch sind die meisten Mikroprozessoren (mit Ausnahme puritanisch-reiner RISCImplementierungen) ganz oder teilweise mikrokodiert. Auch der Pentium macht da keine Ausnahme. Zwar liegen hier die am meisten benutzten und relativ einfachen Befehle in festverdrahteter Form vor, die komplexen Befehle, wie z.B. der oben angegebene MOVSx, sind aber nach wie vor mikrokodiert. Ein weiterer Vorteil der Mikroprogrammierung ist, dass auf einfache Weise Kompatibilität mit früheren Prozessoren erreicht werden kann. Man muss ja nur den alten Code beibehalten und für leistungsfähigere neue Prozessoren weitere Befehle hinzufügen und zu diesem Zweck möglicherweise den Mikrocode-ROM auf dem Prozessor etwas vergrößern. Es verwundert nicht, dass die höheren Mitglieder der verschiedenen Prozessorfamilien immer mehr und immer leistungsfähigere Befehle aufwiesen – der Weg zu CISCs war also vorgezeichnet. Außerdem lassen sich durch die Mikrokodierung nachträglich ganz einfach Bugs in einer CPU ausbügeln, was heute jedes BIOS praktiziert und automatisch einen aktualisierten Mikrocode in das Mikrocode-ROM lädt, welches meist als Flash-Speicher ausgeführt ist. Zusammengefasst könnte man etwas salopp sagen, dass das Konzept der Mikroprogrammierung in gewisser Weise einem sehr einfachen BASIC-Interpreter ähnelt. Auch dort wird ein Befehl zuerst in seine Bestandteile aufgespaltet, d.h. interpretiert und dann entsprechend den so dekodierten Bestandteilen ausgeführt. Das Pendant zu den fest verdrahteten Befehlen in RISCProzessoren wäre dann ein compiliertes Programm. Die Befehle werden unmittelbar ohne weitere Einwirkung eines übergeordneten (Mikrocode-) Programms ausgeführt. Sie haben die Geschwindigkeitsunterschiede zwischen einem interpretierten und einem kompilierten BASICProgramm wahrscheinlich schon selbst erlebt. Es verwundert also nicht, dass RISC-Prozessoren ihre Befehle erheblich schneller als CISC-Prozessoren abarbeiten. Ein Faktor drei bis vier ist bei vergleichbaren Prozessoren durchaus realistisch. Abschließend möchte ich die wichtigsten Kennzeichen von CISC-Mikroprozessoren noch kurz zusammenfassen:
: : : : :
umfangreicher (komplexer) Befehlssatz komplexe und leistungsfähige Maschinenbefehle Mikrokodierung der Maschinenbefehle umfangreiche Adressierungsmöglichkeiten für Speicheroperanden relativ wenige, aber vielseitig verwendbare Register
Sandini Bib 230
8.3.2
Kapitel 8
Reduzierung auf das Wesentliche
Ein weiterer Grund für die Mikroprogrammierung war die wesentlich kürzere Zugriffszeit des Prozessor-ROMs mit den Mikrocodes gegenüber dem relativ teuren Speicher. Die Fortschritte bei der Speichertechnologie kehrte das Verhältnis von Zugriffszeit für den internen MikrocodeSpeicher und den externen Hauptspeicher langsam um. Durch die enorme Integration der Speicherchips und den einhergehenden Preisverfall sind heute die Prozessoren wesentlich teurer als der Speicher und es spielt kaum eine Rolle mehr, ob ein Befehlscode sehr kompakt oder etwas weniger kompakt ist. Eine eingehende statistische Untersuchung, die IBM Mitte der 70er Jahre ausführte, förderte unerwartete aber nachhaltig beeindruckende Ergebnisse zutage.
: :
Bei einem typischen Programm für CISC-Prozessoren nehmen nur ca. 20% der Befehle 80% der Programmzeit in Anspruch; In einigen Fällen läuft die Ausführung einer Folge einfacherer Befehle schneller als ein komplexer Maschinenbefehl mit derselben Wirkung ab.
Ursache des ersten Ergebnisses ist in erster Linie, dass die von einem Computer zu lösenden Aufgaben sehr unterschiedlich, aber im Prinzip recht einfach sind. Die komplexen Befehle zielen aber meist auf wenige, dafür hochkomplexe Vorgänge, die viel seltener auftreten. Dazu kommt natürlich noch, dass Programmierer mit einfacheren Befehlen meistens besser vertraut sind und diese entsprechend häufiger verwenden. Außerdem enthalten Programme außerordentlich viele Verzweigungen (manche Statistiken sprechen von einem Anteil der Jumps, Calls etc. am Programmcode von bis zu 30%). Die (recht einfachen) MOV-, TEST- und Verzweigungsbefehle bilden also das Gros der benutzten Maschinenbefehle. Für das zweite Ergebnis ist insbesondere die Dekodierzeit verantwortlich. Die von den Prozessorherstellern angegebenen Ausführungszeiten der Befehle gelten nämlich nur unter der Voraussetzung, dass der Befehl bereits dekodiert ist und zur Ausführung bereitsteht, die Dekodierzeit wird dabei nicht berücksichtigt. Bei einem komplexen Befehl kann die Dekodierung sehr lange dauern, sodass mehrere einfache und schneller zu dekodierende Befehle unter Umständen schneller abgearbeitet werden. Was liegt bei Betrachtung des ersten Ergebnisses aber näher, als die Zahl der Befehle auf die wirklich laufend benötigten 20% zu reduzieren und diese aber so zu optimieren, dass sie in wesentlich kürzerer Zeit ausgeführt werden können? Die Überlegungen führten zum Konzept der RISC-Prozessoren, die nicht mehr mikrokodiert sind, sondern bei denen jeder Befehl unmittelbar durch eine fest verdrahtete Logik ohne Eingriff eines Mikroprogramms ausgeführt wird. Damit können fast alle Befehle in einem einzigen Taktzyklus abgeschlossen werden. Der sehr einfache Befehl MOV reg, reg benötigt auf dem 80386 z.B. zwei Taktzyklen, auf dem i486 nur noch einen. Der i486 stellt in mancherlei Hinsicht einen Zwitter zwischen CISC- und RISC-Prozessoren dar. Die häufig benötigten Befehle sind in RISC-Manier fest verdrahtet und werden daher extrem schnell ausgeführt. Komplexere und weniger häufig benutzte Befehle liegen dagegen in mikrokodierter Form vor. Eine Folge einfacher Befehle kann also schneller als ein komplexer Befehl mit derselben Wirkung sein. Ausgeführt werden die Befehle in einer fünfstufigen Pipeline.
8.3.3
RISC-Kennzeichen auf Hardware-Ebene
Die verschiedenen RISC-Konzepte der einzelnen Hersteller unterscheiden sich natürlich etwas voneinander, viele Kernpunkte sind aber äquivalent:
: :
Reduzierung des Befehlssatzes Weniger komplexe und einfachere Maschinenbefehle
Sandini Bib Alles in Einem – Der i486
: : : : : :
231
Festverdrahtete Steuereinheit entsprechend den festverdrahteten Maschinenbefehlen Viele symmetrische Register, die als Registerdateien organisiert sind Befehls-Pipelining: die verzahnte Ausführung mehrerer Befehle Load-Store-Architektur: nur die Befehle Load und Store greifen auf den Speicher zu, alle anderen arbeiten mit prozessorinternen Registern. Einheit von RISC-Prozessor und Compiler: der Compiler wird nicht mehr nachträglich für einen bestimmten Chip entwickelt, sondern Chip und Compiler bilden von Vornherein eine Einheit. Ein modifiziertes Registerkonzept: für einen schnellen Aufruf von Unterprogrammen werden in manchen RISC-Prozessoren die Register nicht mehr statisch als ax, bx etc. verwaltet, sondern es existiert ein verschiebbares Registerfenster, das den »Blick« auf bestimmte Register-Files freigibt.
Verminderter Befehlssatz und festverdrahtete Befehle Unmittelbar mit dem Kürzel RISC hängt die Verringerung des ausufernden Befehlssatzes hochkomplexer CISCs zusammen. Einer der ersten Prototypen für die Implementierung des RISCKonzepts, der RISC-I, wies lediglich 31 Befehle auf, der etwas weiterentwickelte Nachfolger RISC-II immerhin schon 39. Die Einfachheit der Prozessorstruktur drückt sich in der geringen Anzahl von integrierten Transistoren aus: beim RISC-II sind es nur 41.000 (im Vergleich zu mehr als einer Million im i486 und drei Millionen beim Pentium). Interessant ist, dass die RISC-Prototypen häufig bereits einen On-Chip-Befehls-Cache aufwiesen, der wesentlich größer als der eigentliche Prozessor war. Auch beim i486 belegen die Support-Einheiten mehr Platz auf dem Prozessorchip als der CPU-Kern selbst. Neben dem verminderten Befehlssatz ist ein weiteres wesentliches Kennzeichen, dass die Befehle (oder besser: die Steuereinheit CU) festverdrahtet sind. Das bedeutet, dass bei einem RISC-Prozessor die Ausführungseinheit EU von der CU nicht mehr mit Hilfe eines mehr oder weniger umfangreichen Mikrocodes gesteuert wird. Stattdessen liegt der gesamte Ablauf als festverdrahtete Logik vor. Das beschleunigt die Abarbeitung eines Befehls ganz erheblich. Die Komplexität eines Multiplikationsbefehls liegt bei einem CISC in einem umfangreichen Mikrocode, der die ALU ansteuert. Dagegen haben die Entwickler bei einer RISC-CPU die Komplexität in ein aufwändiges Hardware-Multiplizierwerk gesteckt. Multiplikationen werden in CISCs typischerweise auf viele Additionen und Verschiebungen zurückgeführt, ein RISC-Multiplizierwerk erledigt das dagegen in einem (oder höchstens zwei – je nach Genauigkeit) Durchlauf. Durch die geringere Anzahl von Maschinenbefehlen sind ja schließlich Kapazitäten für die Implementierung solch hochkomplexer Schaltungen frei geworden. Befehls-Pipelining Für die meisten Maschinenbefehle ist die Struktur der Befehlsausführung durch die grundlegenden Arbeitsprinzipien von Mikroprozessoren sehr ähnlich. Im Allgemeinen müssen folgende Schritte ausgeführt werden:
: : : : :
Befehl aus dem Speicher lesen (Befehlsholphase oder Befehls-Fetching) Befehl dekodieren (Dekodierphase) Operanden holen, falls notwendig (Operandenholphase) Befehl ausführen (Ausführungsphase) Ergebnis zurückschreiben (Abspeicherungsphase)
Sandini Bib 232
Kapitel 8
In der Dekodierphase wird der Befehl dekodiert, und im Allgemeinen werden hier auch die Operandenadressen ermittelt. Bei einem CISC-Prozessor wird der Befehlsleseschritt von der Busschnittstelle und dem Prefetcher ausgeführt, sobald genügend Platz in der Prefetch-Queue ist. Auch der zweite Schritt, die Dekodierung des Befehls, wird noch vor der eigentlichen Befehlsausführung von der Dekodierungseinheit ausgeführt und der dekodierte Mikrocode steht dann in einer Mikrocode-Queue bereit. Die restlichen drei Schritte werden nun von der Ausführungseinheit (EU) unter der Steuerung der CU mittels Mikrocode ausgeführt. Dafür reicht natürlich normalerweise ein einziger Taktzyklus nicht aus oder der Taktzyklus muss sehr lang sein, d.h. die Taktfrequenz sehr niedrig sein.
Befehlsholstufe
Dekodierstufe
Operandenholstufe
Ausführungsstufe
Abspeicherungsstufe
Maschinenbefehle eignen sich dadurch sehr gut für eine Pipelined-Verarbeitung. Betrachten wir zum Vergleich einmal das bereits bekannte Adress-Pipelining. In einem vollständigen Buszyklus treten mindestens zwei voneinander recht unabhängige, sequenzielle Vorgänge auf: Adressierung und Datenübertragung. Eine Pipelined-Adressierung bedeutet nun, dass die Adressierungsphase des folgenden Buszyklus mit der Datenübertragungsphase des gegenwärtigen Buszyklus überlappt. Übertragen auf das Befehls-Pipelining ergibt sich, dass die oben angeführten fünf grundlegenden Phasen für aufeinanderfolgende Befehle um jeweils eine Stufe gegeneinander verschoben sind.
Zyklus n
Befehl k
Befehl k-1
Befehl k-2
Befehl k-3
Befehl k-4
Ergebnis k-4
Zyklus n+1
Befehl k+1
Befehl k
Befehl k-1
Befehl k-2
Befehl k-3
Ergebnis k-3
Zyklus n+2
Befehl k+2
Befehl k+1
Befehl k
Befehl k-1
Befehl k-2
Ergebnis k-2
Zyklus n+3
Befehl k+3
Befehl k+2
Befehl k+1
Befehl k
Befehl k-1
Ergebnis k-1
Zyklus n+4
Befehl k+4
Befehl k+3
Befehl k+2
Befehl k+1
Befehl k
Ergebnis k
Zyklus n+5
Befehl k+5
Befehl k+4
Befehl k+3
Befehl k+2
Befehl k+1
Ergebnis k+1
Abb. 8.6: Jeder Befehl wird zur Ausführung in der fünfstufigen Pipeline in Teilschritte zerlegt, die innerhalb eines Taktzyklus ausgeführt werden. Dadurch benötigt z.B. der Befehl k zwar fünf vollständige Zyklen zur Ausführung, am Ausgang der Pipeline steht aber für jeden Zyklus ein Befehlsergebnis zur Verfügung.
Entscheidend für die Wirksamkeit des Befehls-Pipelinings ist nicht, dass pro Takt ein Befehl vollständig abgearbeitet wird, sondern nur, dass je Taktzyklus ein Befehl abgeschlossen wird. Was zunächst eine sprachliche Spitzfindigkeit zu sein scheint, hat erhebliche Konsequenzen. Die Befehlsausführung wird in eine feste Anzahl von Teilschritten zerlegt, wobei der Prozessor jeden Teilschritt in einer einzelnen Stufe einer Pipeline in nur einem Taktzyklus ausführt. Man erreicht
Sandini Bib Alles in Einem – Der i486
233
damit das gewünschte Ziel, nämlich Einzyklusmaschinenbefehle. Das bedeutet, dass (im Idealfall) jeder Maschinenbefehl innerhalb eines Prozessortaktzyklus ausgeführt wird oder anders ausgedrückt: Es ist nur ein Takt pro Befehl (Clock per Instruction) CPI=1 notwendig. In Abbildung 8.6 ist das zur Verdeutlichung grafisch dargestellt. Wie Sie aus der Abbildung sofort erkennen können, beginnt der Prozessor die Ausführung des n-ten Befehls bereits, wenn der (n-1)-te Befehl die erste Pipeline-Stufe verlassen hat. Mit anderen Worten startet die Steuereinheit die Befehlsholphase für den n-ten Befehl, sobald sich der (n-1)-t Befehl in der Dekodierphase befindet. Beim angegebenen Beispiel einer fünfstufigen Pipeline befinden sich also (im Idealfall) fünf Befehle gleichzeitig in der Pipeline, allerdings in sehr verschiedenen Ausführungsphasen. Nimmt man einmal in optimistischer Weise an, dass pro Befehlsphase ein Prozessortaktzyklus PCLK notwendig ist, dann wird ein Befehl innerhalb von fünf Taktzyklen ausgeführt. Weil sich aber fünf Befehle gleichzeitig in der Pipeline befinden, die um jeweils einen Taktzyklus PCLK verschoben sind, steht bei eingeschwungener Pipeline (d.h. jede Stufe enthält einen Befehl in unterschiedlichem Stadium) für jeden Taktzyklus ein Befehlsergebnis bereit. Zwischen den einzelnen Pipeline-Stufen befindet sich im Allgemeinen ein Register, das als Ausgaberegister für die vorangehende Pipeline-Stufe und gleichzeitig als Eingaberegister für die nachfolgende Pipeline-Stufe dient. Ohne Befehls-Pipelining wird der n-te Befehl dagegen erst gestartet, beginnt die Befehlsholphase des n-ten Befehls also erst, nachdem der (n-1)-t Befehl vollständig abgeschlossen worden ist, also erst nach fünf Taktzyklen. Im Idealfall führt also allein die Überlappung der Befehle in der Pipeline zu einem Geschwindigkeitszuwachs um den Faktor fünf (!), ohne dass die Taktfrequenz erhöht werden muss. Die in Abbildung 8.6 gezeigte fünfstufige Pipeline ist nur ein Beispiel. Bei manchen Prozessoren werden z.B. die Dekodier- und Operandenholphase (die ja eng mit der Dekodierphase verknüpft ist) zu einer einzigen Phase zusammengefasst, die in einer einzigen Pipeline-Stufe ausgeführt wird. Ergebnis wäre eine vierstufige Pipeline. Auf der anderen Seite können die einzelnen Befehlsphasen noch weiter in elementarere Teilphasen aufgespaltet werden, die durch ihre Einfachheit schneller abgearbeitet werden. Dadurch lässt sich die Taktfrequenz weiter erhöhen. Solche Strategien führen zu Superpipelined-Architekturen mit sehr vielen Pipeline-Stufen (zehn und mehr). Erst das macht eine Taktfrequenz von 300 MHz beim Alpha und 200 MHz beim Pentium und PentiumPro möglich. Eine andere Möglichkeit, die Leistung eines RISC-Mikroprozessors mit Befehls-Pipelining zu steigern, ist, mehrere Pipelines zu integrieren, die parallel arbeiten. Man erhält auf diese Weise einen Superskalar; ein Vertreter wäre der Pentium mit zwei parallel arbeitenden Pipelines. Sie können sich sicher vorstellen, dass dadurch der Abstimmungsaufwand der Komponenten untereinander sehr kompliziert wird. Hier müssen nämlich nicht nur die einzelnen Pipeline-Stufen kooperieren, sondern auch noch die verschiedenen Pipelines untereinander. Pipeline-Hemmungen oder Interlocks Ein Problem für die Implementierung des Befehls-Pipelinings erkennt man z.B. an den beiden aufeinander folgenden Befehlen: ADD eax, [ebx+ecx] MOV edx, [eax+ecx]
Der Wert des Registers eax für die Berechnung der Adresse des zweiten Operanden im MOVBefehl ist erst nach der Ausführungsphase des ADD-Befehls bekannt. Auf der anderen Seite befindet sich der MOV-Befehl aber bereits in der Dekodierphase, in der die Operandenadresse [eax+ecx] erzeugt werden soll, während der MOV-Befehl noch in der Ausführungsphase steckt. Die Dekodierstufe kann zu diesem Zeitpunkt die Operandenadresse also noch gar nicht bestim-
Sandini Bib 234
Kapitel 8
men. Die Steuereinheit der CPU muss solche Daten- und Registerabhängigkeiten, die zu PipelineHemmungen oder Interlocks führen, erkennen und geeignet darauf reagieren. Das Problem tritt immer dann auf, wenn ein späterer Befehl n+1 (oder auch n+2) in einer früheren Pipeline-Stufe das Ergebnis des Befehls n aus einer späteren Pipeline-Stufe benötigt. Am einfachsten ist es, die Operandenberechnung in der Dekodierphase einfach um einen Taktzyklus zu verzögern. Das Berkeley-RISC-Konzept verwendet dazu Scoreboarding. Jedem Prozessorregister ist ein Bit zugeordnet, wobei die Steuereinheit für Maschinenbefehle, die ein Prozessorregister referieren, das Bit setzt, um anzuzeigen, dass der Registerwert noch nicht definiert ist. Erst wenn das Register in der Ausführungsphase beschrieben wird und dadurch einen gültigen Inhalt bekommt, setzt die Steuereinheit das Bit zurück. Ein nachfolgender Befehl, der dieses Register als Operandenquelle benötigt, prüft, ob das Scoreboarding-Bit gesetzt, d.h. der Inhalt nicht definiert ist und die Steuereinheit hält die Abarbeitung des neuen Befehls so lange an, bis die Abspeicherungsstufe das Register schreibt und das zugehörige Scoreboarding-Bit gelöscht hat. Eine weitere Möglichkeit, Interlocks zu behandeln, bieten optimierende Compiler. Sie können einfach NOPs (No-Operation Opcodes) zwischen die eigentlichen Befehle einfügen, um den nachfolgenden Befehl implizit zu verzögern oder den Programmcode so umordnen, dass solche Hemmungen erst gar nicht auftreten. An dieser Stelle wird bereits deutlich, dass bei RISCs Hardware und Software von vornherein eine Einheit bilden müssen. Registerabhängigkeiten können durch ein Register-Bypassing vermindert werden. Dazu führt z.B. die ALU das Ergebnis eines ALU-Befehls gleichzeitig der letzten Pipeline-Stufe (Zurückschreiben des Befehlsergebnisses) und dem Eingang der Logikeinheit zu, die das ALU-Ergebnis als Nächstes benötigt. Dadurch steht das ALU-Ergebnis für den folgenden Befehl früher zur Verfügung und die Operandenholphase entfällt. Derartige Abstimmungen der Pipeline-Stufen sind natürlich sehr kompliziert und der Hardware-Aufwand steigt zusätzlich an. Die Bypassing- und Forwarding-Techniken sparen also allgemein Lese- und Schreibzugriffe auf Register ein, die keine logischen Operationen beinhalten. Die Probleme mit Pipeline-Hemmungen eskalieren bei den Superskalar-Prozessoren geradezu: Hier können Datenabhängigkeiten nicht nur zwischen den einzelnen Stufen einer Pipeline, sondern zusätzlich noch zwischen den Stufen verschiedener Pipelines auftreten. Der Pentium betreibt aus diesem Grund seine beiden Pipelines nur für so genannte »einfache« Befehle, die von vornherein die Wahrscheinlichkeit von Datenabhängigkeiten vermindern. Wenn im Befehl ein Speicheroperand auftritt, muss die CPU den Operanden aus dem Cache oder noch ungünstiger aus dem Hauptspeicher holen. Selbst ein Zugriff auf den äußerst schnellen On-Chip-Cache benötigt einen Taktzyklus. Muss der Operand dagegen aus dem langsamen DRAM-Hauptspeicher geholt werden, sind erheblich mehr zusätzliche Taktzyklen notwendig. Die Weiterleitung des Befehls von der Operandenhol- zur Ausführungsstufe muss dann entsprechend verzögert werden. Alternativ kann der Prozessor auch NOPs ausführen. Beide Strategien verlangsamen aber die Programmausführung. Reine RISC-Implementierungen weisen eine Load/Store-Architektur auf, bei der nur die beiden Befehle Load und Store auf den Speicher zugreifen. Alle anderen Befehle (wie z.B. ADD oder MOV) referieren dagegen nur interne Prozessorregister (Befehle wie ADD reg, mem sind also nicht möglich). Aber auch die Load/Store-Architektur führt zu solchen Delayed Loads, nicht nur Befehle mit umfangreicher Adressierung, wie der oben erwähnte Befehl ADD eax, [ebx+ecx].
Sandini Bib Alles in Einem – Der i486
235
Horizontales Maschinenbefehlsformat Die wenigen und einfachen Befehle und insbesondere die bei RISCs übliche Load/Store-Architektur ermöglichen ein horizontales Maschinenbefehlsformat und eine einheitliche Länge der Maschinenbefehle. Das bedeutet, dass den einzelnen Stellen im Opcode (fast) immer dieselbe Bedeutung zukommt. Das reduziert den Dekodierungsaufwand erheblich, die Dekodierphase kann also verkürzt und die Dekodierstufe der Pipeline vereinfacht werden. Beispielsweise verwendet der i860 generell ein 32-Bit-Befehlsformat mit festgelegter Aufteilung in einzelne Felder. CISCs verwenden dagegen im Allgemeinen ein vertikales Maschinenbefehlsformat, das sich durch große Kompaktheit, aber auch starke Kodierung auszeichnet. Dadurch weisen die Opcodes eine unterschiedliche Länge auf (beim i486 zwischen einem Byte für NOP und maximal 15 Byte). Besonders auffallend sind bei den x86-Prozessoren die Präfixe und die verschiedenen Adressierungsarten. Die Dekodierung solch hochcodierter Befehlsformate kann nur noch mit Hilfe von Mikrocodes ausgeführt werden, weil die notwendige Dekoderschaltung zu kompliziert würde. Registerdateien Ich habe bereits mehrfach erwähnt, dass schnelle Prozessoren durch Speicherzugriffe erheblich gebremst werden. Vor allem der langsame Hauptspeicher sollte möglichst wenig angesprochen werden. Mit anderen Worten müssen also so viele Operanden wie möglich im Prozessor selbst bereitgehalten werden. Das erfordert eine große Zahl von Prozessorregistern. Am besten macht man aus der Not eine Tugend und wirft das alte Konzept individueller Vielzweckregister über Bord, das von den CISCs stammt (eigentlich nur eine Folge der beschränkten Integrationsmöglichkeiten vor zwanzig Jahren). Moderne RISC-CPUs besitzen daher Registerdateien oder Register-Files. Sie umfassen typischerweise 32 bis 2048 Register mit einheitlichen Eigenschaften. Es sind also keine Spezialregister (wie z.B. ECX beim i486 zur Schleifendurchlaufzählung) vorhanden. Eine einzige Vielzweckregisterdatei ist die einfachste Registerstruktur für einen RISC-Prozessor (siehe Abbildung 8.7[a]). Sie besteht aus einem Stapel von z.B. 32 Registern, ähnlich wie wir das bereits beim i387 mit seinen acht Gleitkommaregistern FP(0) bis FP(7) kennen gelernt haben. RISC-Prozessoren nach dem Stanford-Konzept (z.B. R2000 bis R6000) arbeiten im Allgemeinen mit einer solchen Registerdatei. Um das Problem der Abspeicherung ganzer Register-Files im Fall eines Subroutinenaufrufs zu umgehen, implementieren manche RISC-CPUs so genannte Mehrfachregisterdateien oder Mehrfachregister-Files. In diesen steht für jedes Schachtelungsniveau eine eigene, vollständige logische Registerdatei zur Verfügung, die durch einen Registerdateizeiger verwaltet wird (siehe Abbildung 8.7[b]). Bei einem CALL wird der Registerdateizeiger einfach um eine Datei weitergeschaltet (hochgezählt) und zeigt dann auf eine zu diesem Zeitpunkt noch unbenutzte Registerdatei, die der aufgerufenen Subroutine zugewiesen wird. Dadurch werden zusätzlich die Abspeicherungen der Registerwerte im Speicher bei einem CALL unnötig. Kehrt das Programm durch ein RETURN von der Subroutine zum aufrufenden Programm zurück, dann schaltet die CPU einfach den Registerdateizeiger um ein Schachtelungsniveau zurück und das Programm »sieht« dann wieder die alten Registerwerte.
Sandini Bib Kapitel 8
reg31 reg30 reg29
reg1 reg0
(a)
Registerdateizeiger
Hauptroutine
Subroutine 1. Ebene
Subroutine 2. Ebene
236
reg31 reg30 reg29
reg1 reg0 reg31 reg30 reg29
reg1 reg0 reg31 reg30 reg29
reg1 reg0
(b)
Abb. 8.7: Verschiedene Registerdateistrukturen: (a) einfache Registerdatei (b) mehrere logische Registerdateien für jeweils ein Schachtelungsniveau; eine physikalische Registerdatei
Das Konzept der Registerdateien lässt sich noch weiter fortsetzen. Es gibt z.B. teilüberlappende Registerdateien innerhalb einer Mehrfachregisterdatei. Dadurch werden die Eingangsparameter einer Subroutine in den physikalisch identischen Registern der aufrufenden Routine als Ausgangsparameter gespeichert. Außerdem können im Prinzip auch mehrere Mehrfachregisterdateien gebildet sein, die z.B. verschiedenen Tasks zugeordnet sind. Mit zunehmender Anzahl von Registern verwischen sich die Unterschiede zwischen einer Registerdatei und einem DatenCache zusehends.
8.3.4
RISC-Kennzeichen auf Software-Ebene
RISC-Maschinen als Implementierung von Hochsprachenarchitekturen verlangen die Unterstützung optimierender Compiler, um überhaupt eine hohe Leistung zu erzielen. Assembler spielen hier fast keine Rolle, weil die Code-Optimierung für eine Befehls-Pipeline sehr schwierig und vom Assembler-Programmierer kaum zu bewerkstelligen ist. Für die Entwicklung von optimalem Code wären sehr viele Prüfläufe unter unterschiedlichen Bedingungen notwendig. Ohne Hochsprachen müsste sich ein Anwendungsprogrammierer z.B. um die technischen Details der Pipeline und deren Hemmungen kümmern – eine sehr aufwändige und dadurch auch fehleranfällige Aufgabe. RISC-Prozessor und Compiler als untrennbare Einheit Ein wesentliches Charakteristikum des RISC-Konzepts ist die Einheit von Prozessor und Compiler. Bisher war es üblich, dass ein Entwicklungsteam den Prozessor und ein anderes Compiler und System-Software entwickelte. Der Dialog zwischen Prozessor und Software erfolgte über eine definierte Schnittstelle, nämlich den Befehlssatz des Prozessors. Bei den heutigen RISC-Konzepten bilden Prozessor und Compiler von vornherein eine Einheit. In den RISC-Chips werden
Sandini Bib Alles in Einem – Der i486
237
nur Befehle aufgenommen, die dem Compiler die Arbeit erleichtern und die Programmausführung beschleunigen. Die Homogenität von Compiler und Prozessor erlaubt wesentlich effektivere Programmoptimierungen durch den Compiler, als das bei herkömmlichen CISC-Prozessoren mit aufgepfropften Compilern möglich ist. Die frühzeitige Abstimmung von Hardware-Entwurf und Maschinenbefehlssatz ist wegen der Festverdrahtung der Steuereinheit unumgänglich. Eine Änderung des Befehlssatzes oder auch einzelner Maschinenbefehle erfordert einen kompletten Neuentwurf der Steuereinheit – ein ziemlich aufwändiges Unterfangen. Bei den mikrocodierten Leitwerken der CISC-Prozessoren kann der Mikrocode dagegen auch nach dem Hardware-Entwurf noch in gewissen Grenzen verändert werden, indem man einfach den Inhalt des Mikrocode-ROMs entsprechend anpasst. Dadurch können z.B. noch ein paar neue Befehle eingefügt oder bereits implementierte abgewandelt werden, ohne die Steuereinheit der CPU wesentlich verändern zu müssen. Delayed Jump, Delayed Branch und Branch Delay Slots Sprung- und Verzweigungsbefehle machen einen großen Teil aller Maschinenbefehle aus (nach statistischen Untersuchungen etwa 30%). Sie haben aber eine sehr unangenehme Folge für das Befehls-Pipelining. Die Befehlsholphase findet in der ersten Pipeline-Stufe statt, der aktuelle Befehlszählerwert gibt die Adresse des zu holenden Befehls an. Tritt nun ein Sprung oder eine Verzweigung auf, d.h. führt der Verzweigungsbefehl zu einer neuen Befehlsadresse, so ist erst nach seiner Ausführungsphase dieser neue Wert für den Befehlszähler bekannt. Das bezeichnet man als Delayed Jump oder Delayed Branch, weil der Sprung bzw. die Verzweigung mit Verzögerung ausgeführt wird. Während der Sprung- oder Verzweigungsbefehl die Pipeline durchlaufen hat, sind bereits mehrere neue Befehle in die Pipeline geladen worden. Falls der Prozessor den Sprung nicht ausführt, ergibt sich kein Problem, weil die Programmausführung ja sequenziell fortgesetzt wird. Völlig anders ist das aber, wenn der Sprung oder die Verzweigung tatsächlich ausgeführt wird. Der Prozessor hat dann nämlich abhängig von der Pipeline-Länge mehrere Befehle zumindest teilweise ausgeführt, die aber aufgrund der Verzweigung eben nicht ausgeführt werden sollen. Das kann zu erheblichen Problemen führen. Beispielsweise befindet sich der auf den Sprungbefehl folgende Befehl bereits in der Ausführungsphase, in der möglicherweise Prozessor-Flags oder andere Dinge verändert werden, während in der Abspeicherungsphase des Sprungbefehls der Wert des Befehlszählers geändert wird. Die Steuereinheit muss also dafür sorgen, dass solche Auswirkungen nicht auftreten können und die Pipeline bei einem ausgeführten Sprungbefehl leeren. Alternativ kann der Compiler auch ein oder mehrere NOPBefehle unmittelbar hinter dem Sprungbefehl einfügen, die ja keinerlei Auswirkungen haben. Dieses Verfahren ist in Abbildung 8.8 schematisch dargestellt. Beachten Sie, dass sich die NOPs im sequenziellen Steuerfluß und nicht am Sprungziel befinden. Das bedeutet, dass der Prozessor die NOPs immer mehr oder weniger vollständig ausführt, unabhängig davon, ob der Sprung ausgeführt wird oder nicht. Eine bessere Möglichkeit besteht in der Umordnung des erzeugten Codes, sodass der Prozessor anstelle der NOPs sinnvolle Befehle ausführen kann, ohne Unsinn zu erzeugen. Die Stellen, an denen zuvor die NOPs standen, werden als Branch Delay Slots bezeichnet, in die der Compiler einen oder mehrere Befehle einsetzen kann. Das verdeutlicht nochmals, dass eine Einheit von Hardware und Software in wesentlich höherem Maße als bei CISCs notwendig ist (obwohl auch dort wegen der Prefetch Queue und der Dekodierung der Befehle eine mehr oder weniger intelligente Anordnung der Sprungbefehle die Performance erheblich beeinflussen kann). Sind Compiler und CPU nicht aufeinander abgestimmt, treten Leistungseinbußen auf, die 50% und mehr betragen können. Der Pentium implementiert aus diesem Grund viele Support-Funktionen, damit Soft-
Sandini Bib 238
Kapitel 8
Befehlsholstufe
Dekodierstufe
Operandenholstufe
Ausführungsstufe
Abspeicherungsstufe
ware-Hersteller Compiler oder auch unmittelbar Anwendungsprogramme mit höchstmöglicher Leistung erzeugen können. Von den Support-Funktionen wäre in erster Linie das Performance Monitoring zu nennen, mit dessen Hilfe z.B. die Trefferraten in den Caches, die Häufigkeit von Interlocks und viele andere Dinge erfasst werden können.
Zyklus n
JMP
ADD
...
...
...
Zyklus n+1
NOP
JMP
ADD
...
...
Zyklus n+2
NOP
NOP
JMP
ADD
...
Zyklus n+3
NOP
NOP
NOP
JMP
ADD
Zyklus n+4
NOP
NOP
NOP
NOP
JMP
Zyklus n+5
AND
NOP
NOP
NOP
NOP
Abb. 8.8: Delayed Branch mit eingeschobenen NOPs: Ohne Pipelining und Delayed Branch würde der Prozessor unmittelbar nach dem Verzweigungsbefehl mit dem ersten Befehl am Sprungziel (hier: AND) weitermachen. Durch das Befehls-Pipelining müssen aber nach dem JMP-Befehl mehr oder weniger NOPs eingesetzt werden (bei der fünfstufigen Pipeline vier NOPs), damit der Prozessor keine falschen Ergebnisse liefert. Erst im Zyklus n+4 führt der Prozessor die Abspeicherung des Befehlsergebnisses aus, d.h. er schreibt den Befehlszähler mit der Sprungadresse. Dadurch kann der Befehl AND an der Zieladresse erst im Zyklus n+5 auftauchen.
8.4 Die Pipeline Beim i486 können die verschiedenen CPU-Einheiten in dem Sinne parallel arbeiten, dass sich z.B. ein Befehl bereits in der Ausführungsphase befindet, während der folgende noch dekodiert und der zweite folgende erst gelesen wird. Die i486-Pipeline besteht daher mehr aus einer relativ losen Kopplung der einzelnen Funktionseinheiten und weniger aus dem stark gekoppelten Modell der Abbildung 8.6. Eine Ursache ist die sehr unterschiedliche Komplexität und Ausführungszeit der einzelnen Befehle (was sich z.B. bereits in einem sehr unterschiedlichen Dekodieraufwand widerspiegelt). Durch die parallele Operation von Prefetcher, Dekodier- und Ausführungseinheit sowie einer Registerschreibstufe wird aber ein Befehls-Pipelining ausgeführt. Eine »richtige« RISC-Pipeline, d.h. eine Pipeline mit stark gekoppelten Stufen wird erst beim Pentium realisiert. In Abbildung 8.9 sehen Sie die funktionale Struktur der i486-Pipeline.
Sandini Bib
Zyklus n
Zyklus n+1
Zyklus n+2
Zyklus n+3
Zyklus n+4
Registerschreibstufe
Ausführungsstufe
Dekodierstufe 2
239
Dekodierstufe 1 (Speicherzugriff)
Prefetch- oder Befehlsholstufe
Alles in Einem – Der i486
ADD eax, mem32
ADD dekodieren, mem32 holen
ADD weiter dekodieren
eax und mem32 addieren Ergebnis in eax schreiben
Abb. 8.9: Die i486-Pipeline umfasst eine Prefetch-, zwei Decodier-, eine Ausführungs- und eine Registerschreibstufe. Die Abbildung zeigt als Beispiel die Ausführung des Befehls ADD eax, mem32.
Die erste Pipeline-Stufe – die Prefetch- oder Befehlsholstufe – liest 16-Byte-Befehlsblöcke aus dem Speicher in die Prefetch Queue und gleichzeitig in den On-Chip-Cache ein. Der i486 kann dazu den Burst-Modus verwenden (siehe Kapitel 8.6). Insgesamt ist in der Prefetch Queue Platz für zwei solcher 16-Byte-Einheiten; sie umfasst 32 Byte und ist damit doppelt so groß wie beim 80386. Die Dekodiereinheit bildet die zweite und dritte Stufe der i486-Pipeline. Sie wandelt einfache Maschinenbefehle direkt in Steuersignale für die Steuereinheit und komplexere Maschinenbefehle in Mikrocode-Einsprungadressen um. Im zweiten Fall wird der Mikrocode dann zur Steuereinheit übertragen und steuert die Ausführung des Befehls. Von großer Auswirkung auf die Leistung der Pipeline ist, dass bereits die erste Dekodierstufe einen Speicherzugriff auslösen kann. Die Dekodierstufen eins und zwei entsprechen also der Dekodier- und Operandenholstufe im reinen RISC-Pipeline-Modell von Abbildung 8.6. Die zweistufige Dekodierung ist einerseits aufgrund der komplexen CISC-Befehle des i486 notwendig, führt aber auch zu einem erheblichen Performance-Vorteil, wenn Speicheroperanden geladen werden müssen. Die erste Dekodierstufe löst in diesem Fall bereits einen Speicherzugriff aus. Befinden sich die Operanden im On-Chip-Cache, so können sie in einem Taktzyklus aus dem On-Chip-Cache gelesen werden, während sich der Befehl in der zweiten Dekodierstufe befindet. Die Speicheroperanden stehen dadurch in der Ausführungsphase des Befehls zur Verfügung, ohne dass eine Pipeline-Hemmung auftritt. Das gilt auch für die Kombination aus einem Ladebefehl (MOV eax, mem32) und einem nachfolgenden Befehl, der den geladenen Operanden be- oder verarbeitet (z.B. ADD eax, ebx). Dem ADD-Befehl steht der in den Akkumulator EAX geladene Operand mem32 ohne Verzögerung zur Verfügung. Das gilt auch dann, wenn der ADD-Befehl einen Speicheroperanden enthält, wie das als Beispiel in Abbildung 8.9 dargestellt
Sandini Bib 240
Kapitel 8
ist. Dadurch unterstützt die i486-Pipeline wirkungsvoll existierenden Programmcode, der nicht im Hinblick auf eine Pipelined-Verarbeitung der Befehle optimiert worden ist, z.B. durch eine Codeumstellung. Neben dem Register-Register-Befehl MOV eax, ebx wird z.B. auch der Speicher-Register-Befehl MOV eax, mem32 in nur einem Taktzyklus ausgeführt. In der Ausführungsstufe interpretiert die Steuereinheit die Steuersignale oder die MikrocodeEinsprungadressen und steuert die ALU, Gleitkommaeinheit oder andere Logikelemente des i486 an, um den Befehl auszuführen. Das kann je nach Befehl einen oder auch mehrere Taktzyklen dauern. Die Ausführung des bereits dekodierten folgenden Befehls wird verzögert, bis der gegenwärtige Befehl vollständig ausgeführt worden ist. Die letzte Pipeline-Stufe schreibt das Befehlsergebnis in das Zielregister (wenn der Befehl ein Register als Ziel spezifiziert) oder ein Zwischenregister für die Ausgabe an den Speicher (wenn der Befehl einen Speicheroperanden als Ziel angibt) zurück. Exceptions und Software-Interrupts werden vom i486 erkannt, wenn die entsprechenden Befehle in der Ausführungsstufe der Pipeline ausgeführt werden. Alle Befehle, die sich bereits in einer der folgenden Pipeline-Stufen befinden, werden abgeschlossen, die Befehle in der Prefetch- und Dekodierstufe dagegen storniert. Beim 80386 ohne Pipeline muss der Prozessor keine Befehle invalidieren. Externe Hardware-Interrupt-Anforderungen sind dagegen asynchron und werden durch ein Signal mit einem entsprechenden Pegel an einem Interrupt-Eingang getriggert. Dazu ist es notwendig, dass der i486 die Interrupt-Eingänge auch tatsächlich laufend prüft. Das geschieht immer dann, wenn er einen neuen Befehl in die Ausführungsstufe EX lädt. Wie bei einem Software-Interrupt oder einer Exception schließt der i486 alle Befehle ab, die sich bereits in einer der folgenden Pipeline-Stufen befinden und die Befehle in der Prefetch- und Dekodierstufe werden storniert. Der Interrupt wird bedient, wenn die vorangegangenen Befehle in der Pipeline abgeschlossen sind. Befehle, die mehrere Takte lang in der EX-Stufe bleiben oder auch PipelineHemmungen verzögern somit die Interrupt-Erkennung. Das ist beim 80386 ohne Befehls-Pipelining aber ähnlich. Der 80386 tastet die Interrupt-Eingänge ab, wenn er einen Befehl ausgeführt hat. Durch die stark schwankenden Ausführungszeiten der einzelnen mikrokodierten Befehle ist die durchschnittliche Interrupt-Latenzzeit deutlich größer als ein Prozessortaktzyklus. Beachten Sie auch, dass wie beim 80386 im Real Mode die ersten 1024 (1k) Byte für die Interrupt-Vektortabelle reserviert sind. Der i486 verwaltet diese Tabelle auch im Real Mode über das InterruptDeskriptor-Table-Register IDTR. Es speichert die Basisadresse und das Limit der Real-ModeDeskriptortabelle. Nach einem Prozessor-Reset wird das IDTR standardmäßig mit den Werten 00000000h für die Basis und 03ffh für das Limit geladen. Das entspricht exakt einer 1-KByteTabelle bei Segment 0000h, Offset 0000h. Mit Hilfe der beiden Befehle LIDT (Load IDTR) und SIDT (Store IDTR) können Sie diese Werte aber verändern und die Tabelle mit einer anderen Größe an einer beliebigen Stelle des Real-Mode-Adressraums ablegen. Achten Sie aber darauf, dass die Tabelle auch alle Vektoren für die möglicherweise auftretenden Interrupts aufnehmen kann. Sonst ist eine Exception 8 (zweifacher Fehler) die Folge.
8.5 Der On-Chip-Cache Wie ich bereits eingangs erwähnt habe, ist auf dem i486-Chip ein 8-KByte-Cache für Code und Daten vorgesehen. Er ist 4-Wege set-assoziativ organisiert und weist bei einer Cache-Line-Größe von 16 Byte 128 Sets auf. Im Burst-Modus kann eine Cache-Line über den 32-Bit-Datenbus in vier aufeinanderfolgenden Transferzyklen gelesen oder zurückgeschrieben werden.
Sandini Bib Alles in Einem – Der i486
241
Cache-Flushes können sowohl durch externe Hardware als auch durch Software-Befehle ausgelöst werden. Wird dem Anschluss FLUSH ein Signal mit niedrigem Pegel zugeführt, erfolgt eine hardware-initiierte Cache-Leerung. Der i486 schreibt dann alle modifizierten Lines im DatenCache in den Speicher zurück und führt einen Flush-Acknowledge-Zyklus aus. Für die CacheLeerung durch Software stehen die beiden Befehle INVD (Invalidate Data Cache) und WBINVD (Write Back and Invalidate Data Cache) zur Verfügung. In beiden Fällen treibt der i486 einen Flush-Sonderzyklus auf den Bus, um die Invalidierung anzuzeigen. Der Cache unterstützt zwar nicht das MESI-Protokoll mit seinen vier Zuständen, aber Invalidierungszyklen über die Signale AHOLD und EADS (siehe Kapitel 8.6.3). Für den i486-Cache ist durch die Hardware eine Write-Through-Strategie fest vorgegeben. Die Ersetzung von CacheLines im On-Chip-Cache erfolgt durch den Pseudo-LRU-Algorithmus, der in Abbildung 7.4 dargestellt ist. In Abbildung 8.10 sehen Sie den Aufbau der Tag- und Speichereinträge für den On-Chip-Cache.
Weg 3 ...... Weg 0
21-Bit-Tag-Adresse
Cache-Speichereintrag LRU
Cache-Directory-Eintrag
Weg 3 ...... Weg 0
val
3 LRU-Bits 4 Gültigkeitsbits
Daten
Daten
Daten
Daten
DW
DW
DW
DW
16Byte-Cache-Line
Abb. 8.10: Tag- und Speichereinträge des i486-Cache
Der On-Chip-Cache kann durch Löschen oder Setzen des CD-Bits im Steuerregister CR0 aktiviert oder stillgelegt werden. Die Struktur dieses Steuerregisters CR0 sehen Sie in Abbildung 8.11, die für den Cache maßgeblichen Bits sind hinterlegt. Die Auswirkungen der vier möglichen Kombinationen beider Steuerbits für den i486-On-ChipCache sind in der folgenden Auflistung zusammengefasst: 5
reserviert
4
3
2
1
0
NE ET TS EM MP PE
WP
18 17 16
reserviert
AM res
PG
CD NW
31 30 29
CR0
CD:Cache Disable 0=On-Chip-Caches aktiv 1=On-Chip-Caches deaktiviert NW:Not Write-Through 0=Write-Through-Strategie für Daten-Cache 1=Write-Back-Strategie für Daten-Cache Abb. 8.11: Die Struktur des Steuerregisters CR0
:
:
CD=0, NW=0 Lesezugriffe werden bei einem Treffer im Cache bedient. Fehltreffer lösen ein Cache-Line-Fill aus, wenn die Werte cachebar sind (KEN auf niedrigem Pegel). Der On-Chip-Cache arbeitet normal. Unabhängig von einem Cache-Treffer für einen Schreibzugriff treibt der i486 immer einen externen Schreibzyklus. Der Cache arbeitet dadurch mit einer Write-Through-Strategie. CD=0, NW=1 Diese Bitkombination ist ungültig.
Sandini Bib 242
: :
Kapitel 8
CD=1, NW=0 Lesezugriffe werden bei einem Treffer vom Cache bedient. Fehltreffer führen aber zu keinem Cache-Line-Fill, weil der Cache durch CD=1 deaktiviert ist. Schreibdaten erscheinen stets auf dem externen Bus. CD=1, NW=1 Lesezugriffe werden bei einem Treffer vom Cache bedient. Fehltreffer führen zu keinem Cache-Line-Fill, weil der Cache wie oben durch CD=1 deaktiviert ist. Schreibzugriffe können den Cache aktualisieren und werden stets auf den externen Bus getrieben.
Aus den Erläuterungen erkennen Sie, dass das CD-Bit lediglich Cache-Line-Fills deaktiviert, nicht aber die Cache-Funktion als solche. Soll der On-Chip-Cache wirklich stillgelegt werden, müssen Sie zusätzlich ein Cache-Flush auslösen. Dadurch werden alle Einträge invalidiert und es können keine Cache-Treffer mehr auftreten. CD=1 sperrt dann die sonst ausgelösten Line Fills. Sie können über die neuen PCD- und PWT-Bits im Page Directory- oder Page Table-Eintrag individuelle Pages als cachebar oder nicht-cachebar definieren. Dazu muss aber natürlich die Paging-Einheit PU aktiv sein. Auch im Steuerregister CR3 stehen zwei solche Einträge zur Verfügung, hier aber für das Page Directory. In Abbildung 8.12 sehen Sie die Struktur der Einträge die für das Caching maßgeblichen Bits sind hinterlegt. Ist das PCD-Bit gelöscht ist, können die Daten der Page in die On-Chip-Caches übertragen werden, d.h. es wird ein Cache-Line-Fill gestartet, wenn auch KEN auf einem niedrigen Pegel liegt. Ist das PCD-Bit dagegen gesetzt (gleich 1), dann können keine Daten der beschriebenen Page in die Caches geladen werden, selbst wenn dem durch ein niedriges KEN-Signal von Seiten der Hardware nichts im Weg steht. Wenn das PWT-Bit gleich 0, d.h. gelöscht ist, dann soll der Cache für die Daten der Page eine Write-Back-Strategie ausführen. Ist PWT gesetzt (gleich 1), dann verlangt die Page nach einer Write-Through-Strategie. Natürlich bleibt der Wert von PWT ohne Auswirkungen, wenn für die Page gar kein Caching ausgeführt wird oder die Hardware (wie hier beim i486) ein Write-Through vorsieht. In einem Speicherzugriff werden die effektiven Werte der PCD- und PWT-Bits über die Anschlüsse PCD bzw. PWT ausgegeben. Ein eventuell vorhandener L2-Cache kann die Signale dann dazu benutzen, seine eigene Cache-Strategie für den gegenwärtigen Speicherzugriff entsprechend anzugleichen. Page-Directory-Eintrag Page-Frame-Adresse
12 11
9
AVAIL
8
7
6
5
4
3
2
1 0
0 0 0 A
PCD PWT U/S W/R
16 15
31
8
4
P
Page-Table-Eintrag Page-Frame-Adresse
12 11
9
AVAIL
7
6
5
3
2
1 0
0 0 D A
PCD PWT U/S W/R
16 15
31
8
4
P
CR3-Register 16 15
Page-Directory-Basisregister (PDBR)
12 11
9
7
6
5
0 0 0 0 0 0 0
PCD: Page Cache Disable 0=Page cachebar PWT: Page Write-Through 0=Page verwendet Write-Back-Strategie
3
PCD PWT
31
2
1 0
0 0 0
1=Page nicht cachebar 1=Page verwendet Write-Through Strategie
Abb. 8.12: Page Directory-, Page Table-Einträge und Steuerregister CR3
Sandini Bib Alles in Einem – Der i486
243
8.6 Unterschiede und Gemeinsamkeiten von i486 und 80386/ 80387 Als Mitglied der 80x86-Familie ist der i486 natürlich abwärtskompatibel zur Kombination 80386 und dem mathematischen Coprozessor 80387. In den folgenden Abschnitten möchte ich Ihnen daher nur die Unterschiede gegenüber dem 80386/80387 erläutern und die internen Besonderheiten vorstellen.
8.6.1
Unterschiede in Registerstrukturen
Das Flag-Register des i486 (siehe Abbildung 8.13) ist um ein Flag erweitert worden, das AC- oder Alignement-Check-Flag, da im i486 eine Alignement-Prüfung implementiert worden ist.
31
18
r r r r r r r r r r r r r
AC
Ist das AC-Flag gesetzt, d.h. gleich 1, so löst der i486 bei einem Alignement-Fehler eine Exception entsprechend Interrupt 17 aus. Von der Alignement-Prüfung sind nur Programme mit der Privilegierungsstufe 3 betroffen, bei den anderen Privilegierungsstufen 0 bis 2 wird ein fehlerhaftes Alignement ignoriert. Alignement-Fehler treten beim Wortzugriff auf eine ungerade Adresse, einem Doppelwortzugriff auf eine Adresse, die kein Vielfaches von vier ist, oder einem 8-ByteZugriff auf eine Adresse, die kein Vielfaches von acht ist, auf. Alle anderen Flags haben eine unveränderte Bedeutung.
AC: V: R: N: IOP:
16 15
0
7
V R 0 N IOP O D I T S Z 0 A 0 P 1 C
Alignment Check O: Overflow (Überlauf) Virtual Mode D: Direction Resume I: Interrupt Enable Nested Task T: Trap I/O-Privilegierungsstufe
S: Z: A: P: C:
Sign (Vorzeichen) Zero (Null) Auxiliary Carry Parität Carry (Übertrag)
Abb. 8.13: Das EFlag-Register des i486
Neben der Steuerung des Cachings hat das Steuerregister CR0 auch noch andere Aufgaben und weist zu diesem Zweck einschließlich der Caching-Steuerbits fünf neue Bits auf. In Abbildung 8.14 sehen Sie die neue Struktur des Steuerregisters CR0. Alle neuen Bits sind hinterlegt. Wie bereits in Kapitel 8.5 erläutert wurde, steuern die Bits CD und NW den Betriebsmodus des On-Chip-Cache im i486. Ich möchte die Beschreibung hier nicht wiederholen. Über das AM-Bit können Sie bestimmen, ob das AC-Bit im EFlag-Register eine AlignmentException auslösen darf. Ein gesetztes AM-Bit erlaubt Exceptions, ein gelöschtes maskiert das AC-Flag, das AM-Bit besitzt also eine höhere Priorität als das AC-Flag. Mit dem Bit WP können Sie Pages, die im Page Table-Eintrag als nur-lesbar gekennzeichnet sind, vor einem Überschreiben durch einen Supervisor, d.h. ein Programm mit Privilegierungsstufe 0 bis 2, schützen. Beim 80386 dürfen dagegen nur-lesbare Pages von einem Supervisor prinzipiell überschrieben werden. Der wesentlich stärkere Schutzmechanismus über die Segmentierung im Protected Mode wird davon allerdings nicht berührt, er genießt weiterhin höhere Priorität. Mit dem WP-Bit können Segmentabschnitte zusätzlich vor einem Überschreiben geschützt werden, die Schutzmechanismen des Protected Modes schützen dagegen ganze Segmente und nicht nur Teile von diesen. Das ist für Betriebssysteme mit »flachen Speichermodellen«, wie z.B. Unix, von
Sandini Bib 244
Kapitel 8
großer Bedeutung, da dort nur ein Segment verwendet wird, das aber beim 80386/i486 bis zu 4 GByte groß sein kann. Mit dem WP-Bit können Sie den segmentweisen Schutz des segmentierten Speichermodells emulieren.
PG: CD: NW: AM: WP: NE: TS: EM: MP: PE:
5
reserviert
4
3
2
1
0
NE ET TS EM MP PE
WP
18 17 16
reserviert
AM res
PG CD NW
31 30 29
CR0
Paging 1=Paging aktiv 0=Paging deaktiviert Cache Disable 1=On-Chip-Cache deaktiviert 0=On-Chip-Cache aktiv Not Write-Through 1=Write-Throughs und Write-Invalidation-Zyklen deaktiviert 0=beide aktiv Alignment Mask 1=Alignment-Fehler sind maskiert 0=AC-Bit in EFlag erlaubt Alignment-Fehler Write Protect 1=nur-lesbare Pages werden vor Überschreiben durch Supervisor geschützt 0=Überschreiben erlaubt Numerics Exception 1=Gleitkomma-Exceptions werden durch Interrupt-Vektor 16 behandelt 0=Exceptions werden durch externen Interrupt behandelt Task Switch 1=Task Switch ist aufgetreten 0=kein Task Switch Emulation 1=Coprozessor durch Software emulieren 0=Coprozessor nicht emulieren Math Present 1=Coprozessor vorhanden 0=kein Coprozessor vorhanden Protection Enable 1=Protected Mode 0=Real Mode
Abb. 8.14: Das Steuerregister CR0
Das NE-Bit steuert das Verhalten des i486 beim Auftreten einer nicht maskierten numerischen Exception. Ist NE gesetzt, d.h. gleich 1, so wird die Exception über den Interrupt 16 behandelt, der i486 löst einen Interrupt 16 aus. Bei gelöschtem NE-Bit wird die Exception für eine Kompatibilität mit DOS-Systemen durch einen externen Hardware-Interrupt behandelt. Hierzu dienen die Signale IGNNE und FERR. Wird dem IGNNE-Eingang des i486 ein inaktives Signal, eines mit Pegel high, zugeführt, so aktiviert der Prozessor bei einem Gleitkommafehler das Signal FERR. Ein externer Interrupt-Controller kann das Signal empfangen und eine Hardware-Interrupt-Anforderung an den i486 auslösen, in deren Verlauf der Controller die Adresse des Handlers an den i486 übergibt. In PCs ist FERR mit IRQ13 identisch, es wird ein Interrupt 75h ausgelöst. Der aus Kompatibilitätsgründen vom i486 unterstützte Befehl LMSW verändert das Bit NE nicht. Beim 80386 ist das gegenstandslos, weil das NE-Bit erst mit dem i486 implementiert worden ist. Das beim 80386 noch veränderbare ET-Bit (Extension Type) zur Angabe des Coprozessors (i387, ET=1; 80287, ET=0) ist beim i486 durch eine feste Verdrahtung auf den Wert 1 entsprechend i387 festgelegt, weil der i486 ja einen On-Chip Coprozessor aufweist, der dem i387 entspricht.
8.6.2
Unterschiede in der Speicherverwaltung
Beim i486 trägt der Page Table-Eintrag durch zwei neue Bits dem Caching Rechnung. In Abbildung 8.15 sehen Sie das Format eines i486-Page Table-Eintrags. Gegenüber dem i486 neu hinzugekommene Bits sind hinterlegt.
Sandini Bib Alles in Einem – Der i486
245
Page-Table-Eintrag 16 15
Page-Frame-Adresse 31..12
12 11
9
AVAIL
8
7
res
6
5
D A
4
3
2
1 0
PCD PWT U/S W/R
31
P
AVAIL: für das Betriebssystem verfügbar D: Dirty 1=Page wurde beschrieben 0=Page ist unverändert A: Accessed 1=Page wurde angesprochen 0=Page wurde nicht angesprochen PCD: Page Cache Disable 1=Caching der Page nicht erlaubt 0=Caching erlaubt PWT: Page Write-Through 1=Page unterliegt Write-Through-Strategie 0=Write-Back-Strategie erlaubt US: User/Supervisor 1=User-Ebene (Privilegierungsstufe 3 0=Supervisor-Ebene (Privilegierungsstufe 0 bis 2) RW: Read/Write 1=Page ist lesbar und schreibbar 0=Page ist nur-lesbar P: Page Present 1=Page im Speicher 0=Page ausgelagert
Abb. 8.15: i486-Page Table-Eintrag
Die beiden neuen Bits PCD und PWT definieren die Cache-Strategie für die jeweilige Page. Durch ein gesetztes PCD-Bit wird verhindert, dass Daten der Page in den On-Chip-Cache übertragen werden. Bei gelöschtem PCD-Bit ist Caching von Daten der betreffenden Page erlaubt. Ist PWT gesetzt, so findet für die betreffende Page ein Write-Through statt; ist PWT gleich 0, dann werden bei einem Schreibtreffer die Daten nur in den Cache, nicht aber den Hauptspeicher geschrieben. Im Steuerregister CR3 (siehe Abbildung 8.12) finden Sie die beiden Bits ebenfalls, sie haben dort dieselbe Bedeutung. Dort betreffen sie aber den Page Directory-Eintrag, nicht den Page Table-Eintrag. Greift der i486 auf eine Page im externen Speicher zu, so gibt er an den Pins PWT und PCD Signale ab, die den Bits PWT und PCD im Page Table- oder Page Directory-Eintrag entsprechen. Bei inaktivem Paging, wenn das PE-Bit im Steuerregister CR0 gleich 0 ist, werden PCD und PWT unabhängig von ihrem tatsächlichen Wert in CR3 stets als 0 angenommen. Zusätzlich zu den beiden Testregistern TR6 und TR7 für die Prüfung des Translation-LookasidePuffers beim 80386 besitzt der i486 noch drei weitere Testregister TR3 bis TR5. Sie dienen zur Prüfung des On-Chip-Caches im i486.
8.6.3
i486-Reset
Wie der 80386 kann der i486 nach einem Reset einen internen Selbsttest ausführen. Hierzu muss der Pin AHOLD zwei Taktzyklen vor und nach der Aktivierung des RESET-Signals auf einem hohen Pegel gehalten werden. Der Selbsttest prüft neben der CPU-Logik auch den On-ChipCache und die Gleitkommaeinheit. Nach der Beendigung enthält das höherwertige DX-Byte den Wert 04 (für i486), das niederwertige Byte die Versionsnummer. Der i486 nimmt in gleicher Weise wie der 80386 die Arbeit mit der Adresse fffffff0h auf. Nach dem ersten Intersegment-Sprung oder Aufruf fallen die Adressleitungen A31–A20 auf einen niedrigen Pegel und der i486 adressiert im Real Mode nur noch das erste MByte des Adressraums. In Tabelle 8.1 sind die Initialisierungswerte nach einem Reset zusammengefasst.
Sandini Bib 246
Kapitel 8
i486-Kern: Register
Wert
EFlag CR0 EIP CS DS SS ES FS GS EDX alle anderen
uuuuuuuu uuuuuu00 00000000 00000010 = uuuu0002h 0uuuuuuu uuuuuuuu uuuuuuuu uuuu0000 = uuuuuuu0h 00000000 00000000 11111111 11110000 = 0000fff0h 11110000 00000000 = f000h1) 00000000 00000000 = 0000h 00000000 00000000 = 0000h 00000000 00000000 = 0000h 00000000 00000000 = 0000h 00000000 00000000 = 0000h 00000000 00000000 00000100 Version = 000004xxh uuuuuuuu uuuuuuuu uuuuuuuu uuuuuuuu = uuuuuuuuh
i486-FPU: Steuerwort Statuswort Tag-Wort
37fh alle Exceptions maskiert, Genauigkeit 64 Bit, Rundung zum nächsten Wert xy00h2) alle Exceptions gelöscht, TOP=000b3),Condition-Code undefiniert, B=0 ffffh alle Register sind leer
u: undefiniert 1) Basisadresse = ffff0000h, Limit = ffffh (Segmentdeskriptor-Cache-Register) 2) x = 0 oder x = 4, 0 y 7 3) Nach dem ersten PUSH-Befehl zeigt TOP auf Register 7 (111b), der Stack wächst nach unten.
Tab. 8.1: i486-Registerinhalte nach einem Prozessor-Reset
8.6.4
Der i486-Real-Mode
Der Real Mode des i486 stimmt mit dem des 80386 vollständig überein. Zur Berechnung der linearen und gleichzeitig physikalischen Adresse verschiebt der i486 den Wert in einem Segmentregister um vier Bitstellen nach links und addiert wie gewohnt den Offset bzw. die effektive Adresse. Dies ergibt physikalische Adressen zwischen 000000h und 10ffefh. Obwohl die Offsetregister 32 Bit umfassen, können Sie keine Offsetwerte größer als ffffh erzeugen, ohne eine Exception 12 (0ch) oder 13 (0dh) auszulösen. Der Adressraum ist im Real Mode also auch beim i486 auf knapp über 1 MByte beschränkt. Details zum Real-Mode dazu finden Sie im Kapitel 6.5.
8.6.5
Der i486-Protected-Mode
Auch der Protected Mode des i486 ist vollständig kompatibel mit dem Protected Mode des 80386. Die Bedeutung der Segmentregisterwerte als Segmentselektoren und die Interpretation der Segmentdeskriptoren ist gleich geblieben. Der i486-Protected-Mode kann genauso wie beim Vorgänger Multitasking-Betriebssysteme effektiv unterstützen. Es ist der gesamte physikalische 32-Bit-Adressraum mit 4 GByte Kapazität zugänglich. Der Speicher wird vom i486 mit Hilfe der Speicherverwaltungsregister GDTR, LDTR IDTR und TR verwaltet. Details zum Protected Mode werden in Kapitel 6.7 erläutert.
Sandini Bib Alles in Einem – Der i486
8.6.6
247
Der i486-Virtual-8086-Mode
Der Virtual-8086-Mode des i486 stimmt völlig mit dem des 80386 überein und hat eine erhebliche Bedeutung für die DOS-Kompatibilitätsboxen der Betriebssysteme OS/2 und Windows NT. Das wesentliche Problem ist aber wie bereits beim 80386, dass einerseits DOS-Programme sehr oft einen Interrupt auslösen, um z.B. eine Betriebssystemfunktion aufzurufen, die Behandlung eines solchen Interrupts entsprechend dem Real Mode aber unter dem Protected-Mode-Monitor im Virtual-8086-Mode sehr lange dauert. Schuld daran ist hauptsächlich das langwierige Umschalten zwischen dem Virtual-8086-Programm, dem Virtual-8086-Monitor und den Emulationsroutinen für die gewünschten Betriebssystemfunktionen. Erst der Pentium implementiert zur Beschleunigung der Interrupt-Verarbeitung im Virtual-8086-Mode so genannte virtuelle Interrupts.
8.6.7
Integer-Core und Gleitkommaeinheit
Zwischen dem 80386 und dem i387 müssen Daten und Opcodes über gewöhnliche I/O-Buszyklen ausgetauscht werden. Das dauert sehr lange, weil jeder Zyklus zwei CLK-Taktzyklen dauert und über den Bus nur 32 Bit ausgetauscht werden können. Diese Beschränkung ist beim i486 weggefallen. Durch die On-Chip Gleitkommaeinheit sind keine Buszyklen für einen Datenaustausch zwischen dem CPU-Kern und der Gleitkommaeinheit notwendig. Außerdem werden die ganzen Operanden und Opcodes jeweils in einem Rutsch übertragen, auch wenn sie 32 Bit übersteigen. Das geschieht durch einen breiten internen Datenbus. Vor allem für die einfacheren Befehle wie FADD oder FSUB mit einem Speicheroperanden macht sich das drastisch bemerkbar, weil die ganzen Buszyklen zum Übertragen des Operanden an den Coprozessor wegfallen. Sie haben beim i387 teilweise wesentlich mehr Zeit in Anspruch genommen als die eigentliche Rechnung. Die i486-FPU weist einen verbesserten Hardware-Multiplizierer auf, der pro Taktzyklus acht Bit verarbeitet (der i387 nur zwei). Beachten Sie aber, dass auch der Multiplizierer im i486 kein vollwertiges Multiplizierwerk darstellt, weil nur Teilgruppen, aber nicht alle Bits der Operanden auf einmal bearbeitet werden. Der Multiplizierer benötigt dadurch wie die anderen Elemente eine Unterstützung durch den Mikrocode. Obwohl die Gleitkommaeinheit und der Integer-Core auf denselben Mikrocode-ROM zugreifen und sich dadurch stören, können die Gleitkommabefehle nach ihrem Anstoßen parallel zu den Befehlen des CPU-Kerns ausgeführt werden. Auch der On-Chip-Cache trägt erheblich zur Leistungssteigerung bei. Wegen des recht geringen Registerumfangs von nur acht Gleitkommaregistern müssen Operanden häufig im Speicher abgelegt oder von dort gelesen werden. Die wesentlich schneller ablaufenden Cache-Zugriffe beschleunigen also die Berechnungen ebenfalls.
8.6.8
FPU-Exceptions
Im Gegensatz zur Kombination 80386/i387 löst der i486 keine Exception 9 (Coprozessor-Segmentüberlauf) aus. Stattdessen benutzt er die allgemeinere Exception 13 entsprechend einem allgemeinen Protection-Fehler. Er wird ausgelöst, wenn im Protected Mode ein Operand einen Adressbereich überspannt, der durch das Segment des Operanden nicht abgedeckt ist. Das ist der Fehlerbedingung für die Exception 9 sehr ähnlich. Weil beim i486 CPU und FPU nicht mehr getrennt sind, ist auch die Unterscheidung zwischen der Exception 9, die ihren Ursprung in der FPU hat und der Exception 13, die beim 80386/i387 von der CPU ausgelöst wird, weggefallen.
Sandini Bib 248
8.6.9
Kapitel 8
Der Translation Lookaside Buffer (TLB)
Der TLB ist wie beim 80386 als 4-Wege-Set-Assoziativspeicher implementiert und benutzt aber eine Pseudo-LRU-Ersetzungstrategie wie der On-Chip-Cache (der 80386 verwendet dagegen eine Random-Ersetzungsstrategie). Jedes Set umfasst acht Einträge, der ganze TLB kann also in seinen vier Sets insgesamt 32 Einträge aufnehmen. Der Tag-Anteil besteht aus einem 17-Bit-Tag sowie den vier Page-Protection-Bits gültig (V), User/Supervisor (U/S), lesen/schreiben (R/W) und benutzt (D). Der Datenanteil eines Eintrags speichert die 20 Bit der physikalischen Adresse und die beiden Page-Attribute PCD und PWT. Wie auch beim On-Chip-Cache ist für die vier Wege jeweils ein LRU-Eintrag gebildet. Er besteht aus den drei LRU-Bits L0 bis L2. Die Einträge werden entsprechend der in Abbildung 7.4 gezeigten Pseudo-LRU-Ersetzungsstrategie ausgetauscht, wenn ein Page-Zugriff zu einem Fehltreffer im TLB führt. Durch die etwas veränderte Struktur des TLBs (vor allem im Hinblick auf die Pseudo-LRU-Ersetzungstrategie anstelle der RandomLogik) haben sich auch die Testregister TR6 und TR7 zur TLB-Prüfung sowie die Prüfprozedur selbst etwas verändert. Details hierzu erfahren Sie in Kapitel 8.8.2.
8.7 Der i486-Bus Der i486 weist sowohl hinsichtlich der Größe als auch des Zyklusverhaltens einen sehr flexiblen Bus auf. Sein Datenbus kann durch die Signale BS8 und BS16 mit einer Breite von 8, 16 und 32 Bit betrieben werden. Die Busbreite kann dabei für jeden Zyklus getrennt neu festgelegt und muss nicht beim Design des Systems von vornherein gewählt werden. Der i486 kann also flexibel mit Speichern oder Peripheriegeräten unterschiedlichster Breite zusammenarbeiten. Beachten Sie, dass kein NA-Anschluss (Next Address) zur Steuerung eines Adress-Pipelinings vorhanden ist, der i486 führt nämlich kein solches Pipelining aus. Dafür steigert der Burst-Modus die Transferrate erheblich. Erst der Pentium kombiniert Burst-Modus und Adress-Pipelining.
8.7.1
Burst-Zyklen
Für die Übertragung größerer Datenmengen besitzt der i486 einen neuen Busmodus mit der Bezeichnung Burst-Modus (Block- oder Bündelmodus). Im Normalmodus dauert ein Buszyklus ohne Wait-States wie beim 80386 zwei Taktzyklen. Der i486 kann also alle zwei Prozessorzyklen einen Wert lesen oder schreiben. Im Burst-Modus verringert sich die Zeit für die Übertragung eines Werts auf einen Taktzyklus, die Transferrate wird also verdoppelt. Der Burst-Modus unterliegt aber gewissen Einschränkungen und ist daher nicht immer anwendbar. Eingeleitet wird ein Burst-Zyklus durch einen ersten normalen Speicherzugriff, der zwei Taktzyklen benötigt. Der i486 gibt durch ein inaktives BLAST während des zweiten Taktzyklus des ersten Zugriffs an, dass er einen Burst-Zyklus ausführen möchte. Kann das adressierte System einen Burst-Zyklus ausführen, so reagiert es durch Aktivierung des BRDY-Signals. Alle weiteren Zugriffe benötigen dann nur noch einen Taktzyklus. Um den Burst-Zyklus zu beenden, aktiviert der i486 beim letzten Zugriff das Signal BLAST, das angibt, dass mit dem nächsten BRDY oder RDY der letzte Wert des Burst-Zyklus übergeben wird. In Abbildung 8.16 finden Sie ein Signaldiagramm für einen 2-1-1-1-Burst-Zyklus.
Sandini Bib Alles in Einem – Der i486
249
Zyklus 1
T1
T1
Zyklus 2 Zyklus 3 Zyklus 4
T2
T2
T2
T2
T1
CLK
ADS
Adresse
Adresse 1
Adresse 2 Adresse 3 Adresse 4
xxxxxxa0h
xxxxxxa2h xxxxxxach xxxxxxa8h
BRDY
BLAST
Daten
1
2
3
4
Abb. 8.16: Beim Burst-Modus des i486 wird der Buszyklus für einen 16-Byte-Adressbereich von zwei auf einen Prozessortakt verkürzt, nur der erste Zugriff benötigt zwei Takte. Dadurch kann z.B. eine Cache-Line des internen Cache sehr schnell gefüllt werden. Der dargestellte Zyklus wird auch als 2-1-1-1-Burst bezeichnet.
Der Burst-Zyklus ist dahingehend eingeschränkt, dass die in einem Burst-Zyklus zu übertragenden Daten alle in einen 16-Byte-Bereich fallen müssen, der an einer 16-Byte-Grenze beginnt, d.h. ihre Adressen liegen im Bereich von xxxxxxx0h bis xxxxxxxfh (xxxxxxx=0000000h bis fffffffh). Das entspricht einer Cache-Zeile im internen Cache-Speicher. Überschreiten die zu übertragenden Daten diesen Adressbereich, so muss der Burst-Zyklus in zwei Zyklen aufgeteilt werden. Durch diese Einschränkung des Adressbereichs verändern sich während eines Burst-Zyklus nur die Adresssignale A2, A3 und BE0–BE3, alle anderen relevanten Signale wie A31–A4, M/IO, D/C und W/R bleiben gleich. Hierdurch kann das adressierte externe System auf einfache und effektive Weise die Adresse der nachfolgenden Übertragungen berechnen, der Dekodieraufwand sinkt so stark, dass nur noch ein Taktzyklus notwendig ist. Die Bezeichnung 2-1-1-1-Burst ergibt sich aus der Tatsache, dass der erste Buszyklus zwei PCLKZyklen dauert, die folgenden drei aber nur noch jeweils einen Taktzyklus. Wenn zusätzliche Wartezyklen notwendig sind, erhöhen sich die Zahlen entsprechend. Beispielsweise bedeutet ein 3-2-2-2-Burst, dass für jeden Einzelzugriff jeweils ein zusätzlicher Wartezyklus eingelegt wird. Der Burst-Zyklus ist besonders für das Füllen einer Cache-Zeile, die genau 16 Byte groß ist und an einer 16-Byte-Grenze beginnt, und das Einlesen des TSS bei einem Task Switch, von Deskriptoren oder Doppelworten geeignet. Leider können Schreibzyklen nur bis zu einer Länge von 32 Bits im Burst-Modus ausgeführt werden. Wird die volle Breite des i486-Datenbusses von 32 Bit genutzt, so ergeben sich beim Schreiben von Daten aus dem Burst-Modus keinerlei Vorteile. Nur wenn der Datenbus durch die Signale BS8 und BS16 auf eine Breite von acht bzw. 16 Bit eingestellt ist, läuft der Schreibvorgang im Burst-Modus schneller ab. Maximal können in einem Burst-Zyklus also 16 Byte eingelesen werden. Bei einer Datenbusbreite von 32 Bit sind dazu insgesamt vier Lesezyklen notwendig, für die der i486 im Burst-Modus 2+3=5 Taktzyklen benötigt. Die Übertragungsrate von 16 Byte je fünf Taktzyklen entspricht bei einem 50MHz-i486 einer Burst-Übertragungsrate von 160 MByte/s. Beachten Sie bei dieser imposanten Zahl aber, dass diese Rate nur für 0,1 µs Bestand hat und darüber hinaus nur für Lesezyklen gültig ist. Für das Schreiben von Daten beträgt die Transferrate ohne Waitstates 100 MByte/s. Das ist aber
Sandini Bib 250
Kapitel 8
immer noch enorm. Schnelle Festplatten erlauben dagegen nur eine Übertragungsrate von etwa 2 bis 5 MByte/s. Der Prozessorbus stellt also nicht den Engpass dar, gebremst wird an anderer Stelle und zwar gewaltig. Zu diesen Flaschenhälsen im PC erfahren Sie später mehr.
8.7.2
Sonderzyklen
Neben den bereits vom 80386 bekannten zwei Sonderzyklen Shutdown und Halt weist der i486 noch zwei weitere Sonderzyklen auf, die den Cache betreffen. Das sind der Flush- und WriteBack-Zyklus. Sonderzyklen werden allgemein durch die Kombination (001) der Signale M/IO, D/C, W/R angezeigt und wie beim 80386 durch die Pegel von BE0 bis BE3 unterschieden. In Tabelle 8.2 sind die verschiedenen Pegel aufgelistet. Sonderzyklen müssen wie gewöhnliche Buszyklen mit einem RDY oder BRDY vom System quittiert werden. BE3
BE2
BE1
BE0
Sonderzyklus
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
Write-Back-Zyklus Halt-Zyklus Flush-Zyklus Shutdown-Zyklus
Tab. 8.2: Sonderzyklen des i486-Bus (Signale M/IO=D/C=0, W/R=1)
Der i486 löst einen Flush-Sonderzyklus (1101) aus, wenn er einen INVD- (Invalidate Cache) oder WBINVD- (Write Back and Invalidate Cache) Befehl ausgeführt hat. Beachten Sie, dass der i486 im Fall von WBINVD zunächst einen Write-Back-Zyklus und erst anschließend einen Flush-Zyklus treibt. Der Flush-Sonderzyklus zeigt lediglich an, dass die internen Caches invalidiert worden sind. Eine Auskunft darüber, ob die veränderten Daten-Cache-Inhalte auch in den Speicher zurückgeschrieben worden sind, gibt er nicht. Das externe System kann den Flush-Sonderzyklus z.B. dazu benutzen, um ein Cache-Flush auch für einen eventuell vorhandenen L2-Cache auszulösen. Ohne diesen Sonderzyklus ist das externe System sonst nicht in der Lage, ein Cache-Flush mit Zurückschreiben der modifizierten Cache-Lines durch ein WBINVD von gewöhnlichen Write-Backs zu unterscheiden. Obwohl der i486 On-Chip-Cache eine Write-Through-Strategie implementiert und daher INVD und WBINVD für den L1-Cache denselben Effekt haben (nämlich nur eine Invalidierung), kann der im Folgenden erläuterte Write-Back-Sonderzyklus einen eventuell vorhandenen L2-Cache mit Write-Back-Strategie darüber informieren, ob der i486 einen INVD oder WBINVD-Befehl ausführt. Ein Write-Back-Sonderzyklus (0111) wird nur nach der Ausführung eines WBINVD-Befehls auf den Bus getrieben. Dadurch zeigt er an, dass alle Einträge im On-Chip-Cache invalidiert worden sind und modifizierte Cache-Lines in einem eventuell vorhandenen L2-Cache in den Hauptspeicher zurückgeschrieben werden sollen. Beachten Sie in diesem Zusammenhang, dass für den On-Chip-Cache des i486 die beiden Befehle INVD und WBINVD identisch sind, im ersten Fall treibt der i486 einen Flush-Sonderzyklus, im zweiten Fall einen Write-Back-Zyklus auf den Bus.
8.7.3
Invalidierungszyklen
Die Invalidierungszyklen dienen zur Aufrechterhaltung der Kohärenz des On-Chip-Caches im i486 mit einem externen L2-Cache oder Hauptspeicher, wenn ein anderer Busmaster unter Umgehung des i486 ebenfalls auf den L2-Cache oder den Hauptspeicher zugreifen kann. Überschreibt der fremde Busmaster dort einen Eintrag, den auch der On-Chip-Cache des i486 enthält, dann ist der Wert im On-Chip-Cache nicht mehr aktuell. Die betreffende Cache-Line muss also
Sandini Bib Alles in Einem – Der i486
251
invalidiert werden. Zu diesem Zweck treibt der externe Busmaster (oder die Systemsteuerung) einen Invalidierungszyklus, indem sie zunächst das Signal AHOLD aktiviert. Der i486 schaltet dann die Anschlüsse A31–A4 des Adressbusses in einen Zustand um, der die Übernahme einer externen Adresse ermöglicht. A3 und A2 sind unnötig, weil die 16-Byte-Cache-Lines als ganzes ersetzt und dadurch auch als ganzes an 16-Byte-Grenzen adressiert werden. Nun wird die Adresse der Speicherstelle zugeführt und EADS aktiviert, damit der i486 sie auch übernimmt. In einem solchen extern getriebenen Abfragezyklus prüft die Tag-Logik der On-Chip-Caches wie bei gewöhnlichen Speicherzugriffen, ob die Adresse im Tag-Speicher und damit der entsprechende Wert im On-Chip-Cache vorhanden ist. In einem Abfragezyklus stammt die Adresse von der externen Logik, in einem gewöhnlichen Speicherzyklus dagegen vom CPU-Kern. In beiden Fällen vergleicht der Adressenkomparator der Cache-Steuerung die Tag- und die übergebene Adresse, um einen Treffer oder Fehltreffer zu ermitteln. Führt die Abfrageadresse zu einem Cache-Treffer, invalidiert der i486 die zugehörige Cache-Line. Ein explizites Zurückschreiben der Line ist nicht notwendig, weil durch die festgelegte Write-Through-Strategie alle Schreibvorgänge automatisch zum L2-Cache oder Hauptspeicher durchschaltet. Die Invalidierung soll lediglich verhindern, dass der nicht mehr aktuelle On-Chip-Cache für Lesevorgänge referiert wird und einen überholten Wert ausgibt.
8.8 Testfunktionen In allen Varianten des i486 sind verschiedene Testfunktionen eingebaut. Dazu gehören der interne Selbsttest BIST (Built-In Self Test), die Prüfung des TLBs, die Prüfung des On-Chip-Caches und für den DX/50 MHz sowie alle SX und DX2-Varianten der JTAG Boundary Scan Test. Dazu in den folgenden Abschnitten mehr.
8.8.1
Der Interne Selbsttest BIST
Der interne Selbsttest wird aktiviert, wenn am Eingang AHOLD für zwei CLK-Tyktzyklen ein hoher Pegel anliegt, vor und nachdem das Reset-Signal nach einer vorangegangenen Aktivierung wieder auf einen niedrigen Pegel abfällt. Der Selbsttest dauert etwa 220 CLK-Zyklen; das entspricht bei 33 MHz ca. 32 ms. Der BIST prüft die interne Logik, den Mikrocode-ROM, den OnChip-Cache und den TLB. Der i486 legt das BIST-Prüfergebnis im EAX-Register ab. Ein Wert 00000000h zeigt einen fehlerfreien BIST-Abschluss an; ein von Null verschiedener Wert bedeutet einen Fehler, der Chip ist unbrauchbar. Zusätzlich identifiziert ein Wert 04h im höherwertigen Byte des Registers DX den Prozessor als i486.
8.8.2
Prüfung des TLBs
Für die TLB-Prüfung sind wie beim 80386 die beiden Testregister TR6 und TR7 implementiert. Ihre Struktur weist jedoch wegen des veränderten TLB-Aufbaus etwas von denen im 80386 ab. In Abbildung 8.17 sehen Sie diese beiden Register TR6 und TR7.
Sandini Bib 252
Kapitel 8
physikalische Adresse 31...12
TR6 V: D, D: U, U: W, W: C:
lineare Adresse 31...12
7
6
5
4
3
2
L2 L1 L0 0 0 PL REP
12 11 10 9
31
TR6
PCD PWT
12 11 10 9
31
TR7
8
7
6
5
4
3
2
1
0
0 0
1
0
V D D U U W W 0 0 0 0 C
Gültigkeit (Valid) 0=Eintrag ungültig 1=Eintrag gültig Dirty-Bit, komplementäres Dirty-Bit U/S-Bit, komplementäres U/S-Bit R/W-Bit, komplementäres R/W-Bit Befehlsbit (Command) 0=TLB-Schreiben 1=TLB-Lookup
TR7 PCD:
Page-Attributbit Page Cache Disable 0=Page cachebar 1=Page nicht cachebar PWT: Page-Attributbit Page Write-Through 0=Write-Back 1=Write-Through L0..L2: LRU-Bits für TLB-Ersetzung 00x=Weg 0 ersetzen 01x=Weg 1 ersetzen 1x0=Weg 2 ersetzen 1x1=Weg 3 ersetzen PL: TLB-Schreiben (C=0): Zeigerauswahl für TLB-Eintrag 0=interner Zeiger 1=Wert aus REP-Feld TLB-Lookup (C=1): Treffer/Fehltreffer für TLB-Eintrag 0=Fehltreffer 1=Treffer REP: Ersetzungszeiger (Replace Pointer) TLB-Schreiben (C=0): Zeiger auf TLB-Eintrag TLB-Lookup (C=1): Tag-Angabe (nur für Treffer) Abb. 8.17: Die Struktur der Testregister TR6 und TR7
Die Belegung des Test-Command-Registers TR6 hat sich nicht verändert, dagegen trägt das Testdatenregister TR7 der veränderten TLB-Struktur Rechnung. Die Bits PCD und PWT nehmen die Page-Attribute auf, L2–L0 stellen die drei LRU-Bits dar. Alle anderen Positionen wurden nicht verändert. TR6 und TR7 werden durch die Befehle MOV TR6/TR7, reg oder MOV reg, TR6/TR7 geschrieben bzw. gelesen. Die TLB-Prüfung unterteilt sich wie bisher in zwei Vorgänge: Einträge in den TLB schreiben und TLB-Einträge lesen (TLB-Lookup ausführen). Um den TLB zu testen, müssen Sie die Paging Unit deaktivieren, d.h. der i486 darf kein Paging ausführen. Wie beim 80386 gibt auch hier das Bit C im Test-Command-Register an, ob ein Schreiben in den TLB (C=0) oder ein TLB-Lookup (C=1) ausgeführt werden soll. Die drei LRU-Bits L2–L0 haben nur für TLB-Lookups eine Bedeutung, sie geben Ihnen Auskunft über den momentanen LRU-Status im betreffenden Set. Die lineare Adresse stellt das Tag-Feld des TLBs dar. Bei einem Schreiben in den TLB wird dieser linearen Adresse ein TLB-Eintrag zugeordnet und dem so zugeordneten Eintrag wird der Inhalt von TR6 und TR7 übergeben. Bei einem TLB-Lookup prüft die Testlogik, ob diese lineare Adresse und die Attributbits mit genau einem TLB-Eintrag übereinstimmen. Ist das der Fall, werden die restlichen Felder von TR6 und das Testregister TR7 aus dem ermittelten Eintrag im TLB geladen. Beim Schreiben in den TLB wird die physikalische Adresse in den TLB-Eintrag übertragen, der der linearen Adresse entspricht. Bei einem TLB-Lookup lädt die Testlogik dieses TR7-Feld mit dem im TLB gespeicherten Wert.
Sandini Bib Alles in Einem – Der i486
253
Die Bedeutung von PL ist abhängig von C unterschiedlich. Wird ein Eintrag des TLBs geschrieben (C=0) und ist PL=1, dann legt REP den Assoziativblock des TLBs fest, der beschrieben wird. Ist PL in diesem Fall gelöscht (PL=0), so wählt ein interner Zeiger in der Paging Unit den zu schreibenden TLB-Block aus. Bei einem TLB-Lookup (C=1) gibt der Wert von PL an, ob der Look-up zu einem Treffer (PL=1) oder Fehltreffer (PL=0) geführt hat. Die fünf Attributbits V, D, D, U, U sowie W, W haben dieselbe Bedeutung wie beim 80386. Vergleichen Sie dazu Tabelle 6.3. Beachten Sie, dass ein Zugriff auf das TLB-Command-Register TR6 die TLB-Prüfprozedur triggert. Im Fall eines TLB-Schreibens (C=0) wird dann sofort der Inhalt von TR7 zum TLB übertragen, bei einem TLB-Lookup (C=1) werden die relevanten TLB-Positionen nach TR7 übertragen. Wenn Sie ein TLB-Schreiben ausführen, müssen Sie also zuerst das TLB-Testdatenregister TR7 laden. Sonst werden alte und damit meist falsche Werte an den TLB übergeben.
8.8.3
Prüfung des On-Chip-Caches
Zur Überprüfung des On-Chip-Caches dienen die drei Testregister TR3 bis TR5. Die Struktur dieser Register sehen Sie in Abbildung 8.18. Die Prüfprozedur selbst ist ähnlich wie für die Prüfung des TLBs. Das Schreiben einer 16-Byte-Cache-Line erfolgt wie ein Line-Fill über den Line-Fill-Puffer. Dazu müssen über das Cache-Datentestregister TR3 viermal vier Bytes übergeben werden. Der i486 ersetzt dann eine Cache-Line durch den Inhalt des Line-Fill-Puffers. In ähnlicher Weise können Sie über das Testregister TR3 eine Cache-Line als vier 4-Byte-Größen lesen. Das geschieht mittelbar über einen Cache-Lesepuffer. Das Datentestregister TR3 greift also nicht direkt auf den Cache zu, vielmehr ist eine Cache-Line nur mittelbar über die beiden genannten Puffer zugänglich. Beachten Sie, dass Sie auch stets den gesamten Puffer schreiben bzw. lesen müssen. Es sind also immer vier 32-Bit-Zugriffe notwendig. Die beiden DW-Bits im Cache-Test-Steuerregister TR5 legen dabei das Doppelwort innerhalb der 16-Byte-Cache-Line bzw. dem 16-Byte-CachePuffer fest, das angesprochen wird. 31
16 15
12 11 10 9
8
7
6
5
4
3
2
1 0
15
reserviert
TR4
Tag 31..11
TR3
Set
val
TR5
DW
L2 L1 L0 V 3 V 2 V 1 V 0
BEF res
Daten 31..0
TR4 val:
Gültigkeitsbit Cache-Eintrag 0=ungültig 1=gültig L0–L2: LRU-Bits für Cache-Line-Ersetzung (L2 L1 L0) 00x=Weg 0 ersetzen 01x=Weg 1 ersetzen 1x0=Weg 2 ersetzen 1x1=Weg 3 ersetzen V0–V3: Gültigkeit der Wege 0 bis 3 0=ungültig 1=gültig TR5 DW:
BEF:
Line-Puffer-Zugriff: Doppelwortgruppe innerhalb der Cache-Line 00=Bits 0–31 01=Bits 32–63 10=Bits 64–95 11=Bits 96–127 Cache schreiben/lesen: Wegauswahl 00=Weg 0 ... 11=Weg 3 Testbefehl 00=Line-Puffer-Zugriff 01=Schreibtest 10=Lesetest 11=Cache Flush
Abb. 8.18: Die Struktur der Cache-Testregister TR3 bis TR5
Sandini Bib 254
Kapitel 8
Das Cache-Test-Statusregister TR4 enthält die 21-Bit-Tag-Adresse sowie das Gültigkeitsbit val für den angesprochenen Eintrag. Außerdem sind noch die drei LRU-Bits L2–L0 und die vier Gültigkeitsbits V3–V0 für den Set-Eintrag vorhanden, der sich über alle vier Wege erstreckt. Das CacheTest-Steuerregister TR5 legt neben dem anzusprechenden Doppelwort (über DW) den Weg (ebenfalls mit Hilfe von DW) und den Vorgang fest (über BEF), den der Zugriff auslösen soll. Die sieben Set-Auswahlbits legen das adressierte Set fest. Im Folgenden möchte ich die fünf möglichen Operationen kurz beschreiben. Cache-Puffer-Zugriffe Um den Line-Fill-Puffer zu schreiben, müssen Sie zunächst das Teststeuerregister TR5 mit einem BEF-Eintrag BEF=00b und dem Doppelwort DW, das später in den Line-Fill-Puffer übertragen werden soll, schreiben. Der Set-Eintrag hat hier keine Bedeutung. Damit ist die Teststeuerlogik für einen Zugriff auf den Line-Fill-Puffer vorbereitet. Wenn Sie nun mit MOV TR3, reg einen Wert in das Testdatenregister TR3 schreiben, wird der Wert an die durch DW festgelegte Stelle im Line-Fill-Puffer übertragen. Umgekehrt können Sie ein 32-Bit-Doppelwort aus dem Cache-Lesepuffer entnehmen, wenn Sie das Steuerregister TR5 mit ebenfalls BEF=00b schreiben und dabei durch DW das anzusprechende Doppelwort festlegen. Durch einen Befehl MOV reg, TR3, der das Testdatenregister TR3 liest, werden die 32 Bit des adressierten Doppelworts im Cache-Lesepuffer in das Testdatenregister TR3 und weiter zum Zielregister reg übertragen. Lesende und schreibende Zugriffe auf die Cache-Puffer werden also durch einen lesenden bzw. schreibenden Zugriff auf das Testdatenregister TR3 unterschieden. Beachten Sie, dass für die beiden folgenden Vorgänge Cache schreiben und Cache lesen jeweils vier Zugriffe auf die CachePuffer notwendig sind, damit der Cache-Fill-Puffer auch voll gefüllt bzw. der Cache-Lesepuffer vollständig geleert wird. Cache schreiben Zunächst sind vier Schreibzugriffe auf den Line-Fill-Puffer notwendig, um ihn mit den Werten für die betreffende Cache-Line zu füllen. Anschließend muss die Line auch tatsächlich in den Cache übertragen werden. Das geschieht folgendermaßen: TR4 wird mit dem 21-Bit-Tag und dem gewünschten Gültigkeitsbit für den Cache-Eintrag geladen. Anschließend schreiben Sie über MOV TR5, reg das Teststeuerregister TR5, wobei das BEF-Feld einen Wert 01b aufweist und die Felder Set und DW die Set-Adresse bzw. den Weg innerhalb des Sets festlegen. Der Schreibzugriff auf TR5 löst dann automatisch eine Übertragung vom Line-Puffer in den Cache aus. Die interne LRU-Logik des On-Chip-Caches aktualisiert die LRU-Bits selbstständig. Sie können sie z.B. durch den folgenden Vorgang auslesen und überprüfen. Cache lesen Wie das Schreiben einer Cache-Line ist auch das Lesen des Caches ein zweistufiger Prozess. Zunächst muss die gewünschte Line aus dem Cache in den Cache-Lesepuffer übertragen werden. Das geschieht durch einen Befehl MOV TR5, reg. In reg müssen Sie einen Wert mit BEF=10b und Einträgen für Set und DW übergeben, die das zu lesende Set sowie den Weg innerhalb des Sets definieren. Anschließend enthält TR4 das 21-Bit-Tag, wie es im Cache-Directory des OnChip-Caches gespeichert war sowie die zugehörigen drei LRU-Bits L2–L0 und jeweils ein Gültigkeitsbit V3–V0 für die vier Wege des adressierten Sets. Gleichzeitig wird die Cache-Line in den Cache-Lesepuffer übertragen und steht über TR3 zur Verfügung. Durch einmaliges Auslesen von TR4 und einen viermaligen Zugriff auf TR3 können Sie also die gesamte Information extrahieren, die für die festgelegte Cache-Line verfügbar ist.
Sandini Bib Alles in Einem – Der i486
255
Cache Flush Wenn Sie das Testbefehlsregister TR5 mit einem Wert BEF=11b laden, führt der i486 intern ein Cache-Flush aus. Er invalidiert sämtliche Cache-Einträge (also alle Cache-Lines), indem er die LRU- und Gültigkeitsbits löscht. Beachten Sie, dass die Daten- und Tag-Einträge selbst nicht gelöscht werden, sie sind weiter in unveränderter Form vorhanden, werden aber für einen normalen Cache-Betrieb nicht mehr verwendet. Im Gegensatz zu einem Cache-Flush über die Befehle INVD und WBINVD treibt der i486 hier keinen Flush-Sonderzyklus auf den Bus; externe Bausteine werden also über die Invalidierung nicht informiert.
8.8.4
Tristate-Testmodus
Der Tristate-Testmodus dient zur Implementierung von Hardware-Prüfungen eines ganzen Boards. Der i486 kappt dazu alle Ausgangs- und bidirektionalen Anschlüsse, sodass das Motherboard keinerlei Signale vom Prozessor empfangen kann. Die übergeordnete Testlogik kann dann die Hardware-Prüfung leichter ausführen und etwaige Fehler einfacher lokalisieren. Der i486 verlässt den Tristate-Testmodus erst mit einem erneuten Reset.
8.8.5
Der JTAG-Boundary-Scan-Test
Neben den bereits erwähnten Testmodi kennt der i486 in der 50-Mhz-Version (echte 50 Mhz ohne interne Taktverdopplung, d.h. kein i486DX2-50) zusätzlich noch einen so genannten BoundaryScan-Test nach dem Standard IEEE 1149.1. Die ersten 486er mussten noch ohne diese leistungsfähige Diagnosemöglichkeit auskommen, die aber für Anwender nicht oder nur schwer zu nutzen ist. In den später auf den Markt gekommenen i486DX2- und i486SX-Chips war der JTAG-Test bereits von vornherein implementiert. Ich möchte aus diesem Grund den Boundary-Scan-Test an dieser Stelle allgemein erläutern. Die Angaben sind für alle Prozessoren vom i486SX bis zum Pentium gültig. Abweichungen im Detail werden im Zusammenhang mit den einzelnen Prozessoren aufgeführt. Hardware-Hersteller haben mit dem Boundary-Scan-Test ein leistungsfähiges Werkzeug, die Logikeinheiten des Prozessors und deren Verschaltung auch nach Abschluss der Herstellung und nach Einbau in einen Computer durch Software extern zu prüfen. Es lassen sich also umfangreiche Diagnosen fahren. Unterstützt wird der JTAG-Test durch die Anschlüsse TCK (Test Clock), TDI (Test Data Input), TDO (Test Data Output), TMS (Test Mode Select) und in manchen Versionen auch TRST (Test Reset). Beachten Sie, dass TRST nicht für alle Prozessoren zur Verfügung steht, der i486SX und i486DX2 müssen ohne ihn auskommen, dagegen ist TRST beim Pentium vorhanden. Im Folgenden möchte ich die JTAG-Anschlüsse kurz vorstellen. TCK (I) Anschluss A3 Diesem Test-Clock-Anschluss wird ein Testtaktsignal für den Boundary-Scan-Test zugeführt. Synchron zu diesem Taktsignal werden Testdaten sowie Statusinformationen ein- und ausgegeben. TDI (I) Anschluss A14 Dem Test-Data-Input-Anschluss TDI werden TAP- (Test-Access-Port-) Befehle und Daten synchron zu TCK in serieller Weise zugeführt, die für den Boundary-Scan-Test notwendig sind.
Sandini Bib 256
Kapitel 8
TDO (O) Anschluss B16 Vom Test-Data-Output-Anschluss TDO werden Befehle und Ergebnisdaten des Boundary-ScanTests synchron zu TCK in serieller Weise ausgegeben. TRST (I) (nur Pentium) Dieser Anschluss ist nur beim Pentium implementiert; der Vollständigkeit halber möchte ich ihn aber bereits hier vorstellen. Ein aktives Signal mit niedrigem Pegel an diesem Test-ResetAnschluss initialisiert die Boundary-Scan-Testlogik. TMS (I) Anschluss B14 Wenn diesem Test-Mode-Select-Anschluss ein Signal mit hohem Pegel zugeführt wird, löst der Test-Access-Port einen Betrieb der JTAG-Testlogik für den Boundary-Scan-Test aus. Liegt TMS für mindestens fünf TCK-Zyklen auf einem hohen Pegel, dann initialisiert sich die Testlogik unabhängig vom gerade aktiven Zustand neu. Wie in Abbildung 8.19 gezeigt ist, ist auf dem i486-Chip ein Boundary-Scan-Register und eine JTAG-Logik oder ein TAP-Controller, die über den Test-Access-Port TAP angesprochen werden, vorhanden. Der Test muss über eine externe Logik ausgeführt werden, die den JTAG-Testbus mit den Anschlüssen TCK, TDI, TDO und TMS bedient. Beachten Sie, dass der Chip den eigentlichen i486-Prozessor und zusätzlich die JTAG-Logik integriert. i486-Chip I/O-Zelle
Boundary-Scan-Test-Register
Anschlußpin
i486-CPU
vorangehende Stufe
nachfolgende Stufe ID-Code-Register Bypass-Register
TDO
TDI TMS TCK
Runbist-Register
TDO
TDI
Dekodier-/Steuerlogik Befehlsregister
TAP-Controller
Abb. 8.19: Der Eingang TDI und der Ausgang TDO können mit dem Ausgang einer Schaltung in einer vorherigen Stufe bzw. mit dem Eingang einer Schaltung in einer nachfolgenden Stufe verbunden sein.
Zwischen dem Eingabeanschluss TDI und dem Ausgangspin TDO befindet sich der Abtastpfad. Für jeden Pin ist ein 1-Bit-Schieberegister vorgesehen, über das auch alle entsprechenden Einund Ausgaben des Pentiums laufen. Bei nicht-aktivierter TAP-Steuerung reichen diese Register
Sandini Bib Alles in Einem – Der i486
257
die zugeführten oder abgenommenen Daten ohne weitere Veränderung an den zugehörigen Anschluss oder den i486 weiter. Bei aktivem JTAG-Modus sind die 1-Bit-Schieberegister als Einoder Ausgabezelle konfiguriert. Eingabezellen erfassen den Wert am entsprechenden Eingabepin und speichern ihn. Ein weiterer Einfluss auf den i486 findet nicht statt, weil der i486 den JTAG-Befehl INTEST nicht unterstützt. Aktive Ausgabezellen legen dagegen den Wert fest, der dann am zugehörigen Pin erscheint. Die Schieberegister sind nicht nur mit den Ein-/Ausgabepins und dem i486, sondern auch noch untereinander verbunden; sie bilden dadurch einen Schiebepfad zwischen TDI und TDO. Zusätzlich befinden sich an manchen Stellen noch Steuerzellen. Daten in den 1-Bit-Schieberegistern werden im Takt von TCK von TDI nach TDO verschoben, ohne dass sie unterwegs verändert werden. Nun wird auch die Bezeichnung Boundary-Scan deutlich: Durch die »am Rand« (Boundary) angeordneten Schieberegister werden die »Randwerte« des i486 abgetastet (engl. to scan) und über TDO ausgegeben. Die Gesamtheit der miteinander verbundenen 1-Bit-Schieberegister oder Ein-/Ausgabe- und Steuerzellen bildet das so genannte Boundary-Scan-Register. Die Steuerzellen bestimmen die Übertragungsrichtung von bidirektionalen Anschlüssen (wie z.B. D31–D0) oder klemmen Ausgabeanschlüsse (wie z.B. ADS) ab, d.h. versetzen sie in einen Tristate-Zustand. Eine »1« in der entsprechenden Steuerzelle definiert den zugehörigen bidirektionalen Anschluss als Eingang bzw. klemmt den Ausgangsanschluss ab. Eine »0« wählt den bidirektionalen Anschluss als Ausgang bzw. aktiviert den Ausgangsanschluss. Die Steuerzellen wirken immer auf eine Gruppe von Anschlüssen. Tabelle 8.3 listet die Steuerzellen und die zugeordnete Gruppe auf. Steuerzelle
Anschlussgruppe
ABUSCTL WRCTL BUSCTL MISCCTL
A31–A2 D31–D0, DP3–DP0 ADS, BLAST, PLOCK, LOCK, W/R, BE3–BE0, M/IO, D/C, PWT, PCD PCHK, HLDA, BREQ, FERR
Tab. 8.3: JTAG-Steuerzellen und zugeordnete Anschlussgruppen für den i486DX
Der Boundary-Scan-Pfad wird in der folgenden Weise durchlaufen (achten Sie auf die Steuerzellen xxxCTL): TDI->WRCTL->ABUSCTL->BUSCTL->MISCCTL->ADS->BLAST->PLOCK->LOCK->PCHK-> RDY->BOFF->BS16->BS8->RDY->KEN->HOLD->AHOLD->CLK->HLDA->W/R->BREQ-> BE0->BE1->BE2->BE3->M/IO->D/C->PWT->PCD->EADS->A20M->RESET->FLUSH->INTR-> NMI->FERR->IGNNE->D31->D30->D29->D28->D27->D26->D25->D24->DP3->D23->D22-> D21->D20->D19->D18->D17->D16->DP2->D15->D14->D13->D12->D11->D10->D9->D8-> DP1->D7->D6->D5->D4->D3->D2->D1->D0->DP0->A31->A30->A29->A28->A27->A26-> A25->A24->A23->A22->A21->A20->A19->A18->A17->A16->A15->A14->A13->A12->A11-> A10->A9->A8->A7->A6->res->A5->A4->A3->A2->TDO
Weitere wichtige JTAG-Register sind das Bypass-, das ID-Code-, das Runbist- und das Befehlsregister. Die höchstwertigen Bits aller Register sind mit TDI und die niedrigstwertigen Bits mit TDO verbunden. Das Bypass-Register ist wie die anderen Zellen als 1-Bit-Schieberegister ausgebildet und dient dazu, TDI und TDO »kurzzuschließen«. Nach einer entsprechenden Anweisung BYPASS an den TAP-Controller ist nur noch ein einzelner TCK-Zyklus statt 105 TCK-Zyklen notwendig, um einen an TDI eingegebenen Wert an TDO auszugeben. Das Bypass-Register wird mit einer »0« initialisiert (die dann den ersten an TDO ausgegebenen Wert darstellt). Das ID-Code-Register speichert eine 32-Bit-Identifizierungsinformation für den untersuchten Chip. Im Fall des i486DX gilt folgende Belegung: Bit 0=1, Bit 1...11=Hersteller (Intel=09h), Bit
Sandini Bib 258
Kapitel 8
12...27=Teilenummer (0410h für Baureihe Ax, 0411h für Baureihe Bx), Bit 28...31=Version (00h). Der 32-Bit-i486DX-ID-Code lautet also 00410013h (Baureihe Ax) bzw. 00411013 (Baureihe Bx). Das Runbist-Register speichert das 1-Bit-Testergebnis nach einem internen Selbsttest. Ein erfolgreicher Test legt einen Wert 0 ab. Jeder davon verschiedene Wert zeigt an, dass der Chip mehr oder weniger schadhaft ist. Ausgeführt wird der Boundary-Scan-Test mit Hilfe eines definierten Testbefehlssatzes, der gegenwärtig fünf Befehle umfasst. Vom 13-Bit-Befehlsregister sind die neun höherwertigen Bits reserviert. Die vier niederwertigen Bits nehmen die entsprechenden Befehlsbits für die fünf Befehle EXTEST, IDCODE, RUNBIST, SAMPLE-PRELOAD und BYPASS auf. Im Folgenden sind sie zusammen mit ihren 4-Bit-Opcodes aufgeführt.
:
:
: :
:
:
EXTEST (Opcode xx0h): Der Befehl testet die externe Verschaltung des i486 (oder allgemein des Chips mit dem JTAG-Test). Der i486 gibt dazu die in den einzelnen Zellen des BoundaryScan-Registers gespeicherten Werte an den Ausgabepins ab und liest die dem i486 an seinen Eingabeanschlüssen zugeführten Werte in die zugehörigen Zellen ein. Bidirektionale Anschlüsse werden in Abhängigkeit vom Wert in den Steuerzellen als Eingabe- oder Ausgabeanschluss behandelt. Beachten Sie, dass die an den Eingangsanschlüssen anliegenden Daten, die in die Zellen eingelesen werden, vom i486 nicht übernommen werden. Sie haben also keinerlei Einfluss auf das Verhalten des Prozessors. Nach einem EXTEST-Befehl muss der i486 zurückgesetzt werden; SAMPLE/PRELOAD (Opcode xx1h): Je nach Zustand des TAP-Controllers tastet der Befehl den Zustand an den Ein-/Ausgabeanschlüssen des i486 ab oder legt Daten für die Ausgabepins fest. Im Capture-DR-Zustand (siehe unten) werden die vom Prozessor an die Ausgangs-pins ausgegebenen und die dem i486 über die Eingangsanschlüsse zugeführten Werte in die Zellen des Boundary-Scan-Registers übernommen und können dann über TDO ausgelesen werden. Im Update-DR-Zustand legt der Befehl die Daten fest, die der i486-Chip bei einem EXTEXT-Befehl an seinen Ausgangspins an die Platine abgibt, auf der er montiert ist; IDCODE (Opcode xx2h): Der Befehl verbindet das ID-Code-Register mit TDI und TDO. Durch Umschalten (Toggeln) von TCK wird dann der ID-Code über TDO ausgegeben und kann von der externen Testlogik verarbeitet werden. Nach einem Reset enthält das Befehlsregister den Opcode für IDCODE; RUNBIST (Opcode xx8h): Der Befehl verbindet das Runbist-Register mit TDO und lädt den Wert »1«. Anschließend wird der eingebaute Selbsttest (BIST) aktiviert. Fällt der Test erfolgreich aus, so überschreibt er die »1« im Runbist-Register mit »0«. Nach Abschluss des BIST nach etwa 1,2 Millionen Prozessortaktzyklen (nicht TCK-Zyklen) kann der Testwert über TDO ausgelesen werden; BYPASS (Opcode xxfh): Der Befehl verbindet das Bypass-Register mit TDI und TDO und kappt die Verbindung zwischen TDI/TDO und dem Boundary-Scan-Register. Dadurch werden die an TDI eingegebenen Daten bereits nach einem TCK-Zyklus an TDO unverändert ausgegeben. BYPASS dient zur Implementierung von Prüfungen komplexer Verschaltungen, wenn einzelne Komponenten getestet werden sollen, ohne sie aus der Schaltung zu entfernen. Voraussetzung ist natürlich, dass alle zu prüfenden Komponenten den JTAG-Test unterstützen. Der TDI-Eingang des i486 kann also z.B. mit dem TDO-Ausgang einer anderen Komponente und der TDO-Ausgang mit dem TDI-Eingang eines anderen Chips verbunden sein. Dadurch werden möglicherweise sehr lange Abtastpfade über ein ganzes Board aufgebaut; PRIVATE: Alle anderen Opcodes sind reserviert und können von den Chipherstellern für eigene Zwecke benutzt werden. Üblicherweise haben sie keinerlei Auswirkungen; sie sind also mehr oder weniger NOPs.
Sandini Bib Alles in Einem – Der i486
259
Wie auch die Testdaten werden diese Befehle in serieller Weise über den Eingangsanschluss TDI in den i486 eingegeben. Als Taktsignal dient das Taktsignal am TCK-Eingang. Der TAP-Controller muss dazu wissen, für welches Register (z.B. Boundary-Scan-Register, Befehlsregister etc.) die eingegebenen Datenbits bestimmt sind. Zu diesem Zweck ist eine klar definierte Zustandsfolge des TAP-Controllers implementiert. Ausgehend von einem Reset-Zustand, den der TAPController nach einer Aktivierung von TRST (nur beim Pentium) oder von TMS für mindestens fünf TCK-Zyklen einnimmt, werden die verschiedenen Controllerzustände in Abhängigkeit von verschiedenen Kombinationen der Signale TMS und TCK in festgelegter Reihenfolge durchlaufen. TCK dient dabei als treibendes Taktsignal und TMS als Verzweigungssignal, das verschiedene Äste des Zustandsdiagramms auswählt. Zu diesen Zuständen gehören auch die oben erwähnten Zustände Capture-DR und Update-DR. Sie betreffen einen Datentransfer von TDI über das Boundary-Scan-Register zu TDO. Das Befehlsregister wird geladen, wenn sich der TAPController im Befehlsast des Zustandsdiagramms befindet. Der Tester (eine externe Logik zur Durchführung des JTAG-Tests) muss also die Übergabe der seriellen Testdaten, deren Reihenfolge sowie die Aktivierung der Signale TMS und TCK genau aufeinander abstimmen. Eine nicht ganz triviale Aufgabe. Nach Ausführung eines Testbefehls stehen Ergebnisdaten in einem Ergebnisregister bereit, die über den Ausgangsanschluss TDO ausgegeben werden. Der externe Busmaster kann diese Ergebnisdaten dann überprüfen und dadurch feststellen, ob der i486 korrekt arbeitet. Einen dem JTAG ähnlichen Test führen die Hersteller auch mit den DRAM- und SRAM-Chips aus, um nach der Herstellung zu prüfen, ob die Chips korrekt arbeiten oder Fehler aufweisen. Dazu werden verschiedene Testmuster in die Speicherzellen geschrieben und es werden die Daten wieder ausgelesen, um zu ermitteln, ob sie nicht verändert worden sind. Manche ChipFehler lassen sich nur durch bestimmte Datenmuster ermitteln. Die individuelle Adressierung der Speicherzellen und ein externer Datenvergleich würde dann viel zu lange dauern. Daher weisen die meisten modernen Chips eine interne Testlogik auf. Die umfangreichen Testdaten werden ähnlich wie beim JTAG-Test sehr schnell seriell über einen bestimmten Pin eingegeben, und nur die Ergebnisdaten – Chip in Ordnung oder nicht – werden über einen Anschluss wieder ausgegeben.
8.9 Der I/O-Adressraum des i486 Der I/O-Adressraum des i486 umfasst wie beim 80386 64k 8-Bit-Ports, 32k 16-Bit-Ports, 16k 32Bit-Ports oder eine äquivalente Mischung aus ihnen. Auch der i486 kennzeichnet einen I/O-Buszyklus wie gewöhnlich durch ein Signal M/IO mit niedrigem Pegel. Aus Kompatibilitätsgründen sind wie beim 80386 (oder auch 80286) die Port-Adressen 0f8h bis 0ffh reserviert. Sie wurden aber beim i486 nicht mehr für die Kommunikation zwischen CPU und Coprozessor verwendet, weil die Gleitkommaeinheit ja bereits auf dem Chip integriert ist. I/O-Zugriffe werden prinzipiell am Cache vorbei direkt auf den Bus getrieben; das gilt für Lese- und Schreibzugriffe. I/OSchreibzugriffe werden auch nicht in den Schreibpuffern zwischengespeichert. Die Adressierung der I/O-Ports und den Schutz des I/O-Adressbereichs im Protected Mode über das IOPL-Flag und die I/O-Permission Bit Map führt der i486 genauso wie der 80386 aus. Details dazu sind in Kapitel 6.7.8 dargestellt.
Sandini Bib
Sandini Bib
9 Coprozessoren und 386/486-CPU-Derivate In den vorherigen Kapiteln wurde bereits erwähnt, dass nicht nur die Firma Intel, sondern auch andere Hersteller CPUs für PC fertigen. Dies betrifft im Grunde jede CPU-Generation, also angefangen beim 8086 (z.B. auch von NEC und Harris) bis hin zum Pentium (IBM, Cyrix, AMD). Ab dieser CPU trennen sich dann die kompatiblen Wege der Hersteller und insbesondere Intel und AMD stehen hier mit ihrem Pentium III bzw. Athlon in direkter Konkurrenz zueinander, wobei diese beiden Prozessoren elektrisch nicht miteinander kompatibel sind. In früheren Zeiten war die Situation eine andere und Intel vergab an die Hersteller Lizenzen, damit diese dann mehr oder weniger eigene, kompatible Mikroprozessoren herstellen durften. Intel tat dies aber immer erst dann, wenn sie die bereffende CPU-Linie bereits »abgeschrieben« hatte, sie also als nicht mehr zukunftstauglich ansah und bereits die nachfolgende CPU-Generation auf den Markt gebracht hatte. Interessanterweise sind die »Nachbauten« dabei teilweise leistungsfähiger als die Original-Intel-CPUs. Eine weitere Ursache für die Vielzahl an CPUs, die für PC entstanden sind, liegt in der Tatsache begründet, dass von einer CPU, sowohl von Intel selbst als auch von den anderen Herstellern, verschiedene Ableger entwickelt worden sind. Entweder handelt es sich dabei um »abgespeckte« Typen, die weniger leistungsfähig und damit preiswerter sind als der jeweilige Grundtyp (z.B. der 386SX, der aus dem 386DX entstanden ist) oder aber es wurde durch eine Modifizierung des Grundtyps ein leistungsfähigerer Prozessor (z.B. der i486DX4 aus dem i486 entstanden) entwickelt, wobei hier die Erhöhung der Taktfrequenz und die Vergrößerung des On-Chip-Caches die beiden wichtigsten Parameter sind. In diesem Kapitel möchte ich auf die wichtigsten Ableger des 80386 und des i486 eingehen und die Pentium-kompatiblen Mikroprozessoren werden dann in Kapitel 11 behandelt. Zunächst soll der Vollständigkeit halber jedoch noch etwas zu den mathematischen Coprozessoren gesagt werden. Ab der i486-CPU ist dieser »Rechenknecht« mit im Prozessor integriert, was jedoch nichts Wesentliches an der grundsätzlichen Funktionsweise und der Programmierung ändert.
9.1 Mathematische Coprozessoren Generell kann eine CPU (ohne Coprozessor) die gesamte Mathematik vom kleinen Einmaleins bis zu den transzendenten Logarithmus-Funktionen bewältigen, da alle mathematischen Berechnungen letztendlich auf den ganzen Zahlen basieren. Allerdings erfordert dies einen immensen Rechenaufwand, der relativ viel Zeit in Anspruch nimmt. Die mathematischen Coprozessoren unterstützen demgegenüber gezielt die Berechnung mathematischer Ausdrücke mit Gleitkommazahlen. Hierzu gehört die Addition, Subtraktion, Multiplikation und Division von Gleitkommazahlen, die Berechnung der Quadratwurzel und von Logarithmen etc. Tabelle 9.1 gibt den ungefähren Performance-Gewinn an. Programme, die die Funktionen des mathematischen Coprozessors in der gleichen Weise ausführen und dieselben Ergebnisse liefern, werden als mathematische Software-Emulationen bezeichnet.
Sandini Bib 262
Kapitel 9
Ausführungszeiten in µs bei 33 MHz Takt Gleitkommaoperation
80387
Emulation mit dem 80386
0,7 0,9 2,6 3,5 9,8 9,6 0,9 1,6
125 125 250 1500 1000 1350 100 130
Addition/Subtraktion Multiplikation (einfache Genauigkeit) Division Quadratwurzel Tangens Exponentialfunktion Laden (doppelte Genauigkeit) Speichern (doppelte Genauigkeit)
Für die Emulation sind typische Durchschnittswerte angegeben, eine mehr oder weniger effektive Programmierung mit i386-Befehlen kann die Werte verkleinern oder erhöhen.
Tab. 9.1: Gleitkommaberechnungen mit dem 80387 und dem 80386
Sie erkennen den enormen Geschwindigkeitszuwachs um einen Faktor 50 bis 500. Anwendungsprogramme, die intensiv Gebrauch von mathematischen Berechnungen mit Gleitkommazahlen machen, wie z.B. CAD oder numerische Steuerungen von Maschinen und Robotern, werden mit einem Coprozessor wesentlich schneller ausgeführt. Die Faktoren 50 bis 500 beziehen sich aber nur auf die mathematischen Berechnungen, ein Anwendungsprogramm beschäftigt sich demgegenüber in erheblichem Maß noch mit der Ein- und Ausgabe von Daten, der Benutzerführung und anderen Dingen. Erwarten Sie also nicht, dass alles 50- bis 500mal schneller abläuft, realistisch ist unter Einbeziehung der Gesamtfaktoren eine Erhöhung der Geschwindigkeit um das Zwei- bis Zehnfache. Z. B. ist zur Darstellung eines Kreises in einem CAD-Programm einerseits die Berechnung der Kreispunkte notwendig – hier kann ein Coprozessor helfen. Andererseits müssen die Kreispunkte auch auf dem Bildschirm ausgegeben werden. Den notwendigen Zugriff auf den Bildschirmspeicher unterstützt der Coprozessor nicht, er läuft ohne ihn daher gleich schnell ab. Bereits den Systemen mit einem 8086/8088 kann ein mathematischer Coprozessor hinzugefügt werden. Die vier Grundrechenarten mit ganzen Zahlen sind zwar auf dem 8086/88 integriert, es verwundert aber wohl nicht, wenn der 8086/88 weder Gleitkommazahlen noch transzendente Funktionen beherrscht. Dafür ist eben der mathematische Coprozessor 8087 zuständig. Er kann die Ausführungsgeschwindigkeit gegenüber Software-Emulatoren um bis den Faktor 100 steigern. Der 8087 unterstützt eine 8086/88-CPU im Maximummodus außerdem mit 68 zusätzlichen Mnemonics. Als »mathematische Ergänzung« zum 80286, steht der 80287 zur Verfügung. Der 80287 ist eigentlich nur ein 8087, weil seine Numerikeinheit im Wesentlichen unverändert vom 8087 übernommen wurde, der 80287 rechnet also auch nicht schneller als sein Vorgänger 8087. Lediglich die Steuereinheit wurde an das spezielle Datentransferprotokoll zwischen CPU und Coprozessor angepasst. Das war notwendig, weil durch den Protected Mode alle Speicherzugriffe wie beim 80386/80387 über die CPU laufen müssen. Der 8087 ist dagegen fähig, den Speicher selbst zu adressieren. Wie der passende Coprozessor für einen 80386, der 80387, so führt auch der 80287 keinerlei Zugriffe auf den Speicher aus. Bei der Kombination 80286/80287 ermittelt der 80286 nicht nur die Speicheradresse, sondern führt auch alle Zugriffe auf den Speicher aus. Alle Daten laufen also über die Speicherverwaltungseinheit im 80286. Der 80287 unterstützt dieselben Zahlenformate wie der 80387 und stellt intern alle Zahlen im Temporary-Real-Format mit 80 Bit dar. Hier
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
263
werden die Zahlen beim Einlesen durch einen Load-Befehl oder Abspeichern mit einem StoreBefehl automatisch in oder vom Temporary-Real-Format umgewandelt. Die mathematischen Coprozessoren sind von zahlreichen Herstellern wie natürlich Intel, AMD, Cyrix aber auch IBM, IIT oder Chips&Technologies entwickelt worden. In der Regel sind die Coprozessoren leicht zu identifizieren, da sie in ihrer Bezeichnung eine »87« führen. In der Tabelle 9.2 ist angegeben, welcher Coprozessor-Typ zu welcher CPU passt. Da einige IBM- und Cyrix-CPUs entgegen ihrer 486-Bezeichnung intern keinen Coprozessor besitzen und damit nicht der üblichen Bezeichnungsweise entsprechen, sind die wichtigsten Typen dieser beiden Firmen ebenfalls mit angeführt. CPU-Typ
Coprozessortyp
8086,8088 80286 80386DX 80386SX 486DX 486SX Cyrix 486SLC Cyrix 486DLC Cyrix 486DR2 Cyrix 486S Cyrix 486SV Cyrix 486S2 IBM 386SLC IBM 486SLC2 IBM 486DLC3 IBM 486DLC3
8087 80287 80287, 80387 80387SX eingebaut 487SX=486DX Cx387SLC CX487DLC i386DX CX487S CX487S CX487S i386SX i386SX i387DX i387DX
Tab. 9.2: Mathematische Coprozessoren für verschiedene CPUs in der Übersicht
Die Rechenleistung eines 486DX-Systems kann häufig durch einen zusätzlichen mathematischen Coprozessor der Firma Weitek (Typ 4167) gesteigert werden, für den auf vielen Mainboards noch ein entsprechender Sockel zusätzlich vorhanden ist. Von dieser Möglichkeit wurde jedoch in den seltensten Fällen Gebrauch gemacht, da er verhältnismäßig teuer war. Zunächst aber ein paar weitere Grundlagen über die Darstellung von Gleitkommazahlen und deren Formaten.
9.1.1
Zahlenexkurs – die Darstellung von Gleitkommazahlen
In Kapitel 2.2 haben wir bereits die interne Darstellung von positiven und negativen ganzen Zahlen sowie die binärcodierten Dezimalzahlen kennen gelernt. Für umfassende arithmetische Berechnungen fehlen uns aber noch gebrochene Zahlen wie z.B. ¼ oder -0,06215 oder gemischte Zahlen wie beispielsweise -15/7 oder 19456,208 etc. Wissenschaftliche Notation und n-Überschussdarstellung Grundlage für die Darstellung solcher Zahlen im Computer bildet die so genannte wissenschaftliche Notation oder Gleitkommadarstellung. In dieser (dezimalen) Notation wird jede von Null verschiedene Zahl durch eine vorzeichenbehaftete Zahl zwischen 1 und 10, die Mantisse ±M und durch eine Potenz zur Basis B mit Wert 10 mit vorzeichenbehaftetem Exponenten ±E ausgedrückt:
Sandini Bib 264
Kapitel 9
Zahl = ±M * B±E Das sieht im Moment erst einmal sehr mathematisch aus, daher möchte ich zunächst ein kurzes Beispiel mit den obigen Zahlen geben. Beispiel: wissenschaftliche Notation mit der Dezimalbasis 10 1/4 = 0,25 = 2,5 * 0,1 = 2,5 * 10-1 Mantisse 2,5, Basis 10, Exponent –1 -0,06215 = -6,215 * 0,01 = -6,215 * 10-2 Mantisse -6,215, Basis 10, Exponent –2 -1 5/7 = -1,71428... = -1,71428 * 1 = -1,71428 * 100 Mantisse -1,71428, Basis 10, Exponent 0 19456,208 = 1,9456208 * 10.000 = 1,9456208*104 Mantisse 1,9456208, Basis 10, Exponent 4
Jetzt wird auch die Bezeichnung Gleitkommadarstellung verständlich: Das Komma wird so lange verschoben, bis in der Mantisse eine Ziffer vor und entsprechend viele Ziffern nach dem Komma stehen. Der Wert der Zahl wird durch eine Erhöhung oder Erniedrigung des Exponenten beibehalten. Im Gegensatz hierzu ist die Position des Kommas bei so genannten Festkommazahlen – wie der Name schon sagt – fest, sie haben dadurch nur einen wesentlich geringeren Wertebereich. An der dritten Zahl im Beispiel können Sie aber auch einen Nachteil der wissenschaftlichen Notation erkennen: Eine Zahl, die sich nicht als endlicher Dezimalbruch angeben lässt – und dazu gehören alle gebrochenen Zahlen, deren Nenner nicht ein Produkt aus lauter 2en und 5en ist – wird nach einer gewissen Zahl von Stellen einfach »abgeschnitten«. Im Beispiel ist -15/7 eben nicht nur -1,71428, sondern setzt sich anschließend noch mit der Ziffernfolge 5714... unendlich lange fort. Bei ¼ geht es dagegen exakt, da der Nenner 4 gleich 2*2 und damit ein Produkt aus lauter 2en ist. Sie haben natürlich weder Bleistift noch Papier, geschweige denn die Zeit, eine unendliche Ziffernfolge aufzuschreiben und in den meisten Fällen wäre das wohl auch sinnlos. Man gibt sich stattdessen mit einer endlichen Zahl von Mantissenstellen zufrieden. Die Zahl der Mantissenstellen bezeichnet man als Genauigkeit. Im Beispiel besitzen die Zahlen also eine Genauigkeit von zwei, vier, sechs bzw. acht Dezimalstellen. Um die Darstellung gebrochener Zahlen im PC besser zu verstehen, wollen wir wie bei der Behandlung ganzer Zahlen zuerst die Interpretation einer Zahl in der Gleitkommadarstellung analysieren. Die ganze Dezimalzahl 2806 wurde als 2 * 103 + 8 * 102 + 0 * 101 + 6 * 100 interpretiert. Bei der Gleitkommazahl 6,215*10-2 gehen wir ähnlich vor: 6,215 * 10-2 = [6 * 1 + 2 oder = 6 * 10-2 + = 6 * 0,01 +
= [6 * 100 + 2 * 10-1 + 1 * 10-2 + 5 * 10-3] * 10-2 * 0,1 + 1 * 0,01 + 5 * 0,001] * 0,01 = 0,06215 2 * 10-3 + 1 * 10-4 + 5 * 10-5 2 * 0,001 + 1 * 0,0001 + 5 * 0,00001 = 0,06215
Sie sehen, die Interpretationen gleichen sich. Der Wert der Stelle einer Ziffer nimmt von links nach rechts um jeweils eine Zehnerpotenz ab, wobei man mit dem Wert beginnt, der durch den Exponenten angegeben wird. Dasselbe gilt auch für Gleitkommazahlen, die größer als 1 sind: 1,9456208 * 104 = [1 * 100 + 9 * 10-1 + 4 * 10-2 + 5 * 10-3 + 6 * 10-4 + 2 * 10-5 + 0 * 10-6 + 8 * 10-7] * 104 = [1 * 1 + 9 * 0,1 + 4 * 0,01 + 5 * 0,001 + 6 * 0,0001 + 2 * 0,00001 + 0 * 0,000001 + 8 * 0,0000001] * 10000 = 19456,208
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
265
oder =1 * 104 + 9 * 103 + 4 * 102 + 5 * 101 + 6 * 100 + 2 * 10-1 + 0 * 10-2 + 8 * 10-3 = 10.000 + 9.000 + 400 + 50 + 6 + 0,2 + 0,00 + 0,008 = 19456,208
In analoger Weise werden auch in Computern Gleitkommazahlen dargestellt, nur tritt hier die Zwei entsprechend dem Binärsystem an die Stelle der Zehn des Dezimalsystems. Beispiel: 1,1011001 * 210011 im Binärsystem bedeutet [1 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 + 1 * 2-4 + 0 * 2-5 + 0 * 2-6 + 1 * 2-7] * 219 =[1 * 1 + 1 * 0,5 + 0 * 0,25 + 1 * 0,125 + 1 * 0.0625 + 0 * 0,03125 + 0 * 0,015625 + 1 * 0,0078125] * 524.288 = [1,6953125] * 524.288 = 888.832 In »normaler« Binärdarstellung gilt 888.832 = 1101 1001 0000 0000 0000b.
Das Beispiel gibt zwar das Prinzip der Darstellung von Gleitkommazahlen im Binärsystem an, die Behandlung von negativen Zahlen und Zahlen mit negativem Exponenten, d.h. die Zahlen sind kleiner als 1, ist aber unvollständig. Allgemein lautete die wissenschaftliche Notation Zahl = ±Mantisse * Basis±Exponent. Es treten also unter Umständen zwei negative Zahlen auf. Zur Darstellung negativer Zahlen haben wir bereits in Kapitel 2.2.3 zwei Möglichkeiten kennen gelernt: Vorzeichenbit und Zweierkomplementdarstellung. Obwohl sich die Zweierkomplementdarstellung bei ganzen Zahlen als sehr vorteilhaft erwiesen hat, geht man bei der Darstellung von Gleitkommazahlen einen anderen Weg. Für die Mantisse verwendet man ein Vorzeichenbit, für den Exponenten die so genannte n-Überschussdarstellung oder Darstellung mit Biased-Exponent. Somit sieht eine Gleitkommazahl im Binärsystem folgendermaßen aus: Zahl = ±Mantisse * 2Exponent-Bias Das Vorzeichen ± der Mantisse wird durch ein Vorzeichenbit angegeben und vom angegebenen Exponenten wird ein fester Bias-Wert abgezogen. Beispiel: 127-Überschussdarstellung der Zahl 888.832: 1,1011001 * 210010010 Wert in »normaler« Darstellung daher: 1,1011001 * 210010010-1111111 = 1,1011001 * 210011
Wie Sie sehen, stimmt das Ergebnis mit dem obigen Beispiel überein. Die Tatsache, dass die beiden binären Gleitkommazahlen 1,1011001 * 210010010 und 1,1011001 * 210011 denselben Wert angeben, ist ein weiteres Beispiel dafür, dass es nicht nur auf die Ziffernfolge, sondern insbesondere auch auf die Interpretation ankommt. Sie können natürlich selbst eine eigene »Hans-Meier-Darstellung« von binären Gleitkommazahlen einführen, indem Sie z.B. sowohl die Mantisse als auch den Exponenten in Zweierkomplementdarstellung angeben. Ihrer Phantasie sind keine Grenzen gesetzt, ob das Ergebnis aber erstens sinnvoll, zweitens praktisch und drittens allgemein anerkannt ist, steht auf einem anderen Blatt. Die Implementierung von Gleitkommaarithmetik durch elektronische Schaltungen ist erheblich komplizierter als die von ganzen Zahlen. Zum Beispiel können zwei Gleitkommazahlen nicht einfach addiert werden, weil ihre Exponenten möglicherweise nicht übereinstimmen. Die CPU muss intern zunächst die Exponenten prüfen und angleichen, bevor die ebenfalls angeglichenen Mantissen addiert werden können. Aus diesem Grund werden die elektronischen Schaltungen für Gleitkommaarithmetik eben mit einem (separaten) Coprozessor gebildet.
Sandini Bib 266
9.1.2
Kapitel 9
Der Standard – IEEE-Formate
Ähnlich wie bei ganzen und langen ganzen Zahlen müssen Sie auch für Gleitkommazahlen eine bestimmte Anzahl von Bits reservieren. Im Prinzip haben Sie selbstverständlich auch die Freiheit, eine »krumme« Zahl von Bits wie z.B. 43 Bit für eine Gleitkommazahl vorzusehen. Um einen einfachen Austausch auch von binären Gleitkommazahlen zu ermöglichen, verwendet man die so genannte IEEE-Darstellung. In den folgenden Abschnitten sollen diese Darstellungsformen näher erläutert werden. In Abbildung 9.1 sehen Sie die IEEE-Formate für die Zahlentypen Short Real, Long Real und Temporary Real. Sie sind 32, 64 bzw. 80 Bit lang und verwenden alle die n-Überschussdarstellung. Das Short-Real-Format besitzt eine 24-Bit-Mantisse, nimmt aber nur 23 Bit davon in die 4 Byte des Short-Real-Formats auf. Wo steckt nun aber das Bit M0 der Mantisse? Des Rätsels Lösung ist einfach, aber genial. Oben wurde erwähnt, dass bei der wissenschaftlichen Darstellung immer eine Zahl zwischen 1 und 9 vor dem Komma steht. Diese Darstellung wird auch als normalisierte Darstellung bezeichnet. Geht man analog auch bei binären Gleitkommazahlen vor, so soll hier die Zahl 1 vor dem Komma sein, da ja nur 0 und 1 zur Verfügung stehen. 0 fällt weg, weil man durch Verkleinerung des Exponenten das Komma so weit durch die Zahl schieben kann, bis eine 1 vor dem Komma steht. Short Short Real Real (einfache (einfach genaue genaue Gleitkommazahl, Gleitkommazahl, 3232Bits) Bits) –38 < |x| < 3,40*10+38, Genauigkeit 24 Bits Wertebereich 1,18*10-38 Wertebereich 1,18*10 < |x| < 3,40*10+38, Genauigkeit 24 Bits 31 30
23 22
S E7
E0 M1
0
M23
S: Vorzeichenbit (1=negative 0=positive Mantisse) S: Vorzeichenbit (1=negative Mantisse, Mantisse, 0=positive Mantisse) EE Exponent(8(8Bits, Bits, Bias 127) 7...E : : Exponent Bias 127) 7...E00 M1...M23: Mantisse (23 Bits plus implizitem M0=1) M1...M23: Mantisse (23 Bits plus implizitem M0=1) Long Bits) Long Real Real(doppelt (doppelt genaue genaueGleitkommazahl, Gleitkommazahl,64 64 Bits) –308 < |x| < 1,79*10+308, Genauigkeit 53 Bits Wertebereich 2,23*10-308 Wertebereich 2,23*10 < |x| < 1,79*10+308, Genauigkeit 53 Bits 63 62
S E10
52 51
0
E0 M1
M52
S: Vorzeichenbit (1=negative 0=positive Mantisse) S: Vorzeichenbit (1=negative Mantisse, Mantisse, 0=positive Mantisse) EE ...E Exponent (11 (11 Bits, Bits,Bias Bias1023) 1023) ...E0:0: Exponent 10 10 MM (52 Bits Bits plus plus implizitem implizitem M0=1) 1...M 52:: Mantisse Mantisse (52 M0=1) 1...M52 Temporary Gleitkommazahl, Temporary Real Real(temporäre (temporäre Gleitkommazahl, 8080Bits) Bits) –4932 < |x| < 1,18*10+4932, Genauigkeit 64 Bits Wertebereich 3,37*10-4932 +4932
Wertebereich 3,37*10
79 78
S E14
< |x| < 1,18*10
, Genauigkeit 64 Bits
64 63
E0 M0
0
M63
S: Vorzeichenbit (1=negative 0=positive Mantisse) S: Vorzeichenbit (1=negative Mantisse, Mantisse, 0=positive Mantisse) EE ...E : Exponent (15 Bits, Bias 16.383) 14 14...E0:0 Exponent (15 Bits, Bias 16.383) MM (64 Bits) Bits) 0...M 63:: Mantisse Mantisse (64 0...M63 Abb. 9.1: IEEE-Formate für Short Real, Long Real und Temporary Real
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
267
Die Werte, die durch die IEEE-Formate dargestellt werden, lauten allgemein: Wert = (-1)S * (1 + M1 * 2-1 + M2 * 2-2 + ... + M23/M52/M63 * 2-23/52/63) * 2E7/E10/E14...E1E0 -
127
Beispiel: 0,001011 * 201101 Komma verschieben, bis 1 davor steht -> 0,1011 * 201100 -> 1,011 * 201011 normalisiert lautet die Zahl also 1,011 * 201011
In normalisierter Darstellung beginnt also jede Gleitkommazahl mit einer 1. Das IEEE-Format verwendet ausschließlich normalisierte Gleitkommazahlen, sodass die erste Ziffer M0 der Mantisse, nämlich die Ziffer vor dem Komma, stets gleich 1 ist. Sie muss nicht extra in die Zahl aufgenommen werden, sondern ist implizit als 1 bekannt. Die gespeicherte Mantisse gibt somit die »Nachkommaziffern« an. In den Bits 23 bis 30 ist der Biased Exponent gespeichert. Um den »richtigen« Exponenten zu erhalten, müssen Sie den Wert 127 vom gespeicherten Exponenten abziehen. Werte kleiner als 127 im Exponenten führen zu negativen Exponenten und bezeichnen also Zahlen kleiner als 1. Die Wahl von 127 als Bias ist eigentlich willkürlich, durch 127 liegt der Exponent 0 für die Zahl 1 zwischen dem größten und kleinsten möglichen Exponenten im IEEE-Format. Das Bit S gibt schließlich das Vorzeichen der Zahl an. Beispiel: 70,457 = 7,0457*101 lautet im Short-Real-Format: 428ce9fc = 0100 0010 1000 1100 1110 1001 1111 1100b Mantisse: 2–4+2–5+2–8+2–9+2–10+2–12+2–15+2–16 +2–17+2–18+2–19+2–20+2–21 = 0,1008906 noch implizite 1 hinzuaddieren: 1,1008906 Exponent: 133-Bias(127) = 6 Vorzeichen: 0 = positive Zahl Die Zahl lautet also +1,1008906 * 26 = +1,1008906 * 64 = 70,457
Für das Long-Real-Format gilt das Gleiche. In den Bits 0 bis 51 sind die Nachkommaziffern der Mantisse abgelegt, auch hier ist das Bit M0 der Mantisse stets gleich 1, das Format also normalisiert. Zusammen mit dem auf 11 Bit erweiterten Biased-Exponenten mit Bias 1023 ist der Wertebereich erheblich größer als beim Short-Real-Format und reicht für die meisten Anwendungen vollkommen aus. Schon beim Short-Real-Format ist das Verhältnis des größten zum kleinsten möglichen Wert ein Vielfaches von dem Verhältnis zwischen der Größe des Universums und einem Atom. Und die Genauigkeit von fast 16 Dezimalstellen im Long-Real-Format übertrifft die experimentelle Genauigkeit aller bekannten Naturkonstanten. Die Werte 255 und 2048 für den Biased-Exponenten im Short- bzw. Long-Real-Format sind definitionsgemäß reserviert. Eine Gleitkommazahl mit diesen Exponenten wird als NAN bezeichnet und nicht als Zahl betrachtet (engl. für Not a Number). Coprozessoren oder Software-Emulationen von Coprozessoren geben beim Auftreten einer solchen Zahl eine Fehlermeldung aus oder verarbeiten stattdessen eine vorbestimmte Zahl. Die Coprozessoren von Intel und auch Software-Emulationen von Coprozessoren verwenden häufig das temporäre Real-Format mit einer Länge von 80 Bit. Dieses Format ist nicht notwendigerweise normalisiert. Das Bit M0 der Mantisse wird auch tatsächlich im Format abgelegt und
Sandini Bib 268
Kapitel 9
nicht implizit als 1 vorausgesetzt. Wertebereich und Genauigkeit dieses Formats sind enorm. Mit den 80 Bit des Temporary-Real-Formats lassen sich 280 = 1,2 * 1024 verschiedene Zahlen darstellen. Selbst ein PC, der pro Sekunde eine Million verschiedener Zahlen im Temporary-Real-Format in den Coprozessor laden kann, würde über 30 Milliarden Jahre benötigen, um jede mögliche Zahl einzulesen. Das ist doppelt so lang wie das Universum besteht. Die 80 Bit sollten also auch für den ambitionierten Programmierer ausreichen. Es scheint nun etwas sehr Eigenartiges aufzutauchen: eine positive und eine negative Null, also zwei Nullen. Mathematisch gesehen ist das sinnlos, es gibt genau eine und nur eine Null, überdies ohne Vorzeichen. Der tiefere Grund für die plötzliche Existenz von zwei Nullen ist, dass in den Gleitkommaformaten und Coprozessoren Zahlen über ihre Darstellung, in der Mathematik aber abstrakt über ihre Eigenschaften definiert werden. Neben dem Long- besitzt auch das ShortReal-Format ein Vorzeichenbit. Wenn alle restlichen 31 Bit gleich 0 sind, so soll offensichtlich die Zahl Null dargestellt werden. Durch das Vorzeichenbit sind aber für die Darstellung zwei Möglichkeiten denkbar: +0 bei gelöschtem und -0 bei gesetztem Vorzeichenbit. Dasselbe gilt auch für die anderen Gleitkommazahlenformate. Noch komplizierter wird die Sache bei Gleitkommazahlen im normalisierten Format. Hier wird die führende 1 der Mantisse immer weggelassen. Wie soll man nun aber wissen, ob die einfach genaue Gleitkommazahl 00000000h tatsächlich die Zahl Null oder durch das implizite M0=1 den Wert 1*2-127 darstellt? Da hilft nur eine klare Definition: Bei einer Gleitkommazahl im normalisierten Format mit dem kleinstmöglichen Exponenten muss auch die Mantisse gleich 0 sein, sie stellt dann die Zahl 0 dar. Hat dagegen der Exponent den kleinstmöglichen Wert und ist die Mantisse von 0 verschieden, so nimmt man an, dass die Mantisse nicht in normalisierter, sondern in »echter« Form angegeben ist. Das führt zu einer Zahl, die im vorgeschriebenen Format nur mit graduellem Unterlauf dargestellt werden kann: Die Zahl ist für die normalisierte Darstellung zwar zu klein, kann aber trotzdem noch dargestellt werden, wenn man die Normalisierung aufgibt und somit auch führende Nullen zulässt. Beispiel: 00000001h Vorzeichen 0b
-> positive Zahl
Biased-Exponent 0000 0000b -> Exponent -127, daher keine Normalisierung der Mantisse Mantisse 000 0000 0000 0000 0000 0001 = 2-22 Wert der nicht normalisierten Zahl: Mantisse * 2Exponent = 2-22 * 2-127 = 2-149 = 1,4012985 * 10-45 In normalisierter Darstellung ist bei 00800000h=1*2-126=1,1754944 * 10-38 Schluss.
9.1.3
Funktionsweise und Aufbau
Als mathematischer Coprozessor kann der 80387, der ab dem i486 in die CPU integriert ist, die Gleitkommazahlen direkt verarbeiten, ohne eine Trennung in die Bestandteile Vorzeichen, Mantisse und Exponent vorzunehmen und stellt intern alle Zahlen von der ganzen Zahl mit 16 Bit Länge bis zur Temporary-Real-Gleitkommazahl als 80-Bit-Gleitkommazahl im Temporary-RealFormat nach dem IEEE-Standard dar. In Abbildung 9.2 sehen Sie die Zahlenformate, die vom 80387 unterstützt werden. Er hält sich für Gleitkommazahlen streng an die IEEE-Formate.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
269
Unter den Befehlen sind für die Verwaltung der Zahlenformate zwei von besonderer Bedeutung: Load und Store. Mit dem Befehl Load wird eine Zahl in einem der Formate, die in Abbildung 9.2 dargestellt sind, in ein Register des 80387 geladen und gleichzeitig in das 80-Bit-Temporary-RealFormat umgesetzt. Alle Berechnungen führt der Coprozessor nun intern mit diesem Zahlenformat aus, von der einfachen Vergleichsoperation bis zur sehr aufwändigen Berechnung eines Logarithmus. Der Befehl Store ist das Pendant zu Load: Er speichert eine Zahl, die Coprozessor-intern im Temporary-Real-Format abgelegt ist, in einem der Formate der Abbildung 9.2 ab. Hierzu führt der 80387 automatisch eine Formatumwandlung aus. Die in der Abbildung gezeigten Zahlenformate beziehen sich also nur auf die vom Coprozessor unterstützten Formatumwandlungen, nicht auf die interne Darstellung. Ganzzahl Zweierkomplementdarstellung, Ganzzahl (Integer, (Integer, Zweierkomplementdarstellung, 16 Wertebereich –32.768 ≤≤ xx ≤ ≤ +32.767, Wertebereich -32.768 +32.767, Genauigkeit Genauigkeit
16 Bits) Bits) 16 Bits 16 Bits
0
15
I15
I0
lange Zweierkomplementdarstellung, Bits) lange Ganzzahl Ganzzahl (Long (Long Integer, Integer, Zweierkomplementdarstellung, 32 32 Bits) 9 ≤ x ≤ +2*109, Genauigkeit 32 Bits Wertebereich –2*10 Wertebereich -2 *109 ≤ x ≤ +2*109, Genauigkeit 32 Bits 0
31
I31
I0
doppelt Bits) doppelt lange lange Ganzzahl Ganzzahl (Zweierkomplementdarstellung, (Zweierkomplementdarstellung, 64 64Bits) 18 ≤ x ≤ +9*1018, Genauigkeit 64 Bits Wertebereich –9*10 Wertebereich -9 *1018 ≤ x ≤ +9*1018, Genauigkeit 64 Bits 0
63
I63
I0
gepackte Genauigkeit 18 18 Dezimalstellen Dezimalstellen gepackte BCD-Zahl BCD-Zahl (80 (80 Bits), Bits), Genauigkeit Wertebereich –999.999.999.999.999.999 ≤ x ≤ +999.999.999.999.999.999 Wertebereich -999.999.999.999.999.999 ≤ x ≤ +999.999.999.999.999.999 79
S
40 39
32 31
24 23
16 15
8 7
D17 D16 D15 D14 D13 D12 D11 D10 D9
D8 D7
D6 D5
D4 D3
D2 D1
64 63
72 71
56 55
48 47
0
D0
Short genaue Gleitkommazahl, Gleitkommazahl,3232 Bits) Bits) Short Real Real (einfache (einfach genaue –38 < |x| < 3,40*10+38, Genauigkeit 24 Bits Wertebereich 1,18*10 Wertebereich 1,18 *10-38 < |x| < 3,40*10+38, Genauigkeit 24 Bits 31 30
23 22
S E7
E0 M1
0
M23
Long Gleitkommazahl, Long Real Real (doppelt (doppelt genaue genaue Gleitkommazahl, 64 64 Bits) Bits) –308 < |x| < 1,79*10+308, Genauigkeit 53 Bits Wertebereich 2,23*10 Wertebereich 2,23 *10-308 < |x| < 1,79*10+308, Genauigkeit 53 Bits 63 62
S E10
52 51
E0 M1
0
M52
Temporary 80 Bits) Temporary Real Real (temporäre (temporäre Gleitkommazahl, Gleitkommazahl, 80 Bits) –4932 < |x| < 1,18*10+4932, Genauigkeit 64 Bits Wertebereich 3,37*10 Wertebereich 3,37 *10-4932 < |x| < 1,18*10+4932, Genauigkeit 64 Bits 79 78
S E14
64 63
E0 M0
Abb. 9.2: 80387-Zahlenformate
0
M63
Sandini Bib 270
Kapitel 9
Sie können sich sicher vorstellen, dass die Umsetzung der Zahlenformate sehr rechenaufwändig sein kann. So benötigt etwa das Laden einer 16-Bit-Ganzzahl aus dem Speicher in den mathematischen Coprozessor und die damit verbundene Formatumwandlung bis zu 53 Taktzyklen. Im Falle einer BCD-Zahl kann der Aufwand auf bis zu 97 Taktzyklen ansteigen. Die Abspeicherung dauert sogar noch länger. Für einfache Berechnungen, wie z.B. Addition, Subtraktion und Multiplikation mit Gleitkommazahlen, ist daher der Aufwand für die Formatumwandlung größer als der Gewinn durch die Möglichkeit zur direkten Verarbeitung von Gleitkommazahlen. Aus diesem Grund verarbeiten einige Anwendungsprogramme einfache Gleitkommaberechnungen mittels Software-Emulation auf der eigentlichen CPU und greifen erst bei aufwändiger zu berechnenden Größen, wie z.B. dem Logarithmus, auf den Coprozessor zu, der diese Aufgaben dann auch erheblich schneller ausführt. Einfache Tabellenauswertungen wie die Bildung von Summe und Durchschnittswert einer Spalte oder Zeile laufen also mit und ohne Coprozessor häufig gleich schnell ab. Dreidimensionale CAD-Anwendungen benötigen demgegenüber sehr häufig die trigonometrischen Funktionen wie Sinus und Tangens, um Projektionen auf eine bestimmte Ebene zu berechnen. Den Sinus einer (Gleitkomma-) Größe x kann man durch die folgende Summe berechnen: sin x = x – x3/3! + x5/5! – x7/7! +- ... (3!=1*2*3=6, 5!=1*2*3*4*5=120 etc.) Je nach Wert von x benötigt man mehr oder weniger Glieder xn/n!, um den Wert von sin x mit ausreichender Genauigkeit zu ermitteln. Sie sehen an der Formel, dass jede Menge rechenaufwändiger Gleitkommamultiplikationen für die Potenzen xn und Gleitkommadivisionen durch die Fakultäten n! notwendig sind. Software-Emulationen 6 benötigen hierzu sehr viel Zeit. Bei solchen Funktionen kann der mathematische Coprozessor also seine Rechenstärke voll ausspielen. Ohne Coprozessor rechnet der PC für eine umfangreiche, dreidimensionale Projektion bei CAD- oder Ray-Tracing-Anwendungen tagelang, mit Coprozessor »nur« noch ein paar Stunden. Ein mathematischer Coprozessor stellt der eigentlichen CPU zusätzliche Register, Datentypen und Befehle zur Verfügung. Das geschieht durch ein definiertes Zusammenwirken beider Einheiten rein auf Hardware-Ebene. Für den Programmierer, auch den Assembler- oder Maschinenspracheprogrammierer, erscheint diese Kombination als ein einziger Prozessor. Der 80387 ist im Wesentlichen in zwei funktionale Gruppen unterteilt: die Steuereinheit CU sowie die Numerikeinheit NU. Die Numerikeinheit führt die mathematischen Berechnungen aus, die Steuereinheit liest und dekodiert die Befehle, liest und schreibt Speicheroperanden über die CPU und führt die 80387-Steuerbefehle aus. Die CU kann sich also der Synchronisation mit der CPU widmen, während die numerische Schwerarbeit von der NU geleistet wird. Aus mathematischen Gründen werden Exponent und Mantisse einer Gleitkommazahl bei einer Berechnung unterschiedlichen Operationen unterworfen. Beispielsweise lässt sich die Multiplikation zweier Gleitkommazahlen ±M1*B±E1 und ±M2*B±E2 auf die Addition der Exponenten und die Multiplikation der Mantissen zurückführen. Das Ergebnis lautet also ±M1*B±E1 * ±M2*B±E2 = (±M1 * ±M2) * B(±E1 + ±E2) Das Rechenwerk der NU ist daher in ein Exponentialmodul und ein Mantissenmodul aufgeteilt, das Interface zwischen beiden dient u.a. dazu, das Ergebnis durch Vergrößerung oder Verkleinerung des Exponenten zu normalisieren.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
Numerikeinheit
Rechenwerksteuerung
Steuerwort Statuswort
Daten
(NU)
Interface
Mantissenmodul
(CU)
Exponentialmodul
Steuereinheit
271
Tag-Wort
Datenpuffer
Status Adressen
Registerstapel
Bussteuerung
Abb. 9.3: Der 80387 besitzt eine Steuereinheit zur Ansteuerung des Busses und zur Kontrolle der Numerikeinheit. Die Numerikeinheit führt die Berechnungen mit Gleitkommazahlen in einem Exponential- und einem Mantissenmodul aus.
Die Befehle für die zwei verschiedenen Prozessoren sind in einem einzigen Befehlsstrom vermischt. Die Coprozessorbefehle unterscheiden sich aber in einem wesentlichen Punkt von den »normalen« CPU-Befehlen: Sie beginnen stets mit der Bitfolge 11011 (=27) und werden auch als ESC-Befehle bezeichnet. Die Befehle und Präfixe für die eigentliche CPU können demgegenüber mit einer beliebigen Bitfolge außer 11011 beginnen. Registerstapel 79 78
64 63
0
1 0
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
S
Exponent
Mantisse
Tag
Steuer- und Statusregister 15
1
31
16 15
Steuerregister
Befehlszeiger
Statusregister
Datenzeiger
Tag-Wort
Abb. 9.4: Die internen Register des 80387
0
Sandini Bib 272
Kapitel 9
In der eigentlichen CPU sind mehrere individuell ansprechbare Vielzweckregister EAX, EBX etc. sowie Segmentregister CS, DS und SS vorhanden. Der Coprozessor 80387 besitzt stattdessen einen Registerstapel mit acht 80-Bit-Registern R1 bis R8 sowie verschiedene Steuer- und Statusregister (siehe Abbildung 9.4). Jedes der acht Datenregister ist entsprechend dem Temporary-Real-Format in drei Bitgruppen unterteilt. Die acht Datenregister werden als Stapel (oder engl. Stack) und nicht als individuelle Register verwaltet. Das 3-Bit-Feld TOP im Statuswort (siehe Abbildung 9.5) zeigt auf das gegenwärtig »oben« befindliche Register (engl. Top of Stack). TOP hat also ähnliche Eigenschaften und Aufgaben wie der Stack-Zeiger ESP im 80386. Sie können über 80387-Befehle wie FLD (Floating Load and Push) und FSTP (Floating Store and Pop), die dem PUSH und POP des 80386 ähnlich sind, TOP um 1 vermindern und einen Wert im zugehörigen Register ablegen bzw. TOP um 1 erhöhen und den Wert des zugehörigen Registers vom Stack abnehmen. Wie üblich »wächst« der Stapel also nach unten zu Registern mit kleinerer Nummer. Die meisten Coprozessorbefehle adressieren implizit das Register »oben« auf dem Stapel, d.h. das Register mit der im Feld TOP des Statusregisters gespeicherten Nummer. Bei vielen 80387-Befehlen können Sie aber auch ein Register explizit angeben. Doch Vorsicht: die explizite Angabe ist relativ zu TOP. Beispiel: FLD st(3) adressiert zwar das dritte Register, welches der Register R0 bis R7 tatsächlich angesprochen wird, hängt von TOP ab. Ist TOP beispielsweise gleich 5, so wird Register R2 adressiert. Ist TOP gleich 1, so bedeutet FLD st(3) eine ungültige Operation, da das Register R-2 nicht existiert. Die Übergabe von Daten zwischen den Registern R0 bis R7 im 80387 erfolgt sehr schnell, da der Coprozessor einen 84-Bit breiten Datenpfad besitzt und intern keine Formatumwandlung notwendig ist.
B C3 TOP
8 7
C2 C1 C0
0
ES SP PE UE OE ZE DE IE
15
B: B:
Busy-Bit Busy-Bit 0=NUnicht nicht 1=NU aktiv 0=NU aktivaktiv 1=NU aktiv –C0:0:Condition-Code Condition-Code CC33-C TOP (Top of Stack) TOP: Stack-Zeiger Stack-Zeiger (Top of Stack) 000=Reg.0 001=Reg.1 ist ... TOP 111=Reg. ... 111=Reg.7 000=Reg. 0 ist ist TOPTOP001=Reg. 1 ist TOP 7 ist TOP ist TOP ES: ES: Fehlerstatus Fehlerstatus 0=keine Exception 1=nicht-maskierte Exception aufgetreten 0=keine Exception 1=nicht-maskierte Exception aufgetreten SP: SP: Stack-Flag Stack-Flag 0=ungültige Operation außer Registerstapelüberlauf/unterlauf 0=ungültige Operation außer Registerstapelüberlauf/-unterlauf 1=Registerstapelüberlauf/-unterlauf 1=Registerstapelüberlauf/unterlauf PE: PE: Genauigkeit Genauigkeit UE: UE: Unterlauf Unterlauf OE: 0=keine Exception Überlauf OE: Überlauf 0=keine Exception ZE: 1=Bedingung erzeugte Exception Division durch Null ZE: Division durch Null 1=Bedingung erzeugte Exception DE: nicht-normalisierter Operand DE: ungültige nicht-normalisierter Operand IE: Operation IE: ungültige Operation
}
Abb. 9.5: Format des 80387-Statusworts
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
273
Im Statuswort legt der 80387 Informationen über seinen gegenwärtigen Zustand ab. Über die Befehle FSTSW/FNSTSW (Store Status Word) kann der Coprozessor das Statuswort im Speicher ablegen. Die CPU kann dann das Statuswort untersuchen, um z.B. die Ursache einer Exception und eines daraus folgenden Interrupts zu ermitteln. Das Bit B ist beim 80387 nur um der Kompatibilität mit dem 8087 halber vorhanden und stets gleich dem Bit ES. B gibt also keinerlei Aufschluss über den Zustand der Numerikeinheit. Das Bit ES gibt den Fehlerstatus des Coprozessors an. Ist ES gesetzt, so ist eine nicht maskierte Exception aufgetreten, deren Ursache durch die Bits SP bis IE angegeben wird. Bit SP wird benutzt, um ungültige Operationen (Flag IE) durch einen Registerstapelüberlauf oder -unterlauf von ungültigen Operationen mit anderen Ursachen zu unterscheiden. Ist SP gesetzt und daher ein Registerstapelüberlauf oder -unterlauf aufgetreten, so können Sie anhand des Bits C1 zwischen einem Überlauf (C1=1) und einem Unterlauf (C1=0) unterscheiden. Die Interpretation des ConditionCodes C3–C0 einer Vergleichsoperation oder einer hierzu ähnlichen Operation sehen Sie in der Tabelle 9.3. Beachten Sie in diesem Zusammenhang, dass der 80387 mit zwei verschiedenen Nullen arbeitet. Die drei TOP-Bits bilden den schon oben erwähnten Stack-Zeiger auf das »oben« befindliche der Register R7 bis R0. Befehlsart
C3
C2
C1
C0
Bedeutung
vergleichen 0 0 1 1
0 0 0 1
x x x x
0 1 0 1
TOP > Operand (Befehl FTST) TOP < Operand (Befehl FTST) TOP = Operand (Befehl FTST) TOP kann nicht verglichen werden
untersuchen 0 0 0 0 0 0 0 0 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1
0 0 1 1 0 0 1 1 0 0 1 1 0
0 1 0 1 0 1 0 1 0 1 0 1 0
1 1
1 1
0 1
1 0
1
1
1
1
gültig, positiv, nicht normalisiert ungültig, positiv, Exponent=0 (+NAN) gültig, negativ, nicht normalisiert ungültig, negativ, Exponent=0 (-NAN) gültig, positiv, normalisiert unendlich, positiv (+_) gültig, negativ, normalisiert unendlich, negativ (-_) Null, positiv (+0) nicht benutzt Null, negativ (-0) nicht benutzt ungültig, positiv, Exponent=0 (+ nicht-normalisiert) nicht benutzt ungültig, negativ, Exponent=0 (- nicht-normalisiert) nicht benutzt
Tab. 9.3: Die Condition-Codes des 80387
Der Coprozessor erzeugt unter verschiedenen Bedingungen eine Coprozessor-Exception, wobei aber Exceptions individuell maskiert werden können. Außerdem können Sie verschiedene Modi für Rundung und Genauigkeit festlegen. Hierzu dient das Steuerwort, dessen Aufbau Sie in Abbildung 9.6 sehen.
Sandini Bib 274
Kapitel 9
8 7
rs rs rs IC RC
IC: IC: RC: RC: PC: PC: PM: PM: UM: UM: OM: OM: ZM: DM: ZM: IM: DM: rs: IM: rs:
PC rs rs
0
PM UM OM ZM DM IM
15
bedeutungslos (nur wegen Kompatibilität zum 8087/80287 vorhanden: bedeutungslos (nur wegen Kompatibilität zum 8087/80287 vorhanden: 0=projektiv ), 1=affin 0=projektiv (∞),(∞1=affin (±∞)) (±∞)) Rundung Rundung 00=zur 01=nach ±∞) 00=zur nächstliegenden nächstliegenden ZahlZahl 01=nach unten unten (nach (nach ±∞) ∞)) 10=nach 11=abschneiden 0) 10=nach oben oben (+ (+∞ 11=abschneiden (nach (nach 0) Genauigkeit Genauigkeit 00=24 Bit Bit 01=reserviert 10=53 Bit 11=64 00=24 01=reserviert 10=53 Bit Bit 11=64 Bit Genauigkeit Genauigkeit Unterlauf Unterlauf 0=Exception maskiert Überlauf 1=Exception 0=Exception erlaubt Überlauf maskiert Division durch Null nicht-normalisierter Operand Division durch Null 1=Exception erlaubt ungültige Operation nicht-normalisierter Operand reserviert ungültige Operation reserviert
}
Abb. 9.6: Format des 80387-Steuerworts
Der 80387 behandelt unendliche Größen stets im affinen Sinne als ±∞, auch wenn Sie das Bit IC gleich 0 setzen. Der Ausdruck »unendlich« ist mit Vorsicht zu genießen, da es streng mathematisch keine unendlichen, sondern nur nach oben (+∞) oder unten (-∞) nicht beschränkte Größen oder einen so genannten Fernpunkt (∞) auf der Riemannschen Zahlenkugel gibt. Die zwei Bits RC steuern die Rundung in der angegebenen Weise. Die Genauigkeit der Rechnungen lässt sich über die Bits PC einstellen, um Kompatibilität mit Uralt-Coprozessoren aus der 8-Bit-Ära zu wahren. PC beeinflusst aber nur die Ergebnisse der Befehle ADD, SUB, MUL, DIV und SQRT. Die restlichen Bits PM, UM, OM, ZM, DM und IM im Steuerwort kontrollieren die Auslösung einer Exception und den daraus folgenden Interrupts. Der 80387 erfasst und verarbeitet insgesamt sechs verschiedene Exceptions. Über die Bits PM, UM, OM, ZM, DM und IM können Sie Exceptions einzeln maskieren, der Coprozessor führt dann eine Standardroutine zur Behandlung der entsprechenden Fehler aus, einen so genannten Standard On-Chip Exception-Handler. Er ist mit auf dem Chip integriert. Die Ursachen für die jeweilige Exception sowie der zugehörige Standard-Handler werden im folgenden Kapitel angeführt. Im Coprozessor steht noch ein weiteres Statusregister zur Verfügung: das Tag-Wort (siehe Abbildung 9.7). In Tag7–Tag0 legt der 80387 Informationen über den Inhalt der acht Datenregister R7–R0 ab. Der Coprozessor benutzt die Informationen, um bestimmte Operationen schneller ausführen zu können. Der 80387 kann z.B. sehr schnell leere und nicht leere Register auf dem Stapel unterscheiden oder bestimmte Werte wie NAN, unendlich etc. ermitteln, ohne den Wert im entsprechenden Register dekodieren zu müssen. Über den Befehl FSTENV/FNSTENV (Store Environment State) können Sie das Tag-Wort abspeichern und es mit der CPU untersuchen. 15
8 7
0
Tag7 Tag6 Tag5 Tag4 Tag3 Tag2 Tag1 Tag0 Tag7–Tag0: Tag-Werte Registerstapel R7 R0 bis R0 Tag7-Tag0: Tag-Werte fürfür Registerstapel R7 bis 00=gültig 00=gültig 01=Null 11=leer 10=NAN, 01=Null 11=leer unendlicher, nicht-normalisierter Wert oder ungültiges Zahlenformat 10=NAN, unendlicher, nicht-normalisierter Wert oder ungültiges Zahlenformat Abb. 9.7: Format des Tag-Worts
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
9.1.4
275
Die Exceptions des 80387
Im Folgenden sind die Ursachen für die jeweilige Exception sowie der zugehörige StandardHandler kurz aufgeführt. Bei nicht maskierter Exception wird dann das entsprechende Bit im Statuswort (siehe Abbildung 9.5) gesetzt.
: :
: :
: :
Genauigkeit (PE, PM): Das Ergebnis einer Operation ist im festgelegten Format nicht exakt darstellbar. Bei gesetztem Bit PM setzt der Coprozessor seine Arbeit ohne weitere Aktionen fort; Unterlauf (UE, UM): Das Ergebnis ist zwar von Null verschieden, aber zu klein, um es im festgelegten Format darzustellen. Ist UM gleich 1, so hebt der Coprozessor die Normalisierung des Ergebnisses auf und verschiebt die führende 1 der Mantisse so lange nach rechts, bis der Exponent dem gewählten Format entspricht. Jede Verschiebung um eine Stelle nach rechts bedeutet eine Division der Mantisse durch 2, der Wert des Exponenten muss also zum Ausgleich um 1 angehoben werden. Dieser Vorgang wird als gradueller Unterlauf bezeichnet; Überlauf (OE, OM): Das Ergebnis ist für das festgelegte Format zu groß. Ist die Exception maskiert, so erzeugt der Coprozessor intern eine Kodierung für die Zahl ±∞ und arbeitet mit dieser weiter; Division durch Null (ZE, ZM): Der Divisor war gleich Null, der Dividend von Null verschieden. Das Ergebnis ist aus mathematischen Gründen nicht definiert (also eben nicht ±∞). Mit undefinierten Dingen lässt sich schlecht rechnen und der Coprozessor erzeugt so bei maskierter Exception wie beim Überlauf eine Kodierung für ±∞. Diese Lösung ist immer noch besser als gar keine; Nicht-normalisierter Operand (DE, DM): Wenigstens einer der Operanden oder das Ergebnis der Operation ist nicht in normalisierter Form darstellbar (kleinstmöglicher Exponent bei einer von Null verschiedenen Mantisse). Ist DM=1, so setzt der Coprozessor ohne weitere Aktion die Arbeit mit der nicht-normalisierten Größe fort; Ungültige Operation (IE, IM): Es ist ein Überlauf oder Unterlauf des Register-Stapels aufgetreten (PUSH auf einen vollen oder POP von einem leeren Registerstapel), eine mathematisch nicht definierte Operation wie z.B. 0÷0, ∞÷∞ oder ∞-∞ soll ausgeführt werden oder als Operand wird ein als NAN gekennzeichneter Wert herangezogen. Bei maskierter Exception erzeugt der Coprozessor einen bestimmten NAN-Wert oder gibt einen NAN-Wert als Ergebnis aus.
Auch den Exceptions im 80387 stehen die Schutzmechanismen des Protected Modes für Interrupts zur Verfügung. Zusätzlich gibt es noch die drei Exceptions 7, 9 und 13 zur Behandlung von Fehlern, die zwar mit dem 80387 im Zusammenhang stehen, aber von der CPU erkannt und ausgelöst werden. Im Folgenden sind alle Exceptions aufgeführt, die den Coprozessor mittelbar oder unmittelbar betreffen.
:
:
Exception 7 (kein Coprozessor vorhanden): In der CPU war das Bit EM (Coprozessor-Emulation) oder TS (Task Switch) gesetzt, als die CPU im Befehlsstrom einen ESC-Befehl erfasst hat. Ist EM=1, so muss der Coprozessor-Befehl durch Software emuliert werden, der Interrupt Handler stellt also eine Coprozessor-Emulation dar oder ruft eine solche auf. Ist TS=1, so löst ein ESC- oder WAIT-Befehl diesen Interrupt aus, um anzuzeigen, dass der gegenwärtige Coprozessor-Kontext möglicherweise nicht dem aktuellen Task entspricht. Das Betriebssystem muss diesen Zustand geeignet behandeln; Exception 9 (Coprozessor-Segmentüberlauf): Im Protected Mode überspannt ein Operand einen Adressbereich, der durch das Segment des Operanden nicht abgedeckt ist oder der Operand liegt zum Teil ganz oben/unten im Segment und setzt sich ganz unten/oben fort (Wrap-around);
Sandini Bib 276
: :
Kapitel 9
Exception 13 (allgemeiner Protection-Fehler): Im Protected Mode befindet sich das erste Wort oder Doppelwort eines numerischen Operanden zum Teil außerhalb des Segments; Exception 16 (Coprozessor-Fehler): Der vorangegangene Numerikbefehl führt zu einer nicht maskierten Exception. Nur ESC- und WAIT-Befehle können diesen Interrupt auslösen. Eine 80387-interne Exception führt also erst beim nächsten Coprozessor- oder WAIT-Befehl zu einem Interrupt. Je nach konkreter Anwendung sowie Art und Anzahl der geladenen Tasks kann daher eine recht große Zeitspanne vergehen, bis ein Coprozessorfehler zu einem Interrupt führt. Demgegenüber löst der 8087 unmittelbar nach dem Auftreten einer Exception einen Interrupt aus.
Sind Exceptions im Steuerregister maskiert, so führt der 80387 einen Standard On-Chip Exception Handler aus. Beachten Sie aber in diesem Zusammenhang, dass der 80387 nur affine Unendlichkeiten (±∞) und keine projektive (∞) kennt. Unbeschränkte Ergebnisse durch Division mit Null oder Überlauf besitzen also stets ein Vorzeichen, beim 8087 und 80287 kann das Ergebnis des On-Chip-Handlers in Abhängigkeit vom IC-Bit im Steuerregister auch eine projektive Unendlichkeit ohne Vorzeichen sein.
9.1.5
Protected Mode und die Speicherabbilder der Befehls- und Datenzeiger
Wenn der Coprozessor einen Numerikbefehl ausführt, speichert er intern Opcode, Steuer-, Status- und Tag-Wort ab. Tritt eine Coprozessor-Exception auf und löst der 80387 als Folge davon einen Interrupt aus, kann der Handler über den Befehl FSTENV/FNSTENV diesen Environment-Zustand im Speicher ablegen und anschließend die Ursache der Exception ermitteln. Die Behandlung eines Coprozessorfehlers wird dadurch wesentlich erleichtert. Das Speicherabbild unterscheidet sich, je nachdem, ob der Protected oder Real Mode aktiv ist und ob der 80387 gegenwärtig mit 16- oder 32-Bit Operanden und Offsets arbeitet. Die verschiedenen Formate sind in Abbildung 9.8 dargestellt. Vom Opcode werden nur die drei Bits I0..I2 des ersten Befehlsbytes sowie das gesamte zweite Befehlsbyte I15..I8 im Feld Opcode10..0 entsprechend der Abbildung gespeichert. Weil alle Coprozessorbefehle mit der 5-Bit-Kombination 11011b (gleich ESC) beginnen, müssen die fünf Opcodebits I7..I3 nicht gesichert werden, sie sind implizit bekannt. Beachten Sie, dass die drei Bits des ersten Opcode-Bytes in den drei höherwertigen Bits des Opcode-Feldes abgelegt werden. Der 80387 kann durch den Befehl FSETPM (Floating Set Protected Mode) in den Protected Mode umgeschaltet und über den Befehl FRSTPM (Floating Return from Protected Mode) wieder in den Real Mode zurückgeschaltet werden. FSETPM und FRSTPM sind beim 80387 aber nur noch aus Kompatibilitätsgründen mit dem 80287 implementiert. Der 80387 verarbeitet die Coprozessorbefehle im Real und Protected Mode nämlich in identischer Weise, da die Speicherverwaltungseinheit im 80386 enthalten ist und der Coprozessor dadurch keine Adressierungs- und Zugangsprüfungen ausführen muss. Dem 80387 werden der Befehlscode und die Operanden übergeben, nachdem die CPU den Speicher adressiert und die Daten gelesen hat. Bei der Kombination 80286/80287 befinden sich die Register für die Speicherabbilder dagegen auf dem 80287 und nicht im 80286 selbst. Sie müssen also vom 80287 selbst geladen werden und unterscheiden sich im Format, je nachdem, ob der Protected- oder Real-Mode aktiv ist. Ein Umschalten oder Zurückschalten des 80286 in den bzw. aus dem Protected-Mode registriert der 80287 nicht. Es ist also notwendig, ihm das explizit über die Befehle FSETPM und FRSTPM mitzuteilen. Der 80387 unterstützt den Befehl FSETPM, indem er ihn schlicht ignoriert, aber keine Fehlermeldung »Ungültiger Opcode« ausgibt.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
277
Protected-Mode (32-Bit-Format) 31
16 15
0
Offset
Steuerwort
+0
Steuerwort
+0
reserviert
Statuswort
+4
Statuswort
+2
reserviert
Tag-Wort
+8
Tag-Wort
+4
+12
IP-Offset
+6
+16
CS-Selektor
+8
+20
Operandoffset
+10
+24
Operandselektor
+12
reserviert
EIP31...0 00000
Protected-Mode (16-Bit-Format) 15 0 Offset
Opcode 10...0
CS-Selektor
Operandoffset Operandselektor
reserviert
Real-Mode (32-Bit-Format) 31
0000
16 15
Real-Mode (16-Bit-Format) 15 0 Offset
Offset
reserviert
Steuerwort
+0
Steuerwort
+0
reserviert
Statuswort
+4
Statuswort
+2
reserviert
Tag-Wort
+8
Tag-Wort
+4
reserviert
EIP15...0
+12
IP15...0
+6
0 Opcode10...0
+16
IP19... 0 Opcode10...0
Operandoffset15...0
+20
Operandoffset15...0 Op.O. 000000000000 19...16
EIP31...16 reserviert
0000
0
Operandoffset31...16
000000000000
+8 +10
16
+24
+12
Inhalt des Opcode-Feldes i386-Register: Operandenoffset, (E)IP, CS i387-Register: Steuerwort, Statuswort, Tag-Wort
Opcode-Byte 2 I15 .
.
.
.
.
Opcode-Byte 1
. I8 I7 .
I2 I1 I0 I15 .
.
.
.
.
. I3 I2 I1 I0
.
. I8
Opcode-Feld-Eintrag
Abb. 9.8: Die Speicherabbilder der Befehls- und Datenzeiger
9.2 386-Prozessorderivate Die Ausführungen im Kapitel 5 betrafen den 80386 an sich, nämlich den i386DX, wie er von Intel im Nachhinein auch bezeichnet wurde. Er besitzt – um das nochmals kurz zusammenzufassen – einen 32-Bit-Daten- und einen 32-Bit-Adressbus. Intern weist er einen vollwertigen 80386-CPUKern auf, also weder Caches noch eine Gleitkommaeinheit. Von dieser reinen i386-Implementierung wurden nun mehrere Derivate abgeleitet.
Sandini Bib 278
Kapitel 9
Dies sind der i386SX mit eingeschränktem Bus (16-Bit-Datenbus, 24-Bit-Adressbus) als Abrundung nach unten und der 386SL-Chipsatz mit integriertem Cache und eingebauter Peripheriesteuerung (ISA-Bus, Speichercontroller) zur Verwendung in Notebooks. In den folgenden Abschnitten möchte ich Ihnen die wichtigsten i386-Derivate sowie die nachgebauten 386er vorstellen. »Nachbau« bezieht sich bei diesen Prozessoren aber lediglich auf die logische und funktionale Struktur der Prozessoren, nicht auf den tatsächlichen internen, elektronischen Aufbau. Sie stellen (mit Abstrichen bei den benutzten Mikrocodes) auf der Schaltungs- und Herstellungsebene komplette Neuentwicklungen dar.
9.2.1
Abmagerungskur – Die SX-Varianten der Prozessoren
Kurz nach der Vorstellung der 32-Bit-Prozessoren i386 und i387 entwickelte Intel auch zwei abgespeckte Varianten dieser Chips: den i386SX und den zugehörigen Coprozessor i387SX. Intern stimmen sie bis auf eine etwas veränderte Busschnittstelle völlig mit den großen Brüdern überein. Der i386SX kann also in allen drei Betriebsmodi Real, Protected und Virtual-8086-Mode betrieben werden, er besitzt dieselben Steuer-, Debug- und Testregister und führt ein Demand Paging aus, wenn die Paging Unit aktiviert ist. Er besitzt dieselben 32-Bit-Register wie der i386 und kann daher ebenfalls einen logischen Adressraum von 64TByte je Task verwalten und 32Bit-Befehle ausführen. Auch ist die Prefetch-Queue mit 16 Byte gleich lang wie beim i386. Der i387SX kennt dieselben Befehle, besitzt die gleichen Register und tauscht in identischer Weise Daten mit der CPU aus wie der i387. In Tabelle 9.4 sind die wesentlichen Unterschiede aufgeführt, die sich allesamt auf den Adressraum und den Datenbus beziehen.
Adressbus physikalischer Adressraum I/O-Adressraum Port des Coprozessors Datenbus Datentransferrate*) maximale Taktfrequenz *)
i386/i387
i386SX/i387SX
32 Bit 4 GByte 64 KByte 800000fxh 32 Bit 80 MByte/s 40 MHz
24 Bit 16 MByte 64 KByte 8000fxh 16 Bit 25 MByte/s 25 MHz
bei maximaler Taktfrequenz ohne Wait-States
Tab. 9.4: Unterschiede zwischen den DX und den SX-Varianten
Sie erkennen, dass die »normalen« DX-Varianten leistungsfähiger sind. Der i386 ist mit Taktfrequenzen von bis zu 40 MHz hergestellt worden, während für den i386SX maximal 25 MHz vorgesehen sind. Zusammen mit dem doppelt so breiten Datenbus kann der schnellste i386 also in der gleichen Zeit mehr als dreimal so viele Daten übertragen wie der schnellste i386SX. Der i386SX wird in einem Plastic Quad Flatpack Package (PQFP) oder vierseitigen Flachgehäuse mit 100 Pins, der i387SX in einem PLCC-Gehäuse mit 68 Pins ausgeliefert. In Abbildung 9.9 sehen Sie die Anschlussschemata der beiden SX-Chips.
Sandini Bib 279
D1 D2 GND Vcc D3 D4 D5 D6 D7 Vcc D8 D9 D10 D11 D12 GND Vcc D13 D14 D15 A23 A22 GND GND A21
Coprozessoren und 386/486-CPU-Derivate
75
i386SX CPU
51 50
Markierung für Pin1 frei D7 D6 Vcc GND D5 D4 D3 Vcc frei D15 D14 Vcc GND D13 D12 frei
52
1
i387SX Coprozessor
18
35
RESETIN Vcc READY CMD0 ADS Vcc NPS2 NPS1 Vcc GND W/R STEN Vcc GND Vcc BUSY ERROR
LOCK frei FLT frei frei frei Vcc RESET BUSY GND ERROR PEREQ NMI Vcc INTR GND Vcc frei frei frei frei frei Vcc GND GND
25 26
A20 A19 A18 A17 Vcc A16 Vcc GND GND A15 A14 A13 GND A12 A11 A10 A9 A8 Vcc A7 A6 A5 A4 A3 A2
frei frei GND frei Vcc GND Vcc GND GND CKM Vcc READYO PEREQ GND CPUCLK2 NUMCLK2 frei
76
1
frei D0 D1 GND Vcc D2 D8 GND Vcc GND D9 D10 D11 Vcc GND Vcc GND
100 D0 GND HLDA HOLD GND NA READY Vcc Vcc Vcc GND GND GND GND CLK2 ADS BLE A1 BHE frei Vcc GND M/IO D/C W/R
Abb. 9.9: Bei den SX-Varianten von i386 und i387 ist der Datenbus nur mit einer Breite von 16 Bit nach außen geführt, obwohl die Daten intern wie beim i386/i387 mit 32 Bit verarbeitet werden. Durch die von 32 auf 24 reduzierten Adressleitungen umfasst der physikalische Adressraum des i386SX/i387SX nur 16 MByte statt 4 GByte.
Es fällt sofort auf, dass die SX-Prozessoren gegenüber den voll ausgebauten DX-Normalversionen wesentlich weniger Anschlüsse besitzen. Im folgenden Abschnitt möchte ich Ihnen kurz die veränderten Pins und Signale erläutern, insofern sie nicht selbsterklärend sind. BHE, BLE (O) Anschlüsse 19, 17 Die Signale Bus High Enable und Bus Low Enable geben an, welcher Teil – höherwertig und/ oder niederwertig – des Datenbusses gültige Daten ausgibt oder entgegennimmt. Dieselbe Aufgabe übernehmen beim i386 die Pins BE0–BE3. FLT (O) Anschluss 28 Ein aktives Float-Signal an diesem Pin, d.h. ein Signal mit niedrigem Pegel, zwingt alle Pins des i387SX, die Signale ausgeben können, in einen inaktiven Zustand. Das Signal wird meist zu Testzwecken angelegt. Wie der i386 kann auch der i386SX einen internen Selbsttest ausführen. Er wird in gleicher Weise eingeleitet und dauert ca. 30 ms für einen 20MHz-i386SX. Nach dem Selbsttest enthält das DXRegister ein Signaturbyte. Die acht höherwertigen Bits besitzen den Wert 23h, die »3« als Kennzeichnung der 386er-Familie, die »2« zur Angabe, dass es sich um das zweite Mitglied der Familie, eben den i386SX handelt. Das niederwertige Byte gibt eine Kennung der Version des i386SX an. i386SX und i387SX wirken in der gleichen Weise zusammen wie i386 und i387. Der i386SX spricht den Coprozessor also über besondere I/O-Ports an, die außerhalb des normalen I/O-Adressbereichs liegen. Da der i386SX aber statt 32 nur 24 Adressleitungen besitzt, wird die Adressleitung A23 statt A32 aktiviert. Die I/O-Adressen für die Kommunikation zwischen CPU und Coprozessor sind daher nur sechsstellig (siehe Tabelle 9.5). Das Übergabeprotokoll ist dasselbe wie das für die Kombination i386/i387, nur dauert der Datentransfer für 32-Bit-Operanden länger, da aufgrund des 16-Bit-Adressbusses mehr Buszyklen ausgeführt werden müssen.
Sandini Bib 280
Kapitel 9
i386SX-I/O-Port
i387-Register
8000f8h 8000fch 8000feh*)
Opcode-Register Operandenregister Operandenregister
*)
wird bei der Übertragung eines 32-Bit-Operanden im zweiten Buszyklus verwendet
Tab. 9.5: Coprozessor-Port-Adressen
9.2.2
386-CPUs anderer Hersteller
Noch vor wenigen Jahren hatte Intel praktisch das Monopol im Bereich der CPUs, was sich jedoch im Laufe der Zeit geändert hat. Die »CPU-Nachbauten« der anderen Hersteller reichen dabei qualitativ nicht nur an die Intel-Vorbilder heran, sondern übertreffen sie im Hinblick auf Leistung und sparsamen Umgang mit der Stromversorgung teilweise erheblich. Im Folgenden möchte ich Ihnen die wichtigsten 386-Derivate kurz vorstellen. AMD-386-Prozessoren Die AMD-Prozessoren sind nicht nur preiswerter, sondern in den meisten Fällen auch schneller und vor allem stromsparender als ihre Intel-Vorbilder. Diese 386-Ausführungen haben daher besonders in Notebooks ihren Einzug gefunden. AMD hat drei verschiedene DX-Ausführungen mit vollem 32-Bit-Datenbus und 32-Bit-Adressbus sowie drei SX-Ausführungen mit 16-BitDatenbus und 24-Bit-Adressbus hergestellt. Am386DX/Am386SX Der Am386DX ist ein i386DX-kompatibler Prozessor. Seine Taktfrequenz reicht von 20 MHz bis 40 MHz, d.h. seine Taktrate und dadurch auch die Leistung kann um 20% höher sein als beim Original-386. Der Am386SX ist die bekannte »abgespeckte« SX-Version und besitzt nur einen 16-Bit-Datenbus und einen 24-Bit-Adressbus. Beide Prozessoren orientieren sich streng an ihren Intel-Vorbildern und weisen sonst keine wesentlichen Besonderheiten gegenüber diesen auf. Er wird in einem PGA mit 132 Pins oder einem PQFP mit 132 Anschlüssen (Am386DX) bzw. einem PQFP mit 100 Anschlüssen (Am386SX) ausgeliefert. Am386DXL/Am386SXL Der i386DXL- bzw. der i386SXL-kompatible Prozessor ist besonders stromsparend ausgelegt (das L in der Prozessorbezeichnung bedeutet Low-Power). Der Am386DXL/SXL benötigt etwa 40% weniger Strom als das Intel-Vorbild. Die DXL-Ausführung kann mit 20 MHz bis 40 MHz getaktet werden, die SXL-Ausführung mit maximal 25 MHz. Das Besondere am Am386DXL/ Am386SXL ist die statische Ausführung der Schaltkreise. Dadurch kann die Taktfrequenz auf 0 MHz gesenkt, das Taktsignal also praktisch abgeschaltet werden, ohne dass der Prozessor seine Registerinhalte verliert oder anderweitig aus dem Takt kommt. Bei dynamischer Schaltkreisausführung darf dagegen eine minimale Taktfrequenz nicht unterschritten werden, ohne dass sich der Prozessor »verhaspelt«. Wenn das externe Taktsignal abgeschaltet wird, zieht z.B. der DXL-Prozessor nur noch einen Strom von etwa 0,02 mA gegenüber 275 mA bei 33 MHz. Das bedeutet eine Verminderung der Leistungsaufnahme um den Faktor 10.000 (!). Durch das statische Design des Prozessors kann ein Standby-Modus auch einfach implementiert werden. Das BIOS muss die Prozessorregister nicht sichern, sondern kann das Taktsignal nach einer meist programmierbaren Wartezeit, in der keine Tastenbetätigung oder andere Aktion stattfindet, einfach abschalten. Wenn Sie dann z.B.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
281
eine Taste betätigen, um den PC wieder zu aktivieren, gibt die Standby-Logik das Taktsignal wieder frei. Die CPU arbeitet dann wieder, ohne dass das BIOS die alten Registerinhalte wiederherstellen muss. Dies vereinfacht die Implementierung des Strom sparenden Standby-Modus ganz erheblich. Der Am386DXL wird in einem PGA mit 132 Pins oder einem PQFP mit 132 Anschlüssen ausgeliefert, der Am386SXL in einem PQFP mit 100 Pins. Am386DXLV/Am386SXLV Der Am386DXLV/Am386SXLV ist kompromisslos auf einen geringen Stromverbrauch ausgerichtet. Er arbeitet mit einer Betriebsspannung von 3,3 V gegenüber den 5 V des Am386DX/ Am386DXL – daher auch die Bezeichnung LV für Low-Voltage. Die Leistungsaufnahme von CMOS-Chips ist nämlich proportional zum Quadrat der Betriebsspannung. Allein durch die Senkung auf 3,3 V werden also 50% Strom eingespart. Mit 3,3 V kann der Chip aber nur bis zu 25 MHz betrieben werden, für die Ausnutzung der maximalen 33 MHz ist dagegen eine Versorgungsspannung von 5 V erforderlich. Auch der Am386DXLV/SXLV ist in einem statischem Design ausgeführt. Der externe Prozessortakt kann also abgeschaltet werden, der Am386DXLV z.B. benötigt dann nur noch 0,01 mA gegenüber 135 mA bei 25 MHz. Der Am386DXLV wird in einem PQFP mit 132 Pins, der Am386SXLV in einem PQFP mit 100 Pins ausgeliefert. Die Anschlüsse geben mit Ausnahme der zusätzlichen Pins für den SystemManagement-Modus etc. dieselben Signale wie die Intel-Vorbilder ab bzw. nehmen solche entgegen. Im Folgenden sind die zusätzlichen Signale und die zugehörigen Anschlüsse aufgeführt. FLT (I) Anschluss 54 (Am386DXLV), 28 (Am386SXLV) Wird dem Float-Anschluss ein Signal mit niedrigem Pegel zugeführt, dann versetzt der Am386DXLV/SXLV alle bidirektionalen und Ausgabeanschlüsse in einen schwebenden Zustand, er trennt sie also von der Umgebung ab. IIBEN (I) Anschluss 58 (Am386DXLV), 29 (Am386SXLV) Liegt ein aktives Signal mit niedrigem Pegel an diesem I/O-Instruction-Break-Eingang an, dann hält der Am386DXLV/SXLV die Ausführung von Befehlen an, bis er am READY-Eingang ein aktives Signal empfängt. Erst dann führt er den nächsten Befehl aus. Diese Funktion wird meist im Zusammenhang mit dem System-Management-Modus verwendet. Der Am386DXLV/SXLV kann dann einer Einheit, die über einen I/O-Port angesprochen wird und die sich in einem Stromsparmodus befindet (z.B. eine stillgelegte Schnittstelle), Gelegenheit geben, sich zu reaktivieren. Dieser Reaktivierungsvorgang kann wesentlich mehr Taktzyklen in Anspruch nehmen als ein gewöhnlicher I/O-Zugriff mit Waitstates. SMI, SMIADS, SMIRDY (I/O, O, I) Anschlüsse 59, 37, 36 (Am386DXLV), 43, 31, 30 (Am386SXLV) Diese drei Anschlüsse bilden die Schnittstelle zum System-Management-Modus SMM. Er wurde eingeführt, um die Leistungsaufnahme unabhängig vom Betriebsmodus und der Betriebsumgebung zu steuern. Außerdem steht für den System-Management-Modus ein zusätzlicher Adressraum von 1 MByte zur Verfügung, der vollständig vom gewöhnlichen Hauptspeicher getrennt ist. Wenn am (System Management Interrupt) Eingang SMI ein Signal mit niedrigem Pegel anliegt, dann führt das zu einem Interrupt, der höhere Priorität als ein NMI hat. Außerdem kann der SMM durch Setzen eines speziellen Bits im Debug-Register 7 und Ausführen des Opcodes f1h aktiviert werden. In beiden Fällen löst der Am386DXLV/SXLV eine Art »übergeordneten NMI«
Sandini Bib 282
Kapitel 9
aus, sichert den aktuellen Betriebszustand des Prozessors im SMM-Speicher an den Adressen 0006:9999 bis 0006:00c8 und 0006:0100 bis 0006:0124, kehrt gegebenenfalls in den Real-Mode zurück und beginnt die Ausführung des SMI-Handlers bei der Adresse ffff:fff0. Alle Speicherzugriffe betreffen nun ausschließlich den SMM-Speicher. Dagegen betreffen I/O-Zugriffe über Befehle wie z.B. IN oder OUT nach wie vor den normalen I/O-Adressraum. Das SMI-AddressStatus-Signal SMIADS entspricht dem ADS-Signal im üblichen Betriebsmodus und zeigt gültige Buszyklen an. Schließlich zeigt das SMI-Ready-Signal SMIRDY den Abschluss eines Buszyklus im SMM an, es hat also eine analoge Aufgabe wie READY im normalen Betriebsmodus. Um vom SMM-Modus zum unterbrochenen Task zurückzukehren und den ursprünglichen Prozessorzustand wiederherzustellen, muss das Registerpaar ES:EDI mit der Far-Adresse 0006:0000 geladen werden. Die Ausführung des 32-Bit-Opcodes 0fh 07h stellt dann den Prozessorzustand aus den im SMM-Speicher abgelegten Daten wieder her.
9.2.3
Cyrix-386-Prozessoren (486xLC)
Die Firma Cyrix ist ursprünglich vor allem als Hersteller schneller 80x87-Coprozessoren und spezieller Upgrade-CPUs bzw. Upgrade-Module bekannt geworden, deren Grundlage die speziellen 486xLC-CPUs eigener Entwicklung bilden. Diese CPUs stellen trotz der Bezeichnung »486« keinen vollwertigen 486er dar, sodass diese CPUs daher an dieser Stelle behandelt werden.
: : : :
Der 486DLC besitzt einen 32-Bit-Datenbus und einen 32-Bit-Adressbus, der 486SLC hingegen einen 16-Bit-Datenbus und einen 24-Bit-Adressbus. Der 486DLC/486SLC weißt einen internen Cache mit 1 KByte Größe auf, der Original-i486 dagegen einen On-Chip-Cache mit 8 KByte. Gegenüber einem i386 beschleunigt selbst ein solch kleiner Cache die Programmausführung aber deutlich. Weder der 486DLC noch der 486SLC weisen einen integrierten Coprozessor auf. Dieser kann extern mit einem i387 (oder dazu kompatiblen Chip von Cyrix wie dem CX487DLC) nachgerüstet werden. Der Gerechtigkeit halber muss man natürlich sagen, dass auch der i486SX schließlich auch keinen On-Chip Coprozessor besitzt. Der schnelle Burst-Modus des i486 zum Füllen des On-Chip-Caches wird vom Cyrix 486DLC/SLC nicht unterstützt. Dadurch laufen Cache-Line Fills erheblich langsamer ab.
Die angeführten Eigenschaften, die eigentlich einer Bezeichnung als 486er entgegen stehen, werden aber auf der anderen Seite durch ein paar reine 486er-Kennzeichen und sogar die eine oder andere Verbesserung gegenüber dem Intel i486 ausgeglichen. Ich möchte sie im Folgenden kurz vorstellen.
: : :
Die Befehle werden wie im »richtigen« i486 in einer Pipeline ausgeführt. Das ist ein wesentliches Kennzeichen für die teilweise Anwendung von RISC-Technologien im 486er, zu denen auch das Befehls-Pipelining gehört; Der 486DLC/SLC unterstützt alle i486-Befehle, also auch die gegenüber dem i386 neu hinzugekommenen Befehle zur Steuerung des On-Chip-Cache; Die Cyrix-CPUs besitzen einen schnellen Hardware-Multiplizierer. Dadurch werden IntegerMultiplikationen sogar schneller als im Original-i486 ausgeführt.
Ob Sie die oben angeführten Argumente gegen eine Bezeichnung als 486er oder die weiter unten aufgelisteten für eine solche Bezeichnung als gewichtiger empfinden – und dadurch den Namen 486DLC/SLC vor allem beim 486DLC als gerechtfertigt ansehen – möchte ich Ihnen überlassen. Die Cyrix-CPUs sind auf jeden Fall deutlich leistungsfähiger als die Intel- (oder AMD-) 386er, reichen aber natürlich im benutzertypischen Einsatz nicht ganz an die echten 486er heran.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
9.2.4
283
386- und 486-CPUs in der Übersicht
Es sei erwähnt, dass auch die Firmen Chips&Technologies, IBM, SGS und Texas Instruments i386-kompatible Prozessoren hergestellt haben, wobei diejenigen von IBM insbesondere in den eigenen Notebooks verbaut worden sind. Der 386SLC besitzt beispielsweise einen internen 8 KByte-Cache und ist in stromsparender statischer Bauweise ausgelegt. Die Tabelle 9.6 zeigt gebräuchliche 386-CPUs und quasi als Vorgriff auf das folgende Kapitel auch die bekanntesten »486-Ableger«. Außerdem können Sie der Tabelle entnehmen, welche Typen miteinander kompatibel sind und ob ein System Management Modus unterstützt wird. Hersteller/Chip AMD 386SX/SXL AMD 386DX/DXL AMD 386SXLV AMD 386DXLV AMD 486SX AMD 486SX2 *) AMD 486DX AMD 486DX2 *) AMD 486SXLV AMD 486DXLV AMD 486DX4 *) Cyrix 486SLC Cyrix 486DLC Cyrix 486DR2 *) Cyrix 486S Cyrix 486SV Cyrix 486S2 *) Cyrix 486DX2 *) IBM 386DX IBM 386SLC IBM 486SLC2 *) IBM 486DLC3 *) INTEL 386SX INTEL 386DX INTEL 386SL INTEL 486SX INTEL 486SX2 *) INTEL 486DX INTEL 486DX2 *) INTEL 486DX4 *) INTEL 486SXSL INTEL 486DXSL INTEL 486DX2SL *) *)
int. Cache 8 KByte 8 KByte 8 KByte 8 KByte 8 KByte 8 KByte 8 KByte 1 KByte 1 KByte 1 KByte 2 KByte 2 KByte 2 KByte 8 KByte 8 KByte 16 KByte 16 KByte 8 KByte 8 KByte 8 KByte 8 KByte 16 KByte 8 KByte 8 KByte 8 KByte
SMM
pinkompatibel mit
Ja Ja
i386SX i386DX i386SX i386DX i486SX i486SX i486DX i486DX i486SX i486DX i486DX i386SX i386DX i386DX i486SX i486SX i486SX i486DX i386DX i386SX i386SX AMD 386DXLV 386SX 386DX 386SX 486SX 486SX 486DX 486DX 486DX 486SX 486DX 486DX
Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja
Diese CPUs arbeiten mit einer internen Taktvervielfachung
Tab. 9.6: Gebräuchliche 386- und 486-CPUs der verschiedenen Hersteller, die aber mit unterschiedlichen Betriebsspannungen arbeiten, was beim CPU-Austausch unbedingt zu beachten ist.
Sandini Bib 284
Kapitel 9
9.3 486-Prozessorderivate Das bereits mit dem 386er begonnene Spiel der SX-Varianten und CPU-Ableger ist – wer hätte es anders erwartet? – auch beim 486er fortgesetzt worden. Zusätzlich hat Intel das neue Konzept des Upgrading durch Overdrives eingeführt, was Einiges an Verwirrung bei den Anwendern und auch den Motherboard-Herstellern hervorgerufen hat, wie ich es beim 487SX erläutere, mit dem dieses fragwürdige Konzept eingeführt worden ist.
9.3.1
i486SX und i487SX
Sehr bald nach der Markteinführung des i486 stellte Intel, der Strategie beim i386 folgend, eine abgespeckte Version vor: den i486SX (den bis dato einzigen i486 hat Intel gleichzeitig in i486DX umgetauft). Da sich die wenigsten PC-Anwender mit hochgradig mathematischen Anwendungen, wie z.B. CAD oder der Lösung von Differentialgleichungen, beschäftigen war für die meisten Anwender der integrierte Coprozessor überflüssig und verteuert nur den PC. So lautete die damalige Argumentation, wobei man noch nicht an die Performance-hungrigen Spiele gedacht hat. Intel hat aus diesem Grund beim i486SX den Coprozessor auf dem Chip weggelassen, aber sonst alle Besonderheiten, die den i486 gegenüber dem i386 auszeichnen – On-Chip-Cache, RISC-Core etc.– beibehalten. Ergebnis ist ein Prozessor, der sich bei normalen Anwendungen und gleicher Taktfrequenz nicht hinter dem i486 zu verstecken braucht, bei intensiv mathematischen Anwendungen aber doch recht deutlich zurückfällt. Dem können Sie Abhilfe schaffen, indem Sie den »Coprozessor« i487SX verwenden. Die Anführungszeichen deuten bereits an, dass sich der i487SX nicht so nahtlos in die 80x87-Reihe einordnen lässt. Vielmehr hat Intel mit dem i487SX das Prinzip der so genannten Upgrades eingeführt, die nicht nur den Coprozessor nachliefern, sondern auch die Leistungsfähigkeit der CPUs selbst verbessern. Dazu aber später mehr. Beachten Sie, dass beim i486SX im Gegensatz zum i386SX weder der Daten- noch der Adressbus verkleinert worden ist. Beide werden mit der vollen DX-Breite von 32 Bits herausgeführt. Gehäusevarianten Hergestellt wurde der i486SX in zwei verschiedenen Gehäusevarianten: einmal in einem Pin Grid Array mit 168 Pins, außerdem in einem Plastic Quad Flat Package PPQFP mit 196 Anschlüssen. In den beiden Abbildungen sehen Sie die Layouts der beiden Gehäuse. Neben den fünf neuen Anschlüssen weist die PQFP-Version des i486SX noch folgende zusätzliche Besonderheiten auf:
: : :
JTAG-Boundary-Scan-Test (bei der PGA-Version nicht implementiert) geringere Leistungsaufnahme durch verbesserten CMOS-Aufbau Power-Down-Modus, der die Stromaufnahme von ca. 500 mA auf 50 mA senkt.
Im Folgenden möchte ich Ihnen die fünf zusätzlichen Anschlüsse der PQFP-Version kurz vorstellen. Die anderen Anschlüsse sind bereits vom i486DX bekannt. Der wichtigste ist der Anschluss UP, der zur Unterstützung eines Upgrade durch den i487SX vorgesehen ist.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
285
A
B
C
D
E
F
G
H
J
K
L
M
N
P
Q
R
S
D20
D19
D11
D9
GND
DP1
GND
GND
Vcc
GND
GND
GND
D2
D0
A31
A28
A27
D22
D21
D18
D13
Vcc
D8
Vcc
D3
D5
Vcc
D6
Vcc
D1
A29
GND
A25
A26
frei
GND
CLK
D17
D10
D15
D12
DP2
D16
D14
D7
D4
DP0
A30
A17
Vcc
A23
D23
GND
Vcc
A19
GND
frei
DP3
GND
Vcc
A21
A18
A14
D24
D25
D27
A24
Vcc
GND
GND
Vcc
D26
A22
A15
A12
D29
D31
D28
A20
Vcc
GND
GND
Vcc
D30
A16
Vcc
GND
frei
frei
frei
A13
Vcc
GND
GND
Vcc
frei
A9
Vcc
GND
frei
frei
frei
A5
A11
GND
frei
frei
frei
A7
A8
A10
frei
frei
frei
A2
Vcc
GND
NMI
frei
FLUSH A20M HOLD KEN
frei
BRDY
BE2
BE0
PWT
D/C
LOCK HLDA BREQ
A3
A6
INTR
frei
RESET BS8
Vcc
RDY
Vcc
Vcc
BE1
Vcc
Vcc
Vcc
M/IO
Vcc PLOCK BLAST
GND
BE3
GND
GND
PCD
GND
GND
GND
W/R
GND PCHK
E
F
G
H
J
K
L
M
N
i486SX PGA (168 Pins)
AHOLD EADS BS16 BOFF
A
B
C
D
P
Q
A4
frei
ADS
R
S
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
150
148
155
160
165
170
175
180
1
147
5
143
10
138
15
133
20
128
i486SX PQFP (196 Pins)
25
123
GND D21 frei D22 Vcc D23 frei DP3 GND D24 frei D25 Vcc D26 frei D27 GND D28 frei D29 Vcc D30 frei frei D31 frei frei frei frei frei TD0 frei frei frei Vcc frei GND frei frei frei frei frei frei Vcc frei GND GND frei Vcc
95
99 98
49 90
103
85
45
80
108
75
40
70
113
65
35
60
118
55
30
50
GND A21 A22 A23 A24 Vcc A25 A26 A27 A28 GND A29 A30 A31 frei DP0 D0 D1 Vcc D2 GND GND D3 Vcc D4 D5 D6 Vcc D7 DP1 D8 D9 GND frei D10 Vcc D11 D12 D13 GND D14 D15 DP2 D16 D17 D18 D19 D20 Vcc
185
196 195
190
Vcc frei GND A20 frei A19 frei A18 frei TMS frei TDI Vcc A17 GND A16 A15 Vcc A14 GND A13 Vcc A12 frei A11 frei Vcc frei GND GND frei A10 Vcc A9 frei A8 frei A7 A6 frei UP frei A5 frei A4 frei A3 frei GND
Abb. 9.10: Der i486SX im PGA-Gehäuse
Abb. 9.11: Der i486SX im PQFP-Gehäuse
Vcc A2 ADS BLAST PLOCK LOCK GND frei PCHK BRDY BOFF BS16 BS8 frei RDY KEN Vcc HOLD AHOLD TCK frei GND Vcc frei CLK HLDA GND W/R Vcc BREQ BE0 BE1 BE2 GND BE3 Vcc M/IO D/C GND PWT Vcc PCD EADS A20M RESET FLUSH INTR NMI GND
Sandini Bib 286
Kapitel 9
UP (I) Anschluss 156 Wenn diesem Update-Present-Anschluss ein Signal mit niedrigem Pegel zugeführt wird, trennt der i486SX alle Ein- und Ausgänge von der Umgebung ab und tritt in einen Power-DownModus mit erheblich verminderter Stromaufnahme ein, der i486SX wird damit praktisch stillgelegt. TCK, TDI, TDO, TMS (I, I, O, I)) Anschlüsse 128, 185, 80, 187 Das sind die vier Anschlüsse für den JTAG-Boundary-Scan-Test. Beachten Sie, dass kein Anschluss für TRST vorgesehen ist. Der JTAG-Boundary-Scan-Test Im i486SX im PQFP ist ein JTAG-Boundary-Scan-Test implementiert, der den Prinzipien nach Kapitel 8.8.5 folgt. Ich möchte im Folgenden daher nur die Steuerzellen (siehe Tabelle 9.7) sowie den durchlaufenden Abtastpfad aufführen. Weder der i486SX im PGA noch der i487SX implementieren einen solchen JTAG-Test. Steuerzelle Anschlussgruppe ABUSCTL WRCTL BUSCTL MISCCTL
A31–A2 D31–D0, DP3–DP0 ADS, BLAST, PLOCK, LOCK, W/R, BE3–BE0, M/IO, D/C, PWT, PCD PCHK, HLDA, BREQ, FERR
Tab. 9.7: JTAG-Steuerzellen und zugeordnete Anschlussgruppen für den i486SX
Der Boundary-Scan-Pfad wird unter Einschluss der Steuerzellen xxxCTL in der folgenden Weise durchlaufen: TDI->WRCTL->ABUSCTL->BUSCTL->MISCCTL->ADS->BLAST->PLOCK->LOCK ->PCHK->BRDY->BOFF->BS16->BS8->RDY->KEN->HOLD->AHOLD->CLK->HLDA->W/R ->BREQ->BE0->BE1->BE2->BE3->M/IO->D/C->PWT->PCD->EADS->A20M->RESET ->FLUSH->INTR->NMI->res->res->D31->D30->D29->D28->D27->D26->D25->D24 ->DP3->D23->D22->D21->D20->D19->D18->D17->D16->DP2->D15->D14->D13->D12 ->D11->D10->D9->D8->DP1->D7->D6-> D5->D4->D3->D2->D1->D0->DP0->A31->A30 ->A29->A28->A27->A26->A25->A24->A23-> A22->A21->A20->A19->A18->A17->A16 ->A15->A14->A13->A12->A11->A10->A9->A8->A7-> A6->UP->A5->A4->A3->A2->TDO
Nach einem Selbsttest, der durch den JTAG-Befehl RUNBIST ausgelöst wird, speichert das IDCode-Register eine 32-Bit-Identifizierungsinformation für den untersuchten Chip. Im Fall des i486SX gilt folgende Belegung: Bit 0=1, Bit 1...11=Hersteller (Intel=09h), Bit 12...27=Teilenummer (0427h), Bit 28...31=Version (00h). Der 32-Bit-i486SX-ID-Code lautet also 00427013h.
9.3.2
i486SX-Upgrade – der i487SX
Mit dem i487SX hat Intel das Konzept der so genannten Upgrades eingeführt. Bis dahin waren die 80x87-Coprozessoren lediglich eine numerische Erweiterung der 80x86-CPUs und wurden von der CPU über reservierte Ports in I/O-Zyklen angesprochen. Mit dem i487SX hat sich dies geändert. Der i487SX ist nicht einfach ein numerischer Coprozessor, sondern eine vollwertige i486CPU mit Adressierungseinheit, Buseinheit, CPU-Kern, Cache und eben auch einer numerischen Einheit. Daher kann man den i487SX mit einem niedriger getakteten i486DX vergleichen. Er steht für Taktfrequenzen von 16 MHz bis 25 MHz zur Verfügung und wird in einem Pin-Grid-Array
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
287
mit 169 Pins ausgeliefert. Der einzige Unterschied zum i486DX sind der zusätzliche KodierungsPin und die Belegung des Anschlusses B14 mit dem Signal MP (Math Present). In Abbildung 9.12 sehen Sie das Anschlussschema des 487SX. Dadurch wird auch das von Intel erdachte Upgrade-Prinzip deutlich: Es wird nicht nur wie bisher ein numerischer Coprozessor nachgeliefert, sondern die Upgrades integrieren zusätzlich eine leistungsfähige CPU. So ist die Leistungssteigerung nicht nur auf neue Befehle und Datenformate beschränkt, wie das bei den numerischen Coprozessoren 80x87 der Fall ist, sondern auch die CPU selbst wird durch einen leistungsfähigeren und auf dem Upgrade integrierten CPU-Kern ersetzt. Der Upgrade-Prozessor muss nur der bisherigen CPU mitteilen, dass er vorhanden ist. Das geschieht beim i487SX durch das zusätzliche Signal MP, woraufhin die UpgradeCPU alle Funktionen der bisherigen CPU mit übernimmt. Die alte CPU ist dadurch nicht mehr notwendig. Diese Art des Upgradings ist praktisch ein Ersetzen der alten CPU durch eine neue, ohne dass der bisherige CPU-Chip ausgebaut werden muss, der allerdings weiterhin Strom verbraucht.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
A
B
C
D
E
F
G
H
J
K
L
M
N
P
Q
R
S
D20
D19
D11
D9
GND
DP1
GND
GND
Vcc
GND
GND
GND
D2
D0
A31
A28
A27
D22
D21
D18
D13
Vcc
D8
Vcc
D3
D5
Vcc
D6
Vcc
D1
A29
GND
A25
A26
CLK CLK2 D17
D10
D15
D12
DP2
D16
D14
D7
D4
DP0
A30
A17
Vcc
A23
A19
GND
frei
CLKSEL GND
Codrg.
D23
GND
Vcc
DP3
GND
Vcc
A21
A18
A14
D24
D25
D27
A24
Vcc
GND
GND
Vcc
D26
A22
A15
A12
D29
D31
D28
A20
Vcc
GND
GND
Vcc
D30
A16
Vcc
GND
frei
frei
frei
A13
Vcc
GND
GND
Vcc
frei
A9
Vcc
GND
frei
frei
frei
A5
A11
GND
FERR
frei
frei
A7
A8
A10
frei
MP
frei
A2
Vcc
GND
A3
A6
i487SX PGA (169 Pins)
IGNNE NMI FLUSH A20M HOLD KEN
frei
BRDY
BE2
BE0
PWT
D/C
LOCK HLDA BREQ
Vcc
RDY
Vcc
Vcc
BE1
Vcc
Vcc
Vcc
M/IO
Vcc PLOCK BLAST
GND
BE3
GND
GND
PCD
GND
GND
GND
W/R
GND PCHK
E
F
G
H
J
K
L
M
N
INTR
frei
RESET BS8
AHOLD EADS BS16 BOFF
A
B
C
D
P
Q
A4
frei
ADS
R
S
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Abb. 9.12: Das Anschlussschema des i487SX
Der 169te Pin D4 dient nur zur mechanischen Kodierung, sodass der i487SX nicht falsch in den speziellen Upgrade-Sockel eingesetzt werden kann, der auch als Overdrive-Socket bezeichnet wird. Für diesen Sockeltyp, der mit dem i487SX definiert wurde, hat Intel im Laufe der Zeit eine Reihe verschiedener Overdrive Replacement Typen (z.B. OPD486DX) vorgestellt, die eben nur in diesem Sockel, nicht jedoch im »normalen« 486DX-Sockel verwendet werden können. Beide Sockel unterscheiden sich lediglich durch eine minimal geänderte Anschlussbelegung was letztendlich zu zwei (fast) identischen Baureihen führte: zur i486DX/486DX2-Serie sowie zur Overdrive-Serie. Die Motherboard-Hersteller, die zunächst dem Intel-Overdrive-Konzept gehorchend, einen zusätzlichen Overdrive-Sockel vorgesehen haben, verzichteten jedoch bald wieder darauf und
Sandini Bib 288
Kapitel 9
realisierten nur einen einzigen PGA-Sockel auf den Motherboards. Stattdessen wurden zusätzliche Jumper vorgesehen, mit dessen Hilfe sich die entsprechenden Signalumschaltungen vornehmen lassen, um z.B. auch den »Coprozessor« i487SX, der schließlich einen vollwertigen 486DX darstellt, mit dem Motherboard (allein) betreiben zu können.
Taktgenerator
Taktgenerator
CLK
CLK CLK
FERR
i487SX Upgrade
CLK UP
MP
i486SX CPU
i487SX Upgrade
CLK
CLK
FLUSH MP
FLUSH BOFF
BOFF HLDA FERR HOLD
HLDA HOLD
FERR Vcc FLUSH Vcc BOFF
FERR Vcc
(a)
i486SX CPU
Für die Kombination des i486SX im PQFP-Gehäuse mit 196 Anschlüssen mit dem i487SX im PGA ist die Verschaltung von CPU und Upgrade sehr einfach (siehe Abbildung 9.13). Der MP-Ausgang des i487SX muss nur mit dem UP-Eingang des i486SX verbunden werden. Der i487SX gibt an UP (Updrade Present) ein Signal mit niedrigem Pegel ab, das dem MP-Eingang des i486SX anzeigt, dass eben ein Upgrade vorhanden ist. Der i486SX trennt dann all seine Anschlüsse vom Bus ab und tritt in einen Power-Down-Modus ein, um Strom zu sparen. Er nimmt dann nur noch 50 mA statt sonst 500 mA auf und die Wärmeentwicklung wird entsprechend geringer. Der Anschluss MP des i487SX wird über einen internen Widerstand im i486SX auf einen hohen Pegel gelegt. Dadurch arbeitet der i486SX ohne i487SX normal. Bei eingesetztem i487SX ist das Signal UP aber stärker und zieht MP auf einen niedrigen Pegel. Das Signal FERR wird ohne i487SX über einen Widerstand, der mit der Versorgungsspannung Vcc verbunden ist, stets auf einem hohen Pegel gehalten. FERR gibt in diesem Fall also an, dass kein Gleitkommafehler vorliegt. Ein eingesetzter i487SX kann FERR bei einem Fehler aber auf einen niedrigen Pegel treiben.
HLDA
HOLDGNDGND
(b)
Abb. 9.13: Upgrade-Verschaltung von i486SX und i487SX (a) i486SX im PQFP (b) i486SX im PGA
Komplizierter wird die Verschaltung, wenn der i486SX im PGA-Gehäuse mit 168 Pins benutzt wird. Er weist nämlich keinen Eingang UP auf und dadurch kann der i487SX dem i486SX seine Anwesenheit nicht unmittelbar mitteilen. Außerdem kennt diese Ausführung des i486SX keinen Power-Down-Modus. Der i486SX zieht auch bei eingesetztem Upgrade 500 mA, obwohl er überhaupt keinen Beitrag zur Computerleistung liefert, sondern auf ewig auf seine Aktivierung wartet. Durch den fehlenden UP-Eingang muss man sich also mit einem Trick behelfen, um den i486SX vom Bus abzutrennen. Das geschieht über den Anschluss BOFF. Zusätzlich bewirkt ein aktives Signal FLUSH für den i486SX, dass er seinen internen Cache in den Speicher zurückschreibt, um einen Datenverlust unmittelbar nach einem Reset oder dem Einschalten des PCs zu vermeiden. Die Anschlüsse BOFF und FLUSH werden vom MP-Ausgang des i487SX angesteuert. Weil BOFF auch im Normalbetrieb des i486SX möglicherweise von einer externen Logik aktiviert wird, kann der i486SX anhand von BOFF nicht feststellen, ob ein Upgrade vorhanden ist oder die Quelle von
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
289
BOFF eine externe Logik ist. Ein eventuell vorhandener Power-Down-Modus würde also keinen Vorteil bieten. Bei aktivem BOFF senkt der i486SX die Stromaufnahme lediglich um ca. 20%, weil alle Ein- und Ausgangspuffer für die Pins deaktiviert sind. Damit der i486SX ohne Upgrade normal arbeitet und die Busarbitrierung und Signalerzeugung für Gleitkommafehler mit und ohne Upgrade korrekt ablaufen, sind außerdem zwei UND-Gatter und ein ODER-Gatter notwendig. Ein besonderes Kennzeichen des i487SX ist außerdem, dass er wahlweise mit einem 1x- oder einem 2x-Takt betrieben werden kann. Der 1x-Takt ist Standard und wird zum Upgraden eines gewöhnlichen i486SX verwendet, der 2x-Takt dagegen, wenn der i487SX einen Low-Poweri486SX unterstützen soll. Die Auswahl der Taktfrequenz erfolgt über CLKSEL (Pin A3). Ein CLKSEL-Impuls mit hohem Pegel nach dem Einschalten wählt einen CLK2-Takt aus, d.h. der i487SX teilt dann die externe Taktfrequenz durch zwei, um den internen Prozessortakt zu erzeugen. Bleibt CLKSEL immer auf einem niedrigen Pegel, dann verwendet der i487SX den externen Takt unmittelbar als internen Prozessortakt.
9.3.3
Die i486DX2-Prozessoren mit interner Taktverdopplung
Intel hat neben einer Vielzahl von 486-CPUs in unterschiedlichen Ausführungen und Gehäusen auch eine i486DX2-CPU mit interner Taktverdopplung vorgestellt, wobei sich vor allem der i486DX2-66 mit externen 33 MHz, aber internen 66 MHz zu einem echten Renner entwickelte. Probleme mit den Taktraten Die immer höheren Taktfrequenzen der CPUs führen generell zu zwei Schwierigkeiten. Die Abstrahlung elektromagnetischer Wellen ist proportional zur vierten Potenz der Frequenz. Das bedeutet, dass bei einem 40-MHz-i386 mit 80 MHz externem Takt die Abstrahlung fast 80.000mal (!) größer geworden ist als die beim Original-PC mit 4,77 MHz Takt. Das erfordert zunächst eine effektive Abschirmung des Motherboards gegenüber der Umgebung, damit Sie überhaupt noch Radio hören können. Schlimmer sind aber die Auswirkungen auf die Komponenten im PC oder auf das Motherboard selbst. Wenn die Widerstände und Kapazitäten der Bauelemente – und bei diesen Frequenzen spielt schon ein Überbrückungskabel mit 2 cm Länge eine Rolle – nicht optimal abgestimmt sind, treten Signalreflexionen oder Dämpfungen auf, die einen zuverlässigen Betrieb des Computers nicht mehr ermöglichen. Intel war daher beim i486 dazu übergegangen, den internen Prozessortakt dem externen Takt anzugleichen – das bezeichnet man auch als 1x-Takt. Der i386 wurde dagegen mit der zweifachen Prozessortaktfrequenz versorgt. Der i386 teilt den externen Takt CLK intern durch zwei, um den Prozessortakt zu gewinnen – er wird mit einem 2x-Takt versorgt. Mit dem 50-MHz-i486 war man Anfang der 90er Jahre allerdings selbst mit diesem Trick schon wieder an einer kritischen Grenze angelangt. Ein weiterer Effekt dieser hohen Taktraten ist außerdem, dass sich die Signallaufzeiten auf dem Motherboard, z.B. zwischen der CPU über verschiedene Puffer und Treiber bis zum Hauptspeicher, selbst bei sehr schnellen Komponenten der Zyklusdauer des Taktsignals annähern. Wie wir wissen, sind diese Probleme mittlerweile gelöst und Taktfrequenzen auf den Mainboards von bis zu 133 MHz üblich geworden. Die Layouts der Motherboards sind hierfür typischerweise als 8-fach-Multilayer ausgeführt und es finden sich hier genau spezifizierte Masseflächen und -Layer, sowie optimierte Leitungswege (Taktleitungen sind z.B. in »Schlangenform«) ausgeführt, um negative Einwirkungen der hohen Taktfrequenzen auf den Chipset selbst zu minimieren. Spezielle Gehäuseformen (z.B. BGA, Ball Grid Array) für die Chips sowie auch generell die Zusammenfassung vieler Schaltungseinheiten zu möglichst wenigen Chips tun ein Übriges, um diese negativen Effekte im Zaum zu halten.
Sandini Bib 290
Kapitel 9
Die interne Taktverdoppelung Intel hat sich damals zur Vermeidung der oben genannten Schwierigkeiten eine einfache, aber wirkungsvolle Lösung einfallen lassen: die interne Taktverdopplung. Damit ist gemeint, dass der i486DX2 – die »2« steht für Verdopplung – das zugeführte Taktsignal intern verdoppelt, aus einem 33-MHz-i486DX2 wird intern also ein 66-MHz-i486DX. Das bedeutet, dass alle internen Einheiten der CPU, wie z.B. ALU, Decodiereinheit, Gleitkommaeinheit, Segmentierungseinheit und der Zugriff auf den internen 8KByte-Cache mit der doppelten Geschwindigkeit laufen. Beim genannten 33-MHz-i486DX2 sind das dann also 66 MHz. Nur die Busschnittstelle läuft mit dem externen Takt, weil der Rest des Motherboards ja von der höheren Taktung verschont bleiben soll. Der i486DX2 wird – um der bisherigen Notation zu folgen – praktisch mit einem 1/2x-Takt versorgt. Die Verdopplung der Taktfrequenz im Prozessor ist einfach zu erreichen, indem man z.B. ein Schaltelement verwendet, das mit jeder Flanke des externen Taktsignals CLK getriggert wird, egal ob sie ansteigend oder abfallend ist. Das Schaltelement muss nur so entworfen werden, dass es seinen Zustand bereits vor der nächsten Flanke wieder ändert. Durch eine entsprechende Wahl der Widerstände und Kapazitäten lässt sich das leicht erreichen. Das erzeugte Signal synchronisiert dann eine interne PLL-Schaltung (Phase Locked Loop), die den eigentlichen Prozessortakt liefert. In der Abbildung 9.14 ist dieses Verfahren schematisch dargestellt.
externer Takt CLK
interner Takt PCLK Abb. 9.14: Taktverdoppelung durch Flankentriggerung
Der intern verdoppelte Takt führt nicht zu denselben Schwierigkeiten wie auf dem Motherboard. Dazu sind einfach die Leitungen innerhalb des Prozessors viel zu kurz, um als effektive Antenne zu wirken. Bei den Leiterbahnen des Motherboards sieht das natürlich anders aus. Der i486DX2 unterscheidet sich rein äußerlich kaum von einem normalen i486DX. In Abbildung 9.15 sehen Sie sein Anschlussschema. Der Intel-DX2 ist für interne Taktfrequenzen von 50 MHz und 66 MHz entwickelt worden, der externe Takt beträgt also 25 MHz bzw. 33 MHz. Die Taktangaben auf den Chips beziehen sich also auf die interne Taktfrequenz, wie es auch bei allen aktuellen CPUs der Fall ist. Durch die doppelte Frequenz der Logikeinheiten mit Ausnahme der Busschnittstelle werden natürlich alle Befehle doppelt so schnell abgearbeitet wie in einer extern gleich schnell getakteten i486DX-CPU – wenn die Daten und Befehle rechtzeitig zur Verfügung stehen. Das ist der Fall, wenn sich die benötigten Daten in einem Prozessorregister oder dem On-Chip-Cache befinden und die Befehle bereits in der Prefetch-Queue oder dem On-Chip-Cache bereitstehen. Jeder Zugriff auf einen externen Speicher – auch einen Second-Level-Cache – bremst durch die nur halb so schnell getaktete Busschnittstelle und außerdem durch die größeren Zugriffszeit vor allen wenn der DRAM-Hauptspeicher beteiligt ist. Programme mit vielen Iterierungsschritten, wie z.B. bestimmte mathematische Berechnungen, die mehrfach auf einen kleinen Daten- und Codebereich zugreifen, nutzen die doppelte Prozessorfrequenz voll aus. Ein Zugriff auf den schnellen SecondLevel-Cache, z.B. für Cache-Line-Fills des internen Cache, führt die 50-MHz-i486DX-CPU (mit vollen externen 50 MHz) deutlich schneller aus als der 50-MHz-i486DX2-Prozessor (mit externen 25
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
291
MHz). Bei einem Zugriff auf den Hauptspeicher mit den relativ langsamen DRAM-Chips ist es aber egal, ob der Prozessor mit externen 25 MHz oder 50 MHz läuft – der Engpass liegt bei den DRAM-Chips und der echte 50-MHz-i486 legt dann einfach mehr Wartezyklen ein.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
A
B
C
D
F
F
G
H
J
K
L
M
N
P
Q
R
D20
D19
D11
D9
GND
DP1
GND
GND
Vcc
GND
GND
GND
D2
D0
A31
A28
D22
D21
D18
D13
Vcc
D8
Vcc
D3
D5
Vcc
D6
Vcc
D1
A29
GND
A25
TCK
GND
CLK
D17
D10
D15
D12
DP2
D16
D14
D7
D4
DP0
A30
A17
Vcc
D23
GND
Vcc
A19
GND
DP3
GND
Vcc
A21
A18
D24
D25
D27
A24
Vcc
GND
Vcc
D26
A22
A15
D29
D31
D28
A20
Vcc
GND
Vcc
D30
A16
Vcc
frei
frei
frei
A13
Vcc
GND
Vcc
UP
A9
Vcc
frei
frei
frei
A5
A11
frei
frei
frei
A7
A8
TDI
TMS
FERR
A2
Vcc
i486DX2 PGA (168 Pins)
IGNNE NMI FLUSH A20M HOLD KEN
frei
BRDY
BE2
BE0
PWT
D/C
LOCK HLDA BREQ
Vcc
RDY
Vcc
Vcc
BE1
Vcc
Vcc
Vcc
M/IO
Vcc PLOCK BLAST
GND
BE3
GND
GND
PCD
GND
GND
GND
W/R
GND PCHK
F
F
G
H
J
K
L
M
N
INTR
TDO RESET BS8
AHOLD EADS BS16 BOFF
A
B
C
D
P
Q
A3
frei
R
S A27
1 A26
2 A23
3 frei
4 A14
5 GND
6 A12
7 GND
8 GND
9 GND
10 GND
11 GND
12 A10
13 GND
14 A6
15 A4
16 ADS
17 S
Abb. 9.15: Das Anschlussschema des i486DX2
Die interne Taktverdoppelung bietet also Vorteile, immerhin kann man ein bereits bestehendes und ausgereiftes 33 MHz-Board mit einer i486DX2-CPU bestücken und dadurch ohne die geringsten Änderungen die Leistung des PCs deutlich steigern. Diese Möglichkeit wurde von den PC- und Motherboard-Herstellern gern ausgenutzt, denn sie hatten mit einem »echten« 50 MHz-486DX, doch so ihre Schwierigkeiten (insbesondere mit dem VLB), sodass dieser CPU dann auch kein langes Leben beschieden war. Eine andere Möglichkeit ist, den internen Takt z.B. zu verdreifachen. Genau dies praktizieren der DX4 und der Blue Lightning von IBM; sie erreichen dadurch intern 100 MHz. Dadurch ist die interne Befehlsabarbeitung in der einzigen i486-Pipeline fast schon so schnell wie diejenige in den zwei parallelen Pentium-Pipelines (weil nicht alle Befehle gepaart und parallel ausgeführt werden können). Der Pentium hat aber den großen Vorteil eines externen 64-Bit-Datenbusses, eines wesentlich leistungsfähigeren Burst-Zyklus etc., sodass die Leistungswerte trotzdem höher liegen.
9.3.4
Der i486DX4
Nachdem bereits IBM mit seinem Blue Lightning eine Taktverdreifachung vorexerziert hatte und AMD mit seinem Am486DX2-66 mit Intel hinsichtlich der 486er gleichgezogen hatte, wurde von der Firma Intel erwartet, dass sie die Performance-Lücke zwischen dem Am486DX/2 oder i486DX2 und dem Pentium schließt. Der zunächst in der Fachpresse als DX3 bezeichnete hochgetaktete i486 erblickte schließlich im März 1994 das offizielle Licht der Öffentlichkeit. Er kann
Sandini Bib 292
Kapitel 9
wahlweise den externen Takt verdoppeln oder verdreifachen und zusätzlich dazu mit einer 2,5fachen Taktgeschwindigkeit arbeiten. Im Folgenden sind die wesentlichen Kennzeichen aufgeführt, die den i486DX4 von seinen i486-Vorgängern unterscheiden. Nebenbei bemerkt: Der Grund dafür, warum der taktverdreifachende Typ bei Intel DX4 und nicht etwa DX3 heißt, wurde von Intel damit begründet, dass ein i486DX4 eine um den Faktor vier höhere »Rundumleistung« als ein i486DX mit 33 MHz bietet:
: : : : : :
25 MHz, 33 MHz oder 50 MHz externer Takt mit internen 75 MHz, 83 MHz oder 100 MHz 80 MByte/s, 106 MByte/s oder 160 MByte/s Burst-Bus 4-Wege set-assoziativer 16 KByte On-Chip-Cache mit Write-Through-Strategie BiCMOS-Technologie für höchste Taktfrequenzen und niedrige Leistungsaufnahme 3 W bis 5 W Leistungsaufnahme durch 3,3 V Betriebsspannung Ein verbesserter Integer-Multiplizierer beschleunigt Ganzzahlmultiplikationen um den Faktor 5
Der wesentlichste Unterschied zu den bisherigen i486-Modellen ist der neue PLL-Oszillator auf dem i486DX4-Chip und die Tatsache, dass die CPU nicht mehr mit 5 V, sondern mit 3,3 V betrieben wird. Das Motherboard muss demnach diese Spannung (per Jumper festzulegen) bieten oder man verwendet einen Zwischensockel mit integrierten Spannungsregler. Neu an diesem Prozessor sind außerdem ein System-Management-Modus, wie er vom Pentium her bekannt ist (siehe entsprechendes Kapitel). Außerdem kann er über zwei Stufen – den StopClock-Modus und ein Abschalten des externen Taktsignals – den Stromverbrauch in einem Wartezustand erheblich vermindern (von 1450 mA bei 100 MHz über 100 mA herunter auf etwa 1 mA). Ferner ist ein JTAG Boundary-Scan-Test implementiert. Der On-Chip-Cache des i486DX4 ist mit seinen 16 KByte Speichervermögen doppelt so groß wie beim bisherigen i486, wobei die Organisationsstruktur aber unverändert geblieben ist. Ein gegenüber dem i486DX und i486DX2 verbesserter Integer-Multiplizierer beschleunigt die häufig vorkommenden Ganzzahlmultiplikationen zusätzlich um den Faktor fünf. Alle anderen Funktionen sind mit denen der bisherigen i486-Versionen identisch. Anschlussschema Der i486DX4 existiert in zwei verschiedenen Gehäusevarianten: einmal in einem Pin Grid Array mit 168 Pins, außerdem in einem Surface-Mounted Quad Flat Package SQFP mit 208 Anschlüssen. In Abbildung 9.16 sehen Sie das Layout des PGA-Typs. Neben den bereits bekannten Anschlüssen des i486DX weist der i486DX4 noch ein paar zusätzliche Pins auf, die zur Kontrolle der neuen Funktionen dienen. Ich möchte sie im Folgenden kurz vorstellen. Die anderen Anschlüsse sind bereits vom i486DX/SX oder i486DX2 bekannt. CLKMUL (I) Anschluss R17 Das dem Clock-Multiplier-Anschluss bei einem Reset zugeführte Signal legt die Multiplikationsrate des internen PLL-Oszillators gegenüber dem externen Takt CLK fest. Liegt CLKMUL auf einem niedrigen Pegel, dann verdoppelt der PLL-Oszillator den externen Takt, liegt CLKMUL dagegen auf einem hohen Pegel oder ist der Pin freischwebend, dann wird CLK verdreifacht. Schließlich kann CLKMUL auch noch mit BREQ verbunden sein; intern läuft er dann mit dem 2,5-fachen des externen Takts.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
293
A
B
C
D
E
F
G
H
J
K
L
M
N
P
Q
R
S
D20
D19
D11
D9
GND
DP1
GND
GND
Vcc5
GND
GND
GND
D2
D0
A31
A28
A27
D22
D21
D18
D13
Vcc
D8
Vcc
D3
D5
Vcc
D6
Vcc
D1
A29
GND
A25
A26
TCK
GND
CLK
D17
D10
D15
D12
DP2
D16
D14
D7
D4
DP0
A30
A17
Vcc
A23
D23
GND
Vcc
Codrg.
A19
GND VOLDET
DP3
GND
Vcc
A21
A18
A14
D24
D25
D27
A24
Vcc
GND
GND
Vcc
D26
A22
A15
A12
D29
D31
D28
A20
Vcc
GND
GND
Vcc
D30
A16
Vcc
GND
A13
Vcc
GND
A9
Vcc
GND
A5
A11
GND
n.v.
GND
i486DX4 PGA (168 Pins)
SMI SRESET
Vcc
UP
n.v.
n.v. SMIACT
n.v.
n.v.
frei
A7
A8
A10
TDI
TMS
FERR
A2
Vcc
GND
A3
A6
IGNNE NMI FLUSH A20M HOLD KEN STPCLK BRDY
INTR
TDO RESET BS8
AHOLD EADS BS16 BOFF
A
B
C
D
BE2
BE0
PWT
D/C
LOCK HLDA BREQ
Vcc
RDY
Vcc
Vcc
BE1
Vcc
Vcc
Vcc
M/IO
Vcc PLOCK BLAST
GND
BE3
GND
GND
PCD
GND
GND
GND
W/R
GND PCHK CLKMUL ADS
E
F
G
H
J
K
L
M
N
P
Q
R
A4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
S
Abb. 9.16: Das Anschlussschema des i486DX4
SRESET (I) Anschluss C10 Wird dem Soft-Reset-Pin ein Signal mit hohem Pegel zugeführt, so führt der i486DX4 intern eine Initialisierung (Reset) aus. Im Gegensatz zur Aktivierung von RESET (Pin C16) wird das SMBASE-Register für den System-Management-Modus nicht zurückgesetzt. STPCLK (I) Anschluss G15 Liegt am Stop-Clock-Eingang ein Signal mit hohem Pegel an, dann hält der i486DX4 seinen PLLOszillator an, d.h. die internen Schaltungen werden nicht mehr getaktet. STPCLK ist als Interrupt mit der niedrigsten Priorität implementiert. Bevor der Oszillator angehalten wird, schließt der Prozessor also zunächst alle anhängigen Befehle ab. Anschließend treibt er einen Stop-GrantSonderzyklus auf den Bus: M/IO=D/C=0, W/R=1, A31–A5=A3–A2=0, A4=1, BE3–BE0=1011b. VOLDET (O) Anschluss S4 Durch das Voltage-Detect-Signal an diesem Pin kann die externe Systemlogik einen mit 3,3 V arbeitenden i486DX4-Prozessor von einem 5 V-i486DX unterscheiden: Ein niedriges VOLDETSignal gibt einen 3,3 V-i486DX4 an. Für die SQFP-Version des i486DX4 ist dieser Anschluss nicht vorgesehen.
Sandini Bib 294
Kapitel 9
n.v. Anschlüsse A10, A12–A13, B12–B13 Diese als nicht verbunden gekennzeichneten Anschlüsse sind intern nicht belegt Vcc5 (I) Anschluss J1 Dem 5-V-Referenzspannungsanschluss wird ein 5-V-Signal als Referenz zugeführt, wenn von der Systemlogik an einen oder mehrere i486DX4-Pins Signale mit mehr als 3,3 V angelegt werden. Ist das Board mit reiner 3,3-V-Logik versehen, dann wird Vcc5 auf 3,3 V gehalten. SMI, SMIACT (I, O) Anschlüsse B10, C12 Die beiden System-Management-Interrupt- und System-Management-Interrupt-Active-Anschlüsse bilden die Schnittstelle für den System-Management-Modus (SMM). Er wurde zuerst mit dem Pentium implementiert und später auf den i486DX4 übertragen. Flags, Steuerregister und Erweiterungen des Virtual-8086-Modus Das EFlag-Register ist beim i486DX4 um drei zusätzliche Flags erweitert worden und weist dadurch die Struktur der EFlags des Pentiums auf. Die neuen Flags betreffen die Erweiterungen für den Virtual-8086-Mode und die Identifizierung des CPU-Typs. In Abbildung 9.17 sehen Sie die EFlags. Die drei neuen Flags sind hinterlegt und haben dieselbe Funktion wie beim Pentium. 31
C: P: A: Z: S: T:
16 15
Carry Parity Auxiliary Zero Sign Trap
ID VIP VI AC
22 21
r r r r r r r r r r
I: D: O: IOP: N: R:
7
0
V R r N IOP O D I T S Z r A r P r C
Interrupt Enable Direction Overflow I/O Privilege Level Nested Task Resume
V: AC: VI: VIP: ID: r:
Virtual 8086 Mode Alignment Check Virtual Interrupt Virtual Interrupt Pending Identifizierung reserviert
Abb. 9.17: Die neuen Flags des i486DX4
Das Virtual-Interrupt-Flag VI ist das virtuelle Abbild von IE für das Auslösen von Interrupts im Virtual-8086-Mode. In ähnlicher Weise unterstützt auch das Virtual-Interrupt-Pending-Flag VIP Tasks im Virtual-8086-Mode, um Ihnen ein virtuelles IE-Flag zur Verfügung zu stellen. Beide Flags sollen die Abarbeitung von Interrupts im Virtual-8086-Mode beschleunigen. Der i486DX4 implementiert also dieselben Erweiterungen für den Virtual-8086-Modus wie der Pentium, die entsprechenden Details dazu finden Sie ebenfalls im Abschnitt über den Pentium. Als letzte Neuerung ist im EFlag-Register ein Identifizierungs-Flag ID vorgesehen. Es gibt an, ob der Prozessor den Befehl CPUID zu seiner Identifizierung unterstützt. Wenn Sie das ID-Flag setzen und löschen können, dann wird CPUID korrekt ausgeführt und liefert Informationen über Typ und Funktionsumfang des Prozessors. Der i486DX4 ist um das Steuerregister CR4 erweitert worden, das die Aktivierung der virtuellen Flags steuert. Die vier Steuerregister CR0 bis CR3 sind gegenüber dem gewöhnlichen i486 unverändert geblieben. In Abbildung 9.18 sehen Sie die Struktur des neuen Steuerregisters CR4.
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
16 15
8
7
2
1 0
PVI VME
31
295
PVI: Protected Mode Virtual Interrupts 1=virtuelle Interrupt Flags im Protected Mode 0=keine virtuellen Interrupt Flags VME: Virtual-8086-Mode Extension 1=virtuelle Interrupt Flags im Virtual-8086-Mode 0=keine virtuellen Interrupt Flags Abb. 9.18: Das Steuerregister CR4
Ein gesetztes Virtual-8086-Mode-Extension-Bit VME aktiviert die Unterstützung virtueller Interrupt Flags im Virtual-8086-Mode. Dadurch werden Interrupts schneller bearbeitet, um die Leistung im Virtual-8086-Mode zu steigern. Der Virtual-8086-Monitor braucht dann nicht mehr aufgerufen zu werden und die damit verbundenen Task Switches werden unnötig. Das Protected-Mode-Virtual-Interrupt-Bit PVI hat im Protected Mode eine ähnliche Aufgabe wie das VME-Bit im Virtual8086-Mode. Ein gesetztes PVI-Bit aktiviert nämlich die Unterstützung virtueller Interrupt Flags im Protected Mode. Dadurch können Programme, die eigentlich für die Ausführung mit CPL=0 konzipiert worden sind, unter bestimmten Umständen auch mit CPL=3 ausgeführt werden. i486DX4-Identifizierung mit CPUID Nachdem Intel zunächst mit dem Pentium einem seit lange bestehenden Programmiereranliegen nachgekommen ist, nämlich dem Wunsch nach einer einfachen Möglichkeit zur Identifizierung der CPU, ist diese Möglichkeit nun auch für den i486DX4 implementiert worden. Der CPUIDBefehl des Pentiums löst das Identifizierungsproblem in nur wenigen CLK-Takten auch nach dem Booten und der Ermittlung des CPU-Typs durch das BIOS. Bevor Sie den CPUID-Befehl ausführen können, müssen Sie zunächst ermitteln, ob die CPU diesen Befehl überhaupt unterstützt. Sonst löst der Prozessor eine Exception ungültiger Opcode aus. Intel hat dazu im EFlag-Register das ID-Flag vorgesehen. Wenn Sie das ID-Flag setzen und löschen können, dann unterstützt der installierte Prozessor die CPUID-Anweisung. CPUID liefert neben der Kennung des i486DX4 auch Informationen, welche besonderen Funktionen unterstützt werden. Um die CPU-Identifizierung auszuführen, müssen Sie zunächst den Wert 0 in das EAX-Register laden und anschließend den Befehl CPUID auslösen. Der Prozessor gibt Ihnen dann in EAX die höchste Identifizierungsebene zurück, die er unterstützt. Die drei Register EBX, ECX und EDX enthalten in dieser Reihenfolge eine 12-Byte-Identifizierung in ASCII-Form: »GenuineIntel«. Wenn Sie anschließend das EAX-Register mit einem Wert 01h laden und den CPUID-Befehl nochmals auslösen, gibt der i486DX4 im EAX-Register einen Identifizierungswert zurück. Das Register EDX enthält zusätzliche Informationen darüber, welche besonderen Funktionen unterstützt werden. In der Tabelle 9.8 finden Sie die Aufruf- und Rückgabewerte von CPUID. Bei CPUID-Aufrufen mit einem EAX-Parameter größer als 1 gibt der i486DX4 in den vier Registern EAX, EBX, ECX und EDX jeweils den Wert 0000h zurück.
Sandini Bib 296
Kapitel 9
Register Aufrufwert
Rückgabewert
EAX EBX ECX EDX
00h
01h (max. Identifizierungsebene) »Genu« »ineI« »ntel«
EAX EBX ECX EDX
01h
Identifizierungswert 1) reserviert (=0000h) reserviert (=0000h) Feature Flags 2)
1)
Bits 31..16 Bits 15..12 Bits 11..8 Bits 7...4 Bits 3...0
reserviert (=00h) 0000b Prozessorfamilie (0100b=04h für i486DX) Modellnummer (1000b=08h für DX4) Version
2)
Bits 31..2: Bit 1: Bit 0:
reserviert (=0000h) implementierte Sonderfunktion On-Chip-Gleitkommaeinheit (1=On-Chip FPU , 0=keine On-Chip FPU)
Tab. 9.8: Aufruf- und Rückgabewerte von CPUID
Stromsparmöglichkeiten Im i486DX4 sind mehrere Möglichkeiten implementiert, Strom einzusparen. Das beginnt bereits mit der Versorgungsspannung von nur 3,3 V gegenüber den standardmäßigen 5 V. Weil die Leistungsaufnahme proportional zum Quadrat der Versorgungsspannung ist, bedeutet die Reduzierung auf 3,3 V allein eine Einsparung von ca. 50%. Weitere Stromsparpotentiale sind der (auch für andere Zwecke nutzbare) System-Management-Modus und der in zwei Stufen abschaltbare Prozessortakt. Der implementierte System-Management-Modus des i486DX4 stimmt mit dem des Pentiums überein. Stop-Clock-Modus Für den Einsatz insbesondere in Notebooks bietet das Abschalten oder Herunterfahren des Prozessortaktsignals eine weitere Stromsparmöglichkeit. Dadurch benötigt ein 3,3 V-i486DX4 nicht mehr Strom als ein gewöhnlicher i486DX. Das Abschalten des Prozessortakts erfolgt in zwei Stufen: Stop-Clock-Modus und Abschalten des externen Taktsignals. Durch Aktivieren des Stop-ClockSignals STPCLK wird der Prozessor angewiesen, die gerade laufenden Befehle abzuschließen und seine Pipelines zu leeren. Anschließend treibt er einen Stop-Grant-Sonderzyklus auf den Bus. Der Stop-Grant-Sonderzyklus ist durch folgende Signalzustände gekennzeichnet: M/IO=D/C=0, W/R=1, A31–A5=A3–A2=0, A4=1, BE3–BE0=1011b. Er muss vom System durch ein RDY oder BRDY bestätigt werden. In diesem Stop-Grant-Zustand arbeitet zwar der PLL-Oszillator noch, die Ausgabe des internen Prozessortaktsignals vom PLL-Oszillator an den eigentlichen Prozessor ist aber gesperrt. Dadurch sinkt der Stromverbrauch von typischerweise 1450 mA (bei 100 MHz) auf 100 mA, d.h. 1350 mA werden normalerweise vom Prozessor verbraucht. STPCLK ist als Interrupt implementiert und wird dadurch nur an Befehlsgrenzen erkannt. Es kann also eine Latenz von ein paar Takten auftreten, bis der i486DX4 auf STPCLK auch tatsächlich reagiert. Dazu kommt, dass STPCLK von allen möglichen CPU-Interrupts die niedrigste Priorität aufweist:
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
Interrupt
Priorität
RESET/SRESET FLUSH SMI NMI INTR STPCLK
höchste | | | | niedrigste
297
Tab. 9.9: Die Prioritäten der CPU-Interrupts
Die externe Systemlogik kann den Stop-Grant-Sonderzyklus erfassen und anschließend auch das externe Taktsignal CLK abschalten. Das ist die zweite Stufe des Stop-Clock-Modus und senkt die Stromaufnahme nochmals um 99% auf etwa 1 mA. Zusammengerechnet benötigt der i486DX4 in diesem Stop-Clock-Zustand weniger als ein Tausendstel der normalen Leistungsaufnahme. Der Prozessor kann aus dem Stop-Grant-Zustand durch ein STPCLK-Signal mit hohem Pegel (also eine Deaktivierung des Signals) sofort in den normalen Arbeitszustand zurückkehren. Das ist beim Stop-Clock-Zustand nicht möglich. Zunächst muss das externe Taktsignal CLK für mindestens 1 ms zugeführt werden, um den PLL-Oszillator zu stabilisieren. Erst anschließend tritt der i486DX4 wieder in den Stop-Grant-Zustand ein (aber ohne einen Stop-Grant-Sonderzyklus zu treiben), d.h. der PLL-Oszillator liefert ein stabiles Prozessortaktsignal, seine Ausgabe bleibt dennoch gesperrt. Durch Deaktivieren von STPCLK kann der i486DX4 dann schnell in den normalen Arbeitszustand zurückgeführt werden.
9.3.5
Weitere 486-CPUs
Die Forderung nach Strom sparenden CPUs, insbesondere für tragbare PCs, hat Intel veranlasst, eine besonders energiesparende Variante der 486er aufzulegen: den SL Enhanced i486, der im Prinzip einem »gewöhnlichen« i486DX oder auch i486SX mit all seinen Kennzeichen, wie z.B. 8-KByte-On-Chip-Cache, darstellt und zusätzlich eine Vielfalt von Stromsparmöglichkeiten aufweist. Es gibt diese CPU in verschiedenen Ausführungen mit Taktraten von 25 MHz, bis hin zu 66 MHz (SL Enhanced i486DX2) sowie für unterschiedlichen Betriebsspannungen (5 V oder 3,3 V). Neben dem Stromsparmodus, wie er beim i486DX4 erläutert ist, bietet diese Serie jedoch im Grunde nichts Neues, sodass stattdessen noch ein kurzer Blick auf CPUs der »alternativen« Hersteller folgt. Am486DX/Am486SX Diese Prozessoren sind i486DX- bzw. i486SX-kompatible Prozessoren, die mit einer Taktfrequenz von 33 MHz oder 40 MHz arbeiten. Der Am486SX ist die bekannte »abgespeckte« SX-Version und besitzt keinen Coprozessor. Beide Prozessoren orientieren sich streng an ihren Intel-Vorbildern und weisen sonst keine wesentlichen Besonderheiten gegenüber diesen auf. Lediglich ein JTAG-Boundary-Scan-Test ist für alle Am486DX-Modelle vorgesehen und die Taktfrequenz des Am486SX übersteigt mit maximal 40 MHz die Intel-Obergrenze von 33 MHz um 25%. Beide werden in einem 168-Pin-PGA mit i486DX- bzw. i486SX-kompatiblem Anschlussschema geliefert. Auch die Stromaufnahme ist gleich hoch wie bei den Intel-Vorbildern. Am486DXLV/Am486SXLV Der i486DX- bzw. i486SX-kompatible Prozessor ist besonders stromsparend ausgelegt. Er arbeitet mit einer Betriebsspannung von nur 3,0 V bis 3,6 V (typischerweise 3,3 V) gegenüber den 5 V des Am486DX/Am486DXL – daher die Bezeichnung LV für Low-Voltage. Weil die Leistungsaufnahme von CMOS-Chips wie bereits erwähnt proportional zum Quadrat der Betriebsspannung
Sandini Bib 298
Kapitel 9
ist, spart der Am486DXLV/SXLV mehr als 60% Leistung ein. Die Stromaufnahme beträgt bei 33 MHz nur 425 mA gegenüber 700 mA beim Am486DX/SX, die auf 3,3 V gesenkte Spannung trägt nochmals zur Verminderung der Leistungsaufnahme (P=U*I) bei. Der Am486DXLV/ SXLV verbraucht also nur noch 1,5 W statt 4,5 W wie beim Am486DX/SX. Der Am486DXLV/SXLV ist wie bereits der Am386DXLV/Am386SXLV vollkommen statisch implementiert. Dadurch kann die Taktfrequenz auf 0 MHz gesenkt, das Taktsignal also praktisch abgeschaltet werden, ohne dass der Prozessor seine Registerinhalte verliert oder anderweitig aus dem Takt kommt. Wie die Low-Power-486er von Intel wird auch der Am486DXLV/SXLV mit einem 2x-Takt von maximal 66 MHz (entsprechend einem Prozessortakt von 33 MHz) versorgt. Wenn das externe Taktsignal abgeschaltet wird, also auf 0 MHz sinkt, zieht der DXLV/SXLV-Prozessor nur noch einen um etwa drei Größenordnungen (Faktor 1000) geringeren Strom. Beide Am486-Varianten implementieren einen JTAG-Boundary-Scan-Test sowie einen SystemManagement-Modus, wie er auch schon vom Am386DXLV/SXLV bekannt ist. Am486DXLV und Am486SXLV werden in einem 196-Pin-PQFP ausgeliefert. Das Anschlussschema des Am486SXLV ist kompatibel mit dem i486SX im PQFP, nur werden zusätzlich noch die drei Pins 82 (SMI), 134 (SMIRDY) und 140 (SMIADS) von den Steuersignalen des System-Management-Modus benutzt. Die drei Anschlüsse bilden die Schnittstelle zum System-Management-Modus SMM. Das Pin-Layout des Am486DXLV stimmt mit dem des Am486SXLV (und damit i486SX) überein, nur sind zusätzlich noch die Anschlüsse 77 (IGNNE) und 81 (FERR) mit den Signalen vom OnChip-Coprozessor belegt. Am486DX2 Neben Intel hat auch AMD einen intern doppelt getakteten 486er hergestellt, den Am486DX2-66 mit internen 66 MHz. Er wird wie der i486DX2 oder i486DX in einem 168-Pin-PGA ausgeliefert und ist Pin-kompatibel zum i486DX2 oder i486DX-50; der einzige Unterschied zwischen diesen beiden Intel-CPUs ist, dass der Pin C11 beim i486DX2 mit dem UP-Signal belegt, beim i486DX-50 aber frei ist. Der Am486DX2 kann beide Belegungen (also mit und ohne UP) verdauen. Wie sein Vorbild unterstützt der Am486DX2 ebenfalls den JTAG-Boundary-Scan-Test. Am486DX4 Eine weitere Takterhöhung bringt der DX4 von AMD, der es intern als Am486DX4-120 auf 120 MHz oder als Am486DX4-133 sogar auf 133 MHz bringt. In dieser Version ist er bei vielen Anwendungen sogar schneller als ein 75-MHz-Pentium. Am5x86 und AMDs CPUID Der Am5x86 ist ein reiner 486er, allerdings mit einem großen 16-KByte-Cache auf, der wahlweise mit einer Write-Back- oder einer Write-Through-Strategie arbeiten kann (der Original-486 weist dagegen einen 8-KByte-Write-Through-Cache auf). Außerdem ist ein Soft-Reset entsprechend dem INIT des Pentiums implementiert. Dadurch kann der 5x86 schnell zurückgesetzt werden, wobei aber z.B. die Cache-Inhalte erhalten bleiben (z.B. zum Zurückkehren vom Protected- zum Real-Mode). Durch die Implementierung eines Write-Back-Caches sind ein paar zusätzliche Signale notwendig geworden; der 5x86 ist bei Konfiguration mit Write-Back-Cache also nicht mehr 100% pin-kompatibel mit dem i486DX2 oder dem i486DX4. Standardmäßig arbeitet der Am5x86 mit einem Write-Through-Cache. Wird dem Pin B13 (WB/WT) bei einem Reset ein Signal mit hohem Pegel zugeführt, dann arbeitet der On-Chip-Cache mit einer Write-Back-Strategie. Eine wichtige Neuerung gegenüber den
Sandini Bib Coprozessoren und 386/486-CPU-Derivate
299
anderen AMD-486ern ist die Implementierung des CPUID-Befehls zur Identifizierung des Prozessors. Der Am5x86 entspricht also weitgehend dem Intel i486DX4. CPUID liefert neben der Prozessorkennung auch Informationen darüber, welche besonderen Funktionen unterstützt werden. Wenn Sie den Aufrufwert 0 in das EAX-Register laden und anschließend den Befehl CPUID auslösen, gibt der Am5x86 die CPU-Identifizierung und zusätzlich die höchste Identifizierungsebene zurück, die er unterstützt. Die drei Register EBX, EDX und ECX enthalten in dieser Reihenfolge eine 12-Byte-Identifizierung in ASCII-Form: »AuthenticAMD«. Wenn Sie die CPUID-Funktion mit einem EAX-Wert 01h ausführen, übergibt der Prozessor im EAX-Register einen Identifizierungswert und im Register EDX zusätzliche Informationen darüber, welche besonderen Funktionen unterstützt werden. In der Tabelle 9.10 finden Sie die Aufruf- und Rückgabewerte von CPUID für den Am5x86. Register Aufrufwert
Rückgabewert
EAX EBX ECX EDX EAX EBX ECX EDX
01h »Auth« »cAMD« »enti« Identifizierungswert 1) reserviert (=0000h) reserviert (=0000h) Feature Flags 2)
1)
2)
00h
01h
Bits 31...12 Bits 11...8 Bits 7...4 Bits 3...0
reserviert (=00h) Familie (0100b=04h für 5x86) Modellnummer (1110b=0eh für 5x86 mit Write-Through-Cache, 1111b für 5x86 mit Write-Back-Cache) Version (Stepping)
Bits 31...2: Bit 1: Bit 0:
reserviert (=0000h) implementierte Sonderfunktion On-Chip-Gleitkommaeinheit (1=On-Chip FPU , 0=keine On-Chip FPU)
Tab. 9.10: Aufruf- und Rückgabewerte von CPUID bei AMD
Die typischen Elemente der Pentium- und PentiumPro-Generation (dynamische Verzweigungsvorhersage, Superskalararchitektur, Register-Renaming usw.) sucht man beim Am5x86 zwar vergebens, da er aber mit bis zu 133 MHz getaktet wird, kann er einem 75-MHz-Pentium durchaus Paroli bieten. Cyrix-CPUs Neben den mehr am i386 angelehnten 486SLC bzw. 486DLC hat Cyrix auch »echte« i486-kompatible Chips entwickelt. Der Cx486S-40 läuft mit 40 MHz oder als intern doppelt getakteter Cx486S2/50 mit 50 MHz und arbeitet die Befehle in einer Pipeline ab. Das Befehls-Pipelining ist aber nicht für alle Befehle so effektiv wie beim i486 oder Am486, manche Instruktionen benötigen einen Taktzyklus mehr. Dank einer rein in Hardware implementierten Integer-Multiplikationseinheit erreichen der Cyrix-SX und der Cyric-DX aber eine bis zu siebenmal höhere Multiplikationsgeschwindigkeit als die mikrocodierten Multiplizierer z.B. des Am486 oder des i486. Je nach Anwendung oder Benchmark ist dann einmal der i486/Am486 oder der Cyrix schneller.
Sandini Bib 300
Kapitel 9
Ein wahlweise mit Write-Back-Strategie betreibbarer Cache mit 2 KByte Kapazität ist auf dem Chip integriert. Der i486SX-kompatible Cyrix-Chip besitzt keinen On-Chip Coprozessor, dieser wird durch einen Cx487S nachgeliefert. Der Cx487S ist im Gegensatz zum i487SX ein echter Coprozessor und kein Upgrade. Die Cyrix-Prozessoren sind mit 5 V oder 3,3 V (bis zu 33 MHz) zu betreiben. Auch ein i486DX-kompatibler Chip mit integriertem Coprozessor mit dem vom i486 gewohnten 8-KByte-Cache, sowie taktverdoppelnde 486-CPUs (Cyrix 486DX2) hat Cyrix hergestellt. Wie es sich für stromsparende Mikroprozessoren gehört, weisen die Cyrix-Prozessoren außerdem einen System-Management-Modus auf. Zur Erinnerung: Die Tabelle 9.6 zeigt die gebräuchlichsten 386- und 486-CPUs mit ihren wesentlichen Daten in der Übersicht. CPUs von IBM Auch der Gigant IBM konnte sich nicht der CPU-Entwicklung für Personal Computer entziehen. Ein Ergebnis ist der als Blue Lightning bezeichnete 486DLC3. Die »3« deutet an, dass er (wie der i486DX4) intern mit verdreifachter Frequenz arbeitet und dadurch 100 MHz bei einer externen Taktfrequenz von 33 MHz erreicht. Der 486DLC3 integriert einen 16-KByte-Cache (i486DX: 8 KByte), der mit Write Allocation arbeitet. Ein Cache-Miss beim Schreiben löst also wie ein Cache-Fehltreffer beim Lesen ein Cache-Line-Fill aus. Ein On-Chip-Coprozessor ist hingegen nicht vorhanden. Leider basiert der Blue Lightning intern im Wesentlichen auf einem am i386 angelehnten Prozessorkern ohne Befehls-Pipelining. Das macht sich in den Ausführungszeiten der Maschinenbefehle nachteilig bemerkbar. Beispielsweise benötigt der Befehl MOV reg, reg zwei Prozessortakte statt nur einem beim i486. Auch Zugriffe auf den On-Chip-Cache (Cache-Treffer) dauern mit zwei gegenüber einem Taktzyklus doppelt so lange. Eine Besonderheit beschleunigt den 486DLC gegenüber dem i486 wiederum: der Mikrocode des 486DLC3 fasst jeweils vier einzelne 8-Bit-Verschiebungen eines REP MOVSB (byteweises Verschieben von String-Daten) nach einer Ausrichtung an einer 32-Bit-Grenze so weit wie möglich zu einem einzigen 32-Bit-MOV zusammen. Die Bustransferrate für umfangreiche Zugriffe, z.B. auf den Video-RAM, steigt dadurch beträchtlich an. Zur Stromeinsparung tragen die auf 3,3 V verminderte Betriebsspannung und ein System-Management-Modus bei, der 486DLC3 verbraucht 3,6 W. Neben dem 486DLC3 gibt es noch den 486SLC2, der intern mit einer nur verdoppelten Frequenz (wie der i486DX2 oder Am486DX2) arbeitet, sonst aber im Wesentlichen mit dem 486DLC3 übereinstimmt. Verwechseln Sie aber nicht die IBM 486DLC- und 486SLC-Chips mit den gleichnamigen CPUs von Cyrix.
Sandini Bib
10 Der Pentium Der Nachfolger des i486 war lange von Geheimnissen umgeben. Dies fing bereits beim Namen an und erstreckte sich bis hin zu sehr spekulativen Eigenschaften des P5 (wie er zeitweise genannt wurde), was eigentlich immer der Fall ist, wenn eine CPU kurz vor der Markteinführung steht, die beim Pentium der ersten Generation im Jahre 1993 stattfand. In den folgenden Abschnitten möchte ich die Besonderheiten dieses Superskalars diskutieren, um Ihnen einen Einblick in die RISC-Technologien zu geben, die zu einem Befehlsdurchsatz von bis zu 330 MIPS des Pentiums bei 200 MHz gegenüber 54 MIPS beim i486DX2-66 führen. Der Ausdruck RISC ist hier eigentlich nicht angemessen, weil der Pentium (natürlich) vollkommen i486-kompatibel ist und dadurch auch die mehr als 400 i486-Maschinenbefehle beherrschen muss. Zunächst möchte ich ein paar wesentliche Eigenschaften des Pentiums vorstellen, die ihn von seinen 80x86Vorgängern unterscheiden:
: : : : : : : :
Zwei Integer-Pipelines und eine Gleitkomma-Pipeline (Superskalararchitektur) Dynamische Verzweigungsvorhersage (Branch Prediction) Getrennte Daten- und Code-Caches mit je 8 KByte, Write-Back-Strategie und Unterstützung des MESI-Cache-Kohärenzprotokolls Externer 64-Bit-Datenbus mit Pipelined-Burst-Modus für schnelle Cache-Line-Fills und Write Backs mit bis zu 528 MioByte/s oder 504 MByte/s Transferrate Execution Tracing zur externen Überwachung der internen Befehlsausführung Standardmäßiger System Management Mode zur Implementierung Strom sparender Funktionen; Performance Monitoring zur Optimierung von Codesequenzen Ab der 75-MHz-Version mit eingebauter Dual-Processing-Fähigkeit und lokalem On-ChipAPIC (Advanced Programmable Interrupt Controller)
In der Abbildung 10.1 sehen Sie das Foto eines Pentiums mit den einzelnen Funktionsgruppen. Reguläre Strukturen stellen Speicher dar, wie z.B. die beiden Caches, die TLBs und den BranchTrace-Puffer. Der gezeigte Chip weist mehr als drei Millionen Transistoren auf. Auf Grund der technischen Entwicklung seit dem Erscheinen des Pentiums, möchte ich die ersten Varianten, die mit 60 MHz oder 66 MHz arbeiten (erste Pentium Generation) hier nicht explizit behandeln, denn sie wurden bereits nach kurzer Zeit von der nachfolgenden Baureihe P54C abgelöst. Die wesentlichen Unterschiede sind ein geändertes Pin-Layout, die Integration weiterer Elemente auf dem CPU-Chip (z.B. der APIC), die Absenkung der Versorgungsspannung auf 3,3 V statt 5 V und die interne Taktvervielfachung. Die verbesserte Prozesstechnologie bei der Herstellung (u.a. eine verminderte Strukturgröße) erlauben Taktfrequenzen ab 75 MHz. Die Motherboards für die erste Pentium-Generation stellen zudem eine technologische Sackgasse dar, denn es können hier lediglich die beiden ursprünglichen Pentiums eingesetzt werden und keiner der folgenden Pentium-CPUs.
Sandini Bib 302
Kapitel 10
Abb. 10.1: Der Pentium-Chip (Quelle: Intel GmbH [Deutschland])
10.1 Anschlüsse und Signale Der Pentium benötigt durch seinen 64-Bit-Datenbus und die zusätzliche Integration weiterer Einheiten auf dem CPU-Chip eine große Anzahl von Anschlüssen. Er wird in einem so genannten Staggered Pin Grid Array oder kurz SPGA ausgeliefert, das 296 Kontaktstifte aufweist. Die Stromaufnahme von mehr als 4 A bei 133 MHz erfordert insgesamt 53 Vcc- und 53 GNDAnschlüsse, um den Strom auch übertragen und die entstehende Wärme von bis zu 13 Watt teilweise abführen zu können. Der Rest wird über einen Kühlkörper an die Umgebung abgegeben. In Abbildung 10.2 sehen Sie das Anschlussschema des Pentiums. Im Folgenden möchte ich Ihnen nun diese Anschlüsse vorstellen und die zugeführten bzw. abgegebenen Signale erläutern. Die Aufstellung ist alphabetisch geordnet. Gegenüber den ersten beiden Pentium-Versionen mit 60 MHz und 66 MHz sind folgende Pins und Signale hinzugekommen:
:
ADSC, APICEN, BF, BRDYC, CPUTYP, D/P, DPEN, PBGNT, PBREQ, PHIT, PHITM, PICCLK, PIC1, PICD0, STPCLK.
In ihrer Bedeutung verändert wurden:
:
BP, INTR/LINT0, NMI/LINT1.
Arbeitet der Pentium in Dual-Processing-Konfiguration, so ändert sich auch die Bedeutung der folgenden Signale:
:
A20M, ADS, BE4–BE0, CACHE, D/C, FERR, FLUSH, HIT, HITM, HLDA, IGNNE, LOCK, M/IO, PCHK, RESET, SCYC, SMIACT, W/R.
Sandini Bib Der Pentium
303
A20M (I) Anschluss AK8 Wird diesem Address-20-Mask-Pin ein Signal mit niedrigem Pegel zugeführt, dann maskiert der Pentium vor jedem Speicherzugriff intern das Adressbit A20. Das betrifft auch alle Zugriffe (Look-Ups) auf die beiden On-Chip-Caches. Der Pentium emuliert dadurch wie der i486 das Wrap-Around des 8086 bei der Adresse 1M. A20M darf nur im Real Mode aktiviert werden. Arbeitet der Pentium als sekundärer (Dual-)Prozessor, wird dieses Signal intern maskiert und hat daher keine Auswirkungen. A B C D E F G H J K L M N P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AJ AK AL AMAN 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
INC INC INC
D47 D43
D41
D52
D45
Vcc
Vcc
Vcc GND
D57 D56
D53
D61 D59
D58
Vcc
Vcc GND
GND
PM0/BP0
D63 D62
D60
Vcc GND
IERR DP7
BP2
PM1/BP1
FERR
Vcc GND
Vcc
CACHE M/IO
BP3
Vcc
GND
EWBE
AHOLD INV
Vcc
GND
BRDYC
BRDY
KEN
Vcc
GND
GND
PHIT
BOFF NA
Vcc
PHITM
HOLD
WB/WT
Vcc
PBREQ SMIACT
PBGNT
PRDY
PCHK
APCHK
GND
INC
BREQ GND
GND
GND
PWT
HLDA
LOCK
PCD
HITM
ADS
Vcc
BUSCHK FLUSH
D46
Vcc
BE0
D42 D39
BE1
D37
BE3
D35
BE5
D33
BE7
Vcc
DP3
CLK
Vcc
Vcc
Pentium
frei
(75MHz bis 200MHz)
Vcc
A19
D26
A17
D23
A15
Vcc
D19
A13
Vcc
DP1
A9
D22
D12
A5
D18
D15
D7 D8
D10 D11
D3 D5
D6 DP0
D9
Vcc GND
A11
D14 D13
Vcc GND
A12
D17 D16
Vcc GND
A14
D21 D20
Vcc GND
A16
D24 GND
Vcc GND
A18
DP2 GND
Vcc GND
A20
D28 D25
GND
Vcc
GND
RESET
D27
Vcc
Vcc GND
SCYC
D30
GND
Vcc GND
BE6
D29 GND
Vcc GND
BE4
D31 GND
Vcc GND
BE2
D32 GND
GND
A20M
D34 GND
INC W/R
HIT
D36 GND
INC
EADS
D/C
DP5
INC
ADSC
AP
D40 D38
Vcc
D55
D49
DP4
Vcc GND
D51
D44
GND
Vcc DP6
D48
GND
frei
D54 D50
D1 D4
Vcc
PICD0 PCLK D2 GND
Vcc
Vcc D0
PICD1 GND
Vcc
TDO TCK TDI
GND Vcc
TRST TMS
CPUTYP GND
Vcc
frei frei frei
GND Vcc
Vcc Vcc
GND GND
Vcc
BF1
STPCLK frei GND Vcc
BF0 frei
FRCMC GND
Vcc
INIT PEN
IGNNE
GND Vcc
NMI SMI R/S
GND Vcc
A23
D/P
Vcc
A24
A3
A25
Abb. 10.2: Die Anschlüsse und Signale des Pentiums, der seinen Platz in einem Sockel 5 oder 7 findet.
frei A30
A28 GND
A6 A4
A29
A22 Vcc
A7
A31 A26
GND
GND Vcc
A27 A21
INTR
A10 A8
GND
GND
Sandini Bib 304
Kapitel 10
A31–A3 (O; A31–A5: I/O) Anschlüsse AE33, AF34, AG33, AG35, AH34, AH36, AJ33, AJ35, AK22, AK24, AK26, AK28, AK30, AK32, AK34, AK36, AL21, AL23, AL25, AL27, AL29, AL31, AL33, AL35, AM32, AM34, AM36, AN31, AN33 Die 29 Anschlüsse bilden für Schreib- und Lesevorgänge die 29 höherwertigen Bits des 32-BitAdressbus. Die drei niederwertigen Adressbits A0 bis A2 werden durch die acht Byte-Enable-Signale BE0–BE7 kodiert. In einem Abfragezyklus treibt die externe Logik nur die 27 Adresssignale A31–A5, um dem Pentium eine an einer Cache-Line-Grenze (8 Byte) ausgerichtete Abfrageadresse zu übergeben. ADS (O; Dual: I/O) Anschluss AJ5 Ein niedriger Pegel des Adress-Status-Signals zeigt an, dass ein neuer Buszyklus gestartet worden ist und die Anschlüsse W/R, D/C und M/IO gültige Signale zur Definition des Buszyklus und die Pins BE0–BE7 sowie A31–A3 gültige Adresssignale abgeben. ADSC (O; Dual: I/O) Anschluss AM2 ADSC stimmt funktional mit ADS überein. AHOLD (I) Anschluss V4 Liegt an diesem Adress-Hold-Pin ein Signal mit hohem Pegel an, so treibt der Pentium seinen Adressbus (A31–A3 und AP) nicht mehr und schaltet ihn auf eine Eingabe um. Ein externer Busmaster kann dann auf den Adressbus des Pentiums zugreifen, um einen Abfragezyklus auszuführen. Alle anderen Bussignale vom Pentium sind aber weiter aktiv, sodass Daten für bereits ausgelöste Buszyklen noch übertragen werden können. AP (I/O) Anschluss AK2 Der Pentium unterstützt neben der Paritätsbildung für den Datenbus auch eine Paritätsbildung für den Adressbus. Im Unterschied zu DP7–DP0 wird AP für den gesamten 29-Bit-Adressbusanteil A31–A3 ausgegeben. Der Pentium liefert für Schreibzyklen ein Paritätsbit AP, sodass stets gerade Parität erzielt wird. Beim Datenlesen muss das System dem Pin AP ein Signal zuführen, das zu gerader Parität führt (d.h. die Gesamtheit A31–A3 und AP muss eine gerade Anzahl von Einsen aufweisen). Systeme, die diese Paritätsfunktion nicht unterstützen, klemmen AP meist auf Vcc oder GND fest. Das in einem Lesevorgang zugeführte AP-Signal beeinflusst die interne Ausführung von Befehlen nicht, der Pentium reagiert auf einen Adressparitätsfehler lediglich mit einer Aktivierung von APCHK zwei CLK-Zyklen nach der Aktivierung von EADS durch das abfragende Subsystem. APCHK (O) Anschluss AE5 Ist in einem Abfragezyklus eine externe Adresse eingelesen worden, gibt der Pentium über den Address-Parity-Check-Pin ein Signal aus, das anzeigt, ob die übergebenen Adressbits A31–A3 und das Adressparitätsbit AP konsistent sind. Liegt APCHK auf einem niedrigen Pegel, so ist ein Adressparitätsfehler aufgetreten. Das System muss APCHK und auch die restlichen Paritätsprüfungssignale nicht unbedingt bedienen oder verwenden.
Sandini Bib Der Pentium
305
BE7–BE0 (O; Reset: BE4–BE0 I/O) Anschlüsse AL9, AL11, AL13, AL15, AK10, AK12, AK14, AK16 Diese (Byte-Enable-)Signale legen wie beim i486 fest, welche Byte-Gruppen des 64-Bit-Datenbusses im gegenwärtigen Buszyklus auch wirklich gültige Daten übertragen. BE0 entspricht dem niederwertigen Datenbyte D7–D0, BE7 dem höchstwertigen Datenbyte D63–D56. Bei einem cachebaren Lesezyklus müssen unabhängig von den BEx-Werten alle 64 Datenleitungen mit den gültigen Datensignalen getrieben werden, weil der Pentium für einen solchen Lesezugriff prinzipiell ein Cache-Line Fill ausführt und alle 64 Datenbits vom Datenbus übernimmt. Während eines Resets wird den Anschlüssen BE3–BE0 eine APIC-ID zugeführt und vom On-Chip-APIC folgendermaßen ausgewertet: APIC ID Register
Pin
Bit 24 Bit 25 Bit 26 Bit 27
BE0 BE1 BE2 BE3
BF1, BF0 (I) Anschlüsse Y33, Y34 Die Signale an diesen Bus-Frequenz-Anschlüssen definieren das Verhältnis von externem und internem Prozessortakt während eines Resets. BF1
BF0
Taktverhältnis
1 1
0 1
1/2 2/3
BOFF (I) Anschluss Z4 Wird dem Backoff-Anschluss ein Signal mit niedrigem Pegel zugeführt, so deaktiviert der Pentium seinen Bus. Er trennt fast alle Anschlüsse ab und unterbricht alle gerade laufenden Buszyklen. Nach einer Deaktivierung von BOFF startet der Pentium die unterbrochenen Buszyklen neu, indem er alle notwendigen Adress-, Daten- und Steuersignale für den unterbrochenen Zyklus erneut ausgibt, d.h. er beginnt den unterbrochenen Buszyklus nochmals von vorne. BP3–BP2, PM1/BP1–PM0/BP0 (O) Anschlüsse S3, S5, Q3, R4 Die Breakpoint-Anschlüsse BP3–BP0 entsprechen den Debug-Registern DR3–DR0. Ergibt sich für eines der Register ein Haltepunkt, dann aktiviert der Pentium den zugehörigen BPx-Anschluss. Durch die zwei Bits PB1 und PB0 im Debug-Modussteuerregister DR4 können Sie festlegen, ob PM1/BP1 bzw. PM0/BP0 als Breakpoint-Anschluss (PBx=1) oder zum Performance Monitoring benutzt werden sollen. Mit Hilfe der Signale BP3–BP0 können Breakpoint-Treffer extern durch Hardware erfasst werden. Dagegen läuft eine interne Breakpoint-Erfassung verzögert ab, weil der Pentium intern zunächst die entsprechende Exception erzeugen und den Handler über einen relativ langwierigen Interrupt-Aufruf anspringen muss. BRDY (I) Anschluss X4 Das Burst-Ready-Signal an diesem Pin zeigt an, ob das adressierte Peripheriesystem, z.B. der Hauptspeicher oder ein I/O-Gerät, den geforderten Zugriff bereits abgeschlossen hat (BRDY=0)
Sandini Bib 306
Kapitel 10
oder noch mehr Zeit benötigt (BRDY=1). Wie bei den anderen 80x86-CPUs weist auch beim Pentium das Ready-Signal Wartezyklen an, wenn die adressierte Einheit nicht schnell genug reagiert. Im Gegensatz zum i486 gibt es hier keine Unterscheidung zwischen einem gewöhnlichen Ready und einem Burst-Ready-Signal mehr. BRDY betrifft sowohl Burst-Zyklen (die nur für einen Speicherzugriff möglich sind) als auch Einzeltransfer- und I/O-Zyklen. BRDYC (I) Anschluss Y3 BRDYC stimmt funktional mit BRDY überein. BREQ (O) Anschluss AJ1 Über das Bus-Request-Signal BREQ zeigt der Pentium an, dass er intern den Bus angefordert hat. Es ist möglich, dass der Pentium den Bus im Moment nicht benutzen darf (durch ein aktives Signal AHOLD, HOLD oder BOFF). BREQ wird aber trotzdem ausgegeben und kann von einer Busarbitrierungslogik benutzt werden, um nach einer Deaktivierung von AHOLD, HOLD oder BOFF dem Pentium den Bus vorrangig wieder zuzuweisen. Das ist vor allem in Multimastersystemen notwendig (z.B. ein Pentium und ein Busmaster-DMA oder mehrere CPUs). BUSCHK (I) Anschluss AL7 Ein aktives Bus-Check-Signal mit niedrigem Pegel zeigt dem Pentium einen unvollständigen Abschluss des ausgeführten Buszyklus an, d.h. der Zyklus wurde zwar abgeschlossen, das Subsystem konnte aber den vom Pentium angewiesenen Zyklus (Datenlesen, Datenschreiben, sonstige Zugriffe etc.) nicht korrekt ausführen. Der Pentium legt in diesem Fall die Adresse und Werte entsprechend den Steuersignalen im Machine-Check-Register ab. Ist im Steuerregister CR4 das MCE-Bit gesetzt, dann löst der Pentium eine Machine Check Exception entsprechend Interrupt 18 (12h) aus. CACHE (O; Dual: I/O) Anschluss U3 Ein aktives CACHE-Signal mit niedrigem Pegel gibt an, dass der gegenwärtige vom Pentium ausgelöste Speicherzyklus intern cachebar ist. Treibt der Pentium einen Speicherlesezyklus oder einen Befehlslesezyklus und ist CACHE aktiv, dann erweitert der Pentium den Speicherlesezyklus zu einem Cache-Line Fill im Burst-Modus, falls das adressierte Speichersubsystem KEN aktiviert ist und dadurch auch das Subsystem mitteilt, dass die gewünschten Daten oder Codes cachebar sind. Bleibt KEN inaktiv, dann führt der Pentium trotz aktivem CACHE kein CacheLine Fill aus. Ursache kann z.B. sein, dass sich bei Memory-Mapped-I/O hinter der angesprochenen Speicherstelle ein Steuerregister verbirgt. Ein inaktives CACHE-Signal mit hohem Pegel führt unabhängig vom KEN-Pegel stets zu einem Einzeltransfer ohne internes Caching der übergebenen Daten- oder Codebytes. Wird CACHE für einen Schreibzyklus vom Pentium aktiviert, dann führt er ein Write-Back einer Cache-Line im Burst-Modus aus. Write-Throughs in den externen Speicher werden bei einem inaktiven CACHE ausgeführt. Das sind Schreibvorgänge, die zu einem Cache-Fehltreffer für den On-Chip-Daten-Cache führen. Der Pentium führt keine Cache-Line-Fills für solche schreibenden Cache-Fehltreffer aus, er implementiert keine WriteAllocate-Strategie. Das Signal CACHE könnte man auch als Burst-Anweisungssignal ansehen, weil ein aktives CACHE-Signal einen Burst-Transfer anweist und zur Übertragung von 32 Byte an Code oder Daten führt. I/O-Zyklen sind prinzipiell nicht cachebar, weil sich hinter den angesprochenen Ports üblicherweise Steuer- und Statusregister verbergen.
Sandini Bib Der Pentium
307
CLK (I) Anschluss AK18 Diesem Pin wird das Taktsignal zugeführt, dass der Pentium entsprechend den Pegeln von BF1 und BF0 multipliziert, um den internen Prozessortakt PCLK zu erzeugen. CPUTYP (I) Anschluss Q35 In einem Ein-Prozessorsystem muss CPUTYP mit Masse (GND) verbunden sein. Dasselbe gilt für den Dual-Processing-Modus, wenn dieser Pentium den primären Prozessor darstellt. Dem sekundären Pentium wird dann an seinem CPUTYP-Anschluss ein Signal mit hohem Pegel (Vcc) zugeführt. Auf diese Weise wird für das Anlaufen des Computers eine Hierarchie vorgegeben. D63–D0 (I/O) Anschlüsse A5, A31, A33, A35, B4, B30, B32, B34, B36, C3, C5, C9, C11, C13, C15, C17, C19, C21, C23, C27, C29, C31, C33, C35, C37, D2, D4, D6, D8, D10, D12, D14, D16, D20, D22, D24, D26, D28, D32, D34, E1, E3, E5, E7, E9, E33, E35, F4, F34, F36, G3, G5, G33, G35, H4, J3, J5, J35, K4, K34, L3, L5, M4, N3 Die 64 Anschlüsse bilden den bidirektionalen 64-Bit-Datenbus des Pentiums für eine Ein- und Ausgabe von Daten. Der Pentium-Datenbus ist auf die doppelte Breite des i486-Datenbusses angewachsen. Dadurch können vor allem die zwei On-Chip-Caches sehr schnell gefüllt oder zurückgeschrieben werden. Die Daten an diesen Pins werden bei einem Datenlesevorgang übernommen, sobald BRDY aktiv wird. D/C, M/IO, W/R (O, O, O; Dual: I/O, I/O, I/O) Anschlüsse AK4, T42, AM6 Die Signale Data/Control (1=Datenzyklus, 0=Befehls-/Sonderzyklus), Memory/IO (1=Speicherzyklus, 0=I/O-Zyklus), Write/Read (1=Schreibzyklus, 0=Lesezyklus) an diesen Pins definieren den Buszyklustyp. Die Signalkombinationen haben dabei folgende Bedeutungen:
: : : : : : : : 1)
(000) Interrupt-Acknowledge-Sequenz (001) Sonderzyklus1) (010) Lesen eines I/O-Ports (011) Schreiben eines I/O-Ports (100) Befehls-Fetching (101) Ungültig (110) Lesen von Daten aus dem Speicher (111) Schreiben von Daten in den Speicher BE7=BE6=BE5=BE4=BE3=BE2=BE1=1, BE0=0: Shutdown BE7=BE6=BE5=BE4=BE3=BE2=BE0=1, BE1=0: internes Cache-Flush (INVD, WBINVD) BE7=BE6=BE5=BE4=BE3=BE1=BE0=1, BE2=0: Halt BE7=BE6=BE5=BE4=BE2=BE1=BE0=1, BE3=0: Write-Back-Zyklus (WBINVD) BE7=BE6=BE5=BE3=BE2=BE1=BE0=1, BE4=0: Flush Acknowledge BE7=BE6=BE4=BE3=BE2=BE1=BE0=1, BE5=0: Branch-Trace-Message-Zyklus
Sandini Bib 308
Kapitel 10
D/P,(O) Anschluss AE35 Das Signal an diesem Anschluss ist nur im Dual-Processing-Modus und nur für den primären Prozessor definiert. In diesem Fall gibt der primäre Pentium am Dual-/Primary-Anschluss ein Signal mit niedrigem Pegel aus, wenn er den Bus treibt. DP7–DP0 (I/O) Anschlüsse C7, C25, D18, D30, D36, F2, F6, N5 Der Pentium unterstützt neben der Paritätsbildung für den Adressbus auch eine solche für den Datenbus, d.h. er gibt bei allen Schreibzyklen für jedes Byte des Datenbusses D63–D0 ein Paritätsbit DP7–DP0 aus, sodass gerade Parität erzielt wird. Beim Lesen von Daten muss das System den Pins DP7–DP0 Signale zuführen, die zu gerader Parität führen. Systeme, die diese Paritätsfunktion nicht unterstützen, klemmen DP7–DP0 meist auf Vcc oder GND fest. Ähnlich wie für den Adressbus beeinflussen die den Anschlüssen in einem Lesevorgang zugeführten Signale die Befehlsausführung nicht, falls nicht gleichzeitig dem PEN-Anschluss ein aktives Signal mit niedrigem Pegel zugeführt wird. Ein aktives PEN-Signal weist den Pentium an, die Adresse für den betreffenden Lesezyklus und die Art des Zyklus in den Registern MCA bzw. MCT abzulegen. Durch ein gesetztes MCE-Bit in CR4 löst der Pentium eine Machine Check Exception entsprechend Interrupt 18 (12h) aus. Ist PEN nicht aktiv, dann besteht die einzige Reaktion des Pentiums auf einen Datenparitätsfehler in einer Aktivierung des Signals PCHK. EADS (I) Anschluss AM4 Ein aktives Signal mit niedrigem Signalpegel an diesem External-Adress-Anschluss zeigt dem Pentium an, dass ein externer Busmaster eine gültige Adresse an seine Adresspins angelegt hat und einen Abfragezyklus treibt. EWBE (I) Anschluss W3 Ein aktives Signal mit niedrigem Signalpegel an diesem External-Write-Buffer-Empty-Anschluss teilt dem Pentium mit, dass das externe System (z.B. ein L2-Cache) bereit ist, Schreibdaten vom Pentium entgegen zu nehmen. Ist EWBE dagegen inaktiv, also auf einem hohen Pegel, dann muss das Subsystem zunächst einen noch anhängigen Schreibzyklus ausführen, bevor der Pentium Daten an Cache-Lines im E-(exklusiv) oder M-(modified) Zustand übergeben darf. Erst wenn EWBE wieder aktiv ist, setzt der Pentium diese Schreibvorgänge fort. FERR (O) Anschluss Q5 Der Anschluss gibt ein aktives Signal mit niedrigem Pegel ab, wenn in der Gleitkommaeinheit des Pentiums eine nicht-maskierte Exception aufgetreten ist. Dadurch kann der Pentium in einen Personal Computer eingebunden werden, der aus Kompatibilitätsgründen einen CoprozessorInterrupt auslöst, um einen solchen Coprozessorfehler anzuzeigen. FLUSH (I) Anschluss AN7 Wird dem Cache-Flush-Anschluss ein FLUSH-Signal mit niedrigem Pegel zugeführt, dann schreibt der Pentium alle veränderten Cache-Lines des On-Chip-Daten-Caches in den Speicher zurück und invalidiert beide On-Chip-Caches (also Daten- und Code-Caches), er führt ein Cache-Flush aus. Nach Abschluss des Cache-Flush treibt der Pentium einen Flush-Acknow-
Sandini Bib Der Pentium
309
ledge-Sonderzyklus (siehe D/C, M/IO, W/R). Im Fall einer Dual-Processing-Konfiguration schreibt zuerst der sekundäre Pentium seine Cache-Lines zurück, anschließend der primäre Prozessor und erst dann wird ein (einziger) Flush-Acknowledge-Zyklus getrieben. FRCMC (I) Anschluss Y35 Das Signal an diesem Functional-Redundancy-Checking-Master/Checker-Eingang zeigt dem Pentium im Verlauf eines Resets und der daraus folgenden Initialisierung an, ob er als Master oder Checker arbeiten soll. Als Master (hoher Pegel an FRCMC) steuert der Pentium den Bus entsprechend dem gewöhnlichen Busprotokoll (er treibt also z.B. die Adress- und Steuersignale). Im Checker-Modus ermittelt der Pentium dagegen die Signalpegel an allen Ausgangs-(O-) Anschlüssen (außer IERR und TDO) und vergleicht sie mit internen Werten. Bei fehlender Übereinstimmung wird IERR aktiviert. Dadurch können sich z.B. zwei Pentium-CPUs gegenseitig überprüfen. HIT (O; Dual: I/O) Anschluss AK6 Das HIT-Signal zeigt das Ergebnis eines Abfragezyklus an. Hat der Abfragezyklus zu einem Treffer im On-Chip-Daten- oder Befehls-Cache geführt, aktiviert der Pentium das HIT-Signal (niedriger Pegel). Bei einem Fehltreffer gibt der Anschluss ein Signal mit hohem Pegel ab. HITM (O; Dual: I/O) Anschluss AL5 Das Hit-Modified-Line-Signal gibt ähnlich wie HIT das Ergebnis eines Abfragezyklus an. Ein Treffer auf eine Modified Line im On-Chip-Daten-Cache veranlasst den Pentium, ein HITM-Signal mit niedrigem Pegel abzugeben. Das externe System kann HITM im Verlauf einer Busarbitrierung dazu benutzen, einen anderen Busmaster daran zu hindern, die betreffenden Daten zu verwenden, bevor der Pentium den Inhalt der veränderten Line in den Speicher zurückgeschrieben hat. HOLD, HLDA (I, O; Dual: I/O) Anschlüsse AJ3, AB4 Die zwei Bus-Hold-Request- und Bus-Hold-Acknowledge-Anschlüsse dienen wie üblich zur Bus-Arbitrierung. Möchte ein anderer Busmaster die Steuerung übernehmen, führt er dem HOLD-Eingang des Pentium ein Signal mit einem hohen Pegel zu. Ist die Steuerungsabgabe nicht durch ein aktives LOCK oder die gegenwärtige Abarbeitung eines Befehls intern gesperrt, dann reagiert der Pentium mit der Ausgabe eines aktiven HLDA-Signals. Der neue Busmaster hält das Signal HOLD so lange aktiv, bis er die Kontrolle über den lokalen Bus zurückgeben möchte (oder muss). Er deaktiviert anschließend das Signal HOLD und der Pentium übernimmt erneut den lokalen Bus. HOLD und HLDA spielen in modernen Busarchitekturen (EISA-, Mikrokanal- und Local-Bus-Systeme) eine wichtige Rolle bei der Busarbitrierung. IERR (O) Anschluss P4 Ein aktives Internal-Error-Signal mit niedrigem Pegel an diesem Pin zeigt einen internen Fehler des Pentiums an. Ursache kann ein Paritätsfehler beim Lesen interner Datenfelder sein. Ein als Master arbeitender Pentium aktiviert dann IERR und tritt in den Shutdown-Zustand ein. Im Checker-Modus wird IERR aktiviert, wenn die abgetasteten Werte an den Ausgabepins nicht mit den intern berechneten übereinstimmen.
Sandini Bib 310
Kapitel 10
IGNNE (I) Anschluss AA35 Wird diesem Ignore-Numeric-Error-Anschluss ein Signal mit niedrigem Pegel zugeführt und ist das NE-Bit im Steuerregister CR0 gelöscht (also gleich 0), so ignoriert der Pentium numerische Fehler (Exceptions) und führt weiter Gleitkommabefehle aus. FERR wird aber trotzdem aktiviert. Ist IGNNE auf einem hohen Pegel (also inaktiv) und ist der nächste Gleitkommabefehl ein FINIT, FCLEX, FSTENV, FSAVE, FSTSW, FSRCW, FENI, FDIDI oder FSETPM, dann führt der Pentium den neuen Befehl anstelle der Exception aus. Ist IGNNE auf einem hohen Pegel und der folgende Befehl ein anderer als oben angeführt, dann bricht der Pentium die Befehlsausführung ab und wartet auf einen externen Interrupt. Ist das Bit NE im Steuerregister CR0 gesetzt, so hat IGNNE keine Auswirkungen. Ist der Pentium als sekundärer Prozessor konfiguriert, maskiert er das IGNNE-Signal intern, d.h. es ist in diesem Fall ohne Bedeutung. INIT (I) Anschluss AA33 Ein Signal mit hohem Pegel an diesem Initialisierungsanschluss für mindestens zwei CLK-Taktzyklen setzt den Pentium ähnlich wie ein Reset in einen definierten Anfangszustand zurück. Anders als ein Reset werden aber die internen Caches, Schreibpuffer, Modellregister und Gleitkommaregister nicht zurückgesetzt, sondern behalten ihre Werte bei. INIT liefert also neben einem Reset und einem Löschen des PE-Bit im Steuerregister CR0 eine weitere Möglichkeit, den Pentium in den Real Mode zurückzuschalten. Treiberprogramme, die für den 80286 entworfen wurden und eine Rückkehr in den Real Mode nur über einen Reset ausführen, könnten also auf dem Pentium mit wesentlich höherer Geschwindigkeit arbeiten (aber wer würde so etwas tatsächlich machen?). Eine entsprechende externe Logik bedient bei einer Reset-Anweisung über den Tastaturcontroller (das gängige Verfahren in einem AT) den INIT-Eingang statt eines ResetEingangs. Dadurch wird der aufwändige und langwierige Reset umgangen und der Pentium läuft 80286-kompatibel bereits nach zwei Taktzyklen wieder im Real Mode. INTR/LINT0 (I) Anschluss AD34 Ein hoher Pegel an diesem Interrupt-Anschluss zeigt an, dass eine Interrupt-Anforderung durch eine Hardware-Einheit vorliegt. Ist das Interrupt Flag IE im EFlag-Register gesetzt, dann arbeitet der Pentium den gerade aktiven Befehl noch ab und führt anschließend sofort einen INTAZyklus aus, um die betreffende Interrupt-Nummer vom Interrupt-Controller zu lesen. Je nach Betriebsmodus ruft der Pentium den zugehörigen Handler über die Interrupt-Vektortabelle oder Interrupt-Deskriptortabelle auf. Die INTR-Abtastung kann durch Löschen des IE-Flags unterdrückt und dadurch eine Hardware-Interrupt-Anforderung maskiert werden. Ist der On-ChipAPIC aktiviert, wird der Anschluss zum lokalen Interrupt 0 und kann für verschiedene InterruptModi programmiert werden. INV (I) Anschluss U5 In einem Abfragezyklus führt ein hoher Pegel des Invalidation-Request-Signals an diesem Anschluss zu einer Invalidierung der betreffenden Cache-Line, wenn ein Treffer auftritt (sie wird also als Invalid gekennzeichnet). Ein niedriger Pegel markiert die Cache-Line dagegen bei einem Treffer als Shared. Ohne Treffer hat der Pegel von INV keine Auswirkung. Die Abfrageadresse wird an A31–A5 mit einem aktiven EADS übergeben.
Sandini Bib Der Pentium
311
KEN (I) Anschluss W5 Über KEN (Cache Enable) ermittelt der Pentium, ob der gegenwärtige Zyklus cachebar ist, d.h. ob der adressierte Adressbereich in einen On-Chip-Cache übertragen werden kann. Ist das der Fall und hat der Pentium einen cachebaren Zyklus ausgelöst (ist also auch CACHE aktiv), so erweitert der Pentium den gegenwärtigen Lesezugriff automatisch auf einen Cache-Line-FillZyklus. Der Pentium liest eine ganze Cache-Line zu 32 Byte in einen seiner zwei On-ChipCaches ein. Die KEN-Information stammt vom Speichersubsystem, sodass über KEN bestimmte Adressbereiche mittels Hardware vor einem Caching geschützt werden können. LOCK (O; Dual: I/O) Anschluss AH4 Bei einem aktiven LOCK, also einem niedrigen Signalpegel an diesem Anschluss, gibt der Pentium den lokalen Bus nicht an einen anderen Busmaster ab, der über ein HOLD die Kontrolle anfordert. Er führt also einen Locked-Buszyklus (oder gesperrten Buszyklus) aus und reagiert auf die HOLD-Anforderung nicht mit einem Acknowledge (HLDA). NA (I) Anschluss Y5 Das Next-Address-Signal dient zur Implementierung und Steuerung des Adress-Pipelining. Das Adressdecodiersystem des Motherboards zeigt durch ein NA-Signal mit niedrigem Pegel an, dass es bereits neue Werte für BE0–BE7, A3–A31, W/R, D/C und M/IO zum Dekodieren übernehmen kann, bevor der gegenwärtige Zyklus abgeschlossen ist. Der nächste Buszyklus beginnt bereits, bevor der gegenwärtige Buszyklus durch ein BRDY abgeschlossen ist. Der Pentium führt ein Adress-Pipelining aus, indem er den betreffenden Buszyklus zwei CLK-Zyklen nach der Aktivierung von NA beginnt. NA wird im Prozessor verriegelt und erst beim nächsten Buszyklus aktiv, der Pentium »merkt« sich sozusagen die Pipeline-Anforderung. Maximal kann der Pentium zwei anhängige Buszyklen verarbeiten. NMI/LINT (I) Anschluss AC33 Wird diesem Anschluss ein Signal mit hohem Pegel zugeführt, so löst der Pentium einen Interrupt 2 aus, der im Gegensatz zu INTR durch das Interrupt Flag IE nicht maskiert werden kann. Es handelt sich also um den bekannten nicht-maskierbaren Interrupt. Nach Abschluss des gegenwärtig aktiven Befehls unterbricht der Pentium unter allen Umständen die Programmausführung und bedient diesen Interrupt. Beachten Sie, dass im Gegensatz zu INTR keine INTASequenz ausgeführt wird, weil der Vektor durch die Hardware auf den Wert »2« festgelegt ist. Ist der On-Chip-APIC aktiviert, wird der Anschluss zum lokalen Interrupt 1 und kann für verschiedene Interrupt-Modi programmiert werden. PBREQ, PBGNT (I/O) Anschlüsse AE3, AD4 Die zwei Private-Bus-Request- und Private-Bus-Grant-Anschlüsse dienen zur Arbitrierung des privaten Busses zwischen den beiden Prozessoren in einer Dual-Processing-Konfiguration. Die Anschlüsse bleiben frei, wenn nur ein einziger Pentium im System vorhanden ist. PCD, PWT (O, O) Anschlüsse AG35, AL3 Das Page-Cache-Disable-Signal an diesem Anschluss zeigt den Wert des PCD-Bits im Steuerregister CR3, im Page Table-Eintrag oder im Page Directory-Eintrag für die aktuelle Page an. Der
Sandini Bib 312
Kapitel 10
Pentium liefert an diesem Anschluss also externe Caching-Information auf einer Page-Basis. Das Page-Write-Through-Signal an diesem Anschluss zeigt den Wert des Page-Write-Through-Bits PWT im Steuerregister CR3, im Page Table-Eintrag oder im Page Directory-Eintrag für die aktuelle Page an. Der Pentium liefert an diesem Anschluss also eine externe Write-Back- oder WriteThrough-Information auf einer Page-Basis. PCHK (O) Anschluss AF4 Nach dem Lesen von Daten zeigt der Pentium über den Parity-Check-Anschluss an, ob die übergebenen Datenbits D63–D0 und die Paritätsbits DP7–DP0 konsistent sind. Dabei werden nur die Datenbytes überprüft, die durch ein BEx explizit als aktiv gekennzeichnet sind. Liegt PCHK auf einem niedrigen Pegel, so ist ein Paritätsfehler aufgetreten. PCHK wird zwei CLK-Zyklen nach der Aktivierung von BRDY durch das adressierte Subsystem ausgegeben und bleibt einen CLKZyklus aktiv. Das System muss PCHK und auch die restlichen Paritätsprüfungssignale nicht unbedingt bedienen oder verwenden. PEN (I) Anschluss Z34 Zusammen mit dem MCE-Bit im Steuerregister CR4 legt das Signal an diesem Parity-EnableAnschluss fest, ob der Pentium bei einem Datenparitätsfehler (für D63–D0, DP7–DP0) in einem Lesezyklus eine Machine Check Exception entsprechend Interrupt 18 (12h) auslösen soll. Bei aktivem PEN legt der Pentium die Adressbits und die Werte der Bussteuersignale in den Maschinen-Check-Registern ab. Ist auch das MCE-Bit gesetzt, dann löst der Pentium eine Machine Check Exception aus. PHIT, PHITM (I/O) Anschlüsse AA3, AC3 Die beiden Private-Hit- und Private-Hit-Modified-Signale dienen ähnlich wie die Signale HIT und HITM dazu, die Cache-Kohärenz zwischen dem primären und sekundären Pentium in einer Dual-Processing-Konfiguration aufrecht zu erhalten. Die Anschlüsse bleiben frei, wenn nur ein einziger Pentium im System vorhanden ist. PICCLK (I) Anschluss H34 Diesem Anschluss (Programmable Interrupt Controller Clock) wird das Taktsignal für den OnChip-APIC zugeführt. PICD0/DPEN (I/O) Anschluss J33 Bei einem Reset gibt der sekundäre Prozessor (im Falle einer Dual-Processing-Konfiguration) an diesem Anschluss ein Dual-Processing-Enable-Signal mit niedrigem Pegel an den entsprechenden DPEN-Anschluss des primären Pentiums aus, um den primären Prozessor zu veranlassen, einen 2-Prozessor-Betrieb aufzunehmen. Üblicherweise befindet sich auf einem Motherboard für einen Dual-Processing-Betrieb ein Sockel für einen sekundären Prozessor, der aber nicht notwendigerweise einen Prozessor aufweisen muss. In diesem Fall ist DPEN auf einem hohen Pegel und der einzige Pentium des Systems nimmt nach einem Reset den einfachen Betrieb auf. Wird nun das System aufgerüstet und ein zweiter Pentium eingesetzt, wird DPEN bei einem Reset automatisch auf einen niedrigen Pegel gezogen und das System initialisiert sich mit einer Dual-Processing-Konfiguration. Ist der On-Chip-APIC des Pentiums aktiviert, so bildet PICD0 nach einem Reset das niederwertige Bit des APIC-Datenbusses.
Sandini Bib Der Pentium
313
PICD1/APICEN (I/O; RESET: I) Anschluss L35 Liegt dieser Anschluss während eines Resets auf hohem Pegel, so aktiviert der Pentium den OnChip-APIC. In diesem Fall bildet PICD1 anschließend das höherwertige Bit des APIC-Datenbusses. PRDY (O) Anschluss AC5 Ein Signal mit hohem Pegel an diesem Probe-Ready-Anschluss zeigt an, dass der Pentium im Probe-Modus arbeitet. Das ist die Folge eines R/S-Signals mit niedrigem Pegel. PRDY wird zur Implementierung des neuen Intel-Debug-Ports verwendet, durch den ein Debugger von einer externen Hardware unterstützt werden kann. RESET (I) Anschluss AK20 Liegt dieser Anschluss für mindestens 15 CLK-Taktzyklen auf einem hohen Pegel, dann bricht der Prozessor seine Tätigkeit vollständig ab und führt einen internen Reset aus. Dazu werden alle Caches invalidiert (beachten Sie, dass veränderte Cache-Lines nicht zurückgeschrieben werden). Der Pentium tastet anschließend die Signale an FLUSH, FRCMC und INIT ab, um den Betriebszustand nach einem solchen Reset zu bestimmen. R/S (I) Anschluss AC35 Ein Signal mit niedrigem Pegel an diesem Run/Stop-Anschluss unterbricht die laufende Programmausführung und der Pentium tritt in den Probe Mode ein. Bei einem erneuten Übergang zum hohen Pegel nimmt der Pentium die Befehlsausführung wieder auf. SCYC (O; Dual: I/O) Anschluss AL17 Bei einem 16- oder 32-Bit-Zugriff über eine Doppelwortgrenze oder einem 64-Bit-Zugriff über eine Quadwortgrenze hinweg (einem so genannten Misaligned-Zugriff) muss der Pentium zwei Speicherzugriffe ausführen, um Wort, Doppelwort bzw. Quadwort einzulesen oder zu schreiben. Bei zwei aufeinanderfolgenden Locked-Zyklen (LOCK auf niedrigem Pegel), z.B. einem LockedRead-Modify-Write-Zyklus, sind dann vier Zugriffe notwendig. Der Pentium gibt ein aktives Split-Cycle-Signal am SCYC-Anschluss aus, um anzuzeigen, dass mehr als zwei Locked-Buszyklen aufeinanderfolgen. Im angegebenen Beispiel sind vier Locked-Zyklen notwendig, zwei zum Lesen und zwei zum Schreiben. Solche Locked-Read-Modify-Write-Zyklen werden ausgeführt, um die Datenintegrität in einem Multi-Busmaster-System sicherzustellen, d.h. der Pentium liest, modifiziert und schreibt eine Dateneinheit (z.B. eine Variable), ohne einem anderen Busmaster einen Zugriff auf die Daten über ein HOLD und eine nachfolgende Busarbitrierung zu gestatten. SMI (I) Anschluss AB34 Ein aktives Signal mit niedrigem Pegel an diesem Eingang für mindestens zwei CLK-Zyklen aktiviert das SMIACT-Signal, sobald der Pentium eine Befehlsgrenze erreicht hat. Dazu wartet er zunächst den Abschluss aller Schreibzyklen und die Aktivierung von EWBE ab. Anschließend speichert der Pentium die Registerwerte im SMRAM (System Management RAM) und verzweigt zum SMM (System Management Mode) Handler, um die notwendigen Funktionen auszuführen. Ein Befehl RSM (Resume from System Management Mode) lädt die Registerwerte aus dem SMRAM zurück in den Pentium und veranlasst den Prozessor, das unterbrochene Programm wieder fortzusetzen.
Sandini Bib 314
Kapitel 10
SMIACT (O) Anschluss AG3 Ein aktives Signal mit niedrigem Pegel an diesem System-Management-Interrupt-AktivAnschluss zeigt dem System an, dass der Pentium im System Management Mode arbeitet und nur auf den SMRAM zugreift. STPCLK (I) Anschluss V34 Wird diesem Stop-Clock-Anschluss ein aktives Signal mit niedrigem Pegel zugeführt, schaltet der Pentium seinen internen Prozessortakt bei der nächsten Befehlsgrenze ab. Dadurch sinkt der Stromverbrauch erheblich. Interprozessor- und externe Abfragezyklen werden aber weiter bedient. TCK (I) Anschluss M34 Diesem Test-Clock-Anschluss wird das Testtaktsignal für den JTAG-Boundary-Scan-Test zugeführt. TDI (I) Anschluss N35 Dem Test-Data-Input-Anschluss TDI werden TAP- (Test-Access-Port-) Befehle und Daten synchron zu TCK in serieller Weise zugeführt. TDO (O) Anschluss N33 Vom Test-Data-Output-Anschluss TDO werden Befehle und Ergebnisdaten des Boundary-ScanTests synchron zu TCK in serieller Weise ausgegeben. TMS (I) Anschluss P34 Wird diesem Test-Mode-Select-Anschluss ein Signal mit hohem Pegel zugeführt, löst der TestAccess-Port einen Betrieb der JTAG-Testlogik für den Boundary-Scan-Test aus. Liegt TMS für mindestens fünf TCK-Zyklen auf einem hohen Pegel, dann initialisiert sich die Testlogik unabhängig vom gerade aktiven Zustand neu. TRST (I) Anschluss Q33 Ein aktives Signal mit niedrigem Pegel an diesem Test-Reset-Anschluss initialisiert die BoundaryScan-Testlogik. WB/WT (I) Anschluss AA5 Ein Signal mit hohem Pegel an diesem Write-Back/Write-Through-Anschluss während eines Speicherzugriffs definiert die entsprechende Cache-Line als Write-Back, sonst als Write-Through, sie wird also als Exclusive bzw. Shared gekennzeichnet. Dadurch können die Cache-Lines individuell als Write-Back oder Write-Through konfiguriert werden. WB/WT ist zusammen mit PWT für die Implementierung des MESI-Protokolls notwendig.
Sandini Bib Der Pentium
315
frei Anschlüsse A37, R34, S33, S35, W33, W35, AL19, AN35 Die Anschlüsse sollten stets in einem freien (schwebenden) Zustand gehalten werden. INC Anschlüsse A3, B2, C1, U5, AL1, AN1, AN3, AN5 Diese Anschlüsse sind mit keinem Signal verbunden (Internal No Connects). Vcc (I) Anschlüsse A7, A9, A11, A13, A15, A17, A19, A21, A23, A25, A27, A29, E37, G1, G37, J1, J37, L1, L33, L37, N1, N37, Q1, Q37, S1, S37, T34, U1, U33, U37, W1, W37, Y1, Y37, AA1, AA37, AC1, AC37, AE1, AE37, AG1, AG37, AN9, AN11, AN13, AN15, AN17, AN19, AN21, AN23, AN25, AN27, AN29 Diesen Anschlüssen wird die Versorgungsspannung (+3,3 V) zugeführt, um den Pentium mit Strom zu versorgen. GND (I) Anschlüsse B6, B8, B10, B12, B14, B16, B18, B20, B22, 24, B26, B28, H2, H36, K2, K36, M2, M36, P2, P36, R2, R36, T2, T36, U35, V2, V36, X2, X36, Z2, Z36, AB2, AB36, AD2, AD36, AF2, AF36, AH2, AJ37, AL37, AM8, AM10, AM12, AM14, AM16, AM18, AM20, AM22, AM24, AM26, AM28, AM30, AN37 Diese Anschlüsse liegen auf Masse (üblicherweise 0 V).
10.2 Interner Aufbau des Pentiums Obwohl der Pentium einen externen 64-Bit-Datenbus aufweist, ist er wie der i386 und i486 ein 32-Bit-Prozessor. Der Datenbus bedient nur die On-Chip-Caches direkt und mittelbar über sie die 32-Bit-Prozessorregister. Die internen Datenpfade des Pentiums sind zwischen 128 und 256 Bits breit, sodass die Übertragung von Daten und Codes sehr schnell abläuft. In Abbildung 10.3 sehen Sie ein Blockdiagramm des Pentiums. Die Busschnittstelle liefert über den externen 64-Bit-Daten- und 32-Bit-Adressbus die Verbindung mit der Umgebung. Unmittelbar mit der Busschnittstelle sind die beiden On-Chip-Caches verbunden. Beachten Sie, dass hier zwei getrennte und voneinander unabhängig arbeitende Caches für Code und Daten mit einer Speicherkapazität von je 8 KByte vorhanden sind. Wegen des auf 64 Bits erweiterten Datenbus beträgt die Cache-Line-Größe 32 Byte. Jedem Cache ist ein eigener Translation Lookaside Buffer TLB zugeordnet. Zur Unterstützung großer Systeme mit einem linearen Speichermodell sind neben den standardmäßigen 4-KByte- auch 4-MByte-Pages vorgesehen. Die Caches verwenden physikalische Adressen, der Daten-Cache arbeitet wahlweise mit Write-Through- oder Write-Back-Strategie (Code kann im Protected Mode, dem einzig vernünftigen Betriebsmodus des Pentiums, nicht überschrieben werden, daher ist keine Rückschreibstrategie für den Code-Cache vorgesehen). Details zu den Caches werden in Kapitel 10.2.6 diskutiert.
Sandini Bib 316
Kapitel 10
64-BitDatenbus
32-BitAdressbus
Pentium Busschnittstelle
TLB
Daten-Cache 8kByte
Code-Cache 8kByte
TLB
BTB
Prefetch-Puffer Befehlsdekodierung
MikrocodeROM
Steuereinheit v-Pipeline u-Pipeline GleitkommaPipeline
APIC
Register
Abb. 10.3: Blockdiagramm des Pentiums
Die Pentium-Steuereinheit kontrolliert die beiden fünfstufigen Integer-Pipelines u und v sowie eine achtstufige Gleitkomma-Pipeline. Unter Integer werden in diesem Zusammenhang alle Befehle zusammengefasst, die keine Gleitkommaoperationen beinhalten. Dazu gehören insbesondere auch die Sprungbefehle. Als superskalarer Prozessor soll der Pentium gleichzeitig einen Befehl in der u-Pipeline und einen anderen, als einfach bezeichneten Befehl in der v-Pipeline ausführen. Im Idealfall werden also zwei Integer-Befehle in einem einzigen Takt abgearbeitet. Unter bestimmten Umständen kann auch die Gleitkomma-Pipeline noch parallel zu den IntegerPipes arbeiten. Dadurch steigt die FP-Rechenleistung des Pentiums im Vergleich mit einem gleich schnell getakteten i486DX bis zum Zehnfachen an. Das erzielt der Pentium durch die Integration eines Hardware-Multiplizierers und -Dividierers sowie durch schnellere Algorithmen für die mikrocodierten Gleitkommabefehle. Die beiden Pipelines werden von zwei unabhängigen 32-Byte-Prefetch-Puffern mit Code versorgt. Erst dadurch ist die überlappende Befehlsausführung in den beiden Pipelines überhaupt möglich. Details zu den Pipelines erfahren Sie in Kapitel 10.2.1 bis 10.2.4. Verzweigungen, die ja zu ganz erheblichen Verzögerungen führen können, werden von einer neuartigen Branch-Prediction-Logik behandelt. Sie besteht aus einer Steuereinheit und dem Branch-Trace-Puffer BTB. Die Branch-Prediction-Logik kann Verzweigungen recht zuverlässig vorhersagen und dadurch die Programmausführung deutlich beschleunigen. Als x86- und x87-kompatibler Mikroprozessor muss der Pentium natürlich alle Befehle der mikrocodierten i386- und i387-Prozessoren unterstützen. Das ist vor allem für die sehr komplexen Befehle und Funktionen des Protected Modes, von Task Switches und für die transzendenten
Sandini Bib Der Pentium
317
Funktionen der Gleitkommaeinheit durch ein festverdrahtetes Leitwerk nicht möglich. Der Pentium arbeitet daher nicht mit rein festverdrahteten Befehlen, sondern hält für diese komplexen Funktionen Mikrocode in einer Support-Einheit bereit. Der Mikrocode ist so aufgebaut, dass er die beiden Pipelines des Pentium gleichzeitig nutzt. Auch mikrocodierte Befehle laufen auf dem Pentium also viel schneller ab als auf dem i486. Einfachere Funktionen, wie z.B. alle ALU-Funktionen, werden dagegen entsprechend dem RISC-Prinzip durch eine festverdrahtete Logik ausgeführt. Der On-Chip-APIC (Advanced Programmable Interrupt Controller) kann gezielt aktiviert oder dekativiert werden. Er ist für den Dual-Processing-Betrieb unbedingt erforderlich.
10.2.1
Die Integer-Pipelines u und v
Wie Sie aus der Einführung erkennen, verwendet der Pentium RISC-Konzepte zur Steigerung der Rechenleistung. Eines davon ist das Befehls-Pipelining. Im Unterschied zum i486 mit nur einer einzigen Befehls-Pipeline kann der Pentium mit zwei Integer-Pipelines aufwarten, die als u-Pipeline und v-Pipeline bezeichnet werden. Zusätzlich steht noch eine Gleitkommaeinheit zur Verfügung, die aber gesondert betrachtet wird. Unter bestimmten Umständen arbeiten sie parallel und führen so genannte gepaarte Befehle aus. Pipeline-Aufbau Die beiden Pentium-Pipelines umfassen jeweils fünf Stufen, nämlich Befehl holen (IF), Dekodieren 1 (D1), Dekodieren 2 (D2), Ausführen (EX) mit ALU- und Cache-Zugriffen sowie ErgebnisSchreiben (WB). Die Pipeline u kann alle Befehle der x86-Architektur ausführen. Dazu gehören auch die in mikrokodierter Form vorliegenden komplexen Befehle. Dagegen bearbeitet die v-Pipeline nur so genannte einfache Integer-Befehle und den FPU-Befehl FXCH. Die Zusammenfassung von zwei Befehlen zu Befehlspaaren und ihre simultane Ausführung in den beiden Pipelines unterliegt bestimmten Regeln, die im Abschnitt 10.2.2 eingehend erläutert werden. Abbildung 10.4 zeigt den grundlegenden Aufbau der beiden fünfstufigen Integer-Pipelines. Im Idealfall verlassen gleichzeitig zwei Ergebnisse die Pipelines. Die erste Befehlsholstufe IF holt jeweils zwei Befehle aus dem On-Chip-Code-Cache (falls ein Cache-Treffer vorliegt) oder dem externen Speicher (wenn ein Cache-Fehltreffer aufgetreten ist). Die Prefetch-Puffer und der Branch-Target-Puffer BTB wirken zusammen, um die dynamische Branch Prediction zu implementieren, Details dazu erfahren Sie in Kapitel 10.2.5. Der gerade aktive Prefetch-Puffer liest die Befehle wie üblich sequenziell ein und übergibt sie zur Dekodierung, bis er einen Verzweigungs- (JMP, Jcc) oder Aufrufbefehl (CALL) erfasst. In diesem Fall wird die Branch-Prediction-Logik aktiv und sagt mit Hilfe der im Branch-Target-Puffer gespeicherten Einträge voraus, ob die Verzweigung auch tatsächlich ausgeführt oder der Befehlsfluss sequenziell fortgesetzt wird. Im ersten Fall spricht man von einem Taken Branch, in letzterem von einem Not Taken Branch. Bei einem Taken Branch wird der aktive Prefetch-Puffer deaktiviert und der andere Prefetch-Puffer beginnt mit dem Befehls-Fetching an der Adresse, die der BTB voraussagt. Der Pentium setzt das Befehls-Fetching also so fort, als ob die Verzweigung auch tatsächlich ausgeführt würde. Beachten Sie, dass zu diesem Zeitpunkt noch gar nicht bekannt ist, ob ein bedingter Sprung auch wirklich ausgeführt wird. Die zur Entscheidung notwendigen Vergleichsbefehle etc. befinden sich ja noch in einem mehr oder weniger fortgeschrittenen Stadium in den Pipelines. Wie wir von der Astrologie und Wahrsagerei wissen, haben Vorhersagen nun mal die Eigenschaft, dass sie auch falsch sein können (obwohl m.E. die Branch Prediction einschlägige Astrologen um Län-
Sandini Bib 318
Kapitel 10
Registerschreibstufe WB
Ausführungsstufe EX
Dekodierstufe D2
Dekodierstufe D1
Prefetch- oder Befehlsholstufe IF
gen schlägt). Stellt sich die Vorhersage später als fehlerhaft heraus, dann wird die Pentium-Pipeline geleert, die fälschlicherweise ausgeführten Befehle am Sprungziel also storniert und der andere Prefetch-Puffer setzt das Prefetching mit der korrekten Zieladresse fort.
Befehl k-2 Befehl k-4 Befehl k-6 Befehl k-8
Ergebnis k-8
Befehl k-1 Befehl k-3 Befehl k-5 Befehl k-7
Ergebnis k-7
Befehl k Befehl k-2 Befehl k-4 Befehl k-6
Ergebnis k-6
Befehl k+1 Befehl k-1 Befehl k-3 Befehl k-5
Ergebnis k-5
Befehl k+2 Befehl k
Befehl k-2 Befehl k-4
Ergebnis k-4
Befehl k+3 Befehl k+1 Befehl k-1 Befehl k-3
Ergebnis k-3
Befehl k+4 Befehl k+2 Befehl k Befehl k-2
Ergebnis k-2
v-Pipeline Befehl k+7 Befehl k+5 Befehl k+3 Befehl k+1 Befehl k-1
Ergebnis k-1
u-Pipeline
Befehl k+6 Befehl k+4 Befehl k+2 Befehl k
Ergebnis k
Befehl k+7 Befehl k+5 Befehl k+3 Befehl k+1
Ergebnis k+1
u-Pipeline
Befehl k
Zyklus n v-Pipeline
u-Pipeline
Befehl k+1
Befehl k+2
Zyklus n+1 v-Pipeline
u-Pipeline
Befehl k+3
Befehl k+4
Zyklus n+2 v-Pipeline
u-Pipeline
Befehl k+5
Befehl k+6
Zyklus n+3
Befehl k+8
Zyklus n+4 v-Pipeline
Befehl k+9
Abb. 10.4: Die Abbildung zeigt den fünfstufigen Aufbau der beiden Integer-Pipelines. Es wird angenommen, dass die Befehlspaarung für jede Befehlszweiergruppe und somit für jeden Taktzyklus möglich ist. In jedem Takt verlassen also zwei Ergebnisse die Pipelines.
Die zweite Stufe der Pentium-Pipelines, die erste Befehlsdekodierungsstufe D1, weist zwei parallel arbeitende Decoder auf, die die beiden von der Befehlsholstufe an die Pipelines übergebenen Befehle in einem ersten Anlauf dekodieren. Die D1-Stufe ermittelt auch, ob die beiden Befehle k und k+1 gepaart und damit parallel in der u- und v-Pipeline ausgeführt werden können. Die Befehlsdekodierungsstufe D1 dekodiert auch Befehlspräfixe und gibt sie an die u-Pipeline weiter. Die Paarungsregeln verbieten, dass Präfixe außer dem 2-Byte-Opcode-Präfix 0fh für die Jcc-Befehle an die v-Pipeline übergeben werden können. Jedes Präfix »verbraucht« sozusagen einen Prozessortakt und verzögert die eigentliche Befehlsausführung in der u-Pipeline um einen Takt. Der eigentliche Befehl kann aber mit einem anderen Befehl gepaart werden.
Sandini Bib Der Pentium
319
Die zweite Befehlsdekodierungsstufe D2 bildet die dritte Stufe der Pentium-Pipeline. Sie bestimmt Operandenadressen. Auch Befehle mit einem unmittelbaren Operanden und einem Displacement (z.B. ADD [array], 08h) sowie Befehle mit Basis- und gleichzeitiger Indexadressierung (z.B. MOV dword ptr [ebp][edi], wert) können in der D2-Stufe in einem einzigen Taktzyklus verarbeitet werden. Der i486 benötigte dazu zwei Taktzyklen. Die Ausführungsstufe EX als vierte Pipeline-Stufe führt ALU- und Cache-Zugriffe aus, um ALUOperationen zu erledigen und Speicheroperanden aus dem Cache zu laden. Befehle mit einem ALU- und einem gleichzeitigen Cache-Zugriff wie z.B. ADD eax, mem32 (ALU-Zugriff: ADD, Cache-Zugriff: mem32) bleiben länger als einen Taktzyklus in dieser Stufe. Die Ausführungsstufe überprüft auch die Verzweigungsvorhersage, die in Stufe D1 getroffen wurde. Beachten Sie, dass bedingte Sprünge in der v-Pipeline aber erst in der nächsten WB-Stufe verifiziert werden. Die letzte Stufe, die Registerschreib- oder Write-Back-Stufe WB, legt die Befehlsergebnisse in den Zielregistern ab. Dadurch wird die Befehlsausführung abgeschlossen. Außerdem überprüft die WB-Stufe, wie bereits erwähnt, noch bedingte Sprünge der v-Pipeline auf ihre korrekte Verzweigungsvorhersage. Befehls-Pipelining und Interrupts Exceptions und Software-Interrupts werden vom Pentium erkannt, wenn die entsprechenden Befehle in der Ausführungsstufe der Pipeline ausgeführt werden. Alle Befehle, die sich bereits in einer der folgenden Pipeline-Stufen befinden, werden abgeschlossen, die Befehle in der Prefetch- und Decodierstufe dagegen storniert. Das Interrupt-Verhalten des Pentiums ähnelt also dem beim i486. Externe Hardware-Interrupt-Anforderungen sind dagegen asynchron und werden durch ein Signal mit einem entsprechenden Pegel an einem Interrupt-Eingang getriggert. Der Pentium muss die Interrupt-Eingänge also laufend prüfen. Das geschieht immer dann, wenn er einen neuen Befehl in die Ausführungsstufe EX lädt. Wie bei einem Software-Interrupt oder einer Exception schließt der Pentium alle Befehle ab, die sich bereits in einer der folgenden Pipeline-Stufen befinden, die Befehle in der Prefetch- und Dekodierstufe werden dagegen storniert. Auf Grund der Superskalararchitektur ist es möglich, dass sich zwei Befehle in den Pipelines u und v befinden, wenn ein Interrupt auftritt. Der Interrupt wird erst bedient, wenn die Befehle in beiden Pipelines abgeschlossen sind. Ist die Abtastung des INTR-Eingangs durch ein gelöschtes Interrupt Flag IE gesperrt, erkennt der Pentium nur noch nicht-maskierbare Interrupts. Neben den schon vom i386 und i486 bekannten NMI ist auch die Erkennung der Signale R/S, FLUSH, SMI und INIT als HardwareInterrupt implementiert worden. Eine Aktivierung dieser Signale führt also möglicherweise nicht sofort zu einer Unterbrechung der Programmausführung. Der Unterschied zwischen dem i386 ohne Pipeline und dem Superskalar-Pentium besteht also darin, dass der Pentium einen Interrupt sofort erkennt, obwohl die vorherigen Befehle noch gar nicht abgeschlossen sind (das führt aber nicht unbedingt sofort zu einer Reaktion). Der i386 beendet dagegen jeden Befehl vollständig, bevor er prüft, ob eine Interrupt-Anforderung vorliegt. Treten mehrere externe Hardware-IRQs gleichzeitig auf, dann verarbeitet der Pentium sie nach dem folgenden Prioritätsschema: Interrupt
Priorität
R/S FLUSH SMI INIT NMI INTR
höchste Priorität | | | | niedrigste Priorität
Sandini Bib 320
Kapitel 10
Die Exceptions sind als Traps oder Faults implementiert, sodass die gesicherte Befehlsadresse entweder auf den Befehl unmittelbar nach dem Fehler (Trap) oder auf den Fehlerbefehl selbst (Fault) weist. Der Abort 08h (zweifacher Fehler) versetzt den Pentium wie seine ProtectedMode-Vorgänger 80286 bis i486 in den Shutdown-Zustand, den er nur über einen NMI oder Reset verlassen kann.
10.2.2
Befehlspaarung in den Integer-Pipelines
Der Pentium verwendet für die gleichzeitige Ausführung von zwei Integer-Befehlen den Mechanismus der Befehlspaarung. Der Befehl eines Befehlspaares, der in die v-Pipeline geladen wird, folgt im Befehlsstrom unmittelbar auf den Befehl, der in die u-Pipeline geladen wird. Der Pentium verarbeitet also tatsächlich Paare und nicht nur zwei Befehle. Ein ganz wichtiger Punkt ist, dass der Pentium diese Befehlspaarung automatisch und selbstständig ausführt. Bei vielen anderen Superskalarprozessoren (wie z.B. dem i960 und i860) muss der Compiler eine Parallelverarbeitung in den Pipelines explizit anweisen. Beim Pentium sind dagegen weder Steueranweisungen durch die Software noch eigens vorhandene Dual-Befehle wie beim i860 notwendig, um die Superskalararchitektur zu nutzen. Das ist auch notwendig, weil bei den x86-Vorgängern nur eine mikrokodierte Steuereinheit (8086 bis i386) oder nur eine Pipeline (i486) vorhanden war, sodass Befehle nicht parallel ausgeführt werden konnten. Weder die Maschinencodestruktur noch die Programmcodes selbst sind aus diesem Grund für eine Parallelausführung vorgesehen gewesen. Die Befehlspaarung und dadurch die parallele Ausführung von zwei Befehlen muss beim Pentium also vollkommen Software-transparent sein. Das heißt natürlich keineswegs, dass eine entsprechend angepasste Kodierung und Reihenfolge der Befehle nicht einen deutlichen Leistungsgewinn bewirken würde. Schon geringe Code-Umordnungen zur Vermeidung von Registerabhängigkeiten können einen erheblichen Leistungssprung bringen. Zunächst aber zu den grundlegenden Regeln, nach denen der Pentium sequenzielle Befehle zu Paaren zusammenfasst. Paarungsregeln Die Befehlspaarung unterliegt sechs Regeln. Bekanntlich bestätigen Ausnahmen die Regel und es soll nicht verwundern, dass die Regeln nicht immer streng eingehalten werden. Regel 1 Gepaart werden können nur so genannte einfache Befehle. Die einfachen Befehle des Pentiums sind vollständig festverdrahtet, es ist keinerlei Eingriff von Mikrocodes aus dem MikrocodeROM notwendig. Sie werden also normalerweise in einem einzigen Taktzyklus ausgeführt. Zu ihnen zählen die folgenden Befehle (ALU bezeichnet irgendeinen arithmetischen oder logischen Befehl, wie z.B. ADD, AND oder MOV): MOV MOV ALU ALU INC NOP
reg, reg/mem/imm mem, reg/imm reg, reg/mem/imm mem, reg/imm reg/mem
DEC reg/mem PUSH reg/mem POP reg/mem LEA reg, mem JMP/Jcc NEAR/CALL
Regel 2 Unbedingte Sprünge (JMP), bedingte Near-Sprünge (Jcc) und Prozeduraufrufe (CALL) dürfen nur mit einem anderen einfachen Befehl gepaart werden, wenn sie als zweiter Befehl innerhalb des Paares auftreten, also in die v-Pipeline geladen werden.
Sandini Bib Der Pentium
321
Regel 3 Verschiebungen um eine Stelle (SAL/SAR/SHL/SHR reg/mem,1) oder einen unmittelbaren Operanden (SAL/SAR/SHL/SHR reg/mem,imm) und Rotierungen um eine Stelle (RCL/RCR/ ROL/ROR reg/mem,1) können als erster Befehl eines Befehlspaares auftreten, dürfen also nur in die u-Pipeline geladen werden. Regel 4 Zwischen den Befehlen eines Befehlspaares dürfen keine Registerabhängigkeiten auftreten. Sie verursachen eine Pipeline-Hemmung und halten die Pipeline entsprechend an. Dadurch wird der Vorteil der Befehlspaarung wieder aufgehoben.
u-Pipeline
Befehl k
WB
EX
D2
D1
IF
Beachten Sie, dass solche Registerabhängigkeiten, die eine Befehlspaarung unmöglich machen, nicht nur auf eine explizite Registerabhängigkeit beschränkt ist. Vielmehr können auch indirekte oder implizite Abhängigkeiten auftreten, wenn Register oder Flags betroffen sind, die im Befehl nicht explizit angegeben sind.
Befehl k-1 Befehl k-2 Befehl k-4 Befehl k-5
Ergebnis k-5
Zyklus n v-Pipeline
u-Pipeline
Befehl k+1
Befehl k+2
leer
leer
Befehl k-3
leer
Befehl k Befehl k-1 Befehl k-2 Befehl k-4
Ergebnis k-4
Zyklus n+1 v-Pipeline
u-Pipeline
Befehl k+3
Befehl k+4
Befehl k+1
leer
Befehl k+2 Befehl k
Befehl k-3
Ergebnis k-3
Befehl k-1 Befehl k-2
Ergebnis k-2
leer
Zyklus n+2 v-Pipeline
u-Pipeline
Befehl k+5
Befehl k+5
Befehl k+3 Befehl k+1
leer
leer
Befehl k+4 Befehl k+2 Befehl k Befehl k-1
Ergebnis k-1
Zyklus n+3 v-Pipeline Befehl k+6
u-Pipeline
Befehl k+7
leer
Befehl k+3 Befehl k+1
leer
Befehl k+5 Befehl k+4 Befehl k+2 Befehl k
Ergebnis k
Befehl k+6
Ergebnis k+1
Zyklus n+4 v-Pipeline
Befehl k+8
leer
Befehl k+3 Befehl k+1
Abb. 10.5: Im dargestellten Beispiel ist eine Befehlspaarung nicht immer möglich. Die Befehle k-4 und k-3, k und k+1, k+2 und k+3 sowie k+5 und k+6 können gepaart werden. Die Befehle k-5, k-2, k-1 und k+4 können nur einzeln ausgeführt werden. Der Ergebnisfluss »stottert« also etwas.
Sandini Bib 322
Kapitel 10
Regel 5 Befehle mit einem Präfix (z.B. mit dem Segmentüberschreibungs-, dem LOCK- oder dem Repeat-Präfix) werden nur in der u-Pipeline verarbeitet. Die einzige Ausnahme bildet das Präfix 0fh, das einen 2-Byte-Opcode angibt. 0fh bildet das erste Byte des Opcodes, auf das der eigentliche Opcode folgt. 0fh tritt in Verbindung mit bedingten Verzweigungen (Jcc) auf und darf als einziges Präfix in die v-Pipeline geladen werden. Erst das ermöglicht es, dass bedingte Sprünge der Regel 2 gehorchen. Regel 6 Die beiden parallel ausgeführten Befehle dürfen ein Displacement und einen unmittelbaren (Immediate-) Operanden nicht gleichzeitig aufweisen. Ein Beispiel wäre ADD array[02h], 08h, wobei array[02h] das Displacement und 08h den unmittelbaren Operanden darstellt. Abbildung 10.5 zeigt das Schema für eine realistische Befehlsausführung in den beiden IntegerPipelines, wenn Befehle manchmal zu Paaren zusammengefasst werden können, manchmal aber auch die Paarungsregeln nicht erfüllen. Ausnahmen Die die Regeln 1 bis 6 »bestätigenden« Ausnahmen sind im Folgenden zusammengefasst. Abweichung von Regel 1 Die einfachen Befehle ALU reg, mem und ALU mem, reg benötigen zwei bzw. drei Taktzyklen und weichen somit von der Forderung nach einfachen Ein-Zyklus-Befehlen ab. Abweichung von Regel 4 Vergleichs- und Verzweigungsbefehle können gepaart werden. Dieser Fall tritt sehr häufig auf, weil einer bedingten Verzweigung im Allgemeinen ein Vergleich vorausgeht. Vor allem in Programmen, die nicht im Hinblick auf eine Pipelined-Verarbeitung der Befehle und eine Verzweigungsvorhersage optimiert sind, folgen diese zwei Anweisungen häufig unmittelbar aufeinander. Es ist also einerseits vorteilhaft, diese beiden Befehle zu paaren. Glücklicherweise ist das andererseits auch problemlos möglich, weil bedingte Verzweigungen der Branch Prediction unterliegen, die bereits in der Befehlsholstufe und dadurch weit vor der Erzeugung der Sprungbedingung wirkt und der Sprung zunächst unabhängig vom Ergebnis der Sprungbedingung ausgeführt (taken) oder nicht ausgeführt (not-taken) wird. Die tatsächliche Sprungausführung erfolgt ja erst durch die Verifizierung in der EX- bzw. WB-Stufe, wenn die Sprungbedingung bereits berechnet ist. Implizite Befehlspaarung durch den CISC-Mikrocode Wenn man als Befehlspaarung den parallelen Betrieb beider Pipelines ansieht, gibt es noch eine Art impliziter Befehlspaarung durch den CISC-Mikrocode. Wie ich bereits erwähnt habe, sind die komplexen Befehle (z.B. String-Befehle, Task-Switch-Algorithmen, ENTER, LOOP usw.) mikrokodiert und als Mikrobefehlsfolge in einem Mikrocode-ROM abgelegt. Die Pentium-Mikrocodes sind nun im Hinblick auf die Superskalararchitektur optimiert worden und benutzen beide Pipelines parallel, wo immer das möglich ist. Einen REP MOVSD kann man ja als wiederholte Folge elementarer Befehle ansehen, die vom Mikrocode in den beiden Pipelines parallel ausgeführt werden – eine Art implizite Befehlspaarung. Nebenbei bemerkt steht für den Mikrocode eine Optimierungsebene zur Verfügung (nämlich die einzelnen Elemente der u- und v-Pipelines selbst), die nicht einmal einem optimierenden Compiler zugänglich ist. Auch das ist ein Beitrag zu einem
Sandini Bib Der Pentium
323
wesentlich verbesserten Befehlsdurchsatz und zur Bewahrung der Kompatibilität. Das Haupthindernis für einen reinen RISC-Pentium sind ja gerade die komplexen CISC-Befehle, die in bereits bestehenden Programmen auftauchen. Bestehender Maschinencode kann nicht oder nur mit sehr hohem Aufwand auf einen völlig anderen Befehlssatz abgebildet werden. Es ist also günstiger, die CISC-Befehle beizubehalten und die Optimierung auf den neu zu schaffenden Chip zu packen. Die Optimierung kann dann völlig transparent für bestehende Software vollzogen werden, ohne dass Abstriche an der Kompatibilität notwendig sind. Das kann natürlich nicht so erfolgreich wie die von RISC geforderte Einheit von Hardware und Software von Anfang an sein, die erzielten Performance-Gewinne sind beim Pentium dennoch beeindruckend.
10.2.3
Die Gleitkomma-Pipeline
Neben den beiden oben beschriebenen Integer-Pipelines u und v implementiert der Pentium noch eine Gleitkommaeinheit, die Gleitkommabefehle ebenfalls nach Art einer Pipeline ausführt. Aufbau der Gleitkomma-Pipeline Die Gleitkomma-Pipeline umfasst acht Stufen, wobei sie sich aber die ersten fünf Stufen IF bis WB mit der u-Pipeline teilt. Die Paarungsregeln sehen kein paralleles Ausführen von Integerund Gleitkommabefehlen vor. Lediglich der FXCHG-Befehl, der die Werte zweier FP-Register in der Gleitkommaeinheit vertauscht, kann in der v-Pipeline gleichzeitig mit einem anderen Gleitkommabefehl in der FP-Pipeline abgearbeitet werden. Abbildung 10.6 zeigt schematisch das achtstufige Pipeline-Modell der Gleitkommaeinheit.
Befehl holen (IF)
WB
(FXCHG)
u-Pipeline
EX
v-Pipeline
D2
(FLD, FADD, FSUB, FMUL, FDIV, FCOM, FUCOM, FTST, FABS, FCHS)
D1 D1 (v-Pipeline) (u-Pipeline) D2
EX
Gleitkommaeinheit WB/ X1
X2
Registerstapel ST(0)-ST(7)
WF
Addierer Multiplizierer
ER
Dividierer
Abb. 10.6: Die Gleitkommaeinheit implementiert eine Pipeline mit acht Stufen, von denen aber die ersten fünf mit der u-Pipeline identisch sind.
Weil eine Paarung von Integer- und Gleitkommabefehlen nach den Paarungsregeln unmöglich ist, können die u- und die Gleitkomma-Pipeline die ersten fünf Pipeline-Stufen gemeinsam benutzen. Die Gleitkomma-Pipeline nutzt die WB-Stufe der u-Pipeline als erste Ausführungs-
Sandini Bib 324
Kapitel 10
stufe, die entsprechend WB ebenfalls Schreiboperationen ausführt. Das Ziel ist jedoch kein Integer-Register, sondern der Registerstapel FP(0) bis FP(7) der Gleitkommaeinheit. Erst die sechste Stufe ist ausschließlich Bestandteil der Gleitkommaeinheit. Ein wesentlicher Unterschied zwischen dem Pentium und dem i486 ist der, dass neben einem Addierer auch ein Multiplizierer und ein Dividierer in die Hardware implementiert sind, um Gleitkommamultiplikationen und -divisionen zu beschleunigen. Die Pentium-Gleitkommaeinheit stimmt ansonsten im Wesentlichen mit der des i486 überein, z.B. ist ein FP-Registerstapel mit acht 80-Bit-Registern gebildet, die alle Gleitkommazahlen im Temporary-Real-Format speichern. Die erste Pipeline-Stufe IF liest in bekannter Weise die Befehle ein und übergibt sie zur Dekodierung an die erste Dekodierstufe D1. Die zweite Dekodierstufe D2 erzeugt die Operandenadressen (z.B. für FLD mem_real). In der EX-Stufe werden der Daten-Cache und Registeroperanden gelesen sowie im Fall eines FSTORE-Befehls die Gleitkommadaten von der internen 80-Bit-Darstellung in die Darstellung des Speicherungsziels umgewandelt. Die letzte gemeinsam mit der u-Pipeline benutzte Stufe X1 verwendet der Pentium für Gleitkommabefehle in ähnlicher Weise wie für Integer-Befehle. Für die u-Pipeline ist X1 die Registerschreibstufe WB. Auch in der Gleitkomma-Pipeline übernimmt die erste FP-Ausführungsstufe X1 eine ähnliche Funktion; sie wandelt Operanden in das Temporary-Real-Format um und schreibt sie in ein Register des Registerstapels FP(0) bis FP(7). Die X1-Stufe hat außerdem noch die Aufgabe, so genannte sichere Befehle zu erkennen. Man bezeichnet das auch als Safe Instruction Recognition (SIR). Sichere Befehle verursachen keinen Überlauf, Unterlauf oder Exceptions durch eine Ungenauigkeit. Außerdem können sie maskierte Exceptions intern behandeln (z.B. den Wert 0 im Fall eines Unterlaufs übergeben). Wird der gegenwärtige Befehl als sicher erkannt, dann kann der nachfolgende Gleitkommabefehl – sofern ein solcher vorhanden ist – die Stufe EX verlassen und in die X1-Stufe eintreten, sobald der aktuelle Befehl zur zweiten Ausführungsstufe X2 fortgeschritten ist; es wird ein Gleitkomma-Pipelining durchgeführt. Ist der aktuelle Befehl dagegen kein sicherer Befehl, dann wird der nachfolgende Befehl in der EX-Stufe und somit die gesamte Pipeline angehalten, bis der aktuelle Befehl die letzte ER-Stufe ohne Fehler verlassen hat. Die drei folgenden Stufen sind ausschließlich in der Gleitkomma-Pipeline implementiert und von der u-Pipeline völlig unabhängig. Die zweite FP-Ausführungsstufe X2 führt den aktiven Gleitkommabefehl aus. Schließlich teilt die neunte und letzte Stufe ER eventuell aufgetretene Fehler mit und aktualisiert das Statuswort entsprechend. Befehlspaarung Auch Gleitkommabefehle können – wenn auch in sehr eingeschränkter Weise – gepaart werden, um zwei Befehle gleichzeitig auszuführen. Vollwertige Gleitkommabefehle benötigen die Stufen IF bis X1 der u-Pipeline und X2 bis ER der Gleitkomma-Pipeline. Sie sind nur einmal vorhanden, sodass lediglich der Befehl FXCHG zum Vertauschen von zwei Registerwerten auf dem Registerstapel ST(0) bis ST(7) unter bestimmten Umständen parallel zu einem anderen Gleitkommabefehl ausgeführt werden kann, weil er die freie v-Pipeline benutzt. Der Wert in TOP muss auf Grund der sparsamen 8-Register-Struktur des FP-Stapels häufig mit einem anderen Registerwert vertauscht werden, wozu der Befehl FXCHG dient. Seine einfache Struktur prädestiniert ihn geradezu als Paarungspartner. Es gelten die folgenden Regeln.
Sandini Bib Der Pentium
325
Regel 1 Ein Gleitkommabefehl kann nur mit einem FXCHG-Befehl gepaart werden; andere Paarungen von Gleitkommabefehlen untereinander oder mit einem Integer-Befehl sind unmöglich. Regel 2 Nur die folgenden Gleitkommabefehle dürfen mit dem FXCHG-Befehl gepaart werden:
: :
FLD memreal32/memreal64/ST(i) alle Arten (normal, Integer, mit/ohne POP) der Befehle FADD, FSUB, FMUL, FDIV, FCOM, FUCOM, FTST, FABS und FCHS
Regel 3 Alle Befehle, die weder einen FXCHG-Befehl darstellen, noch zur in Regel 2 definierten Befehlsgruppe gehören, werden als Einzelbefehl der u-Pipeline zugeführt. Sie können also auch nicht mit einem einfachen Befehl in der v-Pipe kombiniert werden, weil sie selbst keinen einfachen Befehl darstellen (Verletzung von Regel 1 für Integer-Befehlspaarungen). Regel 4 Der FXCHG-Befehl muss stets der zweite Befehl des Paares sein, er muss also in die v-Pipeline geladen werden. Folgt auf einen Befehl ein anderer als der FXCHG-Befehl, dann wird er als Einzelbefehl der u-Pipeline zugeführt.
10.2.4
Befehlsserialisierung
Für manche Situationen und Befehle ist es unerlässich, dass ein Befehl abgeschlossen ist, bevor der nächste zur Ausführung an die Pentium-Pipeline übergeben wird. Ein Beispiel dafür wäre ein OUT-Befehl, der ein externes Gatter für die Adressleitung A20 schaltet, um das steinzeitliche Address Wrap Around des 8086 zu emulieren und dieses Umschalten dem Pentium über das Signal A20M mitzuteilen, damit dieser auch für einen internen Zugriff auf die On-Chip-Caches die Adressleitung A20 maskiert. Verlässt sich der auf den OUT-Befehl folgende Befehl auf die Umschaltung in den Wrap-Around-Zustand oder auf die Rückschaltung von diesem Zustand, dann kann es durch die Pipelined-Befehlsausführung zu Problemen kommen. Der OUT-Befehl wird ja erst in der EX-Stufe ausgeführt und dadurch ein IO-Buszyklus zum A20-Gatter getrieben. Der nachfolgende Befehl befindet sich aber bereits in der zweiten Decodierstufe D2, ist also schon längst eingelesen und teilweise decodiert worden. Das Befehls-Fetching für den Befehl ist dadurch von der Gatterumschaltung und A20M nicht beeinflusst und somit möglicherweise der falsche Befehl geholt worden. Das beschriebene Problem kann über eine Serialisierung der Befehlsausführung gelöst werden. Der nächste Befehl wird dann erst in die erste Pipeline-Stufe geladen, wenn der gegenwärtige Befehl vollständig ausgeführt worden ist und die letzte Stufe verlassen hat. Die Serialisierung bewirkt außerdem eine Leerung der Prefetch-Queue. Sie wird ausgelöst, wenn der Pentium einen der folgenden (Serialisierungs-) Befehle ausführt:
: : : :
MOV steuerregister/debug-register (außer CR0) INVD, INVLPG, WBINVD IRET, IRETD LGDT, LLDT, LIDT, LTR
Sandini Bib 326
: :
Kapitel 10
CPUID RSM, WRMSR
Vor allem der Befehl CPUID ist zur Serialisierung nützlich, weil er für jede Schutzebene ausgeführt werden kann, ohne eine Protection Exception zu verursachen und außerdem keinerlei Steuerregister und EFlags beeinflusst; lediglich die vier Vielzweckregister EAX, EBX, ECX und EDX werden mit einem Identifizierungscode überschrieben. Der i486 führt eine Serialisierung implizit aus, sobald ein Sprung- oder Verzweigungsbefehl auftritt.
10.2.5
Dynamische Verzweigungsvorhersage, Branch Prediction Logic
Sprünge und Verzweigungen haben immer schon die Leistung moderner Mikroprozessoren empfindlich gebremst. Es verwundert also nicht, dass die Hardware-Entwickler schon längere Zeit nach geeigneten Lösungen suchen. Sie finden eine solche im Pentium in Gestalt der BranchPrediction-Logik, die Prefetch-Verzögerungen in den meisten Fällen wirksam verhindern kann. Nebenbei bemerkt ist diese Branch Predicition kein Monopol des Intel-Chips. Vielmehr hat sie in der einen oder anderen Form Eingang in viele moderne RISC-Chips gefunden, so z.B. den Alpha von DEC oder den PowerPC von Motorola. RISC-CPUs sind ja wegen ihres Befehls-Pipelinings besonders anfällig für Verzweigungs-Delays. Aufbau und Funktionsweise der Verzweigungsvorhersagenlogik Die Branch-Prediction-Logik besteht aus einer Steuereinheit und dem Branch-Trace-Puffer oder Branch Target Buffer (BTB). Der BTB stellt einen Cache mit 256 Einträgen dar. Das Tag enthält die Adresse des Befehls, der dem Verzweigungsbefehl unmittelbar vorausgeht, also nicht des Sprungbefehls selbst. Der eigentliche Cache-Eintrag besteht aus der Zieladresse des Sprungs und diversen History-Bits, die statistische Informationen über die Häufigkeit der jeweiligen Verzweigungen liefern. Eine ausgeführte Verzweigung bezeichnet man als Taken Branch, eine nicht ausgeführte als Not-Taken Branch. Der dynamische Branch-Prediction- (Verzweigungsvorhersagen-) Algorithmus basiert auf den Verzweigungen entsprechend den Befehlen, die der Pentium in der Vergangenheit ausgeführt hat, er »lernt« sozusagen dazu. Die Prefetch-Puffer und der BTB arbeiten zusammen, um den wahrscheinlichsten Befehl nach einem Sprung einzulesen. Die D1-Decodierstufe führt dem BTB die Adresse des aktuellen Befehls in D1 zu, also den EIP-Wert des Befehls, der dem Sprungbefehl vorangeht und nicht die EIP-Adresse des Sprungbefehls selbst. Im Fall eines BTB-Treffers übergibt die Branch-PredictionLogik dann die Adresse des Sprungziels als Befehlsholadresse an die IF-Stufe. Bei vielen Verzweigungsbefehlen in einem Programm ist natürlich auch der BTB wie alle Caches irgendwann erschöpft und es treten BTB-Fehltreffer auch für Verzweigungsbefehle auf. Ein BTB-Fehltreffer wird wie ein Not-Taken Branch behandelt. Der dynamische BTB-Algorithmus des Pentiums sorgt selbstständig für ein Nachladen neuer Verzweigungsbefehle und das »Merken« des wahrscheinlichsten Verzweigungsziels. Dadurch kann die Branch-Prediction-Logik Verzweigungen recht zuverlässig vorhersagen. Üblicherweise geht einer bedingten Verzweigung ein Vergleich zweier Größen entweder explizit (z.B. durch CMP) oder implizit (z.B. durch SUB) voran. Dieser Vergleich wird erst in der vierten EX-Stufe durchgeführt und die EFlags werden erst in der fünften WB-Stufe geschrieben. Der nachfolgende CMP-Befehl befindet sich dann bereits in der zweiten Decodierstufe D2 oder der Ausführungsstufe EX, im Fall einer Befehlspaarung sogar in derselben Stufe wie der Vergleichsbefehl. Die Vorhersage kann für unbedingte Sprünge (über JMP), bedingte Sprünge (über Jcc) der u-Pipeline und Aufrufe (über CALL) erst in der Ausführungsstufe EX und für bedingte Sprünge der v-Pipeline in der Registerschreibstufe WB überprüft werden.
Sandini Bib Der Pentium
327
War die Vorhersage richtig, was bei unbedingten Sprüngen und Prozeduraufrufen nahezu immer der Fall ist (nur inkorrekte oder veraltete BTB-Einträge für einen anderen Task können zu einer falschen Vorhersage führen), so sind alle nach dem Sprungbefehl in die Pipeline geladenen Befehle gültig und der Pipeline-Betrieb wird ohne Unterbrechung fortgesetzt. Verzweigungen und Aufrufe werden bei korrekter Vorhersage also innerhalb eines einzigen Taktzyklus und entsprechend den Paarungsregeln parallel zu anderen Befehlen ausgeführt. Wird eine Vorhersage in der EX- oder WB-Stufe als unrichtig eingestuft, dann leert der Pentium die Pipeline und weist die Befehlsholstufe an, den Befehl an der richtigen Adresse zu holen. Anschließend nimmt die Pipeline den Betrieb in der gewohnten Weise wieder auf. Der dynamische Algorithmus mit den History-Bits kann solche Situationen aber im Allgemeinen vermeiden. Auswirkungen der Verzweigungsvorhersage – ein Beispiel Noch beim i486 wirken sich Verzweigungen (Taken Branches) verhängnisvoll aus, sie verzögern die Befehlsausführung nämlich ganz erheblich. Im Folgenden möchte ich kurz ein Beispiel diskutieren, nämlich im Wesentlichen die Schleife init_loop, die zur Feldinitialisierung hundertmal durchlaufen wird. Beispiel: Feld array aus hundert Doppelworten mit 00000000h initialisieren. mov edx, 00000000h ;Initialisierungswert in edx ablegen lea eax, array ;Anfangsadresse des Feldes in eax speichern mov ecx, eax+396 ;Adresse des letzten Feldelements in ecx laden init_loop: mov [eax], edx add eax, 04h cmp eax, ecx jbe init_loop
;Beginn der Initialisierungsschleife ;Feldelement auf 00000000h setzen ;nächstes Feldelement ;ermitteln, ob bereits letzte Adresse erreicht ist, ;d.h. ob eax-exc>0 ;nochmals Schleife, wenn letzte Adresse noch nicht erreicht ist
Der i486 arbeitet alle vier Befehle MOV, ADD, CMP und JBE nacheinander ab (eine Pipeline). Die ersten drei Befehle benötigen jeweils nur einen Taktzyklus. Der bedingte Sprung JBE wird in 99 Fällen ausgeführt und benötigt auf dem i486 drei Taktzyklen. Jeder Schleifendurchlauf dauert also sechs Takte. Betrachten wir zum Vergleich den Pentium. Die vier Schleifenbefehle können hier gepaart werden: u-Pipeline
v-Pipeline
mov [eax], edx cmp eax, ecx
add eax, 04h jbe init_loop
Die erste Zeile mit MOV und ADD wird in nur einem Takt ausgeführt. Ist auch die Verzweigungsvorhersage für JBE korrekt, so wird auch die zweite Zeile in nur einem Taktzyklus abgearbeitet. Das ergibt zusammen lediglich zwei Taktzyklen pro Schleifendurchlauf, eine Steigerung um den Faktor drei gegenüber dem i486 (und einen Faktor 6,5 gegenüber dem i386). Beachten Sie, dass die (mit Ausnahme des DX2/66 und DX4) wesentlich höhere Taktrate des Pentiums die Performance nochmals anhebt. Eine falsche Vorhersage durch die BTB-Logik würde zu einer Verzögerung von vier Taktzyklen führen, weil sich der JBE-Befehl in der v-Pipeline befindet und daher erst in der WB-Stufe verifiziert wird. Durch das hundertmalige Durchlaufen der Initialisierungsschleife lernt die BTBLogik sehr schnell, dass stets ein Taken Branch vorliegt. Lediglich beim ersten Schleifendurchlauf (wenn der BTB ja noch keine »Erfahrung« mit dem Ausgang der CMP- und JBE-Befehle hat) und nach dem letzten Durchlauf (wenn der BTB durch die History-Bits wohl einen erneuten
Sandini Bib 328
Kapitel 10
Taken Branch auf Grund der vorherigen 99 Taken Branches vorhersagt) ergeben sich möglicherweise falsche Verzweigungsvorhersagen. Die Branch Prediction schlägt also vor allem bei häufig durchlaufenen Schleifen durch, wie sie ja oft bei der Implementierung von Algorithmen zur näherungsweisen Berechnung von mathematischen Ausdrücken oder grafischen Darstellung von Rechenergebnissen auftreten.
10.2.6
Die Pentium-On-Chip-Caches
Wie ich bereits eingangs erwähnt habe, sind zwei getrennte und voneinander unabhängige 8 KByte-Caches für Code und Daten vorgesehen. Dadurch werden Kollisionen zwischen dem Befehls-Prefetching und Datenzugriffen vermieden. Daten- und Code-Cache arbeiten parallel und können gleichzeitig angesprochen werden. Jeder Cache ist 2-Wege-Set-assoziativ organisiert (i486: 4-Wege-Set-assoziativ) und weist bei einer Cache-Line-Größe von 32 Byte (i486: 16 Byte) insgesamt 128 Sets auf. Im Burst-Modus kann eine Cache-Line über den 64-Bit-Datenbus in vier aufeinanderfolgenden Transferzyklen gelesen oder zurückgeschrieben werden. Für die Cache-Leerung durch Software stehen wie beim i486 die beiden Befehle INVD (Invalidate Data Cache) und WBINVD (Write Back and Invalidate Data Cache) zur Verfügung. In beiden Fällen treibt der Pentium einen Flush-Sonderzyklus auf den Bus, um die erfolgte Invalidierung anzuzeigen, beim Befehl WBINVD dagegen zunächst den Write-Back-Zyklus und erst anschließend den Flush-Sonderzyklus. Der On-Chip-Code- und Daten-Cache Der Daten-Cache unterstützt das MESI-Protokoll mit allen vier Zuständen. Dadurch kann individuell für jede 32-Byte-Cache-Line eine Write-Through- oder Write-Back-Strategie festgelegt werden. Dagegen ist der Code-Cache (mit Ausnahme des automatischen Nachladens im Zuge des Befehls-Fetchings) nicht beschreibbar und unterstützt nur die beiden Zustände Shared und Invalid. Außerdem lassen sich über das PCD- und PWT-Bit im Page Directory- oder Page Table-Eintrag individuelle Pages als cachebar oder nicht-cachebar definieren. Sie können durch Löschen oder Setzen des CD-Bits im Steuerregister CR0 die beiden On-Chip-Caches aktivieren oder stillegen. Ersetzungsstrategie und MESI-Protokoll sind fest durch die Hardware implementiert und es ist keine Einwirkung von Software notwendig, um die Caches zu verwalten. Die Ersetzung von Cache-Lines in den beiden On-Chip-Caches erfolgt durch einen LRU-Algorithmus, der den weniger benutzten Eintrag beider Wege durch die neuen Daten ersetzt. Zur Implementierung des LRU-Algorithmus weist jedes Set ein LRU-Bit auf, das auf den weniger häufig benutzten Eintrag zeigt. Zusätzlich benötigt jedes Tag noch Information über den gegenwärtigen MESI-Zustand der zugeordneten Line. Das geschieht beim Daten-Cache über zwei MESI-Bits, die die vier möglichen MESI-Zustände Modified, Exclusive, Shared und Invalid binär kodieren. Da der Code-Cache lediglich die beiden Zustände Shared und Invalid unterstützt, genügt hier ein MESI-Bit. In Abbildung 10.7 sehen Sie den Aufbau der Tag- und Speichereinträge für die beiden On-Chip-Caches.
Sandini Bib Der Pentium
329
Daten-Cache
Weg 1 Weg 0
20-Bit-Tag-Adresse
Cache-Speichereintrag
ME SI
LRU
Cache-Directory-Eintrag
Weg 1 Weg 0
Daten Daten Daten Daten Daten Daten Daten Daten Daten DW
2 MESI-Bits 1 LRU-Bit
DW
DW
QW
DW QW
DW
DW
DW
QW
DW QW
32-Byte-Cache-Line
Code Cache
Weg 1 Weg 0
20-Bit-Tag-Adresse
Cache-Speichereintrag
SI
LRU
Cache-Directory-Eintrag
Weg 1 Weg 0
Code Code Code Code Code Daten Code Code Code DW
1 SI-Bit 1 LRU-Bit
DW QW
DW
DW QW
DW
DW QW
DW
DW QW
32-Byte-Cache-Line
Abb. 10.7: Tag- und Speichereinträge der Pentium-Caches
Die Translation Lookaside Buffers Wie Sie in Abbildung 10.1 sehen, ist jedem Cache ein eigener Translation Lookaside Buffer (TLB) zugeordnet. Die Caches arbeiten mit physikalischen Adressen, d.h. die Umsetzung der linearen Adresse in eine entsprechende physikalische muss vor dem Zugriff auf die Caches erfolgen. Dem Daten-Cache sind zwei TLBs zugeordnet: der erste für die Verwaltung von standardmäßigen 4-KByte-Pages, der zweite für die neu implementierten 4-MByte-Pages. Der erste TLB speichert 64 Einträge und ist als 4-Wege set-assoziativer Cache mit 16 Sets organisiert. Der zweite TLB ist ebenfalls als 4-Wege set-assoziativer Cache organisiert, umfasst aber nur acht Einträge. Der Code-Cache weist einen TLB zusammen für die standardmäßigen 4-KByte- als auch die neuen 4-MByte-Pages auf. Er speichert 32 Einträge und ist als 4-Wege set-assoziativer Cache organisiert. Der Code-Cache-TLB ist also erheblich kleiner als der Daten-Cache-TLB. CodeZugriffe erfolgen nämlich durch den recht linearen Befehlsfluss wesentlich gleichförmiger als Datenzugriffe, sodass weniger TLB-Einträge ausreichen, um eine gute Trefferquote zu erzielen (sie soll laut Intel typischerweise bei 99% und mehr liegen). Betriebsmodi und Steuerregister der On-Chip-Caches Die Aktivierung der On-Chip-Caches und deren Cache-Strategie wird wie beim i486 im Wesentlichen durch das Steuerregister CR0 gesteuert. Seine Struktur sehen Sie in Abbildung 10.8. Für die On-Chip-Caches sind die beiden Bits CD (Cache Disable) und NW (Not Write Through) maßgeblich. Die Auswirkungen der vier möglichen Kombinationen beider Steuerbits sind im Folgenden zusammengefasst
Sandini Bib 330
Kapitel 10
CD:
NW:
5
reserviert
4
3
2
1
0
NE ET TS EM MP PE
reserviert
WP
18 17 16
AM res
PG
CD NW
31 30 29
CR0
Cache Disable 0=On-Chip-Caches aktiv 1=On-Chip-Caches deaktiviert Not Write-Through 0=Write-Through-Strategie für Daten-Cache 1=Write-Back-Strategie für Daten-Cache
Abb. 10.8: Die Struktur des Steuerregisters CR0.
CD=0, NW=0 Lesezugriffe werden bei einem Treffer im Code- oder Daten-Cache vom jeweiligen Cache bedient. Fehltreffer lösen ein Cache-Line-Fill aus, wenn die Werte cachebar sind (KEN auf niedrigem Pegel); die geladene Cache-Line wird dann in Abhängigkeit vom externen Signal WB/WT im Exclusive- (WB/WT=1) oder Shared-Zustand (WB/WT=0) abgelegt. Die On-Chip-Caches sind also voll aktiviert. Nur bei einem Treffer auf eine Shared Line im Daten-Cache oder einem Fehltreffer treibt der Pentium einen externen Schreibzyklus. Der Cache arbeitet dadurch mit einer Write-Back-Strategie nach dem MESI-Protokoll. Die On-Chip-Caches unterstützen außerdem Abfragezyklen und die zugehörigen Invalidierungen. Dieser Betriebsmodus liefert im Allgemeinen die höchste Performance. CD=0, NW=1 Diese Bitkombination ist ungültig. Der Pentium löst einen allgemeinen Protection-Fehler entsprechend dem Interrupt 0dh aus. CD=1, NW=0 Lesezugriffe werden bei einem Treffer vom jeweiligen Cache bedient. Fehltreffer führen aber zu keinem Cache-Line Fill, weil der Cache durch CD=1 deaktiviert ist. Schreibzugriffe aktualisieren bei einem Treffer den Daten-Cache. Nur bei einem Treffer auf eine Shared Cache-Line oder bei einem Fehltreffer erscheinen die Schreibdaten auch auf dem externen Bus. Für den Cache ist eine Write-Back-Strategie festgelegt, auch wenn Cache-Line-Fills gesperrt sind. Obwohl die Caches wegen CD=1 eigentlich deaktiviert sind, unterstützen sie dennoch Abfragezyklen und die zugehörigen Invalidierungen, der Betriebsmodus sichert die Kohärenz zwischen L1-Cache und externen Speichern (L2-Cache oder Hauptspeicher). CD=1, NW=1 Lesezugriffe werden bei einem Treffer vom Cache bedient. Fehltreffer führen zu keinem CacheLine Fill, weil der Cache wie oben durch CD=1 deaktiviert ist. Schreibzugriffe können den Daten-Cache aktualisieren, werden aber wegen NW=1 in keinem Fall auf den externen Bus getrieben. Für einen Schreibfehltreffer wird der Schreibzugriff auf den externen Bus durchgeschaltet. Die Caches unterstützen weder Abfragezyklen noch Invalidierungen. Dieser Betriebsmodus erhält daher die Kohärenz zwischen L1-Cache und externen Speichern nicht. Aus den Erläuterungen erkennen Sie, dass das CD-Bit lediglich Cache-Line-Fills deaktiviert, nicht aber die Cache-Funktion als solche. Sollen die Caches wirklich stillgelegt werden, müssen Sie zusätzlich ein Cache-Flush auslösen. Dadurch werden alle Einträge invalidiert und es können keine Cache-Treffer mehr auftreten. CD=1 sperrt dann die sonst ausgelösten Line-Fills.
Sandini Bib Der Pentium
331
Die MESI-Übergänge und die Ergebnisse der Abfragezyklen werden beim Pentium über verschiedene Signale gesteuert bzw. angezeigt. In Tabelle 10.1 finden Sie alle die entsprechenden zugeführten oder abgegebenen Signale. Das Übergangsdiagramm ist bereits in Abbildung 8.7 gezeigt worden. Übergang
Signale
Lesezugriffe M->M (R1) E->E (R2) S->S (R3) I->E (R4) I->S (R5) I->I (R6)
keine keine keine CACHE=0, KEN=0, WB/WT=1, PWT=0 CACHE=0, KEN=0, WB/WT=0 oder CACHE=0, KEN=0, PWT=1 CACHE=1 oder KEN=1
Schreibzugriffe M->M (W1) E->M (W2) S->E (W3) S->S (W4) I->I (W5)
keine keine PWT=0, WB/WT=1 PWT=0, WB/WT=0 oder PWT=1 keine
Abfragezyklen M->S (S1) M->I (S2) E->S (S3) E->I (S4) S->S (S5) S->I (S6) I->I (S7)
INV=0, HIT=0, HITM=0 INV=1, HIT=0, HITM=0 INV=0, HIT=0 INV=1, HIT=0 INV=0, HIT=0 INV=1, HIT=0 INV=0, HIT=1 oder INV=1, HIT=1
Tab. 10.1: Pentium-Signale für MESI-Übergänge und Abfragezyklen
R4 bis R6 (siehe Abbildung 8.7) werden beim Pentium durch die externen Signale KEN (für cachebare Daten) und WT/WB (für die Cache-Strategie Write-Through oder Write-Back) gesteuert. Caching auf Page-Ebene Neben der individuellen Festlegung der Cache-Strategie und der Cache-Aktivierung auf CacheLine-Ebene können Sie das Caching wie beim i486 auch hier auf Page-Ebene beeinflussen. Das geht natürlich nur, wenn die Paging-Einheit PU aktiv ist. Maßgeblich sind die beiden Bits PCD (Page Cache Disable) und PWT (Page Write Through) im Page Directory- und Page Table-Eintrag. Sie aktivieren das Caching (PCD) bzw. steuern die Cache-Strategie (PWT) für die betreffende Page. In Abbildung 10.9 sehen Sie die Struktur der Einträge. Ist das PCD-Bit gelöscht, können die Daten der Page im Prinzip in die beiden On-Chip-Caches übertragen werden. Es wird ein Cache-Line-Fill gestartet, wenn das Speichersystem KEN auf einen niedrigen Pegel legt. Ist das PCD-Bit gesetzt (gleich 1), dann können keine Daten der betreffenden Page in den Caches gespeichert werden. Das gilt auch dann, wenn dem durch ein niedriges KENSignal von Seiten der Hardware nichts im Weg stünde. Ist das PWT-Bit gleich 0, dann soll der Cache für die Daten der Page eine Write-Back-Strategie ausführen. Ist PWT gesetzt (gleich 1), dann verlangt die Page nach einer Write-Through-Strategie. Natürlich bleibt der Wert von PWT ohne Auswirkungen, wenn für die Page gar kein Caching ausgeführt wird. In einem Speicherzugriff
Sandini Bib 332
Kapitel 10
werden die effektiven Werte der PCD- und PWT-Bits über die Anschlüsse PCD bzw. PWT des Pentiums ausgegeben. Ein eventuell vorhandener L2-Cache kann die Signale dann dazu benutzen, seine eigene Cache-Strategie für den gegenwärtigen Speicherzugriff entsprechend anzugleichen.
Page-Frame-Adresse
Page-Table-Eintrag 31
16 15
Page-Frame-Adresse
PCD:
PWT:
9
8
7
6
AVAIL
0
0 A
PCD PWT U/S W/R
16 15
9
8
7
6
4
12 11
12 11
AVAIL
5
4
5
3
3
2
2
1
1
PCD PWT U/S W/R
31
PGr
Page-Directory-Eintrag
0 0 D A
0
P 0
P
Page Cache Disable 0=Page cachebar 1=Page nicht cachebar Page Write-Through 0=Page verwendet Write-Back-Strategie 1=Page verwendet Write-Through-Strategie
Abb. 10.9: Page Directory- und Page Table-Einträge
10.3 Pentium-Kompatibilität In diesem Abschnitt möchte ich ein paar Worte zur Kompatibilität des Pentium mit seinen Vorgängern i386 und i486 verlieren. Wenn nicht explizit betont wird, dass Unterschiede zu diesen zwei Prozessoren bestehen, gelten alle Ausführungen zu ihnen in unveränderter Weise auch für den Pentium. Das betrifft vor allem die Mechanismen des Protected Modes.
10.3.1
Erweiterungen der Pentium-Register
Dieser Abschnitt gibt eine kurze Vorstellung der Registererweiterungen des Pentiums. Dazu gehören die zusätzlichen Bits, aber auch neu hinzugekommene Test- und Steuerregister. Die Pentium-EFlags Das EFlag-Register ist beim Pentium um drei zusätzliche Flags erweitert worden. Sie betreffen die Pentium-Erweiterungen für den Virtual-8086-Mode und die Identifizierung des CPU-Typs. In Abbildung 10.10 sehen Sie die EFlags. Die drei neuen Flags sind hinterlegt. 31
r r r r r r r r r r
C: P: A: Z: S: T:
Carry Parity Auxiliary Zero Sign Trap
ID VIP VI AC
22 21
16 15
0
V R r N IOP O D I T S Z r A r P r C
I: Interrupt Enable D: Direction O: Overflow IOP: I/OPrivilege Level N: Nested Task R: Resume
Abb. 10.10: Die Pentium-EFlags
7
V: AC: VI: VIP: ID:
Virtual 8086 Mode Alignment Check Virtual Interrupt Virtual Interrupt Pending Identifizierung
Sandini Bib Der Pentium
333
Das Virtual-Interrupt-Flag VI ist das virtuelle Abbild von IE für das Auslösen von Interrupts im Virtual-8086-Mode. In ähnlicher Weise unterstützt auch das Virtual Interrupt Pending Flag VIP Tasks im Virtual-8086-Mode, um ihnen ein virtuelles IE-Flag zur Verfügung zu stellen. Beide Flags sollen die Abarbeitung von Interrupts im Virtual-8086-Mode beschleunigen. Weitere Details zu den Pentium-Erweiterungen des Virtual-8086-Mode erfahren Sie in Kapitel 10.3.6. Als letzte Neuerung ist im EFlag-Register ein Identifizierungs-Flag ID vorgesehen. Es gibt an, ob der Prozessor den Befehl CPUID zu seiner Identifizierung unterstützt. Wenn Sie das ID-Flag setzen und löschen können, dann wird CPUID korrekt ausgeführt und liefert Informationen über Typ und Funktionsumfang des Prozessors. Das Steuerregister CR4 Der Pentium ist um ein Steuerregister CR4 erweitert worden. Dieses Register steuert die Pentium-Erweiterungen für den Virtual-8086-Mode, die Debugger-Unterstützung sowie die erweiterten Page-Größen von 4 MByte. Die vier Steuerregister CR0 bis CR3 sind gegenüber dem i486 unverändert geblieben. In Abbildung 10.11 sehen Sie die Struktur des neuen Steuerregisters CR4. 16 15
7
6
5
4
3
2
1 0
MCE res PSE DE TSD PVI VME
31
MCE: PSE: DE: TSD: PVI:
VME:
Machine Check Enable 1=Machine Check Exception aktiviert 0=Machine Check Exception deaktiviert Page Size Extension 1=4-MByte-Pages 0=4-KByte-Pages Debugging Extension 1=Haltepunkte auch für I/O-Bereich 0=Haltepunkte nur für Speicheradressen Time Stamp Disable 1=RDTSC nur mit CPL=0 0=RDTSC auch mit CPL=3..1 Protected Mode Virtual Interrupts 1=virtuelle Interrupt Flags im Protected Mode 0=keine virtuellen Interrupt Flags Virtual-8086-Mode Extension 1=virtuelle Interrupt Flags im Virtual-8086-Mode 0=keine virtuellen Interrupt Flags
Abb. 10.11: Das Steuerregister CR4
Im Steuerregister CR4 sind für die Unterstützung des Virtual-8086-Modes und andere Neuerungen sechs Steuerbits vorgesehen. Ein gesetztes Virtual-8086-Mode-Extension-Bit VME aktiviert die Unterstützung virtueller Interrupt Flags im Virtua-8086-Mode. Dadurch werden Interrupts schneller bearbeitet, um die Leistung im Virtual-8086-Mode zu steigern. Der Virtual-8086-Monitor braucht dann nicht mehr aufgerufen zu werden und die ganzen damit verbundenen Task Switches (siehe Abbildung 6.24) werden unnötig. Das Protected-Mode-Virtual-Interrupt-Bit PVI hat im Protected Mode eine ähnliche Aufgabe wie das VME-Bit im Virtual-8086-Mode. Ein gesetztes PVI-Bit aktiviert nämlich die Unterstützung virtueller Interrupt Flags im Protected Mode. Dadurch können Programme, die eigentlich für die Ausführung mit CPL=0 konzipiert worden sind, unter bestimmten Umständen auch mit CPL=3 ausgeführt werden. Das Programm kann dann mit STI und CLI das virtuelle Interrupt Flag VIF setzen und löschen und das VIP-Flag benutzen, ohne eine Exception auszulösen. Die Unterschiede zur Verwendung der VME-Erweiterung (siehe Kapitel 10.3.6) sind die, dass VIP nur die beiden Befehle STI und CLI (und nicht PUSHF und POPF) betrifft und im Protected Mode keine Redirection Bitmap im TSS unterstützt wird.
Sandini Bib 334
Kapitel 10
Durch Setzen des TSD-Bits (Time Stamp Disable) wird der RDTSC-Befehl, der einen Wert vom Time-Stamp-Zähler liest, zu einem so genannten privilegierten Befehl. Er kann dann nur noch mit CPL=0 ausgeführt werden, sonst ist eine Exception die Folge. Wenn Sie auch den I/OAdressbereich mit Haltepunkten belegen wollen, müssen Sie das Debugging-Extension-Bit DE setzen. Der Pentium interpretiert dann die beim i386/i486 ungültige Kombination 10b für die R/Wx-Bits als Haltepunkt für I/O-Schreib- und I/O-Lesezugriffe. Ferner können Sie mit Hilfe des Page-Size-Extension-Bits PSE die Größe einer Page festlegen. Ein gesetztes PSE-Bit führt zu den neuen 4-MByte-Pages, durch ein gelöschtes PSE-Bit benutzt die PU die standardmäßigen und die i386/i486-kompatiblen Pages mit einer Größe von 4 KByte. Schließlich aktivieren Sie durch Setzen des MCE-Bits (Machine Check Enable) die Machine Check Exception. Näheres dazu erfahren Sie in Kapitel 10.7.6.
10.3.2
Modellspezifische Register
Mit dem Pentium hat Intel das Konzept der modellspezifischen Register eingeführt. Dazu gehören das Maschinen-Check-Adressregister, das Maschinen-Check-Typregister, die Testregister TR1 bis TR12, der Zeitmarkenzähler, das Control/Event-Select-Register und die beiden Zähler 0 und 1. Für den Zugriff auf diese Register sind die beiden Befehle RDMSR (Read Model Specific Register) und WRMSR (Write Model-Specific Register) neu implementiert worden. Sie haben das in Tabelle 10.2 angegebene Format. Register RDMSR: EAX ECX EDX WRMSR: EAX ECX EDX
Aufrufwert
Rückgabewert MSR-Inhalt (niederw. DW)
MSR-Nummer MSR-Inhalt (höherw. DW)
MSR-Inhalt (niederw. DW) MSR-Nummer MSR-Inhalt (höherw. DW)
MSR: modellspezifisches Register DW: Doppelwort
Tab. 10.2: RDMSR- und WRMSR-Befehlsformate
Die bekannten modellspezifischen Register haben dabei die in Tabelle 10.3 angegebenen MSRNummern. Modellspezifisches Register
MSR-Nr. Verwendung
Maschinen-Check-Adressregister Maschinen-Check-Typregister TR1 TR2 TR3 TR4 TR5 TR6
00h 01h 02h 04h 05h 06h 07h 08h
physikalische Adresse des fehlerverursachenden Buszyklusses Typ des fehlerverursachenden Buszyklus Paritätsumkehr Trennbit zwischen Befehlen im I-Cache Cache-Testdaten Cache-Test-Tag Cache-Teststeuerung lineare Adresse für TLB-Test
Tab. 10.3: Nummern der modellspezifischen Register
Sandini Bib Der Pentium
335
Modellspezifisches Register
MSR-Nr. Verwendung
TR7 TR9 TR10 TR11 TR12 Zeitmarkenzähler Steuerung und Event-Auswahl Zähler 0 Zähler 1
09h 0bh 0ch 0dh 0eh 10h 11h 12h 13h
TLB-Teststeuerung und physikalische Teiladresse BTB-Test-Tag BTB-Testtarget BTB-Teststeuerung Feature-Steuerung Lesen/Schreiben des internen 64-Bit-Zählers Performance Monitoring Performance Monitoring Performance Monitoring
Tab. 10.3: Nummern der modellspezifischen Register (Forts.)
Die modellspezifischen Pentium-Register sind von Intel lediglich für den Pentium in dieser Form garantiert. Zukünftige Prozessoren oder auch Pentium-Derivate (Pentium Overdrive usw.) implementieren sie möglicherweise nicht mehr oder zumindest nicht in derselben Weise. Alle modellspezifischen Register sind 64 Bit breit. Neben dem Wunsch, so unterschiedliche Register wie die Testregister und verschiedene Zähler, die z.T. nur für einen bestimmten Prozessortyp von Bedeutung sind, unter einem einheitlichen Dach zusammenzufassen, gibt es noch einen weiteren Grund für das Konzept der modellspezifischen Register: Mit dem Pentium ist deren Zahl so groß geworden, dass schlichtweg die Opcodes für das bisher übliche Zugriffsschema mit z.B. MOV CR0, reg oder MOV reg, TR6 ausgehen würden. Es ist also günstiger, die beiden Befehle RDMSR und WRMSR mit einer Angabe des modellspezifischen Registers in Form einer 32-Bit-Nummer zu implementieren.
10.3.3
Das Feature-Steuerregister TR12
Das Steuerregister TR12 erlaubt die selektive Aktivierung der neuen Pentium-Features. Dazu gehören u.a. Verzweigungsvorhersage und Superskalarbetrieb. Abbildung 10.12 zeigt die Struktur dieses Registers. Mit dem Bit IO Trap Restart können Sie den Wiederanlauf eines I/O-Zugriffs nach dem System Management Mode aktivieren oder deaktivieren. Für eine Aktivierung ist eine Änderung der gewöhnlichen Interrupt-Prioritäten erforderlich. In Tabelle 10.4 sehen Sie die Prioritäten im Normalfall und für eine Aktivierung des IO-Trap-Wiederanlaufs. 16 15
reserviert
ITR: FET: CI: SE: TR: NBP:
3 2
9 8
reserviert
1 0
CI SE TR NBP
31
ITR FET
63
IO Trap Restart im System Management Mode 1=aktiviert 0=deaktiviert Fast Execution Tracing 1=aktiviert 0=deaktiviert Cache Inhibit 1=Cache deaktiviert 0=aktiviert Single Pipe Execution 1=v-Pipeline deaktiviert 0=beide Pipelines aktiv Execution Tracing 1=aktiviert 0=deaktiviert No Branch Prediction 1=keine Verzweigungsvorhersage 0=Verzweigungsvorhersage aktiviert
Abb. 10.12: Das Feature-Steuerregister TR12
Sandini Bib 336
Kapitel 10
höchste Priorität
niedrigste Priorität
ITR=0
ITR=1
Breakpoint (INT 3) BUSCHK Debug Trap (INT 1) R/S FLUSH SMI INIT NMI INTR FPU-Fehler STPCLK Befehl erzeugt Exception
Breakpoint (INT 3) BUSCHK FLUSH SMI Debug Trap (INT 1) R/S INIT NMI INTR FPU-Fehler STPCLK Befehl erzeugt Exception
Tab. 10.4: Interrupt-Prioritäten
Weitere Informationen zum IO Trap Restart finden Sie in Kapitel 10.5. Mit Hilfe des FET-Bits können Sie festlegen, ob der Pentium ein Fast Execution Tracing mit nur einem Buszyklus oder eine gewöhnliche Programmausführungsverfolgung mit zwei Buszyklen ausführen soll. Das Cache-Inhibit-Bit steuert das Verhalten des L1-Caches. Ist CI=0, arbeiten die beiden On-ChipCaches des Pentiums normal, führen also z.B. Cache-Line-Fills aus. Wird der L1-Cache dagegen durch einen CI-Wert von 1 deaktiviert, treibt der Pentium keine Cache-Line-Fills mehr. Beachten Sie, dass dies ohne ein Cache-Flush zunächst nur Cache-Fehltreffer betrifft. Im Falle eines CacheTreffers greift der Pentium sehr wohl auf seinen L1-Cache zu. Soll der On-Chip-Cache völlig deaktiviert werden, müssen Sie zusätzlich ein Cache-Flush ausführen, damit jeder Zugriff zu einem Cache-Fehltreffer führt. Ein gesetztes Single-Pipe.Execution-Bit SE=1 deaktiviert die v-Pipeline; alle Befehle werden nur von der u-Pipeline ausgeführt. Das betrifft aber nicht mikrokodierte Befehle, die üblicherweise beide Pipelines verwenden, um die Ausführung eines komplexen Befehls zu beschleunigen. Das Execution-Tracing-Bit TR steuert die Erzeugung von Branch-Trace-Sonderzyklen. Ein Wert TR=1 führt zu einem solchen Buszyklus, sobald der Pentium eine Verzweigung ausführt. Sie können die Verzweigungsvorhersage abschalten, indem Sie das NBP-Bit (No Branch Prediction) auf den Wert 1 setzen. Dazu werden keine neuen Werte in den BTB eingetragen. Alte, noch gültige Einträge können aber natürlich weiter zu einer Verzweigungsvorhersage führen. Der BTB kann durch Neuladen des Steuerregisters CR3 geleert werden (BTB Flush).
10.3.4
Der Pentium-Real-Mode
Der Real Mode des Pentiums stimmt mit dem des i386 und i486 vollständig überein. Wie üblich verschiebt der Pentium den Wert in einem Segmentregister um vier Bitstellen nach links und addiert den Offset bzw. die effektive Adresse, um eine lineare und gleichzeitig die entsprechende physikalische Adresse zu berechnen. Die erzeugten physikalischen Adressen liegen zwischen 000000h und 10ffefh. Beachten Sie, dass auch hier trotz der 32-Bit-Offsetregister keine Offsetwerte größer als ffffh erzeugt werden können, ohne eine Exception 12 (0ch) oder 13 (0dh) auszulösen. Alle weiteren Eigenschaften des i386-Real-Modes gelten auch für den Real Mode des Pentiums. Details dazu finden Sie in Kapitel 6.5.
Sandini Bib Der Pentium
10.3.5
337
Der Pentium-Protected-Mode
Wie der Real ist auch der Pentium Protected Mode vollständig kompatibel mit dem Protected Mode des i386/i486. Die Bedeutung der Segmentregisterwerte als Segmentselektoren und die Interpretation der Segmentdeskriptoren hat sich nicht geändert. Im Protected Mode ist der gesamte physikalische 32-Bit-Adressraum des Pentiums mit 4 GByte Kapazität zugänglich. Der Speicher wird über die Speicherverwaltungsregister GDTR, LDTR IDTR und TR verwaltet. Details zum Protected Mode finden sich in Kapitel 6.7.
10.3.6
Der Pentium-Virtual-8086-Mode
Beim Pentium ist die Funktionalität des Virtual-8086-Modes wegen seiner Bedeutung für die DOS-Kompatibilitätsboxen von OS/2 und Windows verbessert worden, um die Rechenleistung zu steigern. Die Crux war bis zum i486, dass DOS-Programme einerseits sehr oft einen Interrupt auslösen, um z.B. eine Betriebssystemfunktion aufzurufen, andererseits die Behandlung eines solchen Interrupts unter dem Virtual-8086-Monitor aber sehr lange dauert. Ursache ist im Wesentlichen das langwierige Umschalten zwischen dem Virtual-8086-Programm, dem Virtual8086-Monitor und den Emulationsroutinen für die gewünschten Betriebssystemfunktionen, die meistens über Task Switches ablaufen. Sie verursachen dadurch im Vergleich zum Real Mode mit der simplen Rettung und Wiederherstellung von 10 Byte (EIP, CS, EFlags) einen gewaltigen Datenverkehr (pro Task Switch 172 Byte in zwei TSS). Zur Aktivierung und Steuerung des Pentium Virtual-8086-Modes sind das EFlag-Register, das neue Steuerregister CR4 und eine Interrupt Redirection Bitmap IRB im Task State Segment vorgesehen. Die Adressumsetzung entsprechend dem Virtual-8086-Mode aktivieren Sie durch Setzen des VM-Flags im EFlag-Register. Bei gelöschtem VME-Bit in CR4 stimmt der Pentium Virtual8086-Mode mit dem des i386/i486 völlig überein. Durch Setzen von VME können Sie aber die neuen Virtual-8086-Mode-Funktionen des Pentiums aktivieren. Dann haben auch die beiden Bits VIP und VI im EFlag-Register eine Bedeutung. VI ist ein virtuelles Abbild des gewöhnlichen Interrupt Flags, ein gesetztes VIP-Flag erlaubt individuelle virtuelle Interrupt Flags für die 8086Programme im Virtual-8086-Mode. Näheres dazu erfahren Sie im Abschnitt »Erweiterungen des Pentium-Virtual-8086-Modes«. Der i386/i486-kompatible Pentium-Virtual-8086-Mode Wenn das Bit VME im Steuerregister CR4 gelöscht, also gleich 0 ist, dann ist der Virtual-8086Mode des Pentiums vollständig identisch mit dem Virtual-8086-Mode des i386 und i486. Die beiden Flags VIP (Virtual Interrupt Pending) und VI (Virtual Interrupt) im EFlag-Register haben keine Bedeutung. Die Behandlung von Interrupts und Exceptions im Virtual-8086-Mode und die damit verbundene Umschaltung zwischen 8086-Programm, Virtual-8086-Monitor und dem Protected-Mode-Betriebssystem, wie sie in Abbildung 6.24 dargestellt ist, läuft genauso ab wie beim i386/i486. Erweiterungen des Pentium-Virtual-8086-Modes Zur Zeit der Drucklegung dieses Buches unterlagen viele Informationen zu den Pentium-Erweiterungen des Virtual-8086-Modes bedauerlicherweise einer strengen Geheimhaltung durch Intel. Der in hohem Maße pentiumkompatible 5k86 von AMD implementiert aber in gut dokumentierter Weise Funktionen, von denen man annehmen kann, dass sie auf Grund des Kompatibilitätsdenkens mit denen des Pentiums übereinstimmen. Details zu den beschriebenen Pentium-Funktionen kann man zwar unter gewissen Umständen von Intel erhalten, sie dürfen aber nicht der Öffentlich-
Sandini Bib 338
Kapitel 10
keit zugänglich gemacht werden. Im Folgenden werde ich mich daher auf die Dokumentationen von AMD stützen. Die Erweiterungen des Pentiums für den Virtual-8086-Mode betreffen die Verwaltung virtueller Interrupts über das Virtual Interrupt Flag VIF und das Virtual Interrupt Pending Flag VIP im EFlag-Register sowie die Möglichkeit, Interrupts im Virtual-8086-Mode (also 8086-artige Interrupts) mit Hilfe einer Redirection Bitmap im Task-State-Segment TSS umzuleiten. Das Konzept der virtuellen Interrupts können Sie auch im gewöhnlichen Protected Mode nutzen. Zu diesem Zweck hält das EFlag-Register das Protected Mode Virtual Interrupt Flag PVI bereit. Die Ausführung bestimmter Befehle ist im Virtual-8086-Mode vom Wert des IOPL-Flags abhängig. Zu den so genannten IOPL-sensitiven Befehlen gehören CLI, STI, PUSHF, POPF, INTn und IRET. Das sind Anweisungen, die den Prozessorzustand und damit das Verhalten des Systems beeinflussen, die in Real-Mode-Anwendungen allerdings häufig vorkommen. Sind keine Virtual-8086-Mode-Erweiterungen aktiviert, verursacht ein IOPL-Wert kleiner als 3 eine Exception 0dh, wenn ein solcher Befehl ausgeführt werden soll. Dadurch kann der Virtual8086-Monitor ein Speicherabbild des Interrupt Flags für jeden Virtual-8086-Task verwalten und so eine Maskierung der Hardware-Interrupts emulieren, ohne das Interrupt Flag auch tatsächlich zu löschen. Das würde in unzulässiger und gefährlicher Weise das gesamte System beeinflussen und nicht nur den Virtual-8086-Task. Mit dieser Emulierung des Interrupt Flag und dem Behandeln der auftretenden Interrupt-Anforderungen ist ein erheblicher Aufwand verbunden, der die Performance deutlich verschlechtert. Stellen Sie sich beispielsweise ein 8086-Datenkommunikationsprogramm vor, das über ein Modem mit 19200 Baud Daten empfängt. Hier tritt mindestens 2400 mal pro Sekunde ein Interrupt auf (wenn ein Zeichen eingelaufen ist). Selbst ein schneller Pentium ist dann erheblich mit der Emulierung beschäftigt. INTn und IRET können mit der Redirection Bitmap behandelt werden, es bleiben also noch die vier Befehle CLI, STI, PUSHF und POPF übrig. Wenn die Erweiterungen über ein gesetztes VMEBit im Steuerregister CR4 aktiviert sind, stellt der Pentium ein Hardware-Interrupt Flag VIF sowie ein Virtual Interrupt Pending Flag VIP für den Virtual-8086-Mode zur Verfügung. Befehle, die den Wert des Interrupt Flags IF verändern (also CLI, STI, PUSHF und POPF), lösen dann nicht mehr notwendigerweise eine Exception aus, um vom Virtual-8086-Monitor abgefangen zu werden. Stattdessen werden sie normal ausgeführt, verändern aber das VIF-Flag anstelle des Interrupt Flags im EFlag-Register. Eine Änderung des Interrupt Flags selbst bleibt weiter dem Betriebssystem oder dem Virtual-8086-Monitor vorbehalten. Tritt nun eine externe Interrupt-Anforderung INTR auf, schaltet der Pentium wie üblich zum Protected-Mode-Betriebssystem. Im Fall eines Interrupts für einen Virtual-8086-Task untersucht das System nun das VIF-Flag auf dem Stack und nicht ein emuliertes Speicherabbild des Interrupt Flags. Ist VIF gesetzt, sind also Interrupt-Anforderungen für den Virtual-8086-Task aktiviert, übergibt das System die Behandlung an den entsprechenden Virtual-8086-Handler. Ist VIF gelöscht, d.h. sind Hardware-Interrupt-Anforderungen für den Virtual-8086-Task gesperrt, hält das System den Interrupt aktiv (pending) und setzt das VIP-Flag auf dem Stack. Anschließend kehrt das System zum unterbrochenen Programm zurück (holt also die EFlags über ein IRET wieder vom Stack). Setzt dieses Virtual-8086-Programm zu einem späteren Zeitpunkt das Interrupt Flag, dann fängt der Pentium diesen Vorgang bei gesetztem VIP-Flag ab und erzeugt eine Exception, um dem Betriebssystem mitzuteilen, dass das Virtual-8086-Programm den vorher gesperrten Interrupt nun bedienen kann. Beachten Sie, dass die beiden Flags VIF und VIP nur Hardware-Interrupt-Anforderungen über den INTR-Anschluss betreffen.
Sandini Bib Der Pentium
339
Vor allem Software-Interrupts stellen aber ein erhebliches Problem im Virtual-8086-Mode dar, weil 8086-DOS-Programme eine Menge INT 21h-Aufrufen aufweisen, um die DOS-Funktionen anzusprechen. Andererseits ist aber die Behandlung von Interrupts eine Aufgabe des Betriebssystems oder hier des Virtual-8086-Monitors. Daher fängt der Monitor bei gelöschtem VME-Bit alle INTn- und IRET-Befehle ab. Bei aktivierten Virtual-8086-Erweiterungen (VME=1) können auch diese Befehle normal ausgeführt werden und einen Handler über die Interrupt-Vektortabelle IVT des Virtual-8086-Tasks wie im Real Mode aufrufen. Manchmal ist es aber erwünscht, einen INTn-Befehl abzufangen und von einem Protected Mode Handler bearbeiten zu lassen, besonders wenn die Sicherheit des Systems betroffen ist. Das ist die Aufgabe der Redirection Bitmap: Der Pentium kann einen Software-Interrupt in Abhängigkeit vom Redirection Bit, das dem Interrupt zugeordnet ist, zum Protected oder zum Real Mode Interrupt Handler umleiten. In Abbildung 10.13 sehen Sie ein TSS mit Redirection Bitmap. Die Redirection Bitmap umfasst 256 Bit (=32 Byte), die den 256 möglichen Software-Interrupts umkehrbar eindeutig zugeordnet sind, und belegt die 32 Byte unmittelbar unter der I/O Permission Bitmap. Ist das einem Software-Interrupt INTn zugeordnete Bit gesetzt, verhält sich der Pentium für diesen Interrupt so, als ob die Erweiterungen des Virtual-8086-Modes nicht aktiviert wären (also wie für VME=0). Ist das Bit gelöscht, dann ruft die INTn-Anweisung wie im Real Mode den entsprechenden Handler in der Interrupt-Vektor-Tabelle bei der Basisadresse 0000:0000 auf. Beachten Sie, dass die Redirection Bitmap nur Software-Interrupts INTn betrifft, nicht aber Hardware-Interrupt-Anforderungen über das Signal INTR. Hardware-Interrupts benötigen immer einen Eingriff des Protected-Mode-Betriebssystems und können nicht zu einem RealMode-ähnlichen Handler einer IVT umgeleitet werden.
10.3.7
Pentium und Paging
Beim Pentium ist auch die Paging-Funktion neben dem Virtual-8086-Mode erweitert worden. Neben den standardmäßigen 4-KByte-Pages sind nun auch Pages mit einer Größe von 4 MByte möglich. Die Cache-Strategie der On-Chip-Caches kann durch das WB/WT-Signal oder über das PWT-Bit im Page Table-Eintrag für jede Page getrennt eingestellt werden. Damit ist wahlweise eine Write-Through-Strategie (WB/WT auf niedrigem Pegel oder PWT gleich 1) oder eine WriteBack-Strategie (WB/WT auf hohem Pegel oder PWT gleich 0) möglich. In den folgenden Abschnitten möchte ich Ihnen nur die Änderungen und Erweiterungen gegenüber dem i386 und i486 vorstellen. Die Grundlagen hierzu finden Sie in Kapitel 6.8.
10.3.8
Debug-Erweiterungen
Wie der i386 und i486 besitzt auch der Pentium acht Debug-Register DR0 bis DR7, die jeweils 32 Bits breit sind und Debugger auf Hardware-Ebene auch im Protected oder Virtual-8086-Mode unterstützen. Die einzige mit dem Pentium eingeführte Neuerung betrifft die R/Wx-Bits: Sie sind um die Kombination 10b erweitert worden. Diese ist aber nur dann gültig, wenn das DE-Bit (Debug Extensions) im Steuerregister CR4 gesetzt ist. Beim i386 und i486 war diese Kombination noch ungültig. Ein R/Wx-Bit-Wert aktiviert den zugehörigen Haltepunkt (Breakpoint) auch für I/O-Lese- und I/O-Schreibzugriffe. Beim i386 und i486 (oder dem Pentium mit gelöschtem DEBit) kann über die Debug-Register nur der Speicherbereich überwacht werden. Zusammengefasst gelten nun folgende Interpretationen für die R/Wx-Bits, wenn das DE-Bit im Steuerregister CR4 gleich 1 ist:
Sandini Bib 340
: : : :
Kapitel 10
00b: Halt nur bei Befehlsausführung (Befehls-Fetching) 01b: Halt nur für Datenschreibzugriffe auf den Speicher 10b: Halt für I/O-Lese- und I/O-Schreibzugriffe 11b: Halt nur für Datenlese- und Datenschreibzugriffe auf den Speicher, nicht für BefehlsFetching
10.3.9
Pentium-Reset, Pentium-Init und Selbsttest
Neben einem gewöhnlichen Reset über ein RESET-Signal kann der Pentium auch eine reine Initialisierung ausführen. Dazu muss das externe System dem INIT-Anschluss T20 für mindestens zwei CLK-Zyklen ein Signal mit hohem Pegel zuführen. Ein Reset wird dagegen erst nach 15 CLK-Zyklen erkannt. Ein Init setzt den Pentium in den Real Mode zurück und initialisiert die Segment- und Offsetregister, außerdem werden die beiden TLBs und der BTB invalidiert. Im Gegensatz zu einem Reset werden aber die internen Caches, Schreibpuffer, Modellregister und Gleitkommaregister nicht zurückgesetzt, sondern behalten ihre Werte bei. INIT dient also zur schnellen Rückstellung des Pentiums in den Real Mode mittels externer Hardware (z.B. dem Tastaturcontroller des ATs) anstelle eines privilegierten Befehls MOV CR0, wert zum Löschen des PE-Bits. Weitergehende interne Tests werden nicht ausgeführt, das ist einem Reset vorbehalten. Der umfangreichere Pentium-Reset wird durch ein aktives Signal am RESET-Anschluss ausgelöst. Kehrt das Signal anschließend auf einen niedrigen Pegel zurück, so tastet der Pentium die Signalpegel von FLUSH, FRCMC und INIT ab, um den Betriebszustand und die notwendigen Prüfungen zu ermitteln sowie eine interne Initialisierung durchzuführen. Neben dem vom i486 her bekannten internen Selbsttest BIST und dem Tristate-Test-Modus kann der Pentium noch ein Functional Redundancy Checking ausführen. In Tabelle 10.5 sehen Sie die Signalkombinationen, die zu den verschiedenen Tests führen. INIT
FLUSH
FRMC
ausgelöster Test
1 0 0
0
0 -
interner Selbsttest BIST Functional Redundancy Checking Tristate-Testmodus
Tab. 10.5: Pentium-Tests
Der interne Selbsttest dauert etwa 219 CLK-Zyklen entsprechend ca. 8 ms bei 66 MHz. Ohne BIST ist der Pentium schon nach 150 bis 200 CLK-Zyklen betriebsbereit (etwa 3 µs). Der BIST prüft den Mikrocode-ROM, interne Logikfelder (PLAs), Caches, TLBs und den BTB. Der Pentium legt das BIST-Prüfergebnis im EAX-Register ab. Ein Wert 00000000h zeigt einen fehlerfreien Chip an. Sonst ist der Prozessor fehlerhaft. Erkennt der BIST einen internen Paritätsfehler, dann aktiviert der Pentium das IERR-Signal und tritt in den Shutdown-Zustand ein. Mit Hilfe des Functional Redundancy Checking FRC kann der Pentium einen zweiten Pentium überprüfen. Im FRC-Modus treibt der Pentium keine Ausgabeanschlüsse außer IERR und TDO, sondern tastet die zugeführten Signalpegel ab. Falls die abgetasteten Pegel nicht mit den intern berechneten übereinstimmen, aktiviert er das IERR-Signal, um den Fehler nach außen anzuzeigen. Durch das Functional Redundancy Checking können sich z.B. in einem Multiprozessorsystem auf Pentium-Basis die einzelnen Prozessoren gegenseitig überprüfen.
Sandini Bib Der Pentium
341
Der Tristate-Test-Modus dient zur Prüfung ganzer Boards. Im Tristate-Modus kappt der Pentium alle Ausgangs- und bidirektionalen Verbindungen zu seiner Umgebung. Eine übergeordnete Testlogik kann dann etwaige Fehler einfacher lokalisieren. Sowohl ein Reset als auch eine Initialisierung über INIT setzen verschiedene Register zurück. Tabelle 10.6 gibt die entsprechenden Werte für die einzelnen Register an. Initialisierung
Reset
Initialisierung
ALU/Integer-Register
Wert
Wert
EAX EBX, ECX EDX EBP, ESP ESI, EDI EIP CS DS, ES, FS, GS SS EFLAG CR0 CR2, CR3, CR4 IDTR, TR GDTR, IDTR DR0–DR3 DR6 DR7 TR12 alle anderen
00000000h 00000000h Identifik.1) 00000000h 00000000h 0000fff0h f000h2) 0000h3) 0000h3) 00000002h 60000010h 00000000h 00000000h5) 00000000h5) 00000000h ffff0ff0h 00000400h 00000000h uuuuuuuuh
00000000h 00000000h Identifik.1) 00000000h 00000000h 0000fff0h f000h2) 0000h3) 0000h3) 00000002h4) 00000000h 00000000h5) 00000000h6) 00000000h ffff0ff0h 00000400h 00000000h uuuuuuuuh
Gleitkommaregister Steuerwort Statuswort Tag-Wort FIP, FEA, FOP FCS, FDS FSTACK Caches Cache-TLBs BTB, SDC
0040h 0000h 5555h 00000000h 0000h 0000000000h uuuuuuuuuuu uuuuuuuuuuu uuuuuuuuuuu
vvvvh vvvvh vvvvh vvvvvvvvh vvvvh vvvvvvvvvvh vvvvvvvvvvv uuuuuuuuuuu uuuuuuuuuuu
u: nicht definiert v: unverändert 1) CPU-Identifizierung 00000500h + Modell 2)
Basisadresse = ffff0000h, Limit = ffffh (Segmentdeskriptor-Cache-Register), Zugriffsrechte = 00000093h
3)
Basisadresse = 00000000h, Limit = ffffh (Segmentdeskriptor-Cache-Register), Zugriffsrechte = 00000093h
4)
CD, CW unverändert, Bit4=1, alle anderen=0
5)
Selektor = 0000h, Basisadresse = 00000000h, Limit = ffffh, Zugriffsrechte = 00000082h
6)
Basisadresse = 00000000h, Limit = ffffh
Tab. 10.6: Pentium-Registerinhalte nach einem Reset oder einer Initialisierung
Sandini Bib 342
Kapitel 10
Wie der i386 und der i486 beginnt auch der Pentium nach einem Reset oder Init im Real Mode. Das Paar CS:EIP weist auf die Speicheradresse f000:0000fff0. Zusätzlich werden die zwölf höherwertigen Adressleitungen A31–A20 auf einem hohen Pegel gehalten und der Pentium gibt die physikalische Adresse fffffff0h aus. Nach dem ersten JMP- oder CALL-Befehl über eine Segmentgrenze hinweg fallen die Adressleitungen A31–A20 auf einen niedrigen Pegel ab und der Pentium adressiert nur noch Objekte unterhalb von 1M. Der Pentium lädt das IDTR nach einem Reset mit den Werten 00000000h für die Basis und 03ffh für das Limit. Die Werte entsprechen also dem reservierten Bereich für die Interrupt-Vektortabelle im Real Mode. Mit Hilfe der beiden Befehle LIDT (Load IDTR) und SIDT (Store IDTR) können Sie diese Werte aber ändern und dadurch die Interrupt-Vektortabelle an eine beliebige Stelle des Real-Mode-Adressraums verschieben.
10.3.10 CPU-Identifizierung mit CPUID Ab dem Pentium ist Intel erstmalig einem seit langem bestehenden Programmiereranliegen nachgekommen, nämlich dem Wunsch nach einer einfachen Möglichkeit zur Identifizierung der CPU, auf dem das aktuelle Programm ausgeführt wird. Bis zum i486 ist das nur durch eine umfangreiche Prozedur möglich, die die Möglichkeiten des Prozessors überprüft und dadurch den Prozessortyp ermittelt (z.B. kann auf dem i386 das dort nicht vorhandene AC-Flag natürlich nicht verändert werden, dagegen auf dem i486 schon). Mit dem BIST ab dem i386 ist die Ermittlung des Prozessortyps beim Einschalten für das BIOS nicht besonders schwierig. Der BIST wird aber nur unmittelbar nach einem Reset ausgeführt, sodass ein Programm später keinerlei Möglichkeit hat, auf das BIST-Ergebnis zurückzugreifen. Der CPUID-Befehl des Pentiums, der ebenfalls im i486DX4 implementiert ist, löst das Identifizierungsproblem jetzt in nur wenigen CLKTakten eindeutig. Bevor Sie den CPUID-Befehl ausführen können, müssen Sie zunächst ermitteln, ob die CPU diesen Befehl überhaupt unterstützt. Sonst löst der Prozessor eine Exception ungültiger Opcode aus. Intel hat dazu im EFlag-Register ein neues Flag eingeführt: das ID-Flag. Kann ein Task das IDFlag setzen und löschen, dann unterstützt der installierte Prozessor die CPUID-Anweisung. CPUID liefert neben der Kennung des Pentiums auch Informationen darüber, welche besonderen Funktionen unterstützt werden. Um die CPU-Identifizierung auszuführen, müssen Sie zunächst den Wert 0 in das EAX-Register laden und anschließend den Befehl CPUID auslösen. Der Pentium gibt Ihnen dann in EAX die höchste Identifizierungsebene zurück, die er unterstützt. Das ist gegenwärtig nur die Ebene 1. Die drei Register EBX, EDX und ECX enthalten in dieser Reihenfolge eine 12-Byte-Identifizierung in ASCII-Form: »GenuineIntel«. Zukünftige Clones anderer Hersteller können (in ein oder zwei Jahren) natürlich auch andere Zeichenketten zurückgeben. Wenn Sie anschließend das EAX-Register mit einem Wert 01h laden und den CPUID-Befehl nochmals auslösen, gibt der Pentium im EAX-Register einen Identifizierungswert ähnlich der Identifizierungsinformation im ID-Code-Register der TAP-Steuerung zurück. Das Register EDX enthält zusätzliche Informationen darüber, welche besonderen Funktionen unterstützt werden. In Tabelle 10.7 finden Sie die Aufruf- und Rückgabewerte von CPUID.
Sandini Bib Der Pentium
343
Register
Aufrufwert
Rückgabewert
EAX EBX ECX EDX
00h
01h (max. Identifizierungsebene) »Genu« »ntel« »ineI«
EAX EBX ECX EDX
01h
Identifizierungswert1) reserviert (=0) reserviert (=0) Feature Flags2)
1)
Bits 11...8 Bits 7...4 Bits 3...0
reserviert (=00h) Typ (00b=primärer Pentium ab 75 MHz, 01b=Pentium OverDrive, 10b=Dual (sekundärer) Pentium ab 75 MHz, 11b=reserviert) Prozessorfamilie (05h für Pentium) Modellnummer (01h für 60/66-MHz-Pentium, 02h ab 75 MHz-Pentium) Version (Stepping)
Bits 31...9: Bit 8: Bit 7: Bit 6: Bit 5: Bit 4: Bit 3: Bit 2: Bit 1: Bit 0:
reserviert (=00h) CMPXCHG8B (1=implementiert, 0=nicht implementiert) Machine Check Exception (1=implementiert, 0=nicht implementiert) reserviert modellspezifische Register (1=entsprechend Pentium-CPU, 0=andere) Zeitmarkenzähler (1=implementiert, 0=nicht implementiert) reserviert I/O Breakpoints (1=implementiert, 0=nicht implementiert) reserviert On-Chip-Gleitkommaeinheit (1=On-Chip FPU , 0=keine On-Chip FPU)
2)
Bits 31...14 Bits 13...12
Tab. 10.7: Aufruf- und Rückgabewerte von CPUID
10.3.11 Neue Pentium Exceptions Der Pentium wurde um ein paar Exceptions erweitert, um Zugriffe auf reservierte Bits abzufangen und Hardware-Fehlfunktionen zu berichten. Im Einzelnen betrifft das die folgenden Exceptions.
: : :
Exception 13 – Allgemeiner Protection Fehler: Versucht ein Zugriff, ein reserviertes Bit (vordefinierter Wert 0) in einem Prozessor-Register mit dem Wert 1 zu überschreiben, so löst der Pentium diese Exception aus; Exception 14 – Page-Fehler: Der Pentium löst diese Exception aus, wenn er einen Wert 1 an der Stelle eines reservierten Bits in einem Page Table- oder Page Directory-Eintrag oder einem Page Directory-Zeiger erkennt; Exception 18 – Machine Check Exception: Diese Exception signalisiert Hardware-Fehler des Pentiums selbst. Sie ist in Kapitel 10.7.6 ausführlich beschrieben.
10.4 Der Pentium-Bus Die drei Pentium-Pipelines erreichen einen Befehlsdurchsatz, der einen einfachen Speicherbus völlig überlasten würde. Der Pentium-Bus ist daher auf einen schnellen Second-Level Cache ausgerichtet. Häufig erforderliche Befehle und Daten werden darüber hinaus in den beiden On-ChipCaches bereitgehalten. Um diese Caches auch schnell genug nachladen oder zurückschreiben zu
Sandini Bib 344
Kapitel 10
können, ist der Pentium-Datenbus auf 64 Bit verbreitert worden. Trotzdem kann der Pentium mit Hilfe der Byte-Enable-Signale BE7–BE0 wie seine Vorgänger auch individuelle Bytes, Worte oder Doppelworte ansprechen. Jeder Buszyklus adressiert aber über A31–A3 den Speicher an Quadwortgrenzen, also in Vielfachen von acht (0, 8, 16, ...). Zugriffe auf Speicherobjekte, die sich über eine solche Grenze hinweg erstrecken (so genannte Misaligned-Zugriffe) werden vom Pentium in zwei aufeinanderfolgende Zugriffe aufgeteilt. Der Pentium versucht, Speicherzugriffe so weit wie möglich als Cache-Line-Fills oder WriteBacks auszuführen. Nur Zugriffe auf den I/O-Adressraum und nicht-cachebare Adressbereiche im SpeicherAdressraum (wie z.B. Registeradressen bei Memory-Mapped-I/O) werden als Einzeltransferzyklen ausgeführt. Die im folgenden Abschnitt 10.4.1 beschriebenen Einzeltransferzyklen sind also eher die Ausnahme. Der bereits vom i486 her bekannte Burst-Modus ist auf das Schreiben von Daten erweitert worden (der i486 erlaubte nur Burst-Lesezugriffe). Zusammen mit dem verbesserten Adress-Pipelining ist die maximale Datentransferrate auf 528 MioByte (bei 66 MHz) erhöht worden. Im Gegensatz zu den Speicherzugriffen sind die Zugriffe auf den I/O-Adressraum nicht auf 64 Bits erweitert worden. Die maximale Breite beträgt hier wie beim i386 oder i486 lediglich 32 Bit. I/O-Zugriffe laufen nämlich prinzipiell nicht über den On-Chip-Daten-Cache, sondern werden immer von direkt einem 32-Bit-Register zum Bus »durchgeschaltet«. Natürlich kann der Pentium auch 8- oder 16-Bit-Ports ansprechen. Das I/O-Subsystem muss die Portadressbits A2–A0 aus den Byte-Enable-Signalen BE7–BE0 dekodieren.
10.4.1
Einzeltransferzyklen
Die Einzeltransferzyklen zum Lesen und Schreiben von Daten stellen die einfachsten Speicherzugriffszyklen dar. Sie übertragen einen 8-, 16-, 32- oder 64-Bit-Wert zwischen Speicher und Pentium. Ein solcher Pentium-Buszyklus unterscheidet sich abgesehen von der größeren Breite seines Datenbusses nicht von dem des i386 oder i486. Für einen Einzeltransfer hält er CACHE auf einem hohen Pegel, um anzuzeigen, dass kein Line Fill ausgeführt wird. Auch die Pentium-Schreibzyklen unterscheiden sich für einen Einzeltransfer nicht wesentlich von dem des i386 oder i486. Das Signal CACHE ist wieder inaktiv, weil wieder ein Einzeltransferzyklus vorliegt. Zusätzlich gibt der Pentium noch die Schreibdaten und die notwendigen Paritätsbits aus. Im Einzeltransfermodus (Lesen und Schreiben) benötigt ein Datentransfer ohne Wait States mindestens zwei CLK-Zyklen. Das führt bei einer Datenbusbreite von 64 Bit zu einer maximalen Datenübertragungsrate von 264 MByte/s. Im Pipelined-Burst-Modus wird sie auf 528 MByte/s oder 504 MByte/s verdoppelt.
10.4.2
Burst-Zyklen
Für die Übertragung größerer Datenmengen im Rahmen von Cache-Line-Fills oder Write-Backs implementiert der Pentium einen Burst-Modus ähnlich wie beim i486. Im Gegensatz zum i486 kann der Blockmodus also auch für Write-Back-Zyklen benutzt werden. Für den Write-ThroughCache des i486 ist das nicht notwendig, weil jeder Schreibzugriff zum Speichersubsystem durchgeschaltet wird. Auch sonst ergeben sich ein paar Unterschiede. Prinzipiell laufen alle cachebaren Lesezyklen sowie alle Write-Back-Zyklen im Burst-Modus ab. Durch die Erweiterung des Datenbusses auf 64 Bit werden mit einem Burst-Zyklus im Rahmen von vier Buszyklen 32 Byte übertra-
Sandini Bib Der Pentium
345
gen. Sie sind zusammenhängend und liegen jeweils an 32-Byte-Grenzen (das ist gerade eine Cache-Line der beiden On-Chip-Caches). Ein Burst-Zyklus wird wie beim i486 durch einen ersten normalen Speicherzugriff eingeleitet, der zwei Taktzyklen benötigt. In Abbildung 10.13 sehen Sie den Verlauf der wichtigsten Signale für einen Burst-Lesezyklus. Für einen Burst-Lesezyklus sind zusätzlich noch das Pentium-Signal CACHE und das Signal KEN vom Speichersubsystem wichtig. Durch ein aktives CACHE-Signal mit niedrigem Pegel zeigt der Pentium dem Subsystem an, dass er das adressierte Objekt in den On-Chip-Cache übertragen möchte. Aktiviert das Speichersubsystem das Signal KEN, so erweitert der Pentium den begonnenen Einzellesetransfer automatisch und selbstständig zu einem Cache-Line-Fill, um einen ganzen Datenblock mit dem adressierten Objekt im On-Chip-Cache abzulegen. Zyklus 1 T1
Zyklus 2 Zyklus 3 Zyklus 4
T2
T2
T2
T2
CLK A31...A3 BE7...BE0
Adresse
gültig
ADS CACHE W/R KEN BRDY D63...D0
Daten
Daten
Daten
Daten
DP7...DP0
Parität
Parität
Parität
Parität
Abb. 10.13: Burst-Lesezyklus ohne Wartezyklen und Pipelining: Im Burst-Modus wird der Buszyklus für einen 32Byte-Adressbereich ab dem zweiten Zugriff von zwei auf einen Prozessortakt verkürzt. Dadurch kann eine Cache-Line der internen Caches sehr schnell gefüllt oder zurückgeschrieben werden. Der dargestellte Zyklus betrifft einen 2-1-1-1-Burst.
Wie ich bereits erwähnt habe, ist ein Burst-Zyklus auf einen Adressbereich beschränkt, der an einer 32-Byte-Grenze beginnt. Mit der ersten ausgegebenen Adresse sind dadurch auch die drei anderen Burst-Adressen implizit bekannt. Das Subsystem muss sie also nicht erst dekodieren, sondern kann sie selbst erzeugen. Das geht erheblich schneller und erst dadurch ist die Verkürzung auf einen Taktzyklus möglich. Der Pentium treibt die Adress- und BEx-Signale im BurstModus daher nur im ersten Zyklus; für die folgenden drei Buszyklen werden sie nicht mehr verändert. (Der i486 dagegen adressiert auch im Burst-Modus noch die Daten innerhalb der 16-Byte-Gruppe über die Adresssignale A3–A2 und BE3–BE0.) Beim Pentium ist die Reihenfolge der Adressen im Burst-Modus in Abhängigkeit von der ersten Adresse fest definiert. Der erste Zugriff kann ja auf eine Datengruppe zielen, die nicht an einer
Sandini Bib 346
Kapitel 10
32-Byte-Grenze ausgerichtet ist. Erst im Verlauf des ersten Transferzyklus entscheidet sich durch KEN, ob ein Einzel- oder Burst-Transfer vorliegt. Dann ist das erste Quadwort aber schon übergeben worden. Die entsprechend der Tabelle 10.8 festgelegte Adressenreihenfolge ist nicht zyklisch, sondern so gewählt, dass ein 2-Wege-Interleaving von DRAM-Hauptspeichern unterstützt wird. vom Pentium ausgegebene erste Adresse
zweite Adresse
dritte Adresse
letzte Adresse
0h 8h 10h 18h
8h 0h 18h 10h
10h 18h 0h 8h
18h 10h 8h 0h
Tab. 10.8: Adressenreihenfolge beim Burst-Lesezyklus
Das externe Speichersubsystem berechnet nach der Dekodierung der Startadresse die angegebene Adressenreihenfolge selbstständig und führt alle weiteren Zugriffe entsprechend aus. Der Pentium setzt das voraus und verteilt die vom Subsystem gelieferten 64-Bit-Daten auf die zugehörigen Quadworteinträge in der betreffenden Cache-Line. Beim i486 wird ein Burst-Modus explizit durch ein BLAST (das beim Pentium nicht mehr vorgesehen ist) im ersten Zyklus eingeleitet, KEN allein führt noch zu keinem Burst-Zyklus. Außerdem beginnt ein Burst-Transfer beim i486 immer an einer 16-Byte-Grenze. Der Write-Back-Daten-Cache des Pentiums fordert, dass auch Schreibtransfers im Burst-Modus ausgeführt werden. Abbildung 10.14 zeigt den Signalverlauf für einen solchen Zugriff im BurstModus. Zyklus 1 T1
Zyklus 2 Zyklus 3 Zyklus 4
T2
T2
T2
T2
CLK A31...A3 BE7...BE0
Adresse
gültig
ADS CACHE W/R KEN BRDY D63...D0 DP7...DP0
Schreibdaten Schreibdaten Schreibdaten Schreibdaten Parität
Parität
Parität
Parität
Abb. 10.14: Burst-Schreibzyklus ohne Wartezyklen und Pipelining: Der Pentium nutzt den Burst-Modus auch für das Zurückschreiben von Cache-Lines. Der dargestellte Zyklus betrifft einen 2-1-1-1-Burst.
Wie Sie sehen, stimmt der Signalverlauf fast vollständig mit dem Burst-Lesezyklus überein. Nur gibt der Pentium hier ein Signal W/R mit hohem Pegel aus. Das KEN-Signal hat natürlich keine
Sandini Bib Der Pentium
347
Bedeutung, weil alle im On-Chip-Cache vorhandenen Daten offensichtlich cachebar sind. Ein Burst-Schreibzyklus betrifft immer einen Write-Back-Zyklus für eine modifizierte Line im DatenCache. Weil bei Burst-Schreibzyklen, die ja ausschließlich die Folge von Write Backs sind, die erste ausgegebene Adresse stets auf eine 32-Byte-Grenze zeigt, gibt es nur die ersten Adressenreihenfolgen nach Tabelle 10.8, also 00h->08h->10h->18h. Maximal können in einem Burst-Zyklus 32 Byte übertragen werden, wozu insgesamt vier Buszyklen notwendig sind. In einem 2-1-1-1-Burst-Zyklus benötigt der Pentium dazu 2+3=5 Taktzyklen. 32 Byte in fünf Taktzyklen zu je 16 ns beim 66-MHz-Pentium entsprechen einer BurstÜbertragungsrate von etwa 403 MByte/s (oder 422 MByte/s). Das in Kapitel 10.4.3 beschriebene Adress-Pipelining verkürzt auch den ersten Burst-Buszyklus auf einen einzigen CLK-Zyklus, sodass nur noch vier Taktzyklen erforderlich sind. Das entspricht einer Übertragungsrate von 504 MByte/s oder 528 MioByte/s. Bemerken möchte ich noch, dass über das Signal BRDY auch im Burst-Modus Wartezyklen auftreten können, wenn das Speichersubsystem nicht schnell genug folgen kann. Ein solcher Zugriff wird als Slow-Burst-Zyklus bezeichnet und kann z.B. zu einem 3-2-2-2-Burst führen.
10.4.3
Pentium-Adress-Pipelining
Der Pentium implementiert ein Adress-Pipelining zur weiteren Erhöhung des Datendurchsatzes und seiner Busbandbreite, das im Prinzip bereits mit dem 80286 eingeführt wurde. Der Pentium kann sich bis zu zwei ausstehende Buszyklen »merken« und sie dann mit Hilfe des Adress-Pipelinings schnell nacheinander ausführen. Die Befehlsausführung in den CPU-Pipelines und z.B. die Cache-Line-Fills oder Write-Backs sollen schließlich so weit wie möglich entkoppelt werden. Cache-Line-Fill #1 T1
CLK A31...A3 BE7...BE0 ADS
T2
T2
Cache-Line-Fill #2 T2
T12
T2P
Adresse #1 gültig
T2
T2
T2
Tx
Adresse #2 gültig
CACHE W/R KEN NA BRDY D63...D0 DP7...DP0
Daten #1
Daten #1
Daten #1
Daten #1
Daten #2
Daten #2
Daten #2
Daten #2
Parität
Parität
Parität
Parität
Parität
Parität
Parität
Parität
Abb. 10.15: Pipelined Cache-Line-Fills im Burst-Modus ohne Wartezyklen: Die Abbildung zeigt zwei aufeinanderfolgende Cache-Line-Fills. Durch das Adress-Pipelining überlappen die beiden Fills und der Datentransfer kann im zweiten Fall innerhalb von vier CLK-Zyklen ausgeführt werden.
Ein besonderes Kennzeichen des Adress-Pipelinings beim Pentium ist, dass auch der erste Buszyklus im Burst Mode auf einen einzigen Taktzyklus verkürzt werden kann, wodurch die Datenübertragungsrate nochmals um 25% ansteigt. Genauer gesagt wird der erste Burst-Transferzyklus je nach seiner Dauer mit dem oder den letzten Datentransferzyklen des vorangegangenen
Sandini Bib 348
Kapitel 10
Zyklus überlappt, sodass die effektive Länge des ersten Zyklus auf einen Taktzyklus sinkt. Abbildung 10.15 zeigt zwei aufeinander folgende Cache-Line-Fills im Burst Mode mit aktivem Adress-Pipelining. Wie beim i386 wird das Adress-Pipelining durch das Signal NA (Next Address) gesteuert. Wenn das adressierte Subsystem die aktuelle Adresse dekodiert hat und bereit ist, die Adresse für den folgenden Zugriff zur Dekodierung zu übernehmen, gibt es ein aktives NA-Signal an den Pentium zurück. Das Subsystem kann die neu ausgegebene Adresse dekodieren, während die dritte Datenübergabe für den vorherigen Burst noch im Gang ist. Unmittelbar nach der Übergabe der letzten acht Byte von Cache-Line-Fill #1 liefert das Speichersubsystem bereits die Daten (und die Parität) für Cache-Line-Fill #2, sodass ein CLK-Zyklus eingespart wird. Zwei oder mehr solcher Bursts können aufeinanderfolgen, wenn ein Task Switch ausgeführt wird und ein ganzes TSS abgespeichert und ein neues geladen werden muss. Dadurch wirken sich z.B. langsame 4-1-1-1Bursts nur für den ersten Blockzugriff aus; die Adressierungsphase aller nachfolgenden Bursts wird mit der Datenphase des vorangehenden Bursts überlagert. Dadurch werden praktisch drei der vier Adressierungszyklen vorgezogen, und es bleibt nur noch ein effektiver Zyklus übrig (3+1=4). Auch Burst-Schreibzyklen und Einzeltransfers können Adress-Pipelining verwenden. Der Pentium überwacht, wie viele BRDY übergeben worden sind, und weiß damit, in welchem Burst er sich gerade befindet. Maximal dürfen zwei Buszyklen (Einzeltransfer, Burst-Transfer) auf einmal aktiv sein.
10.4.4
Sonderzyklen
Der Pentium kann neben den Datenübertragungszyklen auch Sonderzyklen auf den Bus treiben, um bestimmte interne Vorgänge anzuzeigen. Ein Sonderzyklus liegt vor, wenn der Pentium die Signale D/C und M/IO auf einen niedrigen Pegel und das Signal W/R auf einen hohen Pegel legt. Gegenüber dem i486 sind zwei Sonderzyklen hinzugekommen. In Tabelle 10.9 sind alle sechs Sonderzyklen aufgeführt. BE7
BE6
BE5
BE4
BE3
BE2
BE1
BE0
Sonderzyklus
Ursache
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 0
1 1 1 1 0 1
1 1 1 0 1 1
1 1 0 1 1 1
1 0 1 1 1 1
0 1 1 1 1 1
Shutdown Flush Halt Write-Back Flush-Acknowledge Branch-Trace-Message
Triple-Fault, Paritätsfehler INVD, WBINVD HLT-Befehl WBINVD-Befehl FLUSH-Signal Verzweigung
Tab. 10.9: Die Pentium-Sonderzyklen (D/C=M/IO=0, W/R=1)
Das externe System muss solche Sonderzyklen wie gewöhnliche Buszyklen durch ein aktives BRDY bestätigen. Im Folgenden möchte ich die Bedeutung und Ursache der beiden neuen Sonderzyklen kurz erläutern. Ein neuer Sonderzyklus, der das Zurückschreiben und Invalidieren des On-Chip-Daten-Caches betrifft, ist der Flush-Acknowledge-Sonderzyklus (11101111). Der Pentium treibt diesen Sonderzyklus, wenn eine externe Einheit (z.B. der Systemcontroller) dem FLUSH-Eingang ein aktives Signal mit niedrigem Pegel zugeführt hat, um ein Write-Back und eine Cache-Invalidierung auszulösen und der Pentium diese Vorgänge ausgeführt hat. Dadurch kann der Systemcontroller ein Cache-Flush durch Software (ein INVD oder WBINVD) von einem Cache-Flush durch Hardware
Sandini Bib Der Pentium
349
(ein aktives FLUSH-Signal) unterscheiden. Der Flush-Acknowledge-Zyklus gibt wie der WriteBack-Sonderzyklus ein Zurückschreiben und Invalidieren der Cache-Lines an, der Flush-Sonderzyklus dagegen lediglich die Invalidierung. Der Pentium löst einen Branch-Trace-Message-Sonderzyklus (11011111) aus, wenn im Testregister TR12 das ETE-Bit (Execution Tracing Enable) gesetzt ist und der Pentium unmittelbar vorher eine Verzweigung ausgeführt hat. Im Branch-Trace-Message-Sonderzyklus gibt der Pentium außerdem noch die lineare Adresse des Verzweigungsziels an seinen Adressanschlüssen A31–A3 und den Branch-Target-Anschlüssen BT2–BT0 aus. Das Signal an BT3 zeigt dann noch an, ob die Standardoperandengröße gleich 32 Bit (BT3=1) oder 16 Bit (BT3=0) ist. Der Branch-TraceMessage-Sonderzyklus ist Teil des Execution Tracings (»Programmausführungsverfolgung«).
10.4.5
Abfragezyklen und internes Snooping
Die Abfrage- oder Inquire-Zyklen sind Teil der Hardware-Unterstützung des MESI-Protokolls. Sie sollen es einer externen Einheit ermöglichen, festzustellen, ob die Daten einer bestimmten Adresse in den On-Chip-Caches des Pentiums gespeichert sind. Außerdem kann die externe Einheit die zugehörige Cache-Line invalidieren. Für einen Abfragezyklus aktiviert die externe Einheit zunächst das Signal AHOLD. Nach zwei CLK-Zyklen legt sie die (physikalische) Adresse der abzufragenden Daten auf A31–A5 an den Pentium an. A4 und A3 werden ignoriert, weil in einem Abfragezyklus stets eine ganze CacheLine adressiert wird. Mit einem aktiven EADS übernimmt der Pentium die anliegende Adresse als Abfrageadresse. Zusätzlich zur Adresse A31–A5 muss auch noch das Signal INV zugeführt werden. Es zeigt an, ob im Fall eines Abfrage- oder Inquire-Treffers die »getroffene« Cache-Line invalidiert (INV=1) oder als Shared markiert (INV=0) werden soll. Für Abfragefehltreffer hat INV keine Bedeutung. Die Tag-Logik der On-Chip-Caches prüft wie gewöhnlich, ob die Adresse im Tag-Speicher und damit der entsprechende Wert im On-Chip-Cache vorhanden ist. Wenn im Code oder Daten-Cache ein Treffer aufgetreten ist, gibt der Pentium am HIT-Anschluss ein aktives Signal mit niedrigem Pegel aus, sonst ein Signal mit hohem Pegel. Wenn ein Treffer für eine modifizierte Cache-Line vorliegt (was nur für den Daten-Cache möglich ist), aktiviert der Pentium seinen HITM-Ausgang (Hit Modified). In diesem Fall schreibt der Pentium die getroffene Line in den Speicher zurück und löst dazu einen Burst-Write-Back-Zyklus aus. Dadurch erhält das abfragende System die aktuellsten Daten. Neben solchen extern (durch EADS) getriebenen Abfragezyklen gibt es auch internes Snooping. Dadurch wird eine Konsistenzprüfung der beiden voneinander unabhängigen On-Chip-Caches ausgeführt. Vor allem im Real Mode können dieselben Daten einmal als indirekte Folge des Prefetchings im Code-Cache und zusätzlich noch im Daten-Cache vorhanden sein. Internes Snooping tritt in drei Fällen auf.
: : :
Der CPU-Kern des Pentium greift auf den Code-Cache zu und dieser Zugriff ist ein Fehltreffer. Der CPU-Kern greift auf den Daten-Cache zu und dieser Zugriff ist ein Fehltreffer (lesender Zugriff) oder ein Write-Through (schreibender Zugriff) in den L2-Cache oder Hauptspeicher; Das A- oder D-Bit (Accessed bzw. Dirty) eines Page Table- oder Page Directory-Eintrags ist als Folge eines Zugriffs oder einer Änderung der entsprechenden Page überschrieben worden.
Sandini Bib 350
10.4.6
Kapitel 10
Interne Pentium-Buspuffer
Zur Entlastung des externen Busses und zur Vermeidung von unnötigen Wartezeiten, wenn der Bus gerade belegt ist, weist der Pentium (ähnlich wie der i486) mehrere interne Puffer auf. Die Busschnittstelle des Pentiums besitzt zwei 64-Bit-Schreibpuffer, wobei jeder Puffer einer der beiden Pipelines u und v zugeordnet ist. Sie sollen ein Ausbremsen der Pentium-Pipelines verhindern, wenn der externe Bus gerade nicht zur Verfügung steht. Ursache kann ein aktives Cache-Line-Fill oder ein simultaner Speicherzugriff beider Pipelines (u und v) sein. Lediglich Speicherzugriffe werden in den Schreibpuffern zwischengespeichert, nicht aber Zugriffe auf den I/O-Adressraum. Sie gehen direkt zum Bus. Neben den zwei 64-Bit-Schreibpuffern sind im Pentium drei 32-Byte-Write-Back-Puffer integriert, die entsprechend den drei möglichen Ursachen von Write Backs gebildet sind (externe Snoops, interne Snoops, Cache-Line-Ersetzung). Sie nehmen jeweils eine vollständige CacheLine auf und unterstützen den Pentium beim Zurückschreiben von Cache-Lines. Zusätzlich zu den bisherigen fünf Schreibpuffern sind noch zwei Line-Fill-Puffer vorhanden. Sie sind jeweils 32 Byte (eine Cache-Line) breit und dem Daten-Cache bzw. dem Code-Cache zugeordnet. Wenn der Pentium eine ganze Cache-Line in einem Burst-Zyklus in den On-Chip-Datenoder Code-Cache einliest, dann füllt die Busschnittstelle die On-Chip-Caches nicht sukzessive mit den übergebenen 8-Byte-Gruppen auf, sondern überträgt sie zunächst in den zugeordneten Line-Fill-Puffer. Erst wenn alle 32 Byte der betreffenden Cache-Line im Line-Fill-Puffer abgelegt sind, wird die gesamte Cache-Line in einem Rutsch zum Code oder Daten-Cache übertragen.
10.5 Der System-Management-Mode des Pentium Für den System Management Mode sind zwei Pentium-Anschlüsse reserviert, nämlich SMI (Eingang) und SMIACT (Ausgang). Aktiviert wird der System-Management-Mode durch den System-Management-Mode-Interrupt SMI. Der Pentium tritt in den SMM ein, sobald er ein aktives SMI-Signal mit niedrigem Pegel an seinem SMI-Eingang erkennt. Den SMM kann der Pentium nur über einen expliziten Befehl RSM (Resume from System Management Mode) wieder verlassen. Der SMI ist als Interrupt implementiert und wird dadurch nur an Befehlsgrenzen erkannt. Nur die als Interrupts konzipierten R/S und FLUSH haben eine höhere Priorität als der SMI. Nach der Erfassung eines aktiven SMI-Signals wartet der Pentium zunächst auf den Abschluss aller Speicherungsvorgänge, bis EWBE aktiviert ist. Nun gibt der Pentium am SMIACT-Ausgang solange ein Signal mit niedrigem Pegel aus, wie er im SMM arbeitet. Unmittelbar anschließend sichert der Pentium seine aktuellen Registerwerte im Speicher (beginnend an der physikalischen Adresse 3ffa8h) ab und initialisiert sich für den System-Management-Mode. Diese SMM-Initialisierungswerte sind in Tabelle 10.10 angegeben. Register
Wert
EAX, EBX, ECX, EDX, EBP, ESI, EDI EFlag EIP CS DS, ES, FS, GS, SS
undefiniert undefiniert 00000002h 00008000h 3000h (Basisadresse=30000h) 0000h (Basisadresse=00000000h, Limit=ffffffffh, Standardgröße=16 Bits)
Tab. 10.10: SMM-Initialisierungswerte
Sandini Bib Der Pentium
351
Register
Wert
CR0 CR4 DR6 DR7 GDTR, LDTR, IDTR, TR
PE=EM=TS=PG=0, Rest unverändert 00000000h undefiniert 00000400h undefiniert
Tab. 10.10: SMM-Initialisierungswerte (Forts.)
10.5.1
Die SMM-RAM-Struktur
Für den System Management Mode ist vorgesehen, dass in den Adressbereich zwischen 30000h und 3ffffh SMM-Speicher (bei Stromsparfunktionen auch batteriegepufferter SRAM) eingeblendet wird, der die dort normalerweise vorhandenen DRAM-Speicheradressen benutzt. Die externe Hardware kann zu diesem Zweck das SMIACT-Signal z.B. als Chip-Select-Signal verwenden und abhängig davon die SRAM-Chips (SMIACT auf niedrigem Pegel) oder den gewöhnlichen Hauptspeicher (SMIACT auf hohem Pegel) adressieren. Durch SMIACT werden SMM-Speicher und normaler Speicher vollständig voneinander getrennt (das ist natürlich rein optional, die externe Hardware kann SMIACT einfach ignorieren). Der SMM-RAM ist logisch so aufgeteilt, wie in Abbildung 10.16 dargestellt ist. Diese Struktur ist fest in die Pentium-Hardware implementiert. 3000:ffffh 3000:fe00h 3000:fdffh
CPU-Registerauszug Code und Daten des SMI-Handlers
3000:8000h 3000:7fffh
Handler-Einsprungpunkt
optionale 32kByteSMM-RAM-Erweiterung 3000:0000h
Abb. 10.16: Die logische Struktur des SMM-RAMs
Die unteren 32 KByte zwischen den Adressen 30000h und 37fffh sind optional. Bei der Adresse 3000:8000h befindet sich Einsprungpunkt des SMM-Handlers, den der Pentium mit jedem SMI anspringt (das Segment 3000h wird als SMBASE während des Resets festgelegt, kann aber überschrieben werden). Die 32.256 Byte zwischen 3000:8000h und 3000:fdffh sind für Code und Daten des SMI-Handlers verfügbar. Dort befinden sich z.B. die ganzen Routinen zum Sichern des Speicherinhalts auf Platte oder zur Deaktivierung einzelner Komponenten. Beachten Sie, dass der Pentium auch Adressen außerhalb des 64-KByte-SMM-RAM erzeugen und dann auch im System-Management-Mode auf Daten außerhalb des für den SMM reservierten Bereichs zugreifen kann. Über dem Handler-Bereich befindet sich noch der CPU-Registerauszug mit 512 Byte. In diesen Bereich sichert der Pentium beim Eintritt in den System-Management-Mode automatisch alle
Sandini Bib 352
Kapitel 10
Registerwerte. Sie sind für die Wiederherstellung des ursprünglichen Zustands notwendig. Durch einen RSM-Befehl stellt der Pentium den Zustand unmittelbar vor dem SMI wieder her und nimmt den unterbrochenen Task wieder auf. In Tabelle 10.11 ist der Registerauszug im SMM-RAM angegeben. Beachten Sie, dass sich die Offsets auf das Segment 3000h beziehen. Offset
Registerinhalt
Offset
Registerinhalt
fffch fff8h fff4h fff0h ffech ffe8h ffe4h ffe0h ffdch ffd8h ffd4h ffd0h ffcch ffc8h ffc4h ffc0h
CR0 CR3 Eflag EIP EDI ESI EBP ESP EBX EDX ECX EAX DR6 DR7 TR LDTR
ffbch ffb8h ffb4h ffb0h ffach ffa8h ff98h-ffa7h ff94h ff8ch-ff93h ff88h ff04h-ff87h ff02h ff00h fefch fef8h fe00h-fef7h
GS FS DS SS CS ES reserviert IDT-Basis reserviert GDT-Basis reserviert Halt-Auto-Restart I/O-Trap-Restart SMM-Identifizierung Registerauszugbasis reserviert
Tab. 10.11: Pentium-Registerauszug im SMM-RAM
Neben den gesicherten Registern sind im Registerauszug auch noch die vier Steuerfelder HaltAuto-Restart, I/O-Trap-Restart, SMM-Identifizierung und Registerauszugbasis vorhanden. Ein Wert 1 des Eintrags Halt-Auto-Restart (Offset ff02h) zeigt an, dass der Pentium zum Zeitpunkt des SMIs im Halt-Zustand war. Sie können Halt-Auto-Restart löschen, sodass der Pentium nach einer Rückkehr aus dem SMM die Programmausführung nach der Halt-Anweisung wieder aufnimmt. Es ist möglich, dass der SMI eine I/O-Anweisung unterbricht. Wenn Sie einen Wert ffffh in den I/O-Trap-Restart (Offset ff00h) schreiben, führt der Pentium die unterbrochene I/OAnweisung nach einer Rückkehr über RSM nochmals aus. Der Eintrag SMM-Identifizierung (Offset fetch) gibt die Überarbeitungsstufe und den Funktionsumfang des implementierten System Management Modes an. Der Pentium besitzt ein internes Register, das die Basisadresse für den Registerauszug speichert; es wird auf den Wert 30000h initialisiert. Der aktuelle Wert wird beim Eintritt in den System Management Mode im Eintrag Registerauszugbasis (Offset fef8h) abgelegt und nach einem RSM von dort wieder in das Register geladen. Sie können den Wert in diesem Eintrag im SMM-RAM und dadurch die Basis des SMM-RAMs im 4-GByte-Adressraum ändern. Der neue Wert wird aber erst mit dem nächsten SMI aktiv. Ein INIT setzt die Registerauszugbasis nicht zurück, das geht nur über ein Reset (oder ein erneutes explizites Überschreiben).
10.5.2
Programmausführung im System-Management-Mode
Wie aus Tabelle 10.11 ersichtlich ist, werden beim Eintritt in den System-Management-Mode sowohl das Protection-Enable-Bit PE als auch das Paging-Bit PG gelöscht und der Pentium beginnt im SMM in einem erweiterten Real Mode bei 3000:8000h. Der einzige Unterschied zum »echten« Real Mode ist, dass der SMM-Adressraum nicht auf 1M beschränkt ist, sondern alle 32
Sandini Bib Der Pentium
353
Bits benutzt werden können. Im SMM erkennt der Pentium ein FLUSH und führt eine CacheLeerung aus. Auch NMI und INIT werden erkannt, aber lediglich gespeichert. Erst nachdem der Pentium den SMM wieder verlassen hat, werden NMI und INIT bedient. Standardmäßig arbeitet der SMM mit 16-Bit-Operanden und 16-Bit-Adressen. Sie können aber Präfixe benutzen, um 32-Bit-Operanden und 32-Bit-Adressen zu erzeugen. Beachten Sie, dass mit den Segmentregistern allein nur Adressen innerhalb des ersten MBytes des Speichers möglich sind. Schließlich werden die 16-Bit-Segmentwerte einfach um vier Bits verschoben. Erst die 32-Bit-Offsetregister ermöglichen 32-Bit-Adressen bis 4G-1.
10.5.3
Rückkehr aus dem System-Management-Mode
Der Pentium verlässt den System-Management-Mode nur nach einem expliziten Befehl RSM (Resume from System-Management-Mode). Durch Deaktivieren von SMI kann der Pentium dagegen nicht in den unterbrochenen Zustand zurückversetzt werden. Der RSM-Befehl ist nur im SMM gültig. In allen anderen Modi führt er zu einer Exception ungültiger Opcode. Achten Sie bei einer Manipulation des Registerauszugs im SMM-RAM darauf, dass keine inkonsistenten Werte vorhanden sind, sonst ist ein Shutdown die Folge.
10.6 Code-Optimierungen Eine volle Ausnutzung der Superskalararchitektur und des Befehls-Pipelinings ist nur möglich, wenn der Programmcode auf den Pentium-Aufbau abgestimmt ist. Wie ich bereits erwähnt habe, dient z.B. die Verzweigungsvorhersage unter anderem dazu, bereits existierenden 80x86Code auf dem Pentium möglichst schnell ausführen zu können. Bereits in Binärform vorliegende Codes können nicht oder nur sehr schwer nachträglich optimiert werden. Einfacher ist das schon für Quellprogramme, die in einer Hochsprache erstellt worden sind. Ein für den Pentium optimierender Compiler kann dann bei der Compilierung besseren Code erzeugen, der z.B. beide Pipelines auslastet und zu möglichst wenig Hemmungen führt. Die Entwicklung von Compilern und System-Software wird vom Pentium über das Performance Monitoring unterstützt. Damit können z.B. interne Trefferraten der On-Chip-Caches und der Befehlsfluss durch die Pipelines überwacht werden. Aber bereits einfache Regeln für die Verwendung oder Nichtverwendung bestimmter Befehle, Register und Adressierungen beschleunigen die Programme deutlich.
10.6.1
Einfache Straight-Forward-Optimierungen
In diesem Abschnitt möchte ich ein paar einfache, aber in ihrer Summe dennoch wirkungsvolle Code-Optimierungen angeben. Ursache für deren Vorteil sind in den meisten Fällen die Superskalararchitektur des Pentiums und das Befehls-Pipelining. Adresserzeugungs-Interlocks AGI Vermeiden Sie soweit wie möglich Registerabhängigkeiten, vor allem bei der Adresserzeugung über Register, wie z.B. SUB ebx, 0008h MOV eax, [ebx]
Sie führen zu so genannten Adresserzeugungs-Interlocks AGI (Address Generation Interlock). Obwohl beide Befehle im Prinzip in nur einem Takt ausgeführt werden können, muss der MOVBefehl in der Dekodierungsstufe D2 einen Takt warten, weil die Adresse [ebx] erst berechnet
Sandini Bib 354
Kapitel 10
werden kann, wenn der SUB-Befehl die WB-Stufe erreicht hat. Wegen der Registerabhängigkeit über ebx können die beiden Befehle SUB und MOV auch nicht gepaart werden. Das ergibt bereits die erste Verzögerung; die beschriebene Verzögerung um einen Taktzyklus tritt zusätzlich auf. Gegenüber der Befehlsfolge SUB edx, 0008h MOV eax, [ebx]
benötigen die oben angeführten zwei Befehle SUB ebx, 0008h und MOV eax, [ebx] also zwei zusätzliche Taktzyklen: einen wegen der Registerabhängigkeit über ebx und einen zusätzlichen durch die verzögerte Adressberechnung für [ebx]. Beachten Sie, dass die Befehle, die zu einer solchen zusätzlichen Verzögerung führen können, nicht unbedingt aufeinanderfolgen müssen. Durch die beiden parallelen Pipelines u und v kann der Abstand bis zu drei Befehle betragen, wenn alle gepaart werden dürfen, z.B.: (u-Pipeline) SUB ebx, 000h DEC edi
(v-Pipeline) INC ecx MOV eax, [ebx]
Bei dieser (zugegebenermaßen etwas konstruierten) Befehlsfolge benötigt der MOV-Befehl in der zweiten Zeile das Ergebnis von SUB in der ersten Zeile für die Adressberechnung. Die vier Befehle treten im Befehlsstrom in der folgenden Reihenfolge auf: SUB INC DEC MOV
ebx, 000h ecx edi eax, [ebx]
Das heißt, der erste Befehl SUB erzeugt eine Verzögerung der Adressberechnung drei Befehle später (nämlich für MOV eax, [ebx]). Beachten Sie, dass häufig auch implizite Registerzugriffe auftreten, die im Befehl bereits codiert sind und dadurch im mnemonischen Code nicht explizit auftreten, z.B. PUSH, POP oder MUL. Die beschriebenen Verzögerungen bei der Adressberechnung lassen sich durch Umordnen des Codes meistens beseitigen; optimierende Compiler für den Pentium machen das natürlich automatisch. Daten-Alignment Durch die Möglichkeit von Split-Line-Zugriffen auf den On-Chip-Code-Cache des Pentiums müssen die Codes nicht mehr nach Cache-Line-Grenzen ausgerichtet werden, damit sie keine Zugriffsverzögerungen verursachen. Dagegen werden Fehlausrichtungen der Daten im OnChip-Daten-Cache mit drei zusätzlichen Taktzyklen bestraft. Das ist auch besonders schlimm, weil Datenzugriffe von einem Befehl angewiesen werden, der sich bereits in einer der Pipelines befindet und dadurch jede Zugriffsverzögerung mit einem Anhalten der Pipeline verbunden ist. Verzögerte Code-Zugriffe werden dagegen durch die großen Prefetch-Puffer abgefedert. Für die Ausrichtung (Computerdeutsch: das Alignment) der Daten gelten folgende Regeln:
: : :
16-Bit-Worte müssen vollständig in einem ausgerichteten Doppelwort enthalten sein, die beiden niedrigstwertigen Adressbits A1/A0 dürfen also nur die Kombinationen 00b, 01b, 10b aufweisen; 11b führt zu einem Misalignment. 32-Bit-Doppelworte müssen an 4-Byte-Grenzen ausgerichtet sein. 64-Bit-Quad-Worte müssen an 8-Byte-Grenzen ausgerichtet sein.
Sandini Bib Der Pentium
355
Präfixe Befehlspräfixe werden in der Stufe D1 decodiert und an die u-Pipeline weitergegeben. Die Paarungsregeln verbieten, dass Präfixe außer dem 2-Byte-Opcode-Präfix 0fh für die Jcc-Befehle an die v-Pipeline übergeben werden können. Pro Präfix ist ein Prozessortakt notwendig, sodass jedes Präfix die eigentliche Befehlsausführung in der u-Pipe um einen Takt verzögert. Erst nachdem alle Präfixe in die u-Pipeline geladen worden sind, wird der eigentliche Befehlscode übergeben. Präfixe sollten also so weit wie möglich vermieden werden. Register Manche Register sind beim Pentium – entgegen der symmetrischen Strategie reiner RISC-Prozessoren – wie auch schon bei seinen 80x86-Vorgängern vorteilhafter für die Ausführungsgeschwindigkeit und vor allem die Kodierung. Das betrifft das EAX-Register und das DS-Register. Durch seine herausragende Stellung als Akkumulator werden Befehle mit EAX häufig durch weniger Bytes codiert. Ähnliches gilt für die Verwendung des Standarddatensegments DS anstelle von ES, FS und GS. Die Zusatzdatensegmente müssen durch entsprechende Segmentüberschreibungspräfixe aktiviert werden. Dagegen ist DS bei Datenzugriffen implizit stets aktiv. Die Verwendung von DS spart also ein Befehlsbyte und darüber hinaus einen Dekodierungstakt ein. Ein-Zyklen-Befehle Verwenden Sie soweit wie möglich Ein-Zyklen-Befehle, also Befehle, die üblicherweise in einem einzigen Taktzyklus ausgeführt werden können. Solche Befehle sind meistens einfach und werden dadurch mit anderen einfachen Befehlen gepaart. Komplexe Anweisungen wie z.B. ENTER oder LOOP benötigen daher viele Taktzyklen und können nicht mit anderen Befehlen gepaart werden. Auf der anderen Seite sind komplexe String-Befehle mit REP-Präfix für lange Zeichenketten häufig schneller als deren »manuelle« Ausführung mit Hilfe vieler MOV-Anweisungen. Ursache dafür ist, dass die Mikrocodes für die komplexen String-Befehle bereits im Hinblick auf die Superskalararchitektur auf einer Ebene optimiert worden sind (nämlich den einzelnen Elementen der u- und v-Pipelines selbst), die nicht einmal einem optimierenden Compiler zugänglich sind.
10.6.2
Optimierung mit dem Performance Monitoring
Mit dem Performance Monitoring können Sie eine Vielzahl von Parametern genau bestimmen, die zur Gesamtleistung eines Pentium-Systems beitragen. Das sind z.B. die Trefferraten in den On-Chip-Caches, das Auftreten von Interlocks oder die Trefferrate im BTB. Diese Parameter hängen wesentlich von der Güte des erzeugten Programmcodes ab, sodass das Performance Monitoring vor allem für Compiler-Entwickler und Systemprogrammierer interessant ist. Seine Superskalararchitektur kann der Pentium trotz der auf Kompatibilität zielenden Branch Prediction nur dann voll ausschöpfen, wenn der ablaufende Code optimal auf die Hardware-Plattform Pentium abgestimmt ist. Hardware-Elemente für das Performance Monitoring Für das Performance Monitoring weist der Pentium den bereits erwähnten Zeitmarkenzähler TSC (Time Stamp Counter), zwei programmierbare Event-Zähler CTR0 und CTR1, die beiden Anschlüsse PM0/BP0 und PM1/BP1, die den Event-Zählern zugeordnet sind und ein Steuer/ Event-Auswahlregister CESR (Control/Event Select Register) auf. Alle Elemente sind als modellspezifische Register implementiert. Ihre ECX-Werte für die Befehle RDMSR und WRMSR finden Sie in Tabelle 10.12.
Sandini Bib 356
Kapitel 10
modellspezifisches Register
MSR-Nr.
Zeitmarkenzähler Steuerung und Event-Auswahl Zähler 0 Zähler 1
10h 11h 12h 13h
Tab. 10.12: Modellspezifische Register für das Performance Monitoring
Als einziges Element kann der TSC über einen auf Anwendungsebene ausführbaren Befehl, nämlich RDTSC (Read Time Stamp Counter), angesprochen werden, wenn das TSD-Bit im Steuerregister CR4 gelöscht ist (für TSD=1 ist CPL=0 erforderlich). Alle anderen Register sind nur über die Befehle RDMSR und WRMSR zugänglich. Auch auf den TSC können Sie mit RDMSR und WRMSR zugreifen. Alle Performance-Monitoring-Register sind in serieller Weise auch über den Test-Access-Port TAP zugänglich. Im TAP-Controller ist zu diesem Zweck das Probe-Register vorgesehen. Der Zeitmarkenzähler TSC ist ein 64 Bit breiter Zähler, der vom Prozessortaktsignal getriggert wird und sich mit jedem Takt erhöht (selbst bei 66 MHz dauert es 264*16 ns=2,8*1011s oder fast 9000 Jahre, bis der TSC überläuft). Durch Lesen des Zeitzählers z.B. vor und nach dem Ausführen einer Prozedur können Sie also sehr präzise den Zeitaufwand für die Prozedur (in Einheiten zu CLK-Takten) ermitteln. Die zwei programmierbaren 40-Bit-Event-Zähler CTR0 und CTR1 können individuell verschiedenen Ereignissen zugeordnet werden. Diesen beiden Zählern sind unmittelbar die zwei Anschlüsse PM0/BP0 und PM1/BP1 zugeordnet, die bei einer Konfiguration als Performance-MonitoringAnschlüsse über das Debug-Modussteuerregister Signale nach außen abgeben. Sie zeigen dann die aktuelle Aktivität der Zähler an. Die Zähler überwachen z.B. Vorgänge wie TLB-Treffer und TLBFehltreffer, Treffer und Fehltreffer auf Lines in den On-Chip-Caches, Snoop-Zyklen, BTB-Treffer oder Fehlvorhersagen usw. Mit dem Performance-Monitoring kann ein Entwickler nahezu alle Vorgänge hinsichtlich Dauer und Häufigkeit erfassen und dadurch die Effizienz des erzeugten Codes überprüfen. Welche Ereignisse die Event-Zähler tatsächlich zählen oder welche Zeitspannen sie erfassen, kann über das Steuerungs- und Event-Auswahlregister CESR definiert werden. In Abbildung 10.17 sehen Sie die Struktur dieses Registers.
reserviert
22 21
CC1
16 15
ES1
10 9 8
reserviert
PC0
26 25 24
PC1
31
0
6 5
CC0
ES0
ES0, ES1:
Event Select (Event-Auswahl) Kodierungen und zugeordnete Events: siehe Tabelle 10.13
CC0, CC1:
Counter Control (Zählersteuerung) 000b=Zähler deaktiviert 001b=Event zählen für CPL=0, 1, 2 010b=Event zählen für CPL=3 011b=Event unabhängig von CPL zählen 100b=Zähler deaktiviert 101b=Taktzyklen zählen für CPL=0, 1, 2 110b=Taktzyklen zählen für CPL=3 111b=Taktzyklen unabhängig von CPL zählen
PC0, PC1:
Pin Control (Pin-Steuerung) 0=zugeordneter Zähler inkrementiert 1=zugeordneter Zähler übergelaufen
Abb. 10.17: Das Steuerungs- und Event-Auswahlregister CESR
Sandini Bib Der Pentium
357
Die beiden Event-Select-Felder ES0 und ES1 definieren, welche Ereignisse oder Zeitspannen der Zähler CTR0 bzw. CTR1 verarbeitet. Die Events und zugeordneten Kodierungen finden Sie in Tabelle 10.13. Die Fülle an möglichen Events erlaubt die Überwachung aller wesentlichen Funktionen. Kodierung
Event
gezählt wird
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0ah 0bh 0ch 0dh 0eh 0fh 12h 13h 14h 15h 16h 17h 18h 19h 1ah 1bh 1ch 1dh 1eh 1fh 22h 23h 24h 25h 26h 27h 28h 29h
Daten lesen Daten schreiben Daten-TLB-Fehltreffer Daten-Lesefehltreffer Daten-Schreibfehltreffer Schreiben nach M/E Cache-Line Daten-Cache-Line zurückgeschrieben externer Abfragezyklus Treffer für Daten-Cache-Abfragezyklus Speicherzugriff in beiden Pipelines Bank-Konflikt Misaligned-Zugriff auf Daten oder I/O Code-Lesen Code-TLB-Fehltreffer Code-Cache-Fehltreffer Segmentregister laden Verzweigungen BTB-Treffer Taken Branch oder BTB-Treffer Pipeline-Invalidierung (Flush) Befehl ausgeführt Befehl in v-Pipe ausgeführt Busbelegung Wartezyklen durch volle Schreibpuffer Pipeline-Hemmung durch Datenspeicherlesen Pipeline-Hemmung durch Schreiben auf E/M Cache-Line Locked-Buszyklen I/O-Lese- oder I/O-Schreibzyklen nicht-cachebare Speicherlesevorgänge Pipeline-Hemmungen durch AGIs FLOPs Haltepunkt für DR0 Haltepunkt für DR1 Haltepunkt für DR2 Haltepunkt für DR3 Hardware-Interrupts Datenlesen oder Datenschreiben Datenlese- oder Datenschreib-Fehltreffer
Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Dauer Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Dauer Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang Vorgang
Tab. 10.13: Events und zugeordnete Kodierungen
Die beiden 3-Bit-Felder CC0 und CC1 (Counter Control) aktivieren die zugeordneten Zähler für verschiedene Privilegierungsstufen CPL. Falls die externen Anschlüsse PM0/BP0 und PM1/BP1 für das Performance-Monitoring konfiguriert sind, gibt der Pentium dort Signale ab, die anzeigen, ob der zugeordnete Zähler seinen Zählwert inkrementiert hat oder einen Überlauf aufweist. Die Auswahl erfolgt durch die beiden Pin-Steuerbits PC0 und PC1.
Sandini Bib 358
Kapitel 10
Zugriffe über den Test Access Port Ich habe bereits erwähnt, dass die Performance-Monitoring-Register auch über den TAP zugänglich sind. Zur Unterstützung des Performance-Monitorings ist im TAP-Controller ein ProbeDatenregister vorgesehen. Die JTAG-Logik arbeitet parallel zur Pentium-CPU und beeinflusst dadurch die Programmausführung nicht. Dagegen sind alle Zugriffe mit Hilfe der Befehle RDMSR und WRMSR sowie RDTSC Bestandteil des Befehlsstromes und müssen von der zu untersuchenden Pentium-CPU selbst ausgeführt werden. Der große Vorteil der Befehle RDMSR und WRMSR ist, dass das Performance-Monitoring rein auf Softwarebasis und somit ohne zusätzliche Hardware durchgeführt werden kann. Für den Zugang über den TAP ist dagegen eine nicht ganz triviale, externe Hardware erforderlich. Dafür stehen Ihnen dann aber auch die anderen TAP-Funktionen zur Verfügung.
10.7 Pentium-Testfunktionen Im Pentium sind mehrere Funktionen zur Erkennung von Fehlfunktionen implementiert. Sie betreffen interne funktionale Einheiten, wie z.B. den Mikrocode-ROM, die Busschnittstelle mit Adress- und Datenbus und den JTAG Boundary Scan Test.
10.7.1
Der Pentium JTAG Boundary Scan Test
Auch der Pentium implementiert einen Boundary Scan Test nach dem Standard IEEE 1149.1. Dadurch ist es wie beim i486 möglich, die Logikeinheiten des Pentiums und deren Verschaltung auch nach Abschluss der Herstellung und Einbau in einen Computer extern zu prüfen. Sie können den Pentium auch explizit anweisen, den internen Selbsttest BIST auszuführen. Alle Ausführungen von Kapitel 8.8.5 gelten in unveränderter Form weiter. Ich möchte daher nur die Unterschiede zum JTAG des i486 diskutieren. Für den Pentium-JTAG-Test ist ein zusätzlicher TRST-Anschluss vorgesehen. Ein aktives Signal mit niedrigem Pegel an diesem Test-Reset-Anschluss setzt die Boundary-Scan-Testlogik zurück und initialisiert sie. Außerdem wurde ein neuer TAP-Befehl hinzugefügt: HiZ mit der Kodierung xxxxxxxx1011. Er bewirkt, dass der Pentium alle als Ausgänge (Output) wirkenden Anschlüsse in einen Zustand hoher Impedanz versetzt, d.h. von der Umgebung abtrennt. Steuerzelle
Anschlussgruppe
DISABUS DISMISCFA DISMISCA DISUA1BUS DISUA2BUS DISMISC DISBUS1 DISMISCH DISBUS DISWR DISAPSBA
A31–A3, AP D/P, FERR ERR PBREQ, PHIT, PHITM PBGNT APCHK, PCHK, PRDY, BP3, BP2, PM1/BP1, PM0/BP0 ADS, ADSC, LOCK HIT, HITM, HLDA, BREQ, SMIACT SCYC, BE7–BE0, W/R, D/C, PWT, PCD, CACHE, M/IO D63–D0, DP7–DP0 PICD0, PICD1
Anm.: DIS steht für Disable, weil eine »1« die entsprechenden Ausgänge abklemmt, d.h. deaktiviert
Tab. 10.14: JTAG-Steuerzellen und zugeordnete Anschlussgruppen
Sandini Bib Der Pentium
359
Wie üblich, befindet sich zwischen dem Eingabeanschluss TDI und dem Ausgangspin TDO der Abtastpfad. Neben den Zellen, die den Pentium-Anschlüssen zugeordnet sind, gibt es noch insgesamt elf Steuerzellen. Die Steuerzellen bestimmen die Übertragungsrichtung der ihnen zugeordneten bidirektionalen Anschlüsse (wie z.B. D63–D0) oder klemmen Ausgabeanschlüsse (wie z.B. ADS) ab. Die Steuerzellen sind in Tabelle 10.14 aufgeführt. Der Boundary-Scan-Pfad des Pentium wird in der folgenden Weise durchlaufen (achten Sie auf die Steuerzellen DISxxx): TDI->DISAPSBA->PICD1->PICD0->frei->PICCLK->D0->D1->D2->D3->D4->D5->D6->D7-> DP0->D8->D9->D10->D11->D12->D13->D14->D15->DP1->D16->D17->D18->D19->D20->D21-> D22->D23->DP2->D24->D25->D26->D27->D28->D29->D30->D31->DP3->D32->D33->D34-> D35->D36->D37->D38->D39->DP4->D40->D41->D42->D43->D44->D45->D46->DISWR->D47-> DP5->D48->D49->D50->D51->D52->D53->D54->D55->DP6->D56->D57->D58->D59->D60-> D61->D62->D63->DP7->IERR->FERR->PM0/BP0->PM1/BP1->BP2->BP3->M/IO->CACHE-> EWBE->INV->AHOLD->KEN->BRDYC->BRDY->BOFF->NA->DISBUS->DISMISCH-> DISBUS1->DISMISC->DISUA2BUS->DISUA1BUS->DISMISCA->DISMISCFA->WB/WT-> HOLD->PHITM->PHIT->PBREQ->PBGNT->SMIACT->PRDY->PCHK->APCHK->BREQ-> HLDA->AP->LOCK->ADSC->PCD->PWT->D/C->EADS->ADS->HITM->HIT->W/R-> BUSCHK->FLUSH->A20M->BE0->BE1->BE2->BE3->BE4->BE5->BE6->BE7->SCYC->CLK-> RESET->DISABUS->A20->A19->A18->A17->A16->A15->A14->A13->A12->A11->A10->A9-> A8->A7->A6->A5->A4->A3->A31->A30->A29->A28->A27->A26->A25->A24->A23->A22-> A21->D/P->NMI->R/S->INTR->SMI->IGNNE->INIT->PEN->FRCMC->frei->frei->frei->frei-> BF->STPCLK->frei->frei->frei->frei->frei->frei->TDO Das ID-Code-Register speichert im Pentium eine 32-Bit-Identifizierung mit folgender Belegung: Bit 0=1, Bit 1...10=Hersteller (Intel=09h), Bit 11...27=Teilenummer (Bit 11...16=Modell 01h, d.h. DX; Bit 17...20=Generation 05h, d.h. Pentium; Bit 21...27=Typ 01h, d.h. CPU), Bit 28...31=Version/ Stepping. Der Pentium-ID-Code lautet also x02a1013h (x=abhängig von Version/Stepping).
10.7.2
Erfassung interner Fehler
Um die Betriebssicherheit zu gewährleisten, führt der Pentium ständig im Hintergrund eine Paritätsprüfung für viele interne Speicherfelder aus. Hierzu gehören:
: : : : :
Speichereinträge im Code und Daten-Cache Tag-Einträge im Code und Daten-Cache Speichereinträge im Code und Daten-TLB Tag-Einträge im Code und Daten-TLB Mikrocode-ROM
Diese ständige Prüfung ist vollständig transparent. Nur wenn die Fehlererfassungslogik einen Paritätsfehler erfasst, gibt der Pentium an seinem IERR-Ausgang ein aktives Signal mit niedrigem Pegel ab und tritt in den Shutdown-Zustand ein.
10.7.3
Erfassung von Busfehlern
Neben der eben beschriebenen internen Paritätsprüfung überwacht der Pentium auch die Parität auf dem externen Daten- und Adressbus. Neben den eigentlichen Daten- und Adressbits D63–D0 bzw. A31–A3 werden ja zusätzlich noch acht Datenparitätsbits DP7–DP0 und ein Adressparitätsbit AP aus- bzw. übergeben. Zusätzlich können auch allgemeine Busfehler erkannt werden.
Sandini Bib 360
Kapitel 10
Datenparitätsfehler Für einen Schreibzyklus (Einzeltransfer oder Burst-Zyklus) gibt der Pentium neben den Daten zusätzlich acht Paritätsbits DP7–DP0 aus, um für jedes Datenbyte individuell eine gerade Parität zu erzielen. Das externe System kann die übergebene Paritätsinformation dann für eine Paritätsprüfung verwenden. Umgekehrt kann das externe System in einem Lesezyklus die Paritätsinformation zusammen mit den Datenbytes an den Pentium übergeben. Der Pentium überprüft die resultierende Parität und gibt am Anschluss PCHK ein entsprechendes Signal aus. Ein niedriger PCHK-Pegel zeigt einen Paritätsfehler an. Nur wenn ein aktives Signal PEN angelegt ist, legt der Pentium im Maschinen-Check-Adressregister (MCA-Register) die physikalische Adresse und im MaschinenCheck-Typregister (MCT-Register) die Art des Zyklus ab, der den Paritätsfehler verursacht hat. Abbildung 10.18 zeigt die Struktur des Maschinen-Check-Typregisters.
LOCK, CHK:
4
3
2
1
0
CHK
reserviert
5
D/C W/R
16 15
LOCK M/IO
31
M/IO, D/C, W/R: Art des Buszyklusses, der den Fehler verursacht hat Check-Bedingung 1=Fehler aufgetreten 0=kein Fehler
Abb. 10.18: Das Maschinen-Check-Typregister
Ist das Bit CHK gesetzt, dann geben die vier Bits LOCK, M/IO, D/C und W/R die Art des Zyklus an und das Maschinen-Check-Adressregister MCA enthält die physikalische Fehleradresse. Ein gesetztes LOCK-Bit zeigt ein aktives LOCK-Signal mit niedrigem Pegel an. Ist zusätzlich noch das MCE-Bit im Steuerregister CR4 gesetzt, dann löst der Pentium noch die Maschinen-CheckException entsprechend Interrupt 18 (12h) aus. Adressparitätsfehler Mit Ausnahme der Abfragezyklen gibt der Adressbus stets eine Adresse aus, der Pentium führt also keine Adressparitätsprüfung durch, sondern erzeugt über AP eine gerade Parität. In die Paritätsberechnung gehen nur die Adressbits A31–A5 ein, A4 und A3 werden ignoriert. In einem Abfragezyklus prüft der Pentium dagegen die Parität der Adressbits, er empfängt nun Adresssignale. Das abfragende System legt die Abfrageadresse über A31–A5 (entsprechend einer Cache-Line) und zusätzlich ein Paritätsbit an AP an. Bei einem Adressparitätsfehler aktiviert der Pentium das Signal APCHK (Address Parity Check). Eine weitergehende Auswirkung hat der Adressparitätsfehler im Gegensatz zu einem Datenparitätsfehler nicht. Das externe System kann APCHK verwenden oder auch einfach ignorieren.
10.7.4
Programmausführungsverfolgung oder Execution Tracing
Mit der Programmausführungsverfolgung (oder Execution Tracing) kann ein externes System die interne Befehlsverarbeitung im Pentium erfassen und überwachen. Execution Tracing ist eine neue Funktion des Pentiums. Der Prozessor zeigt über einen Branch-Trace-Message-Sonderzyklus (D/C=0, M/IO=0, W/R=1, BE7–BE0=0dfh) an, wann die u- oder v-Pipeline eine Verzweigung (Taken Branch) ausgeführt hat. Zu den Taken Branches gehören neben den bedingten und unbedingten Sprüngen, Prozeduraufrufen (CALLs), Interrupts, RETs und IRETs auch bestimmte Segment-Deskriptor-Ladevorgänge, Serialisierungsbefehle und die meisten Exceptions. Gegen-
Sandini Bib Der Pentium
361
über den 60/66-MHz-Versionen sind die drei Anschlüsse IU, IV und IBT ab dem 75-MHz-Pentium nicht mehr vorhanden, der Branch-Trace-Message-Sonderzyklus ist die einzige Mitteilung über Verzweigungen, die der Pentium ausführt. Da diese Sonderzyklen die Programmausführung erheblich verlangsamen, hat Intel zusätzlich einen Fast-Execution-Tracing-Sonderzyklus implementiert. Er beansprucht nur einen einzigen Buszyklus (gegenüber zwei Zyklen beim gewöhnlichen Sonderzyklus). Sie können den Fast-Sonderzyklus über das FET-Bit im Steuerregister TR12 aktivieren (siehe Abbildung 10.12). In einem gewöhnlichen Branch-Trace-Message-Sonderzyklus gibt der Pentium folgende Signale aus: Erster Zyklus: A31..A4 Bits 31..4 der linearen Verzweigungsadresse A3 1=32-Bit-Standardoperand, 0=16-Bit-Standardoperand D63..D60 Bits 3..0 der linearen Verzweigungsadresse D59 0 (=erster Zyklus) Zweiter Zyklus: A31..A4 Bits 31..4 der linearen Adresse, von der aus die Verzweigung erfolgt A3 1=32-Bit-Standardoperand, 0=16-Bit-Standardoperand D63..D60 Bits 3..0 der linearen Adresse, von der aus die Verzweigung erfolgt D59 1 (=zweiter Zyklus)
Für einen Fast-Branch-Trace-Message-Sonderzyklus treibt der Pentium folgende Signale: 31..A4 A3 D63..D60 D59
10.7.5
Bits 31..4 der linearen Adresse, von der aus die Verzweigung erfolgt 1=32-Bit-Standardoperand, 0=16-Bit-Standardoperand Bits 3..0 der linearen Adresse, von der aus die Verzweigung erfolgt 1
Hardware-Debug-Unterstützung und Probe Mode
Die bereits bekannten Debugging-Funktionen sind nicht dazu gedacht, externe Hardware zu unterstützen, die direkt auf die Pentium-Register zugreift und unmittelbar die Programmausführung überwacht. Dazu dient der neu implementierte Probe Mode zusammen mit dem Debug Port. Der Debug Port umfasst die Signale INIT, DBRESET, RESET, SMIACT, R/S, SYSR/S, PRDY, TDI, TDO, TMS, TCLK, TRST, DBINST und BSEN. Dadurch kann der externe Hardware-Debugger unmittelbar Einfluss auf die Befehlsverarbeitung im Pentium nehmen (z.B. durch Aktivieren von R/S die Programmausführung anhalten). Im Probe Mode ist nur die normale CPU-Aktivität stillgelegt, Abfragezyklen werden dagegen weiter unterstützt. Über den Boundary-Scan-Pfad können dann die Probe-Register des TAPControllers angesprochen und verschiedene interne Pentium-Register direkt gelesen und verändert werden. Die TAP-Steuerung wird also vom R/S-Signal nicht beeinflusst. Nach entsprechender Konfigurierung kann durch eine Debug Exception anstelle des zugehörigen Interrupts auch der Probe Mode aktiviert werden. Damit ergeben sich enorme Untersuchungsmöglichkeiten, mit deren Hilfe Sie praktisch am Prozessor und allen Schutzeinrichtungen vorbei unmittelbar Register verändern können.
10.7.6
Die Machine Check Exception
Mit dem Pentium ist eine neue Exception aufgetaucht, nämlich die Machine Check Exception. Sie führt zu einem Interrupt 18 (12h). Beachten Sie, dass diese Exception nur dann aktiv wird, wenn das MCE-Bit (Machine Check Enable) im Steuerregister CR4 gesetzt ist. Sonst ignoriert der Pentium alle auftretenden Exception-Bedingungen. Beachten Sie, dass dem INT 18h beim Personal Com-
Sandini Bib 362
Kapitel 10
puter eine BIOS-Funktion zugeordnet ist, die die aktuelle Speichergröße ermittelt. Nach einem Reset ist das MCE-Bit in CR4 gelöscht, der Pentium löst standardmäßig also keine Machine Check Exception aus. Das 64 Bit breite Maschinen-Check-Adressregister speichert beim Auftreten der MCE-Exception die auf dem Adressbus gerade ausgegebene physikalische Adresse, das 64 Bits umfassende Maschinen-Check-Typregister die Art des aktiven Buszyklus. Die Struktur des Maschinen-Check-Typregisters finden Sie in Abbildung 10.18.
10.8 Der Pentium-I/O-Adressraum Der I/O-Adressraum des Pentiums besteht aus 64k 8-Bit-Ports, 32k 16-Bit-Ports, 16k 32-Bit-Ports oder einer äquivalenten Mischung. Beachten Sie, dass Zugriffe auf den I/O-Adressbereich mit einer maximalen Breite von 32 Bit ausgeführt werden, die anderen 32 Bits des 64-Bit-PentiumDatenbusses werden dabei nicht benutzt. Der Pentium treibt I/O-Zugriffe am Cache vorbei direkt auf den Bus. I/O-Schreibzugriffe werden in den Schreibpuffern nicht zwischengespeichert. Die Adressierung der I/O-Ports und den Schutz des I/O-Adressbereichs im Protected Mode über das IOPL-Flag und die I/O-Permission Bit Map führt der Pentium genauso wie der i386 oder i486 aus. Die Details sind in Kapitel 6.7.8 ausgeführt.
10.9 Dual Processing Eine Zielrichtung des Pentiums ab der 75-MHz-Version ist deutlich zu erkennen: Leistungssteigerung durch Multiprocessing: Dadurch sollen mehrere Prozessoren in einem Computersystem gleichzeitig arbeiten und einen oder mehrere Tasks parallel ausführen. Aber Vorsicht: Der Betriebssystem-Kernel muss dafür ausgelegt sein, im Allgemeinen der Hardware Abstraction Layer (HAL). Diese Schicht liefert eine Schnittstelle zur Hardware. Einfache Systeme, wie z.B. DOS und die Erweiterung Windows, sehen einen Multiprozessorbetrieb nicht vor und können Mehrprozessor-Boards nicht nutzen. In diesem Fall arbeitet üblicherweise nur ein einziger Prozessor, die Performance ist dann auch entsprechend. Ein System, das bereits von Beginn an für einen Mehrprozessorbetrieb ausgelegt war, ist Windows NT mit seinem Multiprozessor-Kernel sowie diverse Unix-Arten. Diese Systeme verteilen die Aufgaben selbstständig auf die im Computer enthaltenen Prozessoren. Multiprocessing ist also im Wesentlichen eine Aufgabe für die Software, die Hardware kann nur eine Unterstützung liefern. Der Pentium implementiert dies über das MESI-Protokoll, Locked-Buszyklen und den On-Chip-APIC (Advanced Programmable Interrupt Controller) sowie ein dediziertes Dual Processing Interface. Im Gegensatz zu allen Vorgängern (einschließlich den 60-MHz- und 66-MHz-Versionen) ist der Pentium P54C bereits von Haus aus für einen 2-Prozessor-Betrieb ausgelegt. Im Folgenden mehr zu diesem Thema.
10.9.1
Allgemeine Dual-Processing-Struktur mit zwei Pentium-Prozessoren
Ein Multiprozessorsystem auf Pentium-Basis beinhaltet automatisch mehrere Caches, nämlich mindestens die beiden On-Chip-Caches eines jeden Pentiums. Zusätzlich wird in einem solchen System ein größerer L2-Cache vorhanden sein, damit die Speicherzugriffe der einzelnen CPUs nicht zu stark gebremst werden. Der Pentium unterstützt daher ein symmetrisches Dual Processing mit maximal zwei Prozessoren, die sich einen gemeinsamen L2-Cache teilen. Symmetrisch bedeutet in diesem Zusammenhang, dass beide Prozessoren dieselben Aufgaben erfüllen, nachdem das System geladen ist. Das Besondere im Fall des Pentiums ist, dass beide Prozessoren gegenüber dem Gesamtsystem als ein einziger Pentium erscheinen, d.h. jenseits der gemeinsa-
Sandini Bib Der Pentium
363
men Busschnittstelle (im Allgemeinen zum L2-Cache) ist nicht mehr zu erkennen, ob ein oder zwei Pentium-Prozessoren vorhanden sind. Das vereinfacht das System-Design ganz erheblich, die Probleme werden den Prozessoren aufgebürdet. Ein wesentlicher Punkt ist in diesem Zusammenhang der private Bus zwischen den beiden CPUs. In Abbildung 10.19 sehen Sie das Schema für den Dual-Processing-Betrieb. Einer der beiden Prozessoren ist der primäre Pentium, der andere der sekundäre oder Dual-Pentium. Systemsteuerbus
Primärer Pentium
STPCLK SMI
STPCLK SMI
DualPentium
Boundary-Scan-Bus TDI
TDO
TDI
TDO
privater Bus PBREQ, PBGNT PHIT, PHITM
PBREQ, PBGNT PHIT, PHITM
A31..A3, BEx
/7088-:8 Adreßbus
Datenbus
Prozessorsteuerbus
A31...A3, BEx
APICBus
D63...D0
APIC
TCK, CACHE, KEN, BRDY, ADS, FLUSH, etc.
D63...D0
APICBus
APIC
TCK, CACHE, KEN, BRDY, ADS, FLUSH, etc.
Abb. 10.19: Pentium-Dual-Prozessorsystem mit privatem Bus und lokalen On-Chip-APICs
Beim Systemstart oder nach einem Reset läuft zunächst nur der primäre Pentium hoch und prüft, ob ein Dual-Prozessor vorhanden ist. Ist das der Fall, aktiviert er anschließend den DualProzessor über den privaten Bus (PHIT, PHITM, PBGNT, PBREQ). Für einen Dual-ProcessingBetrieb müssen die On-Chip-APICs aktiviert sein.
10.9.2
Bus-Arbitrierung
Es ist ein einfaches, symmetrisches Arbitrierungsschema implementiert: Fordert derjenige Pentium, der den Bus länger nicht belegt hat (der so genannte Least Recent Master LRM), über das Signal PBREQ (Private Bus Request) die Kontrolle über den Bus an, so muss der Pentium, der als letzter den Bus belegt hat oder noch immer belegt (der so genannte Most Recent Master MRM), die Steuerung an den LRM abgeben (gegebenenfalls nachdem die anhängigen Buszyklen abgeschlossen sind). Der MRM signalisiert das durch das Signal PBGNT (Private Bus Grant). Der LRM wird zum MRM und steuert nun alle Bussignale zum L2-Cache, Hauptspeicher oder I/OAdressraum. Anschließend kann der andere Pentium, falls das notwendig ist, erneut den Bus
Sandini Bib 364
Kapitel 10
übernehmen. Durch dieses Schema werden die beiden Pentium-Busse von primärem und DualPentium zu einem einzigen externen Bus verschmolzen. Die nachgeordneten Bausteine merken nichts davon, dass zwei Prozessoren im System vorhanden sind, die Signale unterscheiden sich nicht, ob sie vom ersten oder zweiten Prozessor erzeugt werden. Was bleibt, sind die Probleme atomischer Zugriffe auf den Speicher und die Cache-Konsistenz zwischen den L1-Caches der beiden Prozessoren. Bestimmte Zugriffe auf den Speicher (z.B. auf Semaphores zum Austauschen von Daten zwischen verschiedenen Prozessen oder Threads oder Zugriffe auf Segment- und Page-Deskriptoren im Hauptspeicher) dürfen nicht vom anderen Prozessor unterbrochen werden. Es ist zwar unwahrscheinlich, aber dennoch nicht ausgeschlossen, dass die beiden Prozessoren im gleichen Moment denselben Deskriptor aktualisieren möchten. Das würde ohne Schutzmaßnahmen zu schwerwiegenden Systemproblemen führen. Um das zu verhindern, dient das bereits mit dem 8086 implementierte LOCK-Signal. Durch die Ausgabe von LOCK (das der System-Chipsatz auch entsprechend verarbeiten muss) kann der Pentium Speicherzugriffe, die mehrere aufeinanderfolgende Buszyklen erfordern, atomisch (d.h. ungeteilt) ausführen. Nicht einmal der andere Pentium kann ihn dann durch ein PBREQ daran hindern. Zuerst wird der atomische Zugriff abgeschlossen und dann der Bus übergeben. Der Pentium aktiviert das LOCK-Signal, wenn das LOCK-Präfix für folgende Befehle verwendet wird: BTS, BTR, BTC, XCHG, XADD, CMPXCHG, CMPXCHG8B, INC, DEC, NOT, NEG, ADD, ADC, SUB, SBB, AND, OR, XOR, wenn ein Schreibvorgang auf eine Speicheradresse (nicht Register) erfolgt. Ein LOCK-Präfix ohne Schreibvorgang auf eine Speicheradresse führt zu einer Exception Ungültiger Opcode. Daneben aktivieren Vorgänge, wie z.B. INTA-Sequenzen, Segmentdeskriptor- sowie Page Directory- und Page TableÄnderungen und auch der XCHG-Befehl das LOCK-Signal automatisch. Das bedeutet aber natürlich noch nicht, dass der Speicherzugriff auch wirklich gesperrt ist. LOCK zeigt nur an, dass es notwendig ist, die aktuelle Speicheradresse zu sperren. Es liegt in der Verantwortung des Board-Entwicklers, das Signal so zu verwenden, dass die Speicherstelle (oder der ganze Speicher) auch tatsächlich gesperrt wird. Eine weitere Strategie zur Aufrechterhaltung der Datenkohärenz im Speicher ist das so genannte Strong Write Ordering. Damit ist gemeint, dass der Pentium und auch das System aus zwei Pentium-Prozessoren alle Schreibvorgänge in genau der Reihenfolge ausführt, wie sie programmiert worden sind. Eine gewisse Umorientierung der Schreibreihenfolge würde die Performance steigern. Existierende Software ist aber aus historischen Gründen im Allgemeinen nicht auf eine Änderung der Schreibreihenfolge eingestellt.
10.9.3
Cache-Konsistenz
Um die Cache-Kohärenz auch über die insgesamt vier L1-Caches der beiden Pentiums (zwei Code- und zwei Daten-Caches) aufrecht zu erhalten, ist eine private Cache-Kohärenz implementiert. Falls ein Prozessor auf Daten zugreift, die der andere in seinem Cache speichert, erfolgt über einen Snoop-Zyklus eine Änderung des Zustands der Cache-Line entsprechend dem MESIProtokoll. Der LRM überwacht also ständig den Bus des MRMs, um Treffer auf Cache-Lines (PHIT) oder modifizierte Cache-Lines (PHITM) in seinem L1-Cache zu erfassen und dies dem MRM mitzuteilen, d.h. der LRM gibt die Snoop-Signale aus und der MRM erfasst sie. Aktiviert der LRM das PHIT-Signal (die vom MRM angesprochene Speicheradresse befindet sich im L1Cache des LRM), dann markiert der MRM die entsprechende Cache-Line als S (Shared). Erfolgt im LRM ein Treffer auf eine modifizierte Cache-Line (der LRM aktiviert in diesem Fall das PHITM-Signal), dann führt der MRM eine so genannte Backoff-Sequenz aus. Sie umfasst folgende Schritte:
Sandini Bib Der Pentium
: : :
365
Der MRM beendet den Buszyklus normal, ignoriert aber vom System übergebene Daten. Der MRM übergibt die Bussteuerung an den LRM, der dadurch zum neuen MRM wird und die modifizierte Cache-Line in das nachgeordnete Speicher-Subsystem (L2-Cache oder Hauptspeicher) zurückschreibt. Der MRM (der ursprüngliche LRM) übergibt die Bussteuerung erneut an den LRM (ursprünglichen MRM). Der ursprüngliche und neue MRM führt den ursprünglichen Buszyklus erneut aus und verarbeitet so die vom LRM aktualisierten Daten.
10.9.4
On-Chip-APICs
Wie ich schon erwähnt habe, weist jeder Pentium auf seinem Chip einen integrierten APIC (Advanced Interrupt Controller) auf. Um den On-Chip-APIC zu aktivieren, muss das System bei einem Reset dem Anschluss APICEN (APIC Enable) ein Signal mit hohem Pegel zuführen. Anschließend muss das BIOS oder das Betriebssystem den APIC noch konfigurieren. Für einen Dual-Processing-Betrieb ist es unbedingt erforderlich, die On-Chip-APICs beider Pentiums zu aktivieren. Dadurch erscheint auch das Interrupt-Subsystem beider Prozessoren wie ein Interrupt-Subsystem eines einzigen Pentiums.
Primärer Pentium
DualPentium APIC-Bus
lokale Interrupts LINT0 LINT1
lokale Interrupts
lokaler APIC
lokaler APIC
LINT0 LINT1
8259A
I/O-APIC
externe System-Interrupts Abb. 10.20: APIC-Konfiguration für einen Dual-Processing-Betrieb
In einem Ein-Prozessor-System kann der On-Chip-APIC als einziger Interrupt Controller benutzt werden. Eine andere Möglichkeit ist es, ihn vollkommen stillzulegen und einen externen PIC (z.B. den 8259A) zu benutzen. Für einen Dual-Processing-Betrieb werden die On-ChipAPICs aktiviert. Sie bilden die lokalen Interrupt-Einheiten beider Pentiums und sind mit einem externen I/O-APIC verbunden. Er bildet die Schnittstelle zur Peripherie, die Hardware-Interrupts auslöst und verteilt die externen Interrupts entsprechend einem programmierten Interrupt-Schema auf die On-Chip-APICs. In Abbildung 10.20 sehen Sie die APIC-Konfiguration für einen Dual-Processing-Betrieb.
Sandini Bib 366
Kapitel 10
Die beiden On-Chip-APICs kommunizieren untereinander und mit dem I/O-APIC über einen dedizierten APIC-Bus mit den drei Signalleitungen PICD0/1 (Programmable Interrupt Controller Data) und PICCLK. Dieser Bus dient z.B. zum Verteilen der am I/O-APIC einlaufenden Interrupt-Anforderungen an die lokalen On-Chip-APICs oder von Inter-Prozessor-Interrupts. Aus Kompatibilitätsgründen kann dem I/O-APIC noch ein 8259A vor- oder parallel geschaltet sein. Das kann aber wegen der Antiquiertheit des 8259As (er wurde bereits im Original-PC im Jahre 1980 benutzt) nicht Sinn der Sache sein. Dennoch finden Sie diese Struktur bei den meisten DualPentium-Boards für PCs, damit auch auf PIC-Ebene eine Hardware-Kompatibilität gegeben ist. Die maximale Geschwindigkeit des APIC-Busses liegt bei PICCLK=16,67 MHz. Der APIC 82489DX arbeitet aber immerhin mit bis zu 33 MHz. Neben den Interrupts vom I/O-APIC können die On-Chip-APICs noch so genannte lokale Interrupts über die Anschlüsse LINT0 (Local Interrupt 0) und LINT1 empfangen. Diese werden ohne Umwege über den I/O-APIC sofort vom entsprechenden Prozessor verarbeitet. Das bringt einen gewissen Performance-Gewinn mit sich. Wenn die lokalen APICs nicht aktiviert sind (z.B. im Ein-Prozessor-Betrieb), stellen die beiden lokalen Interrupts den maskierbaren Interrupt INTR (LINT0) und den nicht-maskierbaren Interrupt NMI (LINT1) dar. Im Falle eines Dual-Processing-Betriebs mit aktivierten On-Chip-APICs werden INTR und NMI zunächst vom I/O-APIC übernommen und anschließend an einen der lokalen APICs übergeben. Dazu können bestimmte Interrupt-Identifizierungen als INTR oder NMI konfiguriert werden. Die in Abbildung 10.20 gezeigte APIC-Konfiguration lässt die beiden On-Chip-APICs zusammen mit dem I/O-APIC als einen einzigen Interrupt Controller erscheinen. Auch für die Interrupt-Struktur im Dual-Processing-Modus gilt daher, dass die beiden Pentiums gegenüber dem externen System wie ein einziger homogener Prozessor erscheinen. Beachten Sie noch, dass die aktivierten APICs jeweils 4 KByte des gewöhnlichen Speicheradressraums ab 0fee00000h für ihre Steuer- und Statusregister belegen. Die APICs arbeiten also mit Memory Mapped I/O.
10.10 Pentium der dritten Generation – MMX Dieser auch als P55C bezeichnete Pentium-Chip mit Taktfrequenzen von 166 MHz, 200 MHz oder auch 233 MHz wurde 1997 mit großem Werberummel eingeführt, wobei dabei erstmals das Schlagwort MMX auftauchte. MMX steht für Multi Media Extensions. Wie es in den folgenden Abschnitten erläutert wird, ist MMX nicht unbedingt der Stein der Weisen, der alle bis dato verwendeten Technologien auf einen Schlag veraltet erscheinen lässt. Neben der Implementierung von MMX hat Intel allerdings auch andere, deutliche Verbesserungen angebracht, die die Leistung eines Pentium-MMX gegenüber einem mit der gleichen Frequenz getakteten, »gewöhnlichen« Pentiums um ca. 10-15% anheben. Im Folgenden eine kurze Aufstellung der wichtigsten Kenngrößen des Pentium-MMX:
: : : : : : :
MMX-Technologie Vergrößerung der beiden L1-Code- und Daten-Caches von 8 KByte auf jeweils 16 KByte 4-Wege Set-assoziative statt 2-Wege Set-assoziative L1-Caches Eine zusätzliche Pipeline-Stufe, um höhere Taktfrequenzen zu erzielen Maximaler Takt 233 MHz gegenüber 200 MHz Zusätzlich 1,2 Millionen Transistoren für die MMX-Einheiten und weitere Verbesserungen Implementierung eines Return Stacks, der vom PentiumPro her bekannt ist
Sandini Bib Der Pentium
: :
367
Vier anstelle von nur zwei Schreibpuffern Absenkung der Core-Spannung auf 2,8 V, um die Verlustleistung zu senken (der MMX benötigt trotz höherer Taktfrequenzen und einer größeren Zahl von Transistoren nur ebensoviel Strom wie der normale Pentium)
Einen integrierten L2-Cache gibt es bei einer Pentium MMX-CPU nicht. Er wird extern auf dem Mainboard untergebracht. Vom Pentium Pro wurde für die MMX-CPU allerdings die verbesserte Branch Prediction Unit (BPU) übernommen. Die Einstiegsversion des Pentium-MMX wird dabei mit 166 MHz getaktet und entspricht in ihrer Leistungsfähigkeit in etwa einem Standard-Pentium, der mit 200 MHz getaktet wird, was in erster Linie dem vergrößerten L1-Cache zu verdanken ist. Ob in Ihrem PC ein MMX werkelt, können Sie ganz einfach nach einem Reset oder anhand des Befehls CPUID feststellen, da der MMX ausschließlich zur Familie 05h gehört.
: :
Sind die Modellbits 7...4 im EDX-Register nach einem Reset auf den Wert 04h gesetzt, handelt es sich um einen Pentium-MMX, sonst (Werte 00h bis 03h) um einen »gewöhnlichen« Pentium Ist der Wert der Modellbits 7...4 im EAX-Register nach Ausführen von CPUID gleich 04h, arbeitet ein MMX.
Ein wichtiger Punkt ist, dass der Pentium-MMX mit einer verminderten Core-Spannung arbeitet. Sie wurde auf 2,8 V abgesenkt, die Spannung der I/O-Schaltungen, die die Verbindung zum Bus herstellen, arbeiten aber weiterhin mit 3,3 V. Das bedeutet, dass Motherboards für den Pentium-MMX zwei CPU-Spannungen (Split Voltage) bieten müssen.
10.10.1 Sockel und Signale Sowohl für die Standard- (ab 75 MHz) als auch die MMX-Pentium-CPUs wird der gleiche Sockeltyp (Typ 7) verwendet und äußerlich ist der Unterschied zwischen einer Standard- und einer MMX-Pentium-CPU nur durch die MMX-Beschriftung festzustellen. Der ältere Sockeltyp Nr. 5 ist lediglich für Pentium-CPUs bis zum Typ mit 133 MHz vorgesehen, da hier nur ein einziger BF-Jumper (Bus Frequency) für die Festlegung der Taktfrequenz vorhanden ist. Voraussetzung für den Einsatz eines Pentium-MMX-Prozessors ist daher der Sockeltyp Nr. 7, der auch die beiden Spannungsversorgungen für die CPU-Core- und die CPU-I/O-Voltage bietet. Im Folgenden möchte ich Ihnen die Signale kurz vorstellen, die gegenüber einer Standard-Pentium-CPU hinzugekommen bzw. geändert worden sind: FRCMC (I) Anschluss Y35 Functional Redundancy Checking wird bei den MMX-CPUs nicht mehr verwendet. Dieser Pin ist üblicherweise nicht belegt (NC) oder mit einem Pull-Up-Widerstand an Vcc3 angeschlossen. NC/INC (I) Anschlüssse AN35, AN05, AN03, AN01, AL19, W35, W33, S35, S33, R34, C01, B02, A37, A03 No Connection, diese Pins sind nicht angeschlossen. Vcc2 (I) Anschlüsse A17, A15, A13, A11, A09, A07, G01, J01, L01, N01, Q01, S01, U01, W01, Y01, AA01, AC01, AE01, AG01, AN09, AN11, AN13, AN15, AN19 Die Versorgungsspannung (2,8 V) für den CPU-Kern wird an diesen Pins angeschlossen.
Sandini Bib 368
Kapitel 10
Vcc2DET (O) Anschluss AL01 Dieser Anschluss signalisiert der Mainboard-Elektronik die Anwesendheit einer MMX-CPU. Vcc3 (I) Anschlüsse A19, A21, A23, A25, A27, A29, E37, G37, J37, L37, L33, N37, Q37, S37, T34, U33, U37, W37, Y37, AA37, AC37, AE37, AG37, AN29, AN27, AN25, AN23, AN21 Die Versorgungsspannung (3,3 V) für die CPU-Ausgangstreiber (I/O) wird an diese Pins angeschlossen.
Abb. 10.21: Die Anschlüsse und Signale einer Pentium-MMX-CPU unterscheiden sich im Wesentlichen nur in der Spannungsversorgung und dem neuen Anschluss Vcc2DET (Pin AL1) von der Pentium-Standard-CPU.
10.11 MMX-Technologie Prozessoren, die die MMX-Erweiterung (Multimedia Extension) beinhalten, sollen vor allem Multimedia- und 3D-Anwendungen deutlich beschleunigen. Kennzeichnend für solche Programme ist, dass eine enorme Anzahl recht kleiner Datenpakete bearbeitet wird. Beispiele wären die Texturierung eines 3D-Objektes oder die Verarbeitung eines Audio Samples (Datenbreite typischerweise 16 Bit). Die Anzahl dieser Datenpakete ist dabei sehr hoch; stellen Sie sich nur Zehntausende von Pixels für ein 3D-Objekt oder z.B. ein Musikbeispiel für einen Komponisten einer Multimedia-Enzyklopädie vor.
Sandini Bib Der Pentium
369
Da aber andererseits die Breite der Prozessorregister immer umfangreicher geworden ist (Pentium: 32 Bit für die Vielzweckregister, 80 Bit in der FPU), liegt es nahe, mehrere kleine Datenpakete zusammenzupacken und auf einmal zu bearbeiten. Ein einzelner Befehl wird also auf mehrere gleichartige Datenpakete angewandt oder auf englisch Single Instruction, Multiple Data, abgekürzt SIMD. Im Prinzip handelt es sich dabei um eine altbekannte Strategie, denn bereits die Mainframes aus den sechziger Jahren gingen in dieser Weise vor, um ihre bescheidene Elektronik besser nutzen zu können. Daneben implementiert MMX einen neuen Registersatz von acht 64-BitRegistern, 57 neue MMX-Befehle und vier neue Datentypen. Im Folgenden nun zu den Details.
10.11.1 SIMD- und MMX-Datentypen SIMD und die neuen MMX-Datentypen hängen eng zusammen, da die Zusammenfassung von mehreren kleinen Dateneinheiten zu einer Einheit, die dann mit einem einzigen Befehl bearbeitet wird, in der x86-Architektur bisher nicht vorgesehen war (wenn man von den ähnlich gepackten BCD-Zahlen einmal absieht). In der Abbildung 10.22 sehen Sie die neuen Datentypen.
Abb. 10.22: Die MMX-Datentypen
Sie sehen, dass die MMX-Datentypen alle 64 Bit umfassen, die sich mit acht Bytes, vier Worten, zwei Doppelworten (DWort) oder einem Quadwort (QWort) auffüllen lassen. Das Besondere dabei ist, dass ein Befehl (z.B. Addition) alle acht, vier oder zwei Dateneinheiten auf einmal und in gleicher Weise bearbeitet. Der Prozessor behandelt diese Dateneinheiten als abgeschlossen, d.h. es findet beispielsweise kein Übertrag zwischen den einzelnen Dateneinheiten statt. In ähnlicher Weise kann man auch AL und AH als zwei Dateneinheiten des AX-Registers interpretieren, wobei der gravierende Unterschied zu MMX ist, dass ein Befehl, der AX als Registerreferenz enthält, AX als einen 16-Bit-Wert und nicht als zwei isolierte 8-Bit-Werte Teilregister AL und AH bearbeitet. Das Beispiel schlechthin für die Anwendung der MMX-Datentypen sind Pixelwerte: Stellen Sie sich einfach Pixel mit einer Farbtiefe von acht Bit vor, von denen acht zusammengepackt und auf einmal bearbeitet werden können (z.B. eine Farbänderung ausgeführt wird). Gegenüber der
Sandini Bib 370
Kapitel 10
sequenziellen Verarbeitung in Einheiten zu acht Bit, wie das die Prozessoren ohne MMX durchführen, ist die Verarbeitung von acht solchen Pixels auf MMX-Prozessoren in einem Rutsch möglich, theoretisch also achtmal schneller. Die Betonung liegt auf theoretisch, weil die Daten ja zuerst zusammengefasst und anschließend möglicherweise wieder aufgetrennt werden müssen. Nur wenn die Anzahl der Datenpakete sehr groß ist, können MMX-Prozessoren ihre Stärke auch wirklich ausspielen.
10.11.2 MMX-Register Natürlich müssen Daten entsprechend diesen neuen MMX-Datentypen auch irgendwo abgelegt werden, damit der Prozessor sie verarbeiten kann. Dazu gibt es im Prinzip drei Möglichkeiten:
: : :
Definition eines neuen Satzes von MMX-Registern im Prozessor Zusammenfassung von zwei 32-Bit-Vielzweckregistern zu einem 64-Bit-MMX-Register Benutzung der FPU-Register
Die erste Möglichkeit scheint die naheliegende zu sein, zumal sich der elektronische Aufwand in Grenzen hält. Gravierende Nachteile ergeben sich allerdings bei Task Switches in MultitaskingSystemen. Behält man das Betriebssystem unverändert bei und unterstützt MMX auf Systemebene höchstens durch Treiber oder DLLs, dann können die MMX-Register bei einem Task Switch nicht automatisch gesichert bzw. wiederhergestellt werden, weil im Task-State-Segment dafür kein Platz vorgesehen ist. Da Task Switches außerdem Anwendungsprogrammen vollkommen verborgen bleiben (diese sind ausschließlich Aufgabe des Betriebssystems), entfällt auch die Möglichkeit, dass ein MMX-Anwendungsprogramm von sich aus die MMX-Register sichert bzw. wiederherstellt. Die einzige Möglichkeit in diesem Zusammenhang wäre, Betriebssysteme mit und ohne MMX-Kernel zu schaffen. Anders ausgedrückt, deutlich von der heiligen Kuh »Kompatibilität« abzurücken. Die Zusammenfassung zweier 32-Bit-Vielzweckregister zu einem MMX-Register wäre im Prinzip möglich, da diese Register bei einem Task Switch automatisch gesichert und wiederhergestellt werden. Das Problem liegt aber darin, dass sich mit den sechs Vielzweckregistern maximal drei MMX-Register bilden lassen und außerdem mehr als 90% eines typischen Programmcodes die Vielzweckregister referieren. Damit fällt diese Lösung als unpraktikabel. Was bleibt, sind die acht FPU-Register, die in allen x86-CPUs ab dem i486 vorhanden sind. Mit ihrer Breite von 80 Bit stellen sie genügend Raum für die 64 MMX-Bits bereit. Die 64 MMX-Bits werden daher physikalisch auf dem Mantissenanteil der FPU-Register abgebildet. Die Verwaltung der FPU/MMX-Register ist dabei alleinige Aufgabe des MMX-Programms (Anwendungsprogramm, Treiber, Handler oder DLL), d.h. das MMX-Modul muss alle Vorkehrungen zur Rettung der eventuell gespeicherten FPU-Daten und deren Wiederherstellung treffen. Programmierer sollten daher so weit wie möglich MMX- und FPU-Code getrennt gruppieren, damit diese Rettungs- und Wiederherstellungsprozeduren keinen unnötigen Overhead produzieren. Andererseits wirken sich Task-Wechsel nicht besonders nachteilig aus, da ein gesetztes TS-Bit im Task-State-Segment einen Interrupt 7 auslöst (Coprozessor nicht verfügbar), dessen Handler dann die in den FPU-Registern gespeicherten Werte (unabhängig davon, ob es sich um MMXoder FPU-Daten handelt) sichern bzw. wiederherstellen kann. Aus den genannten Gründen hat Intel die Überlagerung von FPU- und MMX-Registern in der beschriebenen Weise als Teil der MMX-Architektur definiert.
Sandini Bib Der Pentium
371
10.11.3 MMX-Befehle Die 57 MMX-Befehle teilen sich im Wesentlichen in drei Gruppen auf:
: : :
Befehle zur Steuerung des MMX-Zustandes: EMMS Befehle zur Typumwandlung Bearbeitungsbefehle
Dem Befehl EMMS (Empty MMX State, MMX-Zustand löschen) kommt dabei eine Sonderstellung zu, weil dieser Befehl nach jedem MMX-Modul ausgeführt werden muss. Dadurch wird eine gegenseitige Beeinflussung von MMX- und FPU-Einheit über die gemeinsam genutzten FPU/MMX-Register verhindert. EMMS setzt den MMX-Zustand und dadurch auch die Tag-Bits der FPU zurück (auf den Wert 11b). Dadurch wird einem eventuellen FP-Code angezeigt, dass die MMX/FPU-Register frei sind und keinen gültigen Wert enthalten. Ein wesentlicher Begriff, der im Zusammenhang mit den MMX-Befehlen immer wieder auftaucht, ist Saturierung. Damit ist gemeint, dass z.B. bei der Addition und Multiplikation der Wert in einem MMX-Teilregister bis zu einem definierten Maximum (ffh, ffffh, etc.) ansteigt und dort verharrt. Da die arithmetischen MMX-Operationen ohne Übertrag erfolgen, würde z.B. die Addition des Wertes 01h zum Wert ffh das Ergebnis 00h liefern. Ähnliches gilt bei Subtraktionen und Divisionen: Subtrahiert man z.B. 01h von einem MMX-Wert 00h, ergibt sich das (minimale) Ergebnis 00h, d.h. der Wert verharrt bei 00h. Gewöhnlich ergäbe sich ffh. Im Hinblick auf die typischen Größen, die von MMX-Befehlen bearbeitet werden, wie z.B. Pixelwerte, erscheint dies sehr vernünftig, weil das Pixel nicht mehr z.B. vollkommen blau (Wert ffh) werden kann. Ein Umklappen (Wrap-around) zu 00h würde andererseits die Ausgabe auf dem Bildschirm vollkommen zerstören, da z.B. plötzlich ein weißes Pixel auftaucht (00h), obwohl es eigentlich noch blauer als vorher sein sollte. Erwarten Sie aber generell von den MMX-Erweiterungen keine Wunder. Erstens müssen auch die Programme den MMX-Befehlssatz nutzen, d.h. Sie benötigen neue Programmversionen, die speziell für den MMX erstellt worden sind. Zweitens bearbeitet die festverdrahtete Logik in den 3DBeschleunigerchips das Rendering und die Texturen wesentlich schneller als ein MMX-Programm. Die Stärke von MMX ergibt sich aber nicht nur beim Einsatz für Multimedia, auch gewöhnliche Programme, die in vielen Schleifen jeweils kleine Dateneinheiten verarbeiten, können den MMXBefehlssatz effizient nutzen. Gegenüber einem »normalen« Pentium arbeitet der MMX-Typ bei reinen Multimedia-Programmen bis um den Faktor fünf schneller. Das erinnert stark an das ältere Konzept der x87-Coprozessoren, die die Verarbeitung von Gleitkommawerten ebenfalls um diesen Faktor beschleunigen. Wäre MMX schon vor längerer Zeit (vor der i486-Ära) aufgetaucht, wäre die Realisierung sicher in Form eines zweiten Coprozessors erfolgt.
Sandini Bib
Sandini Bib
11 Pentium-kompatible Mikroprozessoren Neben Intel haben auch andere Hersteller Pentium-CPUs hergestellt, die natürlich nicht als Pentium bezeichnet werden dürfen, sondern eigene Namen tragen. Da sich Zahlenbezeichnungen (80386 usw.) nicht schützen lassen, hat Intel ganz bewusst die Bezeichnung Pentium gewählt, damit ganz klar ersichtlich ist, dass ein anderer Typ wie etwa der K5, eben von einem »alternativen« Hersteller stammt. Die Pentium-kompatiblen Prozessoren von Herstellern wie Cyrix oder AMD erweitern die Leistungsfähigkeit teilweise ganz enorm gegenüber den Originalen und zwar für den Sockel 7 oder den Nachfolger den Super Socket 7, den Intel nicht unterstützt, denn ab der Pentium-MMX-CPU mit 233 MHz hat sich Intel (zunächst, wie wir noch sehen werden) vom Sockel-Konzept verabschiedet und mit dem Pentium II den CPU-Slot (Slot One) eingeführt.
11.1 CPUs von Cyrix Der erste Pentium-kompatible Prozessor nennt sich mit Codenamen M1 und ist unter der Bezeichnung Cyrix 6x86 bekannt. Die Firma IBM hat diesen Prozessor ebenfalls unter eigenem Namen produziert, es ist aber eine Entwicklung der Firma Cyrix, die keine eigenen Produktionsstätten besitzt und ihre Prozessoren bei IBM und auch SGS fertigen lässt. Mittlerweile ist die Firma Cyrix vom Chipset-Hersteller VIA gekauft worden, die somit alle Rechte an den Cyrix-Prozessoren besitzt.
11.1.1
Der Cyrix 6x86
Der Cyrix 6x86 implementiert Verarbeitungsstrategien, wie z.B. dynamisches Register-Renaming oder Speculative Execution, die der Pentium von Intel nicht kennt. Für ein »P6« (entsprechend dem PentiumPro) reicht es aber auf der anderen Seite nicht, da der 6x86 bei reinen 32-Bit-Anwendungen (Windows NT) deutlich hinter den PentiumPro zurückfällt. Das gemischte 16/32-Bit-System Windows 9x ist hingegen das eigentliche Ziel für den 6x86, denn in einigen Anwendungen ist er sogar schneller als sein Intel-Kollege. Das Ziel »Windows« mit und ohne 9x zeigt sich auch am Fehlen einer eingebauten Multiprozessorfähigkeit. Der 6x86 implementiert keinen, dem Dual-Processing-Modus des Intel-Pentiums vergleichbaren, Modus. Der mit dem Mehrprozessorbetrieb verbundene Aufwand lohnt sich ja auch nur für leistungsfähige Server oder Workstations, außerdem ist das Zielsystem Windows 9x ohnehin nicht für einen Mehrprozessorbetrieb ausgelegt. Anschlüsse und Signale Der 6x86 wird in einem zum P54C kompatiblen SPGA-Gehäuse mit 296 Anschlüssen ausgeliefert. Bis auf wenige unterschiedlich belegte Pins stimmen die Layouts überein. Ich möchte Sie daher an dieser Stelle nicht mit einem Layout-Schema und einer ausführlichen Wiederholung der Signale belästigen. Lediglich vom Pentium abweichende Signale und Anschlüsse sind im Folgenden zusammen mit ihren Koordinaten erläutert (vgl. Abbildung 10.2). Zunächst eine Auflistung der Pentium-Signale, die beim 6x86 nicht vorhanden sind:
Sandini Bib 374
Kapitel 11
BF1 (Y34), BP2 (S3), BP3 (S5), BUSCHK (AL7), CPUTYP (Q35), D/P (AE35), FRCMC (Y35), IERR (P4), PBGNT (AD4), PBREQ (AE3), PEN (Z34), PHIT (AA3), PHITM (AC3), PICCLK (H34), PICD0/DPEN (J33), PICD1/APICEN (L35), PM0/BP0 (Q3), PM1/BP1 (R4), PRDY (AC5), R/S (AC35) Sie betreffen entweder den Dual-Processing-Mode oder prozessorspezifische Komponenten, wie z.B. die Debug-Unterstützung. Manche Anschlüsse haben beim 6x86 eine andere Bezeichnung, sind aber funktional identisch mit dem entsprechenden Pentium-Signalen: 6x86
Pentium
Pin
CLKMUL SUSP WM_RST
BF0 STPCLK INIT
Y33 V34 AA33
CLKMUL1 (I) Anschluss Y33 Das Signal an diesem Clock-Multiply-Anschluss definiert das Verhältnis von internem und externem Prozessortakt während eines Resets. Ein Signal mit niedrigem Pegel legt ein Taktverhältnis von 2x, ein Signal mit hohem Pegel ein Taktverhältnis von 3x fest. SUSP (I) Anschluss V34 Wird diesem Suspend-Anschluss ein aktives Signal mit niedrigem Pegel zugeführt, schaltet der 6x86 wie der Pentium seinen internen Prozessortakt bei der nächsten Befehlsgrenze ab. WM_RST (I) Anschluss AA33 Ein Signal mit hohem Pegel an diesem Warm-Reset-Anschluss setzt den 6x86 wie den Pentium bei einem aktiven INIT in einen definierten Anfangszustand zurück, ohne die internen Caches, Schreibpuffer, Modellregister und Gleitkommaregister zurückzusetzen. Die folgenden Anschlüsse haben beim 6x86 eine komplett andere Bedeutung oder sind beim Pentium nicht implementiert. Sie betreffen mit Ausnahme von SUSPA den Betrieb der Scatter/ Gather-Schnittstelle (BHOLD, DHOLD, LBA, QDUMP) im 6x86. BHOLD (I) (Anschluss R34; Pentium: frei) Ein aktives Signal an diesem Byte-Enable-Hold-Anschluss klemmt die Byte-Enable-Signale BEx ab, damit sie von einer externen Signalquelle getrieben werden können. DHOLD (I) (Anschluss S35; Pentium: frei) Bei einem aktiven Signal an diesem Data-Bus-Hold-Anschluss wird der Datenbus (D63–D0, DP7–DP0) abgeklemmt. Die anderen Anschlüsse werden davon nicht beeinflusst, Buszyklen schließt der 6x86 normal ab.
Sandini Bib Pentium-kompatible Mikroprozessoren
375
LBA (O) (Anschluss S5; Pentium: BP3) Die internen Konfigurationsregister des 6x86 ermöglichen die Definition eines Adressbereichs für den Local Bus. Erzeugt der 6x86 eine Adresse, die in einen so definierten Bereich fällt, dann gibt der Prozessor ein aktiv-niedriges Signal am Local-Bus-Access-Anschluss aus. Dadurch kann der Zugriff auf den peripheren Bus mit einer Breite von 32 Bit optimiert werden. QDUMP (I) (Anschluss AL7; Pentium: BUSCHK) Sind die Scatter/Gather-Anschlüsse aktiviert, dann veranlasst ein aktiv-niedriges Q-BufferDump-Signal den 6x86 dazu, den Inhalt dieses Puffers (in Übereinstimmung mit den aktivierten BEx-Signalen) auf den Datenbus auszugeben. SUSPA (O) (Anschluss W33; Pentium: BF1) Ein aktiv-niedriges Suspend-Acknowledge-Signal zeigt an, dass der 6x86 nach einer Anforderung durch SUSP in den Suspend-Modus eingetreten ist. Dadurch wird die Leistungsaufnahme erheblich reduziert. Interner Aufbau Der 6x86 implementiert mehr typische RISC-Elemente und Funktionen zur Leistungssteigerung als sein direkter Konkurrent, der Pentium P54C. Im Einzelnen sind dies:
: : : : : : : :
zwei siebenstufige Integer-Pipelines On-Chip FPU L1-Cache mit 16 KByte und Write-Back-Strategie Out-of-order-Abschluss der Befehle Register-Renaming Data Forwarding Dynamische Verzweigungsvorhersage Spekulative Ausführung von Befehlen
Im Folgenden möchte ich auf die einzelnen Elemente und Strategien genauer eingehen. Abbildung 11.1 zeigt ein Blockdiagramm des internen 6x86-Aufbaus. Der 6x86 weist einen gemeinsamen Code- und Daten-Cache mit 16 KByte Speichervermögen und Write-Back-Strategie auf. Ihm nachgeordnet ist für Code-Zugriffe ein 256 Byte großer Line Cache, der Befehle an die beiden siebenstufigen Integer-Pipelines liefert. Natürlich sind im 6x86 alle heute üblichen Gruppen enthalten, die moderne Prozessoren ausmachen, z.B. eine leistungsfähige Speicherverwaltungseinheit und eine Logik zur Verzweigungsvorhersage mit dem BranchTarget-Puffer BTB.
Sandini Bib 376
Kapitel 11
64-BitDatenbus
32-BitAdreßbus
6x86 Busschnittstelle
Code- und Daten-Cache 16 kByte Line Cache-256 Byte
BTB
Prefetching IF
Speicherverwaltungseinheit
Befehlsdekodierung ID1
MikrocodeROM
TLB v-Pipeline u-Pipeline ID2 AC1 AC2 EX WB
Steuereinheit
ID2 AC1 AC2 EX WB
FPUBefehlswarteschlange und FPU
Register
Abb. 11.1: Der interne Aufbau des 6x86
Integer-Pipelines
X-Pipeline
Registerschreibstufe WB
Ausführungsstufe EX
Adressberechnungsstufe AC2
Adressberechnungsstufe AC1
Dekodierstufe D2
Dekodierstufe D1
Prefetch- oder Befehlsholstufe IF
Die beiden Pipelines X und Y (beim Pentium heißen sie u- und v-Pipelines) umfassen jeweils sieben Stufen, d.h. der 6x86 ist ein Superpipelined-Superskalar. Die einzelnen Stufen sehen Sie in Abbildung 11.2.
Befehl k Befehl k-2 Befehl k-4 Befehl k-6 Befehl k-8 Befehl k-10 Befehl k-12
Ergebnis k-12
Y-Pipeline Befehl k+1 Befehl k-1 Befehl k-3 Befehl k-5 Befehl k-7 Befehl k-9 Befehl k-11
Ergebnis k-11
Zyklus n
In-Order-Verarbeitung
Abb. 11.2: Die Struktur der 6x86-Pipelines
Out-of-OrderAbschluss
Sandini Bib Pentium-kompatible Mikroprozessoren
377
Die Befehlslesestufe IF ist für beide Pipelines gemeinsam gebildet und liest 16 Byte vom Cache ein. Außerdem prüft sie gleichzeitig, ob ein Verzweigungsbefehl vorliegt. Ist das der Fall, so erzeugt die Verzweigungsvorhersagelogik in der Befehlslesestufe eine Sprungadresse mit Hilfe des BTBs. Die erste Befehlsdekodierstufe D1, die beide Pipelines gemeinsam bedient, führt eine erste Dekodierung aus und übergibt maximal zwei Befehle an die beiden Pipelines. Dort übernimmt eine für jede Pipeline separat vorhandene zweite Dekodierstufe D2 die Befehle zur weiteren Dekodierung. Ein wesentlicher Unterschied zum Pentium ist, dass die X-Pipe nicht notwendigerweise den früheren Befehl aufnehmen muss, wie das beim Pentium der Fall ist (dort wird der frühere Befehl eines Befehlspaares stets in die u-Pipeline geladen). Das bedeutet, dass die D1-Stufe den früheren Befehl durchaus in die Y-Pipeline und den späteren Befehl in die X-Pipeline laden kann. Auch die Adressberechnung ist in zwei Pipeline-Stufen AC1 und AC2 unterteilt. AC1 berechnet lineare Adressen für Speicheroperanden, AC2 führt alle notwendigen Speicher- und Registerzugriffe für die Operanden aus. Außerdem verzweigt die Pipeline an dieser Stelle zur Gleitkommaeinheit, wenn der bearbeitete Befehl einen ESC-Befehl darstellt. Die Ausführungsstufe EX führt den Befehl mit den eingelesenen Operanden aus. Das Ergebnis wird in der Registerschreibstufe WB schließlich in ein Register oder einen Schreibpuffer für den Cache geschrieben. Damit ist ein Befehl vollständig abgearbeitet worden. Wichtig ist, dass in den Stufen IF bis AC2 alle Befehle in der programmierten Reihenfolge bearbeitet, in den beiden letzten Stufen EX und WB aber unter Umständen in veränderter Reihenfolge abgeschlossen werden. Der 6x86 unterstützt nämlich eine Out-of-order-Ausführung der Befehle. Hierzu später mehr. Befehlspaarung Auch der 6x86 weist wie der Pentium ein paar Beschränkungen hinsichtlich der Befehlspaarung auf: Verzweigungs- und Gleitkommabefehle werden nur von der X-Pipeline verarbeitet. Außerdem werden folgende (exclusive) Befehle nur in die X-Pipe geladen:
: : : : : : :
Segmentladevorgänge im Protected Mode Zugriffe auf Steuer-, Debug- und Testregister Zeichenkettenbefehle Multiplikations- und Divisionsbefehle I/O-Zugriffe PUSHA und POPA Intersegmentsprünge, -aufrufe und -Returns
Beachten Sie, dass diese Befehle zwar nur in die X-Pipeline geladen, zur Ausführung aber die Hardware beider Pipelines genutzt wird. Diese Befehle sind mikrocodiert und entsprechen daher den komplexen Befehlen des Pentiums. Gleitkommaeinheit Die FPU des 6x86 kann parallel zu den Integer-Pipelines X und Y arbeiten. Dazu werden alle Gleitkommabefehle zunächst in die X-Pipeline geladen und durchlaufen die Stufen IF bis AC2. Die letzte Adressberechnungsstufe AC2 übergibt den FPU-Befehl dann an die Befehlswarteschlange in der Gleitkommaeinheit. Sie umfasst maximal vier Befehle und führt sie der Gleitkommaeinheit zur Ausführung zu. Dadurch können ESC- und Integer-Befehle parallel und zusätzlich out-of-order ausgeführt werden. Pipeline-Hemmungen auf Grund von Schreibvorgängen der FPU werden durch vier FPU-Schreibpuffer weitgehend verhindert.
Sandini Bib 378
Kapitel 11
Fortgeschrittene Strategien gegen Pipeline-Hemmungen Die in diesem Abschnitt vorgestellten Strategien zur Vermeidung von Pipeline-Hemmungen (Interlocks) rechtfertigen die Bezeichnung P5 1/2 für den 6x86. Der Cyrix-Prozessor implementiert Konzepte, die bei Intel erst ab dem PentiumPro vorhanden sind. Ursachen für Pipeline-Hemmungen sind insbesondere:
: : : : : :
Sprünge und Aufrufe Datenabhängigkeiten Read-After-Write (RAW) Write-After-Read (WAR) Write-After-Write (WAW) Unterschiedlich lange Ausführungszeiten der Befehle in den X- und Y-Pipelines
Die Strategien gegen Interlocks gehören zu den magischen Worten der Prozessortechnik:
: : : : : :
Register-Renaming Data Forwarding Data Bypassing Dynamische Verzweigungsvorhersage Spekulative Ausführung von Befehlen Out-of-order-Ausführung der Befehle
Im Folgenden werden sie genauer erläutert. Register-Renaming Der 6x86 implementiert 32 physikalische Vielzweckregister, die auf die acht x86-Vielzweckregister (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP) abgebildet werden können. Diese 32 Register stellen daher vier komplette Sätze von x86-Registern dar, sodass der 6x86 bis zu vier Ebenen spekulativer Code-Ausführung erlaubt (siehe unten). Register-Renaming löst WAW- und WARAbhängigkeiten und ist für System- und Anwendungssoftware vollständig transparent. Beispiel: WAR-Abhängigkeit X-Pipe Befehl: Vorgang:
MOV AX, BX AX <- BX
Y-Pipe Befehl: Vorgang:
ADD BX, CX BX <- BX + CX
Problem: Es muss zuerst BX gelesen werden, daher wird die Y-Pipe angehalten, weil sie BX im gleichen Taktzyklus überschreiben würde. Lösung: Beim Register-Renaming werden die Zuordnungen der 6x86-Register zu den Registern der x86-Architektur dynamisch geändert:
Sandini Bib Pentium-kompatible Mikroprozessoren
379
X-Pipe
Y-Pipe
MOV AX, BX reg0 <- reg1
ADD BX, CX reg3 <- reg1 + reg2
Registerzuordnung vorher: AX=reg0, BX=reg1, CX=reg2 Befehl Vorgang: Registerzuordnung nachher: AX=reg0, BX=reg3, CX=reg2
Der tatsächlich ausgeführte Vorgang bedeutet, dass von der X-Pipeline der Wert aus dem Register reg1 (vorher: BX, nachher: nicht belegt) ins Register reg0 (vorher: AX, nachher: AX) übertragen wird. Die Y-Pipeline liest die Werte aus reg1 (vorher: BX, nachher: nicht belegt) und reg2 (vorher: CX, nachher: CX), addiert sie und legt die Summe im Register reg3 (vorher: nicht belegt, nachher: BX) ab. Damit wird die WAR-Abhängigkeit aufgehoben. Nach dem erfolgten Register-Renaming adressiert der 6x86 das Register reg3, wenn eine Referenz auf das x86-Register BX erfolgt, d.h. der Vorgang ist nach außen (auf der Ebene mnemonischer und der Maschinencodes) völlig transparent. Das Register-Renaming ist auch für die spekulative Ausführung von Code-Abschnitten von großer Bedeutung. RAW-Abhängigkeiten können häufig durch Data Forwarding verhindert werden. Man unterscheidet zwei Arten des Forwardings: Operanden-Forwarding und Ergebnis-Forwarding. Operanden-Forwarding Der 6x86 führt ein Operanden-Forwarding (Operanden-Weiterleitung) üblicherweise aus, wenn der erste Befehl ein Register überschreibt und der zweite Befehl einen Operanden aus demselben Register liest. Beispiel: X-Pipe MOV DX, mem DX <- mem
Y-Pipe ADD AX, DX AX <- AX + DX
Zuerst wird der Operand mem aus dem Speicher gelesen und anschließend unmittelbar beiden Pipelines gleichzeitig zur Verfügung gestellt, d.h. gleichzeitig in das Register DX und das Register AX geschrieben. Daher werden beide Befehle simultan abgearbeitet und es wird eine Hemmung der Y-Pipe vermieden. Ergebnis-Forwarding Das Ergebnis-Forwarding (Ergebnis-Weiterleitung) betrifft einen ähnlichen Vorgang, nur wird hier das Ergebnis eines Befehls in das Zielregister dieses Befehls geschrieben und gleichzeitig an den nachfolgenden Befehl als Operand weitergegeben. Ohne Forwarding müsste der nachfolgende Befehl den Operanden erst aus dem Zielregister des vorherigen Befehls lesen; ein Taktzyklus wäre verloren. Beispiel: X-Pipe ADD CX, DX CX <- CX + DX
Y-Pipe MOV mem, CX mem <- CX
Der Operand DX wird hier gleichzeitig in das CX-Register und in den Speicher geschrieben, um eine Hemmung der Y-Pipeline zu verhindern.
Sandini Bib 380
Kapitel 11
Data Bypassing RAW-Abhängigkeiten, die nicht durch Data Forwarding verhindert werden können, werden durch ein Data Bypassing zumindest gemildert, d.h. die Anzahl der Totzyklen wird reduziert. Dies tritt üblicherweise auf, wenn der erste Befehl einen Operanden in den Speicher schreibt und der nachfolgende Befehl denselben Operanden wieder aus dem Speicher liest. Beispiel: X-Pipe ADD mem, BX
Y-Pipe SUB AX, mem
mem <- mem + BX
AX <- AX – mem
In diesem Fall »merkt« sich der 6x86 den Operanden mem und übergibt ihn sofort an die Y-Pipeline. Dadurch wird ein Speicherzugriff eingespart. Beachten Sie, dass der 6x86 ein solches Data Bypassing nur für Speicherbereiche ausführt, die als cachebar definiert sind. Dynamische Verzweigungsvorhersage und spekulative Ausführung von Befehlen Der 6x86 implementiert einen 4-Wege-set-assoziativen Branch Target Buffer (BTB) mit 256 Einträgen (64 pro Weg) für Verzweigungsadressen und Verzweigungsinformationen. Erfasst die Befehlslesestufe IF einen unbedingten Sprung, konsultiert sie den BTB, um festzustellen, ob für den Verzweigungsbefehl ein Eintrag existiert. Ist das der Fall (Treffer im BTB), setzt die IF-Stufe das Befehlslesen bei der Zieladresse fort. Ist kein Eintrag vorhanden (Fehltreffer im BTB), müssen die Adressberechnungsstufen AC1 und AC2 die Zieladresse erst berechnen. Beachten Sie, dass sich dieser Vorgang allein auf die Ermittlung der Zieladresse bezieht und nicht auf die Vorhersage, ob der Sprung ausgeführt wird oder nicht (unbedingter Sprung bedeutet ja, dass er immer ausgeführt wird). Unbedingte Sprünge nutzen also nur den Adresseintrag im BTB, nicht die Verzweigungsinformationen. Schwieriger zu behandeln ist ein bedingter Sprung: Falls ein Treffer im BTB auftritt, setzt sich das Befehlslesen bei der vorausgesagten Zieladresse fort. In diesem Fall benutzt der 6x86 auch die History-Information, die das Ergebnis früherer Durchläufe dieser Verzweigung repräsentieren. Ergibt sich ein Fehltreffer im BTB, behandelt die Verzweigungsvorhersage den Sprung als nicht ausgeführt (Not-Taken). Ein Sprungbefehl wird nur an die X-Pipe weitergeleitet und in der EX-Stufe wird die Voraussage der Vorhersagelogik verifiziert, falls die Verarbeitung der Verzweigungsbedingung mindestens eine Pipeline-Stufe voraus ist, d.h. sich bereits in der WB-Stufe befindet. Wenn die Verzweigungsbedingung parallel bearbeitet wird, erfolgt die Verifizierung erst in der WB-Stufe. Durch die Verteilung des früheren Befehls (hier: Sprungbedingung) auf die Y-Pipeline und Laden des späteren Befehls (hier: bedingter Sprungbefehl) in die X-Pipeline kommt es vor, dass sich Sprungbedingung und Sprungausführung parallel durch die beiden Pipelines bewegen und im selben Taktzyklus abgeschlossen werden. Im Fall eines inkorrekt vorhergesagten Sprungs werden die Pipelines geleert (Pipeline Flush) und das Befehlslesen beginnt bei der korrekten Sprungadresse erneut. Um die Anzahl der Totzyklen möglichst gering zu halten, liest der 6x86 stets den vorhergesagten und den nicht-vorhergesagten Befehlspfad ein. Dadurch wird im Fall einer falschen Verzweigungsvorhersage ein Speicherzugriff auf den Cache eingespart.
Sandini Bib Pentium-kompatible Mikroprozessoren
381
Rücksprungadressen werden in einem separaten Return Stack gespeichert, der acht Einträge aufnehmen kann. Jede CALL-Anweisung legt die Rücksprungadresse auf diesem Return Stack im Prozessor ab, jede RET-Anweisung holt die entsprechende Adresse wieder vom Stack. Beachten Sie, dass eine CALL-Anweisung die Rücksprungadresse auch auf dem Stack im Speicher (SS:ESP) ablegt und ein RET sie von dort wieder holt. Der Return Stack im Prozessor bildet also eine Art Cache für die Rücksprungadressen, um sie den Pipelines schneller zur Verfügung zu stellen. Beim ersten Auftreten einer Verzweigung wird der gesamte Code ab der vorhergesagten Sprungadresse spekulativ ausgeführt (der 6x86 »spekuliert«, dass die Verzweigung korrekt vorhergesagt worden ist), bis die Vorhersage in der EX- oder WB-Stufe verifiziert wird. Die x86-Vielzweckregister (AX usw.) werden durch Register-Renaming auf einen neuen Satz der 32 6x86-Register abgebildet und die EFlags sowie der Prozessorstatus werden gesichert. Dadurch verhindert der 6x86, dass im Fall einer inkorrekt vorhergesagten Verzweigung die ursprünglichen, korrekten Daten verloren sind und der Prozessor sich in einem undefinierten Zustand befindet. Um Gleitkommabefehle parallel zu den Integer-Befehlen ausführen zu können – FPU-Befehle benötigen typischerweise mehr Taktzyklen, können aber andererseits den Programmverlauf über Exceptions usw. beeinflussen, behandelt der 6x86 alle FPU-Befehle wie Verzweigungen, d.h. alle auf einen Gleitkommabefehl folgenden Integer-Befehle werden spekulativ ausgeführt. Da der 6x86 bis zu vier spekulative Ebenen unterstützt, können zusammen maximal vier FPU- und Verzweigungsbefehle in den Pipelines auf ihren Abschluss warten. Erweist sich eine Verzweigungsvorhersage als falsch oder löst ein FPU-Befehl eine Exception aus, verwirft der 6x86 alle ab der betreffenden Verzweigung oder ab dem FPU-Befehl ausgeführten Anweisungen mit ihren Ergebnissen und stellt über ein Register-Renaming und Wiederherstellen des Prozessorstatuses den ursprünglichen Zustand in einem einzigen Taktzyklus wieder her. Je höher die Spekulationsebene ist, desto weniger Arbeit des Prozessors war umsonst. In Abbildung 11.3 ist die spekulative Ausführung von Befehlscodes dargestellt. Der Cache oder ein externer Speicher kann durch spekulativ ausgeführten Code nicht geschrieben werden. Alle Schreibvorgänge der betreffenden Codeabschnitte werden in Schreibpuffern zwischen gespeichert und erst nach einer positiven Verifizierung der Sprungbedingung zum Cache oder Speicher durchgeschaltet. Im Fall einer negativen Verifizierung werden die entsprechenden Schreibdaten aus den Puffern gelöscht. Out-of-order-Abschluss der Befehle Beachten Sie, dass in den Stufen IF bis AC2 alle Befehle in der programmierten Reihenfolge bearbeitet, in den beiden letzten Stufen EX und WB aber unter Umständen in veränderter Reihenfolge abgeschlossen werden. Der 6x86 unterstützt nämlich einen Out-of-order-Abschluss der Befehle. Auftretende Datenabhängigkeiten – wenn z.B. der schneller ausgeführte Befehl die Ergebnisse des langsameren Befehls benötigt – werden durch Interlocks gelöst. Außerdem erfolgt die Behandlung von Exceptions und Schreibvorgängen immer in programmierter Reihenfolge, der 6x86 führt also ein Strong Write Ordering (strenge Schreibreihenfolge) aus.
Sandini Bib 382
Kapitel 11
(A)
(B)
0. Ebene 1. Ebene 2. Ebene 3. Ebene 4. Ebene
0. Ebene 1. Ebene 2. Ebene 3. Ebene 4. Ebene
spekulative Ausführung Befehl: n n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 n+10 n+11 n+12 n+13 n+14 n+15
I-Bef I-Bef
spekulative Ausführung
Jcc I-Bef I-Bef
FPU I-Bef
Jcc I-Bef I-Bef I-Bef
Jcc I-Bef I-Bef I-Bef I-Bef
Befehl: n n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 n+10 n+11 n+12 n+13 n+14 n+15
I-Bef I-Bef
verifiziert
nicht verifiziert
Jcc I-Bef I-Bef
FPU I-Bef
invalidiert Jcc I-Bef I-Bef I-Bef
invalidiert
Jcc I-Bef I-Bef I-Bef I-Bef
(C) 0. Ebene 1. Ebene 2. Ebene 3. Ebene 4. Ebene spekulative Ausführung Befehl: n n+1 n+2 n+3 n+4 n+5 n+6 n+16 n+17 n+18 n+19 n+20 ... ...
I-Bef I-Bef
Jcc I-Bef I-Bef
FPU I-Bef I-Bef I-Bef
anderer Zweig Jcc
(A) Spekulative Programmausführung bis zur 4. Ebene (B) Verifizierung des zweiten Jcc-Befehls als inkorrekt vorhergesagt (C) Fortsetzung der Programmausführung mit dem anderen Zweig von Jcc
I-Bef ... ...
Abb. 11.3: Spekulative Ausführung von Befehlscodes
Die On-Chip-Caches Der 6x86 weist einen gemeinsamen (Unified) Cache für Code und Daten mit 16 KByte Kapazität und Write-Back-Strategie auf. Er ist dual-ported, um zwei Zugriffe (Code-Lesen, Datenlesen, Datenschreiben) gleichzeitig bedienen zu können. Er kann außerdem für eine Write Allocation konfiguriert werden. Durch die Bildung eines gemeinsamen Caches für Code und Daten sind interne Abfragezyklen wie beim Pentium überflüssig. Dem Unified Cache ist ein sehr schneller und voll-assoziativer Befehls-Line-Cache für Codezugriffe nachgeschaltet. Er weist eine Kapazität von 256 Byte auf und soll Konflikte zwischen Code- und Datenzugriffen vermindern. Alle Code-Zugriffe werden zunächst nur zum BefehlsLine-Cache durchgeschaltet. Erst im Fall eines Fehltreffers untersucht der 6x86 auch seinen Unified Cache und überträgt die betreffenden Daten gleichzeitig zum Line-Cache und zur IntegerEinheit. Schreibvorgänge werden stets daraufhin untersucht, ob sie selbst-modifizierenden Code betreffen und die zugehörige Line im Befehls-Line-Cache vorhanden ist, um diese zu invalidieren. Die 6x86-Konfigurationsregister Die nach außen erscheinende Registerstruktur stimmt mit Ausnahme der modellspezifischen Register mit dem Pentium überein. Ich möchte daher im Folgenden nur auf besondere, im 6x86 implementierte Konfigurationsregister eingehen. Im Folgenden sind alle Register aufgeführt, die in identischer Weise beim 6x86 und beim Pentium implementiert sind:
: :
Vielzweckregister: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP Segmentregister: CS, SS, DS, ES, FS, GS
Sandini Bib Pentium-kompatible Mikroprozessoren
: : :
383
Steuerregister: CR0, CR2, CR3, GDTR, LDTR, IDTR, TR Debug-Register: DR0–DR7 Sonstige: EIP, EFlag
Beachten Sie, dass beim 6x86 die Bits VIP und VI für den Virtual-8086-Modus des Pentiums nicht vorhanden sind. Lediglich das ID-Flag (Bit 21) ist implementiert. Die 24 6x86-Konfigurationsregister werden über die beiden I/O-Ports 22h und 23h mit Hilfe der Befehle IN und OUT angesprochen. Das Register bei der I/O-Adresse 22h ist dabei das Indexregister, das Register bei 23h das Datenregister. Um ein Konfigurationsregister zu adressieren, müssen Sie an den I/O-Port 22h dessen Index (siehe Tabelle 11.1) schreiben. Anschließend können Sie über den Port 23h den Registerwert lesen (IN) oder schreiben (OUT). Beachten Sie, dass stets ein Zugriff auf die Adresse 22h erfolgen muss, weil der 6x86 sonst einen externen I/O-Buszyklus erzeugt (es werden ja die I/O-Befehle IN und OUT verwendet). Nach einem Reset sind die Konfigurationsregister mit den Indizes C0h-CFh und FEh-FFh ansprechbar. Wenn Sie auch die anderen Register mit den Indizes D0h-DFh adressieren möchten, ohne einen externen Buszyklus zu erzeugen, müssen die MAPEN-Bits im Konfigurations-Steuerregister CCR3 auf 01h gesetzt werden. Registerbezeichnung
Index
Breite
Steuerregister CCR0 Steuerregister CCR1 Steuerregister CCR2 Steuerregister CCR3 Steuerregister CCR4 Steuerregister CCR5 Adressbereich ARR0 Adressbereich ARR1 Adressbereich ARR2 Adressbereich ARR3 Adressbereich ARR4 Adressbereich ARR5 Adressbereich ARR6 Adressbereich ARR7 Bereichssteuerung RCR0 Bereichssteuerung RCR1 Bereichssteuerung RCR2 Bereichssteuerung RCR3 Bereichssteuerung RCR4 Bereichssteuerung RCR5 Bereichssteuerung RCR6 Bereichssteuerung RCR7 Geräteidentifizierung DIR0 Geräteidentifizierung DIR1
c0h c1h c2h c3h e8h e9h c4h-c6h c7h-c9h cah-cch cdh-cfh d0h-d2h d3h-d5h d6h-d8h d9h-dbh dch ddh deh dfh e0h e1h e2h e3h feh ffh
8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 24 Bit 24 Bit 24 Bit 24 Bit 24 Bit 24 Bit 24 Bit 24 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit
Tab. 11.1: Die 6x86-Konfigurationsregister
Die Konfigurations-Steuerregister CCR0 bis CCR5 erlauben eine umfassende Definition des 6x86-Verhaltens. In Abbildung 11.4 sehen Sie die Struktur dieser Register.
Sandini Bib 384
Kapitel 11
Das No-Cache-Bit NC1 im CCR0 legt fest, ob der Adressbereich zwischen 640 KB und 1 MB cachebar ist oder nicht. Hier befinden sich im PC die BIOSe und der Video-RAM. Durch ein gesetztes SM3-Bit im CCR1 können Sie festlegen, dass der Adressbereich 3 (ARR3; siehe Abbildung 11.5) den SMM-Adressraum darstellt. Ein Wert »1« für das NOLK-Bit deaktiviert das LOCK-Signal für alle Zugriffe außer Page Table-Zugriffen und INTA-Sequenzen. Wenn das Bit SMAC gesetzt ist, greift der 6x86 ausschließlich auf den SMM-Speicher zu, sobald die erzeugte Adresse innerhalb des SMM-Adressraums liegt. SMI hat also keine Bedeutung. Dadurch ist der SMM-Adressraum auch im normalen Betriebsmodus ansprechbar. Die SMMSchnittstelle können Sie über das USMI-Bit aktivieren. Ein gesetztes Bit aktiviert die Erkennung bzw. Erzeugung der Signale SMI und SMIACT. Für USMI werden sie ignoriert. Wenn Sie das USUSP-Bit im Register CCR2 setzen, sind die SUSP und SUSPA-Anschlüsse aktiv. Für USUSP=0 wird das Signal SUSP ignoriert und der SUSPA-Anschluss vom Bus abgetrennt. Das Schreibschutzbit WPR1 bewirkt, dass alle schreibenden Zugriffe auf cachebare Adressen zwischen 640 KByte und 1 MByte schreibgeschützt sind. Das S_HLT-Bit steuert die Auswirkungen des HLT-Befehls: Ist es gesetzt, dann tritt der 6x86 nach der Ausführung des HLT-Befehls in den Suspend-Modus ein. Durch ein gesetztes Bit LK_NW wird das NW-Bit (Not Write-Back) im Steuerregister gegen ein Überschreiben gesperrt. Der On-Chip-Cache des 6x86 arbeitet dann immer mit einer Write-Back-Strategie. Die vier MAPEN-Bits im Register CCR3 steuern den Zugriff auf die Konfigurationsregister mit den Indizes D0h-FDh. Ein Wert von 01h erlaubt Zugriffe auch auf die Register mit diesen Indizes. Aus Kompatibilitätsgründen führt der Cyrix 6x86 standardmäßig denselben Burst wie der Pentium aus. Dabei werden die Burst-Adressen nicht in linearer Weise ausgegeben (siehe Kapitel 10.4.2). Wenn Sie aber das LINB-Bit setzen, erzeugt der 6x86 die Burst-Adressen in linearer Reihenfolge (also z.B. xx00h->xx08h->xx10h->xx1bh). Durch ein gesetztes NMI_EN-Bit erfasst der Prozessor auch bei einem aktiven SMI den nicht-maskierbaren Interrupt. Sonst wird der NMI ignoriert. Wenn Sie das Bit SMI_LK einmal setzen, dann können die folgenden SMM-Konfigurationsbits nur nach einem Reset wieder verändert werden: USMI, SMAC, SM3 und NMI_EN. Das CPUID-Bit im Register CRR4 steuert den CPUID-Befehl. Ein Wert »1« bewirkt, dass das ID-Bit im EFlag-Register verändert (auf diese Weise ermittelt ein Programm, ob der Prozessor den CPUID-Befehl unterstützt) und der CPUID-Befehl ausgeführt werden kann. Für CPUID=0 ist das Bit nicht veränderbar und der Befehl CPUID erzeugt eine Exception Ungültiger Opcode. Ein gesetztes DTE_E-Bit aktiviert den DTE-Cache. Schließlich legen die drei IORT-Bits die minimale Anzahl von Bustakten fest, die zwischen zwei I/O-Zugriffen eingelegt werden müssen. Peripheriegeräte sind üblicherweise viel langsamer als die CPU. Daher können zwei Zugriffe auf diese Geräte nicht beliebig schnell ausgeführt werden. Die IORT-Bits haben eine dem RDY-Signal ähnliche Auswirkung. Der Vorteil ist, dass der Bus nicht von Wartezyklen blockiert wird. Er ist frei für andere (Speicher-) Zugriffe. Der Standardwert für IORT ist 05h, d.h. zwischen zwei I/OZugriffen werden 32 Buszyklen eingelegt. Das ARREN-Bit im Register CRR5 steuert die Aktivierung der Adressbereichsregister ARR. Ist ARREN gesetzt, sind die Register aktiviert. Beachten Sie, dass bei gesetztem SM3-Bit (Register CCR1) das Register ARR3 unabhängig vom Wert des ARREN-Bits aktiviert wird. Es steuert Funktionen des System-Management-Modus. Ein Wert »1« für das LBR1-Bit führt zur Ausgabe eines aktiv-niedrigen LBA-Signals, wenn der 6x86 auf eine Adresse im Bereich 640 KByte bis 1 MByte zugreift. Schließlich können Sie durch Setzen des WT_AL-Bits eine Write-AllocationStrategie für den On-Chip-Cache festlegen. Der Unified Cache führt dann eine Cache-Line-Ersetzung nicht nur im Fall von Lesefehltreffern aus, sondern auch für Schreibfehltreffer.
Sandini Bib Pentium-kompatible Mikroprozessoren
CCR0 NC1: CCR1 SM3: NOLK: SMAC:
USMI: CCR2 USUSP: WPR1: S_HLT: LK_NW:
res
LK_NW res
res
2 1 0
WPR1 S_HLT
7 6 5 4 3
CCR5
No Cache 640k...1M 1=Adressbereich nicht cachebar
2 1 0
reserviert
WT_AL
LBR1
ARREN
IORT
7 6 5 4 3
res
2 1 0
res
DTE_E res
7 6 5 4 3
res
SMI_LK
2 1 0
NMI_EN
res
MAPEN
USMI res
CCR4 4 3
LINB
7
CPUID res
CCR3
2 1 0
NOLK res SMAC
reserviert
CCR2
7 6 5 4 3
res res
1 0
NC1 res
2
USUSP res
CCR1
7
SM3
CCR0
385
0=Adressbereich cachebar
SMM-Adressbereich 1=Adressbereich 3 ist SMM-Adressraum Negate LOCK 1=LOCK negiert 0=normaler Betrieb Speicherzugriff im System-Management-Modus 1=Zugriffe innerhalb SMM-Adressraum greifen auf SMM-Speicher, nicht auf Hauptspeicher zu 0=normaler Betrieb Use SMI 0=deaktiviert 1=SMI und SMIACT aktiviert Suspend-Modus benutzen (Use Suspend Mode) 0=deaktiviert 1=SUSP- und SUSPA-Pins aktiviert Schreibschutzbereich 1(Write-Protect Region 1) 1=cachebare Zugriffe zwischen 640k und 1M sind schreibgeschützt 0=nicht schreibgeschützt Suspend-Modus nach HLT-Befehl (Suspend on Halt) 1=6x86 tritt nach HLT-Befehl in den Suspend-Modus ein 0=tritt nicht in Suspend-Modus ein NW-Bit sperren (Lock NW) 1=NW-Bit in CR0 nur-lesbar 0=NW-Bit lesbar/schreibbar
CCR3 MAPEN:
MAP Enable 0001b=alle CCRx adressierbar 0000b=nur CCRx mit Indizes C0h-CFh, LINB: lineare Burst-Reihenfolge 1=lineare Burst-Reihenfolge NMI_EN: NMI Enable 1=NMI wird während SMI erkannt SMI_LK: SMI Lock 1=SMM-Konfigurationsbits gesperrt CCR4 CPUID: DTE_E: IORT:
CCR5 ARREN: LBR1: WT_AL:
CPUID-Befehlsaktivierung 1=aktiviert DTE-Cache Aktivierung 1=aktiviert I/O Recovery Time 0h=1 Taktzyklus 1h=2 Taktzyklen 4h=16 Taktzyklen 5h=32 Taktzyklen
FEh, FFh adressierbar 0=Pentium-kompatible Burst-Reihenfolge 0=NMI wird nicht erkannt 0=frei adressierbar
0=deaktiviert 0=deaktiviert 2h=4 Taktzyklen 6h=64 Taktzyklen
3h=8 Taktzyklen 7h=keine Verzögerung
ARR-Register aktivieren (ARR Register Enable) 1=aktiviert 0=deaktiviert Local Bus Region 1 1=LBA bei Zugriffen auf 640k..1M aktiviert 0=nicht aktiviert Write-Through Allocate 1=Daten laden für Lese- und Schreib-Fehltreffer 0=Daten laden nur für Lese-Fehltreffer
Abb. 11.4: Die Konfigurations-Steuerregister des 6x86
Sandini Bib 386
Kapitel 11
Von erheblicher Bedeutung sind die Adressbereichsregister ARR0 bis ARR7 des 6x86. Damit können Sie bis zu acht Adressbereiche und deren Eigenschaften festlegen. Beispielsweise beschleunigt die Festlegung eines Bereichs als nicht-cachebar die Programmausführung im Vergleich zu einer Negierung des KEN-Signals durch eine externe Logik, weil der 6x86 intern die entsprechenden Datenzugriffe optimiert. Ähnliche Register sind auch beim PentiumPro implementiert. In Abbildung 11.5 sehen Sie die Struktur der Register zusammen mit den zugeordneten Bereichssteuerregistern RCR0 bis RCR7. Die 20 Adressbits A31–A12 definieren die physikalische Adresse des betreffenden Speicherblocks in 4-KByte-Einheiten. Beachten Sie, dass das höchstwertige Adressbyte A31..A24 den niedrigsten Index aufweist (Beispiel ARR0: A31..A24=Index C4h, A23..A16=Index C5h, A15..A12 zusammen mit dem Größen-Nibble=Index C6h). Das Nibble Größe legt dabei den Umfang des beschriebenen Speicherblocks fest (siehe Tabelle 11.2). Beachten Sie, dass ein Block immer an einer Grenze entsprechend einem Vielfachen der Blockgröße beginnen muss (ein Block der Größe 64 KByte kann daher nur die Adressen xxxx xxxx 0000 0000h, xxxx xxx1 0000 0000h, xxxx xxx2 0000 0000h, etc. haben). Die Adressbereiche ARR3 (definiert den SMM-Adressbereich) und ARR7 (für große Speicherblöcke) haben eine besondere Bedeutung. Die Bereichssteuerregister RCR0 bis RCR7 legen die Eigenschaften der Speicherblöcke fest. Dabei ist jedem Adressbereichsregister ARRx ein Bereichssteuerregister RCRx zugeordnet. Durch Setzen des NLB-Bits wird das LBA-Signal bei einem Zugriff auf den entsprechenden Adressbereich nie ausgegeben. Soll ein Speicherblock einer Write-Through-Strategie des Cache unterliegen, müssen Sie das WT-Bit auf den Wert »1« setzen. Das ist z.B. bei allen ROM-Bereichen vorteilhaft. Um das Write Gathering für ARRx zu aktivieren, muss der Wert des WG-Bits gleich »1« sein. Ein gesetztes WL-Bit führt zu einem Weak Locking, d.h. das LOCK-Signal wird nur für Page Table-Zugriffe und INTA-Sequenzen aktiviert. In ähnlicher Weise führt ein gesetztes WWO-Bit zu einer schwachen Schreibreihenfolge (Weak Write Ordering). Dadurch können Schreibvorgänge umgeordnet und die Busleistung erhöht werden. Das RCD/E-Bit schließlich steuert das Caching für den betreffenden Speicherblock. Im Fall der Register RCR0 bis RCR6 deaktiviert ein gesetztes RCD/E-Bit das Caching für die betreffenden Speicherblöcke. Im Fall des Registers RCR7 aktiviert es das Caching. Mit Hilfe der Register ARRx und RCRx können also bis zu acht Adressbereiche selektiv bereits auf Prozessorebene (und nicht erst durch externe Signale vom Systemcontroller) unterschiedlich behandelt werden, z.B. Memory-Mapped-Register zur Steuerung von Controllern oder der Bildschirmspeicher. Die beiden Geräteidentifizierungsregister DIR0 und DIR1 speichern Informationen zur Identifizierung der CPU. Die Werte können nicht verändert werden und stehen unabhängig vom CPUID-Befehl zur Verfügung. Abbildung 11.6 zeigt die Struktur der Register mit den Indizes FEh (DIR0) und FFh (DIR1). Der 6x86 stellt auch nach einem Reset Identifizierungsinformationen im Register EDX zur Verfügung. Das Format ist in diesem Fall: EDX=0531h oder 0533h (05h=6x86, 31h oder 33h=2x-Takt); EDX=0535h oder 0537h (05h=6x86, 31h oder 33h=3x-Takt).
Sandini Bib Pentium-kompatible Mikroprozessoren
387
ARR0...ARR7
WL
1 0
WWO RCD/E
Größe
WT
A15..A12
WG
A23..A16
7 6 5 4 3 2
NLB
A31..A24
8 7
res
16 15
0
res
23
RCR0...RCR7 4 3
ARR0–ARR7 A31..A12: physikalische Blockadresse in Einheiten zu 4KByte Größe: Größe des Speicherblocks, siehe Tabelle 11.2 RCR0–RCR7 NLB: LBA-Steuerung (No LBA) 1=LBA wird bei Zugriffen auf ARRx-Bereich nicht aktiviert 0=LBA wird aktiviert WT: Write Through (Durchschreiben) 1=Adressbereich verwendet Write-Through-Strategie 0=Write Back WG: Write Gathering 1=aktiviert für ARRx-Adressbereich 0=deaktiviert WL: Weak Locking 1=aktiviert für ARRx-Adressbereich 0=deaktiviert WWO: Weak Write Ordering 1=aktiviert für ARRx-Adressbereich 0=deaktiviert RCD/E: Cache-Steuerung für Adressbereich ARRx (Region Cache Disable/Enable) RCR0–RCR6: 1=Caching für Adressbereich ARRx deaktiviert 0=aktiviert RCR7: 1=Caching für Adressbereich ARR7 aktiviert 0=deaktiviert Abb. 11.5: Die Adressbereichsregister ARR0–ARR7 und Bereichssteuerregister RCR0–RCR7 Wert
Blockgröße
0h 1h 2h 3h 4h 5h 6h 7h
ARR0–ARR6 0 4KByte 8KByte 16KByte 32KByte 64KByte 128KByte 256KByte
ARR7 0 256KByte 512KByte 1MByte 2MByte 4MByte 8MByte 16MByte
Wert
Blockgröße
8h 9h ah bh ch dh eh fh
ARR0–ARR6 512KByte 1MByte 2MByte 4MByte 8MByte 16KByte 32MByte 4GByte
ARR7 32MByte 64MByte 128MByte 256MByte 512MByte 1GByte 2GByte 4GByte
Tab. 11.2: Blockgrößen DIR0
DIR1 0
7
DEVID
DIR0 DEVID: DIR1 SID: RID:
4 3
7
SID
0
RID
Geräteidentifizierung (Device Identification) 31h oder 33h=2x-Takt bzw. 31h oder 33h=3x-Takt (nur-lesbar) CPU Stepping (nur-lesbar) CPU Revision (nur-lesbar)
Abb. 11.6: Die Geräteidentifizierungsregister DIR0 und DIR1
Sandini Bib 388
Kapitel 11
Scatter/Gather-Schnittstelle Der 6x86 implementiert eine so genannte Scatter/Gather-Schnittstelle (engl. to scatter=verstreuen, to gather=sammeln) durch die Signale BHOLD, DHOLD, LBA und QDUMP. Sie dient zur schnellen Datenübertragung zwischen dem 64-Bit-Datenbus des 6x86 und einem externen 32-Bit-Datenbus (z.B. PCI oder EISA). Üblicherweise ist ein externer 32-Bit-Datenbus nur mit dem niederwertigen Doppelwort des 6x86-Datenbusses verbunden. Daher implementiert die Schnittstelle einen eigenen 64-Bit-Puffer, der die höherwertigen 32 Datenbit D63–D32 des 6x86Datenbus auf die niederwertigen 32 Datenbit D31–D0 umlädt (Scatter-Betrieb). Umgekehrt kann der Puffer über den externen 32-Bit-Datenbus zugeführte Daten auf die 32 höherwertigen Datenbits D63–D32 umladen und auf diese Weise einen 64-Bit-Wert zusammensetzen (Gather-Betrieb). Der 6x86 stellt bei aktiven BHOLD/DHOLD-Signalen seine interne Scatter/Gather-Schnittstelle auch externen Busmastern zur Verfügung, um den Datentransfer zwischen 32-Bit- und 64-BitEinheiten zu beschleunigen. Beachten Sie, dass bereits der i386 mit seiner Schreibdaten-Duplizierung ansatzweise ein solches Verhalten implementiert. Betriebsmodi des 6x86 Wie die Intel-Pendants kann auch der 6x86 in verschiedenen Modi betrieben werden. Die wichtigsten sind der Real-, der Protected- und der Virtual-8086-Modus sowie der System-Management-Modus. Das Paging möchte ich ebenfalls in diesem Zusammenhang erläutern, weil es sich auch hierbei um einen Betriebsmodus handelt, der wie die oben genannten die Speicheradressierung betrifft. Real-, Protected- und Virtual-8086-Modus Diese Betriebsmodi des 6x86 sind völlig kompatibel zu den entsprechenden Modi des Pentiums oder der x86-Architektur allgemein. Lediglich die Optimierungen, die Pentium und PentiumPro mit den virtuellen Interrupts Flags VI und VIP implementieren, fehlen beim 6x86. Solange aber keine für den Pentium optimierten System-Kernels z.B. für Windows 95 zur Verfügung stehen, sind diese Vorteile rein theoretischer Natur. Paging Der 6x86 implementiert ein Paging mit veränderlicher Page-Größe: Es sind Page-Größen von 4 KByte, 8 KByte, 16 KByte usw. bis zu 4 GByte möglich. Größere Pages sind vor allem für große Pufferspeicher (z.B. für den Video-RAM) vorteilhaft, weil das Swapping dieser Page dann nur selten vorkommt und die Bildschirmdaten schneller aktualisiert werden können. Zusätzlich zum direct-mapped Translation Lookaside Buffer TLB mit 128 Einträgen sind beim 6x86 ein voll-assoziativer DTE-Cache für Directory-Table-Einträge mit vier Einträgen und ein vollassoziativer Victim-TLB (Victim=Opfer) mit acht Einträgen implementiert. Der DTE-Cache speichert die letzten DTE-Zugriffe. Dadurch ist bei einem Page Table-Fehltreffer, auf den aber ein Treffer im DTE-Cache erfolgt, nur ein einziger Speicherzugriff notwendig. Der Victim-TLB speichert Page Table-Einträge PTE, die vom TLB auf Grund eines TLB-Fehltreffers entfernt wurden. Zugriffe auf einen Page Table-Eintrag, der im Victim-TLB, nicht aber im Haupt-TLB gespeichert ist, führen dazu, dass dieser Eintrag mit einem gültigen Eintrag im TLB die Plätze tauscht. Dadurch sollen Assoziativität und Trefferrate selektiv erhöht werden. System-Management-Modus Wie alle modernen Mikroprozessoren implementiert auch der 6x86 einen SystemmanagementModus. Er ist primär für Stromsparfunktionen vorgesehen, kann aber auch für andere Zwecke
Sandini Bib Pentium-kompatible Mikroprozessoren
389
(z.B. Wiederanlaufroutinen) benutzt werden. Da sich der 6x86-SMM von dem des Pentiums unterscheidet, möchte ich kurz näher darauf eingehen. Der Ablauf vom Eintritt in den SMM über die Programmausführung bis zur Rückkehr zum unterbrochenen Programm ist folgendermaßen: Auslösung eines System Management Interrupts (SMI aktiv oder SMINT-Befehl) -> CPUZustand im SMM-Adressraum speichern -> SMM-Programmausführung im Real Mode -> Rückkehr zum unterbrochenen Programm (RSM-Befehl) -> normale Programmausführung Damit der 6x86 einen SMI oder den SMINT-Befehl erkennt, muss der SMM-Adressraum auch entsprechend vorbereitet sein. Dazu müssen Sie die Register nach Tabelle 11.3 laden. Register
Bit
Bitwert für Erkennung von SM-Interrupts.
CCR1
SMI SMAC SM3 Größe
SMI 1 0 1 >0
ARR3
SMINT 1 1 1 >0
Tab. 11.3: Erkennung von SMI-Quellen
Wie in geringerem Maße auch bei gewöhnlichen Interrupts und Subroutinenaufrufen (CS:EIP) muss der 6x86 vor dem Eintritt in den SMM (der als Interrupt konzipiert ist) die wesentlichen Informationen über den CPU-Zustand speichern. Im Gegensatz z.B. zu einem gewöhnlichen Interrupt, der die CS:EIP-Information auf dem Stack im normalen Adressraum ablegt, initialisiert der 6x86 beim Eintritt in den SMM automatisch einen Header im SMM-Adressraum. Der Header befindet sich am oberen Ende des SMM-Adressraums und umfasst 48 Byte. In Tabelle 11.4 sehen Sie den Aufbau des Headers. Offset*)
Größe
Inhalt
00h -04h -08h -0ch -10h -14h
4 Byte 4 Byte 4 Byte 4 Byte 4 Byte 4 Byte
-18h -20h
8 Byte 4 Byte
-24h -28h -2ch
4 Byte 4 Byte 4 Byte
DR7 EFlag CR0 EIP des gegenwärtigen Befehls EIP des folgenden Befehls Bit 31..23: reserviert; Bit 22..21: CPL; Bit 20..16: reserviert; Bit 15..0: CS-Selektor CS-Deskriptor Bit 31..5: reserviert; Bit 4: 1=6x86 in Shutdown oder Halt vor SMM; Bit 3: 1=SMM ist Folge eines Software-SMINT; Bit 2: 1=gegenwärtiger Befehl hat REP-Präfix; Bit 1: 1=gegenwärtiger Befehl ist I/O-Schreiben, 0=gegenwärtiger Befehl ist I/O-Lesen; Bit 0: reserviert Bit 31..16: I/O-Schreibdatengröße; Bit 15..0: I/O-Schreib-Port I/O-Schreibdaten gegenwärtiger Befehl REP OUTSx: ESI; gegenwärtiger Befehl REP INSx: EDI
*) relativ zum oberen Ende des SMM-Adressraums
Tab. 11.4: 6x86-Registerauszug im SMM-RAM
Die Sonderbehandlung der I/O-Befehle und insbesondere der I/O-Befehle mit REP-Präfix rührt daher, dass sie häufig Steuer- und Datenregister von Peripherieeinheiten ansprechen. Das Parade-
Sandini Bib 390
Kapitel 11
beispiel ist die (E)IDE-Schnittstelle: Hier werden über IN/OUT-Befehle die Steuer- und Statusregister gelesen bzw. geschrieben und mit Hilfe eines REP OUTSx Schreibdaten an das Laufwerk zur Abspeicherung übergeben bzw. mit REP INSx Lesedaten vom Laufwerk gelesen (PIO-Modus). Tritt ein externer System Management Interrupt ausgerechnet während einer Übertragung der Leseoder Schreibdaten auf, ist es notwendig, dass der SMI-Handler diese Situation erfährt und entsprechende Maßnahmen ergreifen kann, damit die (E)IDE-Schnittstelle und der Laufwerkcontroller nicht in einem undefinierten Zustand verbleiben. Beispielsweise kann der Handler die anhängige Datenübertragung abschließen, bevor er mit der Ausführung der SMM-Routine beginnt. Die in Tabelle 11.4 aufgeführten Daten stellen einen minimalen Satz von Registern dar, die vom Prozessor häufig verändert werden. Wenn Sie auch andere Register schreiben möchten, müssen Sie deren Werte gesondert sichern. Der 6x86 implementiert dazu verschiedene SMM-Befehle, die nur im SMM-Modus (oder falls das SMAC-Bit im Register CCR1 gesetzt ist) gültig sind (siehe auch Anhang B):
: : : : : : :
SVDC mem80, sreg3: Segmentregister und Segmentdeskriptor sichern RVDC sreg3, mem80: Segmentregister und Segmentdeskriptor wiederherstellen SVLDT mem80: LDTR und Deskriptor sichern RVLDT mem80: LDTR und Deskriptor wiederherstellen SVTS mem80: TSR und Deskriptor sichern RSTS mem80: TSR und Deskriptor wiederherstellen RSM: Normalmodus wiederaufnehmen
Beim Eintritt in den System-Management-Modus werden die Register CR0, EFlag und DR7 wie bei einem Reset initialisiert. Das ARR3-Register definiert die neue Basis des CS-Registers, sein Limit beträgt 4 GByte, d.h. bis zum Ende des linearen und physikalischen Adressraums. Die Programmausführung beginnt im Real Mode. Später kann der SMM-Handler aber auch in den Protected- oder Virtual-Mode umschalten. Der 6x86-Bus Der Bus des 6x86 stimmt in allen wesentlichen Punkten mit dem des Pentiums überein. Es sind lediglich die privaten Buszyklen für den Dual-Processing-Betrieb nicht vorgesehen und die Adressreihenfolge für Burst-Lesezyklen ist etwas unterschiedlich. Der 6x86 führt nach einem Reset Burst-Lesezyklen in der »1+4«-Adressreihenfolge aus (siehe Tabelle 11.5). erste Adresse 0h 8h 10h 18h
Burst-Adressreihenfolge
Einzeltransferzyklus
0h->8h->10h->18h 0h->8h->10h->18h 10h->18h->0h->8h 10h->18h->0h->8h
keiner Adresse 8h keiner Adresse 18h
Tab. 11.5: »1+4«-Adressreihenfolge
Wenn die erste Adresse ...xxx8h lautet, erzeugt der 6x86 zuerst einen Einzeltransferzyklus für die Adresse ...xxx8h oder ...xx18h. Dazu sind (ohne Wartezyklen) mindestens zwei Bustaktzyklen notwendig. Erst anschließend führt er einen »wirklichen« Burst nach Tabelle 11.4 aus. Die anschließenden Bursts sind dann kompatibel mit dem Pentium-Burst-Zyklus. Die umständlichen Pentium-Bursts 08h->00h->18h->10h und 18h->10h->08h->00h werden dadurch vermieden, allerdings durch einen zusätzlichen Einzeltransferzyklus 08h bzw. 18h. Man könnte die 6x86-Bursts
Sandini Bib Pentium-kompatible Mikroprozessoren
391
für die Startadressen ...xxx8h auch als 2-2-1-1-1 Burst mit der Übergabe von lediglich 32 Byte (statt 40) bezeichnen. Es werden also dieselben 8 Byte zweimal eingelesen. Das reduziert natürlich die Übertragungsrate des 6x86-Bus im »1+4«-Modus. Durch Setzen des LINB-Bits im Konfigurations-Steuerregister CCR3 können Sie lineare Adressreihenfolgen für die Bursts aktivieren. Der 6x86 erzeugt dann die Adressen entsprechend der Tabelle 11.6. erste Adresse
Burst-Adressreihenfolge
0h 8h 10h 18h
0h->8h->10h->18h 8h->10h->18h->0h 10h->18h->0h->8h 18h->0h->8h->10h
Tab. 11.6: Lineare Burst-Adressreihenfolgen
Dies sind ohne Wartezyklen richtige 2-1-1-1-Bursts, d.h. gegenüber der »1+4«-Adressreihenfolge spart der 6x86 zwei Bustaktzyklen ein. Die Übertragungsbandbreite des 6x86-Busses ist dann im Schnitt (zwei Einzeltransferzyklen auf vier Bursts eingespart) um 20% höher. CPUID Ist das CPUID-Bit im Konfigurations-Steuerregister CCR4 (siehe Abbildung 11.4) gesetzt, kann der CPUID-Befehl dazu benutzt werden, den CPU-Typ zu bestimmen. In diesem Fall ist auch das ID-Flag veränderbar. Ohne gesetztes CPUID-Bit führt der Opcode 0FA2H zu einer Exception Ungültiger Opcode. Nach einem Aufruf des CPUID-Befehls mit dem Wert 00h im EAX-Register enthalten die drei Register EAX, EBX und ECX in dieser Reihenfolge eine 12-Byte-Identifizierung in ASCII-Form: »CyrixInstead«. Wenn Sie anschließend das EAX-Register mit einem Wert 01h laden und den CPUID-Befehl nochmals auslösen, gibt der Pentium im EAX-Register einen Identifizierungswert ähnlich der Identifizierungsinformation in den Geräteidentifizierungsregistern DIR0 und DIR1 zurück. In Tabelle 11.7 finden Sie die Aufruf- und Rückgabewerte von CPUID. Register
Aufrufwert
Rückgabewert
EAX EBX ECX
00h
»Cyri« »xIns« »tead«
EAX EDX
01h
xxxxxxxx xxxxxxxx xx000101 00100000b1) Feature Flag2)
1)
Bits 31...14 Bits 13...12 Bits 11...8 Bits 7...4 Bits 3...0
reserviert (=00h) Typ (00b) Prozessorfamilie (0101=05h für 6x86) Modellnummer (0010b=02h) Stepping (0000b=0h)
2)
Bits 31...1: Bit 0:
reserviert (=00h) On-Chip-Gleitkommaeinheit (1=On-Chip FPU , 0=keine On-Chip FPU)
Tab. 11.7: Aufruf- und Rückgabewerte von CPUID
Sandini Bib 392
Kapitel 11
Ausführungszeiten Ein Vergleich der spezifizierten Ausführungszeiten für Integer- und FPU-Befehle zeigt folgendes Bild: Der 6x86 ist bei Integer-Befehlen mit Zugriffen auf den Cache und generell für Ganzzahlmultiplikationen und -divisionen schneller als der Pentium. Manche Befehle zur Steuerung des Protected Modes (z.B. LLDT=Load LDT) werden vom 6x86 in weniger Taktzyklen abgearbeitet. Dagegen sind die IN- und OUT-Befehle im Pentium schneller erledigt. Da der Pentium auch als Konkurrenz zu den schnellen RISC-Chips der Workstations (SPARC, MIPS) konzipiert war, überrascht es nicht, dass er bei den meisten häufig benutzten FPU-Befehlen (FADD, FMUL etc.) schneller als der 6x86 ist. Der Hardwareaufwand des Pentiums für seine FPU ist daher auch deutlich größer als beim 6x86. Beachten Sie aber, dass sich die Taktspezifikationen auf Befehle beziehen, die bereits optimal zur Ausführung vorbereitet wurden (sie befinden sich im Cache oder sind bereits vordecodiert). Ist das nicht der Fall, dann spielen die Busschnittstelle, die Effizienz des BTBs und schließlich die Leistungsfähigkeit des externen Systemcontrollers eine entscheidende Rolle.
11.1.2
Der Cyrix 6x86MX
Einige Monate nach der Vorstellung des AMD-K6 folgte auch Cyrix mit einem Pentium MMXkompatiblen Mikroprozessor – dem 6x86MX–, der auch unter dem Codenamen M2 bekannt ist. Im Prinzip ist dies ein 6x86 mit erweiterter Multimediafunktionalität (MMX). Der L1-Cache ist wie beim Vorgänger unified ausgeführt, bietet demgegenüber jedoch eine doppelte Kapazität von 64 KByte. Wie alle Pentium-MMX-kompatiblen CPUs (Ausnahme die WinChips von IDT) benötigt der 6x86MX eine zweifache Spannungsversorgung, die für den Kern 2,8 V und 3,3 V für die Ausgangstreiber (I/O) beträgt. Der gravierende Nachteil des Cyrix 6x86, nämlich der horrende Stromverbrauch bei Markteinführung, ist hier von Vornherein gelöst worden: der Cyrix 6x86MX benötigt etwa gleich viel Leistung wie ein Pentium MMX oder ein AMD K6. Wie der K6 weist auch der 6x86MX keinen L2Cache im selben Gehäuse auf, er ist für einen Sockel 7 vorgesehen. Der auf 64 KByte vergrößerte L1-Cache (32 KByte Daten-, 32-KByte Code-Cache) gleicht dies aber aus. Die MMX- und FPU-Ausführungszeiten entsprechen ungefähr den Werten von Pentium MMX und K6, sodass der Cyrix 6x86MX etwas schneller als ein Pentium MMX mit der gleichen Taktfrequenz ist und fast die Werte eines gleich schnell getakteten Pentiums II erreicht. Auch der Cyrix 6x86MX ist für 16- und 32-Bit-Befehle optimiert. Die FPU-Einheit wurde deutlich verbessert, die über den 6x86 vergossenen »FPU-Tränen« gehören damit der Vergangenheit an. Im Folgenden eine kurze Aufstellung der wichtigsten Kenngrößen des Cyrix 6x86MX:
: : : :
MMX-Technologie unified 64 KByte L1-Code- und Daten-Cache, mit Write-Back-Strategie und zusätzlichem Befehls-Line-Cache hocheffiziente Verzweigungsvorhersage mit 1-History-Tabelle und Branch-Target-Cache mit 512 Eintragen zwei hierarchisch geordnete TLBs mit 16 (L1-TLB) bzw. 384 (L2-TLB) Einträgen
Insgesamt ist der Cyrix 6x86MX (ähnlich wie der AMD-K6) ein in allen Punkten wesentlich verbesserter »6x86-MMX«. Der Prozessorkern des 6x86MX ähnelt dem des PentiumPro oder Pentium II, geht also etwas vom Superskalarprinzip hin zu dynamischer und flexibler Befehlsausführung. Er implementiert die schon vom 6x86 bekannten Spezialregister und identifiziert sich beim CPUID-Befehl als ein Prozessor der 6. Familie.
Sandini Bib Pentium-kompatible Mikroprozessoren
393
Die letzte CPU, die unter der Cyrix-Bezeichnung erhältlich ist und einen »krummen« Systemtakt voraussetzt, trägt die Bezeichnung M-II-333. Diese Pentium-kompatible CPU arbeitet mit einem Systemtakt von 83 MHz in einem Sockel 7 und erbringt eine höhere Leistung als der Celeron mit 300 MHz und dies bei einem geringeren Preis. Die höher getakteten CPUs (PR350, PR400) arbeiten demgegenüber mit einem Systemtakt von 100 MHz. Auf der Basis der M-II-Chips hat VIA die Joshua-CPU für den 370-poligen Sockel als Konkurrenz zum Celeron entwickelt. Die jeweiligen Bezeichnungen (433-500) ergeben sich dabei auch wieder aus dem Pentium-Rating. Die Joshua-CPUs unterstützen einen Systemtakt von 66, 100 und 133 MHz und besitzen einen integrierten L2-Cache von 256 KByte. Pentium-Rating Zur Beurteilung und damit zum Vergleich der Leistungsfähigkeit verschiedener Mikroprozessoren gibt es verschiedene Benchmarkprogramme, die aus einer Sammlung typischer Applikationen bestehen, wie Textverarbeitung, Grafik, Tabellenkalkulation, Desktop-Publishing und weitere. AMD, Cyrix, IBM und SGS haben sich gemeinsam auf ein Benchmarkprogramm (»Winstone« von Ziff Davis) geeinigt, welches die Gleichrangigkeit zum Original-Pentium bewertet und wonach sich dann die Bezeichnung ergibt – das P-Rating. Demnach ist ein mit 150 MHz getakteter Cyrix-Prozessor so leistungsfähig wie ein Pentium, der mit 200 MHz getaktet ist. Die folgende Tabelle zeigt die weiteren Zuordnungen.
Takt einer Cyrix-CPU
6x86-Bezeichnung
Intels Pentium-Äquivalent
100 MHz 110 MHz 120 MHz 133 MHz 150 MHz 150 MHz 166 MHz 187,5 MHz 200 MHz 225 MHz 250 MHz
P120+ P133+ P150+ P166+ P200+ P166+MX P200+MX P233+MX P266+MX P300+MX P333+MX
120 MHz 133 MHz 150 MHz 166 MHz 200 MHz 166 MHz, MMX 200 MHz, MMX 233 MHz, MMX 266 MHz, MMX (theoretisch) 300 MHz, MMX (theoretisch) 333 MHz; MMX (theoretisch)
Tab. 11.8: Der Zusammenhang zwischen den tatsächlichen CPU-Taktfrequenzen der Cyrix und denen der PentiumCPUs auf Grund des P-Ratings. Das Zeichen »+« steht dabei für »besser als«.
Einige Varianten des 6x86MX setzen einen Motherboard-Takt von 75 MHz oder auch 83 MHz voraus, was nicht alle Boards bieten, denn die üblichen Sockel 7-Motherboards arbeiten mit maximal 66 MHz, wodurch die Verwendbarkeit etwas einschränkt wird.
11.2 CPUs von AMD Die Firma AMD hatte den schnellsten 386-Prozessor, der mit 40 MHz (Intel maximal 33 MHz) getaktet wird, hergestellt und eine ganze Palette von 486-Prozessoren, wie z.B. den AMD 486DX4. Vom Preis interessant ist auch die Version AMD 5x86 PR75, die allerdings nicht Pentium-kompatibel ist, sondern in 486-Boards ihren Platz findet. Sie benötigt 3,3 V und demnach ein entsprechendes Motherboard oder einen Zwischensockel mit einem Spannungswandler von 5 V auf 3,3 V.
Sandini Bib 394
Kapitel 11
Die Bezeichnung 5x86 PR75 impliziert, dass diese CPU die Leistungsfähigkeit einer PentiumCPU bietet, die mit 75 MHz getaktet wird (P-Rating, s.o.). Sie arbeitet mit einem externen Takt von 33 MHz, der intern vervierfacht wird (133 MHz) und hat schon so manchem betagten 486Motherboard zu einer besseren Performance verholfen. Die erste »richtige« Pentium-kompatible CPU von AMD wird als 5K86 oder auch kurz K5 bezeichnet. In einigen Manuals zu Motherboards findet man auch die Bezeichnung AMD5k86. Das Spektrum reicht von 75 MHz bis 133 MHz, wobei auch hier, wie bei den Cyrix-CPUs, wieder eine Bezeichnung laut P-Rating verwendet wird und der Typ AMD K5x86 PR166 intern demnach mit 133 MHz arbeitet.
11.2.1
Der K5 – 5K86
Der K5-Prozessor stellt eine vollständige Eigenentwicklung von AMD dar. Seine Technologie ist wie die des Cyrix 6x86 zwischen dem Pentium und der nachfolgenden Generation (PentiumPro bzw. Pentium II) angesiedelt. Nach außen ist er kompatibel zum Pentium P54C und auch die internen Register und andere spezifische Pentium-Features, wie z.B. die Erweiterungen des Virtual-8086-Modus, sind hier wesentlich mehr am Intel-Vorbild orientiert, als dies beim 6x86 der Fall ist. Trotzdem verbergen sich hinter dieser Fassade, die die letzte dem Programmierer zugängliche Ebene darstellt, fortgeschrittene RISC-Prinzipien in Reinkultur. Beispielsweise setzt der Decoder des 5K86 (das Herzstück, von dem der größte Teil der Performance abhängt) alle x86-CISC-Befehle in eine mehr oder weniger komplexe Menge von einfachen RISC-Operationen (so genannte ROPs) um. Diese werden dann intern in einem einzigen Taktzyklus und parallel abgearbeitet. Im Folgenden möchte ich kurz die wichtigsten Kenndaten des 5K86 aufführen.
: : : : : : : : : : :
Zwei Integer-Pipelines On-Chip FPU Out-of-Order-Ausführung und -Abschluss von Befehlen Spekulative Programmausführung Register-Renaming Dynamische Verzweigungsvorhersage Daten-Forwarding 16-KByte-Code-Cache 8-KByte-Daten-Cache Pages mit 4 KByte und 4 MByte Pentium-Sockel- und Register-Kompatibel
Anschlüsse und Signale Der 5K86 wird in einem mit dem P54C kompatiblen SPGA-Gehäuse mit 296 Anschlüssen ausgeliefert. Da der 5K86 weder einen Dual-Processing-Betrieb noch ein Performance Monitoring unterstützt und auch keinen On-Chip-APIC aufweist, fehlen ein paar Signale. Sie sind im Folgenden zusammen mit den Koordinaten der zugehörigen Anschlüsse (vergleiche Abbildung 10.2) kurz aufgeführt:
: : :
APIC: PICCLK (H34), PICD0/DPEN (J33), PICD1/APICEN (L35) Dual-Processing-Modus: CPUTYP (Q35), PBGNT (AD4), PBREQ (AE3), PHIT (AA3), PHITM (AC3) Performance Monitoring: PM0/BP0 (Q3), PM1/BP1 (R4)
Sandini Bib Pentium-kompatible Mikroprozessoren
395
Natürlich sind auch keine lokalen Interrupts LINT0 und LINT1 möglich; die entsprechenden Anschlüsse sind stets als INTR bzw. NMI konfiguriert. Es gibt keine zusätzlichen Anschlüsse, die beim Pentium nicht vorhanden wären, alle Signale haben dieselbe Bedeutung. Interner Aufbau In Abbildung 11.7 sehen Sie ein Blockdiagramm des 5K86. Er weist getrennte Caches für Code (16 KByte) und Daten (8 KByte) mit Write-Back-Strategie auf. In den Caches sind die linearen Tags für den TLB gebildet, die physikalischen Tags befinden sich in der Speicherverwaltungseinheit. Das bedeutet, dass der TLB mit linearen Adressen (vor dem Paging) und physikalischen Adressen (nach dem Paging) arbeitet. Vom Code-Cache gelangen die Befehle in eine Befehls-Queue, die sie an vier parallele Dekodereinheiten Fast Path/µ-Code verteilt. Schließlich werden die Befehle in zusammen zwei ALUs, einer FPU (mit einem intern erweiterten 82-Bit-Format), einer Verzweigungseinheit und zwei Load/Store-Einheiten ausgeführt. Der Schreibpuffer umfasst vier Einträge und federt Schreibvorgänge in Speicheradressen ab, der Reorder-Puffer mit seinen 16 Einträgen führt einen korrekten Abschluss der Befehle durch, die das Register-File schreiben. Die angegebenen Einheiten sind durch zwei Pipelines miteinander verknüpft. 64-BitDatenbus
32-BitAdressbus
Busschnittstelle Speicherverwaltungseinheit MMU mit physikalischen Tags 8kByteDaten-Cache lineare Tags
16Byte-Code Cache lineare Tags Byte Queue
Fast µPath Code
ALU I
Fast µPath Code
ALU II
FPU
Fast µPath Code
Fast µPath Code
Load Store I
Verzw.
Load Store II
Reorder-Puffer Schreibpuffer Register-File
Abb. 11.7: Der interne Aufbau des AMD5K86
Prefetching und Vordecodierung Eine dem Code-Cache beigeordnete Prefetch- und Vordekodiereinheit liest bei einem Fehltreffer im Befehls-Cache eine 32-Byte Cache-Line in einen Prefetch Cache ein und führt gleichzeitig (On the Fly) eine Vordekodierung aus, um die nachfolgenden Decodierstufen zu entlasten. Beispielsweise ermittelt die Vordecodierstufe die Länge des Befehls (die für einen x86-Befehl zwischen einem und
Sandini Bib 396
Kapitel 11
15 Byte betragen kann), ob ein bestimmtes Byte das erste, letzte oder ein Zwischenbyte eines x86Befehls ist sowie die Anzahl der 5K86-internen RISC-Operationen, die dieser komplexe CISCBefehl zur Ausführung im Prozessor benötigt. Diese Information wird zusammen mit den BefehlsBytes im Code-Cache abgelegt und später von der Befehlslesestufe der Pipelines abgerufen. Integer-Pipelines und ROPs
Retire-Stufe WB
Ergebnisstufe RS
Ausführungsstufe EX
Dekodierstufe D2
Dekodierstufe D1
Prefetch- oder Befehlsholstufe IF
Die beiden Pipelines u und v des 5K86 umfassen jeweils sechs Stufen, d.h. der AMD5K86 ist wie der Pentium ein Superskalar. Die einzelnen Stufen sehen Sie in Abbildung 11.8.
u-Pipeline Befehl k Befehl k-2 Befehl k-4 Befehl k-6 Befehl k-8 Befehl k-10
Ergebnis k-10
Zyklus n v-Pipeline Befehl k+1 Befehl k-1 Befehl k-3 Befehl k-5 Befehl k-7 Befehl k-9
In-Order-Verarbeitung
Ergebnis k-9
Out-of-Order-Abschluss
Abb. 11.8: Die Struktur der AMD5K86-Pipelines
Die erste Prefetch- oder Befehlslesestufe IF liest bis zu 16 Befehls-Bytes zusammen mit den Vordekodierinformationen aus dem Code-Cache oder (bei einem Cache-Fehltreffer) aus dem Prefetch Cache. Außerdem führt sie mit Hilfe eines Branch-Target-Puffers BTB eine dynamische Verzweigungsvorhersage aus. Laut AMD erreicht die Vorhersage eine Trefferquote zwischen 70% und 85% aller bedingten Verzweigungen. Die maximale Tiefe des anschließend spekulativ ausgeführten Codes beträgt drei Ebenen. Die Vordekodiereinheit ist zusammen mit den beiden Dekodierstufen D1 und D2 im AMD5K86Decoder gebildet (genauer gesagt schleust der 5K86 x86-Befehls-Bytes in zwei Pipelines mit den Stufen D1 und D2 durch den Decoder). Dieser Decoder bildet das Herzstück des AMD-Prozessors und zerlegt die x86-CISC-Befehle in kleine und schnell ausführbare RISC-Befehle, die so genannten RISC-Operationen ROP. Einfache CISC-Befehle (MOV, ADD, SHIFT usw.) werden von den Fast-Path-Konvertern in ein bis drei ROPs umgesetzt, komplexe Befehle durch Mikrocode (µ-Code). Die vier Konverter übergeben bis zu vier ROPs pro Zyklus an die Ausführungseinheiten. Dadurch können z.B. zwei CISC-Befehle, die in jeweils zwei ROPs umgesetzt werden, parallel in den beiden Pipes ausgeführt werden. Nur diese ROPs (!) und nicht die ursprünglichen CISC-Befehle werden dann parallel durch die Pipelines geschleust. Das erleichtert einerseits erheblich die Pipeline-Strukturen, andererseits muss die Zerstückelung in die ROPs sehr effizient geschehen. Diese Aufgabe erledigen die beiden Dekodierstufen D1 und D2. Durch die RISCOperationen wird praktisch eine unterhalb der x86-Architektur liegende Befehlsebene implementiert. Wenn man dieses Vorgehen mit einem reinen CISC-Prozessor (z.B. dem i386) vergleicht, dann ist die Aufteilung eines x86-CISC-Befehls in die ROPs der Ausführung mehrerer mikrocodierter Befehle beim i386 ähnlich. Nur sind die ROPs wesentlich leistungsfähiger als Mikrobefehle (sie umfassen praktisch eine Menge parallel ausgeführter Mikrobefehle) und zudem fest-verdrahtet, müssen also nicht aus einem Mikroprogrammspeicher gelesen werden.
Sandini Bib Pentium-kompatible Mikroprozessoren
397
Die erste Dekodierstufe D1 führt die Befehlsbytes mit ihren Vordecodierinformationen in der 16Byte-Queue zusammen und erzeugt die internen ROPs. Die zweite Decodierstufe D2 führt anschließend Register- und Immediate-Operanden zusammen und adressiert den Reorder-Puffer ROP, um alle Operanden bereitzustellen. In der Ausführungsstufe EX werden die ROPs an die Ausführungseinheiten (ALU I+II, FPU, Verzweigung, Load/Store I+II) übergeben und der Befehl ausgeführt. Hier ist auch die In-Order-Ausführung der Befehle beendet, weil die ROPs möglicherweise unterschiedliche Ausführungszeiten haben oder Interlocks produzieren. Es erfolgt also ein Out-of-Order-Abschluss der Befehle. Die Ergebnisstufe RS führt das Daten-Forwarding aus, schreibt entsprechende Einträge im Reorder-Puffer ROB (um ein Register-Renaming und spekulative Programmausführung zu implementieren) und verifiziert die Verzweigungsvorhersage. Die Retire-Stufe WB schreibt die x86-Architekturregister, nachdem z.B. eine Ebene der spekulativen Programmausführung verifiziert worden ist und leitet Datenschreibvorgänge, die im Schreibpuffer auf ihre Bestätigung warten, zum Daten-Cache (oder dem Speichersubsystem) weiter. Beachten Sie, dass alle Schreibvorgänge zum Speicher- oder I/O-Adressraum in exakt der programmierten Reihenfolge ausgeführt werden; der AMD5K86 führt also wie der Pentium die Schreibvorgänge streng geordnet (strongly-ordered) aus. Das Retiring in der Retire-Stufe WB kann eine veränderliche Zahl von Taktzyklen nach der Ergebnisstufe RS erfolgen, ohne den Pipeline-Durchsatz zu beeinflussen, da der 5K86 maximal vier ROPs in der Retire-Stufe abschließen und auf diese Weise »aufholen« kann. Erwähnen möchte ich an dieser Stelle noch, dass ein weiterer Prozessor, der NexGen 586, eine ähnliche Umsetzung der CISC-Befehle in RISC-Operationen implementiert. Da er aber keine Marktbedeutung erlangen konnte (zum Zeitpunkt der Drucklegung ist gerade der Nachfolger NexGen 686 in Entwicklung), möchte ich an dieser Stelle nicht weiter darauf eingehen. Im Folgenden sind die vom AMD5K86 implementierten RISC-Strategien zur Vermeidung von Pipeline-Hemmungen und zur Steigerung des Befehlsdurchsatzes aufgeführt. Details zu den einzelnen Strategien finden Sie im Kapitel 11.1.1 über den Cyrix-6x86:
: : : : : :
Register-Renaming Dynamische Verzweigungsvorhersage und spekulative Ausführung von Befehlen Ergebnis-Forwarding Operanden-Forwarding Data Bypassing Out-of-order-Abschluss der Befehle
Befehlspaarung Die Umsetzung der x86-Befehle in die ROPs beeinflusst natürlich auch die Befehlspaarung auf x86-Ebene. Dennoch ist sie vor allem durch die zwei leistungsfähigen ALUs weniger restriktiv als beim Pentium. ALU-Befehle treten am häufigsten auf und verhindern am ehesten eine Paarung. Natürlich können die den CISC-Befehlen zugeordneten ROPs nur dann parallel ausgeführt werden, wenn sie nicht gleichzeitig dieselbe Ausführungseinheit benutzen (also z.B. nicht beide, einen FPU- oder Verzweigungsbefehl explizit oder implizit enthalten). Daher sind zwei ALUs und auch zwei Load/Store-Einheiten implementiert, da x86-Befehle durch ihre vielfältigen Adressierungsmöglichkeiten häufig explizite (MOV reg, mem; explizit: mem) oder implizite Speicherzugriffe (RET; implizit: SS:ESP) enthalten. In Tabelle 11.9 sind Paarungsmöglichkeiten für die beiden ALUs aufgeführt; die Load/Store-Einheiten sind symmetrisch, entsprechende Befehle können daher immer gepaart werden.
Sandini Bib 398
Kapitel 11
Befehl
ALU I
ALU II
Addition Subtraktion Multiplikation Division Logikfunktion Vergleich gepackte BCD nicht-gepackte BCD ADDC, SUBB Shift
ja ja ja ja ja ja ja ja ja nein
ja ja ja nein ja ja nein nein nein ja
Tab. 11.9: Befehlspaarungen für die ALUs
Natürlich führt der mikrocodierte Teil der Befehlskonverter eine implizite Befehlspaarung aus, um komplexe x86-Befehle (z.B. String-Befehle mit REP-Präfix oder Exceptions) möglichst effizient abzuarbeiten. Gleitkommaeinheit Die Gleitkommaeinheit des AMD5K86 weist zwei Pipelines zur Addition und Multiplikation von Werten sowie eine Erfassungs-Pipeline auf, insgesamt also drei Pipelines. Die FPU-ROPs werden immer paarweise an die FPU übergeben. Dabei enthält der erste ROP die niederwertige Hälfte der beiden FPU-Operanden X und Y und der zweite ROP die höherwertige Hälfte von X und Y sowie den Opcode. Die Operanden der beiden ROPs werden zusammengeführt und in ein internes 82-Bit-Format umgewandelt (vergleiche: die IEEE-Norm arbeitet mit dem 80-BitTemporary-Real-Format). Dadurch wird die Genauigkeit gesteigert; andererseits benötigt die Umwandlung aber einen Taktzyklus. Nur wenn die Operanden durch Daten-Forwarding direkt von der FPU-Pipeline kommen, entfällt diese Umwandlung und damit der eine Totzyklus. Die meisten häufig benötigten und einfachen Befehle (wie z.B. FADD) sind festverdrahted (FastPath-codiert), alle komplexen Befehle sind mikrokodiert (wie auch beim Pentium), weil sie sich meistens aus einer mehr oder weniger umfangreichen Folge von FP-Additionen/Multiplikationen zusammensetzen. Die On-Chip-Caches Der 5K86 weist einen 16-KByte-Befehls-Cache und einen 8-KByte-Daten-Cache auf. Der CodeCache ist also doppelt so groß wie beim Pentium. Ein weiterer wesentlicher Unterschied ist, dass beide Caches sowohl lineare Tags als auch physikalische Tags (in der MMU) haben. Der Vorteil linearer Tags ist, dass keine Paging-Umsetzung der linearen in die physikalische Adresse notwendig ist. Daher spart der 5K86 beim Zugriff auf die Caches einen Taktzyklus ein, da der Pentium nur physikalische Tags aufweist. Nur bei Cache-Fehltreffern und Abfragezyklen werden die physikalischen Tags angesprochen. Bei einem Cache-Line-Fill wird stets das angeforderte 8-Byte-Doppelwort geladen. Der Befehls-Cache hat eine 4-Wege-set-assoziative Organisation mit 512 Lines zu je 32 Byte. Außerdem unterstützt er 16-Byte-Split-Line-Zugriffe, bei denen sich die ersten acht Byte in einer Cache-Line und die zweiten acht Byte in der folgenden Cache-Line befinden. Die beiden 8-ByteGrößen werden dann zu einer zusammenhängenden 16-Byte-Größe zusammengefasst. Jedem Befehlsbyte im Cache sind fünf Vordecodierbits zugeordnet. Da der Befehls-Cache nur-lesbar ist, sind nur zwei Zustände des MESI-Protokolls (gültig, ungültig) implementiert.
Sandini Bib Pentium-kompatible Mikroprozessoren
399
Der Daten-Cache ist ebenfalls als 4-Wege set-assoziativer Cache mit einer Cache-Line-Größe von 32 Byte organisiert. Außerdem ist er in vier Banks unterteilt, weist also ein 4fach-Interleaving auf, das sich auf 4-Byte-Grenzen bezieht (die erste Bank umfasst die Bytes 0–3 und 16–19 einer Cache-Line, die zweite Bank die Bytes 4–7 und 20–23, die dritte Bank die Bytes 8–11 und 24–27 und die vierte Bank die Bytes 12–15 und 28–31). Durch zwei Zugriffsports können bis zu zwei Datenzugriffe parallel erfolgen, falls sich die Zugriffe auf verschiedene Banks beziehen. Zur Aufrechterhaltung einer Cache-Kohärenz mit anderen Caches im System unterstützt der DatenCache des 5K86 alle Zustände des MESI-Protokolls. Beachten Sie, dass die MESI-Zustände in den physikalischen Tags gespeichert werden. Da die linearen Tags Lesevorgänge betreffen, sind die MESI-Zustände dort nicht erforderlich. Erweiterungen und modellspezifische Register Obwohl der AMD5K86 in wesentlich höherem Maße Pentium-kompatibel ist als der 6x86 sind dennoch ein paar Unterschiede in den Registern vorhanden. Diese betreffen das Steuerregister CR4 und die modellspezifischen Register. Das Steuerregister CR4 und globale Pages Das Steuerregister CR4 steuert wie beim Pentium die Erweiterungen für den Virtual-8086-Mode, die Debugger-Unterstützung sowie das Paging. In Abbildung 11.9 sehen Sie die Struktur des AMD5K86-Steuerregisters CR4. 16 15
reserviert
GPE: Global-Page-Erweiterung 1=Global Pages aktiviert MCE: Machine Check Enable 1=Machine Check Exception aktiviert PSE: Page Size Extension 1=4-MByte-Pages DE: Debugging Extension 1=Haltepunkte auch für I/O-Bereich TSD: Time Stamp Disable 1=RDTSC nur mit CPL=0 PVI: Protected Mode Virtual Interrupts 1=virtuelle Interrupt Flags VME: Virtual-8086-Mode Extension 1=virtuelle Interrupt Flags
8
7
6
5
4
3
2
1 0
GPE MCE res PSE DE TSD PVI VME
31
0=Global Pages deaktiviert 0=Machine Check Exception deaktiviert 0=4-K-Pages 0=Haltepunkte nur für Speicheradressen 0=RDTSC auch mit CPL=3..1 0=keine virtuellen Interrupt Flags im Protected Mode 0=keine virtuellen Interrupt Flags im Virtual-8086-Mode
Abb. 11.9: Das Steuerregister CR4 des AMD5K86
Lediglich das GPE-Bit ist neu implementiert, die anderen Bits sind unverändert und in Kapitel 10.3.1 im Zusammenhang mit dem Pentium erläutert. Durch Setzen des GPE-Bits aktivieren Sie die Global-Page-Funktion des 5K86. Jedesmal wenn das Steuerregister CR3 neu geladen wird (d.h. eine neue Page Directory-Basisadresse geschrieben wird), invalidiert der Prozessor normalerweise die TLBs für die 4-KByte- und 4-MByte-Pages. Das ist z.B. bei einem Task-Wechsel der Fall. Wenn eine Page aber für mehrere Tasks gültig ist (was häufig bei Betriebssystemfunktionen oder beim Video-RAM der Fall ist), ist die Invalidierung überflüssig und zeitraubend, da nun notwendigerweise zunächst ein TLB-Fehltreffer für diese Page auftritt. Damit wird aber erneut derselbe Eintrag geladen, der bereits vorher im TLB vorhanden war. Es ist also günstig,
Sandini Bib 400
Kapitel 11
bestimmte Pages als global zu definieren (ähnlich wie Sie z.B. bei einem C-Programm die Möglichkeit haben, bestimmte Variablen als global zu definieren, damit sie für alle Subroutinen sichtbar sind). Um das auszuführen, müssen Sie zunächst das GPE-Bit im Steuerregister CR4 setzen.
AVAIL
Page-Frame-Adresse 31..12
8
7
6
G
0 A
PCD PWT U/S W/R
9
8
7
6
4
G
D A
PCD PWT U/S W/R
12 11
PGr
16 15
31
PGr
Page-Directory-Eintrag (4kByte-Pages)
8
7
6
4
5
4
3
2
1
0
P
Page-Directory-Eintrag (4MByte-Pages) 31
22 21
16 15
12 11
Page-Frame-Adresse 31..22 0 0 0 0 0 0 0 0 0 0
9
AVAIL
5
3
2
1
0
P
Page-Table-Eintrag Page-Frame-Adresse 31..12
12 11
9
AVAIL
5
G 0 D A
3
2
1
PCD PWT U/S W/R
16 15
31
0
P
Page-Frame-Adresse: Adressbits 31...12 bzw. 31...22 des Page Frames AVAIL: verfügbar für das Betriebssystem (available) G: Global 0=keine globale Page 1=globale Page PGr: Page-Größe 0=4KByte 1=4MByte D: (beschrieben) Dirty 0=Page wurde noch nicht beschrieben 1=Page wurde beschrieben PCD: Page Cache Disable 0=Page cachebar1=Page nicht cachebar PWT: Page Write-Through 0=Page verwendet Write-Back-Strategie 1=Page verwendet Write-Through-Strategie A: Accessed 0=Page wurde noch nicht angesprochen1=Page wurde bereits angesprochen U/S: Zugriffsebene der Page (User/Supervisor) 0=Supervisor (CPL=0..2) 1=User (CPL=3) R/W: Schreibschutz (Read/Write) 0=Page nur lesbar 1=Page kann auch beschrieben werden P: Page Present 0=Page ausgelagert 1=Page im Speicher Abb. 11.10: Page Table-Eintrag für eine globale Page
Für 4-KByte- und 4-MByte-Pages unterscheidet sich die Definition einer Page als global etwas. In Abbildung 11.10 sehen Sie die Struktur der Page Directory- und Page Table-Einträge mit dem neuen G-Bit.
: :
4-KByte-Pages: Setzen Sie das G-Bit sowohl im Page Directory- als auch im Page Table-Eintrag; 4-MByte-Pages: Setzen Sie das G-Bit im Page Directory-Eintrag.
Beachten Sie, dass 4-MByte-Pages nur im Page Directory-Eintrag auftreten können. Anschließend müssen Sie (natürlich) noch das CR3-Register mit der Basisadresse des Page Directory laden.
Sandini Bib Pentium-kompatible Mikroprozessoren
401
Array-Access-Register AAR und Hardware-Konfigurationsregister HWCR Von den modellspezifischen Registern des Pentiums (siehe Tabelle 10.3) sind beim AMD5K86 lediglich die Register 00h: Maschinen-Check-Adressregister, 01h: Maschinen-Check-Typregister und 10h: Zeitmarkenzähler implementiert. Dagegen wurden zwei neue modellspezifische Register implementiert, die Sie in Tabelle 11.10 sehen. modellspezifisches Register
MSR-Nr.
Verwendung
Maschinen-Check-Adressregister
00h
Maschinen-Check-Typregister Zeitmarkenzähler Array-Access-Register AAR Hardware-Konfigurationsregister HCR
01h 10h 82h 83h
physikalische Adresse des fehlerverursachenden Buszyklus Typ des fehlerverursachenden Buszyklus Lesen/Schreiben des internen 64-Bit-Zählers Prüfung von Code- und Daten-Cache, TLBs Steuerung von Debug-Funktionen
Tab. 11.10: Modellspezifische Register des AMD5K86
Das AAR dient zur Prüfung von Code- und Daten-Caches sowie der TLBs für 4-KByte- und 4MByte-Pages. Es führt daher Funktionen aus, die beim Pentium von den modellspezifischen Registern TR2 bis TR7 (MSR-Nummern 04h bis 09h) erledigt werden. Das Hardware-Konfigurationsregister HCR dient zur Aktivierung oder Stillegung verschiedener funktionaler Einheiten des AMD5K86. Seinen Aufbau sehen Sie in Abbildung 11.11.
DC
1 0
DSPC
res
DIC
reserviert
8 7 6 5 4 3 2
DBP
16 15
DDC
31
DDC:
Daten-Cache-Deaktivierung (Disable Data Cache) 1=Daten-Cache deaktiviert 0=Daten-Cache aktiviert DIC: Code-Cache-Deaktivierung (Disable Instruction Cache) 1=Code-Cache deaktiviert 0=Code-Cache aktiviert DBP: Verzweigungsvorhersage-Deaktivierung (Disable Branch Prediction) 1=Verzweigungsvorhersage deaktiviert 0=Verzweigungsvorhersage aktiviert DC: Debug-Steuerung (Debug Control) 000b=deaktiviert 001b=Branch-Tracing aktiv 100b=Probe-Mode bei Debug-Traps aktivieren DSPC: Anhalten des Prozessortakts deaktivieren (Disable Stopping Processor Clocks) 1=Anhalten deaktiviert 0=Anhalten aktiviert Abb. 11.11: Das Hardware-Konfigurationsregister HCR des AMD5K86
Den Daten-Cache können Sie durch Setzen des DDC-Bits deaktivieren, den Code-Cache durch Setzen des DIC-Bits. Damit wird der L1-Cache des AMD5K86 stillgelegt, diese Option finden Sie in vielen BIOSen. In ähnlicher Weise deaktivieren Sie die Verzweigungsvorhersage durch Setzen des DBP-Bits. Die drei DC-Bit dienen zur Steuerung verschiedener Debug-Funktionen. Ist DC=000b, dann sind die Funktionen des HCR-Registers deaktiviert, d.h. die Werte der anderen Bits haben keinerlei Auswirkungen und der AMD5K86 arbeitet normal. Ein Wert von 001b aktiviert die Branch-Trace-Messages, ein Wert von 100b aktiviert den Probe-Modus, wenn ein Debug-Trap auftritt. Dadurch können über den Debug-Port die Werte an den Signlausgängen des 5K86 in serieller Weise abgefragt werden. Alle anderen Werte für DC sind reserviert. Schließlich steuert das DSPC-Bit das Anhalten der prozessorinternen Taktsignale für Halt- und StopGrant-Zustände. Ein Wert von »1« deaktiviert dabei das Anhalten.
Sandini Bib 402
Kapitel 11
Kompatibilität zum Pentium Der K5 ist nahezu 100% kompatibel zum Pentium, Abweichungen davon sind in den einzelnen Abschnitten aufgeführt. Beachten Sie, dass sich die Kompatibilität nur auf die implementierten Register und ihre Belegungen sowie die physikalische Busschnittstelle (Signale und Anschlüsse) nach außen bezieht. Der interne Aufbau und die Funktionsweise (also die »Black Box« zwischen Befehls- und Dateneingabe und Ergebnisausgabe) ist dagegen völlig verschieden. Betriebsmodi Die verschiedenen Betriebsmodi Real-Mode, Protected-Mode und Virtual-8086-Modus sind vollständig Pentium-kompatibel. Auch das Verhalten im System-Management-Modus stimmt mit dem des Pentium überein. Lediglich undefinierte oder reservierte Abschnitte im Registerauszug können abweichen. Beim Paging besteht der einzige Unterschied in der Implementierung globaler Pages beim AMD5K86. Ansonsten ist der AMD5K86 auch hinsichtlich dieser Funktion 100% Pentium-kompatibel. Der AMD5K86-Bus Der Bus des AMD5K86 ist völlig Pentium-kompatibel. Lediglich Anschlüsse, die beim AMD5K86 fehlen (z.B. für den privaten Bus für einen Dual-Processing-Betrieb oder die APIC-Schnittstelle) unterscheiden sich logischerweise. Außerdem wird IERR (interner Fehler) nur beim Functional Redundancy Checking verwendet, um unterschiedliche Ergebnisse im Master- und CheckerProzessor mitzuteilen. Der Pentium aktiviert IERR auch beim Auftreten interner Datenparitätsfehler (z.B. beim Zugriff auf interne Datenfelder oder den Daten-Cache). Testfunktionen Wie der Pentium implementiert auch der AMD5K86 verschiedene Testfunktionen. Verschiedene Testfunktionen werden beim Reset initialisiert. In Tabelle 11.11 sehen Sie die Signalpegel, die für den Aufruf eines bestimmten Testmodus aktiviert werden müssen. INIT
FLUSH
FRMC
ausgelöster Test
1 0 0
0
0 -
interner Selbsttest BIST Functional Redundancy Checking Output-Float-Testmodus
Tab. 11.11: AMD5K86-Tests
Sie unterscheiden sich in ein paar Punkten, die im Folgenden aufgeführt sind. BIST Der eingebaute Selbsttest (Built-In Self-Test) prüft die gesamte interne Hardware (Code- und Daten-Cache, PLAs, Microcode-ROM, TLBs) und legt im Register EAX einen Fehlercode ab. Der BIST wird ausgeführt, wenn bei der abfallenden Flanke von RESET das INIT-Signal aktiv ist. Ein EAX-Wert von 00000000h bedeutet, dass kein Fehler aufgetreten ist. In Tabelle 11.12 finden Sie die BIST-Fehlercodes, ein gesetztes Bit zeigt den entsprechenden Fehler an. Beachten Sie, dass der AMD5K86 unabhängig vom Ergebnis des BISTs den Betrieb aufnimmt, d.h. das System bootet. Der BIST kann auch über den Test-Access-Port mit Hilfe des Befehls RUNBIST aufgerufen werden (siehe Kapitel 8.8.5).
Sandini Bib Pentium-kompatible Mikroprozessoren
Bit
Fehlerart
31...9 8 7 6 5 4 3 2 1 0
reserviert (=00h) Datenpfad Dateneinträge im Code-Cache lineare Tags im Code-Cache lineare Tags im Daten-Cache PLA Microcode-ROM Dateneinträge im Daten-Cache physikalische Tags im Code-Cache physikalische Tags im Daten-Cache
403
Tab. 11.12: BIST-Fehlercodes
Output-Float-Testmodus Dieser Testmodus heißt beim Pentium Tristate-Testmodus. Ansonsten stimmen die Betriebsmodi überein. Functional Redundancy Checking Auch dieser Testmodus stimmt mit dem Functional Redundancy Checking des Pentiums überein. Details finden Sie in Kapitel 10.3.9. Branch-Trace-Zyklen Der 5K86 treibt wie der Pentium einen Branch-Trace-Message-Sonderzyklus (BE7–BE0=11011111) aus, wenn im Hardware-Konfigurationsregister HWCR der Wert von DC gleich 001b ist (beim Pentium müssen Sie im Testregister TR12 das ETE-Bit setzen) und der Prozessor vorher eine Verzweigung ausgeführt hat. Die Signalcodierungen unterscheiden sich jedoch. Im Folgenden ist der Branch-Trace-Sonderzyklus des AMD5K86 angegeben. Erster Zyklus: A31 A30..A29 A28 A27..A20 A19..A4 A3 D31..D0
0 (erster Zyklus) nicht definiert nicht definiert 0 CS-Selektor der Adresse, von der aus die Verzweigung erfolgt 0 EIP der Adresse, von der aus die Verzweigung erfolgt
Zweiter Zyklus: A31 1 (zweiter Zyklus) A30..A29 Betriebsmodus des Sprungziels: 00b=Real Mode, 01b=ungültig, 10b=Protected Mode, 11b=Virtual-8086-Modus A28 1=32-Bit-Standardoperand, 0=16-Bit-Standardoperand des Zielsegments A27..A20 0 A19..A4 CS-Selektor der Adresse, zu der die Verzweigung erfolgt A3 0 D31..D0 EIP der Adresse, zu der die Verzweigung erfolgt
Man könnte den ersten Zyklus auch als Ursprungs- (Source-) Zyklus (für die Adresse, von der aus die Verzweigung erfolgt) und den zweiten Zyklus als Ziel- (Target-) Zyklus (für die Adresse, zu der die Verzweigung erfolgt) betrachten.
Sandini Bib 404
Kapitel 11
JTAG-Boundary-Scan-Test Der JTAG-Boundary-Scan-Test des 5K86 ist kompatibel zum entsprechenden Test des Pentiums. Er implementiert darüber hinaus drei AMD5K86-spezifische Testbefehle:
: : :
ALL1: alle bidirektionalen (I/O) und Ausgangssignale (O) werden auf einen hohen Pegel gelegt ALL0: alle bidirektionalen (I/O) und Ausgangssignale (O) werden auf einen niedrigen Pegel getrieben USEHDT: erlaubt einen Zugriff auf das Hardware-Debug-Tool (siehe folgenden Abschnitt)
Hardware-Debug-Tool HDT heißt beim Pentium Debug Port oder Probe Mode (je nachdem, ob Sie die physikalische Schnittstelle oder den internen Testmodus meinen). Auch AMD hält sich in der Öffentlichkeit sehr bedeckt in Sachen HDT. Sie können aber wie im Falle von Intel technische Zusatzinformationen erhalten, die das HDT genau beschreiben. Nur müssen Sie ein Geheimhaltungsabkommen unterzeichnen, in dem Sie sich verpflichten, die Informationen keinen anderen Personen zugänglich zu machen. Man kann aber getrost davon ausgehen, dass das HDT zum Debug Port des Pentiums kompatibel ist. Wahrscheinlich liegt darin auch der Grund für die Geheimhaltung durch AMD, obwohl diese Firma z.B. viele Details über die Erweiterungen des Virtual-8086Modus öffentlich spezifiziert, die Intel zurückhält. CPUID Der CPUID-Befehl kann wie schon beim Pentium oder 6x86 dazu benutzt werden, den CPU-Typ zu bestimmen. CPUID liefert neben der Kennung des 5K86 wie der Pentium auch Informationen darüber, welche besonderen Funktionen unterstützt werden. Um die CPU-Identifizierung auszuführen, müssen Sie zunächst den Wert 0 in das EAX-Register laden und anschließend den Befehl CPUID auslösen. Der Prozessor gibt dann in EAX die höchste Identifizierungsebene zurück, die er unterstützt (gegenwärtig 1). Die drei Register EBX, EDX und ECX enthalten in dieser Reihenfolge eine 12-Byte-Identifizierung in ASCII-Form: »AuthenticAMD«. Wenn Sie anschließend das EAX-Register mit einem Wert 01h laden und den CPUID-Befehl nochmals auslösen, übergibt der Pentium im EAX-Register einen Identifizierungswert und im Register EDX zusätzliche Informationen darüber, welche besonderen Funktionen unterstützt werden. In Tabelle 11.13 finden Sie die Aufruf- und Rückgabewerte von CPUID für den 5K86. Register
Aufrufwert
Rückgabewert
EAX EBX ECX EDX EAX EBX ECX EDX
00h
01h »Auth« »cAMD« »enti« Identifizierungswert1) reserviert (=0) reserviert (=0) Feature Flags2)
1)
reserviert (=00h) Familie (0101b für 5K86) Modell (01h für 5K86, 00h für SSA5) Version (Stepping)
Bits 31...12 Bits 11...8 Bits 7...4 Bits 3...0
01h
Tab. 11.13: Aufruf- und Rückgabewerte von CPUID
Sandini Bib Pentium-kompatible Mikroprozessoren
405
Register
Aufrufwert
2)
reserviert (=00h) Global-Paging-Erweiterung (1=implementiert, 0=nicht implementiert) CMPXCHG8B (1=implementiert, 0=nicht implementiert) Machine Check Exception (1=implementiert, 0=nicht implementiert) reserviert 5K86-spezifische Register (1=implementiert, 0=nicht implementiert) Zeitmarkenzähler (1=implementiert, 0=nicht implementiert) 4-MByte-Pages (1=implementiert, 0=nicht implementiert) I/O Breakpoints (1=implementiert, 0=nicht implementiert) Erweiterungen für den Virtual-8086-Modus (1=implementiert, 0=nicht implementiert) On-Chip-Gleitkommaeinheit (1=On-Chip FPU , 0=keine On-Chip FPU)
Bits 31...10: Bit 9: Bit 8: Bit 7: Bit 6: Bit 5: Bit 4: Bit 3: Bit 2: Bit 1: Bit 0:
Rückgabewert
Tab. 11.13: Aufruf- und Rückgabewerte von CPUID (Forts.)
11.2.2
Der AMD K6
Die Probleme bei der Markteinführung des K5 haben sich beim K6 nicht wiederholt und AMD konnte seinen K6 mit 233 MHz fast zeitgleich mit Intels Pentium II präsentieren. Die Notation laut Pentium-Rating gibt es beim K6 nicht mehr und die CPU ist mit demjenigen Takt zu versorgen, der als Beschriftung auf dem Gehäuse aufgedruckt ist. Im Gegensatz zu PentiumPro und Pentium II hat der K6 keinen L2-Cache direkt im Prozessorgehäuse, er muss extern auf dem Motherboard bereitgestellt werden. Der auf 64 KByte vergrößerte L1-Cache (32 KByte Daten-, 32KByte Code-Cache) gleicht dieses »Manko« aber fast völlig aus. Der K6 passt in einen Sockel 7, der ursprünglich für den Pentium MMX vorgesehen war, dadurch können die preiswerteren P5-Chipsätze eingesetzt werden. Obwohl sich ein paar Unterschiede in der Anzahl von Taktzyklen zeigen, die Pentium-MMX und K6 für die jeweiligen MMX-Befehle benötigt, ist der K6 etwas schneller als ein Pentium MMX mit der gleichen Taktfrequenz und reicht an einen gleich schnell getakteten Pentium II heran. Außerdem ist der K6 sowohl für 16- als auch für 32-Bit-Befehle optimiert. Dies war ja ein schweres Manko des PentiumPros, der einseitig für 32-Bit-Befehle optimiert wurde und manchen Windows 9x-Anwender schwer enttäuschte. Die volle Geschwindigkeit erreicht der K6 – wie der K5 – aber nur bei aktiviertem »Write Allocate« für den Cache. Auch die Verzweigungsvorhersage ist beim K6 erheblich umfangreicher gestaltet worden. Sie umfasst nun eine History-Tabelle mit 8192 (8k) Einträgen, einen Branch-Target-Cache und einen Return Stack. Zusammen sollen diese Maßnahmen eine Trefferrate von über 95% garantieren. Ein weiterer Schritt in Richtung Intel-Konkurrenz ist die Tatsache, dass AMD mit dem K6 endlich auch eine schnelle FPU-Einheit implementiert hat. Waren die AMD-CPUs bisher nur für »Standardanwendungen« brauchbar, bei denen (fast) keine FPU-Befehle vorkommen, kann der K6 nun auch guten Gewissens für CAD- und 3D-Programme eingesetzt werden. Im Folgenden eine kurze Aufstellung der wichtigsten Kenngrößen des K6:
: : : :
MMX-Technologie 32 KByte L1-Code-Cache mit zusätzlichem Vordekodier-Caches Dual-ported 32 KByte L1-Daten-Cache mit Write-Back-Strategie Hocheffiziente Verzweigungsvorhersage mit 8k-History-Tabelle, Branch-Target-Cache und Return Stack
Sandini Bib 406
Kapitel 11
Insgesamt ist der K6 ein in allen Punkten wesentlich verbesserter »K5-MMX«. Der Prozessorkern des 6x86MX ähnelt hinsichtlich der implementierten RISC-Strategien dem des PentiumPro oder Pentium II, es findet ein Übergang vom Superskalarprinzip zu dynamischer Befehlsausführung statt. Der K6 implementiert die schon vom K5 bekannten Spezialregister und identifiziert sich beim CPUID-Befehl als ein Prozessor der 6. Familie.
11.2.3
AMD-K6-II und AMD K6-III mit Super Sockel 7
Die K6-CPUs sind für einen Systemtakt von 66 MHz ausgelegt und der Nachfolger – der AMDK6-2 – demgegenüber für maximal 100 MHz. Die weiteren wichtigen Neuerungen gegenüber dem Vorgänger K6 sind die Verbesserung der Floating-Point-Einheit, die Unterstützung des MESI-Protokolls sowie eine 3D-Befehlserweiterung mit der Bezeichnung 3DNOW!, die auch nur dann Auswirkungen zeigen kann – wie bei MMX –, wenn die Programme die entsprechenden Befehle unterstützen, wie es beispielsweise ab DirectX 6.0 von Microsoft der Fall ist. Der jüngste Vertreter der AMD-K6-Line, der K6-III (Sharptooth) ab 450 MHz, besitzt wie der Vorgänger einen L1-Cache von je 32 KByte für Daten und Befehle sowie als Neuerung auch einen integrierten L2-Cache von 256-KByte, der mit dem vollen CPU-Takt arbeitet. Der Cache-Speicher auf den Super 7-Boards kann daher als L3-Cache verwendet werden.
Abb. 11.12: Super 7 definiert keinen Sockel, sondern eine Motherboard-Architektur mit 100 MHz-Systemtakt. Bei der Verwendung einer K6-III-CPU, kann der On-Board-L2-Cache als L3-Cache fungieren.
Die Einführung von CPUs, die extern mit 100 MHz getaktet werden, führte zur Definition des Super-Sockel 7 oder kurz Super 7. Dabei handelt es sich jedoch nicht um einen mechanisch oder elektrisch geänderten Sockel 7, sondern mit Super 7 wird eine 100 MHz-Motherboard-Architektur mit den zuvor schon bei den Slot-1-Boards (ab Pentium II) eingeführten Features definiert. Dazu
Sandini Bib Pentium-kompatible Mikroprozessoren
407
gehören Funktionsmerkmale wie der USB, AGP, SDRAM, Ultra-DMA und ACPI. Da Super 7 als Konkurrenz zu Intel (Pentium II, Celeron, Pentium III) zu sehen ist, kommen hier natürlich auch keine Chipsätze von Intel zum Einsatz, sondern solche von Firmen wie Ali, VIA oder auch SiS. Super-7-Motherboards bieten einen »verdrahteten« BF2-Anschluss, womit sich dann zusätzlich auch die Faktoren x4, x4.5 und x5 x5.5 jumpern lassen, die bei einem Sockel 7 nicht möglich sind. BF2
BF1
BF0
Funktion
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
x 4.5 x5 x4 x 5.5 x 2.5 x3 x2 x 1.5 (3,5)
Tab. 11.14: Die (theoretisch) möglichen BF-Jumperstellungen, die den Taktfaktor für die CPU bestimmen
Leider interpretieren die verschiedenen CPUs diese Jumperstellungen unterschiedlich, wie es in der folgenden Tabelle zu erkennen ist. Außerdem ist leider kein Verlass darauf, dass beispielsweise ein Sockel 7-Motherboard auch die Stellung x3 bietet oder aber Super-Sockel 7-Board die Stellung x5.5, was schaltungstechnisch gesehen überhaupt kein Problem wäre. Gleichwohl soll man ja ab und zu auch mal ein neues Motherboard erwerben.
BF2
BF1
BF0
Pentium
Pentium MMX
Cyrix/ IBM6x86
Cyrix/ IBMM2
AMD K5
AMD K6(-2)
Win Chip
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
2,5x 3x 2x 1,5x
2,5x 3x 2x 3,5x
1x 4x 2x 3x
2,5x 3x 2x 3,5x
1,75x 1,5x -
4,5x 5x 4x 5,5x 2,5x 3x 2x 3,5x
5x 4x 3x 2x 4x
Abb. 11.13: Die BF-Jumper-Stellungen werden von den verschiedenen Prozessoren unterschiedlich interpretiert. Der BF2-Jumper wird von Intel-Pentium-CPUs nicht ausgewertet und ist bei einigen Motherboards daher auch gar nicht verdrahtet.
11.3 IDT WinChip C6 Die Firma IDT kam im Jahre 1997 mit einem eigenen Pentium-kompatiblen Prozessor auf den Markt, der wie auch die CPUs von Cyrix bei der Firma IBM gefertigt wurden. Den WinChip C6 gibt es mit Taktfrequenzen von 180, 200 und 225 MHz und er benötigt stets eine Takteinstellung von Systemtakt x 3, was bedeutet, dass bei 225 MHz ein Systemtakt von 75 MHz einzustellen ist. Da das Namensrecht »WinChip« in Deutschland bereits für einem anderen Hersteller reserviert ist, mussten die CPUs seit Mitte 1999 exklusiv für den deutschen Markt eine andere Bezeichnung (IDT) führen.
Sandini Bib 408
Kapitel 11
Die 200 MHz-Version ist dabei sicherlich am interessantesten, denn hierfür wird ein Systemtakt von 66 MHz benötigt. Diesen unterstützen die meisten Motherboards und dabei treten in der Praxis (PCI-Takt) die wenigsten Probleme auf. Der WinChip C6 eignet sich in insbesondere für die Aufrüstung älterer Pentium-Systeme mit einem Sockel 7 oder sogar 5 und kommt – obwohl er MMX bietet – mit einer einzigen Betriebsspannung von 3,5 V aus. Eine Weiterentwicklung sind die WinChip-2-Typen, die gegenüber der ersten Generation auch 3DNOW! (AMD) sowie MMX (Intel) unterstützen. Die interne Cache-Größe beträgt jeweils 32 KByte für Daten und 32 KByte für den Programmcode, wodurch der C6 das Fehlen einer Sprungvorhersage und einer Floating-Point-Einheit etwas auffängt. Andererseits ist der Chip preiswert und wird auch längst nicht so heiß wie die anderen Pentium-(kompatiblen) Modelle. Die WinChips eignen sich daher insbesondere zum Aufrüsten älterer PC-Modelle, die keine zweite CPU-Spannung bieten. Der 200-MHz-Typ ist beispielsweise ideal für einen Motherboard-Takt von 66 MHz mit einem Faktor x3. Die 300 MHz-CPU erlaubt zudem auch einen Systemtakt von 100 MHz. Welche WinChips es gibt und mit welchen Daten sie zu betreiben sind, zeigt die Tabelle im folgenden Kapitel. Bei Boards mit einem Sockel 5 ist zu beachten, dass hier lediglich die Faktoren x1,5 und x2 zu jumpern sind und die Jumperstellung x1,5 von einem WinChip als x4 interpretiert wird, wie es auch in der obigen Tabelle angegeben ist. Der 240-MHz-WinChip (60 MHz x 4) wäre hierfür also die beste Wahl. Die Firma IDT hat sich mittlerweile von diesen Chips getrennt und die Technologie komplett an die Chipset-Firma VIA Technologies verkauft, die ebenfalls die CPUs der Firma Cyrix (6x86MX, M-II) von National Semiconductor erworben hat.
11.4 CPU-Übersicht und Einstellungsdaten Wichtig für die korrekte Einstellung der Taktrate ist der Systemtakt und der Multiplikationsfaktor, was bei Sockel-7-Systemen meist über Jumper und ab den Pentium II-CPUs im BIOS-Setup festgelegt wird. Einige CPUs von AMD und Cyrix benötigen – wie erwähnt – eine Takteinstellung, die nicht der jeweiligen Beschriftung auf dem Gehäuse entspricht, was am Kürzel PR erkennbar ist und für Pentium Rating steht. PR kennzeichnet, dass beispielsweise der Cyrix-Typ 6x86MX-PR166 die Leistung erbringt wie ein Intel-Pentium-MMX mit 166 MHz, obwohl der Cyrix-Typ nur mit einem internen Takt von 133 MHz arbeitet und daher auch so zu jumpern ist. Die folgende Tabelle zeigt zusammengefasst die Daten für die Takt- und Spannungseinstellungen gebräuchlicher Pentium-CPUs der verschiedenen Hersteller. Der Vollständigkeit halber sei noch einmal angemerkt, dass es neben den gezeigten Einstellungen für den Systemtakt und den Faktor (Taktrate) weitere Kombinationsmöglichkeiten gibt, um den gewünschten CPU-Takt festzulegen. Letztendlich sind die Daten, die auf der CPU aufgedruckt sind, relevant und an die sollte man sich auch halten. Prozessor-Typ
Motherboard (Systemtakt)
interner Takt
Taktrate
Spannungen (I/O-Core)
AMD 5x86 PR75 AMD K5x86 PR 90 AMD K5x86 PR100 AMD K5x86 PR120
33 MHz 60 MHz 66 MHz 60 MHz
133 MHz 90 MHz 100 MHz 90 MHz
x4 x 1,5 x 1,5 x 1,5
3,5 V 3,45 V 3,45 V 3,45 V
Tab. 11.15: Die Daten für die Einstellung von Pentium-CPUs (Sockeltypen) in der Übersicht
Sandini Bib Pentium-kompatible Mikroprozessoren
409
Prozessor-Typ
Motherboard (Systemtakt)
interner Takt
Taktrate
Spannungen (I/O-Core)
AMD K5x86 PR133 AMD K5x86 PR150 AMD K5x86 PR 166 AMD K5x86 PR 200 AMD K6 166 AMD K6 200 AMD K6 233 AMD K6 300 AMD K6-2 266 AMD K6-2 300 AMD K6-2 333 AMD K6-2 350 AMD K6-2 380 AMD K6-2 400 AMD K6-2 450 AMD K6-3 450 AMD K6-3 550 Cyrix/IBM 6x86 PR 166+ Cyrix/IBM 6x86 PR 200+ Cyrix/IBM 6x86MX-PR166 Cyrix/IBM 6x86MX-PR200 Cyrix/IBM 6x86MX-PR233 Cyrix/IBM 6x86MX-PR266 IBM/Cyrix M II PR300 IBM/Cyrix M II PR333 IBM/Cyrix M II PR350 IBMCyrix M II PR400 IDT WinChip C6 180 IDT WinChip C6 200 IDT WinChip C6 225 IDT WinChip2 240 IDT WinChip2 250 IDT WinChip2 266 IDT WinChip2 300 Intel Pentium 120 Intel Pentium 133 Intel Pentium 150 Intel Pentium 166 Intel Pentium 200 Intel Pentium MMX 166 Intel Pentium MMX 200 Intel Pentium MMX 233
66 MHz 60 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 100 MHz 66 MHz 100 MHz 95 MHz 100 MHz 95 MHz 100 MHz 100 MHz 100 MHz 100 MHz 66 MHz 75 MHz 66 MHz 75 MHz 66 MHz 66 MHz 66 MHz 83 MHz 100 MHz 100 MHz 60 MHz 66 MHz 75 MHz 60 MHz 83 MHz 66 MHz 100 MHz 60 MHz 66 MHz 60 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz
100 MHz 105 MHz 116 MHz 133 MHz 166 MHz 200 MHz 233 MHz 300 MHz 266 MHz 300 MHz 333 MHz 350 MHz 380 MHz 400 MHz 450 MHz 450 MHz 550 MHz 133 MHz 150 MHz 133 MHz 150 MHz 200 MHz 233 MHz 233 MHz 250 MHz 300 MHz 350 MHz 180 MHz 200 MHz 225 MHz 240 MHz 250 MHz 266 MHz 300 MHz 120 MHz 133 MHz 150 MHz 166 MHz 200 MHz 166 MHz 200 MHz 233 MHz
x 1,5 x 1,75 x 1,75 x2 x 2,5 x3 x 3,5 x3 x4 x3 x 3,5 x 3,5 x4 x4 x 4,5 x 4,5 x5 x2 x2 x2 x2 x3 x 3,5 x 3,5 x3 x3 x 3,5 x3 x3 x3 x4 x3 x4 x3 x2 x2 x 2,5 x 2,5 x3 x 2,5 x3 x 3,5
3,45 V 3,45 V 3,45 V 3,45 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-3,2 V 3,45 V-2,2 V 3,2 V- 2,2 V 3,2 V-2,2 V 3,2 V-2,2 V 3,2 V-2,2 V 3,2 V-2,2 V 3,2 V-2,2 V 3,2 V-2,3 V 3,2 V-2,3 V 3,2 V-2,3 V 3,5 V 3,5 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V-2,9 V 3,3 V 3,3 V 3,3 V 3,3 V 3,3 V 3,3 V 3,3 V 3,5 V 3,3 V 3,3 V 3,3 V 3,3 V 3,3 V-2,8 V 3,3 V-2,8 V 3,3 V-2,8 V
Tab. 11.15: Die Daten für die Einstellung von Pentium-CPUs (Sockeltypen) in der Übersicht (Forts.)
Ein übliches Motherboard für eine Sockel 7-Pentium-CPU kann meist Spannungen im Bereich von 2,5 V bis 3,5 V in verschiedenen Abstufungen bereitstellen, wobei bei MMX-CPUs (Ausnahme der WinChips) grundsätzlich eine für die I/O-Treiber und eine separate (kleinere) für den CPU-Kern (Core) notwendig ist. Möglicherweise ist ein zusätzlicher Spannungsregler (herstellerspezifisches Modul) auf dem Motherboard für die zweite CPU-Spannung nachrüstbar.
Sandini Bib
Sandini Bib
12 Reine 32-Bit-Technologie – Der PentiumPro Der PentiumPro beeindruckt zunächst durch die Größe seines Gehäuses (7,76 cm x 6,25 cm) und der Fülle der Anschlüsse (387 Pins). Ersteres ist bedingt durch die Integration des L2-Caches, der zusammen mit der CPU in einem einzigen Gehäuse untergebracht ist. Beim Stand der Hochinteration im Jahre 1995 war es noch nicht möglich, zusätzlich zu den 5,5 Millionen Transistoren der PentiumPro-CPU noch einen 256-KByte-SRAM (ca. 2 Millionen Transistoren) oder 512-KByteSRAM (ca. 4 Millionen Transistoren) auf einem einzigen Chip unterzubringen. Intel hat sich daher entschieden, den L2-SRAM zwar als separaten Die auszuführen, diesen aber über einen dedizierten L2-Cache-Bus, der mit dem vollen CPU-Prozessortakt läuft, innerhalb eines gemeinsamen Gehäuses mit dem eigentlichen PentiumPro zu verbinden. Das erhöht zwar die Herstellungskosten, steigert aber durch den wesentlich höheren L2-Cache-Takt (200 MHz) gegenüber dem Bustakt (maximal 66 MHz) die Performance deutlich. Die hohen Herstellungskosten für den PentiumPro hatten zur Folge, dass mit dem PentiumPro-Nachfolger – dem Pentium II – dazu übergegangen wurde, den L2-Cache-Die wieder aus dem eigentlichen CPU-Chip auszulagern und den Cache mit einzelnen Chips auf einer CPU-Cartridge aufzubauen, was somit zum Slot 1-Design führte. Erst im Jahre 2000 ist es Intel mit dem Pentium III-Coppermine gelungen den L2-Cache und die CPU auf einem Die unterzubringen, wodurch das Cartridge-Prinzip nicht mehr notwendig ist und man somit wieder bei einem Sockeltyp angelangt ist. In Abbildung 12.1 sehen Sie ein Foto des PentiumPro. Bemerken möchte ich noch, dass der 200MHz-PentiumPro mit 512-KByte-L2-Cache eine Leistungsaufnahme von bis zu 38 W besitzt; es fließen dann 12,4 A (!) Strom durch die Anschlussstifte (zum Vergleich: Starke Staubsauger ziehen nur einen Strom von maximal 7-8 A, allerdings bei 220 V und nicht bei 3,3 V). Der PentiumPro findet seinen Platz in einem Sockel 8, der allein dieser CPU vorbehalten ist und es gibt weder von Intel noch von sonst einem Hersteller einen anderen Prozessor, der hier verwendet werden kann.
Abb. 12.1: Der PentiumPro
Sandini Bib 412
Kapitel 12
Die Unterschiede zum Pentium beschränken sich nicht nur auf das größere Gehäuse und den integrierten L2-Cache. Vielmehr implementiert der PentiumPro neue RISC-Technologien zur Beschleunigung der Befehlsausführung, die teilweise auch bei den Cyrix- und AMD-CPUs vorhanden sind:
: : : : : : : : : : : : :
Dynamische Befehlsausführung Drei zwölfstufige Pipelines On-Chip FPU Getrennte L1-Befehls- und Daten-Caches mit Write-Back-Strategie Out-of-order-Abschluss der Befehle Register-Renaming mit 40 Registern Data Forwarding Dynamische Verzweigungsvorhersage Spekulative Ausführung von Befehlen Multiprocessing mit bis zu vier PentiumPro ohne zusätzliche Logik Auf 36 Bit erweiterter Adressbus für einen physikalischen Adressraum von 64 GByte Neue Funktionen für bedingte MOV-Operationen Im selben Gehäuse integrierter L2-Cache, der über einen dedizierten Bus mit dem vollen CPU-Takt angesprochen wird
Der PentiumPro ist für 32-Bit-Befehle optimiert, was bedeutet, dass er bei 16-Bit- oder gemischten 16/32-Bit-Applikationen, wie etwa Windows 9.x, gegenüber einem gleichgetakteten Pentium oder Pentium-kompatiblem Prozessor (z.B. AMD-K6) leistungstechnisch enttäuscht. Demnach ist für einen PentiumPro ein »richtiges« 32-Bit-Betriebssystem wie Windows NT/2000 oder OS/2 oder Linux notwendig. Auf diese Leistungsschwäche reagierte Intel mit den Segment-RegisterCaches, die wenig später mit dem Pentium II eingeführt worden sind. Gleichwohl ist der PentiumPro ein wichtiger Meilenstein und die hiermit eingeführten Features bilden die Grundlage aller darauf folgenden CPUs von Intel.
12.1 Anschlüsse und Signale Der PentiumPro wird in einem modifizierten SPGA (Staggered Pin Grid Array) mit insgesamt 387 Anschlusspins ausgeliefert. Viele der Signale und Anschlüsse stimmen mit denen des Pentiums überein. Im Folgenden werde ich daher nur die abweichenden Signale und Anschlüsse zusammen mit ihren Koordinaten erläutern (siehe Abbildung 12.2). Da der PentiumPro – vor allem durch die Integration des L2-Caches – eine völlig andersartige Busschnittstelle betreibt, werde ich im Folgenden alle Signale und die zugehörigen Anschlüsse kurz erläutern. Beachten Sie, dass viele vom Pentium bekannten Signale durch das invertierte Signal (Signal) ersetzt worden sind, wie z.B. D63–D0 durch D63–D0. Außerdem verwendet der Bus des PentiumPros ein Multiplexing-Schema, d.h. viele Signale müssen sich einen Anschluss teilen. Die folgende Auflistung geht nach den Pin-Bezeichnungen entsprechend Abbildung 12.2 vor, berücksichtigt aber das Multiplexing durch Referenzen auf die physikalischen Anschlüsse. Die Erläuterung der einzelnen Busphasen finden Sie in Kapitel 12.6.1.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
413
A35–A3 (I/O) Anschlüsse C1, E1, E3, E5, E7, E9, G1, G3, G5, G7, G9, J1, J3, J5, J7, J9, L3, L5, L7, L9, N1, N3, N5, N7, N9, Q1, Q3, Q5, Q7, Q9,S1,S3,S5 Die 33 Anschlüsse bilden für Schreib- und Lesevorgänge die 29 (32-Bit-Adressen) bzw. 33 (36-BitAdressen) höherwertigen Bits des Adressbusses. Die drei niederwertigen Adressbits A0 bis A2 werden durch die acht Byte-Enable-Signale BE0–BE7 im zweiten Bustakt der Request-Phase kodiert. 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 GND
GND
GND
GND
GND
res
TESTLO
GND
VccS
GND
VccS
GND
VccS
GND
VccS TESTLO
res
TESTLO GND
GND
GND
GND
GND
res
TESTLO
VccP
GND
VccP
GND
VccP
GND
VccP
GND TESTLO
res
TESTLO GND
VccS
GND
VccS
GND
BC
BC
GND
VccS
GND
VccS
GND
VccS
VccS
VccS
VccS
VccS
VccS
VccS
VccS
VccS
VccS
GND
VccS
GND
VccS
GND
GND
VccS
GND
VccS
GND
VccS
GND
VccS
GND
VccS
VccS
GND
VccS
GND
VccS
VID0
VID1
VID2
VID3
res
VccP
GND
VccP
GND
VccP
VccP
GND
VccP
GND
VccP
GND
VccP
GND
VccP
GND
GND
VccP
GND
VccP
GND
VccP
GND
VccP
GND
VccP
VccP
GND
VccP
GND
VccP
GND
VccP
GND
VccP
GND
GND
VccP
GND
VccP
GND
Vcc5
UP
res
PWRG
res
res
LINT1
LINT0
Vref7
res
BA
BA
AY
AY
AW
AW
AU
AU TEST TEST LO LO
TEST TEST LO LO
res
AS
AS
AQ
AQ
AN
AN
AL
AL
AJ AG AF AE AC AB AA Y X W U T S Q P N L K J G F E C B A
AJ GND
GND
GND
GND
res
ADS
RS1
RS2
AERR
res
HIT
BR0
RP
RS0
GND
VccP
GND
LOCK
REQ3 REQ2 DEFER Vref3
TRDY
DRDY DBSY
GND
GND
VccP
BR1
REQ4 REQ1 REQ0
AP0
RSP
BPRI
GND
VccP
A6
A4
A9
A7
VccP
BNR
GND A3
Vref5
BPM0
BINIT
DEP0
GND
VccP
BPM1 PICD0 PICCLK PREQ DEP5
(150MHz bis 200MHz)
PRDY RESET DEP1 GND
BR3
GND
VccP
DEP6
GND
DEP4
D63
D61
D58
DEP7
Vref6
D60
D56
D55
GND
VccP
GND
AP1
D59
D57
D54
D53
D50
A8
A10
D51
D52
D49
D48
D46
VccP
GND
GND
VccP
GND
VccP
A12
A14
A11
A13
A17
D44
D45
D47
D42
D41
res
A16
A15
A18
A25
D37
D40
D43
D36
D39
GND
VccP
GND
GND
GND
GND
VccP
GND
A19
A21
A20
A23
A28
D32
D35
D38
D33
D34
A22
A24
A27
A26
A31
D27
D29
D30
D28
D31
VccP
GND
VccP
A29
A30
A32
A35
IERR
BERR
GND
A33
GND
A34
Vref1 ERCERR INIT
TDO
GND CPURESVccP GND VccP TDI Vref0 STPCLK TCK TRST IGNNE A20M
TMS
FERR PLL1 TESTLO PLL2
VccP
GND
FLUSH THTR BCLK
res
D0
VccP TEST TEST HI HI
D2
D4
D6
GND D1
D3
D7
D12
VccP D5
D8
D15 GND
D9
D14
VccP
GND
VccP
D22
D23
D25
D24
D17
D20
D18
D19
VccP D10
GND
D11
VccP
D13
D26
Y X W U T S Q P N L K J G F E
D21
GND
D16
AC AB AA
D62
GND
DEP2
GND
AG AF AE
DEP3
GND
Vref2
A5 GND
GND
GND res
GND
GND
SMI
GND
BP2
BP3
PentiumPro
GND
HITM
BR2
GND
TESTHI PICD1
Vref4
C B A
Abb. 12.2: Das Anschlussschema des PentiumPro
A20M (I) Anschluss A11 Wird diesem Address-20-Mask-Pin ein Signal mit niedrigem Pegel zugeführt, dann maskiert der PentiumPro vor jedem Speicherzugriff intern das Adressbit A20. Der PentiumPro emuliert dadurch das Wrap-Around des 8086 bei der Adresse 1M. A20M darf nur im Real Mode aktiviert werden.
Sandini Bib 414
Kapitel 12
ADS (O; Multi: I) Anschluss AE3 Ein niedriger Pegel des Address-Status-Signals zeigt an, dass die Request-Phase eines neuen Buszyklus gestartet worden ist. AERR (I/O) Anschluss AE9 Ist die Erfassung von Adressparitätsfehlern aktiviert, gibt der PentiumPro ein aktiv-niedriges Address-Error-Signal AERR aus, wenn er einen Paritätsfehler auf dem Adressbus (A35–A3, AP0, AP1) oder dem Request-Bus (REQ4–REQ0, ADS, RP) erfasst. Ist die Erkennung von Adressparitätsfehlern deaktiviert, dann ignoriert der PentiumPro alle derartigen Fehler. AP1, AP0 (I/O) Anschlüsse S9, U1 Der PentiumPro unterstützt eine Paritätsbildung für den Adressbus mit Hilfe der beiden AdressParitäts-Signale AP1 und AP0. AP1 ist den Adressbits A35–A24, AP0 den Adressbits A23–A3 zugeordnet. Paritätsfehler werden in der Fehlerphase der Transaktion mitgeteilt. Der PentiumPro liefert für Schreibzyklen die Paritätsbits APx, sodass stets eine gerade Anzahl von Signalen mit niedrigem Pegel (auf Grund der aktiv-niedrigen Adress- und Paritätssignale) erzielt wird. Beim Datenlesen muss das System den APx-Pins Signale zuführen, die zu gerader Parität führen (d.h. die Gesamtheit A35–A24 und AP1 bzw. A23–A3 und AP0 müssen eine gerade Anzahl von 0en aufweisen). ASZ1, ASZ0 (I/O) Anschlüsse W5 (REQ4), Y1 (REQ3) Die beiden Signale definieren die Größe des Adressbusses bei einer Transaktion. Sie teilen sich die Pins mit den Signalen REQ4 und REQ3. Es gelten folgende Kodierungen: ASZ1–ASZ0
Speicherbus
Agenten
00 01 10 11
32 Bit 36 Bit (reserviert) (reserviert)
32- und 36-Bit-Agenten 36-Bit-Agenten
ATTR7–ATTR0 (I/O) Anschlüsse E1, E3, G3, G5, G7, G9, J9, L9 (A31–A24) Diese Attributsignale geben die Cache-Attribute der Transaktion an. Sie entsprechen den Attributen in den Speichertyp-Bereichsregistern MTRR und den Page Table-Attributen. Die Signale teilen sich die Pins mit den Adresssignalen A31–A24. Es gelten folgende Zuordnungen: ATTR7–ATTR0
Speichertyp
00000000 00000100 00000101 00000110 00000111 sonst
nicht-cachebar (UC) Write-Combining (WC) Write-Through (WT) Write-Protected (WP) Write-Back (WB) reserviert
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
415
BCLK (I) Anschluss A19 Diesem Pin wird das Bustaktsignal zugeführt, mit dem der externe Systembus des PentiumPro läuft. Der Prozessor erzeugt seinen internen Takt, indem er die Frequenz des BCLK-Signals entsprechend den Pegeln an den Anschlüssen LINT1, LINT0, IGNNE und A20M zum Zeitpunkt eines Resets multipliziert. Gültige Kombinationen sind: LINT1, LINT0, IGNNE, A20M
Frequenzverhältnis PCLK/BCLK
0000 0001 0010 0011 0100 0101 0110 0111–1110 1111
2 4 3 reserviert 5/2 reserviert 7/2 reserviert 2
BE7–BE0 (I/O) Anschlüsse L5, N1, N3, N5, N7, Q1, Q7, Q9 (A15..A8) Diese (Byte-Enable-) Signale legen fest, welche Byte-Gruppen des 64-Bit-Datenbusses im gegenwärtigen Buszyklus auch wirklich gültige Daten übertragen. BE0 entspricht dem niederwertigen Datenbyte D7–D0, BE7 dem höchstwertigen Datenbyte D63–D56. Bei Sonderzyklen geben die Byte-Enable-Signale den Typ des Sonderzyklus an: BE7–BE0
Sonderzyklus
00000001 00000010 00000011 00000100 00000101 00001110 00000111 sonst
Shutdown Cache-Flush (INVD, WBINVD) Halt Synchronisation Flush Acknowledge Stop Grant Acknowledge SMI Acknowledge reserviert
BERR (I/O) Anschluss C5 Ein aktives Signal mit niedrigem Pegel an diesem Bus-Error-Anschluss zeigt an, dass ein Busfehler aufgetreten ist, der das Busprotokoll nicht beschädigt und behoben werden kann. Beispiele sind Paritätsfehler. BINIT (I/O) Anschluss AC43 Tritt bei aktiver BINIT-Erfassung ein Busfehler auf, der nicht behoben (recover) werden kann und die Stabilität des gesamten Systems gefährdet, aktiviert ein Busagent dieses Businitialisierungssignal (mit niedrigem Pegel). Dadurch werden alle Agenten angewiesen, ihre Busschnittstellen zurückzusetzen. Derartige Fehler verhindern im Allgemeinen eine erneute Ausführung der betreffenden Transaktion.
Sandini Bib 416
Kapitel 12
BNR (I/O) Anschluss U7 Jeder Bus-Agent kann das Block-Next-Request-Signal BNR aktivieren, um weitere Bustransaktionen (Buszyklen) zu blockieren. Es tritt üblicherweise auf, wenn externe Puffer (für Daten und/oder Adressen) voll sind und keine weiteren Daten mehr annehmen können. BP3, BP2, BPM1, BPM0 (I/O) Anschlüsse AA39, AC39, AC41, AE43, Die Breakpoint-Anschlüsse BP3, BP2, BPM1, BPM0 entsprechen den Debug-Registern DR3–DR0. Ergibt sich für eines der Register ein Haltepunkt, dann aktiviert der PentiumPro den zugehörigen BPx-Anschluss. Durch die zwei Bits PB1 und PB0 im Debug-Modussteuerregister DR4 können Sie festlegen, ob BPM1 bzw. BPM0 als Breakpoint-Anschluss (PBx=1) oder zum Performance Monitoring benutzt werden sollen. Mit Hilfe der Signale BP3, BP2 sowie BPM1, BPM0 können Breakpoint-Treffer extern durch Hardware erfasst werden. BPRI (I) Anschluss U5 Der PentiumPro erfasst an diesem Bus-Priority-Agent-Anschluss eine Busanforderung durch den Prioritäts-Agenten (im Allgemeinen die Systemsteuerung). Beachten Sie, dass alle PentiumPros in einem Multiprozessorsystem symmetrische Agenten sind und über die Anschlüsse BREQx die Kontrolle über den Bus anfordern. BR3–BR0 (I, I, I, O) Anschlüsse AA1, AC5, U9, W3 Diese vier Bus-Request-Anschlüsse lesen die BREQx-Signale ein (BR3–BR1) bzw. geben das entsprechende BREQx-Signal aus. Diese Signale betreffen symmetrische Bus-Agents. Der PriorityBus-Agent fordert dagegen über BPRI den Bus an. Welches BREQx-Signal an welchem BRx-Pin anliegt, wird bei der Festlegung der Konfiguration definiert. CPUPRES (O) Anschluss B2 Ein Signal mit niedrigem Pegel an diesem CPU-Present-Anschluss zeigt an, dass ein Prozessor im entsprechenden Sockel vorhanden ist. D63–D0 (I/O) Anschlüsse A27, A29, A31, A33, A35, A37, A39, A41, A43, A45, C25, C27, C29, C31, C33, C35, C37, C39, C41, C43, C45, C47, E39, E41, E43, E45, E47, G39, G41, G43, G45, G47, J39, J41, J43, J45, J47, L39, L41, L43, L45, L47, N39, N41, N43, N45, N47, Q39, Q41, Q43, Q45, Q47, S39, S41, S43, S45, S47, U43, U45, U47, W43, W45, W47, Y47 Die 64 Anschlüsse bilden den bidirektionalen 64-Bit-Datenbus des PentiumPro für eine Ein- und Ausgabe von Daten. DBSY (I/O) Anschluss AA5 Das Data-Bus-Busy-Signal benutzt der PentiumPro oder ein anderer Agent dazu, die Kontrolle über den Bus zu behalten, wenn für die Ausführung einer Transaktion mehrere Buszyklen notwendig sind (z.B. Burst-Transfers). D/C (I/O) Anschluss W7 (REQ1) Das Signal zeigt an, ob es sich bei der Transaktion um ein Codelesen (D/C=0) oder einen Datenzugriff (D/C=1) handelt. Das Signal teilt sich den Pin mit dem Signal REQ1.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
417
DEFER (I) Anschluss Y5 Ein inaktives Signal mit hohem Pegel an diesem Anschluss zeigt dem PentiumPro an, dass die gestartet Transaktion in der programmierten Reihenfolge abgeschlossen wird. Ist das DEFERSignal dagegen aktiv (niedriger Signalpegel), muss der adressierte Agent die Transaktion durch eine entsprechende Response-Phase abschließen. Gültig sind Deferred-Response (die Transaktion wird später abgeschlossen), Retry-Response (die Transaktion soll wiederholt werden) und Hard-Error (fataler Fehler). DEN (I/O) Anschluss S3 (EXF1 bzw. A4) Darf die gestartete Transaktion vom reagierenden Agenten verzögert (deferred) werden, gibt der PentiumPro ein Defer-Enable-Signal mit niedrigem Pegel aus. DEP7–DEP0 (I/O) Anschlüsse U39, W39, W41, Y43, Y45, AA47, AC45, AC47 Für den Datenbus unterstützt der PentiumPro nicht nur eine einfache (und nur eingeschränkt taugliche) Paritätsbildung, sondern einen leistungsfähigen ECC-Code, den Sie in ähnlicher Form auch bei Festplatten finden. Dadurch können Fehler nicht nur zuverlässiger erfasst, sondern in gewisser Weise auch automatisch korrigiert werden. Ist diese Erfassungs- und Korrekturfunktion aktiviert, können Einzelbitfehler korrigiert und 2-Bit-Fehler erfasst werden. DID7–DID0 (I/O) Anschlüsse G1, J1, J3, J5, J7, L3, L7, N9 (A23–A16) Die acht Deferred-ID-Signale identifizieren den Agententyp (DID7), den Agenten selbst (DID6– DID4) sowie die Transaktion (DID3–DID0). Symmetrische Agenten (wie der PentiumPro) haben einen Agententyp 0, Prioritätsagenten einen Typ 1. DRDY (I/O) Anschluss AA3 Ein aktives Data-Ready-Signal (niedriger Pegel) zeigt an, dass gültige Daten auf dem Datenbus zur Verfügung stehen. Durch eine verzögerte Aktivierung von DRDY werden Wartezyklen eingelegt. DSZ1, DSZ0 (I/O) Anschlüsse W5 (REQ4), Y1 (REQ3) Die beiden Signale definieren die Größe des Datenbusses bei einer Transaktion, gegenwärtig gibt der PentiumPro stets den Wert 00 ab. Die Signale teilen sich die Pins mit den Signalen REQ4 und REQ3. EXF4–EXF0 (I/O) Anschlüsse Q3, Q5, S1, S3, S5, (A7–A3) Die Signale an diesen Extended-Function-Anschlüssen definieren besondere Funktionen. Dabei gelten folgende Zuordnungen: EXFx
Funktion
EXF4 EXF3 EXF2 EXF1 EXF0
Zugriff auf SMMRAM (siehe SMMEM) Split Lock (siehe SPLCK) reserviert Defer Enable (siehe DEN) reserviert
Sandini Bib 418
Kapitel 12
FERR (O) Anschluss C17 Der Anschluss gibt ein aktives Signal mit niedrigem Pegel ab, wenn in der Gleitkommaeinheit eine nicht-maskierte Exception aufgetreten ist. FLUSH (I) Anschluss A15 Wird dem Cache-Flush-Anschluss ein FLUSH-Signal mit niedrigem Pegel zugeführt, dann schreibt der PentiumPro alle veränderten Cache-Lines des Daten-Caches in den Speicher zurück und invalidiert die Caches. Nach Abschluss des Cache Flushs treibt der Pentium einen FlushAcknowledge-Sonderzyklus (siehe D/C, M/IO, W/R). FRCERR (I/O) Anschluss C9 Wenn derjenige Prozessor, der beim Functional-Redundancy-Checking (FRC) als Checker arbeitet, einen Unterschied zwischen den Signalen vom Master und seinen eigenen erfasst, aktiviert er dieses FRC-Error-Signal. HIT (O; Multi: I/O) Anschluss AC3 Das HIT-Signal zeigt das Ergebnis eines Abfragezyklus an. Hat der Abfragezyklus zu einem Treffer im On-Chip-Daten- oder Befehls-Cache geführt, aktiviert der PentiumPro das HIT-Signal (niedriger Pegel). HITM (O; Multi: I/O) Anschluss AA7 Das Hit-Modified-Line-Signal gibt ähnlich wie HIT das Ergebnis eines Abfragezyklus an. Ein Treffer auf eine Modified Line in einem On-Chip-Daten-Cache veranlasst den PentiumPro, ein HITM-Signal mit niedrigem Pegel abzugeben. IERR (O) Anschluss C3 Ein aktives Internal-Error-Signal mit niedrigem Pegel an diesem Pin zeigt einen internen Fehler des PentiumPro an (z.B. einen Paritätsfehler im L1- oder L2-Cache). IGNNE (I) Anschluss A9 Wird diesem Ignore-Numeric-Error-Anschluss ein Signal mit niedrigem Pegel zugeführt und ist das NE-Bit im Steuerregister CR0 gelöscht (also gleich 0), so ignoriert der PentiumPro numerische Fehler (Exceptions) und führt weiter Gleitkommabefehle aus. FERR wird aber trotzdem aktiviert. Ist das Bit NE im Steuerregister CR0 gesetzt, so hat IGNNE keine Auswirkungen. INIT (I) Anschluss C11 Ein Signal mit niedrigem Pegel an diesem Initialisierungsanschluss setzt den PentiumPro ähnlich wie ein Reset in einen definierten Anfangszustand zurück. Anders als ein Reset werden aber die internen Caches, Schreibpuffer, Modellregister und Gleitkommaregister nicht zurückgesetzt, sondern behalten ihre Werte bei.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
419
INTR/LINT0 (I) Anschluss AG43 Ein hoher Pegel an diesem Interrupt-Anschluss zeigt an, dass eine Interrupt-Anforderung durch eine Hardware-Einheit vorliegt. Ist das Interrupt Flag IE im EFlag-Register gesetzt, dann arbeitet der Pentium den gerade aktiven Befehl noch ab und führt anschließend sofort einen INTAZyklus aus, um die betreffende Interrupt-Nummer von Interrupt Controller zu lesen. Je nach Betriebsmodus ruft der PentiumPro den zugehörigen Handler über die Interrupt-Vektortabelle oder Interrupt-Deskriptortabelle auf. Die INTR-Abtastung kann durch Löschen des IE-Flags unterdrückt und dadurch eine Hardware-Interrupt-Anforderung maskiert werden. Ist der OnChip-APIC aktiviert, wird der Anschluss zum lokalen Interrupt 0 und kann für verschiedene Interrupt-Modi programmiert werden. LEN1, LEN0 (I/O) Anschlüsse W7 (REQ1), W9 (REQ0) Die beiden Signale definieren die Länge eines Datentransfers bei einer Transaktion. Sie teilen sich die Pins mit den Signalen REQ1 und REQ0. Es gelten dabei folgende Kodierungen: LEN1–LEN0
Länge
00 01 10 11
0...8 Byte 16 Byte 32 Byte reserviert
Beachten Sie, das 16-Byte-Transfers nur von externen Agenten ausgeführt werden. Der PentiumPro treibt alle Transferzyklen entweder als Einzeltransfers mit einer Datenlänge zwischen 0 und 8 Byte oder als Burst-Transfers mit einer Länge von 32 Byte. LOCK (O; Multi: I/O) Anschluss AA9 Bei einem aktiven LOCK, also einem niedrigen Signalpegel an diesem Anschluss, gibt der PentiumPro den lokalen Bus nicht an einen anderen Busmaster ab. Er führt also in bekannter Weise einen Locked-Buszyklus (oder gesperrten Buszyklus) aus. NMI/LINT (I) Anschluss AG41 Wird diesem Anschluss ein Signal mit hohem Pegel zugeführt, so löst der PentiumPro einen Interrupt 2 aus, der nicht maskiert werden kann. Es handelt sich also um den bekannten nichtmaskierbaren Interrupt. Nach Abschluss des gegenwärtig aktiven Befehls unterbricht der Pentium unter allen Umständen die Programmausführung und bedient diesen Interrupt. Beachten Sie, dass im Gegensatz zu INTR keine INTA-Sequenz ausgeführt wird, weil der Vektor durch Hardware auf den Wert »2« festgelegt ist. Ist der On-Chip-APIC aktiviert, wird der Anschluss zum lokalen Interrupt 1 und kann für verschiedene Interrupt-Modi programmiert werden. PICCLK (I) Anschluss AA43 Diesem Anschluss wird das Taktsignal für den On-Chip-APIC zugeführt (Programmable Interrupt Controller Clock).
Sandini Bib 420
Kapitel 12
PICD1, PICD0 (I/O) Anschlüsse AA41, AE41 PICD1 und PICD0 bilden den 2-Bit-APIC-Datenbus. PLL2, PLL1 Anschlüsse C19, C23 Die Anschlüsse dienen zur Entkopplung des internen Phase-Lock-Loop-Generators, der die internen Prozessortakte des PentiumPro erzeugt. Zur Vermeidung von Signalspitzen müssen die beiden PLL-Anschlüsse über einen Kondensator mit einer Kapazität von 0,1 µF verbunden sein. PRDY (O) Anschluss Y39 Ein Signal mit niedrigem Pegel an diesem Probe-Ready-Anschluss zeigt an, dass der PentiumPro im Probe-Modus arbeitet. PRDY wird zur Implementierung des Intel-Debug-Ports verwendet. PWRGOOD (I) Anschluss AG7 Ein aktives Power-Good-Signal an diesem Anschluss zeigt der CPU an, dass alle Versorgungsspannungen stabil sind und innerhalb ihrer geforderten Werte liegen. REQ4–REQ0 (I/O) Anschlüsse W5, W7, W9, Y1, Y3 Die fünf Request-Anschlüsse geben Signale ab bzw. erfassen Signale anderer Busmaster, um den gestarteten Buszyklus zu definieren bzw. zu erfassen. Bei einem erweiterten Request geben diese Anschlüsse im zweiten Request-Takt erweiterte Informationen ab bzw. erfassen sie. Gültige Kombinationen sind: Einfacher Request: REQ4–REQ0
Bedeutung
00000 00001
Deferred Reply reserviert
Erweiterter Request: REQ4–REQ0
REQ4–REQ0
Bedeutung
01000 01000 01000 01001 01001 01001 10000 10001 1100x as010 as011 as100
dsx00 dsx01 dsx1x dsx00 dsx01 dsx1x dsxln dsxln dsxxx dsxln dsxln dsxln
Interrupt Acknowledge Sondertransaktion reserviert Branch Trace Message reserviert reserviert I/O-Lesen I/O-Schreiben reserviert Speicherlesen und Invalidieren reserviert Codelesen aus Speicher
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
REQ4–REQ0
REQ4–REQ0
Bedeutung
as110 as101 as111
dsxln dsxln dsxln
Datenlesen aus Speicher Datenschreiben (ohne Wiederholungsversuch) Datenschreiben (mit Wiederholungsversuch)
421
Bemerkungen: x=beliebig as=Adressbusgröße (ASZ-Signal): 00=32-Bit-Speicher, 32+36-Bit-Agenten; 01=36-Bit-Speicher, 36-Bit-Agenten; 10=reserviert; 11=reserviert ds=Datenbusgröße (DSZ-Signal): für PentiumPro stets 00 ln=Datentransferlänge: 00=0–8 Byte; 01=16 Byte; 10=32 Byte; 11=reserviert
Die REQx-Signale übernehmen also die Aufgabe der Signale D/C, M/IO und W/R der x86-Prozessoren sowie des Pentiums. RESET (I) Anschluss Y41 Liegt dieser Anschluss für mindestens 15 CLK-Taktzyklen auf einem niedrigen Pegel, dann bricht der Prozessor seine Tätigkeit vollständig ab und führt einen internen Reset aus. Dazu werden alle Caches invalidiert (beachten Sie, dass veränderte Cache-Lines nicht zurückgeschrieben werden). RP (I/O) Anschluss AC7 Der PentiumPro unterstützt eine Paritätsbildung auch für die Signale REQ4–REQ0 und ADS mit Hilfe des Request-Paritäts-Signals RP. Paritätsfehler werden in der Fehlerphase der Transaktion mitgeteilt. RS2–RS0 (I) Anschlüsse AC9, AE5, AE7 Den drei Response-Status-Anschlüssen führt der adressierte Agent einer Bustransaktion Signale zu, die den Status der Transaktion anzeigen. Die Kodierungen haben dabei folgende Bedeutung: RS2–RS0
Response
000 001 010 011 100 101 110 111
Idle (Bus nicht belegt) Retry (Transaktion wiederholen) Deferred-Response reserviert Hard-Error (fataler Fehler) keine Daten implizites Write-Back Daten o.k.
RSP (I) Anschluss U3 Der PentiumPro unterstützt über dieses Response-Parity-Signal RSP auch für die Response-Signale RS2–RS0 eine Paritätsbildung. Beachten Sie, dass der adressierte Agent das Paritätssignal erzeugen muss, der PentiumPro überprüft die Parität nur. Paritätsfehler werden in der Fehlerphase der Transaktion mitgeteilt.
Sandini Bib 422
Kapitel 12
SMI (I) Anschluss W1 Ein aktives Signal mit niedrigem Pegel an diesem Eingang für mindestens zwei CLK-Zyklen aktiviert den System Management Modus des PentiumPro. SMMEM (I/O) Anschluss Q3 (EXF4 bzw. A7) Greift der PentiumPro im Systemmanagement-Modus auf den SMM-RAM zu, dann gibt er an diesem SMMEM-Anschluss ein aktives Signal mit niedrigem Pegel aus. Das Signal teilt sich den Pin mit dem Signal A7. SPLCK (I/O) Anschluss S1 (EXF3 bzw. A6) Ein aktiv-niedriges Signal an diesem Split-Lock-Anschluss zeigt an, dass der PentiumPro einen Locked-Zugriff ausführt, der sich über eine QWort-Grenze (8 Byte) erstreckt. Das Signal teilt sich den Pin mit dem Signal A6. STPCLK (I) Anschluss A3 Wird diesem Stop-Clock-Anschluss ein aktives Signal mit niedrigem Pegel zugeführt, schaltet der PentiumPro seinen internen Prozessortakt bei der nächsten Befehlsgrenze ab. Dadurch sinkt der Stromverbrauch erheblich. Interprozessor- und externe Abfragezyklen werden aber weiter bedient. TCK (I) Anschluss A5 Diesem Test-Clock-Anschluss wird das Testtaktsignal für den JTAG-Boundary-Scan-Test zugeführt. TDI (I) Anschluss A13 Dem Test-Data-Input-Anschluss TDI werden TAP- (Test-Access-Port-) Befehle und -Daten synchron zu TCK in serieller Weise zugeführt. TDO (O) Anschluss C13 Vom Test-Data-Output-Anschluss TDO werden Befehle und Ergebnisdaten des Boundary-ScanTests synchron zu TCK in serieller Weise ausgegeben. TESTHI (I) Anschlüsse A23, A25, AE39 Die Anschlüsse sollten mit VccP verbunden sein. TESTLO Anschlüsse C21, AS39, AS41, AS43, AS45, BA13, BA15, BA33, BA37, BC13, BC15, BC33, BC37 Diese Anschlüsse sollten mit GND (Masse) verbunden sein.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
423
THERMTRIP (O) Anschluss A17 Der PentiumPro besitzt einen internen Temperatursensor, um die elektronischen Komponenten vor einer Überhitzung zu schützen. Übersteigt die Sensortemperatur 135°C, schaltet sich der Prozessor automatisch ab und gibt ein THERMTRIP-Signal mit niedrigem Pegel aus, um das Abschalten dem System mitzuteilen. Nur ein Reset kann den PentiumPro (nach Abkühlen) wieder starten. TMS (I) Anschluss C15 Wird diesem Test-Mode-Select-Anschluss ein Signal mit hohem Pegel zugeführt, löst der TestAccess-Port einen Betrieb der JTAG-Testlogik für den Boundary-Scan-Test aus. TRDY (I) Anschluss Y9 Der adressierte Agent für einen Schreibzugriff übergibt an diesem Target-Ready-Anschluss ein aktiv-niedriges Signal, um dem PentiumPro anzuzeigen, dass er Schreibdaten übernehmen kann. TRDY spielt also für Schreibvorgänge dieselbe Rolle wie bei früheren Prozessoren das Ready-Signal. TRST (I) Anschluss A7 Ein aktives Signal mit niedrigem Pegel an diesem Test-Reset-Anschluss initialisiert die Boundary-Scan-Testlogik. UP (O) Anschluss AG3 Im PentiumPro ist dieser Update-Present-Anschluss frei schwebend, im PentiumPro Overdrive ist er intern mit Masse verbunden, er befindet sich also auf einem niedrigen Pegel und zeigt so einen Overdrive (Upgrade) an. VID3–VID0 Anschlüsse AS1, AS3, AS5, AS7 Diese vier Anschlüsse dienen zur Identifizierung der primären Versorgungsspannung, die der PentiumPro benötigt. Sie sind intern mit Masse (Wert=0) verbunden oder frei schwebend (Wert=1). Es gelten folgende Zuordnungen: Spannung [V]
VID3–VID0
Spannung [V]
VID3–VID0
3,5 3,4 3,3 3,2 3,1 3,0 2,9 2,8
0000 0001 0010 0011 0100 0101 0110 0111
2,7 2,6 2,5 2,4 2,3 2,2 2,1 keine CPU
1000 1001 1010 1011 1100 1101 1110 1111
Sandini Bib 424
Kapitel 12
W/WB (I/O) Anschluss W7 (REQ1) Das Signal zeigt an, ob es sich bei der Transaktion um ein Write-Back (W/WB=0) oder ein gewöhnliches Datenschreiben (W/WB=1) handelt. Das Signal teilt sich den Pin mit dem Signal REQ1. Vcc5 (I) Anschluss AG1 Dieser Anschluss wird vom PentiumPro nicht verwendet. Er dient beim PentiumPro Overdrive zur Versorgung des Kühlventilators. VccP (I) Anschlüsse B4, B8, B16, B24, B32, B40, B44, F2, F6, F42, F46, K4, K44, P2, P6, P42, P46, T4, T44, X6, X42, AB4, AB44, AJ3, AJ7, AJ41, AJ45, AL1, AL5, AL9, AL39, AL43, AL47, AN3, AN7, AN41, AN45, AQ1, AQ5, AQ9, AQ39, AQ43, AQ47, BA17, BA21, BA25, BA29 VccP stellt die primäre Versorgungsspannung dar. VccS (I) Anschlüsse AU1, AU5, AU9, AU39, AU43, AU47, AW3, AW7, AW41, AW45, AY1, AY3, AY5, AY7, AY9, AY39, AY41, AY43, AY45, AY47, BA3, BA7, BA41, BA45, BC19, BC23, BC27, BC31 VccS stellt die sekundäre Versorgungsspannung dar. Sie wird von manchen L2-Caches des PentiumPro benötigt. Vref0–Vref7 (I) Anschlüsse A1, A47, C7, S7, U41, Y7, AE47, AG45 Den acht Anschlüssen wird die Referenzspannung für die GTL+-Puffer (Gunning Transceiver Logic) des PentiumPro zugeführt, da diese Puffer hohe und niedrige Signalpegel relativ zu einer Referenzspannung bestimmen. Üblicherweise sind die Anschlüsse Vref3–Vref0 sowie die Anschlüsse Vref7–Vref4 miteinander verbunden. GND (I) Anschlüsse B6, B12, B20, B28, B36, B42, B46, F4, F8, F40, F44, K2, K6, K8, K40, K42, K46, P4, P8, P40, P44, T2, T6, T8, T40, T42, T46, X2, X4, X8, X40, X44, X46, AB2, AB6, AB8, AB40, AB42, AB46, AF2, AF4, AF6, AF8, AF40, AF42, AF44, AF46, AJ1, AJ5, AJ9, AJ39, AJ43, AJ47, AL3, AL7, AL41, AL45, AN1, AN5, AN9, AN39, AN43, AN47, AQ3, AQ7, AQ41, AQ45, AU3, AU7, AU41, AU45, AW1, AW5, AW7, AW39, AW43, AW47, BA1, BA5, BA9, BA19, BA23, BA27, BA31, BA39, BA43, BA47, BC1, BC3, BC5, BC7, BC9, BC17, BC21, BC25, BC29, BC39, BC41, BC43, BC45, BC47 res Anschlüsse A21, L1, AC1, AE1, AE45, AG5, AG9, AG39, AG47, AS9, AS47, BA11, BA35, BC11, BC35 Die Anschlüsse sind für eine zukünftige Verwendung reserviert.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
425
12.2 Interner Aufbau Die zwölf Stufen der drei Pipelines des PentiumPro – dieser Prozessor ist also ein SuperpipelinedSuperskalar – ermöglichen zwar eine Verkürzung der einzelnen Pipeline-Stufen (sie werden also in kürzerer Zeit durchlaufen) und damit eine höhere Taktfrequenz, andererseits ist aber das Scheduling (zeitliche Abstimmung) der einzelnen Befehle wesentlich komplexer. Beispielsweise wird die Vorhersage einer Verzweigung (die beim Befehlsholen durchgeführt wird) erst zehn bis zwölf Stufen (im Allgemeinen gleich zwölf Taktzyklen) später verifiziert. Damit ist bereits ersichtlich, dass das spekulative Ausführen und die Umordnung der einzelnen Befehle in wesentlich größerem Umfang als beim Cyrix 6x86 oder AMD5K86 erfolgen muss. Eine zentrale Bedeutung hat in diesem Zusammenhang der Befehls-Pool.
12.2.1 Die funktionalen Einheiten des PentiumPro Die komplexen funktionalen Einheiten des PentiumPro benötigen mehr als fünf Millionen Transistoren, um ein reibungsloses Funktionieren des Prozessors zu gewährleisten. In Abbildung 12.3 sehen Sie ein Blockdiagramm des PentiumPro-CPU-Kerns mit diesen Einheiten. SRAM-Die Systembus L2-Cache 64-BitDatenbus
36-BitAdressbus dedizierter Cache-Bus
CPU-Die Busschnittstelle
IF-Einheit L1-Befehls-Cache
L1-Daten-Cache
Befehlsdekoder einfache Befehle
einfache Befehle
BTB
komplexe Befehle
µ-Code
APIC
Register-Alias-Tabelle Reservierungsstation
FPU I
FPU II
INT I
INT II
MIU
Retire-Einheit/x86-Register
Abb. 12.3: Blockdiagramm des PentiumPro
Die Verbindung zum L2-Cache erfolgt über einen dedizierten Cache-Bus mit einer Datenbreite von 64 Bit. Da dieser Bus mit dem vollen Prozessortakt läuft, werden alle Zugriffe auf den L2Cache erheblich verkürzt. Außerdem unterstützt er bis zu vier anhängige Cache-Zugriffe. Beachten Sie, dass die Zykluszeit bei 200 MHz nur noch 5 ns beträgt. Beim typischen Bustakt von 66
Sandini Bib 426
Kapitel 12
MHz dauert ein Zyklus dagegen 15 ns. Die zweite Schnittstelle zur Außenwelt (für alle I/O- und Speicherzugriffe, die zu einem Fehltreffer sowohl im L1- wie auch im L2-Cache führen) bildet der Systembus. Die Datenbusbreite beträgt wie beim Pentium 64 Bit, dagegen ist die Breite des Adressbusses auf 36 Bit angehoben worden. Sie müssen diese Erweiterung um 4 Bit allerdings über das Steuerregister CR4 explizit aktivieren. Die Busschnittstelle vermittelt eine Verbindung zwischen dem System- und Cache-Bus sowie den beiden L1-Caches des PentiumPro. Der L1-Daten-Cache ist als 2-Wege-set-assoziativer Cache mit 8 KByte Kapazität und zwei Zugriffsports implementiert. Dadurch können in einem einzigen Taktzyklus ein Schreibvorgang (Schreibport) und ein Lesevorgang (Leseport) ausgeführt werden. Er unterstützt alle vier MESI-Zustände. Der L1-Befehls-Cache hat eine 2-Wege-setassoziative Organisation und ebenfalls ein Speichervermögen von 8 KByte. Die IF-Einheit (Instruction Fetch) liest Befehle aus dem Cache, die im Befehlsdecoder von drei parallel arbeitenden Einheiten decodiert werden. Zwei Einheiten dienen zur Dekodierung einfacher Befehle, die keinen Eingriff von Mikrocodes benötigen (z.B. MOV reg, reg). Die dritte Einheit dekodiert komplexe CISC-Befehle mit Hilfe von Mikrocodes (z.B. REP MOVS). Natürlich ist auch eine leistungsstarke Logik zur Verzweigungsvorhersage implementiert. Der zugehörige Branch-Target-Puffer BTB speichert 512 Verzweigungsziele zusammen mit der History-Information, um Verzweigungen möglichst korrekt vorherzusagen. Das ist bei der Tiefe der PentiumProPipelines (12 Stufen) zur Implementierung einer spekulativen Befehlsausführung auch unbedingt erforderlich. In der Register-Alias-Tabelle werden Referenzen auf die x86-Register (EAX, BP usw.) in Referenzen auf die 40 PentiumPro-internen Register umgerechnet. Es findet also ein Register-Renaming statt. Die eigentliche Befehlsverarbeitung findet in einer der fünf Ausführungseinheiten statt, die von der Reservierungsstation mit den Befehlen gefüttert werden. Es sind zwei Einheiten für Gleitkommabefehle (FPU I+II), zwei Einheiten für Integer-Befehle (INT I+II) und eine Speichereinheit (MIU = Memory Interface Unit) vorhanden. Alle fünf Einheiten können unabhängig voneinander arbeiten, d.h. pro Taktzyklus können maximal fünf Befehle ausgeführt werden. Intel gibt als dauerhafte Rate drei Befehle pro Takt an (beachten Sie aber, dass es sich hierbei um so genannte µ-Ops handelt; Näheres hierzu im folgenden Abschnitt). In der Retire-Einheit werden schließlich Datenabhängigkeiten aufgelöst, Verzweigungen verifiziert und die x86-Architekturregister geschrieben. Zusätzlich ist auf dem Prozessorchip noch ein APIC (Advanced Programmable Interrupt Controller) integriert, um einen Multiprozessorbetrieb mit maximal vier PentiumPros zu ermöglichen.
12.2.2 Befehls-Pool und Micro-Ops Der PentiumPro ist ein so genannter 3-Wege-Superskalar, d.h. er kann pro Taktzyklus drei Befehle starten oder beenden und weist daher drei Pipelines auf. Jede dieser Pipelines umfasst 12 Stufen, d.h. es handelt sich um eine Superpipelined-Architektur. Die hohe Stufenzahl bringt aber auch Probleme mit sich. Beispielsweise machen sich Datenabhängigkeiten auch bei größeren Abständen der die Abhängigkeiten verursachenden Befehle (z.B. ADD eax, ebx ... MOV edx, eax) bemerkbar. Konventionelle Ausführung der Befehle in »flachen« Pipelines (wie z.B. beim Pentium mit nur fünf Integer-Stufen) ist hier unmöglich, ohne die Pipelines ständig zu hemmen. Der PentiumPro implementiert daher entkoppelte Pipelines und ersetzt die einfache »Ausführung« eines Befehls durch die zwei entkoppelten Phasen Verteilen/Ausführen (Dispatch/Execute) und Retire, die Befehle in den einzelnen Pipes sollen also möglichst unabhängig voneinander ausgeführt werden. Das führt automatisch zum Konzept der Out-of-Order-Ausführung von
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
427
Befehlen, die beim Pentium mit Hilfe eines so genannten Befehls-Pools ausgiebig genutzt wird. Zu diesem Zweck sind die Pipelines in vier Gruppen unterteilt: IF/Dekodiereinheit, Dispatch/ Ausführungseinheit, Retire-Einheit und eben den Befehls-Pool (englisch: Instruction Pool). Das Prinzip der Befehlsausführung im PentiumPro sehen Sie in Abbildung 12.4.
L1-BefehlsCache
IF/Dekodiereinheit
x86Register
L1-Daten-Cache
Dispatch/ Ausführungseinheit
Retire-Einheit
Befehls-Pool
Abb. 12.4: Befehls-Pool und Ausführungseinheiten
Die IF/Dekodiereinheit liest pro Taktzyklus eine Cache-Line (32 Byte) aus dem L1-BefehlsCache, markiert gleichzeitig Anfang und Ende der x86-Befehle im Befehls-Cache und führt eine Verzweigungsvorhersage aus. Anschließend überträgt die Befehlslesestufe IF 16 Byte an die Dekodiereinheit. Sie weist zwei Decoder für einfache und einen Decoder für komplexe Befehle auf. Ähnlich wie bereits im AMD5K86 setzen die Decoder die x86-Befehle in elementarere µ-Ops (µ-Operationen) (beim AMD5K86 heißen sie RISC-Ops) um. Einfache Befehle (z.B. ADD reg, reg oder MOV reg, reg) werden in eine einzige µ-Op umgesetzt, etwas kompliziertere in maximal vier. Diese x86-Befehle benötigen noch keinen Mikrocode. Nur komplexe CISC-Befehle werden im entsprechenden Decoder in eine Kette von µ-Ops umgesetzt. Pro Taktzyklus können die beiden Decoder für einfache Befehle je einen und der Decoder für komplexe Befehle maximal vier µ-Ops erzeugen, zusammen sind das also höchstens sechs µ-Ops pro Takt. Alle Referenzen auf x86-Register werden in Referenzen auf PentiumPro-Register (40 Register für Integer- und Gleitkommagrößen) abgebildet. Beachten Sie, dass nur die µ-Ops anschließend in den Ausführungseinheiten ausgeführt werden, nicht die ursprünglichen x86-Befehle. Diese Umsetzung erfolgt in genau der Reihenfolge, in der die x86-Befehle im Programm erscheinen. Bis zu dieser Stelle haben wir es also mit einer InOrder-Ausführung zu tun. Anschließend gibt die IF/Dekodiereinheit die entsprechenden µ-Ops an den Befehls-Pool (andere Hersteller bezeichnen ihn auch als Reorder-Puffer) weiter, wo die dynamische (Out-of-Order-) Ausführung der Befehle beginnt. Die Dispatch-/Ausführungseinheit steuert die dynamische Befehlsausführung und verteilt die einzelnen µ-Ops auf die Ausführungseinheiten. Da fünf Einheiten zur Verfügung stehen (zwei FPU-, zwei Integer- und eine Speichereinheit), können pro Taktzyklus maximal fünf µ-Ops gestartet werden. Typischerweise wird eine Startrate von drei Befehlen pro Taktzyklus erreicht. Beachten Sie aber, dass es sich hierbei um µ-Ops handelt, die häufig weniger leisten als ein x86-Befehl. Drei µ-Ops pro Takt bedeuten also nur für einfache Befehle auch drei x86-Befehle pro Takt. Im Befehls-Pool befinden sich typischerweise 20 bis 30 µ-Ops, die auf ihre Ausführung warten. Jeder µ-Op sind Informationen beigefügt, die den Bereitschafts-, Ausführungs- und Ergebnisstatus kennzeichnen. Eine µ-Op ist beispielsweise zur Ausführung bereit, wenn sie alle erforderlichen Operanden hat (also z.B. nach dem Lesen eines Operanden aus dem Speicher). Der Befehls-
Sandini Bib 428
Kapitel 12
Pool startet dann die Ausführung des Befehls, indem er ihn zusammen mit den Operanden an die entsprechende Ausführungseinheit übergibt. Das kann ziemlich unabhängig von der ursprünglich programmierten Befehlsreihenfolge erfolgen, obwohl sich die Dispatch-Ausführungseinheit über einen Pseudo-FIFO-Algorithmus um ein an der ursprünglichen Reihenfolge orientiertes Starten der Befehle bemüht. Für die Ausführung eines Befehls sind nämlich nur die Operanden und eine freie Ausführungseinheit notwendig. Kann ein Befehl im Pool z.B. wegen einer nicht verfügbaren Ausführungseinheit oder wegen unvollständiger Operanden nicht gestartet werden, sucht sich der Pool einfach einen anderen Befehl, der bereit ist und startet diesen. Diese dynamische Befehlsausführung soll verhindern, dass gehemmte Befehle (z.B. durch einen Speicherlesevorgang mit Cache-Fehltreffer) den gesamten Prozessor lahmlegen. Stattdessen werden einfach andere Befehle ausgeführt, während z.B. die Busschnittstelle auf den Lesewert wartet. Die Ergebnisse dieser maximal 20 bis 30 vorausschauend ausgeführten Befehle (dazu gehören auch spekulative Befehle nach einer Verzweigung) werden in PentiumPro-Registern gespeichert, nicht in x86-Registern. Vorausschauend bedeutet hier, dass der Befehlszähler EIP noch nicht aktualisiert worden ist. X86-Architekturregister werden in streng programmierter Reihenfolge geschrieben, um z.B. zu verhindern, dass ein älterer Registerwert einen neueren überschreibt. Die Ergebnisse werden zunächst zusammen mit dem Befehl an den Pool zurückgegeben. Die Retire-Einheit überprüft ständig den Befehls-Pool nach abgeschlossenen Befehlen, um ein Retirement durchzuführen. Dieses Retirement (etwa: Zurückschreiben) erfolgt aber erst, wenn der Befehl entsprechend der programmierten Reihenfolge an der Reihe ist, d.h. alle vorherigen Befehle abgeschlossen und deren Ergebnisse in die x86-Register zurückgeschrieben worden sind. Das betrifft insbesondere auch Speicherschreibvorgänge (in den Cache oder auf den Systembus). Die Retire-Einheit des PentiumPro kann maximal drei µ-Ops pro Taktzyklus abschließen und aus dem Befehls-Pool entfernen. Die 20 bis 30 vorausschauend ausgeführten Befehle verursachen im Durchschnitt fünf Verzweigungen. Der PentiumPro unterstützt daher bis zu fünf spekulative Ebenen. Zusammenfassend könnte man sagen, dass die dynamische Befehlsausführung bedeutet, dass Befehle in beliebiger Reihenfolge gestartet, aber streng in programmierter Reihenfolge abgeschlossen werden. Außerdem sind die vier funktionalen Gruppen (IF/Dekodiereinheit, Dispatch/Ausführungseinheit, Retire-Einheit und der Befehls-Pool) der Pipeline stark entkoppelt, der Befehls-Pool dient praktisch als gemeinsamer »Topf«, aus dem sich die anderen drei Einheiten bedienen.
12.2.3 Die L1- und L2-Caches Der PentiumPro weist zwei getrennte L1-Caches für Code und Daten auf dem CPU-Die auf und integriert zusätzlich einen L2-Cache im selben Gehäuse. Die Verbindung erfolgt über einen dedizierten L2-Cache-Bus mit einer Datenbreite von 64 Bit, der mit dem vollen CPU-Prozessortakt läuft (also mit bis zu 200 MHz). Der L1-Daten-Cache ist als 2-Wege-set-assoziativer Cache mit 8 KByte Speicherkapazität und zwei Zugriffsports implementiert. Dadurch können in einem einzigen Taktzyklus ein Schreibvorgang (Schreibport) und ein Lesevorgang (Leseport) ausgeführt werden. Er unterstützt alle vier MESI-Zustände. Der L1-Befehls-Cache hat eine 2-Wege-set-assoziative Organisation und ebenfalls ein Speichervermögen von 8 KByte. Der für Daten und Code vereinheitlichte (Unified) L2-Cache mit einer 4-Wege-set-assoziativen Organisation unterstützt bis zu vier anhängige Cache-Zugriffe und weist eine Speicherkapazität von 256 KByte oder 512 KByte auf. Details zu den integrierten Caches können Sie über den CPUID-Befehl abrufen (Kapitel 12.8). Natürlich unterstützen alle Caches das MESI-Protokoll.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
429
12.3 PentiumPro-Features Neben dem völlig neuen internen Aufbau des PentiumPro mit den damit verbundenen hochmodernen Programmausführungsstrategien gibt es noch ein paar Innovationen, die auch nach außen erscheinen (d.h. Ihnen als Programmierer zugänglich sind). In den folgenden Abschnitten möchte ich sie kurz erläutern. Maschinenspezifische Details werden dagegen im Zusammenhang mit den modellspezifischen Registern behandelt.
12.3.1 Befehle Mit dem PentiumPro wurden fünf Befehlsgruppen neu eingeführt:
: : : : :
CMOVcc: Bedingte Übertragung (Conditional Move) RDPMC: Zähler für das Performance Monitoring lesen (Read Performance Counter) UD2: nicht-definierter Befehl (Undefined) FCMOVcc: Bedingte Übertragung (Conditional FPU Move) FCOMx, FUCOMx: FP-Vergleich (FP Compare)
Die beiden wichtigsten sind CMOVcc und FCMOVcc; sie ermöglichen die bedingte Ausführung von MOV-Befehlen. Bisher war dazu eine Kombination von bedingten Sprungbefehlen und einem normalen MOV-Befehl notwendig, z.B. bei der Übertragung eines Registeroperanden nach EAX, wenn das Carry-Flag gesetzt ist: PentiumPro bisher CMOVC eax, edx JNC weiter MOV eax, edx weiter: ......
Mit Hilfe des RDPMCs können Programme auch ohne Umweg über die modellspezifischen Register die Performance Counter (Zähler 0 und 1) lesen. Wenn im Steuerregister CR4 das PCEBit (Performance Counter Enable) gesetzt ist, können das auch Programme mit CPL=1, 2 oder 3, sonst (PCE=0) nur Kernel-Programme mit CPL=0. Vor dem RDPMC-Befehlsaufruf muss im Register ECX der zu lesende Zähler (0000h oder 0001h) spezifiziert werden. Nach RDPMC enthält EDX:EAX den 40-Bit-Wert des entsprechenden Zählers.
12.3.2 Steuerfunktionen in CR4 Das Steuerregister CR4 weist ein paar neue Steuer-Flags auf. Sie aktivieren die zusätzlichen vier Adressbits A35–A32, ermöglichen globale Pages und erlauben die Ausführung des RDPMCBefehls auch für Anwendungsprogramme mit CPL=1, 2 oder 3. In Abbildung 12.5 sehen Sie den Aufbau des Steuerregisters CR4, die neuen Flags sind hinterlegt. Das Flag PAE (Physical Address Extension) aktiviert die vier Adressleitungen A35–A32, um 36-BitAdressen zu erzeugen. Dazu ist notwendig, dass das Paging aktiviert ist. Details hierzu finden Sie im folgenden Abschnitt 12.3.3. Durch Setzen des PGE-Bits aktivieren Sie die Global-Page-Funktion des PentiumPro (auch der 5K86 implementiert diese Funktion). Weitere Einzelheiten finden Sie in Abschnitt 12.3.4. Damit auch Anwendungsprogramme mit CPL=1, 2 oder 3 den RDPMCBefehl nutzen können, muss das PCE-Bit gesetzt sein. Für PCE=0 können nur Kernel-Programme den RDPMC-Befehl aufrufen, ohne eine Exception auszulösen.
Sandini Bib 430
Kapitel 12
CR4 16 15
9
8
7
6
5
4
3
2
1 0
PCE PGE MCE PAE PSE DE TSD PVI VME
31
PCE: PGE: MCE: PAE: PSE: DE: TSD: PVI:
VME:
Performance-Counter-Aktivierung (Performance Counter Enable) 1=RDPMC für CPL=0, 1, 2, 3 0=RDPMC nur für CPL=0 Global-Page-Erweiterung (Page Global Enable) 1=globale Pages aktiviert 0=globale Pages deaktiviert Machine Check Enable 1=Machine Check Exception aktiviert 0=Machine Check Exception deaktiviert Erweiterung des Adressbus (Physical Address Extension) 1=36-Bit-Adressbus 0=32-Bit-Adressbus Page Size Extension 1=4-MByte-Pages 0=4-KByte-Pages Debugging Extension 1=Haltepunkte auch für I/O-Bereich 0=Haltepunkte nur für Speicheradressen Time Stamp Disable 1=RDTSC nur mit CPL=0 0=RDTSC auch mit CPL=3..1 Protected Mode Virtual Interrupts 1=virtuelle Interrupt Flags 0=keine virtuellen Interrupt Flags im Protected Mode Virtual-8086-Mode Extension 1=virtuelle Interrupt Flags 0=keine virtuellen Interrupt Flags im Virtual-8086-Mode
Abb. 12.5: Das Steuerregister CR4
12.3.3 Der 36-Bit-Adressbus Der PentiumPro ermöglicht bei aktivem Paging die Erzeugung von 36-Bit-Adressen. Dadurch wird der physikalische Adressraum auf 64 GByte vergrößert. Die 36-Bit-Adresserweiterung aktivieren Sie über das PAE-Flag im Steuerregister CR4 (Abbildung 12.5). Ist die Erweiterung aktiv, arbeitet der PentiumPro wahlweise mit 4-KByte- oder 2-MByte-Pages (ohne Adresserweiterung 4-KByte- und 4-MByte-Pages). Auch hier werden die 2-MByte-Pages direkt vom Page Directory verwaltet und nicht von einem Page Table-Eintrag. Die Aktivierung der Adresserweiterung verursacht ein paar Änderungen in der Paging-Struktur des PentiumPro. In Abbildung 12.6 sehen Sie die Strukturen von Page Table-, Page Directory- und Page Directory-Pointer-Table-Eintrag sowie vom CR3-Register. Da die gewöhnlichen Strukturen für 32-Bit-Adressen vorgesehen und dadurch auch keine freien Bits mehr übrig sind, wurden beim PentiumPro für die Adresserweiterung die Page Table- und Page Directory-Einträge auf 64 Bit vergrößert. Die vier niederwertigen Bits 35–32 der Erweiterung nehmen die vier höherwertigen Bits A35–A32 der Basisadresse auf. Beachten Sie, dass nur bei aktiver Adresserweiterung solche 64-Bit-Strukturen notwendig sind; bei gewöhnlicher 32Bit-Adressierung arbeitet auch der PentiumPro mit 32-Bit-Strukturen. Zusätzlich zu den Page Tables und Page-Directories ist noch ein Page Directory-Pointer-Table (welch ein Wort ...) hinzugekommen. Sie befindet sich in der Hierarchie der Transformation linearer Adressen über dem Page Directory. Für erweiterte physikalische Adressen ist auch das CR3-Register etwas modifiziert worden: Die Bits CR3.31–CR3.5 definieren die 27 höherwertigen Adressbits der Page Directory-Pointer-Table-Basis. Dadurch kann diese Tabelle nur in den ersten 4 GByte des physikalischen Speichers abgelegt werden und muss außerdem an 32-Byte-Grenzen ausgerichtet sein. Mit Worten ist das alles recht kompliziert zu beschreiben. Abbildung 12.7 zeigt daher die Adresstransformationen für 4-KByte- und 2-MByte-Pages.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
431
4kByte-Pages Page-Directory-Pointer-Table-Eintrag 48 47
36 35
16 15
12 11
9 8
AVAIL
Basis A31..A12
5 4 3 2
reserviert
PCD
31
32
Basis A35..A32
reserviert
PWT
63
1 0 res
Page-Directory-Eintrag 48 47
36 35
9 8 7 6 5 4 3 2
AVAIL
Basis A31..A12
0 0 0 A
U/S
12 11
PCD
16 15
1 0
R/W
reserviert 31
32
Basis A35..A32
PWT
63
P
Page-Table-Eintrag 48 47
36 35
9 8 7 6 5 4 3 2
AVAIL
G 0 D A
U/S
12 11
PCD
16 15 Basis A31..A12
1 0
R/W
reserviert 31
32
Basis A35..A32
PWT
63
P
2MByte-Pages Page-Directory-Pointer-Table-Eintrag 48 47
36 35
reserviert 16 15
12 11
9 8
AVAIL
Basis A31..A12
5 4 3 2
reserviert
PCD
31
32
Basis A35..A32
PWT
63
1 0 res
Page-Directory-Eintrag 48 47
36 35
12 11
reserviert
9 8 7 6 5 4 3 2
AVAIL
G 1 D A
U/S
Basis A31..A12
16 15
1 0
R/W
21 20
PCD
31
32
Basis A35..A32
reserviert
PWT
63
P
CR3-Register 5 4 3 2
Page-Directory-Pointer-Table-Basis A31..A5
PCD
16 15
PWT
31
1 0
0 0 0
Abb. 12.6: Page Table-, Page Directory- und Page Directory-Pointer-Eintrag
Bei der Abbildung einer linearen 32-Bit-Adresse auf 4-KByte-Pages zeigen die Bits CR3.31–CR3.5 auf den Beginn eines Page Directory-Pointer-Tables, der maximal vier Einträge zu je 64 Bit (siehe Abbildung 12.6) speichert. Die beiden Bits A31–A30 der linearen Adresse wählen einen Directory-
Sandini Bib 432
Kapitel 12
Pointer-Eintrag aus, der wiederum die Basisadresse eines Page-Directories angibt. Die neun Adressbits A29–A21 zeigen auf einen der 512 Directory-Einträge, der wiederum die Basisadresse eines Page Tables angibt. Die neun Adressbits A20–A12 wählen einen der insgesamt 512 Page Table-Einträge aus. Dieser gibt die Basisadresse der entsprechenden Page an. Innerhalb der so adressierten Page legt der Offsetanteil A11–A0 der linearen Adresse die Stelle des Speicherobjekts fest, das adressiert werden soll. Insgesamt steht so ein Adressraum von 4 GByte innerhalb des 36-Bit-Adressraums mit 64 GByte zur Verfügung (vier Page Directory-Pointer-Table-Einträge * 512 Page Directory-Einträge * 512 Page Table-Einträge * Page-Größe von 4 KByte). Wenn Sie diese Umsetzung der linearen in eine physikalische Adresse mit der gewöhnlichen Adresstransformation (siehe Abbildung 6.21) vergleichen, erkennen Sie, dass durch den Page Directory-Pointer-Table eine zusätzliche Adressumsetzung hinzugekommen ist. Da der PentiumPro aber eine Vielzahl interner Cache-Register aufweist, die solche Verweise zwischenspeichern, ergibt sich keine Verlangsamung der Befehlsausführung. 4kByte-Pages Lineare 32-Bit-Adresse 31 30 29 Direct.Pointer
21 20
12 11
0 Offset
Page
Directory
Page-DirectoryPointer-Table
Directory-PointerEintrag
Page-Directory
Page-Table
Page-Frame
Page-Table-Eintr. Speicherobjekt Directory-Eintrag
CR3
4 Einträge
512 Einträge
512 Einträge
4 kByte
2MByte-Pages Lineare 32-Bit-Adresse 31 30 29 Direct.Pointer
21 20
16 15 Offset
Directory
Page-DirectoryPointer-Table
Directory-PointerEintrag
0
Page-Directory
Page-Frame
Speicherobjekt Directory-Eintrag
CR3
4 Einträge
512 Einträge
Abb. 12.7: Adresstransformationen für 4-KByte- und 2-MByte-Pages
2 MByte
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
433
Die Umsetzung einer linearen in eine physikalische Adresse im Falle der 2-MByte-Pages erfolgt in analoger Weise, nur fehlt hier die Transformation mit Hilfe einer Page Table. 2-MByte-Pages werden nämlich wie die 4-MByte-Pages ohne Adresserweiterung direkt vom Page Directory verwaltet. Auch hier steht ein Adressraum von 4 GByte innerhalb des 36-Bit-Adressraums mit 64 GByte zur Verfügung (vier Page Directory-Pointer-Table-Einträge * 512 Page Directory-Einträge * Page-Größe von 2 MByte). Jeder Page Directory-Pointer-Table beschreibt also in beiden Fällen maximal einen 4 GByte großen Abschnitt im physikalischen 36-Bit-Adressraum mit 64 GByte Speichervermögen. Um die 64 GByte auch voll ausnutzen zu können, müssen Sie daher mehrere Page Directory-PointerTables im Speicher bereithalten und den Eintrag im CR3-Register entsprechend ändern, um diese Tabellen zu adressieren. Eine weitere Möglichkeit ist die, die Einträge in einem einzigen Page Directory-Pointer-Table dynamisch zu verändern und den Zeiger im CR3-Register unverändert zu lassen.
12.3.4 Globale Pages Jedesmal, wenn das Steuerregister CR3 neu geladen wird (d.h., eine neue Page Directory-Basisadresse geschrieben wird), invalidiert der PentiumPro normalerweise die TLBs für die 4-KByteund 4-MByte-Pages (z.B. bei einem Task-Wechsel). Wenn eine Page aber von mehreren unabhängigen Tasks benutzt wird (was häufig bei Betriebssystemfunktionen oder dem Video-RAM der Fall ist), ist diese Invalidierung überflüssig, da nach der Invalidierung notwendigerweise zunächst ein TLB-Fehltreffer für die betreffende Page auftritt. Damit wird aber erneut derselbe Eintrag geladen, der bereits vorher im TLB vorhanden war. Es ist also günstig, bestimmte Pages als global zu definieren. Um das auszuführen, müssen Sie zunächst das GPE-Bit im Steuerregister CR4 setzen. Für 4-KByte- und 4-MByte-Pages oder 2-MByte-Pages bei aktiver Adresserweiterung unterscheidet sich die Definition einer Page als global etwas. In Abschnitt 12.3.3 ist durch Abbildung 12.6 bereits die Struktur der Page Directory- und Page Table-Einträge mit dem neuen G-Bit bei aktiver Adresserweiterung dargestellt.
: :
4-KByte-Pages: Setzen Sie das G-Bit sowohl im Page Directory- als auch im Page Table-Eintrag; 4-MByte- und 2-MByte-Pages: Setzen Sie das G-Bit im Page Directory-Eintrag.
12.4 Modellspezifische Register Das Konzept der modellspezifischen Register finden Sie auch beim PentiumPro. Wie die Zusammenfassung dieser Register in Tabelle 12.1 zeigt, sind gegenüber dem Pentium viele neue modellspezifische Register hinzugekommen und andere sind weggefallen. modellspezifisches Register
MSR-Nr.
Verwendung
Maschinen-Check-Adressregister Maschinen-Check-Typregister Zeitmarkenzähler APIC-Basis Einschaltkonfiguration BIOS-Aktualisierungs-Trigger
00h 01h 10h 1bh 2ah 79h
physikalische Adresse des fehlerverursachenden Buszyklus Typ des fehlerverursachenden Buszyklus Lesen/Schreiben des internen 64-Bit-Zählers Basis und Steuerwerte für den On-Chip-APIC Konfiguration verschiedener Hardware-Funktionen Aktualisierung von Flash-BIOS
Tab. 12.1: Modellspezifische Register des PentiumPro
Sandini Bib 434
Kapitel 12
modellspezifisches Register
MSR-Nr.
Verwendung
BIOS-Aktualisierungssignatur Zähler 0 Zähler 1 MTRR-Kapazität MCG-Kapazität MCG-Status
8bh c1h c2h feh 179h 17ah
MCG-Steuerung Event-Auswahl 1 Event-Auswahl 2 Debug-Steuerung Verzweigungsursprung Verzweigungsziel Interrupt-Ursprung Interrupt-Ziel Basis MTRR 0 Maske MTRR 0 Basis MTRR 1 Maske MTRR 1 Basis MTRR 2 Maske MTRR 2 Basis MTRR 3 Maske MTRR 3 Basis MTRR 4 Maske MTRR 4 Basis MTRR 5 Maske MTRR 5 Basis MTRR 6 Maske MTRR 6 Basis MTRR 7 Maske MTRR 7 Festbereichs-MTRR-64k/00000 Festbereichs-MTRR-16k/80000 Festbereichs-MTRR-16k/a0000 Festbereichs-MTRR-4k/c0000 Festbereichs-MTRR-4k/c8000 Festbereichs-MTRR-4k/d0000 Festbereichs-MTRR-4k/d8000 Festbereichs-MTRR-4k/e0000 Festbereichs-MTRR-4k/e8000 Festbereichs-MTRR-4k/f0000 Festbereichs-MTRR-4k/f8000 MTRR-Standardtyp MC-Steuerregister 0 MC-Statusregister 0 MC-Adressregister 0 MC-Steuerregister 1 MC-Statusregister 1
17bh 186h 187h 1d9h 1dbh 1dch 1ddh 1deh 200h 201h 202h 203h 204h 205h 206h 207h 208h 209h 20ah 20bh 20ch 20dh 20eh 20fh 250h 258h 259h 268h 269h 26ah 26bh 26ch 26dh 26eh 26fh 2ffh 400h 401h 402h 404h 405h
Aktualisierung von Flash-BIOS Performance Monitoring Performance Monitoring implementierte MTTR implementierte Machine-Check-Funktionen Status des PentiumPro nach einer Machine Check Exception Steuerung der Machine-Check-Funktionen Performance Monitoring Performance Monitoring Debugging EIP des letzten Verzweigungsursprungs EIP des letzten Verzweigungsziels EIP beim letzten Interrupt Vektor des letzten Interrupt Basis des Speicherbereichs 0 Maske des Speicherbereichs 0 Basis des Speicherbereichs 1 Maske des Speicherbereichs 1 Basis des Speicherbereichs 2 Maske des Speicherbereichs 2 Basis des Speicherbereichs 3 Maske des Speicherbereichs 3 Basis des Speicherbereichs 4 Maske des Speicherbereichs 4 Basis des Speicherbereichs 5 Maske des Speicherbereichs 5 Basis des Speicherbereichs 6 Maske des Speicherbereichs 6 Basis des Speicherbereichs 7 Maske des Speicherbereichs 7 Speicherbereich mit 64k bei 00000h Speicherbereich mit 64k bei 80000h Speicherbereich mit 16k bei a0000h Speicherbereich mit 4k bei c0000h Speicherbereich mit 4k bei c8000h Speicherbereich mit 4k bei d0000h Speicherbereich mit 4k bei d8000h Speicherbereich mit 4k bei e0000h Speicherbereich mit 4k bei e8000h Speicherbereich mit 4k bei f0000h Speicherbereich mit 4k bei f8000h Standardspeichertyp Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur
Tab. 12.1: Modellspezifische Register des PentiumPro (Forts.)
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
modellspezifisches Register
MSR-Nr.
Verwendung
MC-Adressregister 1 MC-Steuerregister 2 MC-Statusregister 2 MC-Adressregister 2 MC-Steuerregister 4 MC-Statusregister 4 MC-Adressregister 4 MC-Steuerregister 3 MC-Statusregister 3 MC-Adressregister 3
406h 408h 409h 40ah 40ch 40dh 40eh 410h 411h 412h
Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur Machine-Check-Architektur
435
Tab. 12.1: Modellspezifische Register des PentiumPro (Forts.)
In den folgenden Abschnitten werden einige dieser Registergruppen näher erläutert.
12.4.1 Die Bereichsregister für den Speichertyp (MTRR) Die Bereichsregister (Memory Type Range Registers) sind als modellspezifische Register implementiert (Zugriff über die Befehle RDMSR und WRMSR) und haben den Zweck, umfangreiche Informationen über den Systemspeicher möglichst »nahe« an den PentiumPro-Pipelines zur Verfügung zu stellen und dadurch auch die externe Systemsteuerung zu entlasten. Bisher hat nämlich in beschränktem Maße die Systemsteuerung z.B. dem Pentium über die Signale KEN (Cache Enable) oder WB/WT (Write-Back/Write-Through) bestimmte Eigenschaften des adressierten Speicherbereichs mitgeteilt. Die Register müssen bei einer Multiprozessorkonfiguration alle denselben Inhalt aufweisen, da sie ja denselben physikalischen Speicher ansprechen. Dadurch vereinfachen die Bereichsregister auch den Multiprozessorbetrieb. Speicherbereiche, die besonders behandelt werden müssen, sind üblicherweise Bildschirmspeicher – die nicht cachebar sind; sonst würden Sie auf dem Monitor ja nur bei einem Cache-Fehltreffer eine Änderung sehen – oder Memory-Mapped-Register, wie z.B. Steuer- oder Datenregister von Controllern; nur ein Cache-Fehltreffer würde zu einer erkennbaren Reaktion führen. Auch die spekulative oder Out-of-Order-Ausführung von Befehlen kann bei manchen Speicherbereichen zu Problemen führen. Beispielsweise dürfen Steuer- und Datenregister von Controllern nicht spekulativ angesprochen werden. (Die spekulative Ausführung von Controllerfunktionen würde das Programm entweder deutlich verzögern oder den Controller in einem undefinierten Zustand hinterlassen, wenn sich die Spekulation später als falsch erweist.) Solche Probleme lassen sich durch die Bereichsregister vermeiden. Eine ähnliche Funktion haben Steuerregister der verschiedenen Systemchipsätze, die verschiedene Adressbereiche z.B. für ein Caching sperren. Sie sind häufig mit einer erweiterten BIOS-Konfiguration ansprechbar. Insgesamt stehen 96 Bereichsregister zur Verfügung, und es sind fünf verschiedene Speichertypen definierbar. Die Signale ATTR3–ATTR0 kodieren im zweiten Takt der Request-Phase den Speichertyp, den der PentiumPro entsprechend seinen Bereichsregistereinträgen anspricht. Im Folgenden sind diese Speichertypen zusammen mit den Kodierungen ATTR3–ATTR0 kurz erläutert.
:
Nicht-cachebar (UC, uncacheable), ATTRx-Kodierung 0000b, MTRR-Typ 00h: Dieser Speicherbereich ist nicht cachebar, d.h. Daten aus diesem Bereich werden niemals in einen der PentiumPro-Caches übertragen. Eine weitere Besonderheit ist, dass die Zugriffe stets in der programmierten Reihenfolge ausgeführt werden, eine Umordnung zu Gunsten einer
Sandini Bib 436
:
:
: :
Kapitel 12
höheren Performance finden nicht statt. UC-Speicher ist vor allem für Memory-MappedRegister vorteilhaft; Write-Combining (WC), ATTRx-Kodierung 0100b, MTRR-Typ 01h: Auch dieser Speichertyp ist für ein Caching gesperrt, d.h. es werden niemals Line Fills ausgeführt. Dagegen können Schreibvorgänge in den so genannten Write-Combining-Puffer (WCB) akkumuliert (kombiniert) werden (z.B. mehrere Byte-Schreibvorgänge innerhalb eines ausgerichteten 8-ByteAbschnitts). Der eigentliche Schreibvorgang in den Hauptspeicher findet dann mit der vollen Breite des PentiumPro-Datenbusses statt (wobei die einzelnen Bytes des Busses über die Byte-Enable-Signale BE7–BE0 aktiviert werden); WC-Speicher unterliegt daher nur einer schwachen Schreibreihenfolge (Weak Write-Ordering). Er ist vor allem für Video-RAM geeignet, weil dort z.B. nur einzelne Attribut-Bytes, aber über einen großen Adressbereich modifiziert werden; Write-Through (WT), ATTRx-Kodierung 0101b, MTRR-Typ 04h: Bei diesem Speichertyp werden alle Schreibzugriffe unmittelbar zum Hauptspeicher durchgeschaltet. Nur Lesefehltreffer erzeugen ein Cache-Line Fill. Der PentiumPro aktualisiert für WT-Schreibvorgänge im Fall eines Treffers nur den entsprechenden Eintrag im L1-Daten-Cache. Gültige Lines im L1Code-Cache oder dem L2-Cache werden dagegen invalidiert; Schreibgeschützt (WP, write protected), ATTRx-Kodierung 0110b, MTRR-Typ 05h: Alle Lines in den Caches (L1 und L2) können nicht geschrieben werden. Lediglich im Hauptspeicher werden in diesem Fall die Werte aktualisiert. Dagegen arbeiten die Caches für Lesevorgänge normal, d.h. es werden Cache-Line-Fills ausgeführt; Write-Back (WB), ATTRx-Kodierung 0111b, MTRR-Typ 06h: Dieser Speichertyp erlaubt die höchste Performance. Er ist die Standardvorgabe beim PentiumPro. Alle Schreibvorgänge werden nur im Bedarfsfall (Ersetzung von modifizierten Cache-Lines, Abfragetreffer auf M-Lines, Cache Flushes) ausgeführt.
Die CPUID-Funktion gibt Auskunft, ob der Prozessor die Bereichsregister überhaupt unterstützt: Ist das Feature-Bit 12 im EDX-Register nach einem Aufruf von CPUID gesetzt, dann sind die MTRR implementiert. Weitere Informationen zu den Bereichsregistern sind im nur-lesbaren, modellspezifischen Register 0feh (MTRR-Kapazität) gespeichert. In Abbildung 12.8 sehen Sie dessen Aufbau.
reserviert
WC: FIX: VCNT:
0
11 10 9 8 7
res
16 15
FIX
31
WC
63
VCNT
Write-Combining-Typ 0=nicht unterstützt 1=unterstützt Festbereichsregister 0=nicht unterstützt 1=unterstützt Anzahl der Register für variable Bereiche (Variable Count)
Abb. 12.8: MTRR-Kapazitätsregister (Index 0feh)
Nur bei gesetztem WC-Bit unterstützt der Prozessor den Speichertyp Write-Combining; entsprechendes gilt für das FIX-Bit. Der 8-Bit-Wert VCNT gibt die Anzahl der implementierten MTRRRegisterpaare (Basis und Maske) an. Da der PentiumPro sowohl den Speichertyp Write-Combining als auch Festbereichsregister unterstützt und insgesamt acht Register für variable Bereiche implementiert, ist der im MTRR-Kapazitätsregister gespeicherte Wert stets gleich 0508h.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
437
Es stehen insgesamt acht 64-Bit-Festbereichsregister zur Verfügung. Sie sind in jeweils acht 8-BitAbschnitte unterteilt, wobei jeder 8-Bit-Abschnitt den Typ des zugeordneten festen Speicherbereichs definiert. In Abbildung 12.9 sehen Sie den Aufbau dieser Register. 64k/16k/4k-Festbereichsregister 63
56 55 Typ7
24 23 Typ3
Typ7–Typ0: Speichertyp 00h=UC 01h=WC
16 15 Typ2
04h=WT
Typ1
05h=WP
0
8 7 Typ0
06h=WB
sonst=reserviert
Abb. 12.9: 64-k/16-k/4-k-Festbereichsregister (Indizes 250h, 258h–259h, 268h–26fh)
Der PentiumPro implementiert ein Festbereichsregister für insgesamt acht 64-k-Speicherbereiche, zwei Festbereichsregister für insgesamt 16 16-k-Speicherbereiche und acht Festbereichsregister für insgesamt 64 4-k-Speicherbereiche. In Tabelle 12.2 sind diese Register zusammen mit den Speicherbereichen, die sie abdecken und den Registerindizes aufgeführt. Register
Index
Adressbereich für
64k
250h
70000h– 60000h– 50000h– 40000h– 30000h– 20000h– 10000h– 00000h– 7ffffh 6ffffh 5ffffh 4ffffh 3ffffh 2ffffh 1ffffh 0ffffh
16k
258h
9c000h– 98000h– 94000h– 90000h– 8c000h– 88000h– 84000h– 80000h– 9ffffh 9bfffh 97fffh 93fffh 8ffffh 8bfffh 87fffh 83fffh
16k
259h
bc000h– b8000h– b4000h– b0000h– ac000h– a8000h– a4000h– a0000h– bffffh bbfffh b7fffh b3fffh affffh abfffh a7fffh a3fffh
4k
268h
c7000h– c6000h– c5000h– c4000h– c3000h– c2000h– c1000h– c0000h– c7fffh c6fffh c5fffh c4fffh c3fffh c2fffh c1fffh c0fffh
4k
269h
cf000h– ce000h– cd000h– cc000h– cb000h– ca000h– c9000h– c8000h– cffffh cefffh cdfffh ccfffh cbfffh cafffh c9fffh c8fffh
4k
26ah
d7000h– d6000h– d5000h– d4000h– d3000h– d2000h– d1000h– d0000h– d7fffh d6fffh d5fffh d4fffh d3fffh d2fffh d1fffh d0fffh
4k
26bh
df000h– de000h– dd000h– dc000h– db000h– da000h– d9000h– d8000h– dffffh defffh ddfffh dcfffh dbfffh dafffh d9fffh d8fffh
4k
26ch
e7000h– e6000h– e5000h– e4000h– e3000h– e2000h– e1000h– e0000h– e7fffh e6fffh e5fffh e4fffh e3fffh e2fffh e1fffh e0fffh
4k
26dh
ef000h– ee000h– ed000h– ec000h– eb000h– ea000h– e9000h– e8000h– effffh eefffh edfffh ecfffh ebfffh eafffh e9fffh e8fffh
4k
26eh
f7000h– f6000h– f5000h– f4000h– f3000h– f2000h– f1000h– f0000h– f7fffh f6fffh f5fffh f4fffh f3fffh f2fffh f1fffh f0fffh
4k
26fh
ff000h– fe000h– fd000h– fc000h– fb000h– fa000h– f9000h– f8000h– fffffh fefffh fdfffh fcfffh fbfffh fafffh f9fffh f8fffh
Typ7
Typ6
Typ5
Typ4
Typ3
Typ2
Typ1
Typ0
Tab. 12.2: Die Festbereichsregister des PentiumPro
Beispiel: Der 64-KByte-Adressbereich 80000h–8ffffh (vier 16-KByte-Bereiche) soll als WriteThrough (Typ 04h) definiert werden, der 64-KByte-Adressbereich 90000h–9ffffh (vier 16-KByteBereiche) als Write-Back (Typ 06h); daher muss das modellspezifische Register mit dem Index 258h mit dem 64-Bit-Wert 0606060604040404h geladen werden:
Sandini Bib 438
Kapitel 12
MOV eax, 04040404h MOV edx, 06060606h MOV ecx, 0258h WRMSR
; ; ; ;
niederwertiges Doppelwort nach eax laden höherwertiges Doppelwort nach edx laden Registerindex nach ecx laden Wert in modellspezifisches Register schreiben
Dieses Beispiel betrifft den Fall, dass sich zwischen 80000h und 8ffffh der Video-RAM einer Hercules-Karte befindet und zwischen 90000h und 9ffffh ein Upper-Memory-Block liegt. Die Verwendung der Register für variable Bereiche ist etwas komplizierter. Pro Speicherbereich sind zwei Register notwendig: ein Basisregister und ein Maskenregister. Der PentiumPro implementiert insgesamt acht Paare dieser modellspezifischen Register (siehe Tabelle 12.1). In Abbildung 12.10 sehen Sie deren Strukturen. Ein Registerpaar ist nur dann aktiviert und definiert die Zugriffsart auf den zugehörigen Speicherberich, wenn das glt-Bit im Maskenregister gesetzt ist. Für einen Wert 0 hat das entsprechende Registerpaar keine Auswirkungen. Der Eintrag »physikalische Basisadresse A35–A12« legt die 24 höherwertigen Adressbits des Speicherbereichs fest. Die fehlenden zwölf niederwertigen Adressbits A11–A0 werden automatisch mit dem Wert 000h ergänzt, d.h. alle Speicherbereiche liegen an 4-KByte-Grenzen. Beachten Sie, dass alle Speicherbereiche eine Größe von 4-KByte*2n (n=0, 1, 2, ...) haben und dann auch an entsprechenden 4-KByte-, 8-KByte-, 16-KByteGrenzen usw. ausgerichtet sein müssen. Von erheblicher Bedeutung ist der 24-Bit-Eintrag »Maske M35–M12«. Auch hier werden die zwölf niederwertigen Adressbits mit 000h ergänzt. Der Maskenwert definiert zusammen mit der physikalischen Basisadresse den Speicherbereich über folgende Verknüpfung: Speicheradresse UND Maske = Basis UND Maske Das bedeutet, dass eine Speicheradresse nur dann dem vom Registerpaar festgelegten Speichertyp unterliegt, wenn eine logische UND-Verknüpfung dieser Speicheradresse mit dem Maskenwert dasselbe Ergebnis liefert wie eine UND-Verknüpfung der Basisadresse mit dem Maskenwert. Intern berechnet der PentiumPro die beiden Seiten der Gleichung und vergleicht die Werte der linken und rechten Seite. Stimmen sie überein, erfolgt ein Zugriff entsprechend dem TypEintrag, sonst ein Zugriff entsprechend dem Standardzugriffstyp (der über das Standardtypregister definiert wird; siehe unten). MTRR-Basisregister 63
35
32 31
res
16 15
12 11
0
8 7
reserviert
physikalische Basisadresse A35..A12
Typ
MTRR-Maskenregister res
35
32 31
16 15 Maske M35..M12
MTRR-Basisregister: Typ: Standardspeichertyp 00h=UC 01h=WC
04h=WT
MTRR-Maskenregister: glt: Gültigkeit 0=Registerpaar deaktiviert
05h=WP
0
12 11 10
glt
63
06h=WB
1=Registerpaar aktiviert
Abb. 12.10: MTRR-Basisregister und MTRR-Maskenregister (Indizes 200h bis 20fh)
reserviert
sonst=reserviert
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
439
Beispiel: Der Adressbereich zwischen 0f00000h und 0ffffffh (d.h. zwischen 15M und 16M-1) soll durch das Registerpaar 1 (Indizes 202h=Basis, 203h=Maske) als Write-Through konfiguriert werden; der Maskenwert ist hier gleich 0ffff00h: MOV eax, 00f00004h MOV edx, 00000000h MOV ecx, 0202h WRMSR MOV eax, fff00800h MOV edx, 0000000fh MOV ecx, 0203h WRMSR
;zuerst Basisregister schreiben: ;niederwertiges Doppelwort nach eax laden: Typ=04h, ;untere drei Adressbytes abgeschnitten ;höherwertiges Doppelwort nach edx laden ;Registerindex nach ecx laden ;Wert in Basisregister schreiben ;nun Maskenregister schreiben: ;niederwertiges Doppelwort nach eax laden: glt=01b, ;untere drei Maskenbytes abgeschnitten ;höherwertiges Doppelwort nach edx laden ;Registerindex nach ecx laden ;Wert in Maskenregister schreiben
Die UND-Verknüpfung von Basis- und Maskenwert (erweitert um die drei abgeschnittenen Bytes 000h) liefert 000f00000h UND ffff00000h = 000f00000; denselben Wert 000f00000 liefert auch die UND-Verknüfung eines jeden Wertes zwischen 000f00000 und 000ffffff mit dem vollen 36-Bit-Maskenwert ffff00000. Für alle nicht von den Bereichsregistern für feste oder variable Speicherbereiche betroffenen Speicherabschnitte legt das Standardtypregister (Index 2ffh) den Standardspeichertyp fest. In Abbildung 12.11 sehen dessen Struktur. 16 15 reserviert
0
12 11 10 9 8 7
FE
31
E/D
63
res
E/D: MTRR-Aktivierung/Deaktivierung (Enable/Disable) 0=MTRR deaktiviert 1=MTRR aktiviert FE: Festbereichsregister-Aktivierung 0=deaktiviert 1=aktiviert Typ: Standardspeichertyp 00h=UC 01h=WC 04h=WT 05h=WP 06h=WB
Typ
sonst=reserviert
Abb. 12.11: Standardtypregister (Index 2ffh)
Um die Bereichsregister (fest und variabel) überhaupt zu aktivieren, muss das E/D-Bit gesetzt sein. Ist das nicht der Fall, behandelt der PentiumPro den gesamten Speicher entsprechend dem im Feld »Typ« festgelegten Standardspeichertyp (Intel empfiehlt hierfür den Typ UC). Dem E/DBit nachgeordnet ist das FE-Bit zur Aktivierung der Festbereichsregister. Nur wenn E/D gesetzt ist, hat eine Änderung des FE-Wertes eine Auswirkung. Durch das Setzen von FE werden die Festbereichsregister aktiviert. Wenn die von einem Festbereichsregister und einem Register für variable Bereiche definierten Speicherbereiche überlappen, behandelt der PentiumPro diesen Speicherbereich entsprechend den Definitionen im Festbereichsregister. Insgesamt gibt es also drei Register oder Registergruppen, die die Speicherbereiche festlegen und folgende Prioritäten haben:
: : :
Festbereichsregister (höchste Priorität) Register für variable Bereiche Standardtypregister (niedrigste Priorität)
Nach einem Reset sind zunächst alle MTRR für feste und variable Speicherbereiche deaktiviert, d.h. der gesamte Speicher wird als nicht-cachebar behandelt. Anschließend initialisiert typi-
Sandini Bib 440
Kapitel 12
scherweise das BIOS die MTRR entsprechend der vorhandenen Speicher- und I/O-Struktur. In einem Multiprozessorsystem sollten alle Prozessoren identische MTRR aufweisen.
12.4.2 Die Konfigurationsregister Ein wichtiges modellspezifisches Register des PentiumPro ist das so genannte Einschaltkonfigurationsregister (Power-On Configuration Register) mit dem Registerindex 2ah. In Abbildung 12.12 sehen Sie dessen Struktur. Beachten Sie, dass manche Bits nur gelesen werden können. Sie teilen den Signalpegel am zugeordneten Pin zum Zeitpunkt des Resets mit und betreffen daher Konfigurationen, die durch Hardware-Signale gesteuert werden.
DEB
1 0
REC DEC
BEV
AEV
BEIV res
TRI
BIV
AEE BIST
BIE BEE
IOQ
RESV
AP1
AP0 FRC
ARB1 ARB0 res res
CLK1 CLK0
CLK2
reserviert
LPS res
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
LPS:
Stromsparmodus (Low-Power Standby) 0=deaktiviert 1=aktiviert CLK2–CLK0: Frequenzverhältnis interner CPU-Takt/BCLK (nur-lesbar) 000b=2 001b=4 010b=3 100b=5/2 110b=7/2 ARB1, ARB0: Arbitrierungs-ID (nur-lesbar) 00b: ID=0 01b: ID=1 10b: ID=2 11b: ID=3 AP1, AP0: APIC-Cluster-ID (nur-lesbar) 00b=3 01b=2 10b=1 11b=0 FRC: Functional Redundancy Checking (nur-lesbar) 0=deaktiviert 1=aktiviert RESV: Reset-Vektor (nur-lesbar) 0=0fffffff0h 1=0ffff0h IOQ: Tiefe der In-Order-Queue (nur-lesbar) 0=8 1=1 BIE: BINIT-Erkennung (nur-lesbar) 0=deaktiviert 1=aktiviert BEE: BERR-Erkennung (nur-lesbar) 0=deaktiviert 1=aktiviert AEE: AERR-Erkennung (nur-lesbar) 0=deaktiviert 1=aktiviert BIST: Selbsttest oder BIST (nur-lesbar) 0=nicht ausgeführt 1=ausgeführt TRI: Tristate-Modus (nur-lesbar) 0=kein Tristate-Modus 1=Tristate-Modus aktiv BIV: BINIT-Verhalten 0=BINIT-Treiber deaktiviert 1=BINIT-Treiber aktiviert BEIV: BERR-Verhalten für interne Initiatorfehler 0=BERR-Treiber deaktiviert 1=BERR-Treiber aktiviert BEV: BERR-Verhalten für Initiatorbusfehler 0=BERR-Treiber deaktiviert 1=BERR-Treiber aktiviert AEV: AERR-Verhalten 0=AERR-Treiber deaktiviert 1=AERR-Treiber aktiviert REC: Response-Fehlerprüfung (Response Error Checking) 0=deaktiviert 1=aktiviert DEC: Datenfehlerprüfung (Data Error Checking) 0=deaktiviert 1=aktiviert DEB: Debug-Modus 0=deaktiviert 1=aktiviert Abb. 12.12: Einschaltkonfigurationsregister
Das LPS-Bit steuert die Deaktivierung bzw. Weiterleitung des Prozessortaktsignals an die verschiedenen Einheiten des CPU-Kerns: Ist der Wert gleich 1, dann wird im AutoHalt- und StopGrant-Zustand das Taktsignal dem CPU-Kern nicht mehr zugeführt, d.h. die Stromaufnahme ist gering. Ein Wert 0 bedeutet, dass der Kern weiter das Taktsignal empfängt, entsprechend höher ist auch der Stromverbrauch. Die drei Bits CLK2–CLK0 geben Auskunft über das Frequenzverhältnis zwischen internem CPU-Takt und externem Bustakt BCLK. Da dieses Verhältnis nach
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
441
einem Reset von den Signalen LINT1, LINT0, IGNNE und A20M festgelegt wird, können die drei Bits nur gelesen werden. Ähnliches gilt für die beiden Arbitrierungs-ID-Bits ARB1 und ARB0. Auch sie sind nur lesbar, weil der Identifizierungswert bereits bei einem Reset über die Signale BR0–BR3 und A5 festgelegt wird. Auch die beiden Bits AP1 und AP0 für die APIC-Cluster-ID sind nur lesbar, die zugehörigen Reset-Signale sind A12 und A11. Ist am Ende eines Resets das Signal A5 aktiv, dann arbeitet der PentiumPro im FRC-Modus (Functional Redundancy Checking) und das nur-lesbare Bit FRC hat den Wert 1. Der Pegel des Signals A6 legt die Startadresse fest, bei der der PentiumPro nach einem Reset mit der Programmausführung beginnt. Der Standardwert des RESV-Bit ist 0 und entspricht dem normalen Reset-Vektor, d.h. der Adresse 4G-16. Die Tiefe der In-Order-Queue (d.h. die Anzahl der maximal auslösbaren Bustransaktionen) wird ebenfalls durch ein Hardware-Signal (A7) im Verlauf eines Resets festgelegt und kann durch das nur-lesbare IOQ-Bit ermittelt werden. Ob die Erkennung der drei Fehlersignale BINIT, BERR und AERR (durch die Signale A10, A9 bzw. A8 beim Reset) aktiviert worden ist, sehen Sie an den Werten der zugeordneten und nur-lesbaren Bits BIE, BEE und AEE. Werte gleich 1 zeigen an, dass der PentiumPro diese Fehlersignale erfasst und entsprechend verarbeitet. Der Wert des Bits BIST (Built-In Self-Test) zeigt an, ob ein Selbsttest ausgeführt worden ist. Das Bit TRI ist gesetzt, wenn der PentiumPro im Tristate-Testmodus läuft. Die restlichen Bits können gelesen und geschrieben werden; sie steuern also das Verhalten des PentiumPro softwaremäßig und stellen den Steuerabschnitt (zusammen mit dem LPS-Bit) dieses Registers dar. Über das BIV-Bit können Sie den Treiber für das BINIT-Signal aktivieren, damit der PentiumPro bei einem schweren Busfehler dieses Initialisierungssignal auch tatsächlich ausgibt. Ähnliche Aufgaben haben auch die Bits BEIV, BEV und AEV: Werte von 1 bedeuten, dass die entsprechenden Treiber aktiviert werden und bei internen Initiatorfehlern (BEIV), Initiatorbusfehler (BEV) bzw. Adressparitätsfehlern (AEV) die zugehörigen Fehlersignale erzeugen. Zusätzlich werden auch die Response-Signale RS2–RS0 durch eine Paritätsfunktion abgesichert, wenn Sie das REC-Bit setzen. Die Datenprüfung aktivieren Sie mit Hilfe des DEC-Bits (Data Error Checking = Datenfehlerprüfung).
12.4.3 Die Machine-Check-Architektur In gewissem Maße wurden bereits beim Pentium Machine-Check-Funktionen implementiert, die Sie wie beim PentiumPro mit dem Bit CR4.MCE im Steuerregister CR4 aktivieren. Zu den Funktionen gehören die Machine Check Exception 18, die auftretende Fehler mitteilt und im Maschinen-Check-Adressregister die physikalische Adresse sowie im Maschinen-Check-Typregister die Art des aktiven Buszyklus speichert. Der Pentium überwacht nur, ob bei Lesevorgängen Paritätsfehler auftreten oder ob ein Buszyklus nicht korrekt abgeschlossen wird. Dagegen ermöglicht die im PentiumPro implementierte Machine-Check-Architektur eine umfangreiche und ständige Überwachung sehr vieler interner Baugruppen. Im Falle eines Fehlers kann eine Exception erzeugt werden, um die Fehlfunktion dem BIOS oder dem System mitzuteilen. Die Machine-Check-Architektur ist für ausfallsichere Computersysteme gedacht, die Datenverluste minimieren sollen.
12.4.4 Performance-Monitoring Wie schon der Pentium ermöglicht auch der PentiumPro ein Performance-Monitoring, um prozessorbedingte Engpässe bei der Ausführung von Programmen zu ermitteln. Es sind zwei 40-BitZähler vorhanden, die als modellspezifische Register (Indizes c1h und c2h) implementiert sind. Sie können die Zähler über den Befehl RDPMC oder einen direkten Lesezugriff mit RDMSR auf die entsprechenden modellspezifischen Register auslesen. In Tabelle 12.3 finden Sie alle Events, die vom PentiumPro gezählt werden können. Wenn Sie diese Events mit denen des Pentiums nach
Sandini Bib 442
Kapitel 12
Tabelle 10.13 vergleichen, erkennen Sie deutlich, dass es sich beim Performance-Monitoring um eine sehr modellspezifische Funktion handelt. Nicht einmal die Indizes der Zähler stimmen überein. Kodierung
Event
gezählt wird
03h 04h 05h 06h 10h 11h 12h 13h 14h 21h 22h 23h 24h 25h 26h 27h 28h 29h 2ah 2eh 43h 45h 46h 47h 48h 60h 61h 62h 63h 64h 65h 66h 67h 68h 69h 6ah 6bh 6ch 6dh 6eh 6fh 70h 79h 7ah 7bh 7eh
Blöcke des Speicherpuffers Leerungszyklen des Speicherpuffers fehlausgerichtete Datenreferenzen Segmentregister-Ladevorgänge ausgeführte FPU-Operationen von Mikrocode behandelte FPU-Exceptions Multiplikationen Divisionen Busy-Zyklen des Dividierers L2-Adress-Strobes Bus-Busy Bus-Busy für Datentransfer L2-Cache->CPU belegte Lines im L2-Cache M-Lines im L2-Cache aus L2-Cache entfernte Lines aus L2-Cache entfernte M-Lines Befehlslesen aus L2-Cache Datenlesen aus L2-Cache Datenschreiben in L2-Cache L2-Cache-Zugriffe Speicherzugriffe belegte Lines im Daten-Cache M-Lines im L1-Daten-Cache aus dem L1-Daten-Cache entfernte M-Lines Fehltreffer im L1-Daten-Cache anstehende Bus-Requests BNR aktiv DRDY aktiv LOCK aktiv BCLK-Zyklen während CPU Daten empfängt Burst-Lesevorgänge Lesetransaktionen Write-Back-Transaktionen Befehlslese-Transaktionen Invalidierungstransaktionen Teil-Schreibtransaktionen1) Teiltransaktionen1) I/O-Transaktionen Deferred-Transaktionen Burst-Transaktionen Speichertransaktionen alle Transaktionen CPU nicht angehalten HIT aktiv HITM aktiv Snoop-Hemmungen des Busses
Anzahl Dauer Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Dauer Anzahl Dauer Dauer Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Vorgang Anzahl Anzahl Anzahl Dauer Anzahl Dauer Dauer Dauer Dauer Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Anzahl Dauer Dauer Dauer Dauer
Tab. 12.3: Events und zugeordnete Kodierungen
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
443
Kodierung
Event
gezählt wird
80h 81h 85h 86h 87h a2h c0h c1h c2h c4h c5h c6h c7h c8h c9h cah d0h d2h e0h e2h e4h
Befehlslesevorgänge Fehltreffer im L1-Befehls-Cache Fehltreffer für Befehls-TLB Hemmungen der Befehlslese-Pipeline Hemmungen des Befehlslängen-Decoders Resourcen-Hemmungen abgeschlossene Befehle abgeschlossene FPU-Operationen abgeschlossene µ-Ops abgeschlossene Verzweigungsbefehle abgeschl. falsch vorherges. Verzweigungen maskierte Interrupts (in Prozessorzyklen) maskierte Interrupts während aktivem INTR Hardware-Interrupts abgeschlossene Taken-Branches abgeschl. falsch vorhergesagte Taken-Branches decodierte Befehle Teilhemmungen decodierte Verzweigungsbefehle Verzweigungen mit Fehltreffern im BTB irrtümliche Verzweigungen
Anzahl Anzahl Anzahl Dauer Dauer Dauer Anzahl Anzahl Anzahl Anzahl Anzahl Dauer Dauer Anzahl Anzahl Anzahl Anzahl Dauer Anzahl Anzahl Anzahl
1)
Teil: nur ein Teil des 64-Bit-Datenbusses wird benutzt
Tab. 12.3: Events und zugeordnete Kodierungen (Forts.)
Die beiden Zähler arbeiten unabhängig voneinander und können jeweils einen beliebigen Event nach Tabelle 12.3 zählen. Die Festlegung des zu erfassenden Events und das genaue Zählverhalten erfolgt über die beiden den Zählern zugeordneten Event-Auswahlregister. In Abbildung 12.13 sehen Sie die Struktur dieser modellspezifischen Register mit den Indizes 186h bzw. 187h.
OS
E
USR
PC
INT
EN
Zählermaske
res
24 23 22 21 20 19 18 17 16 15
INV
31
0
8 7 Einheitenmaske
Event-Auswahl
Zählermaske: Zählverhalten INV: Invertierung des Zählverhaltens 0=nein 1=ja EN: Zähleraktivierung (Enable; nur Event-Auswahlregister 0) 0=Zähler deaktiviert 1=Zähler aktiviert INT: Interrupt bei Zählerüberlauf 0=deaktiviert 1=aktiviert PC: Pin-Steuerung (Pin Control) 0=Signal bei Zählvorgang 1=Signal bei Zählerüberlauf E: Flankentriggerung 0=deaktiviert 1=aktiviert OS: Betriebssystem-Flag 0=Zählung für CPL=0, 1, 2, 3 1=Zählung nur für CPL=0 USR: User-Flag 0=Zählung für CPL=0, 1, 2, 3 1=Zählung nur für CPL=1, 2, 3 Einheitenmaske: Modifizierung des Zählverhaltens Event-Auswahl: Event-Code nach Tabelle 12.3 Abb. 12.13: Event-Auswahlregister (modellspezifische Register 186h und 187h)
Sandini Bib 444
Kapitel 12
Die Zählermaske steuert das Zählverhalten des entsprechenden Zählers 0 oder 1 für Mehrfachvorgänge pro internem Taktzyklus. Bei einem Wert gleich 0 wird der Zählwert mit jedem Taktzyklus um die Anzahl der aufgetretenen Events erhöht. Beachten Sie, dass durch die Superskalararchitektur des PentiumPro manche Events (z.B. c0h für abgeschlossene Befehle) mehrfach pro Taktzyklus auftreten. Ist der Wert der Zählermaske größer als 0, wird der Zählwert nur dann um eins erhöht, wenn die Anzahl der ausgewählten Events pro Taktzyklus mindestens gleich dem Wert der Zählermaske ist (Verknüpfung größer/gleich). Dadurch können Sie beispielsweise ermitteln, in welchem Ausmaß die Superskalararchitektur tatsächlich ausgenutzt wird. Durch Setzen des INV-Bits kehren Sie die Größer/gleich-Verknüpfung in kleiner/gleich um, d.h. der Zählwert wird nun um eins erhöht, wenn die Anzahl der programmierten Events pro Taktzyklus höchstens gleich der programmierten Zählermaske ist. Lediglich im Event-Auswahlregister 0 (Index 186h) ist das EN-Bit vorhanden. Es steuert die Aktivierung der Zähler. Ist INT gesetzt, dann erzeugt der PentiumPro bei einem Zählerüberlauf eine Hardware-Interrupt-Anforderung. Wenn das PC-Bit der Pin-Steuerung gesetzt ist, schaltet der dem Zähler zugeordnete Anschluss BPM0 oder BPM1 das Signal um, wenn der Zähler überläuft. Ist PC gelöscht, dann schaltet der entsprechende BPMxAnschluss sein Signal jedesmal um, wenn ein Event gezählt wird. Ein gesetztes E-Bit führt dazu, dass alle Änderungen von Events gezählt werden, die durch die restlichen Flags definiert sind und nicht die Events selbst. Ist OS gesetzt, dann zählt der PentiumPro einen Event nur dann, wenn CPL=0 ist, d.h. der Prozessor mit der höchsten Privilegierungsstufe läuft und Systemroutinen ausführt. Ähnliches gilt für das USR-Bit: Der PentiumPro zählt einen Event nur dann, wenn der Prozessor auf User-Ebene (CPL=1, 2, 3) läuft und Anwendungsprogramme oder systemnahe Routinen ausführt. Für manche Events können Sie eine Einheitenmaske definieren, die dann z.B. im Fall von Events, die die Caches betreffen, zusätzlich noch den notwendigen MESI-Zustand angeben, damit ein Zählimpuls auftritt. Schließlich legt der Eintrag »Event-Auswahl« den Event fest, der gezählt werden soll. Die Event-Codes finden Sie in Tabelle 12.3. Einen Zähler starten Sie, indem Sie mit WRMSR die Steuerinformation in das zugehörige EventAuswahlregister schreiben. Unmittelbar danach beginnt der so initialisierte Zähler mit dem Zählen. Sie können den Zähler wieder anhalten, indem Sie alle Bits im Event-Auswahlregister löschen (auf 0 setzen), oder das EN-Bit im Event-Auswahlregister 0 löschen. Beachten Sie, dass die erste Möglichkeit die Zähler individuell anhält, während das zweite Verfahren beide Zähler gleichzeitig stoppt.
12.4.5 Debug-Unterstützung durch modellspezifische Register Neben den üblichen Debug-Registern DR7–DR0 unterstützt der PentiumPro das Debugging auch durch modellspezifische Register. Sie ermöglichen die Rückverfolgung von Interrupts, Exceptions und Verzweigungen, die z.B. zu Task-Wechseln führen können. Dadurch ist ein wirksameres Debuggen möglich, wenn Fehler nur im Zusammenhang mit Kontextwechseln oder Betriebssystemfunktionen auftreten. Beachten Sie, dass der PentiumPro bei aktiven DebugErweiterungen (Bit CR4.DE) die beiden Register DR4 und DR5 als reservierte Register behandelt und gegen einen Zugriff sperrt. Ohne aktive Erweiterungen werden die Register auf die Register DR6 und DR7 abgebildet, d.h. es findet ein Alias statt und ein Zugriff auf die Registerpaare DR4/DR6 bzw. DR5/DR7 hat dieselben Auswirkungen. Die fünf neuen modellspezifischen Register, die mit dem PentiumPro zur Unterstützung der Debug-Funktion eingeführt wurden, finden Sie in Tabelle 12.4, während die anderen denen des Pentiums entsprechen.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
modellspezifisches Register
MSR-Nr.
Debug-Steuerregister Verzweigungsursprung Verzweigungsziel Interrupt-Ursprung Interrupt-Ziel
1d9h 1dbh 1dch 1ddh 1deh
445
Tab. 12.4: Modellspezifische Register zur Unterstützung der Debug-Funktion
Mit dem Debug-Steuerregister (Index 1d9h) können Sie die Funktionen der modellspezifischen Debug-Register konfigurieren. In Abbildung 12.14 sehen Sie den Aufbau dieses Registers.
LBR
PB0
1 0
BTF
PB2
PB1
reserviert
7 6 5 4 3 2
TR
16 15
PB3
31
TR:
Trace-Sonderzyklen 0=deaktiviert 1=aktiviert PB3–PB0: Performance-Monitoring/Breakpoint-Pins 0=PBx-Pins zeigen Events an 1=PBx-Pins zeigen Breakpoints an BTF: Einzelschritt bei Verzweigungen (Branch Trace Flag) 0=Einzelschritt für Befehle 1=Einzelschritt für Verzweigungen LBR: Last Branch/Interrupt/Exception 0=keine Aufzeichnung 1=Aufzeichnung Abb. 12.14: Debug-Steuerregister (modellspezifisches Register 1d9h)
Wenn das TR-Bit gesetzt ist, sind Trace-Sonderzyklen aktiviert. Das bedeutet, dass der PentiumPro bei einer Verzweigung, einer Exception oder einem Interrupt Ursprungs- und Zieladresse auf den Bus ausgibt. Externe Debug-Logiken können diese Adressen zur Verfolgung der Programmausführung verwenden. Beachten Sie, dass die Einträge in den anderen modellspezifischen Debug-Registern (Indizes 1dbh–1deh) ungültig sind. Die vier Bits PB3–PB0 steuern das Verhalten der Performance-Monitoring/Breakpoint-Pins PB3–PB0. Ein gesetztes PBx-Bit konfiguriert den zugehörigen Pin als Breakpoint-Pin; der PentiumPro gibt dann bei einer HaltepunktÜbereinstimmung an diesem Anschluss einen Impuls aus. Ist PBx gelöscht, dann zeigt der zugehörige Anschluss Performance-Monitoring-Events an. Wenn Sie das Bit BTF setzen, modifiziert der PentiumPro die Bedeutung des T-Flags im EFlag-Register: Bei gesetztem T-Bit hält der Prozessor nach jeder Verzweigung die Programmausführung an und löst eine Exception 1 (Einzelschritt) aus. Bei gelöschtem BTF- und gesetztem T-Bit wird die Programmausführung nach jedem Befehl angehalten. Schließlich weist ein gesetztes LBR-Bit die Debug-Logik des PentiumPro an, Ursprungs- und Zieladressen für alle Verzweigungen und Exceptions/Interrupts in den zugeordneten vier modellspezifischen Registern zu speichern. Über den RDMSR-Befehl kann der Debugger dann die Adressen lesen und auf diese Weise die Verzweigung oder den Interrupt bzw. die Exception zurückverfolgen.
12.5 Reset und Einschaltkonfiguration Wie bereits der Pentium kann der PentiumPro neben einem gewöhnlichen Reset über ein RESETSignal auch eine Initialisierung über das INIT-Signal (Anschluss C11) ausführen, bei dem der PentiumPro in den Real Mode zurückversetzt wird. Außerdem werden in bekannter Weise die Segment- und Offsetregister initialisiert sowie die TLBs und der BTB invalidiert. Im Gegensatz zu einem Reset werden aber die internen Caches, Schreibpuffer, Modellregister und Gleitkom-
Sandini Bib 446
Kapitel 12
maregister nicht zurückgesetzt, sondern behalten ihre Werte bei. Die Initialisierungswerte für einen Reset und eine Initialisierung sehen Sie in Tabelle 12.5. Reset
Initialisierung
ALU/Integer-Register EAX, EBX, ECX EDX EBP, ESP, ESI, EDI EIP CS DS, ES, FS, GS, SS EFlag CR0 CR2, CR3, CR4 IDTR, TR GDTR, IDTR DR0–DR3 DR6 DR7 alle anderen
Wert 00000000h Identifik.1) 00000000h 0000fff0h f000h2) 0000h3) 00000002h 60000010h 00000000h 00000000h5) 00000000h5) 00000000h ffff0ff0h 00000400h uuuuuuuuh
Wert 00000000h Identifik.1) 00000000h 0000fff0h f000h2) 0000h3) 00000002h
Gleitkommaregister Steuerwort Statuswort Tag-Wort FIP, FEA, FOP FCS, FDS FSTACK Caches Cache-TLBs BTB, SDC
0040h 0000h 5555h 00000000h 0000h 0000000000h uuuuuuuuuuu uuuuuuuuuuu uuuuuuuuuuu
vvvvh vvvvh vvvvh vvvvvvvvh vvvvh vvvvvvvvvvh vvvvvvvvvvv uuuuuuuuuuu uuuuuuuuuuu
4)
00000000h 00000000h5) 00000000h6) 00000000h ffff0ff0h 00000400h uuuuuuuuh
u: nicht definiert v: unverändert 1)
CPU-Identifizierung 00000600h + Modell ) Basisadresse = ffff0000h, Limit = ffffh (Segmentdeskriptor-Cache-Register), Zugriffsrechte = 00000093h 3) Basisadresse = 00000000h, Limit = ffffh (Segmentdeskriptor-Cache-Register), Zugriffsrechte = 00000093h 4) CD, CW unverändert, Bit4=1, alle anderen=0 5 ) Selektor = 0000h, Basisadresse = 00000000h, Limit = ffffh, Zugriffsrechte = 00000082h 6) Basisadresse = 00000000h, Limit = ffffh 2
Tab. 12.5: PentiumPro-Registerinhalte nach einem Reset oder einer Initialisierung
Der umfangreichere Pentium-Reset wird durch ein aktives Signal am RESET-Anschluss ausgelöst. Kehrt das Signal anschließend auf einen hohen Pegel zurück, tastet der Pentium verschiedene Signalpegel ab, um verschiedene Konfigurationen zu ermitteln. Andere Konfigurationen können durch die Konfigurationsregister bestimmt werden. Tabelle 12.6 gibt eine kurze Zusammenfassung der möglichen Optionen.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
447
Option Konfiguriert durch Hardware Tristate-Testmodus Selbsttest BIST Erkennen von AERR Erkennen von BERR Erkennen von BINIT Tiefe der In-Order-Queue (1 oder 8) Reset-Vektor nach Einschalten
Signal FLUSH aktiv INIT aktiv A8 A9 A10 A7 1) A6 2)
Functional Redundancy Checking Functional Redundancy Checking ID für Busarbitrierung Taktfrequenzverhältnis
A5 A5 BR0–BR3, A5 4) LINT1, LINT0, IGNNE, A20M 5)
Konfiguriert durch Software Prüfung von Datenbusfehlern Parität für Response-Signale RS2–RS0 Verhalten von AERR Verhalten von BERR für Initiatorbusfehler Verhalten von BERR für Targetbusfehler Verhalten von BERR für interne Initiatorfehler Verhalten von BINIT APIC-Modus
Signal deaktiviert deaktiviert deaktiviert deaktiviert deaktiviert deaktiviert deaktiviert aktiviert
1)
A7=0: 1; A7=1: 8 A6=0=0ffff0h; A6=1=0fffffff0h 3) 00b: APIC ID=3; 01b: APIC ID=2; 10b: APIC ID=1; 11b: APIC ID=0 4) 01111: ID=0, 11100: ID=1, 11011: ID=2, 10111: ID=3, 10001: ID=0, 11100: ID=0, 11010: ID=2, 10110: ID=2 5) CPU-Kern/BCLK: 0000b=2, 0001b=4, 0010b=3, 0100b=5/2, 0110b=7/2, 1111b=2, sonst=reserviert 2)
Tab. 12.6: Mögliche Konfigurationsoptionen
12.6 Der Bus des PentiumPro Durch die Integration des L2-Caches im PentiumPro-Gehäuse selbst und die Unterstützung von bis zu vier parallel arbeitenden PentiumPro hat der Bus eine erhebliche Änderung gegenüber dem Pentium oder seinen Vorgängern erfahren. Die wichtigste darunter ist die Implementierung eines Arbitrierungsschemas, das mehr an einen peripheren Bus (wie z.B. PCI) erinnert als an einen CPU-Bus. Erwähnen möchte ich an dieser Stelle noch, dass der PentiumPro noch zwei weitere unabhängige Busse aufweist, nämlich für den Boundary-Scan-Test und den APIC-Bus.
12.6.1 Busphasen Da die einzelnen Vorgänge auf dem PentiumPro-Bus wesentlich stärker entkoppelt sind als bei allen Vorgängern – die Gründe dafür sind die Unterstützung eines Multiprozessorbetriebs und die dynamische Ausführung der µ-Ops – spricht man im Zusammenhang mit den verschiedenen Busaktivitäten von Transaktionen. Eine Transaktion umfasst alle Vorgänge auf dem Bus mit
Sandini Bib 448
Kapitel 12
den zugehörigen Signalen, die zu einer Busanforderung gehören (also z.B. Datenlesen, ein bestimmter Sonderzyklus usw.). Jede Bustransaktion kann bis zu sechs Phasen aufweisen; eine ähnliche Unterteilung eines Buszyklus in verschiedene Phasen finden Sie z.B. beim SCSI-Bus. In Abbildung 12.15 sehen Sie die zeitliche Lage der verschiedenen Phasen. Arbitrierung Möchte ein Agent eine Transaktion ausführen, muss er zunächst die Kontrolle über den Bus erlangen. Das geschieht über eine Arbitrierungsphase. Hat der Agent bereits die Kontrolle, entfällt diese Phase. Die Steuersignale für diese Phase sind BREQ3–BREQ0 (entsprechend den Anschlüssen BR3–BR0), BPRI, BNR und LOCK. 1
2
3
4
5
6
7
8
9
10
11
12+x
13+x
14+x
15+x
16+x
BCLK Transaktion 1
Arbitrierung
Transaktion 2
Request Arbitrierung
Transaktion 3
Error
Response Daten
Snoop
Request Arbitrierung
Error
Snoop
Response Daten
Request
Abb. 12.15: Die zeitliche Lage der verschiedenen Busphasen
Request (Anforderung) Diese Phase umfasst zwei BCLK-Zyklen. Der Prozessor gibt alle notwendigen Anforderungs- und Adresssignale aus, die die Transaktion kennzeichnen. ADS, REQ4–REQ0, A35–A3, AP1–AP0, ATTR7–ATTR0, DID7–DID0, BE7–BE0, EXF4–EXF0 und RP sind die kennzeichnenden Signale dieser Phase. Die Aktivierung von ADS legt den Beginn einer Request-Phase fest. Error (Fehler) Die Error-Phase beginnt drei BCLK-Zyklen nach dem Anfang der Request-Phase und zeigt Paritätsfehler während der Request-Phase an. Tritt ein Fehler auf (Signal AERR aktiv), wird die laufende Transaktion abgebrochen. Neben dieser Fehlerphase kann der PentiumPro Fehler auch durch andere Signale anzeigen: BINIT, BERR, IERR und FRCERR. Sie haben mit der Fehlerphase nichts zu tun. Snoop (Abfrage) Die Snoop-Phase zeigt das Ergebnis von Abfragezyklen in den System-Caches an (Treffer auf Cache-Lines/modifizierte Cache-Lines) und beginnt vier Taktzyklen nach dem Anfang der Request-Phase. Die Snoop-Signale sind HIT, HITM und DEFER. Response (Antwort) Diese Phase zeigt das Ergebnis der Transaktion an, d.h. ob sie erfolgreich war oder mit einem Fehler abgeschlossen wird. Gültige Antworten sind: normale Daten, implizites Write-Back, keine Daten, Hardware-Fehler, Deferred und Wiederholung. Beachten Sie, dass das zeitliche Auftreten der Response- und Datenphasen von der Geschwindigkeit des angesprochenen Subsystems abhängt. Es können mehrere Wartezyklen auftreten; das ist in Abbildung 12.15 durch den Zusatz »+x« angedeutet. Die Steuersignale sind RS2–RS0, RSP und TRDY.
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
449
Daten Die Datenphase kann bereits mit der Response-Phase überlappen, d.h. Response- und Datenphase fallen zusammen. In dieser Phase werden die Daten einer Transaktion übergeben. Dabei ist es nicht unbedingt notwendig, dass der Initiator einer Transaktion die Datenphase anfordert. Das kann auch durch einen anderen Agenten geschehen, der die Transaktion verfolgt (z.B. bei einem Treffer auf eine modifizierte Cache-Line in einem anderen Cache). I/O-Zugriffe erfolgen stets mit einer maximalen Breite von 32 Bit, d.h. BE7–BE4 sind in der Request-Phase stets gleich 1. Diese Phase umfasst die Signale DRDY, DBSY, DEP7–DEP0 und (natürlich) D63–D0. Nicht jede Transaktion muss alle Phasen aufweisen; eine Transaktion ohne Datentransfer benötigt z.B. keine Datenphase. Außerdem können verschiedene Phasen verschiedener Transaktionen überlappen, in Abbildung 12.15 z.B. die Error-Phase der ersten Transaktion mit der RequestPhase der zweiten Transaktion. Die Abbildung 12.15 zeigt deutlich, dass der PentiumPro in sehr starkem Maße ein solches Bus-Pipelining ausführt. Die Busschnittstelle des PentiumPro ist intelligent genug, solche Verzahnungen zu behandeln. Sie können den PentiumPro so konfigurieren, dass er eine oder acht ausstehende, d.h. noch nicht abgeschlossene Transaktionen verwalten kann, die von anderen Busagenten und nicht notwendigerweise von ihm selbst ausgelöst worden sind. Die Anzahl der eigenen ausstehenden Transaktionen ist auf vier begrenzt – mehr wäre im Hinblick auf die damit in Verbindung stehenden Hemmungen der Befehls-Pipeline auch unsinnig. Sie sehen, dass der PentiumPro nicht nur ein sehr tiefes Befehls-Pipelining, sondern auch ein komplexes Transaktions-Pipeling ausführt. Alle Bustransaktionen werden in allen (!) Busagenten in einer so genannten In-Order-Queue genau mitverfolgt. Jeder Agent hat seine eigene Queue, aber mit identischen Informationen. Nur so ist es möglich, dass alle Agenten beispielsweise wissen, dass in Abbildung 12.15 die im Zyklus 13+x auf den Bus gelegten Daten zur Transaktion 1 gehören. Der Bus des PentiumPro scheint auf den ersten Blick sehr langsam zu sein (zwischen der Arbitrierung und der Response-Phase liegen 11 Buszyklen). Bedenken Sie aber, dass der L2-Cache ja bereits im selben Gehäuse integriert ist und mit bis zu 200 MHz läuft, sodass der externe Bus des PentiumPro im Allgemeinen nur noch den DRAM-Hauptspeicher oder noch langsamere I/OEinheiten anspricht. Immerhin wird der Bus auch extern mit normalerweise 66 MHz getaktet. Ferner kann eine Datenphase auch aus einem Burst von vier Datenübertragungen (insgesamt 64 Byte) bestehen, die unmittelbar aufeinanderfolgen. Wenn man auch noch davon ausgeht, dass bei einem Ein-Prozessor-System, wie es für die allermeisten PCs üblich ist (d.h. nur ein einziger PentiumPro ist im System vorhanden), entfällt zusätzlich die Arbitrierungsphase, und alle Transaktionen beginnen dann unmittelbar mit der Request-Phase. Das spart noch einmal drei BCLKZyklen ein.
12.6.2 Busarbitrierung Das Arbitrierungsprotokoll des PentiumPro sieht zwei Klassen von Agenten vor: symmetrische und Prioritätsagenten. Symmetrische Agenten haben eine identische Priorität, Prioritätsagenten erlangen – wie der Name schon sagt – bei der Arbitrierung Priorität über die symmetrischen Agenten. Der Bus des PentiumPro unterstützt maximal fünf Agenten, davon vier symmetrische, die über die Signale BREQ3–BREQ0 eine Arbitrierung ausführen sowie einen Prioritätsagenten, dem das Signal BPRI zugeordnet ist. Im Multiprozessorbetrieb werden maximal vier PentiumPros unterstützt; sie bilden die symmetrischen Agenten. Typischerweise ist noch ein Prioritätsagent vorhanden, der vom Speichersubsystem oder einem I/O-Agenten gebildet wird.
Sandini Bib 450
Kapitel 12
Den maximal vier symmetrischen Agenten ist jeweils eine eindeutige Identifizierung zwischen 0 und 3 zugeordnet; sie besitzen eine entsprechende 2-Bit-ID. Nach einem Reset lautet die Prioritätsreihenfolge 0->1->2->3->0->1->..., d.h. der symmetrische Agent 0 kann zuerst auf den Bus zugreifen. Alle symmetrischen Agenten »merken« sich denjenigen Agenten, der als letzter die Kontrolle über den Bus hatte (Businhaber oder Bus Owner); dazu ist eine 2-Bit-RID (rotierende ID) implementiert, die auf den Agenten mit der im Moment niedrigsten Priorität zeigt. Das bedeutet, dass bei der nächsten Arbitrierung derjenige Agent gewinnt, der in der Prioritätsreihenfolge als erster nach dem letzten Businhaber kommt – falls nicht der Prioritätsagent ebenfalls den Bus anfordert. Jeder Agent darf pro Anforderung nur eine Transaktion durchführen; anschließend muss er die Kontrolle wieder abgeben, damit auch die anderen Agenten zum Zug kommen. Die physikalische Verschaltung der Anforderungssignale und -anschlüsse sehen Sie in Abbildung 12.16.
Prioritätsagent
BR3
BPRI BR1
BR2
BR0
BR3
BPRI BR2
BR1
BR0
BR3
BPRI BR1
BR3
BR2
PentiumPro (Agent 3)
BR0
PentiumPro (Agent 2)
BR1
PentiumPro (Agent 1)
BR2
PentiumPro (Agent 0) BR0
BPRI
BPRI
BREQ0
RESET
BREQ1 BREQ2 BREQ3
Abb. 12.16: Verschaltung der Anforderungssignale und -anschlüsse.
Beachten Sie den Unterschied zwischen den Bus-Request-Anschlüssen BR3–BR0 und den BusRequest-Signalen BREQ3–BREQ0. Die Bus-Request-Anschlüsse BR3–BR0 sind in zyklischer Weise miteinander verbunden, d.h. beispielsweise BR0 mit BR3–BR2–BR1 und BR1 mit BR0–BR3–BR2 usw. Von diesen Anschlüssen ist lediglich BR0 als Ausgangspin implementiert, die anderen drei BR3–BR1 empfangen die Bus-Request-Signale BREQ3–BREQ0. Der BR0-Anschluss des Agenten 0 gibt dabei das Bus-Request-Signal BREQ0 aus, der BR0-Anschluss des Agenten 1 das BusRequest-Signal BREQ1 usw. Das Bus-Request-Signal BPRI des Prioritätsagenten wirkt direkt auf die entsprechenden Anschlüsse BPRI der vier symmetrischen Agenten (die PentiumPro-CPUs). Während eines Resets aktiviert die Systemsteuerung das Signal BREQ0, damit der Agent 0 das System bootet und die anderen Agenten für den Multiprozessorbetrieb initialisiert. In Abbildung 12.17 sehen Sie ein Beispiel für einen typischen Arbitrierungsvorgang. Zunächst (t1) sind alle Request-Signale BREQ0–BREQ3 und BPRI inaktiv, d.h. kein Agent fordert den Bus an. Die rotierende ID hat den Wert 1, d.h. die Prioritätsreihenfolge lautet 2->3->0->1. In
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
451
t2 aktivieren die Agenten 2 und 3 ihre Request-Signale. Auf Grund der Prioritätsreihenfolge gewinnt Agent 2 die Kontrolle über den Bus und führt ab t4 eine Transaktion (-2-) aus. In t4 deaktiviert der Agent 2 sein Request-Signal BREQ2, um die Steuerung abzugeben; die rotierende ID hat jetzt den Wert 2. Agent 3 hält sein Request-Signal weiter aktiv und übernimmt die Steuerung des Busses. In t7 beginnt Agent 3 mit seiner Transaktion und deaktiviert gleichzeitig sein Request-Signal. Die rotierende ID hat den Wert 3 und die Prioritätsreihenfolge lautet nun 0->1-> 2->3. In t5 hat Agent 2 erneut sein Request-Signal BREQ2 aktiviert, um eine weitere Transaktion auszuführen. Diese Anforderung wird aber ignoriert, bis Agent 3 in t7 sein Request-Signal BREQ3 deaktiviert und ein neuer Arbitrierungszyklus beginnen kann. Da auch Agent 0 in t7 den Bus anfordert, muss Agent 2 zunächst warten, weil Agent 0 im Moment eine höhere Priorität besitzt. Der Wert der rotierenden ID ändert sich auf 0, die Prioritätsreihenfolge lautet 1->2->3->0. Nachdem Agent 0 in t10 sein Request-Signal deaktiviert hat, kann t2 erneut die Kontrolle über den Bus erlangen, da Agent 1 keine Anforderung ausgibt. BPRI ist während der ganzen Zeit inaktiv. Eine Aktivierung würde die Steuerung sofort an den Prioritätsagenten übergeben, sobald der gegenwärtige Businhaber sein Request-Signal deaktiviert. Beachten Sie, dass die Übergabe der Bussteuerung an den Prioritätsagenten den Wert der rotierenden ID und damit die Prioritätsreihenfolge der symmetrischen Agenten nicht beeinflusst. Sie müssen lediglich warten, bis der Prioritätsagent die Steuerung wieder abgibt. t1
t2
t3
t4
t5
t6
t7
t8
t9
t10
t11
t12
t13
t14
t15
t16
2
2
BCLK BREQ0 BREQ1 BREQ2 BREQ3 BPRI ADS 2
3
0
2
Transaktion rort. ID
1
1
1
2
2
3
3
3
0
0
0
2
2
2
Abb. 12.17: Typischer Arbitrierungsvorgang
Das Arbitrierungsprotokoll des PentiumPro sieht auch ein so genanntes Bus-Parking vor. Damit ist gemeint, dass ein Agent, der als letzter die Kontrolle über den Bus hatte, keine erneute Busarbitrierung ausführen muss, wenn er eine Transaktion ausführen möchte, aber kein weiterer Agent die Steuerung übernehmen möchte. Dadurch werden unnötige Arbitrierungen und somit Verzögerungen vermieden. Außerdem ist so keine gesonderte Behandlung einer Ein-ProzessorKonfiguration notwendig. Der einzige PentiumPro übernimmt lediglich unmittelbar nach einem Reset über einen einmaligen Arbitrierungszyklus die Steuerung und greift anschließend stets direkt auf den Bus zu. Es gibt noch zwei wichtige Signale, die die Arbitrierung beeinflussen: LOCK und BNR. Ein aktives LOCK-Signal zeigt an, dass der PentiumPro einen atomischen Vorgang ausführt und dabei nicht unterbrochen werden darf, obwohl der Vorgang aus mehreren Transaktionen zusammengesetzt sein kann (beispielsweise die Aktualisierung von Page Table-Einträgen, die einen ReadModify-Write-Vorgang auslösen). Das Block-Next-Request-Signal BNR zeigt an, dass mindestens ein Agent im System vorhanden ist, der im Moment keine weiteren Transaktionen annehmen oder verwalten kann (beispielsweise ist die Transaktions-Queue dieses Agenten voll).
Sandini Bib 452
Kapitel 12
12.6.3 Deferred-Transaktionen Der Bus des PentiumPro implementiert so genannte Deferred-Transaktionen. Dadurch können z.B. langsame Peripherieeinheiten eine Transaktion verzögert (engl. deferred) ausführen, ohne anschließende Transaktionen zu bremsen. Beispielsweise sind Zugriffe auf einen Hauptspeicher mit EDO-RAM (Zugriffszeit 20 ns) oder gar einen L3-Cache (Zugriffszeit 12-15 ns) ganz erheblich schneller als I/O-Zyklen (Verzögerung bis zu 200 ns). Wenn alle Transaktionen in der ausgelösten Reihenfolge – entsprechend der Reihenfolge in der In-Order-Queue, d.h. dem Auftreten der Requests – auch abgeschlossen werden müssten, könnte eine solche sehr langsame Transaktion die Ausführung des ganzen Programms erheblich bremsen. Das Deferring erlaubt die Umordnung der Transaktionen entsprechend der Geschwindigkeit der angesprochenen Subsysteme. Später ausgelöste Transaktionen werden (z.B. mit der Übergabe von Schreibdaten) abgeschlossen, bevor die früher ausgelöste Deferred-Transaktion beendet ist (z.B. durch die Übergabe des Wertes aus einem I/O-Statusregister). Die für Deferred-Transaktionen entscheidenden Signale sind DEN (Defer Enable), DEFER und DID7–DID0 (Defer-ID). Erlaubt der die Transaktion auslösende Agent (z.B. der PentiumPro), dass die Transaktion verzögert abgeschlossen werden kann, dann gibt er ein DEN-Signal mit niedrigem Pegel aus. Soll die Transaktion tatsächlich verzögert abgeschlossen werden, muss der adressierte Agent in der Snoop-Phase das Signal DEFER aktivieren und in der folgenden Response-Phase den Status Deferred zurückgeben. Daraufhin wird die betreffende Transaktion aus der In-Order-Queue entfernt. Da die Transaktion damit nicht mehr anhand ihrer Stelle in dieser Queue identifiziert werden kann, übernehmen die acht Deferred-ID-Signale DID7–DID0 die Identifizierung der Transaktion, d.h. auslösender und adressierter Agent »merken« sich die Deferred-Transaktion mit Hilfe dieser Deferred-ID-Signale. DID7–DID0 werden bereits in der Request-Phase erzeugt. DID7 identifiziert dabei den Agententyp, DID6–DID4 den Agenten selbst sowie DID3–DID0 die Transaktion. Symmetrische Agenten (wie der PentiumPro) haben den Agententyp 0, Prioritätsagenten den Typ 1. Pro Agent können also maximal 16 Deferred-Transaktionen anhängig sein, außerdem lassen sich maximal 16 (DID7, DID6–DID4) Agenten verwalten. Beachten Sie aber, dass der PentiumPro maximal vier ausstehende Deferred-Aktionen verwaltet.
12.6.4 Bus-Pipelining und PentiumPro-Bursts Cache-Line-Fills und Write-Backs werden natürlich auch vom PentiumPro in der Form von Bursts ausgeführt. Sie übertragen stets 64 Byte und nutzen die volle Breite des Datenbusses aus. Die Burst-Reihenfolge ist dieselbe wie beim Pentium (siehe Tabelle 12.7). erste Adresse
Burst
0h 8h 10h 18h
0h->8h->10h->18h 8h->0h->18h->10h 10h->18h->0h->8h 18h->10h->8h->0h
Tab. 12.7: Burst-Reihenfolge
Beachten Sie aber, dass beim PentiumPro im Gegensatz zum Pentium – der immer einen SchreibBurst 0h->8h->10h->18h ausführt – diese Burst-Reihenfolge auch für Burst-Schreibvorgänge gilt. Durch die Entkopplung der einzelnen Transaktionsphasen ist in viel höherem Maße ein BusPipelining möglich als beim Pentium oder den Vorgängern. Der zeitliche Abstand zwischen dem Auslösen einer Transaktion (Request) und deren Abschluss (Response) kann wesentlich größer
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
453
sein. Dadurch sind nicht nur zwei, sondern mehrere (bis zu vier ausstehende) Transaktionen verzahnt. Abbildung 12.18 zeigt dieses Pipelining im Fall von Burst-Lesetransfers. Das Beispiel betrifft Transaktionen nur eines Agenten, daher ist keine Arbitrierungsphase vorhanden. Das ist aber der typische Fall eines Ein-Prozessor-Systems, wie Sie es in den meisten PCs finden. Die Transaktionen sind fortlaufend nummeriert, um die Zuordnung der verschiedenen Signale zu den jeweiligen Transaktionen darzustellen. Als Daten-Ready-Signal ist beim dargestellten Lesetransfer nur DRDY (Data Ready) von Bedeutung, nicht jedoch TRDY (Target Ready). t1
t2
t3
t4
t5
t6
t7
t8
t9
t10
t11
t12
t13
t14
t15
t16
BCLK ADS
1
2
3
4
5
RequestPhase
1
2
3
4
5
2
1
4
3
HIT DBSY
1 1
3
2 1
1
1
2
2
2
2
3
3
D63-D0 DRDY RS2-RS0
1
2
3
Abb. 12.18: Bus-Pipelining mit Burst-Datentransfer
12.7 Multiprozessorbetrieb Die Zielrichtung des PentiumPro-Busses ist deutlich zu erkennen: Multiprocessing. Das Konzept ist ähnlich wie beim Pentium implementiert und unterstützt maximal vier Prozessoren, die dann nach außen wie ein einziger PentiumPro erscheinen. Auch hier muss der Betriebssystem-Kernel für einen Multiprozessorbetrieb ausgelegt sein, im Allgemeinen der Hardware Abstraction Layer (HAL), also Windows NT/2000 oder auch Linux. Windows 9x bleibt hier außen vor, denn es kennt keinen Multiprozessorbetrieb. Die Hardware-Unterstützung des Multiprocessings erfolgt über das MESI-Protokoll, LockedBuszyklen und den On-Chip-APIC (Advanced Programmable Interrupt Controller). Beachten Sie, dass beim PentiumPro kein dedizierter Bus zwischen den einzelnen Prozessoren vorhanden ist (lediglich der APIC-Bus verbindet die APICs der verschiedenen Prozessoren). Beim Systemstart oder nach einem Reset läuft zunächst nur der primäre PentiumPro (ID=0) hoch und prüft, ob weitere Prozessoren vorhanden sind. Ist das der Fall, aktiviert er anschließend die anderen PentiumPro in geordneter Weise. Für einen Multiprozessorbetrieb müssen die On-ChipAPICs aktiviert sein. Sie bilden die lokalen Interrupt-Einheiten und sind mit einem externen I/OAPIC verbunden. Er bildet die Schnittstelle zur Peripherie, die Hardware-Interrupts auslöst und verteilt die externen Interrupts entsprechend einem programmierten Interrupt-Schema auf die OnChip-APICs. Weitere Details finden Sie in Kapitel 10 im Zusammenhang mit dem Pentium. Die Grundkonzeption des Multiprozessorbetriebs von Pentium und PentiumPro sind sehr ähnlich.
Sandini Bib 454
Kapitel 12
12.8 CPUID Der CPUID-Befehl dient zur Bestimmung des CPU-Typs. Um die Identifizierung auszuführen, müssen Sie zunächst den Wert 0 in das EAX-Register laden und anschließend den Befehl CPUID auslösen. Der Prozessor gibt dann in EAX die höchste Identifizierungsebene zurück, die er unterstützt (PentiumPro: 2). Die drei Register EBX, EDX und ECX enthalten in dieser Reihenfolge eine 12-Byte-Identifizierung in ASCII-Form: »GenuineIntel«. Wenn Sie anschließend das EAX-Register mit einem Wert 01h oder 02h laden und den CPUID-Befehl nochmals auslösen, übergibt der Pentium im EAX-Register einen Identifizierungswert und im Register EDX zusätzliche Informationen darüber, welche besonderen Funktionen unterstützt werden. In Tabelle 12.8 finden Sie die Aufruf- und Rückgabewerte von CPUID für den PentiumPro.
Register
Aufrufwert
Rückgabewert
EAX EBX ECX EDX
00h
02h »Genu« »ntel« »ineI«
EAX EBX ECX EDX
01h
Identifizierungswert1) reserviert (=0) reserviert (=0) Feature Flags2)
EAX EBX ECX EDX
02h
Cache/TLB-Deskriptor3) Cache/TLB-Deskriptor4) Cache/TLB-Deskriptor4) Cache/TLB-Deskriptor4)
1)
Bits 31...14: Bits 13...12: Bits 11...8: Bits 7...4: Bits 3...0:
reserviert (=00h) Prozessortyp (PentiumPro: 00b, PentiumPro Overdrive: 01b) Familie (0110b=06h für PentiumPro) Modell (PentiumPro: 0001b=01h, PentiumPro Overdrive: 0011b=03h) Version (Stepping)
2)
Bits 31...16: Bit 15: Bit 14: Bit 13: Bit 12: Bit 11...10: Bit 9: Bit 8: Bit 7: Bit 6: Bit 5: Bit 4: Bit 3: Bit 2: Bit 1: Bit 0:
reserviert (=00h) CMOVcc/FCMOVcc (1=implementiert, 0=nicht implementiert) Machine-Check-Global-Architektur (1=implementiert, 0=nicht implementiert) Paging-Global-Erweiterung (1=implementiert, 0=nicht implementiert) Speichertyp-Bereichsregister MTRR (1=implementiert, 0=nicht implementiert) reserviert (=00b) On-Chip-APIC (1=implementiert, 0=nicht implementiert) CMPXCHG8B (1=implementiert, 0=nicht implementiert) Machine Check Exception (1=implementiert, 0=nicht implementiert) Erweiterung der physikalischen Adresse auf 36 Bit (1=implementiert, 0=nicht implementiert) modellspezifische Register (1=implementiert, 0=nicht implementiert) Zeitmarkenzähler (1=implementiert, 0=nicht implementiert) 4-MByte-Pages (1=implementiert, 0=nicht implementiert) I/O Breakpoints (1=implementiert, 0=nicht implementiert) Erweiterungen für den Virtual-8086-Modus (1=implementiert, 0=nicht implementiert) On-Chip-Gleitkommaeinheit (1=On-Chip FPU , 0=keine On-Chip FPU)
Tab. 12.8: Aufruf- und Rückgabewerte von CPUID
Sandini Bib Reine 32-Bit-Technologie – Der PentiumPro
Register
Aufrufwert
3)
Byte 1...3:
niederwertiges Registerbyte, ... Byte 3 höchstwertiges Registerbyte erforderliche Anzahl der CPUID-Befehle mit EAX-Aufrufwert 02h, um alle Cache/TLB-Informationen zu erhalten (PentiumPro: 01h) Deskriptorwert (siehe 5))
4)
Byte 0: Byte 0...3:
niederwertiges Registerbyte, ... Byte 3 höchstwertiges Registerbyte Deskriptorwert (siehe 5))
5)
Beachte: ein vorhandener Deskriptorwert bedeutet die Implementierung der entsprechenden Hardware Deskriptorwert implementierter Cache/TLB 00h kein Deskriptor (Nulldeskriptor) 01h Befehls-TLB: 4KByte Page, 4-Wege-set-assoziativ, 64 Einträge 02h Befehls-TLB: 4MByte Page, 4-Wege-set-assoziativ, 4 Einträge 03h Daten-TLB: 4KByte Page, 4-Wege-set-assoziativ, 64 Einträge 04h Daten-TLB: 4MByte Page, 4-Wege-set-assoziativ, 8 Einträge 06h Befehls-Cache: 8KByte, 4-Wege-set-assoziativ, Line-Größe=32 Byte 0ah Daten-Cache: 8KByte, 2-Wege-set-assoziativ, Line-Größe=32 Byte 41h Unified Cache: 128KByte, 4-Wege-set-assoziativ, Line-Größe=32 Byte 42h Unified Cache: 256KByte, 4-Wege-set-assoziativ, Line-Größe=32 Byte 43h Unified Cache: 512KByte, 4-Wege-set-assoziativ, Line-Größe=32 Byte
Byte 0: Byte 0:
Rückgabewert
Tab. 12.8: Aufruf- und Rückgabewerte von CPUID (Forts.)
455
Sandini Bib
Sandini Bib
13
Pentium II, Pentium III und Celeron
Der Pentium II stellt eine Weiterentwicklung des PentiumPro dar und implementiert die MMXTechnologie, die bereits vom Pentium her bekannt ist. Etwas verkürzt ausgedrückt, könnte man die Gleichung Pentium II = PentiumPro + MMX aufstellen. Aus dem Pentium II sind dann diverse Ableger (Celeron) und Weiterentwicklungen (Pentium III) entstanden, die in diesem Kapitel ebenfalls behandelt werden und zusammen auch als P6-Familie oder CPUs nach der P6-Architektur bezeichnet werden. Zunächst jedoch zum Pentium II.
13.1 Pentium II Mit dem Pentium II hat sich Intel vom Sockelkonzept (Sockel 7 für Pentiums, Sockel 8 für den PentiumPro) zunächst verabschiedet und ein völlig neues Gehäuse präsentiert, das in einen Slot 1 eingesetzt wird. Statt der bisher gewohnten Pins sind nun alle Kontakte in Form von zwei Kontaktreihen ähnlich wie bei PCI-Karten gebildet. Jeder vierte Kontakt der A-Reihe liegt auf Masse, um eine gegenseitige Störung der Signale zu vermeiden. Auch der interne Aufbau des Gehäuses hat sich geändert. War beim PentiumPro noch ein speziell gefertigter SRAM-Die vorhanden, der mit der vollen CPU-Core-Frequenz läuft, werden beim Pentium II handelsübliche Burst-SRAM-Chips und ein getrennter Tag-RAM für die Implementierung des L2-Caches verwendet. Auch der Pentium II spricht den L2-Cache über einen vom Systembus getrennten Cache-Bus an. Im Gegensatz zum PentiumPro läuft der L2-Cache aber nur mit der halben Core-Frequenz. Dies ermöglicht, die Core-Frequenz des Pentium II anzuheben und trotzdem noch handelsübliche, preiswerte SRAM-Chips verwenden zu können. Als kleiner Ausgleich wird der Pentium II mit einem 512-KByte L2-Cache versehen. Im Folgenden eine kurze Aufstellung der wichtigsten Kenngrößen des Pentium II:
: : : : :
Single-Edge-Contact-Gehäuse, SEC L1-Code- und Daten-Caches mit je 16 KByte (PPro: je 8 KByte) L2-Cache mit handelsüblichen BSRAM-Bausteinen, 512 KByte Kapazität, halbe Core-Frequenz verbesserte 16-Bit-Leistung durch Segment Register Caches MMX-Technologie
Zur Versorgung des L2-Cache sind eigene Kontakte vorgesehen, da der Cache mit 3,3 V, der Prozessorkern aber mit 2,8 V betrieben wird. Die Rückseite des Gehäuses wird von einer Aluminiumplatte gebildet, die die Wärme von Prozessor- und L2-Cache-Die abführt; immerhin hat der Pentium II bei 300 MHz eine Wärmeentwicklung von mehr als 40 W. Natürlich ist auch der Pentium II für einen Multiprozessorbetrieb vorgesehen, allerdings können nur maximal zwei Pentium II zusammenspielen. Die XEON-CPUs (im Grunde Pentium II- oder auch Pentium III-Ableger mit größerem L2-Cache, z.B. 2 MByte) sind stattdessen für Multiprozessorsysteme mit maximal vier (Pentium II-XEON) oder sogar acht (Pentium III-XEON) Prozessoren vorgesehen.
Sandini Bib 458
Kapitel 13
Ob in Ihrem PC ein Pentium II arbeitet, können Sie nach einem Reset oder mit dem Befehl CPUID feststellen; der Pentium II gehört dabei zur Familie 06h:
: :
Sind die Modellbits 7...4 im EDX-Register nach einem Reset auf den Wert 03h gesetzt, handelt es sich um einen Pentium II. Ist der Wert der Modellbits 7...4 im EAX-Register nach Ausführen von CPUID gleich 04h, arbeitet ein Pentium II.
AMD mit dem K6 und Cyrix mit dem 6x86MX haben ebenfalls leistungsfähige Prozessoren mit MMX-Technologie im Programm, die dem Pentium II bis Ende 1997 deutlich Konkurrenz gemacht haben. Ihnen fehlt lediglich der (direkt) an den Prozessorkern angekoppelte L2-Cache, wobei dieses Manko durch andere Mittel ausgeglichen wird, wie in Kapitel 11 erläutert wird.
13.1.1 Anschlüsse und Signale Das Slot-Konzept ist relativ aufwändig und damit in der Herstellung auch weit teurer als ein System mit einem Sockel. Man denke dabei an die Befestigung der Cartridge und den recht großen Kühlkörper, der ebenfalls mechanisch sicher zu befestigen sein muss. Nicht ohne Grund hat Intel nach kurzer Zeit auch den Celeron (siehe Kapitel 13.2) auf den Markt gebracht und die Cartridge sowie das mechanische Drumherum für den Pentium II und den Nachfolger Pentium III des Öfteren geändert. Dies hat zur Folge, dass scheinbar geeignete Mainboards schon aus mechanischen Gründen die eine oder andere Slot 1-CPU nicht ohne Probleme aufnehmen können, wenn man einmal von elektrischen Problemen, wie der korrekten Spannungsversorgung (CPU-Core), oder auch von softwaretechnischen Problemen, wie der BIOS-Unterstützung für die jeweilige Slot 1-CPU, absieht.
Abb. 13.1: Das Layout und die Kontaktnummerierung für Slot 1-CPUs
Die Signale des Slot 1 haben sich durch diese Anpassungen jedoch nicht (wesentlich) verändert und entsprechen in der Mehrzahl genau denen, die beim PentiumPro erläutert sind, so dass ich hier auf eine gesonderte Beschreibung verzichte und im Folgenden nur die Signale erläutere, die weggefallen bzw. neu hinzugekommen sind oder deren Funktionen sich gegenüber dem PentiumPro geändert haben.
Sandini Bib Pentium II, Pentium III und Celeron
459
Pin Nr.
Bezeichnung
Pin Nr.
Bezeichnung
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 A46 A47 A48 A49
Vcc_Vtt GND VCC_VTT IERR A20M GND FERR IGNNE TDI GND TD0 PWRGOOD TESTHI GND THERMTRIP Reserviert LINT0/INTR GND PICD0 PREQ BP3 GND BPM0 BINIT DEP0 GND DEP1 DEP3 DEP5 GND DEP6 D61 D55 GND D60 D53 D57 GND D46 D49 D51 GND D42 D45 D39 GND Reserviert D43 D37
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 B46 B47 B48 B49
EMI FLUSH SMI INIT VCC_Vtt STPCLK TCK SLP Vcc_Vtt TMS TRST Reserviert VCC_Core THERMDP THERMDN LINT1/NMI Vcc_Core PICCLK BP2 Reserviert BSEL PICD0 PRDY BPM1 Vcc_Core DEP2 DEP4 DEP7 Vcc_Core D62 D58 D63 Vcc_Core D56 D50 D54 Vcc_Core D59 D48 D52 EMI D41 D47 D44 Vcc_Core D36 D40 D34 Vcc_Core
Tab. 13.1: Die Signalbelegung des Slot 1
Sandini Bib 460
Kapitel 13
Pin Nr.
Bezeichnung
Pin Nr.
Bezeichnung
A50 A51 A52 A53 A54 A55 A56 A57 A58 A59 A60 A61 A62 A63 A64 A65 A66 A67 A68 A69 A70 A71 A72 A73 A74 A75 A76 A77 A78 A79 A80 A81 A82 A83 A84 A85 A86 A87 A88 A89 A90 A91 A92 A93 A94 A95 A96 A97 A98
GND D33 D35 D31 GND D30 D27 D24 GND D23 D21 D16 GND D13 D11 D10 GND D14 D9 D8 GND D5 D3 D1 GND BCLK BR0 BERR GND A33 A34 A30 GND A31 A27 A22 GND A23 Reserviert A19 GND A18 A16 A13 GND A14 A10 A5 GND
B50 B51 B52 B53 B54 B55 B56 B57 B58 B59 B60 B61 B62 B63 B64 B65 B66 B67 B68 B69 B70 B71 B72 B73 B74 B75 B76 B77 B78 B79 B80 B81 B82 B83 B84 B85 B86 B87 B88 B89 B90 B91 B92 B93 B94 B95 B96 B97 B98
D38 D32 D28 Vcc_Core D29 D26 D25 Vcc_Core D22 D19 D18 EMI D20 D17 D15 Vcc_Core D12 D7 D6 Vcc_Core D4 D2 D0 Vcc_Core RESET BR1 Reserviert Vcc_Core A35 A32 A29 EMI A26 A24 A28 Vcc_Core A20 A21 A25 Vcc_Core A15 A17 A11 Vcc_Core A12 A8 A7 Vcc_Core A3
Tab. 13.1: Die Signalbelegung des Slot 1 (Forts.)
Sandini Bib Pentium II, Pentium III und Celeron
461
Pin Nr.
Bezeichnung
Pin Nr.
Bezeichnung
A99 A100 A101 A102 A103 A104 A105 A106 A107 A108 A109 A110 A111 A112 A113 A114 A115 A116 A117 A118 A119 A120 A121
A9 A4 BNR GND BPRI TRDY DEFER GND REQ2 REQ3 HITM GND DBSY RS1 Reserviert GND ADS Reserviert AP0 GND VID2 VID1 VID4
B99 B100 B101 B102 B103 B104 B105 B106 B107 B108 B109 B110 B111 B112 B113 B114 B115 B116 B117 B118 B119 B120 B121
A6 EMI SLOTOCC REQ0 REQ1 REQ4 Vcc_Core LOCK DRDY RS0 Vcc5 HIT RS2 Reserviert Vcc_L2 RP RSP AP1 Vcc_L2 AERR VID3 VID0 Vcc_L2
Tab. 13.1: Die Signalbelegung des Slot 1 (Forts.)
Die im PentiumPro-Kapitel angeführten Anschlussnummern stimmen natürlich nicht mit denen des Pentium II überein, weil der PentiumPro in einem Sockel 8 und der Pentium II in einem Slot 1 (Abbildung 13.1, Tabelle 13.1) residiert. Zu beachten ist, dass über einige Anschlüsse, wozu in erster Linie die Adressen- und Request-Pins zu rechnen sind, mehrere unterschiedliche Funktionen ausgeführt werden, wie es bei den Signalen des PentiumPro erläutert ist. Entfallen sind mit dem Pentium II das Signal CPUPRES (CPU present), das im Prinzip durch das Signal SLOTOCC (Slot occupied) ersetzt worden ist. Da es für den Slot 1 keinen Overdrive-Prozessor gibt, ist das Signal UP auch nicht mehr vonnöten. Die Takterzeugung hat sich beim Pentium II geändert, so dass extern keine PLL-Anschlüsse mehr zu finden sind. Außerdem fehlt der Functional Redundancy Check Error-Pin für eine Dual-Pentium-Konfiguration, weil es keinen expliziten Checker mehr gibt und somit auch das Signal FRCERR überflüssig ist, das ohnehin auf den meisten Mainboards nicht zum Einsatz kam. BR1, BR0 (I/O) Anschlüsse B75, A76 sind die Request-Pins, die die BREQ-Signale treiben und die mit den entsprechenden CPU-Pins verbunden sind. Hiermit erfolgt nach einem Reset die Zuteilung der Agents. Im Gegensatz zum PentiumPro erlaubt der Pentium II nur zwei Agents, und daher sind die Signale BR2–BR3 hier nicht mehr vorhanden. Signal
Agent0
Agent1
BREQ0 BREQ1
BR0 BR1
BR1 BR0
Sandini Bib 462
Kapitel 13
BSEL (I) Anschluss B21 Bus Select ist für die Kennzeichnung des Systemtaktes vorgesehen, der beim Pentium II entweder 66 MHz (bis zum Typ mit 333 MHz) oder 100 MHz beträgt. Die CPU zieht diesen Pin auf Masse und signalisiert damit der Mainboard-Elektronik, dass ein Systemtakt von 66 MHz notwendig ist. Bei einem High-Signal werden hingegen 100 MHz von der Mainboard-Elektronik eingestellt. Einige Adapterkarten (Slot-1 auf PPGA) besitzen einen Jumper, um die gewünschte Einstellung zu erzwingen. EMI Anschlüsse B100, B81, B61, B41, B1 Die EMI-Pins werden mit GND direkt am Slot über 0-Ohm-Widerstände verbunden und sind für Messungen der Electro Magnetic Interference (EMI-Management) vorgesehen. SLOTOCC (O) Anschluss B101 Wird mit GND verbunden, wenn der Pentium II in den Slot 1 eingesteckt ist. Dieses Signal ist insbesondere für Multiprozessorsysteme wichtig. Slots, die nicht mit einer CPU-Cartridge bestückt sind, müssen dann eine Terminierungskarte aufnehmen, was mit Hilfe von SLOTOCC sowie den VID-Pins detektiert wird. SLP (I) Anschluss B8 Wird das Signal SLP aktiviert, schaltet die CPU in den Sleep-State. Der interne Takt wird abgeschaltet, und die PLL ist noch aktiv. In diesem Zustand reagiert der Prozessor nur noch auf STPCLK, RESET und die Deaktivierung von SLP. THERMDP, THERMDN (O) Anschlüsse B14, B15 Neben dem bereits vom PentiumPro her bekannten Ausgang der internen Temperaturüberwachung THERMTRIP ist ab einer Pentium II-CPU mit 350 MHz eine weitere Temperaturüberwachung implementiert worden. Eine Diode befindet sich zwischen den Pins THERMDP (Anode) und THERMDN (Kathode), mit deren Hilfe eine analoge Spannung, die der jeweiligen ChipTemperatur entspricht, abgenommen werden kann. Diese Spannung wird üblicherweise im Chipset (Supervisory-Chip) umgesetzt und vom BIOS oder einem zusätzlichen Tool überwacht und angezeigt. VID4–VID0 (O) Anschlüsse A121, B119, A119, A120, B120 Voltage Identification: Diese Pins signalisieren der Mainboard-Elektronik, welche CPU-Spannung zu verwenden ist. Gegenüber dem PentiumPro ist das Signal VID4 hinzugekommen. Diese Signale werden von der Mainboard-Elektronik ausgewertet und dienen zusammen mit SLOTOCC der CPU-Detektierung. VID4
VID3
VID2
VID1
VID0
Vcc-Core
0 0 0
0 0 0
1 1 0
0 0 1
1 0 1
1,8 V 1,85 V 1,9 V
Tab. 13.2: Mit den VID-Pins wird der Mainboard-Elektronik die jeweils benötigte CPU-Core-Spannung bekannt gegeben.
Sandini Bib Pentium II, Pentium III und Celeron
VID4
VID3
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 01111-00110: reserviert
463
VID2
VID1
VID0
Vcc-Core
0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1
1,95 V 2,00 V 2,05 V 2,1 V 2,2 V 2,3 V 2,4 V 2,5 V 2,6 V 2,7 V 2,8 V 2,9 V 3,0 V 3,1 V 3,2 V 3,3 V 3,4 V 3,5 V
Tab. 13.2: Mit den VID-Pins wird der Mainboard-Elektronik die jeweils benötigte CPU-Core-Spannung bekannt gegeben. (Forts.)
Die Leitungen für die Spannungsversorgungen haben die folgenden Bedeutungen, worauf in Kapitel 13.2 noch näher eingegangen wird:
: : : :
Vtt (typ. 1,5 V) ist für die Terminierung des System-Bus (GTL+ Termination Voltage) vorgesehen und generiert hierfür die Spannung Vref (ca. 2/3 Vtt) auf dem CPU-Substrat. Vcc_Core ist die Spannung für den CPU-Core sowie für die L2-Cache-I/O-Treiber. Sie unterscheidet sich bei den unterschiedlichen Slot-CPUs – auch in Abhängigkeit von der Taktfrequenz oder der Fertigungscharge – voneinander. Vcc_L2 ist die Versorgungsspannung für die L2-Cache-Core-Logik. Die Spannung von 5 V (Vcc5) ist normalerweise nicht mit dem Pentium II verbunden und nur für Testzwecke vorgesehen.
13.1.2 Pentium II-Bus (GTL+) Der Bus des Pentium II (GTL+, Gunning Transceiver Logic) arbeitet auf die gleiche Weise wie beim PentiumPro. Die GTL+-Signale werden als Open-Drain realisiert und benötigen eine Terminierung, um ein High-Signal zur Verfügung stellen zu können. Aus diesem Grunde sind Slots in Multiprozessor-Boards, die nicht mit einer CPU bestückt sind, auch mit einer entsprechenden Terminierungskarte zu versehen, die die Signale mit einzelnen Widerständen abschließt. Die GTL+-Eingangssignale verwenden differentielle Receiver, die eine Referenzspannung (Vref) benötigen, um eine Null bzw. eine Eins detektieren zu können. Diese Referenzspannung wird mit der Elektronik auf der Cartridge erzeugt. Die Terminierungswiderstände sind in der CPU selbst enthalten. Sie sorgen für einen Pull-Up der Bussignale auf den hohen Signalpegel und sind für die Unterdrückung von Reflexionen unabdingbar.
Sandini Bib 464
Kapitel 13
Abb. 13.2: Zur Erreichung der hohen Taktfrequenzen reicht konventionelle Logik nicht mehr aus, und GTL+ tritt auf den Plan. GTL+ schreibt eine Terminierung der Signale, maximale Leitungslängen, Layoutdaten und zahlreiche weitere Parameter zur Einhaltung des Timings explizit vor. Bezeichnung
Signale
GTL+ (I) GTL+ (O) GTL + (I/O)
BPR, BR1, DFER, RESET, RS[2:0], RSP, TRDY PRDY A[35:3], ADS, AERR, AP[1:0], BERR, BINIT, BNR, BP[3:2], BPM[1:0], BR0, D[63:0], DBSY, DEP[7:0], DRDY, HIT, HITM, LOCK, REQ[4:0], RP CMOS (I) A20M, FLUSH, IGNNE, INIT, LINT0/INTR, LINT1/NMI, PREQ, PWRGOOD, SMI, SLP, STPCLK CMOS (O) BSEL 2), FERR, IERR, THERMTRIP System Bus Clock BCLK APIC Clock PICCLK APIC (I/O) PICD[1:0] TAP (I) TCK, TDI, TMS, TRST TAP (O) TDO Power und andere BSEL 1), BSEL[1:0] 3), CLKREF 3), CPUPRES 2), EDGTRL 2), EMI 1) PLL[2:1] 2), RESET2 3) , RTTCTRL 3),SLOTOCC 1), SLEWCTRL 3), TERMDP, TERMDN, Vcc-1,5 2) , Vcc-L2 1), Vcc5 1), VCC-CMOS 2), Vcc-Core, VCC-CoreDET 2), VID[3:0] 2) VID[4] 1), Vref[7:0] 2) ,Vss, Vtt 1) 1) Gibt es nur bei CPUs im SEP-Gehäuse 2) 3)
Gibt es nur bei CPUs im PPGA-Gehäuse Gibt es nur beim Pentium III
Tab. 13.3: Die Signalzuordnung ab dem Pentium II
Nicht alle CPU-Signale sind in GTL+-Technik ausgeführt, einige werden in (konventioneller) CMOS-Technik (2,5 V) realisiert. Tabelle 13.3 zeigt die Zuordnung der einzelnen Signale, die ebenfalls für die folgenden CPUs (Celeron, Pentium III) zutrifft, soweit sie implementiert sind (vgl. Text).
Sandini Bib Pentium II, Pentium III und Celeron
465
Alle GTL+-Signale arbeiten synchron zum Takt (BCLK), während CMOS-, Clock-, APIC- und TAPSignale asynchron auftreten können. Die APIC-Signale sind synchron zum PICCLK und die TAP-Signale synchron zum TCK. AGTL+ Ab dem Pentium III mit 100 MHz wird AGTL+ anstatt GTL+ realisiert. Das »A« steht dabei für Assisted. Das wesentliche Merkmal ist dabei, dass die Treiber einen zusätzlichen Pull-Up-Transistor (PMOS) besitzen, da die Pull-Up-Widerstände während der jeweils ersten Low/High-Flanke andernfalls nicht schnell bzw. nicht »sauber« genug schalten. Zur Flankendetektierung gibt es ab dem Pentium III im FC-PGA-Gehäuse das Signal SLEWCTRL sowie das Signal RTTCTRL, das für die Kontrolle der korrekten Terminierung zuständig ist (siehe Kapitel 13.3).
13.2 Celeron Ein Ableger der Pentium II-CPU ist der Celeron, der zunächst ohne L2-Cache realisiert wurde und daher vom Markt nicht in dem Maße angenommen wurde, wie Intel es sich vorgestellt hatte. Die Möglichkeit der Nachrüstung eines L2-Caches ist weder auf der CPU-Cartridge noch auf einem Mainboard für den Celeron oder einen anderen Vertreter aus der P6-Familie vorgesehen. Der Celeron besitzt wie die anderen Pentium II-CPUs einen L1-Cache von jeweils 16 KByte für Daten und Befehle. Der Celeron ist ganz bewusst als »Pentium-II-Billigattacke« gegen die damalige Konkurrenz (AMD, Cyrix) konzipiert worden und erbringt bei 266 MHz nur knapp die Leistung eines Pentium-MMX bei einem Takt von 233 MHz. Der ursprüngliche Celeron auf der Basis eines Pentium II arbeitet stets mit einem Systemtakt von 66 MHz, während die Pentium II- und Pentium IIIModelle ab 350 MHz einen Systemtakt von 100 MHz verkraften können. Zu beachten ist, dass es mittlerweile eine ganze Reihe von unterschiedlichen Celeron-CPUs gibt, die auf verschiedenen Cores basieren, wie Pentium II, Pentium III oder Pentium 4, was somit auch mit verschiedenen Gehäusetypen einhergeht, so dass es nicht einen Celeron gibt, sondern eben ganz verschiedene, wie es auch bei den anderen Intel-Mikroprozessoren der Fall ist. Aus diesem Grunde muss man die Daten der einzelnen CPUs doch recht genau unter die Lupe nehmen, um die jeweiligen Unterschiede feststellen zu können, was sicherstellt, dass sich diese oder jene CPU für ein bestimmtes Mainboard als geeignet erweist. Das Intel-Prinzip, das für einen Celeron gilt, ist jedoch stets das Gleiche, d.h., gegenüber der ursprünglichen CPU soll er sich als die »abgemagerte« Version darstellen, was im Wesentlichen einen niedrigeren Systemtakt und/oder verkleinerten L2-Cache bedeutet, wobei es aber auch beim Übergang von einer Modell-Version zur folgenden eine gewisse »Grauzone« gibt, so dass sich ein Celeron leistungstechnisch gesehen einem »ausgewachsenen« Pentium als ebenbürtig erweisen kann, wie es im Folgenden noch ausgeführt wird. Die L2-Cache-lose Celeron-Variante, die es mit 266 und 300 MHz gibt, wurde wenig später mit einem Cache von 128 KByte ausgestattet, was bei der 300-MHz-Version durch ein »A« in der Bezeichnung erkennbar ist. Alle darauf folgenden Celeron-CPUs besitzen diesen L2-Cache, der im Gegensatz zu einigen Pentium II- und Pentium III-CPUs stets mit dem vollen CPU-Takt arbeitet. Dadurch ist er bei gleicher Taktfrequenz fast genauso schnell wie ein Pentium II/III, obwohl der L2-Cache bei diesen CPUs üblicherweise eine Kapazität von 512 KByte besitzt. In der Praxis wird man dennoch kaum einen merklichen Unterschied in der Leistung feststellen können.
Sandini Bib 466
Kapitel 13
13.2.1 Anschlüsse und Signale Das aufwändige vom Pentium-II her bekannte Gehäuse gibt es beim Celeron nicht, er kommt quasi als »nackte Platine« daher, die als Single Edge Processor Package (SEPP) bezeichnet wird. Das Layout ist Slot 1-kompatibel, und demnach passt die Celeron-Platine sowohl elektrisch als auch mechanisch in den Slot 1 hinein. Der Haken dabei ist jedoch, dass sie hier – auf Grund des fehlenden Gehäuses – keine Befestigung mehr erhält. Demnach werden für den Celeron neue Halterungen und ein anderer Kühlkörper benötigt, die aber nicht auf ein übliches Pentium II-Mainboard passen. Erst bei Boards, die eine universelle Halterung (URM, Universal Retention Module) oder auch gleich mehrere zur Auswahl mitliefern, tritt diese Problematik nicht mehr auf. Der Celeron verfügt nicht über alle Signale des Pentium II, wie es in Tabelle 13.1 angegeben ist. Diese sind dann als »reserviert« anzusehen. Es sind die folgenden:
: : : : :
Der Celeron unterstützt keine Error Correction Codes (ECC) auf dem Datenbus, und deshalb fehlen ihm die Signale DEP0–DEP7 (Pins: A25, A27, B26, A28, B27, A29, A31, B28). Der Celeron kennt keine Paritätsbildung für den Adressbus, so dass die Signale AP0–AP1 (Pins: A117, B116), AERR (Pin: B118), RP (Pin: B114) und RSP (Pin: B115) nicht vorhanden sind. Der adressierbare Adressbereich beträgt statt 64 GByte nur noch 4 GByte, da der Celeron nicht über die die Adressleitungen A35–A32 (Pins: B78, A80, A79, A32) verfügt. Der Celeron im Slot-1 ist von Intel nicht für Multiprozessor-Systeme vorgesehen, und daher ist das Signal BR0 (Pins A76) nicht vorhanden. Bei den Celeron-Versionen ohne L2-Cache sind außerdem die Signale BINIT (Pin: A24) und BERR (Pin: A77) nicht ausgeführt.
Es sei darauf hingewiesen, dass einige der erwähnten Signale vielfach (hängt von der Fertigungs-Charge ab) in der eigentlichen Celeron-CPU vorhanden sind, nicht jedoch mit den Kontakten des Slot 1 verbunden sind. Dies eröffnet findigen Bastlern ein breites Experimentierfeld, zum Beispiel ist es durchaus möglich, zwei Celerons in einem Dualprozessor-Slot-System zu betreiben. Hierfür muss lediglich das Signal BR1 (Pin B75) an der CPU (über einen Widerstand) auf 1,5 V gelegt werden. Dann »denken« die CPUs, dass sie multiprozessor-fähig sind. Idealerweise praktiziert man dies mit einem Slocket (einer Slot 1-zu-370-Pin-Adapterkarte), da hier derartige (Löt-) Manipulationen einfacher als an einer Slot-Cartridge durchzuführen sind. Es gibt sogar eine entsprechende Adapterkarte der Firma MSI (MSI-6905 V1.1), die genau diese Manipulation per speziellem Jumper ermöglicht, was somit ohne (gefährliche) Bastelarbeiten vonstatten geht.
13.2.2 Celeron für den Sockel 370 In Anbetracht der Tatsache, dass ein Pentium II/III fast doppelt so teuer wie ein Celeron ist, ist der Celeron ein echtes Schnäppchen. Da dies wiederum den Verkauf der teureren CPUs behindert hat, wurde der Celeron fertigungstechnisch auf ein 370-poliges PPGA-Gehäuse (Plastic Pin Grid Array) umgestellt. Prinzipiell verwendet der Celeron im 370-poligen Gehäuse die gleichen Signale wie bei der Slot 1-Version, es ist also ebenfalls eine »abgespeckte« Pentium II-Variante, allerdings standardmäßig auch für Dual-Processing vorgesehen. Da es sich beim 370-poligen Celeron – wie beim PentiumPro – aber um eine Sockelversion handelt, sind die mit dem Pentium II verschwundenen Signale CPUPRES (Pin: C37, entspricht in der Funktion dem Signal SLOTOCC beim Slot 1) sowie PLL1 (Pin: W33) und PLL2 (Pin U33) wieder da. Neu ist hingegen das Eingangssignal EDGCTRL (Edge
Sandini Bib Pentium II, Pentium III und Celeron
467
Control, Pin: AG1), das mit Vcc_Core über einen 51-Ohm-Widerstand verbunden ist. Es dient der Kontrolle der GTL+-Flanken, und falls sie nicht der GTL+-Spezifikation genügen, startet die CPU erst gar nicht.
Abb. 13.3: Der Celeron im PPGA-Gehäuse (Ansicht von der Sockel-Unterseite) verwendet prinzipiell die gleichen Signale wie die Celeron-Slot-1-Version.
Beim genauen Blick auf die Sockelbelegung (Abbildung 13.3) fällt auf, dass zahlreiche Anschlüsse mit RSVD (reserved, reserviert) gekennzeichnet sind. Wer denkt, dass hier was im Busche liegt, tippt richtig, denn einige davon werden vom FC-PGA-Pentium III und dem Celeron III verwendet. Mehr dazu im folgenden Abschnitt.
13.3 Pentium III Der Mitte des Jahres 1999 vorgestellte Pentium III ist logischerweise eine Weiterentwicklung des Pentium II, wobei sich die Neuerungen im Wesentlichen auf 72 neue Befehle beschränken, die als Streaming Single Instruction Multiple Data Extensions oder kürzer als SSE bezeichnet werden. Dies ist im Grunde genommen nichts anderes als ein erweitertes MMX (Multi-Media Extensions), wobei
Sandini Bib 468
Kapitel 13
SSE jedoch nicht auf Integer-Operationen beschränkt ist, sondern auch auf Gleitkommaoperationen angewendet werden kann, wie es AMD bereits mit 3DNOW! beim K6-II vorgemacht hat. Gemeinsam ist allen drei Multimedia-Erweiterungen, dass die Software die entsprechenden Extensions unterstützen muss, was insbesondere für Spiele von Bedeutung ist. Ab Microsofts DirectX-Version 6.1 soll dies der Fall sein; ob ein bestimmtes Spiel dies jedoch ausnutzt oder nicht, steht auf einem anderen Blatt, zumal einige Spiele aus Leistungsgründen DirectX umgehen. Umstritten ist ein Pentium III-Feature: die so genannte Security-Architektur. Ein Pentium III besitzt eine eigene Kennung, die beispielsweise zur Lizenzierung von Software und E-Commerce zum Einsatz kommen könnte. Somit ist es aber theoretisch kein Problem, genaue Benutzerprofile der Internet-Surfer zu erstellen, was einigen Datenschutzorganisationen doch zu weit ging, so dass sie daher zum Boykott des Pentium III aufgerufen haben. Wenig später hat Intel daher die Empfehlung an die BIOS- und Mainboard-Hersteller ausgegeben, dass die Seriennummer-Einschaltung nur optional vorgesehen werden soll und per Voreinstellung auf Disabled zu stehen hat. In den üblichen BIOS-Setups findet man einen entsprechenden Eintrag zur Freigabe – wozu das auch immer gut sein soll. Ansonsten hat sich außer der »Einstiegstaktfrequenz« (450 MHz) gegenüber dem Pentium II nichts Wesentliches geändert: Er arbeitet (zunächst) mit einem Systemtakt von 100 MHz, es gibt einen L1Daten- und Befehls-Cache mit je 16 KByte, und der L2-Cache verfügt über eine Kapazität von 512 KByte, wobei dieser auch nur mit dem halben Prozessortakt arbeitet. Seine höhere Leistung gegenüber einen Pentium II erreicht der Pentium III daher allein durch seine höhere Taktfrequenz.
13.3.1 Familienbande Die Prozessorfamilie auf der Basis des Pentium II ist im Laufe der Zeit recht groß geworden, wobei zur Unterscheidung oftmals die Code-Namen (Tabelle 13.4) des CPU-Cores verwendet werden, die zwar keine offizielle Bezeichnung sind, jedoch die Unterscheidung etwas vereinfachen. Bezeichnung Typ Strukturgröße
Fassung
Coppermine 0,18 µm Coppermine 0,18 µm Covington 0,35 µm Deschutes 0,25 µm Katmai 0,25 µm Klamath 0,35 µm Mendocino 0,25 µm Tualatin 0,13 µm Tualatin 0,13 µm
CPU-Takt
Maximaler L2-Cache-Größe Systemtakt L2-Cache-Takt
Pentium III B-Typ Celeron
Slot 1, Sockel-370 ab 500 MHz
133 MHz
Sockel-370
ab 500 MHz
100 MHz
Celeron
Slot 1
266, 300 MHz
66 MHz
Pentium II
Slot 1
333, 350, 400 MHz
100 MHz
Pentium III
Slot 1
ab 450 MHz
100 MHz
Pentium II
Slot 1
233, 266, 300 MHz
66 MHz
Celeron (A) Slot 1, Sockel-370 ab 300 MHz
66 MHz
Pentium III Sockel-370 (A), (S) Celeron (A) Sockel-370
ab 1,13 GHz
133 MHz
ab 1 GHz
100 MHz
Tab. 13.4: Daten des Pentium II und seiner Ableger
256 KByte CPU-Takt 128 KByte CPU-Takt kein L2-Cache 512 KByte CPU-Takt/2 512 KByte CPU-Takt/2 512 KByte CPU-Takt/2 128 KByte CPU-Takt 256 oder 512 KByte CPU-Takt 256 KByte CPU-Takt
Sandini Bib Pentium II, Pentium III und Celeron
469
Die Pentium III-Modelle mit Coppermine-Kern werden mit 133 MHz getaktet, was auch für den L2-Cache gilt, der dann aber nur noch halb so groß ist, nämlich 256 KByte. Der L2-Cache ist hier im Chip (Die) integriert und wird nicht diskret auf der CPU-Platine aufgebaut. Er wird (wie beim vergleichbaren Celeron) mit dem vollen CPU-Takt betrieben. Es gibt dabei gleich mehrere unterschiedliche Varianten, was aus der jeweiligen Bezeichnung erkennbar ist, denn es wird sowohl der neuere Coppermine (Typ E) als auch der Katmai für einen Systemtakt von 133 MHz (statt wie bisher 100 MHz) angeboten, was dann noch durch ein »B« gekennzeichnet wird.
13.3.2 Pentium III für den Sockel 370 Da es nunmehr problemlos möglich ist, die CPU mit dem L2-Cache auf einem Die zu integrieren, ist auch die Cartridge- bzw. die Slot-1-Konstruktion nicht mehr notwendig, so dass die neuen Pentium III-Modelle wieder für einen Sockel – ebenfalls 370-polig wie für den Celeron – hergestellt werden. Somit ist das Slot-CPU-Konzept als veraltet anzusehen und vom traditionellen Sockel-Prinzip, das schließlich wesentlich preiswerter zu realisieren ist, abgelöst worden. Immerhin gibt es Adapterplatinen für den Slot 1 (Slocket), damit sich hier diejenigen CPUs, die für einen Sockel vorgesehen sind, einsetzen lassen. Dabei ist allerdings genauestens zu beachten, welche SockelCPUs vom Slocket unterstützt werden, denn möglicherweise ist ein zusätzlicher Spannungsregler notwendig, um die Core-Spannung für die Sockel-CPU bereitstellen zu können. Eine übliche Adapterkarte für den Celeron funktioniert beispielsweise nicht für einen Pentium III. Der Grund hierfür ist, dass der Pentium III wieder Error Correction Codes für den Datenbus und die Paritätsbildung für den Adressbus unterstützt. Um es kurz zu machen: Alle Signale, die mit dem Celeron verschwunden sind, sind mit dem Pentium III wieder zum Vorschein gekommen, was sowohl für die Slot 1-, als für die 370-polige Variante gilt. Für den im PPGA-Package eingeführten Celeron wurde erstmalig der 370-polige Sockel verwendet, wobei hierfür mittlerweile zwei weitere Varianten im Flip Chip-Design verfügbar sind. Flip Chip bezeichnet dabei eine spezielle Technik für die Montage des CPU-Dies auf einer Trägerplatine. Die folgende Liste nennt die möglichen Gehäusetypen, die für den Celeron und den Pentium III zum Einsatz kommen. Gehäusevarianten:
: : : :
SEP: Single Edge Processor Package für den Slot 1 PPGA: Plastic Pin Grid Array Package für den 370-poligen Sockel FC-PGA: Flip Chip Pin Grid Array Package für den 370-poligen Sockel FC-PGA-2: Flip Chip Pin Grid Array Package Version 2 für den 370-poligen Sockel
Die laufende Veränderung der Gehäuseform erfolgt im Wesentlichen aus Kostengründen von Seiten Intels, und quasi als Nebeneffekt hat dies unterschiedliche Gegebenheiten für die »Temperaturbehandlung« der CPUs zur Folge. Eine zu hohe Temperatur bei einer CPU »killt« sie mit ziemlicher Sicherheit, so dass nicht nur eine ausreichende Kühlung vorgesehen sein muss, sondern auch eine Temperaturkontrolle vom System her stattfinden sollte, denn die Kühlung kann auch einmal ausfallen, etwa wenn der Lüfter aus irgendeinem Grunde nicht funktioniert oder sogar das komplette »Kühlsystem« von der CPU abgefallen ist. Bereits bei einigen Mainboards mit Sockel 7 (Pentium I) befindet sich ein Temperaturfühler im Sockelzwischenraum, der eine entsprechende Information über den Chipset zum BIOS signalisiert, wodurch im Fall einer unzulässig hohen CPU-Temperatur eine Abschaltung des Systems erfolgen kann. Bei SEP, PPGA und FC-PGA muss ebenfalls ein externer Temperatursensor zum Einsatz kommen, während CPUs im FC-PGA 2-Gehäuse diesen bereits integriert haben, was zu einer weit
Sandini Bib 470
Kapitel 13
zuverlässigeren Messung führt, als dies mit einem externen Sensor der Fall sein kann. Die Wärme muss vom Chip möglichst optimal an den montierten Kühlkörper abgeleitet werden können, und wie gut dies funktioniert, hängt eben auch von der Bauform des CPU-Chips selbst ab.
13.3.3 Anschlüsse und Signale Neu hinzugekommen ist mit dem Pentium III ein zweites Signal für die Kennzeichnung des Systemtaktes (BSEL1), weil er nicht nur mit 66 MHz (BSEL=0) oder 100 MHz (BSEL=1), sondern auch mit 133 MHz arbeiten kann. Tabelle 13.5 zeigt die gültigen Einstellungsmöglichkeiten. BSEL1
BSEL0
Systemtakt
0 1 x
1 0 0
100 MHz 133 MHz 66 MHz 1)
1)
gilt nur für Pentium III im Slot 1
Tab. 13.5: Mit dem Pentium III wurde ein zweites Bus-Select-Signal eingeführt.
Abb. 13.4: Das Anschlussschema des Pentium III in der 370-poligen Sockelversion
Sandini Bib Pentium II, Pentium III und Celeron
471
Für die sockelbasierte Pentium III-Version ist ein zweites Reset-Signal (RESET2, Pin: X4) eingeführt worden, das ausschließlich vom Pentium III abgefragt werden kann. Hiermit soll sichergestellt werden, dass ein Pentium III in einem Sockel-Mainboard für den Celeron gar nicht erst startet. Außerdem ist der Kontakt AM2 beim Pentium III nicht mehr auf GND-Potenzial (Vss) wie beim Celeron, sondern wird hier als reserved for future use (RSV) bezeichnet. Er hat allerdings (bisher) keinerlei Funktion, sorgt jedoch für ein Nichtfunktionieren einer Pentium III-CPU in einem Sockel-370, wenn dieser lediglich für den Celeron spezifiziert ist. Zwei weitere Pins, die es ebenfalls nur für die Pentium III-Sockel-Version gibt, sind RTTCTR (Pin: S35) und SLEWCTRL (Pin: E27). Sie sind mit AGTL+ (vgl. Kapitel 13.1.2) notwendig geworden, da es auf den üblichen sockelbasierten Mainboards recht eng zugeht, was Layout-Probleme mit sich bringen kann, so dass hier zwei Kontrollmechanismen mit Hilfe dieser Signale realisiert werden, um die AGTL+-Spezifikation erfüllen zu können. RTTCTR (Pin: S35) ist ein Eingangssignal für die Kontrolle der korrekten AGTL+-Bus-Terminierung. Die Pentium III-CPU »sampled« (testet) diesen Eingang, um festzustellen, ob die spezifizierte Terminierung gegeben ist. Der SLEWCTRL-Eingang (Pin: E27) der Pentium III-CPU erledigt eine entsprechende Überprüfung der Flankensteilheit der AGTL+-Signale, wenn die CPU einen Bus-Agent treibt. In der Praxis stellt sich jedoch heraus, dass auch diese Funktionen keineswegs von jedem hierfür passenden Chipset bzw. Mainboard tatsächlich konsequent genutzt werden, zumindest nicht in der Art und Weise, wie Intel dies vorschreibt. Dies hat zur Folge, dass eben auch Celerons, die ca. 40 Pins weniger als die Pentium III-Versionen aufweisen, genauso gut in einem Pentium IIIMainboard funktionieren können. Die Pentium III-CPUs mit Coppermine-Kern arbeiten mit einer geringeren Core-Spannung von typischerweise 1,65 V, was somit auch eine Erweiterung der VID-Codes zur Folge hat (siehe Tabelle 13.6). Ein Mainboard mit 370-poligem Sockel muss also die Spannung von 1,65 V zur Verfügung stellen können, damit hier ein Pentium III-Coppermine verwendet werden kann. Zu beachten ist, dass das Mainboard auch explizit für die Verwendung dieser CPU ausgelegt sein muss, denn der Celeron verwendet ja nur eine Untermenge der Signale (ca. 40 weniger) eines Pentium II oder auch Pentium III. Wer nun im Besitz eines Mainboards ist, das nur für den Celeron spezifiziert ist, kann sich jedoch durch einen Trick behelfen, um hier dennoch einen Pentium III betreiben zu können, allerdings muss das Mainboard auf jeden Fall die 1,65 V-Core-Spannung bieten. Der zweite (neue) Reset-Anschluss (RESET2, Pin: X4) wird hierfür einfach mit RESET (Pin: AH4) (am Sockel) verbunden. Dann ist noch RTTCTR und SLEWCTRL »vorzugaukeln«, dass mit den AGTL+-Signalen alles stimmig ist. Dies wird durch zwei Widerstände von 330 Ohm erreicht, die vom jeweiligen Pin (S35, E27) an die Masse (GND) gelegt werden. Als letzte Maßnahme ist noch der Anschluss AM2 (s.o.) lahm zu legen, was am einfachsten durch ein Abkneifen des Pins an der CPU realisiert wird. Diese Methode bleibt selbstverständlich geübten Bastlern vorbehalten, wobei ein geeignetes Mainboard, wie das Abit AB-BP6 oder das Asus MEB, nach einer derartigen Manipulation auch weiterhin mit einer Celeron-CPU umgehen kann und der um einem Pin gekappte Pentium III nach wie vor in Mainboards funktioniert, die auch explizit für den Pentium III ausgelegt sind. Vielmehr soll diese kleine Umbaumaßnahme lediglich verdeutlichen, dass es mit den tatsächlichen Unterschieden zwischen einem Celeron und dem Pentium III nicht weit her ist und ein Pentium III auch ohne Error Correction Codes und Paritätsbildung auf dem Adressbus klaglos funktioniert.
Sandini Bib 472
Kapitel 13
Die schnellsten Ausführungen des Celeron und auch des Pentium III werden seit Mitte des Jahres 2001 mit Tualatin-Kern aufgebaut und in 0,13µm-Technik mit FC-PGA 2-Gehäuse gefertigt. Sie benötigen gegenüber den CPUs mit Coppermine-Kern wiederum eine geringere Core-Spannung, die typischerweise zwischen 1,45 – 1,75 V statt wie bisher bei 1,5 – 1,75 V liegt. Außerdem wurde der Spannungspegel des Frontside-Bus-Interface, also der Schnittstelle zwischen CPU und dem Chipset, auf 1,25 V (statt 1,5 V) abgesenkt. Aus diesen Gründen funktionieren Prozessoren mit Tualatin-Kern nur mit Mainboards, die über diese Voraussetzungen verfügen, und die Chipset-Hersteller haben teilweise hierfür bereits bestehende Chipsets entsprechend angepasst, was etwa beim Intel i815-Chipset durch das B-Stepping gekennzeichnet wird oder beim VIA-Chipset Pro133T anhand der Bezeichnung 694T erkennbar ist. Allerdings gibt es auch hierfür Adapterlösungen, beispielsweise von der Firma Topgrade, um selbst einen Tualatin-Prozessor in einem Slot-1-System einsetzen zu können. Wie erläutert benötigen neuere CPUs, die über kleinere Strukturen verfügen, auch geringere Core-Spannungen, was zu Erweiterungen der VID-Pin-Funktionen gegenüber den in der Tabelle 13.2 angegebenen Werten führt. Tabelle 13.6 zeigt die entsprechende Zuordnung, die laut Intel für die VID-Einstellungen definiert worden ist. VID4
VID3
VID2
VID1
VID0
Vcc-Core
1 1 1
1 1 0
1 0 1
1,3 V 1,35 V 1,4 V
0
0
1,45 V
1 1 0 0 1 1
1 0 1 0 1 0
1,5 V 1,55 V 1,6 V 1,65 V 1,7 V 1,75 V
0 0 1 1 0 0 1 1 0 0 1 1 0
1 0 1 0 1 0 1 0 1 0 1 0 1
1,8 V 1,85 V 1,9 V 1,95 V 2,00 V 2,05 V 2,1 V 2,2 V 2,3 V 2,4 V 2,5 V 2,6 V
Andere Versionen 0 0 0
1 1 1
Celeron und Pentium III mit Tualatin-Kern 0
1
1
Celeron und Pentium III mit Coppermine-Kern 0 0 0 0 0 0
1 1 1 1 0 0
0 0 0 0 1 1
Pentium II, mit Katmai-Kern und Vorgänger 0 0 0 0 0 0 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1 1 1 1
1 1 0 0 0 0 1 1 1 1 0 0 0
Tab. 13.6: Die Bedeutungen der VID-Pins mit den Erweiterungen für CPUs mit Coppermine- und Tualatin-Core.
Sandini Bib Pentium II, Pentium III und Celeron
473
VID4
VID3
VID2
VID1
VID0
Vcc-Core
1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 0 0
0 1 1 0 0 1 1 0 0
0 1 0 1 0 1 0 1 1
2,7 V 2,8 V 2,9 V 3,0 V 3,1 V 3,2 V 3,3 V 3,4 V 3,5 V
Tab. 13.6: Die Bedeutungen der VID-Pins mit den Erweiterungen für CPUs mit Coppermine- und Tualatin-Core. (Forts.)
13.4 Celeron III und Celeron 4 Basierend auf dem FC-PGA-Design wird auch eine Celeron III-CPU hergestellt, die den gleichen Coppermine-Kern wie der Pentium III enthält, jedoch die Celeron-typischen Abmagerungen aufweist (nur 66 MHz Takt, keine ECCs, keine Paritätsbildung, maximal 4 GByte Adressbereich). Der Celeron III bietet nur einen L2-Cache von 128 KByte, dafür aber ebenfalls ISSE, und die Seriennummer ist hier hardwaretechnisch abgeschaltet. Die Einstiegsfrequenz beträgt 566 MHz, so dass ein Faktor von 8,5 und bei der 600-MHz-Version von 9 einzustellen ist. Da der Multiplikationsfaktor von 9 jedoch nicht spezifiziert ist, hat man bei Intel einfach den Faktor 5 genommen, der somit als Faktor 9 wirkt, was bei Mainboards, die den Celeron III noch nicht kennen, zu einem unsinnigen Systemtakt von 120 MHz (600/5) führt. Die zweite Schwierigkeit bei einigen Mainboards könnte die Tatsache sein, dass der Celeron III eine Core-Spannung (vgl. Tabelle 13.6) von 1,5 V benötigt. Aktuelle Mainboards, die für den Pentium III ausgelegt sind, sollten aber auch mit dem Celeron III zurechtkommen. Celerons ab 1,4 GHz können im Inneren auch auf dem Tualatin-Core (0,13 µm) des Pentium III mit einem L2Cache von 256 KByte basieren, und die hierfür geeigneten Mainboards müssen einen Chipset im »B-Stepping« verwenden, wie es beim Pentium III erläutert ist. Die neueste Celeron-Generation stellt keinen Ableger vom Pentium II/III dar, sondern einen vom Pentium 4, und diese CPU findet somit ihren Platz in Mainboards mit einem 478-poligen P4-Sockel. Der Pentium 4 ist in Kapitel 15 beschrieben, so dass an dieser Stelle nur kurz die Besonderheiten dieses neuen Celerons erwähnt werden. Er wird mit einer Taktfrequenz von mindestens 1,7 GHz realisiert, und der Systemtakt beträgt 100 MHz, was als FSB 400 bezeichnet wird. Die Basis dieses Prozessors beruht auf dem (älteren) Willamete-Kern in der 0,18µm-Technologie. In der Tradition eines Celerons wurde der L2-Cache in der Kapazität auf 128 KByte (statt 256 oder auch 512 KByte beim P4) reduziert.
13.5 VIA-Prozessoren Die letzte CPU, die unter der Cyrix-Bezeichnung erhältlich ist, trägt die Bezeichnung M-II-333 und ist in Kapitel 11.1.2 beschrieben. Die Firma Cyrix wurde zunächst an National Semiconductor verkauft, wobei der Markenname erhalten blieb. Trotz eines ganz beachtlichen Marktanteils bei Einsteiger-PCs, die mit Cyrix-CPUs ausgestattet waren, sah National Semiconductor aber keine Chance mehr, mit dieser Produktlinie schwarze Zahlen zu schreiben, und verkaufte die Cyrix-Technologie nach ca. zwei Jahren an den bekannten taiwanesischen Chip-Hersteller VIA, der ebenfalls die WinChip-Mikroprozessoren (siehe Kapitel 11.3) von IDT übernommen hat.
Sandini Bib 474
Kapitel 13
Auf der Basis der M-II-Chips hat VIA zunächst die Joshua-CPU für den 370-poligen Sockel als Konkurrenz zum Celeron entwickelt. Die jeweiligen Bezeichnungen (433-500) ergeben sich dabei auch wieder aus dem Pentium-Rating. Die Joshua-CPU – auch als Cyrix III oder C3 bezeichnet – unterstützt einen Systemtakt von 66, 100 und 133 MHz und besitzt einen integrierten L2-Cache von 256 KByte. Dabei wird ein Anschlussschema verwendet, das prinzipiell zum 370-poligen Celeron kompatibel ist, jedoch einige Anpassungen bei den Mainboard-Herstellern notwendig macht, wozu in erster Linie die Funktionen der VID- und BSEL-Pins zu rechnen sind, die nicht Intel-konform ausgelegt sind. Ansonsten verfügt der Cyrix III über die typischen Celeron-Limitierungen (kein ECC usw.), und er besitzt weder einen APIC – somit fehlen die Signale PICCLK, PICD0, PICD1 – noch hardwareunterstützte Debugging-Funktionen (kein BPM1, BPM0, BP2, BP3, PREQ, PRDY), und außerdem gibt es keine interne Fehlererkennung (kein IERR-Signal), was jedoch nichts daran ändert, dass er kompatibel zum Celeron ist, wenn die Mainboard- und BIOS-Hersteller die notwendigen – aber eher geringfügigen – Anpassungen vornehmen. Typ
CPU-Takt
Core-Spannung
Herstellung
Joshua (C5) Samuel (C5A) Samuel II (C5B) Ezra (C5C) Ezra-T (C5N) Nehemiah (C5XL)
433-500 MHz 500-733 MHz 650-850 MHz 800-900 MHz 900-1100 MHz 1000-1500 MHz
2V 1,8-2 V 1,6 V 1,35 V 1,35-1,4 V 1,35-1,4 V
0,25 µm, 10 Mio. Transistoren 0,18 µm, 11.3 Mio. Transistoren 0,15 µm, 15.2 Mio. Transistoren 0,13 µm, 15.4 Mio. Transistoren 0,13 µm, 15.5 Mio. Transistoren, Tualatin-Bus 0,13 µm, 20.5 Mio. Transistoren
Tab. 13.7: Die C3-Prozessoren von VIA
Eine Weiterentwicklung der recht »stromhungrigen« Joshua-CPU sowie der nachfolgenden SamuelCPU firmiert unter der Bezeichnung Ezra. Grundlage bildet hierfür jedoch kein Cyrix-Design, sondern eines der ebenfalls zu VIA gehörenden Centaur-Abteilung, die auch die WinChip-Prozessoren bei der Firma IDT entwickelt hat. Der Ezra-Prozessor besitzt einen integrierten L1-Cache von 128 KByte und einen L2-Cache von lediglich 64 KByte. Er unterstützt einen maximalen Systemtakt von 133 MHz und hat mit 3DNOW! sowie MMX eine (rudimentäre) Multimediaunterstützung parat. Der im Jahre 2003 vorgestellte Nachfolger trägt die Bezeichnung Nehemiah und tritt mit einer Taktfrequenz von 1 GHz an. Nehemiah wird mit einem Systemtakt von 133 MHz und dem Faktor 7,5 betrieben, d.h. es wird nunmehr auf Pentium-Rating-Angaben verzichtet, und die Einstellungen basieren auf der tatsächlichen Taktangabe der CPU. Der Prozessor benötigt eine Core-Spannung von 1,4 V und verbraucht lediglich 10 W. Die Cache-Kapazitäten haben sich gegenüber den Vorgängern nicht verändert, allerdings wurde die L2-Cache-Effizienz durch eine 16fach-Assoziativität von einer 4fachen gesteigert. Außerdem wurde noch an einigen Details gefeilt, wozu eine verbesserte Sprungvorhersage (BTAC, Branch Target Address Calculator) sowie schnellere Integer- und Adressberechnungen zu zählen sind. Als wichtigste Neuerung ist die Unterstützung der Intel Streaming SIMD Extensions (SSE) herauszuheben, die statt des Multimediabefehlssatzes 3DNOW! implementiert ist, der von aktuellen CPUs nicht mehr unterstützt wird. Generell zielt VIA mit seinen Prozessoren eher nicht auf schnelle PCs ab, was man bereits aus den Taktangaben im Vergleich zu aktuellen Intel- und AMD-CPUs entnehmen kann. Vielmehr sollen hiermit preisgünstige Systeme realisiert werden, die wenig Strom verbrauchen und daher auch keinen störenden Geräuschpegel (aufgrund der notwendigen Hochleistungslüfter) produ-
Sandini Bib Pentium II, Pentium III und Celeron
475
zieren. Diese Eigenschaften sind insbesondere im Büro wünschenswert, und für die hier üblicherweise anfallenden Aufgaben reicht die Leistung der VIA-Prozessoren völlig aus. Außerdem werden diese bevorzugt für mechanisch kleine Embedded-Systems eingesetzt.
13.6 Einstellungsdaten Die Einstellung der Takte und der Spannungsversorgung erfolgt bei Pentium II/III und CeleronCPUs üblicherweise nicht durch Jumper auf dem Mainboard, sondern per BIOS-Setup. Diese CPUs besitzen die erwähnten Voltage Indentification Pins (VID), mit denen der Mainboard-Elektronik die jeweils benötigte Spannung signalisiert, und daraufhin aktiviert wird. Viele der Intel-CPUs sind intern fest auf einen bestimmten Faktor (Systemtakt x CPU-Takt) verdrahtet, so dass es keine Rolle spielt, was hierfür möglicherweise im BIOS-Setup eingestellt wird. Der Systemtakt (66, 100, 133 MHz) bleibt daher im Grunde als einiger variabler Parameter übrig. Bei einigen Mainboards ist aus Sicherheitsgründen zunächst ein Jumper umzusetzen, damit sich die CPU-Parameter im BIOS-Setup verändern lassen. Die I/O-Spannung für die CPU beträgt üblicherweise 3,3 V und ist auf dem Mainboard meist nicht zu verändern. Lediglich die CoreSpannung lässt sich manipulieren, und Tabelle 13.8 zeigt hierfür die passenden Daten für die unterschiedlichen Pentium II und die hieraus entstandenen CPUs. Zu beachten ist dabei, dass die jeweiligen Core-Spannungen durchaus – je nach Typ und Herstellungscharge – variieren können, wobei das BIOS optimalerweise die korrekte Spannung automatisch einstellen sollte. Prozessor-Typ
Systemtakt
CPU-Takt
Multiplikator
Core-Spannung
Intel Pentium II 233 Intel Pentium II 266 Intel Pentium II 300 Intel Pentium II 333 Intel Pentium II 350 Intel Pentium II 400 Intel Pentium II 450 Intel Celeron 266 (ohne L2-Cache) Intel Celeron 300 (ohne L2-Cache) Intel Celeron 300A Intel Celeron 333 Intel Celeron 366 Intel Celeron 400 Intel Celeron 433 Intel Celeron 466 Intel Celeron 500 Intel Celeron 600 Intel Celeron 700 Intel Celeron 800 Intel Celeron 900 Intel Celeron 1000 Intel Celeron 1100 Intel Celeron 1200 Intel Celeron 1300 Intel Celeron 1400
66 MHz 66 MHz 66 MHz 66 MHz 100 MHz 100 MHz 100 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 66 MHz 100 MHz 100 MHz 100 MHz 100 MHz 100 MHz 100 MHz 100 MHz
233 MHz 266 MHz 300 MHz 333 MHz 350 MHz 400 MHz 450 MHz 266 MHz 300 MHz 300 MHz 333 MHz 366 MHz 400 MHz 433 MHz 466 MHz 500 MHz 600 MHz 700 MHz 800 MHz 900 MHz 1 GHz 1,1 GHz 1,2 GHz 1,3 GHz 1,4 GHz
x 3,5 x4 x 4,5 x5 x 3,5 x4 x 4,5 x4 x 4,5 x 4,5 x5 x 5,5 x6 x 6,5 x7 x 7,5 x9 x 10,5 x8 x9 x 10 x 11 x 12 x 13 x 14
2,9 V 2,9 V 2,9 V 2,18 V 2,18 V 2,18 V 2,18 V 2V 2V 2V 2V 2V 2V 2V 2V 2V 1,5 – 1,75 V 1,65 – 1,75 V 1,65 – 1,75 V 1,75 V 1,75 V 1,75 V 1,5 V 1,5 V 1,5 V
Tab. 13.8: Einstellungsdaten für Intel-CPUs in der Übersicht
Sandini Bib 476
Kapitel 13
Prozessor-Typ
Systemtakt
CPU-Takt
Multiplikator
Core-Spannung
Intel Celeron 1700 Intel Pentium III 450 Intel Pentium III 500 Intel Pentium III 533B Intel Pentium III 550 Intel Pentium III 600 E Intel Pentium III 600 EB Intel Pentium III 667 EB Intel Pentium III 700 E Intel Pentium III 733 EB Intel Pentium III 800 Intel Pentium III 1000 EB Intel Pentium III 1,13 GHz Intel Pentium III 1,26 GHz Intel Pentium III 1,4 GHz
100 MHz, FSB 400 100 MHz 100 MHz 133 MHz 100 MHz 100 MHz 133 MHz 133 MHz 100 MHz 133 MHz 100 MHz 133 MHz 133 MHz 133 MHz 133 MHz
1,7 GHz 450 MHz 500 MHz 533 MHz 550 MHz 600 MHz 600 MHz 667 MHz 700 MHz 733 MHz 800 MHz 1000 MHz 1,13 GHz 1,26 GHz 1,4 GHz
x 17 x 4,5 x5 x4 x 5,5 x6 x 4,5 x5 x7 x 5,5 x8 x 7,5 x 8,5 x 9,5 x 10,5
1,6 V 2V 2V 1,8 V 2V 2V 1,8 V 1,6 V 1,6 V 1,6 V 1,65 V 1,7 V 1,45 V 1,45 V 1,45 V
Tab. 13.8: Einstellungsdaten für Intel-CPUs in der Übersicht (Forts.)
Sandini Bib
14
Athlon und Duron
Der Firma AMD ist es mit dem Athlon (Codename K7) im August 1999 erstmalig gelungen, den Marktführer Intel mit seinem Mikroprozessor Pentium III in allen wichtigen Disziplinen zu schlagen, was auch für die oft bemängelte Floating Point-Leistung der AMD-Vorgänger-CPUs gilt, die insbesondere für »leistungshungrige« Spiele von Bedeutung ist. Unmittelbar nach dem Athlon erschien dann als Intel-Reaktion der Pentium III-Coppermine (mit der Kupferverbindungstechnologie hat er jedoch nichts zu tun), damit Intel leistungstechnisch aufschließen konnte. AMD gebührt jedoch der Triumph, dass sie die erste CPU für PCs mit einer Taktfrequenz von 1 GHz, die auch ohne größere Probleme von Anfang an funktionierte, in großen Stückzahlen liefern konnte, was man von den vergleichbaren Intel-Pentium III-CPUs nicht behaupten kann. Die neueren Athlon-CPUs wie etwa der Thunderbird oder der Duron (siehe Kapitel 14.4), die seit Mitte des Jahres 2000 hergestellt werden, werden in einem 0,18 µm-Prozess im Halbleiterwerk Fab 30 in Dresden in fortschrittlicher Kupfer- statt Aluminiumverbindungstechnologie gefertigt. Dieser Athlon (Modell 2) enthält 37 Millionen Transistoren inklusive L2-Cache, und der 1 GHz-Typ nimmt dabei einen Strom von ca. 37 A auf, was entsprechend dimensionierte Netzteile und eine sehr gute Kühlung der CPU erfordert. Der Vorgänger ist der Athlon Modell 1 mit 22 Millionen Transistoren, der über einen extern aufgebauten L2-Cache verfügt und in üblicher Aluminiumverbindungstechnik in einem 0,25µm-Prozess hergestellt wird. Der 1 GHz-Modell 2-Typ »verbrät« dabei nur 33,6A, was aber ebenfalls einen ganz beachtlichen Stromverbrauch darstellt. Mittlerweile hat sich aus dem Athlon eine CPU-Familie mit unterschiedlichen Prozessoren gebildet, die im Einzelnen noch genau behandelt werden, zunächst jedoch die wesentlichen Kenndaten einer Athlon-CPU:
: : : : : : : : : :
Typenspektrum von 500 MHz bis zu 2,16 GHz (Stand Frühjahr 2003) drei unabhängige Integer-Pipelines drei unabhängige Address Calculation Pipelines die erste x86-kompatible superskalare CPU, die eine fully pipelined, out-of-order, DreiwegGleitkommaeinheit bietet Enhanced 3DNOW! bietet 24 neue Integer Multimedia-Befehle sowie die Unterstützung für DSP-Applikationen; aktuelle Athlon-CPUs (XP) implementieren stattdessen das gebräuchlichere SSE (von Intel) 200-MHz-, 266-MHz- oder auch 333-MHz-Systembus nach dem EV6-Protokoll 128 KByte Dual-ported L1-Cache maximaler L2-Cache von 512 KByte, der – je nach Version – mit dem vollen CPU-Takt oder auch im Verhältnis von 2:3, 1:2 oder 1:3 zum Systemtakt betrieben wird Die Athlon-Modelle ab dem Typ 2 arbeiten stets mit dem vollen CPU-Takt und weisen unterschiedliche L2-Cache-Größen von 256 KByte (Thunderbird) oder 64 KByte (Duron) auf. Der Cache-Controller, der maximal 8 MByte verwalten kann, ist stets On Die realisiert, während sich die L2-Cache-Chips auf der CPU-Platine (Cartridge) oder bei den neueren Athlons ebenfalls On Die befinden.
Der Athlon verwendet das bereits vom Pentium II her bekannte Gehäuse und auch den in mechanischer Hinsicht identisch aufgebauten Slot. Elektrisch gesehen sind der Slot-One von Intel und der Slot-A von AMD allerdings völlig unterschiedlich, so dass ein Athlon nicht in einem Pentium
Sandini Bib 478
Kapitel 14
III-Mainboard zu verwenden ist, und es werden für den Athlon auch spezielle Chipsets und demnach Mainboards benötigt.
Abb. 14.1: Der Athlon gleicht in der Bauform einem Pentium II.
Der erste Chipset stammt von AMD selbst, und seine Bezeichnung lautet Irongate. Die passenden Mainboards für den Athlon verfügen alle über die heute üblichen Features. Prinzipiell werkeln hier neben einer speziellen Northbridge lediglich die PC-üblichen Peripherieeinheiten, so dass hier durchaus eine Southbridge für eine Intel-CPU zum Einsatz kommen könnte.
Abb. 14.2: Der Athlon findet mit dem Irongate-Chipset ein geeignetes Umfeld.
Sandini Bib Athlon und Duron
479
14.1 Das Busprotokoll Intel verwendet zur CPU-Kommunikation das GTL+-Protokoll (Gunning Transceiver Logic) und AMD das EV6-Protokoll, das von der Firma Digital, die dieses Protokoll bereits seit Jahren für ihre Alpha-CPUs verwendet, für den Athlon lizenziert wurde. Der Athlon ist zunächst für einen Systemtakt von 200 MHz ausgelegt, was dadurch zu erreichen ist, dass auf beiden Seiten der Taktflanke gearbeitet wird (Double Data Rate). EV6 oder auch S2K, wie es bei AMD bezeichnet wird, ist sogar bis zu 400 MHz nutzbar, was somit auch genügend »Spiel« für Weiterentwicklungen bereitstellt und insbesondere für Multiprozessorsysteme geeignet ist. Die Busbandbreite beträgt bei 200 MHz etwa 1,6 GByte/s. Beim GTL+-Bus von Intel müssen sich die verwendeten Prozessoren die Busbandbreite teilen, während EV6 ähnlich wie ein Switch in einem Netzwerk arbeitet und eine (virtuelle) Punkt-zuPunkt-Verbindung zwischen einer CPU und dem Speicher herstellt. Jede Athlon-CPU hat in einem Multiprozessorsystem einen eigenen Backside-L2-Cache-Bus und somit jeweils eine eigene Verbindung zum Systembus. Elektrisch betrachtet arbeitet EV6 ähnlich wie GTL+, denn es werden Open-Drain-Signale und eine Signalterminierung realisiert. Die Eingänge werden als differentielle Receiver geschaltet, die ebenfalls eine Referenzspannung (Vref) benötigen. Diese Logik wird bei AMD auch als HSTL+ (High Speed Transistor Logic) bezeichnet. Mit Hilfe der (A)GTL+- oder HSTL+-Technik können wartende Bustransaktionen (Outstanding Transactions) einer CPU zwischengespeichert werden, wobei bei (A)GTL maximal 8 und bei HSTL+ 24 wartende Bustransaktionen pro Prozessor möglich sind.
14.2 Anschlüsse und Signale Logischerweise weichen die Signale und die Signalbelegung beim Slot A von der des Slot 1 von Intel ab. Beim Vergleich der beiden Signalbelegungen fällt auf, dass nahezu die Hälfte der 242 Kontakte des Slot A mit Masse- oder Core-Spannungssignalen belegt ist. Bei genauerer Betrachtung sucht man die 32 (4 GByte) oder 36 (64 GByte) Adressleitungen vergeblich. Die Funktion der Adressleitungen übernehmen die Ausgangssignale SADDOUT[14:2] (System Address Out), was erst einmal als recht wenig erscheint. Die Adresse muss mit Hilfe des Taktsignals SADDOUTCLK (System Address Output Clock) zusammengesetzt werden, was natürlich Zeit kostet, wenn die Adressen nicht aufeinander folgen, also kein Burst-Transfer stattfindet. Was auf den ersten Blick als Manko angesehen werden könnte, stellt sich jedoch nicht als leistungshemmend heraus, da Burst-Transfers, beispielsweise auf dem PCI-Bus oder auch dem AGP, recht häufig auftreten und die Adresse bei Speicherzugriffen ohnehin erst zusammengesetzt (für RAS und CAS) werden muss. Außerdem beträgt der adressierbare Adressbereich maximal 8 Terabyte, da hierfür 43 Bit zur Verfügung stehen.
Sandini Bib 480
Kapitel 14
Abb. 14.3: Die Signale des Athlons, nach Funktionsgruppen geordnet
Es gibt zudem Adressleitungen, die nicht als Ausgänge, sondern als Eingänge betrieben werden: SADDIN[14:2] (System Address In) und das dazugehörige Taktsignal SADDINCLK (System Address Input Clock). Sie werden verwendet, um festzustellen, ob eine andere CPU oder ein Busmaster auf eine Adresse zugreift, die der Athlon gerade im Cache enthält, was auch als Snooping bezeichnet wird.
Sandini Bib Athlon und Duron
Abb.14.4: Die Signalbelegung des Slot A
481
Sandini Bib 482
Abb.14.4: Die Signalbelegung des Slot A (Forts.)
Kapitel 14
Sandini Bib Athlon und Duron
Abb. 14.4: Die Signalbelegung des Slot A (Forts.)
483
Sandini Bib 484
Kapitel 14
Neben diesen Besonderheiten sind jedoch auch alte Bekannte bei den Signalen zu finden, wie das unsägliche A20M, Anschlüsse wie IGNNE und INIT oder auch die Signale für das PowerManagement. Im Folgenden möchte ich genauer auf die einzelnen Signale und deren Funktionen eingehen. A20M (I) Anschluss A21 Ist Address Mark 20 auf Low, wird das Adressbit intern maskiert (Address Wrap around für 8086, DOS). CLKFWDRST (I) Anschluss A105 Reset-Signal für das System und die CPU. CONNECT (I) Anschluss A103 Das Signal dient dem Power-Management. COREFB, COREFB (O) Anschlüsse A120, A121 Hiermit wird der Mainboard-Elektronik die aktuelle Core-Spannung bekannt gegeben. FERR (O) Anschluss A11 Signalisiert einen numerischen Fehler (Floating Point Error). FID[3:0] (O) Anschlüsse A116, A117, A118, A119 Die Frequency-Identification-Pins signalisieren der Mainboard-Elektronik den notwendigen Multiplikationsfaktor. Dies erfolgt unmittelbar nach einem Reset. Daraufhin reagiert die MainboardElektronik (Northbridge) mit einem so genannten Serial Initialization Packet (SIP), das mit Hilfe der Signale PRORDY, CONNECT und CLKWDRST ausgeführt wird, die sich synchron zu SYSCLK verhalten. Hiermit wird der Athlon dann entsprechend seiner vorgegebenen Taktfrequenz initialisiert. FID3
FID2
FID1
FID0
Multiplikator
0 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0
0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1
11 11,5 12 12,5 5 5,5 6 6,5 7 7,5 8 8,5
Tab. 14.1: Die Einstellung des Multiplikationsfaktors mit den FID-Signalen
Sandini Bib Athlon und Duron
485
FID3
FID2
FID1
FID0
Multiplikator
1 1 1 1
1 1 1 1
0 0 1 1
0 0 0 1
9 9,5 10 10,5
Tab. 14.1: Die Einstellung des Multiplikationsfaktors mit den FID-Signalen (Forts.)
IGNNE (I) Anschluss A19 Wenn Ignore Numeric Error aktiviert ist, werden numerische Fehler (der FP-Einheiten) vom Athlon ignoriert. INIT (I) Anschluss A12 Initialization, wirkt im Prinzip wie ein Reset, aber mit dem Unterschied, dass nur die IntegerRegister und nicht der Cache sowie und die Floating-Point-Register zurückgesetzt werden. INTR (I) Anschluss A15 Interrupt Request, Starten der Interrupt-Verarbeitung. NMI (I) Anschluss A13 Auslösen eines Non Maskable Interrupts. PICCLK (I), PICD[1:0] (I/O) Anschlüsse A3, A5, A7 Die Signale für den Advanced Programmable Interrupt Controller (APIC). PICCLK ist das Taktsignal, und PICD[0], PICD[1] stellen die Datenleitungen des APICs dar. Die Modell 1-Athlons (in Aluminiumverbindungstechnologie) verfügen allerdings nicht über einen APIC. PROCRDY (O) Anschluss A106 Ausgang für das Power-Management und die Taktsynchronisierung beim Reset. PWROK (I) Anschluss A111 Signalisiert der Mainboard-Elektronik, dass sich die Core-Spannung im spezifizierten Bereich befindet (Power OK). RESET (I) Anschluss A17 Initialisierung der CPU, Zurücksetzen aller Register und der Cache-Speicher. SADDIN[14:2] (I) Anschlüsse B116, B112, B120, B102, B109, B110, A97, A93, A95, B100, B107, B106, B104 Adresssignale (System Address Input) für den Empfang von Adressen. Sie werden für das Snooping und den System-Probe-Mode (Debugging) verwendet.
Sandini Bib 486
Kapitel 14
SADDINCLK (I) Anschluss B114 Das synchrone Taktsignal (System Address Input Clock) für SADDIN. SADDOUT[14:2] (O) Anschlüsse B1, B3, B8, A25, A23, B10, B11, B4, B14, B13, A27, B18, B16 Adresssignale (System Address Output) für die Ausgabe von Adressen im »Normalbetrieb« oder den System-Probe-Mode (Debugging). SADDOUTCLK (O) Anschluss B6 Das synchrone Taktsignal (System Address Output Clock) für die SADDOUT-Signale. SCHECK[7:0] (I) Anschlüsse B34, B22, B52, A51, A65, B71, A85, B83 Die System Check-Signale transportieren die ECC-Bits für die Daten über SDATA[63:0]. SDATA[63:0] (I/O) Anschlüsse B26; B30, A35, B32, B35, B37, B38, B42, A29, A31, B23, A33, A39, A37, B25, A41, B44, A45, B47, B48, B54, B55, B57, B58, B40, B45, A47, A43, A49, A53, A55, A57, A63, A61, A69, A70, A73, A72 A75, A77, B64, B62, B66, B68, B70, B73, B76, B78, A79, B95, B94, A83, B97, A89, B98, A87, B74, B80, B81, B84, B90, B86, A81, B92 Der bidirektionale 64-Bit-Datenbus (System Data). SDATAINCLK[3:0] (I) Anschlüsse B28, B50, A67, B88 Taktsignale (System Data Input Clock) für das Einlesen von Daten auf SDATA[63:0]. Jedes der vier Signale ist einem 16-Bit-Wort zugeordnet. SDATAINVAL (I) Anschluss A101 Signalisiert der CPU die Gültigkeit (System Data Input Valid) der angelegten Daten, die nun von der CPU übernommen werden können. Das Signal kann dazu verwendet werden, die Übertragung einer beliebigen Anzahl von 32 Bit breiten Daten auszulösen. SDATAOUTCLK[3:0] (O) Anschlüsse B20, A59, B60, A91 Die Taktsignale (System Data Output Clock) für die Ausgabe von Daten auf SDATA[63:0]. Jedes der vier Signale ist einem Wort (16 Bit) zugeordnet, was bei Aktivierung aller vier Signale zu einer 64 Bit breiten Übertragung führt. SDATAOUTVAL (I) Anschluss A99 Signalisiert der CPU die Gültigkeit (System Data Output Valid) der angelegten Daten, die nun von der CPU ausgegeben werden können. Das Signal kann dazu verwendet werden, die Übertragung einer beliebigen Anzahl von Quadwords (64 Bit, 8 Bytes) auszulösen. SFILLVAL (I) Anschluss B118 Die Mainboard-Elektronik signalisiert hiermit die Gültigkeit (System Fill Valid) eines Datentransfers.
Sandini Bib Athlon und Duron
487
SMI (I) Anschluss A9 Dient der Aktivierung des System Management Modes. STPCLK (I) Anschluss A18 Umschalten in einen niedrigeren Stromsparmodus (Stop Grant Special Cycle). SYSCLK, SYSCLK (I) Anschlüsse A109, A108 Die beiden differentiellen Takteingangssignale vom Mainboard-Taktgenerator. Vcc2SEL (O) Anschluss A1 Signalisiert der Mainboard-Elektronik die Core-Spannung für den L2-Cache. Bei einem High beträgt sie 2,5 V und bei einem Low 3,3 V. VID[3:0] (o) Anschlüsse A115, A114, A113, A112 Voltage Identification. Der Athlon signalisiert über diese Anschlüsse, welche CPU-Spannung benötigt wird. VID3
VID2
VID1
VID0
Vcc-Core
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
2,05 V 2V 1,95 V 1,9 V 1,85 V 1,8 V 1,75 V 1,7 V 1,65 V 1,6 V 1,55 V 1,5 V 1,45 V 1,4 V 1,35 V 1,3 V
Tab. 14.2: Die VID-Signale kennzeichnen die benötigte Core-Spannung.
14.3 Interner Aufbau Der Athlon beherrscht alle x86-Befehle bis hin zum Pentium III. Eine Ausnahme bilden die speziellen SSE-Befehle, denn hierfür besitzt der Athlon Enhanced 3DNOW!, das 3DNOW von 21 auf 45 Befehle erweitert. 19 dieser Befehle bilden in etwa die SSE-Befehle des Pentium III ab, während fünf neue Befehle als DSP-Befehle vorgesehen sind. Da 3DNOW! der unterschiedlichen Auslegungen jedoch von den Programmierern nur zögerlich unterstützt wurde, setzt AMD mit dem Athlon XP (siehe Kapitel 14.5) stattdessen ebenfalls SSE ein.
Sandini Bib 488
Kapitel 14
Der Athlon verwendet wie seine Vorgänger ROPs (RISC Operations, ab K5), setzt die x86-Befehle also in einfach strukturierte Befehle um, die nach einem RISC-Schema aufgebaut sind. Der Instruktionsdekoder (3-Way x86 Instruction Decoder) kann pro Takt gleich drei x86-Befehle dekodieren und diese auf die neun parallel arbeitenden Funktionseinheiten (IEU: Integer, AGU: Address Generation, ... MMX 3DNOW!) verteilen. Der Pentium III besitzt demgegenüber nur zwei parallel arbeitende X86-Dekoder. In der Instruction Control Unit kann der Athlon bis zu 72 ausdekodierte ROPs zwischenspeichern, der Pentium III nur 40 davon. Für seine beachtliche Rechenleistung kommen beim Athlon gleich drei voneinander unabhängige Gleitkommaeinheiten (FPUs) zum Einsatz, wobei diese jeweils auf eine bestimmte Rechenart spezialisiert und fully pipelined ausgeführt sind, also bereits nach einem Takt mit der Bearbeitung des nächsten Befehls beginnen können. FMUL ist für die Multiplikationen, FADD für Additionen und FStore im Wesentlichen für das Speichern von Gleitkommazahlen vorgesehen. Der Pentium III besitzt demgegenüber nur zwei FPUs – FADD und FMUL –, die jedoch nicht unabhängig voneinander arbeiten können, und daher verliert der Pentium III in dieser Rechendisziplin gegenüber dem Athlon.
Abb. 14.5: Der Athlon arbeitet mit drei unabhängigen Floating-Point-Units, die für Gleitkomma- und Multimediabefehle ausgelegt sind.
Der Cache-Controller befindet sich im Chip (Die) selbst und kann maximal eine Cache-Größe von 8 MByte verwalten. Der Athlon L1-Cache arbeitet zweifach assoziativ, Intels Pentium III hingegen vierfach assoziativ, wodurch die Anzahl der Cache-Misses minimiert wird. Der Vorteil des viermal größeren Athlon-L1-Cache (128 KByte) schmilzt dadurch etwas dahin. Beim L2-Cache sind die Gemeinsamkeiten zwischen Pentium III und Athlon auf den ersten Blick etwas größer. Beide arbeiten zweifach assoziativ mit dem halben Systemtakt und verfügen über eine Kapazität von 512 KByte oder über 256 KByte, wenn der volle Systemtakt verwendet wird,
Sandini Bib Athlon und Duron
489
wie es bei den Modellen der Fall ist, die den L2-Cache On Die (Pentium III-Coppermine von Intel bzw. Athlon-Thunderbird von AMD) besitzen. Allerdings findet die L2-Cache-Anbindung (L2Cache Data Path) beim Athlon über einen 64 Bit breiten Bus (ohne ECC gerechnet) und beim Pentium III über einen 256 Bit breiten Bus statt. Je höher der Systemtakt ist, desto stärker wirkt sich dieser Unterschied zu Lasten des Athlons aus, und hierin ist auch der wichtigste Grund zu sehen, warum eine vergleichbare Pentium III-CPU gegen einen Athlon nicht noch mehr an Boden verliert. Bei den Athlon 2-Modellen (Thunderbird) hat sich die L2-Cache-Organisation jedoch verbessert, denn der L2-Cache arbeitet hier 16fach assoziativ mit dem vollen Systemtakt. Die L2-Cache-Taktrate wird bei den Athlon-Modellen des Typs 1 ab 750 MHz unterschiedlich realisiert, wie in der Tabelle 14.3 angegeben ist. Takt
Modell
L2-Cache-Teiler
L2-Cache-Takt
Core-Spannung
500 MHz 550 MHz 600 MHz 650 MHz 700 MHz 750 MHz 800 MHz 850 MHz 900 MHz 1000 MHz
1, 2 1, 2 1, 2 1, 2 1, 2 2 2 2 2 2
2 2 2 2 2 2,5 2,5 2,5 2,5 3
250 MHz 275 MHz 300 MHz 325 MHz 350 MHz 300 MHz 320 MHz 340 MHz 360 MHz 333 MHz
1,6 V 1,6 V 1,6 V 1,6 V 1,6 V 1,6 V 1,7 V 1,7 V 1,7 V 1,8 V
Tab. 14.3: Wichtige Daten der Athlon-CPUs
14.4 CPUs für den Sockel A Der Weg, wie Intel ihn vom Slot 1 (zurück) zu einem Sockel (370-polig) beschritten hat, wird ebenfalls von AMD gegangen, wenn auch in einem wesentlich kürzeren Zeitabstand von nicht einmal einem Jahr. Die Gründe dafür sind in beiden Fällen die gleichen: Ein Sockeldesign ist preiswerter herzustellen, und wenn es möglich ist, den L2-Cache On Die zu realisieren, wird auch kein Slot-Design mehr benötigt. Bei den Athlons für den Sockel A hat AMD den Chipset- und Mainboard-Herstellern einige Freiheiten eingeräumt, wie die optionale Nutzung der Error Correction Codes oder auch die Möglichkeit, einen speziellen Debug-Port vorzusehen. Dieser ist zwar bereits beim Athlon-Slot 1 vorhanden, wurde von AMD aber erst bei der Sockelversion offiziell dokumentiert. Athlons für den Sockel A gibt es in zwei Versionen, die unter den Bezeichnungen Duron (SpitfireCore) und Thunderbird firmieren. Während es den Duron ausschließlich im Sockel A-Design gibt, wurde der Thunderbird in geringen Stückzahlen – und auch nur für eine Übergangszeit – ebenfalls im Slot A-Design ausgeliefert. Beide CPUs basieren auf dem gleichen Kern, und der einzige relevante Unterschied besteht darin, dass der Duron einen L2-Cache von 64 KByte und der Thunderbird einen von 256 KByte besitzt, der jeweils On Die realisiert ist. In beiden Fällen wird der L2-Cache über ein 64 Bit breites Interface angebunden, was nach wie vor (s.o.) als ein Kritikpunkt im Vergleich mit einem Pentium III angesehen werden kann, der hierfür ein 256 Byte breites Interface besitzt.
Sandini Bib 490
Kapitel 14
Abb. 14.6: Der AMD-Duron basiert auf dem Athlon-Kern und ist für einen Socket 462 (Sockel A) vorgesehen.
Die Core-Spannung für den Thunderbird beträgt – je nach Version (700 MHz, 750 MHz, 800 MHz, 850 MHz, 900 MHz, 950 MHz, 1000 MHz) – zwischen 1,7 V und 1,8 V, während der Duron (600 MHz, 650 MHz, 700 MHz) nur 1,5 V benötigt, wodurch er sich mit einer Leistungsaufnahme von 23 W (beim 700 MHz-Typ) begnügt. Der Duron stellt aber nicht – wie der Celeron im Vergleich zum Pentium III – einen abgemagerten Thunderbird dar, sondern wird in einem eigenen Silizium-Design gefertigt, verfügt also über eine kleinere Die-Fläche, ist somit preiswerter zu fertigen und ist auch stromsparender. Bei Intel macht es von der Kostenseite hingegen wohl keinen Unterschied, ob ein Pentium III oder ein Celeron III hergestellt wird, es wird im Grunde genommen stets der gleiche Chip gefertigt, nur wird beim Celeron der Systemtakt auf maximal begrenzt und ein Teil des L2-Cache »lahm gelegt«. Sowohl der Duron als auch der Thunderbird verwenden einen Systemtakt von 100 MHz, der als Double-Data-Rate (Triggerung auf beiden Taktflanken) arbeitet, was somit 200 MHz in der klassischen Sicht der Datenübertragung entspricht.
14.4.1 Anschlüsse und Signale Die Funktion der bereits beim Athlon im Slot A-Design beschriebenen Signale hat sich nicht wesentlich geändert, so dass ich mich hier nur auf neue oder eben geänderte Signalfunktionen beschränke. Der Sockel A für einen Athlon verfügt insgesamt über 462 Kontakte, die etwas »verstreut« angeordnet wirken, wie es in Abbildung 14.7 zu erkennen ist. Der Grund für diese Anordnung der Kontakte besteht z.T. darin, dass der gesockelte Athlon zwar ebenfalls das EV6-Protokoll bzw. die HSTLogic verwendet, allerdings verzichtet man auf diese Art der Signalterminierung bei den Typen für den Sockel A. Die Impedanz der Transceiver ist stattdessen an die des Mainboard-Designs anzupassen, um somit einen optimalen Signalverlauf realisieren zu können. Dies wird mit Hilfe so genannter Push-Pull-Driver erreicht, deren Impedanz an das Mainboard mit zwei externen Widerständen vollzogen wird, die an den ZN- (AC5) und den ZP-Pin (AE5) angeschlossen sind. Die beiden dazugehörigen Spannungsanschlüsse Vss_Z (AE7) und Vcc_Z (AC7) werden mit Vss bzw. Vcc_Core verbunden und wirken somit als Push-Pull-Kompensation. Die Push-Pull-Technologie unterscheidet sich also von der Open-Drain-Technologie, wie sie bei den Athlons im Slot A-Design zum Einsatz kommt.
Sandini Bib Athlon und Duron
491
Abb. 14.7: Der Sockel A für Athlons im SPGA-Gehäuse (Staggered Pin Grid Array)
Push-Pull erlaubt lediglich eine Punkt-zu-Punkt-Verbindung der Signale, und es können hier nicht mehrere Ausgangssignale mit einem Eingang verbunden werden, wie es bei Open-Drain möglich ist. Hierin ist auch der wesentliche Grund dafür zu sehen, warum ein Thunderbird im Slot A-Design nicht in einem Mainboard, das für die Vorgänger-Athlons vorgesehen ist, funktionieren muss. Dies klappt nur dann, wenn das Mainboard mit Punkt-zu-Punkt-Verbindungen realisiert ist und zudem auch die Treiberleistung des Chipsets ausreicht. Wie Sie anhand der Sockelbelegung in Abbildung 14.8 erkennen können, sind eine Vielzahl von Anschlüssen mit Vcc und Vss belegt, was für eine Signalabschirmung und Störungsunempfindlichkeit sorgen soll. Daneben sind einige Pins als NC (No Connection) bezeichnet, die zwar als Loch im Sockel ausgeführt sind, jedoch keinerlei elektrische Verbindung besitzen, was ebenfalls für die Key-Pins gilt, die für eine Kodierung verwendet werden sollen, damit in einen Sockel A nur bestimmte Athlon-CPUs eingesetzt werden können. CLKIN, CLKIN, RSTCLK, RSTCLK (I, I, O, O) Anschlüsse AN17, AL17, AN19, AL19 Diese Signale ersetzen gewissermaßen die beiden differentiellen Takteingangssignale (SYSCLK, SYSCLK) vom Mainboard-Taktgenerator. CLKIN wird mit RSTCLK verbunden und wirkt dann als SYSCLK, während CLKIN mit RSTCLK verbunden wird und als SYSCLK fungiert. DBRDY, DBREQ (O, I) Anschlüsse AA1, AA3 Signale des Athlon-eigenen Debug-Ports. DBRDY ist über einen Widerstand (Pull-Up) von 1k Ohm mit Vcc_Core verbunden. Mit Hilfe dieses Ports, der noch aus den verschiedenen PLLSignalen, FLUSH und weiteren Signalen besteht, sind einige interessante Manipulationen möglich, wie die Veränderung des Prozessortaktes, was von AMD natürlich nicht vorgesehen ist, sondern allein für den Test verwendet werden soll.
Sandini Bib 492
Kapitel 14
Abb. 14.8: Das Anschlussschema des Sockels A. Hier werden einige Abkürzungen verwendet: CLKFR=CLKWDRESET, CNNCT=CONNECT, K7CO=K7CLKOUT, PLBYP=PLLBYPASS, PLBYC=PLLBYPASSCLK, PLMN=PLLMON, PLTST=PLLTEST, PRCDRY=PROCREADY, RCLK=RSTCLK, SCNCK=SCANCLK, SCNINV=SCANINTEVAL, SCNSN=SCANNSHIFTEN, SAI=SADDIN, SAIC=SADDINCLK, SAO=SADDOUT, SAOCLK=SADDOUTCLK, SCK=SCHECK, SD=SDATA, SDIC=SDATAINCLK, SDINV=SDATAINVALID, SDOC=SDATAOUTCLK, SDOV=SDATAOUTVALID, SFIFFV=SFIFFVAL, SVRFM=SYSREFMODE, VCC=Vcc_Core, VREF_S=VREFSYS.
FLUSH (O) Anschluss AL3 Dieses Signal wird ebenfalls zum Debug-Port gerechnet und ist mit einem Widerstand von 1k Ohm mit Vcc_Core sowie direkt mit dem SMI-Signal verbunden. K7CLKOUT, K7CLKOUT (I/O) Anschlüsse AL21, AN21 Dieses differentielle Signal wird ebenfalls für den Debug-Mode verwendet und mit zwei Widerständen von je 100 Ohm gegen Vcc_Core und Vss terminiert. Wenn der Debug-Mode aktiv ist, wird die interne PLL abgeschaltet, und stattdessen wird eine externe PLL aktiviert, deren Signale mit K7CLKOUT verarbeitet werden, wobei K7CLKOUT auch als Eingang fungiert. Diese Betriebsart ist nicht identisch mit dem Modus, der mit Hilfe von PLLBYPASS=0 einzuschalten ist, denn dann wird der Athlon nur mit einer geringeren Frequenz betrieben, verwendet dabei jedoch nicht K7CLKOUT.
Sandini Bib Athlon und Duron
493
PLLTEST, PLLBYPASS, PLLMON1, PLLMON2 PLLBYPASSCLK, PLLBYPASSCLK (I, I, I, I, O, O) Anschlüsse AC3, AJ25, AN13, AL13, AN15, AL15 Diese Signale der CPU werden auf den Debug-Connector geführt, wenn er auf dem Mainboard vorgesehen ist. Hiermit ist beispielsweise die Manipulierung des CPU-Taktes möglich, was AMD aber nicht empfiehlt, denn dieser Port soll allein für Testzwecke bei den Herstellern zum Einsatz kommen. SYSVREFMODE (I) Anschluss AA5 Mit Hilfe dieses Signals kann eine Pegelverschiebung zwischen Vref und dem Pegel der InputBuffer der CPU festgelegt werden. In der Regel liegt dieser Anschluss über einen Widerstand von 1k Ohm auf Low-Potenzial, wodurch keine Verschiebung eingestellt ist. TCK, TMS, TDI, TRST, TDO (I, I, I, I, O) Anschlüsse Q1, Q3, U1, U3, U5 Die Signale für den JTAG-Boundaray-Scan-Test, den die Athlons ab der Modellreihe 2 sowie die CPUs von Intel beherrschen. VccA Anschluss AJ23 Diese Spannung ist für die Versorgung der internen PLL zuständig und liegt typischerweise zwischen 2,25 V und 2,75 V. VID[4:0] (O) Anschlüsse A115, A114, A113, A112 Voltage Identification. Der Athlon signalisiert über diese Anschlüsse, welche CPU-Spannung (VccCore) zu verwenden ist. Zu beachten ist dabei, dass es im Gegensatz zum Athlon im Slot-Design hier auch den Anschluss VID4 gibt und die Bedeutungen der anderen VID-Pins nicht mit denen der Slot A-Athlons identisch sind. VID4
VID3
VID2
VID1
VID0
Vcc-Core
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1,850 V 1,825 V 1,800 V 1,775 V 1,750 V 1,725 V 1,700 V 1,675 V 1,650 V 1,625 V 1,600 V 1,575 V 1,550 V 1,525 V 1,500 V 1,475 V 1,450 V
Tab. 14.4: Die VID-Signale für die Core-Spannung bei den sockelbasierten Athlons
Sandini Bib 494
Kapitel 14
VID4
VID3
VID2
VID1
VID0
Vcc-Core
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1,425 V 1,400 V 1,375 V 1,350 V 1,325 V 1,300 V 1,275 V 1,250 V 1,225 V 1,200 V 1,175 V 1,150 V 1,125 V 1,100 V keine CPU
Tab. 14.4: Die VID-Signale für die Core-Spannung bei den sockelbasierten Athlons (Forts.)
14.5 Athlon XP Als Intel mit dem Pentium 4 die 2-GHz-Marke überschritt, reagierte AMD mit dem Athlon XP. Die Bezeichnung hat laut AMD nichts mit Windows XP zu tun, sondern soll für eXtra Performance stehen. Mit dem bisher verwendeten CPU-Kern – dem Thunderbird – wird eine maximale Taktfrequenz von 1,4 GHz erreicht, was in Anbetracht der (höheren) Pentium 4-Taktraten als vergleichsweise zu gering am Markt angesehen werden konnte, weil CPUs mit hohen Taktraten nun einmal eine höhere Leistung suggerieren, was immer wieder gern als Verkaufsargument verwendet wird. Die CPU-Leistung ergibt sich aus dem Produkt von Taktfrequenz und Anzahl der pro Taktschritt zu verarbeitenden Befehle (IPC: Instructions per Cycle). Statt der tatsächlichen Taktfrequenz einer Athlon XP-CPU gibt AMD daher nun ein Performance Rating an. Der jeweilige Wert soll dabei für die gleichwertige Rechenleistung einer demgegenüber höher getakteten Pentium 4-CPU stehen. Dieses Prinzip hat AMD bereits mit dem K5 (vgl. Kapitel 11.2.1) erstmalig angewendet, um die Gleichwertigkeit gegenüber einem Intel-Pentium zu signalisieren, was auch als Pentium Rating (PR) bekannt ist. Weniger die Tatsache, dass die »Takt-Jumperung« abweichend von der CPU-Bezeichnung durchzuführen ist, hat sich als eher schwer vermittelbar dargestellt, sondern vielmehr der Umstand, dass diese Gleichwertigkeit nicht immer gegeben ist. Insbesondere die Firma Cyrix (6x86, MII), die ebenfalls das PR bei ihren Pentium-kompatiblen CPUs verwendete, hat es mit ihren kompatiblen Leistungsangaben nicht so genau genommen, so dass das Pentium Rating in Verruf gekommen ist. AMD hat sich daher mit dem K6 von diesem Prinzip wieder verabschiedet und ist zur Angabe der tatsächlichen Taktfrequenz zurückgekehrt. Beim Athlon XP erweckt das Performance Rating daher möglicherweise unschöne Erwartungen, allerdings konnten ausführliche Leistungsmessungen diese Befürchtungen bisher nicht bestätigen, und ein Athlon XP 2000+, der einen internen Takt von 1,66 GHz vorsieht, kommt summa summarum tatsächlich auf die Leistung eines Intel-Pentium 4 mit einem Takt von 2 GHz, so dass man zurzeit von stimmigen und teilweise sogar eher zurückhaltenden PR-Angaben seitens AMD ausgehen kann.
Sandini Bib Athlon und Duron
495
Der erste Athlon XP besitzt statt des Thunderbird-Kerns den Palomino-Kern (beide in 0,18µmTechnologie), der mit einigen Verbesserungen aufwarten kann, was zu einer um 20% höheren Leistung und um 20% geringeren Verlustleitung bei gleicher Taktfrequenz führt. Die XP-Neuerungen fasst AMD unter der Bezeichnung Quanti Speed zusammen. Sie betreffen in erster Linie erweiterte Translation Lookaside Buffers (z.B. Erweiterung von 32 auf 40 Einträge), einen DatenHardware-Prefetch (Optimierung der Sprungvorhersage) sowie die Integration von 3DNOW! Professionell, was genau dem SSE-Befehlssatz der Intel-CPUs entspricht. SSE2 ist bisher allein im Pentium 4 verwirklicht, so dass die Software-Hersteller mit dem Einsatz von SSE eine recht optimale und zudem breite Unterstützung für alle anderen aktuellen Intel- und auch AMD-Mikroprozessoren bieten können. Als elektrische Neuerung verfügt der Athlon XP über eine eingebaute Thermal-Diode für die genauere Messung der Chip-Temperatur. Der Die darf eine maximale Temperatur von 90°C nicht überschreiten, wobei das Mainboard – bzw. Chipset und BIOS – diese Messmöglichkeit unterstützen muss, um im Bedarfsfall die CPU abschalten zu können. Eine eigenständig arbeitende Überhitzungsabschaltung, wie etwa beim Pentium 4, gibt es beim Athlon XP nicht. Außerdem wird nunmehr ein Systembus-Takt von 100 MHz statt 133 MHz benötigt, was als FSB266 bezeichnet wird, da sich das DDR-Prinzip, wie oben erläutert, dahinter verbirgt. Bei genauerer Betrachtung der Tabelle 14.1 (FID-Signale) kann man feststellen, dass AMD keinen Multiplikator größer als x12,5 definiert hat, was bei 100 MHz zu einem maximalen CPU-Takt von 1,250 GHz und bei einem Systemtakt von 133 MHz zu einer maximalen CPU-Frequenz von 1662,5 MHz führt. Wie aber CPUs, die einen höheren Takt benötigen, korrekt eingestellt werden, ist nicht eindeutig definiert. Wie Tabelle 14.5 zeigt, ist man mit dem Systemtakt mittlerweile bei FSB333 angelangt, was demnach (x12,5) eine maximale CPU-Taktfrequenz von lediglich 2075 MHz bedeuten würde. Gleichwohl liegen einige CPU-Typen eben über diesen Maximalwerten, was Multiplikatoren von mindestens bis x13,5 zur Folge hat. Die Bedeutung der FID-Pins ist daher einige Male geändert worden, so dass es Aufgabe der BIOS- bzw. Mainboard-Hersteller ist, diesem Umstand Rechnung zu tragen, damit die CPUs korrekt eingestellt werden. Typ
Takt
Systembus
Transistoren
Herstellung
K7, Modell 1 K75, Modell 2 Thunderbird Palomino
500 MHz ...700 MHz 750 MHz ...1 GHz 1 GHz ...1,4 GHz 1,33 GHz ... 1,733 GHz (XP 1500+ ... XP 2100+) 1,8 GHz (XP 2200+) 2 GHz ... 2,25 GHz (XP 2400+ ... XP 2800+) ab 2,167 GHz (XP 3000+)
FSB 200 FSB 200 FSB 200, FSB 266 FSB 266
22 Mio 22 Mio 37 Mio 37,5 Mio
0,25 µm 0,18 µm 0,18 µm 0,18 µm
FSB 266 FSB 266, FSB 333
37,2 Mio 37,2 Mio
0,13 µm 0,13 µm
FSB 333
54,3 Mio
0,13 µm
Thoroughbred Thoroughbred-B Barton
Tab. 14.5: Die Daten der Athlon-CPU-Familie (XP=Quanti-Speed-Bezeichnung)
Der im Athlon XP verwendete Palomino-Kern wird auch im Mobile Athlon 4 für Notebooks und unter der Bezeichnung Morgan im Duron (ab 1 GHz, mit nur 64 KByte L2-Cache) eingesetzt sowie auch im multiprozessor-fähigen Athlon MP. Als Nachfolger des Athlon XP mit Palomino-Kern kommt der Thoroughbred-Kern in 0,13µmTechnologie zum Einsatz, der sich bis maximal 2,25 GHz (B-Typ, siehe Tabelle 14.5) takten lässt. Er benötigt geringere Core-Spannungen (1,5 V – 1,65 V) und bietet außer einem höheren Takt aus Anwendersicht ansonsten keine Verbesserungen gegenüber dem Athon XP mit Palomino-Kern.
Sandini Bib 496
Kapitel 14
Die Bezeichnung erfolgt dabei ebenfalls laut Quanti-Speed-Nomenklatur; beispielsweise arbeitet der XP2400+ mit 2 GHz. Laut AMD soll die letzte Version für den Sockel A ein Athlon mit Barton-Core sein, der nunmehr einen FSB333 (166 MHz) voraussetzt. Der Performance-Schub gegenüber dem Vorgänger ergibt sich aber durch den auf 512 KByte vergrößerten L2-Cache, was für den Anstieg der Transistoranzahl verantwortlich ist. Andere grundlegende Veränderungen sind jedoch nicht zu finden. Augenscheinlich hält AMD schon erstaunlich lang am Sockel A fest, gleichwohl hat die laufende Taktanhebung des FSB sowie die Reduzierung der Core-Spannung zur Folge, dass sich diese Dinge eben (meist) nicht per BIOS-Update anpassen lassen und ein neues Mainboard anzuschaffen ist, wie es bei Intel-CPUs ja auch der Fall ist.
Sandini Bib
15
Pentium 4
Mit dem Pentium 4 hat Intel das erste Mal seit dem PentiumPro einige recht grundlegende Architekturmerkmale gegenüber den Vorgängern (Kapitel 13) verändert. Unter dem Begriff Netburst werden diese Neuerungen subsummiert. Die Netburst-Architektur ist explizit für sehr hohe Taktraten konzipiert, entspricht aber nach wie vor der Intel 32-Bit-Technologie (IA-32). Die wesentlichen neuen Eigenschaften seien hier zunächst kurz angeführt:
: : : : : : :
Typenspektrum von 1,4 GHz bis zu 3,06 GHz (Stand Frühjahr 2003) Quad Pumped Bus, Datenübertragung in Quad Data Rate (QDR) Hyper Pipelined Technology, verdoppelt die Integer-Pipeline-Tiefe auf 20 Stufen Rapid Execution Engine, das Rechenwerk besteht nunmehr aus sieben Funktionseinheiten SIMD Extensions 2, SSE2 integriert 144 neue Befehle (Multimedia) für Integer- und Floating Point-Operationen Komplette Überarbeitung des L1- und des L2-Cache Hyper-Threading ab dem 3,06-GHz-Typ
Der Pentium 4 tritt seit Anfang des Jahres 2001 die Nachfolge des Pentium III an, und die Einstiegsfrequenz liegt – wie gewohnt – genau dort, wo der Pentium III am Ende zu sein scheint, bei 1,4 GHz. Die erste Pentium 4-Generation verwendet ein Gehäuse mit 423 Pins (PPGA), die folgende eines mit 478 Pins (µPGA, Micro Pin Grid Array). Der µPGA-Sockel ist nur mechanisch kleiner ausgeführt – obwohl er mehr Anschlüsse besitzt –, es werden bei beiden Sockeltypen aber prinzipiell dieselben Signale verwendet. Laut Intel liegt der Grund für den recht schnellen Übergang zu einem verkleinerten Sockel darin, dass sich derjenige mit 423 Pins für die anvisierten hohen Taktraten als nicht geeignet erwies. So wenig Weitsicht hatte man Intel vielleicht nicht zugetraut, doch derartige »Starthemmungen« kennt man ja bereits vom ersten Pentium (P60) und auch vom PentiumPro.
Abb. 15.1: Der Pentium 4 im Gehäuse für den 478-poligen µPGA-Sockel. Wie bereits beim Pentium III liegt der Die unter einem Heat Spreader, was für eine verbesserte Wärmeabfuhr sorgt.
Wie bei jedem Einstieg in eine neue Architektur stellt die erste CPU einer neuen Generation die vorhergehende leistungstechnisch gesehen außerdem keineswegs in den Schatten, sondern hinkt
Sandini Bib 498
Kapitel 15
in einigen Disziplinen dieser sogar hinterher. So war es beim Übergang vom 486DX zum Pentium, beim Übergang vom Pentium zum PentiumPro, und so ist es eben auch beim Übergang vom Pentium III zum Pentium 4. Vielmehr wird mit einer neuen CPU-Generation der Grundstock dafür gelegt, dass die daraus mit der Zeit entstehenden, in Details verbesserten und optimierten Abkömmlinge die vorherigen Systeme zum »alten Eisen« werden lassen. Im Laufe der Zeit ist eben auch genau dies mit den Pentium 4-Prozessoren passiert, wie noch erläutert wird.
15.1 Interner Aufbau Der erste P4-Kern arbeitet mit 42 Millionen Transistoren, er wird als Willamette bezeichnet und ist in 0,18µm-Technologie gefertigt. Der Nachfolger Northwood wird in einem 0,13µm-Prozess ab 2 GHz hergestellt. Dieser CPU-Typ führt zur Kennzeichnung ein »A« in der Bezeichnung und besitzt gegenüber dem Vorgänger einen auf 512 KByte verdoppelten L2-Cache.
15.1.1 Caches Der L2-Cache ist mit im Die integriert, er hat eine Kapazität von 256 KByte oder eben auch 512 KByte und erlaubt eine höhere Transferrate als bei den Vorgänger-CPUs, was zu der Bezeichnung Advanced Transfer Cache führt. Die Cache-Lines sind mit 128 Byte viermal so lang ausgeführt wie beim Pentium III. 64 Bit Datenbus
TLB Translation Lookaside Buffer
256 Bit
Businterface
Sprungvorhersage
BTB
36 Bit Adressbus
Quad Pumped
Branch Trace Buffer
Instruction Fetch Unit 64 Bit
x86-Decoder, µOPs
TEC Trace Excecution Cache für 12.000 µOPS mit Branch Prediction Unit
L1-Befehls-Cache
Microcode ROM und Sequenzer L2-Cache 256 kByte
Scheduler Integer Port 0
ResultBus
A L U
Port 1
A L U
Port 2
Port 3
Slow
Load
A L U
Store
A G U
A G U
Floating Point Port 1
Port 0
FP-Unit: FSTORE FMOV
L1-Daten-Cache 8 kByte
Abb. 15.2: Blockdiagramm des Pentium 4
FP-Unit: FMUL FADD
ResultBus
MMX SSE2
256 Bit
Sandini Bib Pentium 4
499
Der L1-Daten-Cache verfügt nur über eine Kapazität von 8 KByte, und für den L1-Befehls-Cache wird nicht direkt die Kapazität, sondern die Anzahl der hier zu speichernden µOps angegeben, was ca. 12.000 sein sollte. Dies stellt eine ganz wesentliche Neuerung dar, die als Trace Excecution Cache (TEC) bezeichnet wird. Im Gegensatz zu den vorherigen CPUs befindet sich die Pipeline, an die denen sich die Rechenwerke anschließen, hinter diesem TEC, so dass der in die µOPS übersetzte x86-Code nicht erneut dekodiert werden muss. Der TEC verfügt über eine eigene Sprungvorhersageeinheit (Branch Prediction Unit: BPU) mit einem entsprechenden Speicher (BTB: Branch Trace Buffer), der unabhängig von der üblichen x86-Sprungvorhersageeinheit (BTB: 4 KByte) arbeitet.
15.1.2 Rechenwerke und Pipelines Das Rechenwerk, das als Rapid Execution Engine firmiert, besteht aus sieben Funktionseinheiten: drei ALUs (Arithmetic Logical Unit), zwei AGUs (Address Generation Units) für Load und Store einer FP-Unit (Floating Point) und einer FPU, die auch für MMX und SSE2 zuständig ist. Die ALUs und AGUs sind dabei an den jeweiligen Ports als Double Pumped ausgeführt, d.h., diese Einheiten sind doppelt vorhanden und werden über einen Multiplexer abwechselnd bedient, was bei Intel zu der Angabe führt, dass die ALUs mit dem doppelten Core-Takt arbeiten können, was genau genommen aber nur für die vorgeschalteten Multiplexer gilt. Die µOPS werden vom Scheduler parallel auf diese Funktionseinheiten verteilt. Stufen
Netburst-Architektur (Pentium 4)
P6-Architektur (ab PentiumPro)
PentiumArchitektur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
TC Nxt IP TC Nxt IP TC Fetch TC Fetch Drive Alloc Rename Rename Queue Schedule Schedule Schedule Dispatch Dispatch Reg. File Reg. File Excecute Flags Branch Check Drive
Fetch Fetch Decode Decode Decode Rename ROB-Rd Rdy/Sch Dispatch Excecute
Prefetch Decode Decode Excecute Write-Back
Abb. 15.3: Die Integer-Pipelines bei den Intel-Architekturen
Die Integer-Pipeline-Tiefe wird mit dem Pentium 4 auf 20 Stufen erhöht (Hyper Pipelined Technology), was die Logik und die Behandlung von Verzweigungen zwar verkompliziert, jedoch die Verarbeitung der µOPS maßgeblich beschleunigt. In Abbildung 15.3 erkennen Sie zum Vergleich den Aufbau der Integer-Pipelines bei den verschiedenen Intel-Architekturen. Für die Floating
Sandini Bib 500
Kapitel 15
Point-Operationen wird von Intel für den Pentium 4 jedoch keine Pipeline-Tiefe angegeben, beim Athlon ist es eine von 15. Insgesamt können 126 µOPS bei der Netburst-Architektur gleichzeitig verarbeitet werden, wobei dies bis zu 48 Loads und 24 Stores sein können, was der dreifachen Menge entspricht, wie sie bei der P6-Architektur möglich ist. Eine Besonderheit stellen die Stufen Drive (vgl. Abbildung 15.3) bei der Netburst-Architektur dar, womit die Signallaufzeiten des Chips bei der Verarbeitung der Pipeline mit berücksichtigt werden.
15.1.3 SSE2 Mit dem Pentium 4 werden 144 neue Befehle (Multimedia) für Integer- und Floating Point-Operationen sowie für das Speicher-Management implementiert, was als SSE2-Befehlssatz (Streaming SIMD Extensions) ausgewiesen wird. Die meisten dieser neuen Befehle stellen sich jedoch bei genauerer Betrachtung lediglich als 128-Bit-Implementierungen von bereits existierenden MMX- und SSE-Befehlen dar, die zuvor mit 64 Bit realisiert worden sind. Wie beim alten MMX oder auch bei 3DNOW! von AMD profitieren Programme jedoch nicht automatisch von derartigen Befehlserweiterungen, sie müssen von den Software-Herstellern entsprechend eingesetzt werden. Immerhin steht mit dem Vorgänger SSE nunmehr eine einheitliche Befehlsplattform für Pentium III und auch Athlon XP zur Verfügung, so dass SSE2 bisher allein für den Pentium 4 zum Einsatz kommt.
15.1.4 Businterface und Speicher Das Businterface wird als Quad Pumped ausgewiesen. Der Systemtakt entspricht prinzipiell einer Frequenz von 100 MHz oder auch 133 MHz, wobei die Daten auf den ansteigenden und abfallenden Signalflanken differentieller Taktsignale unter Zuhilfenahme zweier Strobe-Signale (DSTBP, DSTBN) verarbeitet werden. Dies führt somit zu einer Kennzeichnung als FSB400 oder FSB533. Zu beachten ist dabei, dass die Speicheranbindung jedoch im DDR-Verfahren (Double Data Rate) stattfindet.
Abb. 15.4: In einem Taktzyklus werden vier Datenbytes (QDR) übertragen.
Der erste für den Pentium 4 erhältliche Chipset trägt die Bezeichnung i850 und verlangt RAMBus-Module (RIMMs, siehe Kapitel 16.2.5). Ein Mainboard mit diesem Chipset benötigt ein neues ATX-Netzteil mit zusätzlichem ATX12 V- und AUX-Anschluss für 3,3 V und 5 V sowie auch ein neues PC-Gehäuse. Außerdem ist für den riesigen Kühlkörper eine spezielle Halterung notwendig, die durch das Mainboard hindurch mit dem ATX-Gehäuse zu verschrauben ist.
Sandini Bib Pentium 4
501
Mit der Einführung des µPGA-Sockels (478 Pins) und der hierfür passenden CPU mit Northwood-Kern sind jedoch einige Vereinfachungen des »CPU-Umfeldes« möglich. Der spezielle ATX12 V- und der AUX-Netzteilanschluss sind jetzt keine unabdingbare Voraussetzung mehr, und einige aktuelle Mainboards stellen diese daher auch nicht mehr zur Verfügung. Eine Leistung von 300 W mit ca. 12 A bei 12 V und 5,2 A bei 5 V und 3,3 V sollte das ATX-Netzteil schon bieten, denn im schlimmsten Fall kann der Pentium 4 mit 2 GHz laut Intel über 75 W »verbraten«. Die CPU soll nunmehr allein aus den 12 V gespeist werden, so dass dann der AUXAnschluss mit 3,3 V und 5 V eigentlich nicht mehr notwendig ist. Die Spannungsregler auf dem Mainboard setzen die 12 V-Spannung entsprechend auf die jeweils benötigte CPU-Spannung von z.B. 1,6 V um, was einen Strom von bis zu 8 A beim 12 V-Anschluss zur Folge hat. Während die Kabel hierfür durchaus noch geeignet sind, ist der ATX-Spannungsanschluss aber nur für maximal 6 A spezifiziert, so dass es doch sicherer erscheint, wenn zumindest der ATX12 VAnschluss vorhanden ist. Außerdem wurde auch die Halterung für den Kühler verändert, der nunmehr nicht mit dem ATX-Gehäuse verschraubt werden muss, so dass die entsprechenden Mainboards jetzt auch in übliche ATX-Gehäuse passen sollten. Damit die Transferleistung von 3,2 GByte möglich wird, die ein P4 mit einem mit 100 MHz (FSB400) getakteten Bus (theoretisch) erreichen kann, sind beim i850-Chipset zwei RAMBusKanäle notwendig. Pro Kanal ergibt sich eine Transferrate von 1,6 GByte/s (100 MHz x 8 Bit x 2), da die Speicheranbindung nach dem Double-Data-Rate-Prinzip erfolgt. Obwohl Intel eine Zeitlang preislich recht interessante Bundles, bestehend aus P4-CPU, Mainboard und RAMBusSpeicher, für seine Vertragshändler offeriert hat, konnte man die Pentium 4-CPU nicht wie gewünscht im PC-Markt etablieren, was letztendlich an den zwar leistungsfähigen, aber einfach zu teuren RAMBus-Speichern liegt. Aus diesem Grunde wurde (nach einigem Zögern) von Intel ein P4-Chipset entwickelt, der herkömmliche SDRAMs mit 133 MHz und sogar auch noch mit 100 MHz unterstützt, der i845 (Brookdale). Die Speichertransferrate sinkt dadurch zwar auf ca. 1 GByte/s ab, was aber nichts daran ändert, dass erst ab diesem technologischen (Rück-) Schritt der Pentium 4 auf dem Markt in Fahrt kam. Neuere Versionen des i845-Chipset sind für DDR-SDRAM vorgesehen (PC2100, PC2700), wobei auch noch ein Chipset (i850E) für RAM-Bus-Speicher (PC800, PC1066) entwickelt wurde. Während bei RAMBus zwei Speicherkanäle von Anfang an üblich sind, ist erst im Jahre 2003 der erste Intel-Chipset (E7205), der zwei DDR-SDRAM-Kanäle bietet, auf den Markt gekommen. Mit dem E7205 und zwei DDR-Modulen laut PC2100 (133 MHz x 8 Bit x 2) sind dann auch die 4,3 GByte/s zu schaffen, die für einen Pentium 4 mit FSB533 notwendig sind, damit er nicht unnötig von der »Speicherseite« her ausgebremst wird. Der Einsatz einer Pentium 4-CPU mit Hyper Threading (siehe Kapitel 15.1.5) setzt eine spezielle BIOS-Erweiterung voraus, so dass diese CPU nicht in jedem hierfür geeigneten Pentium 4-Mainboard lauffähig ist. Details zu den hier erwähnten Chipsets finden Sie in Kapitel 17 und Details zu den Speichertypen in Kapitel 16.
15.1.5 Hyper Threading Eine Dual- oder Multiprozessor-Fähigkeit bietet der Pentium 4 nicht, dies ist den neueren XEON MP-Typen vorbehalten, die ebenfalls die NetBurst-Architektur verwenden. In diesen CPUs ist auch erstmalig das Hyper Threading implementiert worden, das ebenfalls ab der Pentium 4-CPU mit 3,06 GHz zum Einsatz kommt. Bekannt ist dieses Prinzip schon etwas länger unter dem Begriff Simultanuous Multi-Threading (SMT), und beim Pentium 4 wird dies eben als Hyper Threading (HT) bezeichnet, weil mit dem Begriff Hyper im Augenblick nun einmal Höchstleitung (Hyper Pipelined, Hypertransport etc.)
Sandini Bib 502
Kapitel 15
signalisiert werden soll. Ob nun SMT oder HT, das Prinzip ist das Gleiche, nämlich dass mehrere (logische) CPUs in einem einzigen Chip zusammengefasst werden. Ausgesprochene Multiprozessorsysteme (Symmetric Multi-Processing, SMP) sind nichts Neues und generell recht teuer, da hierfür zumeist spezielle CPUs und Chipsets notwendig sind. Allerdings ist die Parallelverarbeitung ein probates Mittel für eine leistungssteigernde Rechenleistung. Zu beachten ist der (kleine) Unterschied in den Bezeichnungen von SMP und SMT: Symmetric (SMP) und Simultanuous (SMT), was bedeutet, dass man es bei SMP mit mehreren gleichwertigen Prozessoren zu tun hat, während es sich bei SMT um mehrere logische CPUs (in einem Chip) handelt. Dies hat zwar leistungstechnische Unterschiede zur Folge, die bei optimaler Programmierung zu Gunsten von SMP ausfallen sollten, gleichwohl gibt es dabei eine Vielzahl von Randbedingungen zu beachten, die hier aber nicht weiter von Belang sein sollen. Jeder Prozess, der von einer CPU zu bearbeiten ist, besteht bei aktuellen Betriebssystemen mindestens aus einem primären Thread, der selbst weitere Threads erzeugen kann, die unabhängig voneinander Befehle ausführen können. Jedem Thread wird vom Betriebssystem dynamisch eine bestimmte CPU-Zeit (z.B. 20 ms) für die Ausführung zugeteilt. Die hierfür jeweils benötigen Zustände wie Register- und Stack-Inhalte werden durch den Thread selbst repräsentiert, und das Betriebssystem schaltet zwischen den einzelnen Threads, die eben für die Bearbeitung eines Prozesses benötigt werden, quasi hin und her. In dieser Zeit kann die CPU keine weiteren Aufgaben erledigen, und je nach Anwendung konkurrieren mehrere Threads um die Ausführung auf einer CPU. Eine Lösung dieses Problems ist durch die Verwendung mehrerer CPUs möglich, so dass die Threads dann entsprechend auf diese verteilt werden können. Im Pentium 4 (ab 3,06 GHz) sind es zwei CPUs, die relativ unabhängig voneinander arbeiten können, und der technische Trick ist dabei, dass hier nicht zwei komplette CPUs zusammengefasst werden, sondern dem Die nur einige Einheiten hinzugefügt werden. Dies soll lediglich ein Prozent an zusätzlichen Transistoren gegenüber einer üblichen Pentium 4-CPU erfordern, was technisch und damit wohl auch preislich für einen Desktop-Prozessor vertretbar erscheint. Diese HT-Erweiterung betrifft im Wesentlichen einen Registersatz, einen APIC, sowie zusätzliche Instruction-Pointer- und -Buffer-Einheiten. Alles andere wie die Caches und die Rechenwerke bleibt unverändert. Sie werden von den beiden logischen Prozessoren gemeinsam verwendet. Demnach hat man es hier nicht mit einem »richtigen« Dual-Prozessor-System zu tun, sondern es stellt sich nur als ein solches für das Betriebssystem (ab Linux-Kernel 2.4.18, Windows XP) und die Software dar. Wie bei SSE müssen Programme aber explizit für HT ausgelegt sein, so dass man nicht automatisch den maximalen Nutzen aus HT ziehen kann. Allerdings ist auch ohne spezielle Software-Anpassungen unmittelbar ein Leistungsgewinn mit Hyper Threading feststellbar, denn es ergeben sich schnellere Antwortzeiten des Systems, etwa. Wenn ein HT-Prozessor z.B. auf eingehende Daten wartet, kann der andere bereits auf Benutzereingaben reagieren. Die reine CPU-Rechenleistung ist jedoch die gleiche, ob nun mit oder ohne HT, weil die Rechenwerke und Caches eben nur einmal vorhanden sind. Aus diesem Grunde wird im Prinzip sogar mehr Zeit für die Bearbeitung eines Threads benötigt, gleichwohl summiert sich das Ergebnis aus zwei Threads zu einer Leistungssteigerung, die sich auf ca. 30 Prozent belaufen kann. Leistungshemmende CPU-Wartezeiten ergeben sich eher nicht durch die Rechenwerke, sondern in erster Linie durch das Lesen der Daten aus dem Speicher, durch die Dekodierung der Befehle in µops mit der Abspeicherung im TEC sowie auch durch eine uneffektive Ausnutzung der Pipelines. Hyper Threading sorgt durch den Parallelbetrieb also dafür, dass diese Wartezeiten geringer ausfallen und die einzelnen CPU-Einheiten besser ausgelastet werden.
Sandini Bib Pentium 4
503
Abb. 15.5: Die Belegung der Pipeline durch einen Thread zeigt, dass diese nicht optimal ausgenutzt wird. Die hellen Felder repräsentieren dabei ungenutzte Bereiche, die minimiert werden, wenn zwei Threads durch die Pipeline verarbeitet werden können, wie es mit Hyper Threading möglich ist.
15.2 Anschlüsse und Signale
Abb. 15.6: Die Anschlüsse des Pentium 4 von der Unterseite her gesehen
Sandini Bib 504
Kapitel 15
Die internen Modifizierungen beim Pentium 4 gegenüber den Vorgängermodellen weisen extern, d.h. bei den Signalen und deren Bedeutungen, keine gravierenden Veränderungen auf. Allein das Quad Pumped Interface und die fehlende Multiprozessorunterstützung sind hier die markanten Unterschiede. Wie es zu erwarten war, werden »Altlasten« (mit Rücksicht auf 8086-Programme bzw. DOS) wie A20M und FERR aus Kompatibilitätsgründen auch vom Pentium 4 weiterhin unterstützt. Viele der Pentium 4-Signale haben eine ähnliche oder sogar völlig identische Bedeutung und Funktion wie beim PentiumPro, so dass Sie auch in Kapitel 12 nachschlagen können, um bestimmte Zusammenhänge noch einmal zu vertiefen. Wie erwähnt, sind die Signale beim älteren Pentium 4 mit 423 Pins die gleichen wie es beim neueren mit 478 Pins der Fall ist. Die Pentium 4-CPUs bis hin zu einer Taktfrequenz von 2 GHz (Willamette) kann es prinzipiell für beide Sockelausführungen geben, wobei jedoch alle neueren für den 478-poligen µPGASockel ausgelegt sind. Daher waren Pentium 4-Käufer der ersten Stunde (mal wieder) schlecht beraten, denn eine Aufrüstung auf einen schnelleren P4-Prozessor ist mit einem Mainboard, das über den 423-poligen Sockel verfügt, eben nicht möglich. Die im Folgenden angegebenen Anschlussnummern beziehen sich aber auf den aktuellen Typ. A35–A3 (I/O) Anschlüsse AB1, Y1, W2, V3, U4, T5, W1, R6, V2, T4, U3 P6, U1, T2, R3, P4, P3, R2, T1, N5, N4, N2, M1, N1, M3, M3, L2, M6, L3, K1, L6, K4, K2 Der Adressbus des Pentium 4. Der adressierbare Speicherbereich beträgt 236 Byte. Es gibt zwei Adressphasen: In der ersten wird die Adresse der Transaktion übertragen und in der zweiten die Information über den Typ (Transaction Type). Die Adresssignale werden in zwei Request-Takten übertragen, wobei die beiden AP-Signale (AP[1:0]) der Paritätsprüfung dienen. A20M (I) Anschluss C6 Ist Address Mark 20 auf Low, wird das Adressbit intern maskiert (Address Wrap around für 8086, DOS). ADS (I/O) Anschluss G1 Address Strobe wird bei einem gültigen Adress-Zyklus (AD[35:3], REQ[4.0]) auf dem Adressbus ausgelöst. ADSTB [1:0] (I/O) Anschlüsse R5, L5 Diese Address Strobe-Signale dienen zur Übernahme der Adressen, jeweils auf abfallenden und ansteigenden Signalflanken: REQ[4:0] , A[16:3] A[35:17]
ADSTB0 ADSTB1
AP[1:0] (I/O) Anschlüsse V5, AC1 Die Address Parity-Signale verarbeiten die Parity-Daten des Adressbus; High bei gerader und Low bei ungerader Parität.
Sandini Bib Pentium 4
505
Request
Phase1
Phase2
A[35:24] A[23:3] REQ[4:0]
AP0 AP1 AP1
AP1 AP0 AP0
BCLK[1:0] (I) Anschlüsse AF23, AF22 Die differenziellen Bus Clock-Signale (Mainboard-Takt, typisch sind 100 und 133 MHz), auf die sich alle Signale und Timing-Parameter beziehen (vgl. Abbildung 15.3). BINIT (I/O) Anschluss AA3 Bus Initialization signalisiert Buszugriffe, denen weitere Informationen folgen. BNR (I/O) Anschluss G2 Block Next Request dient zur Verlängerung eines Zyklus für einen nicht bereiten Agent, damit ein Busüberlauf verhindert wird. BPM[5:0] (I/O) Anschlüsse AB4, AA5, Y6, AC4, AB5, AC6 Die Break Point Monitor-Signale sind für die Kennzeichnung und Verarbeitung von Statusinformationen zuständig (Breakpoints, Counters, TAP). BPRI (I) Anschluss D2 Bus Priority Request Input, Signal zur Anforderung (Arbitration) einer Busmasterzuteilung. BR0 (I/O) Anschluss H6 Bus Request ist der Request-Pin, der das BREQ0-Signal für die Busanforderung treibt. Das Signal wird terminiert, da der P4 nicht multiprozessor-fähig ist. BSEL[1:0] (I/O) Anschlüsse AD5, AD6 Bus Select wird zur Auswahl der Taktfrequenz (BCLK) verwendet. Mit BSEL1=Low und BSEL0=Low sind 100 MHz selektiert, die weiteren Möglichkeiten sind wie folgt: Takt
FSB
BSEL1
BSEL0
100 MHz 133 MHz 166 MHz 200 MHz
400 533 660 800
0 0 1 1
0 1 0 1
COMP[1:0] (analog) Anschlüsse P1, L24 Diese Signale werden auf dem Mainboard mit Widerständen terminiert (Chipsatz-abhängig).
Sandini Bib 506
Kapitel 15
D63–D0 (I/O) Anschlüsse AA24, AA22, AA25, Y21, Y24, Y23, W25, Y26, W26, V24, V22, U21, V25, U23, U24, U26, T23, T22, T25, T26, R24, R25, P24, R21, N25, N26, M26, N23, M24, P21, N22, M23, H25, K23, J24, L22, M21, H24, G26, L21, D26, F26, E25, F24, F23, G23, E24, H22 D25, J21, D23, C26, H21, G22, B25, C24, C23, B24, D22, C21, A25, A23, B22, B21 Der 64 Bit breite Datenbus des Pentium 4 in Quad-Pumped-Technologie. Die Signale werden auf der fallenden Flanke des DSTBP- und des DSTBN-Signals übernommen. Daten
DSTBN DSTBP
DBI[3:0]
D[15:0] D[31:16] D[47:32] D[63:48]
0 1 2 3
0 1 2 3
DBI[3:0] (I/O) Anschlüsse V21, P26, G25, E21 Diese Signale (Data Bus Inversion) kennzeichnen die Polarität der Quad-Pumped-Datensignale, wie es auch oben angegeben ist. DBR (O) Anschluss AE25 Data Bus Reset wird nur dann verwendet, wenn kein Debug-Port vorhanden ist, was vom Chipset abhängig ist. DBSY (I/O) Anschluss H5 Data Bus Busy signalisiert, dass die Daten auf dem Bus gerade verarbeitet werden. DFER (I) Anschluss E2 Das DEFER-Signal wird von einem Agent aktiviert (Snoop Phase), um zu kennzeichnen, dass die aktuelle Transaktion noch nicht beendet ist. DP[3:0] (I/O) Anschlüsse L25, K26, K25, J26 Die Data-Parity-Signale für den Datenbus. DRDY (I/O) Anschluss H2 Data Ready signalisiert gültige Daten auf dem Datenbus. DSTBN[3:0] , DSTBP[3:0] (I/O) Anschlüsse W22, R22, K22, E22, W23, P23, J23, F21 Die Data-Strobe-Signale für den Quad-Pumped-Datenbus (s.o.). FERR (O) Anschluss B6 Floating Point Error. Ist identisch mit der Funktion des ERROR-Signals beim 80387 und nur aus Kompatibilitätsgründen vorhanden.
Sandini Bib Pentium 4
507
GTLREF (analog in) Anschlüsse AA21, AA6, F20, F6 Referenzeingangssignal (typ. 2/3 Vcc) für die Eingänge laut AGTL+-Logik, um die Pegel High und Low interpretieren zu können. HIT, HITM (I/O) Anschlüsse F3, E3 Dienen dem Snooping (Cache-Abfragezyklus). HIT kennzeichnet dabei einen Treffer (Snoop Hit) und HITModified einen Treffer für eine bereits modifizierte Cache-Line. IERR (I) Anschluss AC3 Internal Error, kennzeichnet einen aufgetretenen internen Fehler. Wird extern auch als NMI verwendet. IGNNE (I) Anschluss B2 Wenn Ignore Numeric Error aktiviert ist, werden nach einem Fehler von der Recheneinheit nur noch diejenigen Befehle ausgeführt, die nicht die Floating-Point-Einheit betreffen. INIT (I) Anschluss W5 Initialization, wirkt im Prinzip wie ein Reset, allerdings mit dem wichtigen Unterschied, dass der Cache, die Write Buffer und die Floating-Point-Register nicht zurückgesetzt werden. ITPCLKOUT[1:0] (O) Anschlüsse AB22, AA20 Ein differenzielles Taktsignal, das gegenüber BCLK verzögert ist. Es wird für einen Debug-Port (Chipsatz-abhängig) verwendet, und falls dieser nicht vorgesehen ist, werden diese Pins mit Vcc verbunden. Beim Pentium 4 mit 478 Pins werden diese Signale üblicherweise nicht verwendet. ITP_CLK[1:0] (I) Anschlüsse AD26, AC26 Ein differenzielles Taktsignal, das den Bustakt (BCLK) führt. Es kommt nur dann zum Einsatz, wenn der Chipset keinen integrierten Debug-Port unterstützt, und wird dann für DebuggingZwecke verwendet. LINT[1:0] (I) Anschlüsse E5, D1 Local Interrupt, Anforderung eines Interrupts, entspricht von der Funktion her den Signalen INTR und NMI bei den älteren Intel-CPUs. LOCK (I/O) Anschluss G4 Wird für Locked-Transfers verwendet, d.h., der Datenbus ist für andere Transfers so lange gesperrt, wie LOCK aktiv ist. MCERR (I/O) Anschluss V6 Machine Check Error, wird bei einem nicht behebbaren Fehler ausgelöst bzw. kennzeichnet einen als nicht behebbar. Hat aber keinen Bus-Protokoll-Fehler zur Folge.
Sandini Bib 508
Kapitel 15
PROCHOT (O) Anschluss C3 Wird ausgelöst, wenn der interne Temperatursensor den maximal zulässigen Wert detektiert. PWRGOOD (I) Anschluss AB23 Signalisierung vom Chipset, dass die Spannungen und der Takt in Ordnung sind. REQ[4:0] (I) Anschlüsse H3, J3, J4, K5, J1 Request-Command-Signale, werden vom Busmaster für die Kennzeichnung des aktuellen Transfers verwendet. Siehe auch Beschreibung von AP und ADS. Reserved Anschlüsse A22; A7, AD2, AD3, AE21, AF3, AF24, AF25 Diese Anschlüsse werden nicht verwendet und sind für zukünftige Funktionen reserviert. RESET (I) Anschluss AB25 Initialisierung der CPU, Zurücksetzen aller Register und der Cache-Speicher. RS[2:0] (I) Anschlüsse F4, G5, F1 Response Status, wird vom Agent gesendet, der für die Beendigung des aktuellen Transfers zuständig ist. RSP (I) Anschluss AB2 Response Parity, wird vom aktuellen Agent verwendet, während RS[2:0] zur Signalisierung der Parität verwendet (High: gerade, Low: ungerade). SKTOCC (O) Anschluss AF26 Socket Occupied, wird mit GND verbunden, wenn der Pentium 4 in den Sockel eingesteckt ist. Das Signal dient somit der CPU-Detektierung. SLP (I) Anschluss AB26 Sleep-Signal, bei einem Low wird die CPU hiermit in den Sleep-Modus versetzt, nach einem Reset oder SLP=High läuft die CPU dann wieder im Normalmodus. SMI (I) Anschluss B5 Systemmanagement-Interrupt-Eingang zur Einschaltung des SMModus. STPCLK (I) Anschluss Y4 Stop Clock, Anhalten des Taktes (Stromsparmodus).
Sandini Bib Pentium 4
509
TCK (I) Anschluss D4 Test Clock, das Taktsignal für den Test Access Port (TAP, JTAG, Boundary Scan). TDI (I) Anschluss C1 Test Data Input, serieller Dateneingang für TAP. TDO (O) Anschluss D5 Test Data Output, serieller Datenausgang für TAP. TESTHI[12:8], TESTHI[5:0] (I) Anschlüsse AD25, A6, Y3, W4, U6, AC23, AC24, AC20, AC21, AA2, AD24 Test-Pins, werden über Pull-Up-Widerstände mit Vcc verbunden. THERMDA (O) Anschluss B3 Die Anode der CPU-internen Temperaturmessdiode. THERMDC (O) Anschluss C4 Die Kathode der CPU-internen Temperaturmessdiode. THERMTRIP (O) Anschluss A2 Ausgang der internen Temperaturüberwachung. Die CPU stoppt bei einer Die-Temperatur größer als 135ºC und signalisiert dies mit dem Signal THERMTRIP. TMS (I) Anschluss F7 Test Mode Select zur Selektierung der jeweiligen JTAG-Testfunktion. TRDY (I) Anschluss J6 Target Ready, signalisiert, dass der Target-Agent für eine Datenübertragung bereit ist. TRST (I) Anschluss E6 Test Reset, asynchrone Initialisierung des TAPs (Test Access Port). VCC (I) Anschlüsse A10, A12, A14, A16, A18, A20, A8, AA10, AA12, AA14, AA16, AA18, AA8, AB11, AB13, AB15, AB17, AB19, AB7, AB9, AC10, AC12, AC14, AC16, AC18, AC8, AD11, AD13, AD15, AD17, AD19, AD7, AD9, AE10, AE12, AE14, AE16, AE18, AE20, AE6, AE8, AF11, AF13, AF15, AF17, AF19, AF2, AF21, AF5, AF7, AF9, B11, B13, B15, B17, B19, B7, B9, C10, C12, C14, C16, C18, C20, C8, D11, D13, D15, D17, D19, D7, D9, E10, E12, E14, E16, E18, E20, E8, F11, F13, F15, F17, F19, F9, Anschlüsse für die CPU-Versorgungsspannung.
Sandini Bib 510
Kapitel 15
VCCA (I) Anschluss AD20 Versorgungsspannung für den CPU-Kern. VCCIOPLL (I) Anschluss AE23 Versorgungsspannung für die CPU-Systembus-PLL (Phase Locked Loop). VCCSENSE (O) Anschluss A5 Ausgangssignal für die Messung der CPU-Core-Spannung. VCCVid (I) Anschluss AF4 Soll für die Versorgung der VID-Detektierung zum Einsatz kommen. Üblicherweise liegt hier jedoch keine Spannung an, und demnach wird dieser Anschluss auch nicht verwendet. VID[4:0] (O) Anschlüsse AE1, AE2, AE3, AE5 Voltage Identification, Signalisierung, welche CPU-Spannung zu verwenden ist. Diese Signale werden von der Mainboard-Elektronik ausgewertet, woraufhin die entsprechende Core-Spannung für die CPU eingestellt wird. VID[4:0]
Spannung
VID [4:0]
Spannung
01100 01101 01110 01111 10000 10001 10010 10011 10100 10101
1,550 V 1,525 V 1,500 V 1,475 V 1,450 V 1,425 V 1,400 V 1,375 V 1,350 V 1,325 V
10110 10111 11000 11001 11010 11011 11100 11101 11110 11111
1,300 V 1,275 V 1,250 V 1,255 V 1,200 V 1,175 V 1,150 V 1,125 V 1,100 V keine CPU
VSS (I) Anschlüsse (es sind über 180 Stück) Die Anschlüsse für die Masse sind fast gleichmäßig über die Anschlussfläche verteilt, so dass sich in der Regel zwischen zwei Signalen ein Massekontakt befindet, was sich günstig auf das Störverhalten auswirkt und ein Übersprechen der Signale verhindert. VSSSense (O) Anschluss A4 Masseausgangssignal für die Messung der CPU-Core-Spannung.
Sandini Bib Pentium 4
511
15.3 CPUID-Programm In Kapitel 12.8 sowie auch in einigen andern Kapiteln zu den Prozessoren finden Sie Erläuterungen zur Detektierung des CPU-Typs. Ab den 486-CPUs der verschiedenen Hersteller sollte man davon ausgehen können, dass der CPUID-Befehl (CPU Identification) unterstützt wird. Gleichwohl ist dies meist erst bei späteren 486-Versionen der Fall, und selbst bei einigen Pentium-kompatiblen Prozessoren kann es passieren, dass dieser Befehl nicht (korrekt) funktioniert. Ein weiteres Problem ist, dass die vom CPUID-Befehl zurückgegebenen Werte unterschiedlich zu interpretieren sind, wobei insbesondere zwischen Intel- und AMD-CPUs markante Unterschiede bei den einzelnen Parametern bestehen. Ob eine CPU den CPUID-Befehl unterstützt, lässt sich dadurch feststellen, dass sich das ID-Flag im Status-Register umschalten lässt (lesen, schreiben, lesen). Die aus der CPU zu ermittelnden Informationen können eine ganz beachtliche »Datenfülle« aufweisen, und für die korrekte Interpretation sind aktuelle Informationen der Hersteller notwendig, denn es ist durchaus keine Seltenheit, dass innerhalb einer CPU-Familie bestimmte Bits eine unterschiedliche Bedeutung aufweisen. Dies gilt insbesondere für die erweiterten Funktionen. Bei genauerer Betrachtung der CPUs der verschiedenen Hersteller kristallisieren sich jedoch einige Gemeinsamkeiten bei den CPUID-Parametern heraus, die sich im Grunde genommen (zwangsläufig) aus Kompatibilitätsgründen ergeben. Diese liegen in den Basisfunktionen, die den Hersteller (Vendor) mit EAX=0 sowie den Typ (Primary Processor, Overdrive etc.), die CPUFamilie (Pentium, PentiumPro), das Modell (486DX, Athlon, Pentium 4) und das CPU-Stepping mit EAX=1 preisgeben. Mit EAX=2 erhält man Informationen zu den Cache- und TLB-Descriptors, wie es beispielsweise beim PentiumPro (Kapitel 12.8) angegeben ist. EAX=3 wird ab den Intel Pentium III-Prozessoren unterstützt und liefert die prozessor-eigene Seriennummer. Außerdem kann man ab dem Pentium 4 über EAX=80.000.000h–80.000.004h Feature-Bits und einen Processor Brand String zutage fördern. Dieser enthält neben einer genaueren CPU-Bezeichnung möglicherweise auch Angaben zur CPU-Taktfrequenz. Alles, was ab EAX=2 an Informationen zur Verfügung steht, rechnet man zu den erweiterten Funktionen, die in Abhängigkeit vom Hersteller und vom CPU-Typ eben recht unterschiedlich sein können. Bei AMD ist hier beispielsweise auch die jeweilige Unterstützung von 3DNOW!, MMX, SSE etc. festzustellen. Mitunter sind über die erweiterten Funktionen auch erst die Familienmitglieder wie Duron oder Celeron zweifelsfrei zu identifizieren, die über die Basisfunktionen als Athlon oder Pentium III ausgewiesen werden. Das folgende Beispielprogramm beschränkt sich auf die Basisfunktionen, damit die Sache nicht zu unübersichtlich wird. Dabei werden aber nicht nur Intel-CPUs, sondern auch CPUs von AMD, Cyrix, Centaur (IDT, VIA) und Exoten wie von NexGen, UMC oder Rise identifiziert. Dem Listing ist zu entnehmen, dass die Hersteller in der Tat recht uneinheitlich mit den Identifizierungsbits umgehen und dass es selbst allein bei Intel mit der Nummerierung etwas durcheinander zu gehen scheint, was im Programm entsprechend berücksichtigt wird. Innerhalb einer CPU-Familie wirken die Modellnummern, anhand derer die jeweilige CPU ausgewiesen wird, recht willkürlich gewählt, allein bei den 486-Prozessoren gibt es eine nachvollziehbare logische Ordnung (0=486DX, 1=486SX, 2=487, 3=486DX2 usw.). Im Programm werden nicht definierte CPU-Modellnummern mit entsprechenden Vergleichsoperationen (je, ja, jle etc.) abgefangen. Die 486-CPUs firmieren unter Family 3, die Pentium-CPUs unter Family 4, alles was aus dem PentiumPro entstanden ist, wie Pentium II, Pentium III und Celeron, unter Family 6, und der Pentium 4 (nebst XEONs, die auf der Netburst-Architektur beruhen) führt ein Fh als Family-Code.
Sandini Bib 512
Kapitel 15
Abb. 15.7: Die Anzeige der Prozessordaten mit dem Programm CPUID
Der erste wichtige Schritt ist im Programm logischerweise die Ausführung des CPUID-Befehls, und bei Gültigkeit wird mit EAX=0 die Vendor-ID sowie die maximal zulässige Anzahl an Funktionen mit der Prozedur do_it_first ermittelt. Die Prozedur do_it_second (EAX=1) erledigt gewissermaßen den Rest, nämlich die Ermittlung des Typs, der CPU-Familie, des Models und des Steppings. Die gewonnenen CPU-Daten werden auf dem Monitor dargestellt, so dass man mit dem Programm CPUID ein kleines CPU-Testprogramm parat hat, das sich auch relativ einfach erweitern lässt, um weitere Details aus dem Prozessor lesen zu können. ;-------------------------------------------------------; Programm: CPUID ; Funktion: CPU-Informationen ; - Vendor ID ; - Type ; - Family ; - Model ; - Stepping ; Programmed by Tariq Khaseb, Klaus Dembowski ; Assembler: MASM 6.11 ;--------------------------------------------------------title CPUID program .model small .stack 32 ;macro "cpu_id" execute the CPUID instruction cpu_id MACRO db 0fh db 0a2h ENDM ;macro "PRN_MSG" print msg on the screen PRN_MSG MACRO msg mov ah,09h lea dx,msg int 21h endm ;---------------------------------------------------------; Data segment ;---------------------------------------------------------.data ; Variables _valid _maxlevel _vendor_ID _type _family _model _stepping _bcd_value _pro_ID
db db db db db db db db db
0 0 "____________",13,10,'$' ? ? ? ? 4 dup(' '),13,10,'$' ?
Sandini Bib Pentium 4
513
;Text and Messages ;some of them are used as tables, some tables have some empty ;lines in order to make the address calculation easier. _Intel_ID db "GenuineIntel" _UMC_ID db "UMC UMC UMC " _AMD_ID db "AuthenticAMD" _Cyrix_ID db "CyrixInstead" _NexGen_ID db "NexGenDriven" _Centaur_ID db "CentaurHauls" _Rise_ID db "RiseRiseRise" valid_cpuid_text db ID_msg db Type_msg db Family_msg db Model_msg db Stepping_msg db Most_486 db "most 80486s
"Valid CPUID Instruction",13,10,'$' "The Processor ID is $" 13,10,"Type = $" 13,10,"Family = $" 13,10,"Model = $" 13,10,"Stepping = $" $"
;---------------------------------------------------------------;Family and model ;---------------------------------------------------------------;Intel 486 processors: _486_table
db "Intel 80486DX-25/33$" db "Intel 80486DX-50 $" db "Intel 80486SX $" db "Intel 80486DX2 $" db "Intel 80486SL $" db "Intel 80486SX2 $" db "Intel 80486DX2WB $" db "Intel 80486DX4 $" db "Intel 80486DX4WB $" ;----------------------------------------------------------;Intel Pentium processors: intel_p5
db
"Intel P5, P54C, P55C, P24T $"
p5_table
db "Intel Pentium A-step$" db "Intel Pentium P5 $" db "Intel Pentium P54C $" db "Intel P24T Overdrive$" db "Intel Pentium P55C $" db "Intel Pentium P54C $" db "Intel P55C(MMX) $" ;--------------------------------------------------------------;Intel PentiumPro processors: intel_p6 db "Intel P6, PII, PIII$" p6_table
db "Pentium Pro A-step $" db "Pentium Pro P6 $" db " $" db "PentiumII (0.28 um)$" db " $" db "PentiumII (0.25 um)$" db "PentiumII with on-Die L2 cache $" db "PentiumIII (0.25 um) $" db "PentiumIII (0.18 um) with 256 kB on-Die L2 cache $" db " $" db "PIII-XEON (0.18 um) with 1 or 2MB on-Die L2 cache$" ;---------------------------------------------------------------;Intel Pentium 4 processors: intel_p7 db "Intel Pentium 4" p7_table
db db db
"P4 or XEON (0.18 um)$" "P4 or XEON or MP or Celeron (0.18 um)$" "P4 Willamette-Core(0.13 um)$"
Sandini Bib 514
Kapitel 15
;---------------------------------------------------------------;UMC processors: UMC_f db "UMC Processor $" UMC_table db "UMC 80486 U5D $" db "UMC 80486 U5S $" ;---------------------------------------------------------------;AMD processors: AMD_5x86 db "AMD 5x86$" AMD_86_3 db "AMD 80486DX2$" AMD_86_7 db "AMD 80486DX2WB$" AMD_86_8 db "AMD 80486DX4$" AMD_86_9 db "AMD 80486DX4WB$" AMD_86_e db "AMD 5x86$" AMD_86_f db "AMD 5x86WB$" AMD_K5_6 db "AMD K5, K6$" AMD_K56_table
db db db db db db db db db db
"AMD "AMD "AMD "AMD "AMD " "AMD "AMD "AMD "AMD
5k86 5k86 5k86 5k86
(PR75, PR90, PR100)$" (PR120, PR133) $" (PR166) $" (PR200) $" $" $" K6 (0.30 um) $" K6 (0.25 um) $" K6-2 $" K6-III $"
AMD_k6d_msg
db
"K6-2+ or K6-III+ (0.18 um)$"
AMD_k7
db
"AMD K7$"
AMD_k7_table
db "AMD Athlon Model 1 (0.25) $" db "AMD Athlon Model 2 (0.18) $" db "AMD Duron with 64 kB on-Die L2 cache $" db "AMD Athlon with 256 kB on-Die L2 cache$" db "AMD Athlon MP Model 6 $" db "AMD Duron or Mobile Model 6 $" db "AMD Duron or Mobile Model 7 $" db "AMD Athlon XP or MP or Mobile Model 8 $" ;--------------------------------------------------------------;Cyrix Processors: Cyrix_86 db "Cyrix 5x86$" Cyrix_GX db "Cyrix MediaGX GX, GXm$" Cyrix_f6 db "Cyrix M2, VIA Cyrix III$" Cyrix_M1 db "Cyrix M1 6x86$" Cyrix_M2 db "Cyrix M2 6x86MX$" Cyrix_via db "VIA Cyrix III$" ;--------------------------------------------------------------;NexGen Processors: NexGen_f db "NexGen Nx586$" NexGen_m db "NexGen Nx586 or Nx586FPU$" ;--------------------------------------------------------------;Centaur Processors: Centaur_f db "Centaur/IDT C6,C2,C3$" Centaur_4 db "Centaur/IDT C6$" Centaur_8 db "Centaur/IDT C2$" Centaur_9 db "Centaur/IDT C3$" ;--------------------------------------------------------------;Rise Processors Rise_f db "Rise mP6$" Rise_0 Rise_2
db db
"Rise mP6 (0.25 um) $" "Rise mP6 (0.18 um) $"
;--------------------------------------------------------------;Processor type type_messages db "Primary Processor $" db "Overdrive Processor$" db "Secondary Processor$" db "Unknown Processor $"
Sandini Bib Pentium 4
515
;--------------------------------------------------------------;error messages unknown_family_msg db "Unknown Family $" unknown_model_msg db "Unknown Model $" unknown_pro_msg db "Unknown Processor $" invalid_cpuid_msg db "Invalid CPUID instruction",13,10,'$' unknown_ID_msg db "Unknown CPU vendor ID",13,10,'$' ;----------------------------------------------; code segment ;----------------------------------------------.code .386 org main
400h proc mov mov mov
far ax,@data ds,ax es,ax
call
clear_screen
;initialization of regs
;call function to clear ;the screen
;call function "valid_cpuid" to check if CPUID instruction is ;valid call valid_cpuid cmp _valid,1 jne invalid_cpuid ;if invalid PRN_MSG valid_cpuid_text ;if valid CPUID instruction ;print "valid" and proceed ;if the CPUID instruction is valid, do CPUID with EAX=0 to get: ; 1) The vendor ID ; 2) The max allowed input (function Calls) call
do_it_first
;printing the Vendor ID and determining it by a number PRN_MSG mov mov lea lea repe je
ID_msg _pro_ID,0 cx,12 di,_vendor_ID si,_Intel_ID cmpsb print_ID
mov mov lea lea repe je
_pro_ID,1 ;1 for UMC processors cx,12 di,_vendor_ID si,_UMC_ID cmpsb print_ID
mov mov lea lea repe je
_pro_ID,2 ;2 for AMD processors cx,12 di,_vendor_ID si,_AMD_ID cmpsb print_ID
mov mov lea lea repe je
_pro_ID,3 ;3 for Cyrix processors cx,12 di,_vendor_ID si,_Cyrix_ID cmpsb print_ID
mov mov lea
_pro_ID,4 cx,12 di,_vendor_ID
;0 for Intel processors ;num of characters ;first string to compare ;second string to compare ;compare
;4 for NexGEn processors
Sandini Bib 516
Kapitel 15
lea repe je
si,_NexGen_ID cmpsb print_ID
mov mov lea lea repe je
_pro_ID,5 ;5 for Centaur processors cx,12 di,_vendor_ID si,_Centaur_ID cmpsb print_ID
mov mov lea lea repe jne
_pro_ID,6 cx,12 di,_vendor_ID si,_Rise_ID cmpsb unknown_ID
;print the vendor ID print_ID: mov lea int
ah,09h dx,_vendor_ID 21h
;6 for Rise processors
;if not,then the processor ;is unknown
;if the input (1) is allowed do the CPUID instruction for EAX=1 ;get type, family, model, and stepping cmp jl call ;print processor type PRN_MSG mov mov mul mov
_max_level,1 unknown_pro do_it_second type_msg al,_type dl,20 dl bx,ax
;the table entry width ;multiply with _type ;put the offset in bx
PRN_MSG [type_messages+bx] ;print the message from the table "type_messages" with offset bx ;print the family and model PRN_MSG family_msg cmp _pro_ID,0 jne not_intel ;---------------------------------------------------------------;Intel processors ;---------------------------------------------------------------cmp _family,4 jne not_i486 PRN_MSG most_486 ;Intel 486 processors ;use the model to select an item from the table PRN_MSG cmp ja mov mov mul mov PRN_MSG jmp
model_msg _model,8 unknown_model al,_model dl,20 dl bx,ax [_486_table+bx] end_family
not_i486: cmp _family,5 jne not_ip5 PRN_MSG intel_p5
Sandini Bib Pentium 4
517
;Intel Pentium (P5) family processors
print_p5:
PRN_MSG cmp ja mov mov mul mov cmp jle sub PRN_MSG jmp
model_msg _model,4 unknown_model al,_model dl,21 dl bx,ax _model,4 print_p5 bx,42 [p5_table+bx] end_family
not_ip5: cmp _family,6 jne not_ip6 PRN_MSG intel_p6 ;Intel P6 family processors PRN_MSG cmp je cmp je cmp je cmp ja
model_msg _model,2 unknown_model _model,4 unknown_model _model,9 unknown_model _model,0bh unknown_model
mov mov mov cmp jle add mov sub
al,_model bx,0 dl,20 _model,5 print_p6 dl,30 bx,120 al,6
mul add PRN_MSG jmp
dl bx,ax [p6_table+bx] end_family
print_p6:
not_ip6: cmp _family,0fh jne unknown_family PRN_MSG intel_p7 ;Intel Pentium 4 family processors PRN_MSG cmp ja mov mov mul mov PRN_MSG jmp
model_msg _model,3 unknown_model al,_model dl,38 dl bx,ax [p7_table+bx] end_family
not_intel: cmp jne
_pro_ID,1 not_UMC
;----------------------------------------------------------;UMC processors ;----------------------------------------------------------PRN_MSG UMC_f PRN_MSG model_msg
Sandini Bib 518
Kapitel 15
cmp je cmp ja mov sub mov mul mov PRN_MSG jmp
_model,0 unknown_model _model,2 unknown_model al,_model al,1 dl,15 dl bx,ax [UMC_table+bx] end_family
not_UMC: cmp _pro_ID,2 jne not_AMD ;---------------------------------------------------------;AMD Processors ;---------------------------------------------------------cmp _family,4 jne not_a5x86 PRN_MSG AMD_5x86 ;AMD x86 processors model_msg _model,3 next_a1 AMD_86_3 end_family _model,7 next_a2 AMD_86_7 end_family
cmp jne PRN_MSG jmp cmp jne PRN_MSG jmp cmp jne PRN_MSG jmp cmp jne PRN_MSG jmp
_model,8 next_a3 AMD_86_8 end_family _model,9 next_a4 AMD_86_9 end_family _model,0eh next_a5 AMD_86_e end_family _model,0fh unknown_family AMD_86_f end_family
next_a1:
PRN_MSG cmp jne PRN_MSG jmp cmp jne PRN_MSG jmp
next_a2:
next_a3:
next_a4:
next_a5:
not_a5x86: cmp _family,5 jne not_ak5_6 PRN_MSG AMD_K5_6 ;AMD K5 or K6 processors PRN_MSG mov cmp je cmp je cmp je cmp ja mov mul mov PRN_MSG jmp
model_msg al,_model al,0dh AMD_k6D al,4 unknown_model al,5 unknown_model al,9 unknown_model dl,29 dl bx,ax [AMD_K56_table+bx] end_family
Sandini Bib Pentium 4
519
AMD_k6D:
PRN_MSG AMD_k6d_msg jmp end_family
not_ak5_6: cmp _family,6 jne unknown_family PRN_MSG AMD_k7 ;AMD K7 processors PRN_MSG mov cmp ja cmp je sub mov mul mov PRN_MSG jmp
model_msg al,_model al,4 unknown_model al,0 unknown_model al,1 dl,39 dl bx,ax [AMD_k7_table+bx] end_family
not_AMD: cmp _pro_ID,3 jne not_Cyrix ;---------------------------------------------------------------;Cyrix Processors ;---------------------------------------------------------------cmp jne PRN_MSG PRN_MSG cmp jne PRN_MSG jmp
_family,4 not_C86 Cyrix_86 model_msg _model,9 next_c1 Cyrix_86 end_family
next_c1: cmp jne PRN_MSG jmp
_model,4 unknown_model Cyrix_GX end_family
cmp jne PRN_MSG PRN_MSG cmp jne PRN_MSG jmp
_family,5 not_Cm1 Cyrix_M1 model_msg _model,2 unknown_model Cyrix_M1 end_family
cmp jne PRN_MSG PRN_MSG cmp jne PRN_MSG jmp
_family,6 unknown_family Cyrix_f6 model_msg _model,2 print_via Cyrix_M2 end_family
not_C86:
not_Cm1:
print_via: PRN_MSG Cyrix_via jmp end_family not_Cyrix: cmp _pro_ID,4 jne not_NexGen ;---------------------------------------------------------------;NexGen Processors ;----------------------------------------------------------------
Sandini Bib 520
Kapitel 15
cmp jne PRN_MSG PRN_MSG cmp jne PRN_MSG jmp
_family,5 unknown_family NexGen_f model_msg _model,0 unknown_model NexGen_m end_family
not_NexGen: cmp _pro_ID,5 jne not_Centaur ;---------------------------------------------------------------;Centaur processors ;---------------------------------------------------------------cmp _family,5 jne unknown_family PRN_MSG Centaur_f PRN_MSG model_msg cmp _model,4 jne next_ce1 PRN_MSG Centaur_4 jmp end_family next_ce1: cmp _model,8 jne next_ce2 PRN_MSG Centaur_8 jmp end_family next_ce2: cmp _model,9 jne unknown_model PRN_MSG Centaur_9 jmp end_family not_Centaur: ;---------------------------------------------------------------;Rise Processors ;---------------------------------------------------------------cmp _family,5 jne unknown_family PRN_MSG Rise_f PRN_MSG model_msg cmp _model,0 jne next_r1 PRN_MSG Rise_0 jmp end_family next_r1: cmp _model,2 jne unknown_model PRN_MSG Rise_2 jmp end_family ;---------------------------------------------------------------invalid_cpuid: PRN_MSG invalid_cpuid_msg jmp unknown_pro unknown_ID:
PRN_MSG unknown_ID_msg
unknown_pro: PRN_MSG unknown_pro_msg unknown_family: PRN_MSG unknown_family_msg jmp end_family unknown_model: PRN_MSG unknown_model_msg ;---------------------------------------------------------------end_family: PRN_MSG stepping_msg mov ax,0 mov al,_stepping lea si,_bcd_value call bin_to_BCD ;convert the binary ;stepping to BCD value PRN_MSG _bcd_value
Sandini Bib Pentium 4
end_prog:
main
521
jmp
end_prog
mov int
ah,01h 21h
mov int endp
ax,4c00h 21h
;input char
;---------------------------------------------------------------;check if CPUID instruction is valid ;return 1 in _valid if it is valid ;---------------------------------------------------------------valid_cpuid proc near pushfd pop eax mov ecx,eax xor eax,200000h push eax popfd pushfd pop eax cmp eax,ecx je end_check mov _valid,1 end_check: ret valid_cpuid endp ;---------------------------------------------------------------;execute the CPUID instruction with input EAX=0 to get the max. ;input for CPUID instruction and the vendor ID of the processor ;---------------------------------------------------------------do_it_first
do_it_first
proc mov cpu_id mov mov mov mov ret endp
near eax,0 dword dword dword dword
ptr ptr ptr ptr
_max_level,eax _vendor_ID,ebx _vendor_ID[+4],edx _vendor_ID[+8],ecx
;---------------------------------------------------------------;execute the CPUID instruction with input EAX=1 to get the ;type, family, model and stepping of the processor ;---------------------------------------------------------------do_it_second proc near mov eax,1 cpu_id mov cx,ax and al,0fh mov _stepping,al shr cx,4 mov ax,cx and al,0fh mov _model,al shr cx,4 mov ax,cx and al,0fh mov _family,al shr cx,4 mov ax,cx and al,03h mov _type,al ret do_it_second endp ;---------------------------------------------------------------;convert binary numbers to BCD
Sandini Bib 522
;input: binary number in AX ; address where to put the BCD in SI ;out: BCD value ;---------------------------------------------------------------bin_to_BCD proc near mov cx,0010 add si,3 B20: cmp ax,cx jb B30 xor dx,dx div cx or dl,30h mov [si],dl dec si jmp B20 B30: or al,30h mov [si],al ret bin_to_BCD endp ;---------------------------------------------------------------;clear the screen and set the cursor to 0,0 ;---------------------------------------------------------------clear_screen proc near mov ax,0600h mov bh,07 mov cx,0000 mov dx,184fh int 10h mov ah,02h mov bh,00 mov dx,0000 int 10h ret clear_screen endp ;----------------------------------------------end main
Kapitel 15
Sandini Bib
Teil 3: Speicher, Chipsets und Support-Chips
16
Speicherchips – Das Gedächtnis der Computer
Mit kaum einem anderen Element von Computern wurden in den letzten Jahren solche Wettkämpfe ausgetragen wie mit den Speicherbausteinen. Waren zu Beginn des PC-Zeitalters 16-KBit-Chips die Regel und 64-KBit-Chips absolute High-Tech, so finden sich heute in unseren PCs Speicherchips mit einer Kapazität von typischerweise 256 MBit, und 1-GBit-Chips gibt es bereits ebenfalls, was als erstem Hersteller der Firma Samsung mit DDR-SDRAM in einer 0,13µm-Technologie gelang. Die Kapazität von Speicherchips wird meist in Bit und nicht in Byte angegeben, wobei zusätzlich eine Angabe für die Organisation des Speicherchips notwendig ist. Eine Angabe wie 16Mx8 bedeutet, dass dieser Chip 16-MBit-Speicherzellen enthält, bei einer Datenbreite von 8 Bit, was somit 16 MByte entspricht. Für ein 64 Bit breites Speichermodul von 16 MByte, wie es ab den Pentiums benötigt wird, da sie eben eine Datenbreite von 64 Bit besitzen, werden demnach acht dieser Chips benötigt, damit sich ein Speichermodul von 16 MByte ergibt – oder aber 16 Stück vom Typ 4Mx16 oder aber auch 64 Stück vom Typ 2Mx8. Diese einzelnen Speicherchips für PCs werden auf verschiedenen Modulen untergebracht, und oftmals interessiert sich der Anwender nicht dafür, aus wie vielen einzelnen Chips mit welcher Datenbreite sich ein Speichermodul zusammensetzt. Vielmehr scheint allein die zur Verfügung stehende Kapazität, die dann in MByte angegeben wird, das Maß der Dinge zu sein. Gleichwohl hat die jeweilige Chip-Organisation eines Moduls eine nicht zu vernachlässigende Bedeutung, denn der auf dem Mainboard arbeitende Memory-Controller, der üblicherweise Bestandteil der Northbridge ist, muss das Timing – je na