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 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 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 nach Modulbestükkungsvariante – unterschiedlich ausführen können. Neben dem Chipset spielt dabei auch noch das BIOS eine wichtige Rolle, das den Speicher korrekt (mithilfe des Memory-Controllers) erkennen muss. Aus diesen Gründen treten immer wieder Fälle auf, in denen beispielsweise das eine 256-MByte-Modul, das als 32Mx8 organisiert ist, einwandfrei arbeitet, während ein als 64Mx4 organisiertes eben nicht im gleichen Mainboard funktioniert. Bei den Speichermodulen werde ich noch näher auf diese Problematik eingehen, aber zunächst werden die grundsätzlicheren Eigenschaften der Speicher-Chips erläutert. Die technologischen Probleme bei der Herstellung solcher höchstintegrierter Elektronikbauelemente sind gewaltig. Die Strukturgrößen liegen meist noch unter denen, wie sie bei Prozessoren der gleichen Generation verwendet werden. Sie liegen aktuell im Bereich von 0,17 µm bis 0,11 µm. Hinzu kommt, dass die Transistoren und alle anderen Bauelemente auf dem Chip einwandfrei funktionieren müssen. Bei einem 64-MBit-Chip sind das immerhin bereits an die 200 Millionen Transistoren, Kondensatoren und Widerstände. Arbeitet nur eines dieser Elemente fehlerhaft, so ist der Chip wertlos. Es verwundert daher nicht, dass die Produktion dieser Speicher geradezu Unsummen kostet, und es sind zudem laufendende Verbesserungen der Speichertechnologie
Sandini Bib 524
Kapitel 16
erforderlich. Wenn man einmal die Entwicklung von Prozessoren in den letzten Jahren betrachtet, so sind die Taktfrequenzen hier von 66 MHz Anfang der Neunziger mittlerweile bei 3 GHz (Pentium 4) angelangt, wohingegen die Speicher in der gleichen Zeit nur von 25 MHz auf ca. 200 MHz »beschleunigt« wurden (RAMBus spielt dabei eine besondere Rolle, siehe Kapitel 16.2.6). Dies zeigt auf jeden Fall das krasse Missverhältnis, d.h., die (DRAM-)Speichertechnologie bremst die mögliche CPU-Leistung gewissermaßen aus, und daran hat sich in den letzten 15 Jahren auch nichts geändert. Daher versucht man mit verschiedenen »Tricks«, wie immer größeren L1und L2-Caches in den CPUs sowie mehrkanaligen Speicherinterfaces, die vergleichsweise eher schlechte Speicherleistung »abzufedern«. Wenn man einmal davon absieht, dass die Speicherchips über die Jahre natürlich eine ganze Reihe von Verbesserungen erfahren haben, ist allerdings das grundlegende DRAM-Speicherprinzip allgegenwärtig.
16.1 Dynamic Random Access Memory – DRAM Die Bezeichnung dynamischer RAM oder DRAM ergibt sich aus dem Arbeitsprinzip dieser Speicherchips: Sie stellen die gespeicherte Information durch Ladung in einem Kondensator dar. Kondensatoren haben allerdings die unangenehme Eigenschaft, dass sie sich langsam entladen, dass der Chip also die gespeicherte Information nach einer gewissen Zeit verloren hat. Um das zu verhindern, muss die Information von Zeit zu Zeit oder eben »dynamisch« aufgefrischt werden, d.h., der Kondensator wird entsprechend der gespeicherten Information nachgeladen. In Abbildung 16.1 sehen Sie als Beispiel das Anschlussschema eines 16-MBit-Chips von IBM. Im Vergleich zu den Prozessoren haben wir es hier nur mit sehr wenigen Pins zu tun. Im Folgenden will ich sie kurz erläutern. 1
frei frei WE RAS frei frei A0 A1 A2 A3 Vcc
15
5
10 11
20
25
50
IBM0118165 (50/44 TSOP)
Vcc IO0 IO1 IO2 IO3 Vcc IO4 IO5 IO6 IO7 frei
45
40 36
30
26
GND IO15 IO14 IO13 IO12 GND IO11 IO10 IO9 IO8 frei frei LCAS UCAS OE A9 A8 A7 A6 A5 A4 GND
Abb. 16.1: Anschlussschema eines 16-MBit-Chips
A9–A0 (I) Anschlüsse 21–24, 27–32 Den zehn Pins wird die Zeilen- und die Spaltenadresse der anzusprechenden Speicherzellen zugeführt. LCAS, UCAS (I) Anschlüsse 35, 34 Liegt der betreffende Column-Address-Strobe-Anschluss auf einem niedrigen Pegel, so tastet der DRAM die zugeführte Adresse ab und verarbeitet sie als Spaltenadresse. LCAS ist dabei dem
Sandini Bib Speicherchips – Das Gedächtnis der Computer
525
niederwertigen Datenbyte IO7–IO0, UCAS dem höherwertigen Datenbyte IO15–IO8 zugeordnet. LCAS, UCAS und RAS dienen als Adressierungssteuersignale für den DRAM-Chip. IO15–IO0 (I/O) Anschlüsse 2–5, 6–10, 41–44, 46–49 Diesen Anschlüssen werden bei einem Schreibvorgang die zu schreibenden Daten zugeführt. Bei einem Lesevorgang geben sie die Lesedaten ab. RAS (I) Anschluss 18 Führt die Speichersteuerung diesem Row-Address-Strobe-Pin ein Signal mit niedrigem Pegel zu, dann liest der DRAM die zugeführte Adresse ein und interpretiert sie als Zeilenadresse. WE (I) Anschluss 17 Liegt das Write-Enable-Signal an diesem Pin auf einem niedrigen Pegel, so führt der DRAM einen Schreibvorgang aus. OE (I) Anschluss 33 Liegt das Output-Enable-Signal an diesem Anschluss auf einem niedrigen Pegel, werden Daten aus der adressierten Speicherzelle gelesen und ausgegeben. Vcc (I) Anschlüsse 1, 6, 25 An diese Anschlüsse wird das Versorgungspotenzial angelegt. GND Anschlüsse 26, 45, 50 Diese Pins liegen auf Masse.
16.1.1 Funktionsweise Für die Speicherung von Daten, das Auslesen der Information und die interne Verwaltung des DRAM sind natürlich mehrere Funktionsgruppen notwendig. In Abbildung 16.2 sehen Sie das Blockdiagramm eines dynamischen RAM. Zentraler Bestandteil ist das Speicherzellenfeld. Üblicherweise wird ein Bit in einer individuell adressierbaren Einheitsspeicherzelle gespeichert (siehe Abbildung 16.3), die zusammen mit den anderen in Form einer Matrix aus Zeilen und Spalten angeordnet ist. Ein 4-MBit-Chip besitzt daher 4.194.304 Speicherzellen, die z.B. in einer Matrix mit 2048 Zeilen und 2048 Spalten angeordnet sind. Durch die Angabe einer Zeilen- und einer Spaltennummer ist die Speicherzelle eindeutig bestimmt. Der Adresspuffer nimmt die Speicheradresse entgegen, die von der externen Speichersteuerung entsprechend der Adresse von der CPU ausgegeben wird. Die Adresse wird dafür in zwei Bestandteile aufgeteilt, nämlich in eine Zeilen- und in eine Spaltenadresse, die zeitlich nacheinander in den Adresspuffer eingelesen werden. Man bezeichnet das auch als Multiplexing. Der Grund für diese Aufteilung ist einleuchtend: Um eine Zelle im 4-MBit-Chip mit 2048 Zeilen und 2048 Spalten zu adressieren, benötigt man insgesamt 22 Adressbits (elf für die Zeile und elf für die
Sandini Bib 526
Kapitel 16
Speicheradresse
Adreßpuffer
Din
Datenpuffer
WE
Vorladeschaltkreis
Speicherzellenfeld (4.194.304 dynamische Speicherzellen)
Leseverstärker I/O-Gatter
Datenpuffer
CAS
Zeilendekoder
RAS
DRAMSteuerung
Spalte). Wenn alle Adressbits auf einmal übergeben werden sollen, so sind auch 22 Adresspins notwendig – das Gehäuse des Chips würde sehr groß werden. Außerdem muss ein großer Adresspuffer vorgesehen werden. Nachteilig für eine hohe Integration ist, dass alle Baugruppen, die eine Verbindung zur Außenwelt herstellen, wie z.B. der Adresspuffer oder die Datenpuffer, leistungsstark und daher großflächig sein müssen, um genügend Strom für die Ansteuerung externer Bauelemente wie z.B. der Speichersteuerung oder externer Datenpuffer abgeben zu können.
Dout
Spaltendekoder
Abb. 16.2: Die Speicherzellen sind in einer Matrix, dem Speicherzellenfeld, angeordnet. Der Adresspuffer nimmt nacheinander die Zeilen- und Spaltenadresse entgegen und übergibt sie an den Zeilen- bzw. Spalten-Dekoder. Die Dekoder steuern interne Leitungen und Gatter an, so dass nach kurzer Zeit die Daten der adressierten Speicherzelle an den Datenpuffer zur Ausgabe übergeben werden.
Es ist also günstiger, die Speicheradresse in zwei Portionen zu übergeben. Im Allgemeinen liest der Adresspuffer zuerst die Zeilenadresse und dann die Spaltenadresse ein. Dieses Adressmultiplexing wird von den Steuersignalen RAS und CAS gesteuert: Übergibt die Speichersteuerung die Zeilenadresse, so aktiviert sie das Signal RAS, d.h., sie senkt den Pegel von RAS auf low ab. RAS ist die Abkürzung für Row Address Strobe oder Zeilenadressabtastung und zeigt dem DRAM-Chip an, dass die zugeführte Adresse eine Zeilenadresse ist. Die DRAM-Steuerung aktiviert den Adresspuffer, um die Adresse einzulesen, und gibt sie an einen Zeilen-Dekoder weiter, der die Adresse dekodiert. Führt die Speichersteuerung dem Adresspuffer zu einem späteren Zeitpunkt die Spaltenadresse zu, so aktiviert sie das Signal CAS für Column Address Strobe oder Spaltenadressabtastung. Die DRAM-Steuerung erkennt daran, dass die jetzt zugeführte Adresse eine Spaltenadresse ist, und aktiviert erneut den Adresspuffer, der die Spaltenadresse entgegennimmt und an einen Spalten-Dekoder weitergibt. Sowohl die Länge der RAS- und CAS-Signale als auch deren zeitlicher Abstand – die so genannte RAS-CAS-Verzögerung oder RAS-CASDelay – müssen den Anforderungen des DRAM-Chips genügen. Die so adressierte Speicherzelle gibt die gespeicherten Daten aus, die von einem Leseverstärker verstärkt und über ein I/O-Gatter einem Datenausgabepuffer zugeführt werden. Der Puffer gibt die Information schließlich als Lesedaten Dout an den Datenpin des Speicherbausteins ab.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
527
Sollen Daten geschrieben werden, so aktiviert die Speichersteuerung das Signal WE für Write Enable oder Schreibaktivierung und führt dem Dateneingangspuffer die zu schreibenden Daten am Anschluss Din zu. Über das I/O-Gatter und einen Leseverstärker wird die Information verstärkt, an die adressierte Speicherzelle weitergegeben und dort gespeichert. Der Vorladeschaltkreis dient zur Unterstützung der Leseverstärker und wird später erläutert. Die Speichersteuerung erledigt also drei verschiedene Aufgaben: die Trennung der Adresse von der CPU in eine Zeilen- und eine Spaltenadresse, die nacheinander dem Speicher zugeführt werden, die korrekte Aktivierung der Signale RAS, CAS und WE und die Übergabe bzw. Übernahme der Schreib- oder Lesedaten. Außerdem muss sie bei fortgeschritteneren Speicherkonzepten wie Interleaving und Page Mode flexibel Wartezyklen anfordern und die adressierten Speicherchips für diese Betriebsmodi vorbereiten (hierzu später mehr).
16.1.2 Aufbau Als Einheitspeicherzelle ist die 1-Transistor-1-Kondensator-Zelle am gebräuchlichsten. In Abbildung 16.3 sehen Sie den Aufbau einer solchen Einheitsspeicherzelle nebst der notwendigen I/OPeripherie zum Lesen und Schreiben von Daten. Spalte 1
Spalte 2
. . . .
Spalte n
Vorladeschaltkreis
Einheitsspeicherzelle
Vcc/2
WL1
BL2
BLm BLm
BL2
Zeile 2
. . . .
Zeilendekoder
BL1 BL1
Speicherzellenfeld
Zeile 1 WL2
WLn
Zeile n
Lesever- Leseverstärker stärker
Din
Dateneingangspuffer
Leseverstärker
I/O I/O
Spaltendekoder
Leseverstärkerblock Datenausgangspuffer
Dout
I/O-Gatterblock
Abb. 16.3: Eine Einheitsspeicherzelle zur Speicherung eines Bit besteht aus einem Kondensator und einem Transistor. Die Wortleitungen schalten die Zugriffstransistoren einer Zeile durch, der Spalten-Dekoder wählt ein Bitleitungspaar aus, so dass die Daten einer Zelle auf das I/O-Leitungspaar und dadurch an den Datenausgangspuffer übergeben werden.
Sandini Bib 528
Kapitel 16
Die Einheitsspeicherzelle besteht aus einem Kondensator, der die Daten in Form elektrischer Ladungen speichert, und einem Auswahltransistor, der als Schalter zum Auswählen des Kondensators dient. Das Gate des Transistors ist dabei mit einer Wortleitung WLx verbunden. Im Speicherzellenfeld sind so viele Wortleitungen WL1 bis WLn vorhanden, wie Zeilen existieren. Neben den Wortleitungen weist das Speicherzellenfeld auch so genannte Bitleitungspaare BL, BL auf, deren Anzahl gleich der Anzahl der Spalten im Speicherzellenfeld ist. Die Bitleitungen sind dabei abwechselnd mit den Sources der Auswahltransistoren verbunden. Schließlich besteht die Einheitsspeicherzelle noch aus dem Kondensator, dem eigentlichen Speicherelement der Zelle. Eine seiner Elektroden ist mit der Drain des zugehörigen Auswahltransistors, die andere mit Masse verbunden. Die regelmäßige Anordnung von Auswahltransistoren, Kondensatoren, Wortleitungen und Bitleitungspaaren wiederholt sich, bis die Speicherkapazität des Chips erreicht ist. Bei einem 4-MBit-Speicherchip sind also 4.194.304 Auswahltransistoren, 4.194.304 Speicherkondensatoren, 2048 Wortleitungen und 2048 Bitleitungspaare vorhanden. Eine große Bedeutung für die Erkennung von Speicherdaten beim Lesen spielt der Vorladeschaltkreis. Vor einem Zugriff der Speichersteuerung und der damit verbundenen Aktivierung einer Wortleitung lädt er alle Bitleitungspaare auf den halben Versorgungspegel Vcc/2 auf. Außerdem werden die Bitleitungspaare durch einen Transistor kurzgeschlossen, damit sie exakt dasselbe Potenzial besitzen. Ist dieser Ausgleichs- und Vorladevorgang beendet, so wird der Vorladeschaltkreis deaktiviert. Die für das Vorladen und Ausgleichen notwendige Zeit wird als RAS-Vorladezeit bezeichnet. Erst wenn das geschehen ist, kann der Chip einen Zugriff auf eine seiner Speicherzellen ausführen. In Abbildung 16.4 sehen Sie den zeitlichen Verlauf des Potenzials auf einem Bitleitungspaar beim Lesen von Daten. tZyklus tPR
tRAS tCAS RAS
CAS Adresse
Zeile
Spalte VRD
BL BL Dout t1 t2
t3
t4
t5
Abb. 16.4: Potenzialverlauf beim Lesen und Zugriffszeiten: Nachdem der Zugriffstransistor durchgeschaltet worden ist, tritt auf der entsprechenden Bitleitung eine kleine Potenzialänderung (VRD) auf, die vom gespeicherten Wert abhängt. Die Differenz wird vom Leseverstärker verstärkt, so dass nach kurzer Zeit die Daten zur Verfügung stehen. tRAS bezeichnet die RAS-Zugriffszeit, tCAS die CAS-Zugriffszeit und tPR die RAS-Vorladezeit oder Erholzeit. tRAS und tRP ergeben zusammen die Zykluszeit tZyklus.
Wenn die Speichersteuerung eine Zelle im Chip adressiert, so führt sie zunächst das Zeilenadresssignal zu, das vom Adresspuffer angenommen und dem Zeilen-Dekoder übergeben wird.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
529
Zu diesem Zeitpunkt besitzen die beiden Bitleitungen eines Paares dasselbe Potenzial Vcc/2. Der Zeilen-Dekoder dekodiert das Zeilenadresssignal und aktiviert die Wortleitung entsprechend der dekodierten Zeilenadresse. Jetzt schalten alle mit ihr verbundenen Auswahltransistoren durch, und die Ladungen aller Speicherkondensatoren der adressierten Zeile fließen auf die entsprechenden Bitleitungen (Zeitpunkt t1 in Abbildung 16.4). Beim hier betrachteten 4-MBitChip werden also 2048 Auswahltransistoren durchgeschaltet, und die Ladungen von 2048 Speicherkondensatoren fließen zu den 2048 Bitleitungspaaren. Das Problem vor allem bei den heute benutzten hochintegrierten Speicherchips besteht nun darin, dass die Kapazität des Speicherkondensators viel kleiner ist als die Kapazität der mit ihm über den Auswahltransistor verbundenen Bitleitung. Das Potenzial der Bitleitung ändert sich daher nur geringfügig. War der Speicherkondensator leer, so sinkt das Potenzial der Bitleitung etwas ab, war er mit Ladung gefüllt, so steigt das Potenzial etwas an. Der von der DRAM-Steuerung aktivierte Leseverstärker verstärkt die Potenzialdifferenz der beiden Bitleitungen des Paares. Im ersten Fall zieht er das Potenzial der Bitleitung, die mit dem Speicherkondensator verbunden ist, auf Masse und hebt das Potenzial der anderen Bitleitung auf Vcc an (t3). Im zweiten Fall geschieht das Umgekehrte – die mit dem Kondensator verbundene Bitleitung wird auf Vcc angehoben und die andere Bitleitung auf Masse abgesenkt. Ohne die Vorladung und den Potenzialausgleich durch den Vorladeschaltkreis müsste der Leseverstärker das Absolut-Potenzial der Bitleitung verstärken. Weil die Potenzialänderung aber nur ca. 100mV beträgt, wäre der Verstärkungsvorgang wesentlich instabiler und somit fehleranfälliger als bei einer Differenzbildung der beiden Bitleitungen, da der dynamische Bereich ±100mV, d.h. insgesamt 200mV beträgt. Der Vorladeschaltkreis erhöht also die Zuverlässigkeit. Jeder der 2048 Leseverstärker gibt an seinem Ausgang das verstärkte Speichersignal ab und führt es einem I/O-Gatterblock zu. Dieser besteht aus Gatterschaltkreisen zu je zwei Gattertransistoren, die vom Spalten-Dekoder angesteuert werden. Dieser dekodiert das nach dem Zeilenadresssignal angelegte Spaltenadresssignal und aktiviert genau ein Gatter, d.h., es werden die Daten von nur einem Leseverstärker auf das I/O-Leitungspaar I/O, I/O übertragen und an den Ausgangsdatenpuffer weitergeleitet. Erst jetzt und somit viel später als die Zeilenadresse wird die Spaltenadresse von Bedeutung. Das Multiplexen von Zeilen- und Spaltenadresse hat also entgegen dem ersten Eindruck keinen nachteiligen Einfluss auf die Zugriffszeit. Der Ausgangsdatenpuffer verstärkt das Datensignal nochmals und gibt es als Ausgabedaten an Dout ab. Gleichzeitig sind die Potenziale der Bitleitungspaare entsprechend den Daten in den Speicherzellen, die mit der ausgewählten Wortleitung verbunden sind, auf einem Pegel low oder high, sie entsprechen also den gespeicherten Daten. Da die Auswahltransistoren durch die aktivierte Wortleitung weiter durchgeschaltet sind, werden die ausgelesenen Daten wieder in die Speicherzellen einer Zeile zurückgespeichert. Das Auslesen einer Zelle bewirkt also gleichzeitig eine Auffrischung der ganzen Zeile. Die Zeitspanne zwischen dem Anlegen der Zeilenadresse und der Ausgabe der Daten Dout über den Datenausgangspuffer wird als RAS-Zugriffszeit tRAS oder auch Zugriffszeit bezeichnet. Die wesentlich kürzere CAS-Zugriffszeit tCAS ist bei den schnelleren Modi von Bedeutung. Sie bezeichnet die Zeitspanne zwischen dem Anlegen der Spaltenadresse und der Ausgabe der Daten an Dout. Beide Zugriffszeiten sind in Abbildung 16.4 dargestellt. Nachdem die Datenausgabe abgeschlossen ist, werden der Zeilen- und Spalten-Dekoder sowie die Leseverstärker wieder deaktiviert und die Gatter im I/O-Gatterblock gesperrt. Zu diesem Zeitpunkt befinden sich die Bitleitungen noch auf den Potenzialen entsprechend den ausgelesenen Daten, wobei die regenerierten Speicherzellen durch die deaktivierte Wortleitung und die damit verbundene Sperrung der Auswahltransistoren von den Bitleitungen getrennt sind. Nun aktiviert die DRAM-Steuerung den Vorladeschaltkreis (t4), der die Potenziale der Bitleitungen
Sandini Bib 530
Kapitel 16
wieder auf Vcc/2 heruntersetzt bzw. anhebt und ausgleicht (t5). Nach der Stabilisierung der ganzen DRAM-Schaltung steht der Chip für einen weiteren Speicherzyklus zur Verfügung. Die Zeitspanne zwischen der Stabilisierung der Ausgangsdaten und dem Zeitpunkt, zu dem eine neue Zeilenadresse zugeführt und RAS aktiviert werden darf, wird als Erholzeit oder RAS-Vorladezeit tRP bezeichnet (siehe Abbildung 16.4). Die Summe aus der RAS-Vorladezeit und der Zugriffszeit ist die Zykluszeit tZyklus. Im Allgemeinen beläuft sich die RAS-Vorladezeit auf etwa 80% der Zugriffszeit, so dass die Zykluszeit ungefähr das 1,8fache der Zugriffszeit beträgt. Ein DRAM mit 100 ns Zugriffszeit besitzt also eine Zykluszeit von 180 ns. Erst nach Ablauf dieser 180 ns kann ein neuer Zugriff auf den Speicher erfolgen; der Abstand zwischen zwei Speicherzugriffen ist also nicht durch die kurze Zugriffszeit von 100 ns, sondern durch die fast doppelt so lange Zykluszeit von 180 ns gegeben. Neuere Speicherkonzepte »tricksen« die RAS-Vorladezeit allerdings aus, so dass in den meisten Fällen tatsächlich nur die Zugriffszeit maßgebend ist. Im Page-Mode oder Static-Column-Mode ist sogar die noch kürzere CAS-Zugriffszeit von Bedeutung. Genaueres hierzu ist in Kapitel 16.1.6 zu finden. Das Schreiben von Daten läuft fast genauso wie das Lesen ab. Die Speichersteuerung übergibt mit dem aktiven RAS zunächst das Zeilenadresssignal. Gleichzeitig aktiviert sie das Steuersignal WE, um dem DRAM mitzuteilen, dass er einen Schreibvorgang ausführen soll. Die zu schreibenden Daten Din werden dem Dateneingangspuffer zugeführt, dort verstärkt und an das I/O-Leitungspaar I/O, I/O übergeben. Der Datenausgangspuffer wird beim Datenschreiben nicht aktiviert. Der Zeilen-Dekoder dekodiert das Zeilenadresssignal und aktiviert eine entsprechende Wortleitung. Wie beim Datenlesen werden die Auswahltransistoren durchgeschaltet und übertragen die gespeicherte Ladung auf die Bitleitungspaare BLx, BLX. Anschließend aktiviert die Speichersteuerung das Signal CAS und übergibt die Spaltenadresse über den Adresspuffer an den Spalten-Dekoder. Dieser dekodiert die Adresse und schaltet ein Transfergatter durch, über das die Daten vom I/O-Leitungspaar zum entsprechenden Leseverstärker übertragen werden. Dieser Leseverstärker verstärkt das Datensignal und hebt die Potenziale der Bitleitungen des betreffenden Paars in Abhängigkeit vom Wert »1« oder »0« der zu schreibenden Daten an bzw. senkt sie ab. Da das Signal vom Dateneingangspuffer stärker ist als das in der betreffenden Speicherzelle gespeicherte Signal, gewinnt die Verstärkung der zu schreibenden Daten die Oberhand: Das Potenzial auf dem Bitleitungspaar der ausgewählten Speicherzelle spiegelt den Wert der Schreibdaten wieder. Alle anderen Leseverstärker verstärken die in den Speicherzellen abgelegten Daten, so dass nach kurzer Zeit auf allen Bitleitungspaaren Potenziale herrschen, die den unverändert wieder einzuschreibenden Daten bzw. dem neuen zu schreibenden Datenwert entsprechen. Diese Potenziale werden als entsprechende Ladungen in die Speicherkondensatoren übernommen. Anschließend deaktiviert die DRAM-Steuerung den Zeilen-Dekoder, den Spalten-Dekoder und den Dateneingangspuffer, die Kondensatoren der Speicherzellen werden von den Bitleitungen getrennt, und der Schreibvorgang ist abgeschlossen. Wie beim Lesen stellt der Vorladeschaltkreis die Bitleitungspaare auf einen Pegel Vcc/2 ein, und der DRAM ist zu einem weiteren Speicherzyklus bereit. Neben der beschriebenen Speicherzelle mit einem Auswahltransistor und einem Speicherkondensator gibt es noch andere Zellentypen mit mehreren Transistoren oder Kondensatoren. Der Aufbau solcher Zellen ist natürlich erheblich komplizierter und die Integration der Bauelemente wird durch die größere Anzahl schwieriger. Anstelle des Vorladeschaltkreises können auch andere Verfahren angewandt werden. Beispielsweise ist es möglich, jeweils eine Blindzelle für eine Spalte im Speicherzellenfeld zu instal-
Sandini Bib Speicherchips – Das Gedächtnis der Computer
531
lieren, die nur die halbe Ladung enthält, die einer »1« entspricht, d.h., sie speichert praktisch den Wert »1/2«. Die Leseverstärker vergleichen dann das aus der adressierten Speicherzelle ausgelesene Potenzial mit dem Potenzial der ausgelesenen Blindzelle. Der Effekt ähnelt dem eines Vorladeschaltkreises, auch hier wird eine Differenz und kein Absolutwert verstärkt. Es ist nicht notwendig, das Speicherzellenfeld quadratisch mit gleich vielen Zeilen wie Spalten zu strukturieren und einen symmetrischen Aufbau mit 2048 Zeilen zu je 2048 Spalten zu wählen. Beispielsweise besitzen 4-MBit-Chips häufig intern 1024 Zeilen zu je 4096 Spalten, einfach weil der Chip länger als breit ist. In diesem Fall wird eines der zugeführten Zeilenadressbits intern als zusätzliches, nämlich zwölftes Spaltenadressbit verwendet. Die zehn Zeilenadressbits wählen eine von 210=1024 Zeilen, die zwölf Spaltenadressbits dagegen eine von 212=4096 Spalten aus. Bei hochkapazitiven Speicherchips ist das Speicherzellenfeld häufig auch in zwei oder mehr Teilfelder aufgeteilt, bei 4-MBit-Chips z.B. in acht Teilfelder zu je 512 Zeilen mal 1024 Spalten. Ein oder mehrere Zeilenadressbits werden dann als Teilfeld der Auswahladresse verwendet, die restlichen Zeilen- und Spaltenadressbits selektieren nur noch eine Zeile bzw. Spalte im ausgewählten Teilfeld. Hierdurch werden die Wort- und Bitleitungen kürzer und die Signale stärker, dafür steigt die Zahl der Leseverstärker und I/O-Gatter an. Solche Methoden sind vor allem bei den neuen höchstintegrierten DRAMs üblich, da bei immer kleiner werdenden Zellen und damit Kondensatoren durch die längeren Bitleitungen vom Signal nichts mehr übrig ist, bis dieses den Leseverstärker erreicht. Welches Konzept die einzelnen Firmen für ihre Chips verfolgen, ist von außen nicht erkennbar.
16.1.3 Schichtenstrukturen In den folgenden Abschnitten möchte ich Ihnen die gängigsten Konzepte zur Bildung von DRAM-Speicherzellen vorstellen. Integrierte Schaltkreise werden durch Schichten aus verschiedenen Materialien auf einem Substrat gebildet. In Abbildung 16.5 sehen Sie einen Querschnitt durch eine solche Schichtenstruktur einer einfachen DRAM-Speicherzelle mit einem Flachkondensator. In Abbildung 16.5 ist zur Orientierung das Schaltbild der Speicherzelle angegeben. GND
Kondensator Feldoxid
W
BL
Tran sistor Gate
Elektrode
n-Source
Feldoxid
n-Drain
p-Substrat
Ladungsspeicherbereich
W Kondensator
Transistor BL
Abb. 16.5: Normale DRAM-Zelle: Der Zugriffstransistor der DRAM-Zelle wird üblicherweise als MOS-Transistor ausgeführt. Das Gate des Transistors ist gleichzeitig die entsprechende Wortleitung, und die Drain ist mit der Bitleitung verbunden. Die Ladung, die die eingeschriebene Information darstellt, wird im Substrat unterhalb der Elektrode gespeichert.
Sandini Bib 532
Kapitel 16
Zwischen den Feldoxidfilmen auf der linken und rechten Seite ist die eigentliche Speicherzelle gebildet. Die Feldoxide dienen zur elektrischen Trennung und Isolierung der einzelnen Speicherzellen voneinander. Der Auswahltransistor der Speicherzelle wird vom Gate und den beiden ndotierten Bereichen Source und Drain gebildet. Das Gate ist durch einen so genannten Gate-Isolierfilm vom p-Substrat getrennt und steuert die Leitfähigkeit des Kanals zwischen Source und Drain. Der Kondensator wird in der einfachsten Form durch eine Elektrode gebildet, die mit Masse verbunden ist. Die Elektrode ist wie das Gate durch einen dielektrischen Isolierfilm vom p-Substrat getrennt, so dass die Ladungsspeicherung unterhalb der Isolierschicht im Substrat stattfindet. Um die Verdrahtung der einzelnen Speicherzellen möglichst einfach zu gestalten, bildet das Gate gleichzeitig einen Abschnitt der Wortleitung, und die Drain ist Bestandteil der Bitleitung. Wird die Wortleitung W vom Zeilen-Dekoder ausgewählt, so senkt das Feld unter dem Gate, das Bestandteil der Wortleitung ist, den Widerstand des Kanals zwischen Source und Drain. Dadurch können die Ladungen des Kondensators über die Strecke Source-Kanal-Drain zur Bitleitung BL abfließen, die mit der n-Drain verbunden ist, und erzeugen so ein Datensignal auf dem Bitleitungspaar BL, BL, das der Leseverstärker erfasst und verstärkt. Ein Problem bei der höheren Integration der Speicherzellen ist, dass die Größe des Kondensators und somit auch seine Kapazität abnimmt. Es können also immer weniger Ladungen zwischen Elektrode und Substrat gespeichert werden, und die Datensignale beim Auslesen der Speicherzelle werden zu schwach, um einen einwandfreien Betrieb des DRAM zu gewährleisten. Die Entwickler sind deshalb spätestens ab dem 4-MBit-Chip zu einem dreidimensionaleren Aufbau der Speicherzelle übergegangen. Ein Konzept sehen Sie in Abbildung 16.6, nämlich die DRAMSpeicherzelle mit Grabenkondensator. W
GND
Kondensator
BL
Tran sistor
Elektr.
Gate Feldoxid
Feldoxid n-Drain
n-Source
p-Substrat
W Grabenkondensator
Ladungsspeicherbereich Transistor
BL
Abb. 16.6: Grabenkondensator für eine höhere Integrationsdichte: Um die Elektrodenfläche des Speicherkondensators zu erhöhen, wird der Kondensator in die Tiefe des Substrats gebaut. Dadurch können die Speicherzellen enger zusammenrücken, ohne dass die gespeicherte Ladung je Zelle geringer wird.
Bei diesem Speicherzellentyp werden die Informationsladungen nicht mehr einfach zwischen zwei planen Kondensatorelektroden gespeichert, vielmehr ist der Kondensator in die Tiefe des Substrats erweitert worden. Hierdurch werden die einander gegenüberliegenden Flächen der beiden Kondensatorelektroden wesentlich größer, als das bei einem einfachen Plattenkondensa-
Sandini Bib Speicherchips – Das Gedächtnis der Computer
533
tor möglich wäre. Die Speicherzelle lässt sich somit verkleinern und die Integrationsdichte vergrößern, ohne dass die Menge der im Speicherkondensator festgehaltenen Ladung abnimmt. Die Auslesesignale sind stark genug, und der DRAM-Chip arbeitet auch bei höherem Integrationsgrad sehr zuverlässig. Die technischen Schwierigkeiten bei der Herstellung dieser Gräben sind ganz beträchtlich. Wir haben es hier mit Grabenbreiten von ca. 1 µm bei einer Tiefe von 3 – 4 µm zu tun. Für die Herstellung solch kleiner Gräben sind Ätzverfahren notwendig, die anisotrop wirken und somit mehr in die Tiefe als in die Breite ätzen. Zur Steigerung der Integrationsdichte von Speicherchips gibt es noch andere Verfahren, wie z.B. gefaltete Bitleitungen, geteilte Leseverstärker oder auch Stapelkondensatoren. Aus Platzgründen kann ich leider nicht weiter darauf eingehen, aber so viel sei gesagt: Die von außen so einfach aussehenden Speicherbausteine beherbergen eine große Vielfalt absoluter Hochtechnologie.
16.1.4 Refresh – Auffrischung Aus Abbildung 16.5 wissen Sie, dass die Daten in Form elektrischer Ladungen in einem winzigen Kondensator gespeichert werden. Wie alle technischen Geräte ist auch dieser Kondensator nicht perfekt, d.h., er entlädt sich mit der Zeit über den Auswahltransistor oder sein Dielektrikum, wodurch die gespeicherten Ladungen und damit die Daten verloren gehen. Der Kondensator muss also in periodischen Abständen nachgeladen werden. Vielleicht erinnern Sie sich noch, dass mit dem Lesen oder Schreiben automatisch eine Auffrischung der Speicherzellen in der adressierten Zeile ausgeführt wird. Normale DRAMs müssen je nach Typ alle 1 ms bis 16 ms aufgefrischt werden. Die wesentlichen drei verschiedenen Refresh-Arten sind: RAS-only-Refresh, CAS-vor-RAS-Refresh (auch als CAS-before-RAS-Refresh bezeichnet) und Hidden-Refresh. In Abbildung 16.7 sehen Sie den Verlauf der beteiligten Signale bei diesen Refresh-Arten. Refresh-Zyklus
Refresh-Zyklus
RAS CAS Adresse
Refresh
Refresh
(a) RAS-only-Refresh Refresh-Zyklus
Refresh-Zyklus
RAS CAS Adresse
(b) CAS-vor-RAS-Refresh Lesezyklus
Refresh-Zyklus
RAS CAS Adresse Daten
Zeile
Spalte gültig
(c) Hidden-Refresh
Abb. 16.7: Die drei gebräuchlichsten Refresh-Arten: (a) RAS-only-Refresh, (b) CAS-vor-RAS-Refresh, (c) Hidden-Refresh
Sandini Bib 534
Kapitel 16
RAS-only-Refresh Die einfachste Art der Auffrischung einer Speicherzelle besteht darin, einen Blindlesezyklus auszuführen, bei dem zwar das RAS-Signal aktiviert und dem DRAM eine Zeilenadresse, die Refresh-Adresse, zugeführt wird, das CAS-Signal aber inaktiv bleibt. Intern liest der DRAM dann eine Zeile auf die Bitleitungspaare aus und verstärkt die ausgelesenen Daten. Diese werden aber wegen des inaktiven CAS-Signals nicht zum I/O-Leitungspaar und damit zum Datenausgangspuffer übertragen. Um den gesamten Speicher aufzufrischen, muss eine externe Logik oder der Prozessor selbst nach und nach alle Zeilenadressen des DRAM zuführen. Diese Art der Auffrischung wird als RAS-only-Refresh bezeichnet. Der Nachteil ist, dass eine externe Logik erforderlich ist, um die Auffrischung auszuführen. CAS-vor-RAS-Refresh Aktuellere DRAM-Chips verfügen zusätzlich über einen oder mehrere interne Refresh-Modi. Der wichtigste ist der so genannte CAS-vor-RAS-Refresh. Der DRAM-Chip besitzt zu diesem Zweck eine eigene Refresh-Logik mit einem Adresszähler. Beim CAS-vor-RAS-Refresh hält man CAS für eine bestimmte Zeit auf einem niedrigen Pegel, bevor RAS abfällt – daher auch die Bezeichnung CAS-vor-RAS. Hierdurch wird die On-Chip-Auffrischung (d.h. die interne RefreshLogik) aktiviert, und die Refresh-Logik führt eine automatische interne Auffrischung aus. Das Besondere ist, dass die Refresh-Adresse intern vom Adresszähler in der Refresh-Logik erzeugt wird und nicht extern zugeführt werden muss. Nach jedem CAS-vor-RAS-Refresh-Zyklus wird der interne Adresszähler erhöht, so dass er die neue aufzufrischende Adresse angibt. Es genügt also, wenn die Speichersteuerung den DRAM von Zeit zu Zeit in der beschriebenen Weise »anstößt«, um eine Auffrischung auszuführen. Auch beim CAS-vor-RAS-Refresh können mehrere Refresh-Zyklen hintereinander ausgeführt werden. Hidden-Refresh Eine weitere Möglichkeit ist der Hidden-Refresh. Hier wird der Refresh-Zyklus quasi hinter einem normalen Lesezugriff »versteckt« – daher auch die Bezeichnung Hidden. Beim HiddenRefresh hält man das CAS-Signal weiter auf einem niedrigen Pegel und schaltet nur das RASSignal um. Die im Lesezyklus gelesenen Daten bleiben auch während des Refresh-Zyklus gültig. Weil die Dauer des Refresh-Zyklus im Allgemeinen kürzer als der Lesezyklus ist, spart diese Refresh-Art etwas Zeit ein. Auch beim Hidden-Refresh erzeugt ein Adresszähler im DRAM selbst die Refresh-Adresse. Die in Abbildung 16.7 gezeigten Zeilen- und Spaltenadressen beziehen sich auf den Lesezyklus. Wenn das CAS-Signal lange genug auf einem niedrigen Pegel bleibt, können mehrere Refresh-Zyklen hintereinander ausgeführt werden. Dazu ist es nur notwendig, das RAS-Signal öfters zwischen einem niedrigen und einem hohen Pegel umzuschalten.
16.1.5 Organisationsformen Wie eingangs bereits erwähnt wurde, haben sich mit der Entwicklung immer größerer Speicherchips sich auch verschiedene Organisationsformen durchgesetzt. Ein 1-MBit-Chip mit einem Datenanschluss besitzt eine so genannte 1MWort * 1Bit-Organisation. Das bedeutet nichts anderes, als dass der Speicherchip 1M Worte mit einer Breite von jeweils einem Bit aufweist, also genau einen Datenanschluss besitzt. Eine andere häufig benutzte Organisationsform für einen 1MBit-Chip ist die 256kWort * 4Bit-Organisation. Diese Chips weisen dann 256k Worte mit einer Breite von jeweils vier Bit auf; die Speicherkapazität beträgt auch in diesem Fall 1MBit. Die erste Zahl gibt also immer die Anzahl der Worte und die zweite die Anzahl der Bits je Wort an. Im Gegensatz zum 1M*1-Chip besitzt der 256k*4-Chip vier Datenpins, da bei einem Speicherzugriff prinzipiell ein Wort ausgegeben wird.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
535
In Abbildung 16.8 wird das Anschlussschema eines 256k*4-Chips gezeigt. Gegenüber dem 1M*1DRAM sind vier bidirektionale Datenein-/ausgabepins D1 bis D4 vorhanden. Das Signal am Anschluss OE (Output Enable) weist den Datenpuffer im DRAM an, Daten an die Pins D1–D4 auszugeben (OE auf niedrigem Pegel) oder von den Datenpins D1–D4 einzulesen (OE auf hohem Pegel). D1 D2 WE RAS frei A0 A1 A2 A3 Vcc
21014 1Mb-DRAM (256k*4Bit)
GND D4 D3 CAS OE A8 A7 A6 A5 A4
Abb. 16.8: Anschlussschema eines 256k*4-Chips
Mittlerweile gibt es eine Vielzahl von Speicherchips in den unterschiedlichsten Organisationsformen (x1, x4, x8, x16). DRAMs mit einer Organisation von mehr als 4 Bit parallel werden oftmals auch als WIDE-DRAMs bezeichnet. Kennzeichnend ist dabei die Anzahl der vorhandenen Datenpins, d.h., in welcher Breite bei einem Speicherzugriff ein Datenwort ein- oder ausgegeben werden kann. Ein Chip vom Typ 1MBitx8 besitzt intern also acht Datenein- und Datenausgangspuffer. Darüber hinaus ist bei diesem Chip das Speicherzellenfeld in mindestens acht Teilfelder aufgeteilt, die jeweils einem Datenpin zugeordnet sind. Die Daten können dabei immer nur wortweise einoder ausgegeben werden, in diesem Fall also in Abschnitten zu jeweils acht Bit. Je höher die Anzahl der Datenpins eines Speicherchips ist, desto weniger Chips benötigt man für den Aufbau eines Speichermoduls oder für die Realisierung des Grafikspeichers bei einem Grafikadapter. Ein RAM-Baustein wird durch die Adressleitungen (A0–AX) adressiert. Die Speicherzellen im Innern sind in Spalten und Zeilen angeordnet. Zum Adressieren einer bestimmten Zelle werden zwei Adressen – eine für die Zeile und eine für die Spalte – benötigt. Um die Anzahl der Anschlüsse am RAM-Baustein gering zu halten, werden die Adressen über gemeinsame Anschlüsse gesendet (A0–AX), und die Unterscheidung in Zeile und Spalte erfolgt mit den Signalen RAS (Row Address Strobe) und CAS (Column Address Strobe). Ist RAS gleich Low, befindet sich die Adresse der Zeile auf dem Adressbus; ist CAS gleich Low, befindet sich dort die Adresse der Spalte. In internen Zwischenspeichern (Buffers) werden die beiden Teiladressen gespeichert und adressieren somit das Memory-Array. Ein Refresh-Zyklus wird über einen Low/High/Low-Impuls mit Hilfe des RAS-Signals ausgeführt. Die Unterscheidung dahingehend, ob Daten geschrieben oder gelesen werden, erfolgt mit dem Write-Enable-Signal (WE). Bei aktivem (Low) WE-Signal wird die am Dateneingang (D) liegende Information eingelesen und in die adressierte Speicherzelle geschrieben. Ist das Signal WE gleich High, werden die Daten über den Datenausgang (Q) ausgegeben.
Sandini Bib 536
Kapitel 16
Abb. 16.9: Das Innenleben eines DRAMs vom Typ 1 MBit x 1 Bit. Zur Realisierung eines PC-üblichen Moduls (SIMM) werden acht dieser Bausteine (oder 9 mit Parity) benötigt, damit sich eine Datenbreite von einem Byte ergibt.
16.1.6 Betriebsmodi Speicherchips besitzen die Möglichkeit, einen oder mehrere verschiedene Spaltenmodi auszuführen, um die Zugriffszeiten zu verkürzen. Der bekannteste Spaltenmodus ist wohl der Page Mode. Was es mit diesem Schlagwort und den Modi Static-Column, Nibble und Serial auf sich hat, möchte ich Ihnen kurz erläutern. In Abbildung 16.10 sehen Sie das Verhalten der wichtigsten Speichersignale, wenn der Chip eine dieser Betriebsarten beim Lesen ausführt. Zum Vergleich sehen Sie in Abbildung 16.10 (a) den Signalverlauf im herkömmlichen althergebrachten DRAM-Modus. Page-Mode In Kapitel 16.1.2 haben Sie erfahren, dass beim Zugriff auf eine Einheitszelle im Speicherchip zuerst bei aktivem RAS-Signal die Zeilenadresse und anschließend bei aktivem CAS-Signal die Spaltenadresse eingegeben wird. Außerdem werden intern immer alle Speicherzellen der adressierten Zeile auf die entsprechenden Bitleitungspaare ausgelesen. Betrifft der nachfolgende Speicherzugriff nun eine Speicherzelle in derselben Zeile, aber einer anderen Spalte – ist also die Zeilenadresse gleich geblieben und hat sich nur die Spaltenadresse verändert –, dann ist es eigentlich unnötig, die Zeilenadresse nochmals einzugeben und zu dekodieren. Im Page-Mode wird daher nur die Spaltenadresse geändert, die Zeilenadresse bleibt gleich, d.h., eine Page entspricht genau einer Zeile im Speicherzellenfeld. Den Signalverlauf im Page-Mode finden Sie in Abbildung 16.10 (b). Um den Lesevorgang einzuleiten, aktiviert die Speichersteuerung wie üblich zuerst das RASSignal und übergibt die Zeilenadresse. Ist die Adresse an den Zeilen-Dekoder übergeben, dort dekodiert und die entsprechende Wortleitung ausgewählt, so aktiviert die Speichersteuerung
Sandini Bib Speicherchips – Das Gedächtnis der Computer
537
das CAS-Signal und übergibt die Spaltenadresse der gewünschten Speicherzelle. Der SpaltenDekoder dekodiert diese Adresse und überträgt den entsprechenden Wert vom adressierten Bitleitungspaar zum Datenausgangspuffer. Im Normalmodus würde die DRAM-Steuerung nun die Signale RAS und CAS deaktivieren und der Zugriff wäre beendet. RAS CAS Adresse
Zeile
Spalte
Daten
Spalte
Zeile gültig
Zeile
Spalte
gültig
gültig
(a) Normalmodus RAS CAS Adresse
Zeile
Spalte
Daten
Spalte
Spalte
gültig
gültig
Spalte gültig
gültig
(b) Page Mode RAS CAS Adresse
Zeile
Spalte
Daten
Spalte gültig
Spalte
gültig
gültig
Spalte
Spalte
gültig
Spalte
gültig
gültig
Spalte gültig
(c) Hyper Page Mode (EDO) RAS CAS Adresse
Zeile
Spalte
Daten
Spalte gültig
Spalte
gültig
gültig
Spalte
Spalte
gültig
Spalte
gültig
gültig
Spalte gültig
(d) Static Column Mode RAS CAS Adresse
Zeile
Spalte
Daten
Zeile gültig
gültig
gültig
gültig
(e) Nibble Mode RAS CAS Adresse Daten
Zeile
Spalte gültig
gültig
gültig
gültig
gültig
(f) Serial Mode
Abb. 16.10: Signale beim Lesen in verschiedenen DRAM-Betriebsmodi
Spalte
Sandini Bib 538
Kapitel 16
Greift die Speichersteuerung nun aber im Page-Mode auf eine Speicherzelle in derselben Zeile, d.h. derselben Page, des DRAM zu, dann deaktiviert sie das RAS-Signal nicht, sondern hält es weiter auf einem aktiven, niedrigen Pegel. Stattdessen wird nur das CAS-Signal kurz deaktiviert und nach kurzer Zeit erneut aktiviert, um der DRAM-Steuerung mitzuteilen, dass die bereits dekodierte Zeilenadresse weiterhin gültig ist und nur eine andere Spaltenadresse nachgeliefert wird. Dadurch bleiben natürlich auch alle Auswahltransistoren durchgeschaltet, die mit der betreffenden Wortleitung verbunden sind, und alle auf die Bitleitungspaare ausgelesenen Daten werden von den Leseverstärkern stabil gehalten. Die neue Spaltenadresse wird im SpaltenDekoder dekodiert, der ein entsprechendes Transfergatter durchschaltet. Beim zweiten und allen nachfolgenden Zugriffen auf Speicherzellen derselben Zeile im PageMode entfallen daher die RAS-Vorladezeit sowie die Übertragung und Dekodierung der Zeilenadresse, nur die Spaltenadresse wird übergeben und dekodiert. Im Page-Mode ist die Zugriffszeit um etwa 50% und die Zykluszeit sogar bis zu 70% geringer als im Normalmodus. Das gilt natürlich nur für den zweiten und alle nachfolgenden Zugriffe. Aus Gründen der Stabilität darf auch die Zeitspanne, während der das RAS-Signal aktiv ist, nicht beliebig lange dauern. Typischerweise können etwa 200 Zugriffe innerhalb einer Page ausgeführt werden, bevor die Speichersteuerung das RAS-Signal für einen Zyklus deaktivieren muss. Der Betrieb im Page-Mode ist aber nicht nur auf das Lesen von Daten beschränkt, vielmehr können Daten auch im Page-Mode geschrieben sowie Lese- und Schreibvorgänge innerhalb einer Page gemischt werden, ohne dass der DRAM den Page-Mode verlassen muss. Bei einem 1-MBitChip mit einem Speicherzellenfeld von 1024 Zeilen zu je 1024 Spalten umfasst eine Page 1024 Speicherzellen. Ist der Hauptspeicher mit einer Breite von 32 Bit aufgebaut, sind also 32 1-MBitChips vorhanden, dann ist eine Hauptspeicher-Page 4 KByte groß. Da die Befehlscodes und auch die meisten Daten zu einer Blockbildung neigen und der Prozessor selten auf Daten zugreift, die weiter als 4 KByte vom gerade angesprochenen Wert entfernt sind, kann der Page-Mode sehr effektiv eingesetzt werden, um die Zugriffs- und Zykluszeiten der Speicherbausteine zu verringern. Adressiert die CPU aber eine Speicherzelle in einer anderen Zeile, d.h. eine andere Page, so muss der DRAM den Page-Mode verlassen und die RAS-Vorladezeit schlägt wieder zu. Dasselbe gilt natürlich auch, wenn das Signal RAS von der Speichersteuerung nach der maximalen Aktivzeit deaktiviert wird. Hyper-Page-Mode (EDO-Modus) Beim Hyper-Page-Modus – auch unter der Bezeichnung EDO-Modus bekannt – ist der zeitliche Abstand zwischen zwei aufeinander folgenden CAS-Aktivierungen kürzer als beim normalen Page-Modus (siehe Abbildung 16.10 (c)). Dadurch werden die Spaltenadressen schneller übergeben, und die CAS-Zugriffszeit ist deutlich kürzer (im Allgemeinen 30% als beim gewöhnlichen Page-Modus), und die Datenübertragungsrate ist entsprechend größer. Aber auch in diesem EDO-Modus steigt das CAS-Signal vor jeder neuen Spaltenadresse wieder auf einen hohen Pegel an; beim im Folgenden beschriebenen Static-Column-Modus bleibt es hingegen beständig auf einem niedrigen Pegel. Static-Column-Mode Eng verwandt mit dem Page-Mode ist der Static-Column-Mode (siehe Abbildung 16.10 (d)). Hier wird nicht einmal mehr das CAS-Signal umgeschaltet, um dem Chip mitzuteilen, dass eine neue Spaltenadresse anliegt. Stattdessen wird nur die zugeführte Spaltenadresse geändert, und CAS bleibt unverändert auf einem niedrigen Pegel. Die DRAM-Steuerung ist intelligent genug, dass sie auch ohne Umschaltung von CAS nach einer kurzen Reaktionszeit erfasst, ob sich die angelegte Spaltenadresse geändert hat. Das spart zusätzlich einen Teil der CAS-Umschalt- und
Sandini Bib Speicherchips – Das Gedächtnis der Computer
539
Reaktionszeiten ein. Der Static-Column-Modus ist also nochmals schneller als der Page-Mode. Auch hier dürfen RAS und CAS aber nicht beliebig lange low bleiben. Chip-intern werden nur die entsprechenden Gatter zum Ausgabepuffer durchgeschaltet. Im Static-Column-Mode sind also alle Speicherzellen einer Zeile wahlfrei zugänglich. DRAM-Chips mit Static-Column-Mode sind aber relativ selten und werden im PC-Bereich kaum benutzt. Einige der IBM-PS/2-Modelle benutzten Static-Column-Chips statt DRAM mit Page-Mode. Nibble-Mode Der Nibble-Mode ist eine einfache Form eines seriellen Modus: Durch ein viermaliges Umschalten von CAS werden nacheinander vier Datenbits aus einer adressierten Zeile herausgetaktet (ein Nibble ist gleich vier Bit oder einem halben Byte). Das erste Datenbit ist durch die zugeführte Spaltenadresse festgelegt, die drei anderen folgen unmittelbar auf diese Adresse. Intern besitzt ein DRAM-Chip mit Nibble-Mode meist einen 4-Bit-Zwischenpuffer, der die vier aufeinander folgenden Datenbits aufnimmt und, getaktet vom CAS-Signal, nacheinander zum Ausgabepuffer schiebt. Das geht sehr schnell, weil alle vier adressierten Datenbits (eines explizit und drei implizit) auf einmal in den Zwischenpuffer übertragen werden, und die drei späteren Datenbits nur noch verschoben, aber nicht mehr gelesen werden müssen. DRAM-Chips mit Nibble-Mode haben im PC-Bereich jedoch keine große Bedeutung erlangt. Serial-Mode Den Serial-Mode kann man als erweiterten Nibble-Mode ansehen. Auch hier werden die Datenbits innerhalb einer Zeile lediglich durch Umschalten von CAS aus dem Chip herausgetaktet. Im Unterschied zum Nibble-Mode ist die Anzahl der CAS-Umschaltungen und somit der Datenbits aber nicht auf vier beschränkt. Stattdessen kann im Prinzip eine ganze Zeile von Daten seriell ausgegeben werden. Hier spielt also die innere Organisation des Chips eine Rolle, weil eine Zeile bei einem 1-MBit-Chip ja z.B. 1024 oder 2048 Spalten aufweisen kann. Die zugeführten Zeilenund Spaltenadressen kennzeichnen nur den Beginn des Zugriffs, beim Umschalten von CAS zählt der DRAM-Chip selbstständig intern die Spaltenadresse hoch. Der Serial-Mode ist vor allem für das Auslesen von Bildschirmspeichern oder das Füllen einer Cache-Line vorteilhaft, weil die Lesezugriffe des CRT-Controllers oder des Cache-Controllers über weite Strecken serieller Natur sind. Interleaving Eine weitere Möglichkeit, die Verzögerungen durch die RAS-Vorladezeit zu umgehen, besteht im Interleaving des Speichers. Dazu wird der Speicher in mehrere Banks aufgeteilt, die in einem bestimmten Verhältnis verzahnt sind. Beim 2-Wege-Interleaving wird der Speicher in zwei Banks aufgeteilt, die beispielsweise jeweils 32 Bit breit sind. Alle Daten mit geraden Doppelwortadressen befinden sich in Bank 0, alle Daten mit ungeraden Doppelwortadressen in Bank 1. Bei einem sequenziellen Zugriff auf den Speicher, wie ihn z.B. der Prefetcher im 486DX ausführt, werden daher die beiden Banks abwechselnd angesprochen. Das bedeutet, dass sich die RAS-Vorladezeit einer Bank mit der Zugriffszeit der anderen Bank überschneidet, oder anders ausgedrückt, dass Bank 0 vorgeladen wird, während die CPU auf Bank 1 zugreift und umgekehrt. In Abbildung 16.11 ist das anhand der Signale dargestellt. Da für die Zugriffsrate der CPU hier nur die Zugriffszeit und nicht die Zykluszeit maßgebend ist, kann die Rate verdoppelt werden; die effektive Zugriffszeit für mehrere aufeinander folgende Speicherzugriffe wird halbiert. In Abbildung 16.11 sehen Sie denselben Vorgang ohne Interleaving – der Unterschied ist deutlich zu erkennen. 3-Wege- und 4-Wege-Interleaving verläuft nach demselben Prinzip, nur wird hier der Speicher in drei bzw. vier Banks aufgeteilt, und
Sandini Bib 540
Kapitel 16
die zeitlichen RAS- und CAS-Verschiebungen betragen statt der Hälfte nur noch ein Drittel bzw. ein Viertel der normalen Zykluszeit. RAS0 CAS0 Dout
3
1 1
2
3
5 4
5
9
7 6
7
8
9
10
RAS1 2
CAS1
6
4
10
8
RAS CAS Dout
1
2
3
1
2
3
4 4
5 5
Abb. 16.11: 2-Wege-Interleaving: Durch das Interleaving (Abbildung oben) wird bei einem abwechselnden Zugriff auf die beiden Speicherbänke die RAS-Vorladezeit umgangen, es ist also nur die Zugriffszeit, nicht aber die Zykluszeit des Chips maßgeblich. Ohne Interleaving (Abbildung unten) ist dagegen die fast doppelt so große Zykluszeit maßgeblich, wiederholte Zugriffe können also nur halb so schnell ablaufen.
Die beiden Konzepte Page-Mode und Interleaving führen aber leider nicht immer zum Erfolg. Wie ich bereits erwähnt habe, ist es für einen vorteilhaften Effekt des Page-Mode-Betriebs notwendig, dass die Speicherzugriffe auf dieselbe Page erfolgen. Ein Wechsel der Page führt zu einer RAS-Vorladezeit und damit zu einer Verzögerung beim Speicherzugriff. In gleicher Weise ist es für einen Vorteil des Interleaving notwendig, dass die Zugriffe bei einem 32-Bit-Datenbus abwechselnd auf gerade und ungerade Doppelwortadressen oder bei einem 16-Bit-Datenbus abwechselnd auf gerade und ungerade Wortadressen stattfinden. Greift die CPU zweimal hintereinander auf gerade oder ungerade Doppelwort- bzw. Wortadressen zu, so macht sich auch in diesem Fall die RAS-Vorladezeit nachteilig bemerkbar. Glücklicherweise neigen Code und Daten zu einer Gruppenbildung; außerdem läuft das Prefetching sequenziell ab, so dass Page-Mode und Interleaving in den meisten Fällen – aber wie gesagt nicht immer – die Zugriffsrate auf den Speicher deutlich erhöhen können. Die Trefferrate beträgt beim Page-Mode/Interleaving typischerweise 80%. Voraussetzung dafür ist eine recht intelligente Speichersteuerung, die erkennen muss, ob im Page-Mode der Zugriff innerhalb derselben Page stattfindet oder ob beim Interleaving die andere Bank angesprochen werden soll. Ist das nicht erfüllt, so muss die Speichersteuerung flexibel Wait-States einlegen, bis die DRAMs reagiert haben und die Daten zur Verfügung stellen oder einschreiben können. Die hier erläuterten Speicher arbeiten asynchron zum Systemtakt mit einem unterschiedlichen RAS- und CAS-Timing, womit spätestens bei 100 MHz die Grenze des Machbaren erreicht scheint. Die letzte in PC gebräuchliche asynchron arbeitende Speichergeneration sind die EDODRAMs, die allerdings auch nur beim Lesen und nicht beim Schreiben von Daten einen Performance-Gewinn gegenüber den anderen Typen zeigen. Einen größeren Vorteil bieten die BEDO-RAMs (Burst Extended Data Output), die sowohl die Lese- als auch die Schreibleistung verbessern. Sie arbeiten im Burst-Modus, d.h., dass nur eine Adresse gefolgt von mehreren Daten(-Blöcken) verarbeitet werden kann. Es werden also
Sandini Bib Speicherchips – Das Gedächtnis der Computer
541
Adressierungszyklen eingespart, weil ein BEDO-RAM selbsttätig die Adresseninformation inkrementiert. Hierfür ist allerdings eine gegenüber EDO abweichende Funktion des CAS-Signals notwendig. Nach der Signalisierung der gültigen Spaltenadresse wird es als Takt für den Burst-Zähler verwendet, womit aber keine Abwärtskompatibilität zu EDO oder Fast Page Mode gegeben ist. In PCs wurden BEDO-Speicher jedoch kaum eingesetzt, da sich Intel stattdessen für die SDRAMs als Nachfolger der EDO-DRAMs entschieden hat und sich die Konkurrenz nicht dagegen durchsetzen konnte. Gleichwohl ist es aber auch bei den SDRAMs der Burst-Modus, der für eine bessere Leistung verantwortlich ist. Im folgenden Kapitel werde ich bei den Speichermodulen noch näher darauf eingehen.
16.2 Speichermodule Heutzutage finden bekanntlich anstelle der einzeln einzusetzenden Chips für den Systemspeicher kompaktere Speichermodule wie SIMMs, PS/2-Module oder DIMMs Verwendung. SIMMund SIP-Module weisen standardmäßig eine Datenbreite von neun Bit auf. PS/2-Module haben eine Datenbreite von 36 Bit (Module mit Parität), 32 Bit (Module ohne Parität) oder 40 Bit (ECCModule). Auf den Modulen ist die erforderliche Zahl von Speicherchips installiert, um die angegebene Speicherkapazität zu erreichen. Die Module müssen Sie in die vorgesehenen Fassungen der Banks einsetzen. Eine Bank muss stets komplett mit Modulen belegt werden. Ab den Pentium-CPUs entspricht eine Bank zwei PS/2-Steckplätzen oder einem DIMM-Steckplatz, da die DIMMs stets über eine 64-Bit-Datenbreite verfügen. In Abbildung 16.12 sind SIMM-, SIP- und PS/2-Module abgebildet. SIMM-, PS/2- und DIMModule besitzen eine Steckerleiste ähnlich den Steckkarten für die Busslots, und SIP-Module sind mit Pins versehen, die in entsprechende Löcher eingesetzt werden müssen. Heute sind nur noch PS/2- und DIM-Module (Abbildung 16.13) üblich. In den folgenden Abschnitten möchte ich Ihnen kurz die Anschlüsse des PS/2-Moduls mit und ohne Parität vorstellen. Die ähnlich benannten Kontakte der SIM- und SIP-Module haben eine entsprechende Funktion. A0–A11 (I) Anschlüsse 12–19, 28–29, 31–32 Den zwölf Anschlüssen werden die Zeilen- und Spaltenadressen mit RASx bzw. CASx zugeführt. CAS3–CAS0 (I) Anschlüsse 40–43 Den Column-Address-Strobe-Anschlüssen werden die Spaltenadress-Abtastsignale von der Speichersteuerung zugeführt, und es werden somit individuelle Bytes ausgewählt. DQ34–DQ27, DQ25–DQ18, DQ16–DQ9, DQ7–DQ0 (I/O) Anschlüsse 2–9, 20–27, 49–58, 60–65 Über die Anschlüsse werden die 32 Datenbits zugeführt bzw. von diesen abgegeben. PD4–PD1 (I) Anschlüsse 67–70 Über diese Anschlüsse (Presence Detect) wird der Mainboard-Elektronik signalisiert, wie die DRAMChips des Moduls organisiert sind und über welche Zugriffszeit sie verfügen, was somit eine automatische Speichereinstellung durch das BIOS ermöglicht.
Sandini Bib 542
1
ohne mit Parität Parität
20
30
Vcc 1 CAS DQ0 A0 A1 DQ1 A2 A3 GND DQ2 10 A4 A5 DQ3 A6 A7 DQ4 A8 A9 A10 DQ5 20 W GND DQ6 frei DQ7 Q8 RAS CAS8 D8 Vcc 30
Speicherchips
SIMM
GND DQ0 DQ18 DQ1 DQ19 DQ2 DQ20 DQ3 DQ21 Vcc frei A0 A1 A2 A3 A4 A5 A6 frei DQ4 DQ22 DQ5 DQ23 DQ6 DQ24 DQ7 DQ25 A7 frei Vcc A8 A9 RAS3 RAS2 frei frei
GND DQ0 DQ18 DQ1 DQ19 DQ2 DQ20 DQ3 DQ21 Vcc frei A0 A1 A2 A3 A4 A5 A6 A10 DQ4 DQ22 DQ5 DQ23 DQ6 DQ24 DQ7 DQ25 A7 A11 Vcc A8 A9 RAS3 RAS2 PQ26 PQ8
frei frei GND CAS0 CAS2 CAS3 CAS1 RAS0 RAS1 frei WE frei DQ9 DQ27 DQ10 DQ28 DQ11 DQ29 DQ12 DQ30 DQ13 DQ31 Vcc DQ32 DQ14 DQ33 DQ15 DQ34 DQ16 frei PD1 PD2 PD3 PD4 frei GND
PQ17 PQ35 GND CAS0 CAS2 CAS3 CAS1 RAS0 RAS1 frei WE frei DQ9 DQ27 DQ10 DQ28 DQ11 DQ29 DQ12 DQ30 DQ13 DQ31 Vcc DQ32 DQ14 DQ33 DQ15 DQ34 DQ16 frei PD1 PD2 PD3 PD4 frei GND
1
10
20
30
36 37 40
Speicherchips
10
Speicherchips
Vcc CAS DQ0 A0 A1 DQ1 A2 A3 GND DQ2 A4 A5 DQ3 A6 A7 DQ4 A8 A9 A10 DQ5 W GND DQ6 frei DQ7 Q8 RAS CAS8 D8 Vcc
Kapitel 16
50
60
70 72
PS/2
SIP Abb. 16.12: Speichermodule, die bei PCs bis hin zum Pentium verwendet werden
PQ8, PQ17, PQ26, PQ35 (O; nur Module mit Parität) Anschlüsse 35–38 Über diese Anschlüsse gibt das Modul die vier Paritätsbits ab.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
543
RAS3–RAS0 (I) Anschluss 33, 34, 44, 45 Über die Row-Address-Strobe-Anschlüsse werden die Zeilenadress-Abtastsignale zugeführt. WE (I) Anschluss 47 Wenn Daten in die Chips geschrieben werden sollen, dann aktiviert die Speichersteuerung das Write-Enable-Signal am Anschluss WE. Bei einem hohen Pegel werden Daten aus den DRAMChips gelesen. Vcc Anschlüsse 10, 30, 59 Den drei Anschlüssen wird die Versorgungsspannung zugeführt. GND Anschlüsse 1, 39, 72 An diese Anschlüsse wird das Masse-Potenzial angelegt.
16.2.1 Parität Bei Modulen mit Parität muss noch zwischen echter und unechter Parität unterschieden werden: Bei echter Parität werden die Paritätsbits von der Speichersteuerung beim Schreiben erzeugt und in den Speicherchips des Moduls gespeichert. Beim Auslesen gibt das Modul dann die gespeicherte Paritätsinformation ab. Auch bei unechter Parität generiert die Speichersteuerung die Paritätsbits und gibt sie beim Schreiben an das Modul weiter. Das Modul ignoriert diese Paritätsinformation aber, d.h., die Paritätsbits werden nicht gespeichert. Beim Auslesen erzeugt nun eine einfache, auf dem Modul gebildete Logik die Paritätsinformation aus den Datenbits. Dadurch kann niemals ein Paritätsfehler auftreten, die vom Modul gelieferte Paritätsinformation ist also wertlos. Solche Module sparen mehr als 10% (4 von 36 Bits) an Speicherkapazität ein und sind daher auch entsprechend billiger. Sie dienen vor allem zur Bestückung von Hauptspeichern, die von einem Speichercontroller gesteuert werden, der eine Paritätsinformation verlangt. Da die Leistungsfähigkeit der Parität zur Erkennung von Datenfehlern sehr beschränkt ist, verzichten moderne Speichersteuerungen auf die Parität oder implementieren einen leistungsfähigen ECCSpeicher, der Fehler nicht nur zuverlässig erkennen, sondern in den meisten Fällen sogar selbstständig korrigieren kann.
16.2.2 DIM-Module Neuere Pentium-Systeme besitzen überhaupt keine PS/2-SIMM-Steckplätze mehr, sondern Steckplätze für Double Inline Memory Module – kurz DIMMs. Einige Pentium-Mainboards bieten jedoch noch beide Möglichkeiten der Bestückung. Eine gemischte Bestückung von SIMMs und DIMMs ist auf einem geeigneten Mainboard zwar meist zulässig, wenn man sich immer an die Komplettbestückung einer Bank hält, allerdings ist es meist aber nicht möglich, dass sowohl alle vorhandenen PS/2-SIMM- als auch die DIMM-Steckplätze gleichzeitig verwendet werden können. Tabelle 16.1 zeigt hierfür ein typisches Beispiel.
Sandini Bib 544
Kapitel 16
Bank 0: SIMM1 + SIMM2
Bank 1: SIMM3 + SIMM4
Bank 2: DIMM1
Bank 3: DIMM3
Module eingesetzt Module eingesetzt Module eingesetzt Module eingesetzt Module eingesetzt Module eingesetzt Module eingesetzt
Module eingesetzt Module eingesetzt Module eingesetzt Module eingesetzt Module eingesetzt
Modul eingesetzt Modul eingesetzt Modul eingesetzt Modul eingesetzt Modul eingesetzt Modul eingesetzt
Modul eingesetzt Modul eingesetzt Modul eingesetzt Modul eingesetzt Modul eingesetzt Modul eingesetzt -
Tab. 16.1: Typische Kombinationsmöglichkeiten von PS/2-SIM- und DIM-Modulen bei einem Pentium-Mainboard
Die 168-poligen DIMMs verfügen stets über eine Breite von 64 Bit, wobei jedes DIMM jeweils einer Bank entspricht, so dass für Pentium-PCs in der Mindestausstattung nur ein einziges DIMM notwendig ist. Als Chips werden auf den DIMMs vorwiegend die SDRAMs (siehe den folgenden Abschnitt) eingesetzt, die mit 3,3 V betrieben werden. Allerdings gibt es auch DIMMs, die keine SDRAMs, sondern EDO-RAMs verwenden, und die benötigen eine Spannung von 5 V. Nach einem fälschlichen Betrieb mit 5 V sind die SDRAMs defekt, während die EDO-DIMMs mit 3,3 V überhaupt nicht oder nur fehlerhaft arbeiten, dabei jedoch nicht zerstört werden. Bei einigen Mainboards findet sich ein entsprechender Jumper, der eine Festlegung der notwendigen Spannung erlaubt.
Abb. 16.13: Anschlussschema der DIMMs für EDO- und SDRAM-Chips. Die Einkerbungen sollen das Einstecken von nicht geeigneten Modulen (5 V oder 3,3 V, buffered oder unbuffered) bei einem Mainboard verhindern.
In den folgenden Abschnitten möchte ich Ihnen kurz die Anschlüsse eines DIM-Moduls vorstellen. WE (I) Anschluss 47 Sollen Daten in die Chips geschrieben werden, dann aktiviert die Speichersteuerung das WriteEnable-Signal am Anschluss WE. Bei einem hohen Pegel werden Daten aus den DRAM-Chips gelesen. A0–A11 (I) Anschlüsse 33–38, 117–121, 123 Die Adresseingänge für die Spalten- und Zeilenadressierung.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
545
BA0, BA1 (I) Anschlüsse 122, 39 Bank Address, bestimmen die jeweilige interne Speicherbank für die Read-, Write- und PrechargeKommandos. CLK0–CLK3 (I) Anschlüsse 42, 79, 125, 163 Clock-Signale, der Systemtakt; alle Eingangssignale werden auf der ansteigenden Flanke des Clocks getriggert, wobei der Burst-Counter automatisch inkrementiert wird. CKE0, CKE1 (I) Anschlüsse 63, 128 Clock Enable, aktivieren (High) oder deaktivieren (Low, für Power down) die Clock-Signale. DQ0–DQ63 (I/O) Anschlüsse 2–5, 7–11, 19, 20, 153–156, 158–161 Der 64 Bit breite Datenbus. DQMB0–DQMB7 (I/O) Anschlüsse 28, 29, 46, 47, 112, 113, 130, 131 Input/Output Mask, Maskierungssignale für Schreibzugriffe und Freigabesignale für Lesezugriffe. RAS, CAS, WE (I) Anschlüsse 27, 111, 115 Die Signaleingänge für die SDRAM-Kommandos. CS0, CS2, CS3 (I) Anschlüsse 30, 45, 129 Dies sind die Chip Select-Signale, die den internen Kommando-Dekoder aktivieren (Low) oder deaktivieren (High). NC Anschlüsse 24, 25, 31, 44, 48, 50, 51, 61, 62, 80,81, 108, 109, 126, 132, 145, 146, 147 No Connection, diese Pins sind nicht angeschlossen. SA0–SA2 (I) Anschlüsse 165–167 Presence Detect Address, werden für die automatische Modulkonfigurierung (EEPROM) verwendet und vom Chipsatz entsprechend gesendet. SDA (I/O) Anschluss 82 Serial Presence Detect Data, für das Senden und Empfangen der Chip-Daten des auf dem Modul integrierten EEPROMs. SCL (I) Anschluss 83 Serial Clock, das Taktsignal für Serial Presence Detect Data (SDA).
Sandini Bib 546
Kapitel 16
Vcc (I) Anschlüsse 6, 18, 26, 40, 41, 49, 59, 73, 84, 90, 102, 110, 124, 133, 143, 157, 168 Die Signale für die Spannungsversorgung von 3,3 V (+/-0,3 V). Vss (I) Anschlüsse 1,12, 23, 32, 43, 54, 64, 68, 78, 85, 96, 107, 116, 127, 138, 148, 152, 162 Die Masseleitungen (GND, Ground) des Moduls.
16.2.3 Synchronous Dynamic RAM – SDRAM Die SDRAMs (Synchronous DRAM, nicht zu verwechseln mit SRAM = statisches RAM!) besitzen eine typische Zugriffszeit von lediglich 7–15 ns und können synchron mit dem Systemtakt arbeiten, der typischerweise mindestens bei 66 MHz und maximal bei 166 MHz liegt. Die EDO-RAMs besitzen hingegen in der Mehrzahl der Fälle eine Zugriffszeit von 50–60 ns. Allerdings fällt der Unterschied in der Praxis nicht so drastisch ins Gewicht, wie man vielleicht vermuten würde. Der L2-Cache-Speicher spielt dabei eine gewichtige Rolle und fängt die schlechtere EDO-Performance gewissermaßen wieder auf. Erst ab einem Systemtakt von 100 MHz kommt generell der Geschwindigkeitsvorteil der SDRAMs gegenüber den EDO-DRAMs merklich zum Tragen, der allerdings von vielen älteren Chipsätzen überhaupt nicht ausgespielt werden kann.
Abb. 16.14: Ein Read-Burst-Zyklus eines SDRAMs, gefolgt von einem Read-Zyklus. Bei aktivem DQM-Signal (Input/Output Mask) sind die Read-Daten (DOUT) an DQ gültig.
Für SDRAMs werden als Speichermodule 168-polige Steckplatinen (die DIMMs, siehe vorherigen Abschnitt) verwendet, die eine Datenbreite von 64 Bit aufweisen. SDRAMs arbeiten im Burst-Modus, und zwar mit einem synchronen Takt (Mainboard-, Systemtakt) und nicht wie die anderen mit einem unterschiedlichen CAS- und RAS-Timing vom Chipset her. Die entsprechenden RAS-, CAS-, WE- und CE-Signale gibt es zwar auch bei SDRAMs, allerdings werden mit ihnen Kommandos wie Write, Read oder Burst Stop übergeben. Diese Signale werden als Command-Bus zusammengefasst, wie es im Timing-Diagramm (Abbildung 16.14) und in Tabelle 16.2 zu erkennen ist.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
547
Status
CS
RAS
CAS
WE
Aktion
Beliebig
H
X
X
X
Beliebig
L
H
H
H
Idle Idle Idle Row Active
L L L L
L L L H
H L L L
H H L H
Row Active
L
H
L
L
Row Active Read
L L
L H
H L
L H
Read
L
H
L
L
Read
L
L
H
L
Read Write
L L
H H
H L
L H
Write
L
H
L
L
Write Write
L L
L H
H H
L L
Command Inhibit, NOP, ggf. Fortführung der vorherigen Operation No Operation, NOP, ggf. Fortführung der vorherigen Operation Active, Selektierung der Bank und der Reihe Auto Refresh, automatische Auffrischung Load Mode Register, Kommando laden Read, Selektierung der Bank und der Spalte und Read Burst starten Write, Selektierung der Bank und der Spalte und Write Burst starten Precharge, Deaktivierung einer Reihe oder einer Bank Read, Selektierung der Bank und der Spalte und neuen Read Burst starten Write, Selektierung der Bank und der Spalte und neuen Write Burst starten Precharge, Read Burst abbrechen und Precharge starten Burst Terminate, Burst-Zyklus beenden Read, Selektierung der Bank und der Spalte und Read Burst starten Write, Selektierung der Bank und der Spalte und neuen Write Burst starten Precharge, Write abbrechen und Precharge starten Burst Terminate, Burst-Zyklus beenden
Tab. 16.2: SDRAM-Kommandos
Grundsätzlich entspricht ein SDRAM intern einem DRAM, wobei es sich aus mehreren DRAMBänken zusammensetzt. Dabei kommen, wie beschrieben, die RAS- und CAS-Signale nebst Interleaving zum Einsatz, damit etwa eine Bank geladen und eine andere gleichzeitig beschrieben werden kann. Extern arbeitet ein SDRAM synchron mit dem Bustakt von beispielsweise 100 MHz. Aus diesem Grunde sind für SDRAMs gleich eine ganze Reihe von Parametern zu berücksichtigen. Auf die drei wichtigsten möchte ich hier noch kurz eingehen, da sie Ihnen als Beschriftungen bei den Modulen und auch im BIOS-Setup begegnen können. Wie bei den DRAMs werden zwei Adressen (zur Erinnerung: RAS = Zeile, CAS = Spalte) zum Speicher gesendet, und zwischen den beiden Zugriffen muss eine bestimmte Zeit verstreichen, bis die gewünschte Zeile im Speicherchip komplett eingelesen worden ist. Diese Zeit wird als RAS-to-CAS-Delay (trcd) bezeichnet und als Anzahl der Taktzyklen (zwei oder drei Takte) angegeben. Danach muss noch die so genannte CAS-Latenzzeit (CAS Latency, CL) abgewartet werden, die ebenfalls als Anzahl der Taktzyklen angegeben wird, bis die Daten am Ausgang des SDRAMs zur Verfügung stehen. Der dritte wichtige SDRAM-Parameter ist die RAS Precharge Time (trp), die dafür benötigt wird, um auf eine neue Zeile umzuschalten. Diese Zeit entfällt, wenn keine neue Zeile angesteuert werden muss, weil sich die Daten innerhalb einer Seite (Page) befinden. Diese drei Parameter (CL, trcd, trp) sollen sich laut Standard auf einem SDRAM-Speichermodul befinden, also beispielsweise als PC100 333, was bedeutet, dass dieser Typ jeweils drei Taktzyklen für die erläuterten Zugriffe benötigt. Ein Modul mit PC100 222 ist demnach der schnellere Typ.
Sandini Bib 548
Kapitel 16
Abb. 16.15: Der interne Aufbau eines SDRAMs
In Abbildung 16.15 ist der interne Aufbau eines SDRAM-Chips gezeigt. Mithilfe der drei BA-Signale wird die jeweilige Bank selektiert, und an den Pins DQ0–DQ31 stehen die 32-Bit-Daten an. Die DQM-Signale stellen dabei die Maskierungssignale für die Schreibzugriffe und die Freigabesignale für die Lesezugriffe dar. Mit den SDRAM-Modulen ist eine nützliche Vorkehrung für die automatische Konfigurierung in Form eines seriellen EEPROMs eingeführt worden, das sich auf den entsprechenden Modulen befindet. Das EEPROM (U22 in der Abbildung 16.16), das vom System Management Bus des Chipsets gesteuert wird, enthält Daten über den Modultyp, die Organisation der verwendeten DRAMs und über das jeweilige Timing-Verhalten, was somit nicht nur eine automatische, sondern auch eine optimale Einstellung für SDRAMs ermöglichen soll, was im Kapitel 16.3 erläutert wird.
16.2.4 Synchronous Graphic RAM – SGRAM Für den Speicher auf Grafikkarten werden auch so genannte SGRAMs – Synchronous Graphic Random Access Memory – verwendet, die im Prinzip wie die SDRAMs arbeiten, auch wenn sich die einzelnen Signalbezeichnungen beider Typen voneinander unterscheiden. Die wichtigsten Unterschiede dabei sind, dass die SDRAMs für eine möglichst hohe Speicherkapazität optimiert sind und die SGRAMs für eine möglichst hohe Datenübertragungsrate. Die SGRAMs kennen gegenüber den SDRAMs auch andere Befehle (z.B. Block Write, Write per Bit), die speziell für Grafik- und Videoanwendungen sinnvoll eingesetzt werden können.
16.2.5 Double Data Rate SDRAM – DDR-SDRAM Mit den Chipsets der Firma VIA für sockelbasierte Athlons sind die Double Data Rate SDRAMs (DDR-SDRAM) eingeführt worden, die ebenfalls in einer DIMM-Bauform hergestellt werden. Die DDR-Speichertechnik ist insbesondere durch VIA als konkurrierende Lösung zu RAMBus
Sandini Bib Speicherchips – Das Gedächtnis der Computer
549
vorangetrieben worden, und selbst Intel musste nach einiger Zeit einsehen, dass wohl kein Weg an DDR-SDRAM vorbeiführt, und bietet neben den Chipsets für RAMBus mittlerweile auch welche für DDR-SDRAM an.
Abb. 16.16: Die DDR-DIMMs verfügen über 184 Anschlüsse und sind nicht mit den SDRAM-DIMMs kompatibel.
DDR-Module verfügen jedoch über 184 Anschlüsse im Gegensatz zu den bis dato üblichen SDRAM-DIMMs, die 168 Pins verwenden. Die ersten Mainboards mit DDR-Unterstützung bieten drei 184-polige Modulslots, so dass man hier auch nur DDR-DIMMs und keine SDRAMDIMMs einbauen kann, obwohl einige der VIA-Chipsets prinzipiell beide Speichervarianten unterstützen. Wie es mit den SDRAM-DIMMs eingeführt wurde, besitzen auch die DDRSDRAM-Module ein EEPROM für die Speicherkennzeichnung und somit die automatische Konfigurationsmöglichkeit. Die Kommandos, wie sie für SDRAMs in der Tabelle 16.2 angegeben sind, gelten prinzipiell ebenfalls für die DDR-SDRAMs. Eine Parity-Funktion gibt es bei DDR-DIMMs nicht, sondern es kommt wie bei den SDRAMs stattdessen das ECC-Verfahren (Error Correction Codes) zum Einsatz, was zu einem 72 Bit (statt 64 Bit) breiten internen Aufbau des Moduls führt. Wie bei den DIMMs mit SDRAM exstieren sowohl DDR-Module mit als auch ohne ECC-Funktion. Wie bereits die Bezeichnung Double Data Rate vermuten lässt, soll ein DDR-SDRAM die doppelte Datenrate gegenüber einem üblichen SDRAM, das nunmehr als Single Data Rate SDRAM (SDRSDRAM) gekennzeichnet wird, erbringen, was sich jedoch in der Praxis aufgrund von Latenzzeiten im Zusammenspiel mit den passenden Chipsets nicht einstellt. Außerdem lassen sich über die klassische Verbindung CPU-Northbridge bei einem Takt von 133 MHz im günstigsten Fall nur 1,066 GByte/s (8 Bit x 133 MHz) transportieren, was bedeutet, dass dann bereits mit einem herkömmlichen PC133-DIMM das Maximum an möglicher Transferrate erreicht ist. Aus diesem Grunde handelt es sich bei den Transferangaben für DDR-SDRAMs zunächst eher um theoretische Werte, die nur in Einzelfällen eine Beschleunigung (2–20%) gegenüber SDRAM ermöglichen. Diese Einzelfälle hängen davon ab, um welche Art von Speicherzugriffen es sich jeweils handelt, ob etwa viele kleine oder aber zusammenhängende größere Bereiche des Speichers verarbeitet werden. Dies kann der Anwender weder wissen noch irgendwie beeinflussen, was aber
Sandini Bib 550
Kapitel 16
nichts daran ändert, dass DDR- das SDR-SDRAM technologisch ablöst, zumal die Stromaufnahme der DDR-Chips geringer ist und sie sich auch kostengünstiger herstellen lassen. Außerdem arbeitet der Systembus bei den Athlons von Anfang an nach dem DDR-Verfahren, so dass es sich anbietet, dieses Prinzip auch auf die Speicheranbindung zu übertragen. Wenn das Speicherinterface dann auch noch zweikanalig (Dual Channel DDR) ausgeführt wird, sieht die Sache mit den DDR-SDRAMs schon ganz anders aus, wie es auch im Kapitel über den Pentium 4 erläutert ist, der ebenfalls eine DDR-Speicheranbindung verwendet.
Abb. 16.17: Das Read-Timing eines DDR-SDRAMs. Die CAS Latency (CL) ist dabei ein wichtiger Parameter, der diejenige Zeit charakterisiert, die vom Erkennen eines Read-Kommandos bis zur Ausgabe des ersten Bits verstreicht.
Eine Verdoppelung der Datenübertragungsrate ergibt sich einfach (theoretisch), wenn die Daten nicht nur auf der ansteigenden CLK-Flanke, sondern auch auf der abfallenden Taktflanke übertragen werden. Genau dieses Prinzip wenden die DDR-SDRAMs an, wobei es sich zwar um eine neue, jedoch in weiten Teilen abwärtskompatible Lösung zu den SRAMs handelt. Es ergeben sich daher keine gravierenden technischen Konsequenzen für die Speicher- und Chipset-Hersteller, wie es etwa bei der Implementierung von RAMBus-Speicher (siehe Kapitel 16.2.6) der Fall ist. In Abbildung 16.17 ist das Read-Timing eines DDR-SDRAMs angegeben, und der wesentliche Unterschied zum SDRAM-Timing (vgl. Abbildung 16.14) besteht eben darin, dass die Ausgangsdaten (DQ) mit ansteigender und abfallender Flanke des Taktsignals ausgegeben oder übernommen werden können. Abbildung 16.18 zeigt den internen Aufbau eines DDR-RAM-Speicherbausteins, wobei die Multiplexer (Mux), der DQS-Generator und die Input-Register auffallen, denn diese Einheiten gibt es bei einem SDRAM nicht, wo die Daten vom Memory-Array direkt über entsprechende Buffer auf die DQ-Anschlüsse gelangen. Das Taktsignal besteht hier aus den zwei differenziellen Signalen (CK und CK), was zwar bereits bei den SDRAMs möglich ist, hier jedoch nunmehr zum Standard erhoben wird, damit sich das Taktsignal nicht auf die Signalmasse bezieht, was sonst zu einem ungenaueren Timing und einer höheren Störanfälligkeit führen würde. Bei einem PC266-Modul entspricht der Speichertakt klassischen 133 MHz, und dort beträgt ein Taktzyklus 7,5 ns, so dass bei Double Data Rate ein Taktzyklus nur noch die Hälfte, also 3,75 ns dauert. Um bei dieser extrem kurzen Zeitspanne noch ein exaktes Timing realisieren zu können, ist ein zusätzliches Data Strobe Signal (DQS) hinzugekommen, das aus der DLL-Einheit (Delayed Locked Loop), gesteuert vom Taktsignal, gewonnen wird.
Sandini Bib Speicherchips – Das Gedächtnis der Computer
551
Das eigentliche Speicherarray setzt sich – je nach Kapazität – aus mehreren Bänken zusammen, die über die BA-Signale (Bank Address) selektiert werden. Es unterscheidet sich nicht vom SDRAM, um aber doppelt so viele Daten pro Takt liefern zu können, wird stets gleichzeitig auf zwei Speicherzellen zugegriffen, die dann nacheinander ausgegeben werden, was mit Hilfe des Multiplexers und der Input-Register bewerkstelligt wird.
Abb. 16.18: Der interne Aufbau eines DDR-SDRAMs
Die wichtigsten Unterschiede bei den einzelnen Signalen im Vergleich zu einem SDRAM-Modul liegen zunächst darin, dass die Anschlussbelegung eine völlig andere ist, und es gibt hier die zusätzlichen Data Strobe-Signale DQS0–DQS17. Die Maskierungssignale D(Q)M werden innerhalb des Moduls mit den einzelnen Chips verdrahtet und sind nicht als Kontakte am Modul vorhanden. Die anderen Signale (Abbildung 16.19) entsprechen von ihrer Bezeichnung und Funktion her denen, die bei den SDRAM-DIMMs ebenfalls üblich sind. Die Vorsorgungsspannung sowie die Pegel der Daten betragen 2,5 V statt 3,3 V, was die Stromaufnahme und damit auch die abgegebene Wärme reduziert, sodass für die Module keine Kühlbleche notwendig sind. Die RAMBus-Chips arbeiten zwar ebenfalls mit 2,5 V, ohne zusätzliche Kühlmaßnahmen kommen sie jedoch vielfach nicht aus. Eine weitere Gemeinsamkeit von DDRSDRAM und RAMBus liegt (in der wohl zufälligen) Anzahl der benötigten Kontakte eines Moduls, denn beide Typen besitzen 184 Anschlüsse. Die gegenüber den 168-poligen SDRAMModulen hinzugekommenen Pins sind dabei für die Führung der zusätzlichen Taktsignale (DQS) notwendig. Mit den Speichertypen, die die Daten auf beiden Taktflanken übertragen können, wie es eben auch bei den RIMMs (RAMBus-Speicher, siehe folgenden Abschnitt) der Fall ist, hat es sich eingebürgert, die Speichermodule nicht nur nach ihrer Taktfrequenz wie PC133 (133 MHz) oder DDR266 (133 x 2) zu kennzeichnen, sondern auch nach Geschwindigkeitsklassen (Speed Grade) zu unterteilen. Ein DDR-DIMM laut Kennzeichnung PC1600 erreicht (theoretisch) bei einem Takt von 100 MHz eine Datenübertragungsrate von 1,6 GByte/s (8 Bit x 100 MHz x 2 = 1600 MByte/s). Bei einem PC2100-DDR-DIMM, das mit 133 MHz betrieben wird, sind dies dementsprechend 2,1 GByte/s (8 Bit x 133 MHz x 2 = 2100 MByte/s), und hinter einem PC2700-DDR-DIMM (166 MHz) verbirgt sich ein DDR333-Modul. Diese Art der Kennzeichnung wurde wohl als Reaktion auf die hohen Modul-Bezeichnungen bei den RIMMs eingeführt.
Sandini Bib 552
Kapitel 16
Abb. 16.19: Die Anschlussbelegung eines DDR-DIM-Moduls
16.2.6 RAMBus Intel hat seine ersten Pentium 4-Systeme mit einer Speichertechnologie namens RAMBus ausgestattet, während die Konkurrenz stattdessen DDR-SDRAM favorisiert. Die RAMBus-Technik ist nicht von Intel selbst, sondern von der Firma Rambus Incorporated entwickelt worden, die hierfür entsprechende Lizenzen an die Hersteller der Module und Mainboards vergibt. So neu, wie es erscheinen mag, ist diese Technik allerdings nicht. Während Intel die Implementierung Direct RAMBus mit einem (nur) 16 Bit breiten Datenbus verwendet, hat es zuvor bereits zwei andere Versionen, nämlich Base und Concurrent gegeben, die maximal einen 9 Bit breiten Bus vorsehen und beispielsweise im Nintendo 64 zum Einsatz gekommen sind. Außerdem war RAMBus schon vor Jahren auf einigen Grafikkarten zu finden.
Abb. 16.20: Das Prinzip der RAMBus-Speicherarchitektur
Per Definition wird typischerweise mit einem Takt von 400 MHz gearbeitet, was oftmals zu der Angabe »800 MHz« (PC800) führt, wobei dann aber unterschlagen wird, dass hier – wie bei DDR-SDRAM – auf beiden Taktflanken gearbeitet wird. Andere standardisierte Frequenzen sind 350 (PC700) und 300 MHz (PC600), und neuere Systeme unterstützen auch Module mit der Bezeichnung PC1066. RAMBus-Module werden als RIMMs (Rambus Inline Memory Module) bezeichnet. Sie verfügen über 184 Anschlüsse, und es gibt sie in Kapazitäten von 64, 128, 256 und
Sandini Bib Speicherchips – Das Gedächtnis der Computer
553
512 MByte. Auch die RIMMs werden mit ECC-Funktion oder eben ohne angeboten, wobei ein Modul dann typischerweise als MBit x 18 statt als MBit x 16 organisiert ist. Das Besondere bei RAMBus ist, dass sich – wie es die Bezeichnung Bus bereits impliziert – die gesamte Speicherarchitektur als ein Bussystem darstellt. Auf der einen Seite befindet sich der Controller, dazwischen die Speicherchips (RDRAMs) und an dem anderen Ende eine Terminierung. Direct RAMBus kann maximal 32 RDRAM-Chips verwenden, d.h., die mögliche Speicherbegrenzung entsteht nicht durch die Anzahl der vorhandenen Steckplätze, sondern vielmehr muss man die Chips, die sich auf den vorhandenen Modulen befinden (sollen), durchzählen – mehr als 32 dürfen es eben nicht sein. Des Weiteren darf kein RIMM-Steckplatz frei bleiben, denn sonst würde der Bus unterbrochen werden, und es funktioniert dann gar nichts mehr. Zur Abhilfe gibt es die CRIMM-Steckplatinen (Continuity RIMM), die keinerlei Elektronik beinhalten, sondern nur für das »Durchschleifen« der Signale benötigt werden.
Abb. 16.21: Der interne Aufbau eines RDRAMs
Auf dem 16 Bit breiten Datenbus (DQ) werden die Nutzdaten übertragen und ein blockorientiertes Protokoll ausgeführt. Der notwendige Takt wird von einem Clock-Generator erzeugt und differenziell auf den CTM- (Clock To Master) und CFM-Leitungen (Clock From Master) übertragen, wobei das Taktsignal praktisch vom Generator (bei der Terminierung lokalisiert) zum Controller (MCH, Memory Controller Hub) und wieder zurück läuft. Dies hat zur Folge, dass die Speicher-
Sandini Bib 554
Kapitel 16
bänke, die im Wesentlichen in herkömmlicher DRAM-Technik aufgebaut sind, denjenigen Takt auswählen können, der für sie jeweils in die gleiche Richtung läuft, was entsprechend zu großen Datenblöcken in einem »Rutsch« führt. Die RQ-Signale dienen der Speicherzeilenadressierung und die Sxx-Signale der Kommunikation mit den implementierten Control-Registern. In Abbildung 16.21 ist das Innenleben eines RDRAM-Chips gezeigt, was den Unterschied zu den SDRAMs nochmals verdeutlicht. Das Wesentliche ist dabei die gleichzeitige Verarbeitung eines Transmit- und eines Receive-Clocks (TCLK, RCLK). Die recht ausgeklügelte Zeilen- und SpaltenDekodierung für den Zugriff auf die Speicherbänke (ROW, COL) wird aus dem Datenpaket (Packet Decode) generiert. Ein Power-Down-Modus ist obligatorisch. Er sorgt dafür, dass zurzeit nicht angesprochene Chips in einen Energie sparenden Modus geschaltet werden können. Diese Option (NAP) lässt sich ggfs. im BIOS-Setup aktivieren. Allerdings ist der Sinn und Zweck dieser Betriebsart eigentlich nicht das Stromsparen, sondern sie sorgt dafür, dass die Chips bzw. die Module im Betrieb nicht zu heiß werden. Insbesondere die schnellsten Module (PC1066) leiden oftmals unter Temperaturproblemen, was nach etwas längerer Betriebszeit zu einem instabilen PC führen kann, wenn hier keine Kühlmaßnahmen getroffen werden. Der Datenbus ist lediglich 16 Bit breit, statt 64 Bit breit wie bei SDR- und DDR-SDRAMs, so dass dadurch etwas an Leistung geschluckt wird, auch wenn die hohen Taktfrequenzen hier Höchstleistung suggerieren. Um jedoch einem Pentium 4 mit einem FSB-Takt von 533 MHz die maximale Leistung zu entlocken, sind RIMMs laut PC1066 (noch) die erste Wahl, die – wie eigentlich alle RAMBus-Module verhältnismäßig – teuer sind.
16.3 SPD-PROM Bei den ersten SDRAM-Modulen sind zwei unterschiedliche Varianten zu unterscheiden, die entweder mit einem zusätzlichen seriellen EEPROM versehen sind oder aber nicht. Das EEPROM, das vom System Management Bus des Chipsets gesteuert wird, enthält Daten über den Modultyp, die Organisation der verwendeten DRAMs und über das jeweilige Timing-Verhalten, was somit eine automatische optimale Einstellung für SDRAMs ermöglichen soll. In Anlehnung an den Erkennungsmechanismus bei den SIMMs mit Hilfe der Presence Detect-Signale (PD) wird das EEPROM als SPD-EEPROM (Serial Presence Detect) bezeichnet. Besitzt das SDRAM-Modul kein EEPROM, sind die optimalen Werte weiterhin – mehr oder weniger manuell – im BIOS-Setup einzustellen. Bei allen aktuellen Modulen mit SDR-SDRAM, DDR-SDRAM und auch RDRAM ist jedoch ein entsprechendes EEPROM vorgeschrieben, und im Nachhinein wurde dieses Prinzip auch auf ältere Module (Fast Page Mode, EDO) ausgedehnt, die mit dieser Funktionalität jedoch im PC-Markt keine Bedeutung (mehr) erlangt haben. Die Firma Intel hat sich die SPD-Spezifikation ursprünglich ausgedacht und zunächst die entsprechenden SDRAM-Module mit PC66, PC100, PC133 ausgewiesen, die auch über einen Aufdruck oder Aufkleber verfügen sollen, der unmittelbar die wichtigsten Moduldaten preisgibt. Die Praxis zeigt jedoch etwas anderes, und viele Hersteller geben die Daten überhaupt nicht auf dem Modul oder aber in einer von Intel abweichenden Nomenklatur an. Laut Intel ist die Kennzeichnung für SDRAM-Module jedoch wie folgt: PCX-abc-def X: Taktfrequenz in MHz (typisch: 66 oder 100 oder 133) a: CAS-Latency in Taktzyklen (typisch: 2 oder 3) b: RAS-to-CAS-Delay in Taktzyklen (typisch: 2 oder 3)
Sandini Bib Speicherchips – Das Gedächtnis der Computer
555
c: RAS-Precharge-Time in Taktzyklen (typisch: 2 oder 3) d: Output valid from Clock, Zugriffszeit des Moduls (typisch: 6 ns bei PC100, 5,4 ns bei PC133) e: SPD-Revision (typisch 1 oder 2) f: Reserviert (0) oder auch herstellerspezifisch Das SPD-EEPROM ist schreibgeschützt, damit hier nachträglich keine Manipulationen möglich sind. Dies wird meist durch einen Widerstand (4,7 kOhm) auf dem Modul bewerkstelligt, der den Write-Protect-Pin des EEPROMs an Masse legt. Die im EEPROM abgelegten Daten lassen sich natürlich lesen, damit das BIOS die Daten für die Speicherparametereinstellung verwenden kann. Bei dem EEPROM handelt es sich um einen seriellen Typ, der ein Takt- und ein Datensignal benötigt. Wie bereits erwähnt, sind die EEPROMs der Module, wie auch einige andere Einheiten (z.B. Clock- und Supervisory-Chip) des PC am System Management Bus angeschlossen, der einer Implementierung des I2C-Bus entspricht. In Kapitel 19.5 ist dieser Bus näher erläutert, so dass ich an dieser Stelle noch kurz auf die im EEPROM abgelegten Daten eingehen möchte. Um es gleich vorweg zu nehmen: Es sind eine ganze Reihe, wobei die jeweiligen Bedeutungen einiger Bytes davon abhängen, um welchen Modultyp (SDR-SDRAM, DDR-SDRAM, RDRAM) es sich jeweils handelt. Typischerweise werden die Bytes 0–35 mit Informationen wie über die Art und Anzahl der Speicherchips, Datenbusbreite, Latenzzeiten und Timing-Parameter gefüllt, die Bytes 36–61 werden als reserviert ausgewiesen, und die Bytes 62 bis 98 enthalten Angaben zum Modul selbst. Tabelle 16. 3 zeigt die wichtigsten Details, wie sie seit einigen Jahren implementiert werden. Byte
Inhalt/Bedeutung
0
Gesamtanzahl der im EEPROM abgelegten Bytes 2 Bytes = 02h 128 Bytes = 80h 255 Bytes = FFh Kapazität des SPD-EEPROMs 32 Bytes = 05h 64 Bytes = 06h 128 Bytes = 07h 256 Bytes = 08h Speichertyp Fast Page Mode = 01h EDO Page Mode = 02h SDRAM = 04h Anzahl der Adress-Bits für Zeilen (Row) 0 = 08h 10 = 0Ah 15 = FFh Anzahl der Adress-Bits für Spalten (Column) 0 = 08h 10 = 0Ah 15 = FFh Anzahl der Modul-Bänke 1 = 01h (einseitig) 2 = 02h (zweiseitig) Datenbusbreite des Moduls 32 = 20h 35 = 24h 64 = 40h 72 = 48h Datenbusbreite des Moduls (Fortsetzung) 256+ = 01h 512+ = 02h Interface-Spannung 5 V = 00h 3,3 V = 01h DRAM RAS Access Time oder 7,5 ns = 75h SDRAM Cycle Time 10 ns = A0h 50 ns = 46h 80 ns = 50h
1
2
3
4
5 6
7 8 9
Tab. 16.3: Die Daten in einem SPD-EEPROM
Beispiele
Sandini Bib 556
Kapitel 16
Byte
Inhalt/Bedeutung
Beispiele
10
DRAM CAS Access Time oder Highest CAS Latency
11
Fehlerkorrektur
12
Refresh Rate
13
Datenbusbreite der einzelnen Speicher-Chips
14
Datenbusbreite der einzelnen ECC-Chips
15 16
Latenzzeit für Back-to-Back-Zugriffe auf dieselbe Spalte Burst-Länge
17
Anzahl der Bänke in den SDRAM-Chips
18
CAS Latency
19
Chip Select Latency
20
Write Enable Latency
21
Spezielle Moduleigenschaften
22
Spezielle Moduleigenschaften
23
SDRAM Cycle Time (zweitlängste CAS Latency)
24
SDRAM CAS Latency (zweitlängste CAS Letancy)
25
SDRAM Cycle Time (drittlängste CAS Latency)
26
SDRAM CAS Latency (drittlängste CAS Latency)
27
Minimale RAS Precharge Time
28
Minimale Row-Active-to-Row-Active Time
29
Minimale RAS-to-CAS-Delay
30
Minimale RAS-Puls-Breite (Active Time)
6 ns = 60h 5,4 ns = 54h 13 ns = 0Dh 25 ns = 19h Keine = 00h Parity = 01h ECC = 02h 15,625 µs = 00h (normal) 62,5 µs = 04h (4x-Extended) 125 µs = 05h (8x-Extended) 4 Bits = 04 h 8 Bits = 08h 16 Bits = 10h 4 Bits = 04 h 8 Bits = 08h 16 Bits = 10h 1 Takt = 01h 2 Takte = 02h 1 = 01h 8 = 08h 1 = 01h 2 = 02h 2 Takte = 06h 3 Takte = 04h 0 Takte = 01h 2 Takte = 04h 3 Takte = 08h 0 Takte = 01h 2 Takte = 04h 3 Takte = 08h Buffered = 01h Registered = 02h PLL on Modul = 04h Early RAS Precharge = 01h Auto Precharge = 02h 7,5 ns = 75h 10 ns = A0h 6 ns = 60h 5,4 ns = 54h 7,5 ns = 75h 10 ns = A0h 6 ns = 60h 5,4 ns = 54h 1 ns = 01h 30 ns = 1Eh 1 ns = 01h 30 ns = 1Eh 1 ns = 01h 30 ns = 1Eh 1 ns = 01h 60 ns = 3Ch
Tab. 16.3: Die Daten in einem SPD-EEPROM (Forts.)
Sandini Bib Speicherchips – Das Gedächtnis der Computer
557
Byte
Inhalt/Bedeutung
Beispiele
31
Speicherkapazität jeder Modulbank
32
Setup Time der Adress- und Befehlseingänge
33
Hold Time der Adress- und Befehlseingänge
34
Setup Time der Datenleitungen
35
Hold Time der Datenleitungen
36–61 62 63 64–71 72 73–90 91–92 93–94 95–98 99–125 126
Reserviert und meist nicht verwendet Revision der SPD-Spezifikation Checksumme der Bytes 0-62 Herstellernummer laut JEDEC Fertigungsort laut JEDEC Artikelnummer des Moduls Revisionsnummer des Moduls Herstellungsdatum Seriennummer des Moduls Herstellerspezifisch SDRAM-Frequenz
4 MByte = 01h 8 MByte = 02h 64 MByte = 10h 128 MByte = 20h 512 MByte = 80h 1,5 ns = 15h 2 ns = 20h 0,8 ns = 08h 1 ns = 10h 1,5 ns = 15h 2 ns = 20h 0,8 ns = 08h 1 ns = 10h 00h Revision 1.2 = 12h (ab hier optional) Untere 8 Bits der arithmetischen Summe
127
Spezielle Angaben zum Takt
PC66 = 66h PC100 = 64h CL2 = 02h CL3 = 04h
Tab. 16.3: Die Daten in einem SPD-EEPROM (Forts.)
Die von Intel initiierte SPD-Spezifikation wird mittlerweile von der JEDEC (Standardisierungsgremium für Speicher und andere elektronische Bauelemente) anerkannt, was sich mittlerweile auch bei den Herstellern herumgesprochen haben sollte, die zum Teil schließlich selbst Mitglieder in diesem Gremium sind. Von einem einheitlichen Standard kann man jedoch keineswegs ausgehen, denn einige Festlegungen sind nur als optional definiert, und man kommt mit der Standardisierung auch kaum mehr hinterher, weil laufend neue Module entwickelt werden und die Vorschriften sich zudem als lückenhaft erweisen. In Tabelle 16.3 vermisst man daher auch Festlegungen für neuere Speichermodule (RDRAM, DDR-SDRAM) und zudem einige Parameter. Daher mag es nicht verwundern, dass die Chip- und Modulhersteller z.T. eigene Wege für die Identifizierung der unterschiedlichen Module gehen und mitunter auch nur einen Teil (bis Byte 35) der SPD-Parameter korrekt im EEPROM abspeichern. Letztendlich führt dies in der Praxis dazu, dass eine optimale Einstellung der Parameter eben nicht automatisch erfolgt und man sich im Zweifelsfall nach wie vor im BIOS-Setup selbst damit beschäftigen muss.
16.3.1 SPD-Daten auslesen Das programmtechnische Auslesen der SPD-EEPROM-Daten ist relativ einfach zu bewerkstelligen, wie es dem folgenden Listing zu entnehmen ist. Allein das Aufspüren der Basisadresse des System Management Bus (SMB) ist mitunter etwas problematisch und natürlich die korrekte Interpretation der Parameter im SPD-PROM, was letztendlich am Fehlen eines eindeutigen Standards liegt, an den sich die Hersteller dann auch tatsächlich halten. Auf den ersten Punkt gehe ich im
Sandini Bib 558
Kapitel 16
Kapitel über den SM-Bus noch genauer ein. An dieser Stelle sei daher einmal vorausgesetzt, dass die Basisadresse (SMBBA) bekannt ist, so dass sich die SMB-Befehlsregister (SetSMBAddress) festlegen lassen, mit denen die einzelnen Routinen arbeiten. /* Set global variables from SMBBA after get SMBBA value */ static void SetSMBAddress () { SMBHSTSTS = SMBBA + 0x00; /* SMBus Host Status */ SMBSLVSTS = SMBBA + 0x01; /* SMBus Slave Status */ SMBHSTCNT = SMBBA + 0x02; /* SMBus Host Count */ SMBHSTCMD = SMBBA + 0x03; /* SMBus Host Command */ SMBHSTADD = SMBBA + 0x04; /* SMBus Host Address */ SMBHSTDAT0 = SMBBA + 0x05; /* SMBus Host Data 0 */ SMBHSTDAT1 = SMBBA + 0x06; /* SMBus Host Data 1 */ SMBBLKDAT = SMBBA + 0x07; /* SMBus Block Data */ SMBSLVCNT = SMBBA + 0x08; /* SMBus Slave Count */ SMBSHDWCMD = SMBBA + 0x09; /* SMBus Shadow Command */ SMBSLVEVT = SMBBA + 0x0A; /* SMBus Slave Event */ SMBSLVDAT = SMBBA + 0x0C; /* SMBus Slave Data */ /* Check host SMBus busy ? */ static unsigned char /* boolean */ SMBHostBusy () { unsigned char x; /* Read Port SMBHSTSTS */ x = inp (SMBHSTSTS); /* Return True if bit 0 is set */ return ((inp (SMBHSTSTS) & 0x01) == 0x01); } /* Wait for host */ static void SMBWaitBusy () { long t; /* Set t = System Timer plus 2 */ t = Tick () + 2; /* Loop while host SMBus busy or over timer setting (2*18.2 ms) */ while ((SMBHostBusy () == FALSE) && (Tick () < t)) { } } /* Wait for host SMBus ready */ static void SMBWaitReady () { long t; /* Set t = System Timer plus 2 */ t = Tick () + 2; /* Loop while host SMBus not busy or over timer setting*/ while ((SMBHostBusy () == TRUE) && (Tick () < t)) { } } /* Check SMBus device error (unreadable?) */ static unsigned char /* boolean */ SMBDevErr () { unsigned char x; x = inp (SMBHSTSTS);
Sandini Bib Speicherchips – Das Gedächtnis der Computer
/* Return True if bit 2 is set */ return ((x & 0x04) == 0x04); } /* Read data byte from address and command */ static byte SMBReadDataByte (byte adr, byte cmd) { /* Set data from read byte */ outp (SMBHSTSTS, 0x1f); SMBWaitReady (); outp (SMBHSTDAT0, 0xff); SMBHostBusy (); /* Set command */ outp (SMBHSTCMD, cmd); SMBHostBusy (); /* Set address */ outp (SMBHSTADD, ((adr Befehl “Flip-Flop löschen“ ausgeführt
Der Befehl Master Clear hat denselben Effekt wie ein Hardware-Reset des 8237A. Es werden das Befehls-, Status-, Request- und Zwischenregister gelöscht, und das Flip-Flop wird zurückgesetzt.
Sandini Bib Hardware-Interrupts und DMA
653
Beispiel: DMA 1 mit Master-Clear zurücksetzen. OUT 0dh, al
; beliebigen Wert an 0dh ausgeben ; -> Befehl “Master-Clear“ ausgeführt ; DMA 1 jetzt neu initialisieren
neu_init
Durch den Befehl Maskierungsregister löschen werden die Maskierungsbits aller vier Kanäle im 8237A gelöscht, wodurch alle Kanäle für die Entgegennahme einer DMA-Anforderung freigegeben sind. Beispiel: Maskierungsbits im DMA 2 freigeben. OUT dch, al
; beliebigen Wert an dch ausgeben ; -> Befehl “Maskierungsregister löschen“ ;ausgeführt
Die oben angeführten Steuerregister regeln das Betriebsverhalten des Controllers. Um einen konkreten DMA-Transfer ausführen zu können, müssen zusätzlich noch die Adress-, Zählwert- und DMA-Page-Register mit den notwendigen Werten initialisiert werden. In Tabelle 18.8 sind die I/O-Adressen der Adress- und Zählregister für die Bausteine DMA 1 und DMA 2 angegeben. DMA 1 1)
DMA 2 2)
Registerbezeichnung
00h 01h 02h 03h 04h 05h 06h 07h
c0h c1h c2h c3h c4h c5h c6h c7h
Adressregister Kanal 0/4 Zählregister Kanal 0/4 Adressregister Kanal 1/5 Zählregister Kanal 1/5 Adressregister Kanal 2/6 Zählregister Kanal 2/6 Adressregister Kanal 3/7 Zählregister Kanal 3/7
1)
Master im PC/XT, Slave im AT, 2) Master im AT
Tab. 18.8: I/O-Adressen der Adress- und Zählregister des DMA-Controllers
Beispiel: Adressregister von Kanal 6 auf den Wert 1080h setzen und Zählwert 0100h in das zugehörige Zählregister eintragen. OUT d8h, al OUT c4h, 80h OUT c4h, 10h OUT d8h, al OUT c5h, 00h OUT c4h, 01h
; ; ; ; ; ; ; ;
beliebigen Wert an d8h ausgeben -> Befehl “Flip-Flop löschen“ ausgeführt niederwertiges Adressbyte an Kanal 6 von DMA 2 ausgeben höherwertiges Adressbyte an Kanal 6 von DMA 2 ausgeben beliebigen Wert an d8h ausgeben -> Befehl “Flip-Flop löschen“ nochmals ausführen niederwertiges Zählerbyte an Kanal 6 von DMA 2 ausgeben höherwertiges Zählerbyte an Kanal 6 von DMA 2 ausgeben
Für eine vollständige Initialisierung eines DMA-Transfers ist außerdem noch das Page-Register des betreffenden Kanals mit der Page-Adresse von Ziel und Quelle im Hauptspeicher zu laden. In Tabelle 18.9 sind die I/O-Adressen der Page-Register angegeben. Port
Page-Register
Port
Page-Register
87h 83h 81h 82h
Kanal 0 Kanal 1 1) Kanal 2 Kanal 3
8fh 8bh 89h 8ah
Kanal 4 (Refresh) Kanal 5 Kanal 6 Kanal 7
1)
bei PC/XT: gleichzeitig Kanal 0
Tab. 18.9: Adressen der Page-Register
Sandini Bib 654
Kapitel 18
Zu beachten ist, dass im PC/XT den beiden Kanälen 0 und 1 physikalisch dasselbe Page-Register zugeordnet ist, es wird also über die zwei verschiedenen I/O-Adressen 87h und 83h auf dasselbe physikalische Register zugegriffen. Im AT enthält das Page-Register für Kanal 4 – der nur zur Kaskadierung dient – die Page-Adresse für die Speicherauffrischung. Beispiel: Initialisierung von DMA 1, Kanal 2 zur Diskettenübertragung Das folgende Programmbeispiel initialisiert den Kanal 2 von DMA 1 für einen Schreibtransfer, um einen Diskettensektor mit 512 Byte vom Controller in den Hauptspeicher zu übertragen. In den Registern ES:BX werden Segment und Offset des Lesepuffers übergeben. Eine Prüfung auf einen DMA-Segmentüberlauf wird nicht ausgeführt. Der DMA-Transfer wird durch ein DREQ2 vom Diskettencontroller ausgelöst. Der Programmcode kann Teil einer Routine sein, mit der die CPU den Diskettencontroller über einen Lesebefehl ansteuert, um einen Sektor zu übertragen. Wenn mehrere Sektoren hintereinander übertragen werden sollen, muss der Wert im Zählregister entsprechend vergrößert werden. ;************************************************************************ ;** ES: Puffersegment ssss ssss ssss ssss ** ;** BX: Pufferoffset oooo oooo oooo oooo ** ;** ** ;** Basisadresse: ssss ssss ssss ssss 0000 ** ;** + oooo oooo oooo oooo ** ;** -------------------------------** ;** pppp hhhh hhhh llll llll ** ;** ** ;** pppp: Eintrag für das DMA-Page-Register ** ;** hhhh hhhh: höherwertiges Byte für das DMA-Adressregister ** ;** llll llll: niederwertiges Byte für das DMA-Adressregister ** ;************************************************************************ dma1_inaktiv: OUT 08h, 14h
; ; ; ; ; ; ; ;
DMA 1 deaktivieren 0001 0100b an Befehlsregister ausgeben, um 8237A zu deaktivieren und zu initialisieren (DACK: aktiv-niedrig, DRQ: aktiv-hoch, Late-Write, Priorität: fest, Taktung: normal, Controller: deaktiviert, Adress-Hold: deaktiviert, Speicher-Speicher: deaktiviert)
modus: OUT 0bh, 56h
; ; ; ; ;
DMA-Modus für Kanal 2 einstellen 0101 0110b an Modusregister ausgeben (Modus: Einzeltransfer, Adressinkrementierung, keine Autoinitialisierung, Transfermodus: Schreiben, Kanal: 2)
split_adresse: MOV ax, es MOV cl, 04h SHL ax, cl
; ; ; ; ; ; ;
Adresse in ES:BX in pppp hhhh hhhh llll llll auftrennen Segment ssss ssss ssss ssss des Lesepuffers in ax laden Zählwert in cl laden viermal nach links verschieben -> Ergebnis ssss ssss ssss 0000 Offset addieren -> ax enthält hhhh hhhh llll llll Carry gesetzt -> Übertrag
ADD ax, bx JC uebertrag
kein_uebertrag: MOV bx, es ; Segment ssss ssss ssss ssss des Lesepuffers in bx laden MOV cl, 04h ; Zählwert in cl laden SHR bh, cl ; bh viermal nach rechts verschieben -> bh enthält das ; höchstwertige Bit ssss des Puffersegments als pppp JMP puffer_adresse ; weiter mit Ausgabe der Pufferadresse uebertrag: MOV bx, es MOV cl, 04h SHR bh, cl
; Segment ssss ssss ssss ssss des Lesepuffers in bx laden ; Zählwert in cl laden ; bh viermal nach rechts verschieben -> bh enthält das
Sandini Bib Hardware-Interrupts und DMA
ADC bh, 00h
655
; höchstwertige Bit ssss des Puffersegments ; Carry als Übertrag hinzuaddieren
puffer_adresse: ; Ausgabe der Adresse an 8237A und Page-Register OUT 0ch, al ; Flip-Flop zurückstellen OUT 04h, al ; niederwertiges Adressbyte nnnn nnnn an Adressregister ; ausgeben MOV al, ah ; höherwertiges Adressbyte hhhh hhhh in al laden OUT 04h, al ; höherwertiges Adressbyte hhhh hhhh an Adressregister ; ausgeben MOV al, bh ; Page-Wert pppp in al laden OUT 81h, bh ; Page-Register mit pppp laden zaehlwert: OUT 0ch, al OUT 05h, ffh OUT 05h, 01h
; ; ; ; ; ; ;
Zählregister mit Wert 511 laden -> 512 Byte werden übertragen Flip-Flop zurückstellen niederwertiges Byte 255 des Zählwerts in Zählregister laden höherwertiges Byte 1 des Zählwerts in Zählregister laden
kanal_unmask: OUT 0ah, 02h
; mögliche Kanalmaskierung aufheben ; 0000 0010b ausgeben -> Kanal 2 freigeben
dma1_aktiv: OUT 08h, 10h
; ; ; ; ; ; ;
DMA 1 aktivieren 0001 0000b an Befehlsregister ausgeben, um 8237A wieder zu aktivieren (DACK: aktiv-niedrig, DRQ: aktiv-hoch, Late-Write, Priorität: fest Taktung: normal, Controller: aktiviert, Adress-Hold: deaktiviert, Speicher-Speicher: deaktiviert
Alternativ kann man auch nur den betreffenden Kanal 2 des ersten DMA-Controllers 1 maskieren. Alle anderen Kanäle bleiben dann während der Initialisierung von Kanal 2 weiter aktiv. Einige 386-Memory-Treiber benötigen einen oder mehrere DMA-Kanäle des ersten DMA-Controllers, um Extended-Memory ansprechen zu können. Eine Sperrung, vor allem für längere Zeit, kann dann zu einem Absturz dieser Treiber führen.
Sandini Bib
Sandini Bib
19
Mainboard-Peripherieeinheiten
Für jedes Mainboard – quasi Chipsatz-unabhängig – sind die im Folgenden angegebenen Einheiten notwendig, die mit unterschiedlichen Bausteinen realisiert werden. Einige davon sind als Beispiele mit angegeben.
:
CMOS-RAM und Real Time Clock: Dallas DS12886 oder Benchmarq bq328MT oder ODIN OEC12C887
Die jeweilige Konfiguration des PC wird im CMOS-Setup – auch BIOS-Setup genannt – festgelegt. Hier sind beispielsweise das Datum, die Uhrzeit oder der Diskettenlaufwerkstyp und weitere wichtige Dinge einzustellsen. Die Speicherung dieser Daten erfolgt im CMOS-RAM, dessen Inhalt auch nach dem Abschalten des PC erhalten bleibt, da es von einem Akku oder einer Batterie versorgt wird. Entweder ist der Akku auf dem Mainboard unmittelbar zu erkennen, oder er ist im Baustein integriert. Des Weiteren enthält er die Real Time Clock (RTC, Echtzeituhr) mit Kalenderfunktion. Bei allen neueren Mainboards ist ein RTC/CMOS-RAM-Chip nicht mehr zu finden, denn er ist mittlerweile in der Southbridge untergebracht. Eine Batterieknopfzelle auf dem Mainboard sorgt dabei für den Datenerhalt des integrierten CMOS-RAMs.
:
Taktgenerator: IMI 42C25 oder AV9107 oder MX8315 oder PhaseLink 52C59
Versorgt die CPU und die weitere Elektronik (z.B. Timer, Bus) mit dem Arbeitstakt, der auf dem Mainboard über Steckbrücken (Jumper) für die jeweils verwendete CPU festgelegt wird. Meist wird hierfür ein Baustein verwendet, der eine Eingangsfrequenz von 14,318 MHz, die durch einen Quarz erzeugt wird, entsprechend umsetzt (PLL-Schaltung).
:
BIOS-ROM: 28F001BXT und kompatible
Enthält den Basisprogammcode für die CPU, der für den Start des PC sorgt und zahlreiche Funktionen für das Ansprechen der einzelnen Komponenten (Laufwerke, Grafikkarte) zur Verfügung stellt. Der Speicherbaustein ist meist mit einem Aufkleber versehen, der den Hersteller und die Version des ROM-Codes angibt (z.B. Award, AMI).
:
Tastaturcontroller (Keyboardcontroller): Intel 8042 oder VIA VT82C42 oder AMIKEY-2
Dieser Controller ist für die Kommunikation der angeschlossenen Tastatur mit der weiteren Mainboard-Elektronik zuständig und setzt die gesendeten Befehle entsprechend um. Des Weiteren übernimmt er gegebenenfalls die Unterstützung eines vorhandenen Mausinterfaces (PS/2-Typ).
:
Multi I/O-Controller, Super I/O-Controller: National Semiconductor 87307 oder SMSC FDC37C93xAPM oder UM8569F der Firma UMC oder Winbond W83977
Wurden in früheren Zeiten zusätzliche ISA-Einsteckkarten benötigt, die die seriellen Schnittstellen (RS232), einen Drucker- und einen Gameportanschluss sowie einen Controller für die Diskettenund Festplattenlaufwerke zur Verfügung stellten, ist hierfür mittlerweile nur noch ein einziger Baustein notwendig, der gleich mit auf dem Mainboard integriert ist. Von diesen Bausteinen gibt es die unterschiedlichsten Varianten und die bekanntesten Hersteller sind SMSC und National Semiconductor (Fairchild), die mit einer ganzen Palette dieser Controller in ihren Lieferprogrammen aufwarten können.
Sandini Bib 658
:
Kapitel 19
Supervisory-Chips, System-Monitoring-Chips, System Health-Chips: National Semiconductor LM78, LM75, Winbond W83781D
Bei aktuellen Mainboards finden sich ein oder auch gleich mehrere Bausteine, die für die Überwachung von Spannungen, die Kontrolle der Lüfteraktivität und für die Messung verschiedener Temperaturen (CPU, interne Umgebung) vorgesehen sind.
19.1 CMOS-RAM und Echtzeituhr Die alten PC/XT besaßen eine ganze Reihe kleiner DIP-Schalter (manchmal etwas spöttisch auch als Mäuseklaviere bezeichnet), mit deren Hilfe der Benutzer die Konfiguration seines Computers einstellen musste. Zur Konfiguration gehören die Festlegung der Anzahl und Art der Diskettenlaufwerke, Grafikadapter, Basisspeicher etc. Da es sich bei einem PC um einen »persönlichen« Computer handelt, können die Konfigurationen für verschiedene Benutzer sehr unterschiedlich ausfallen. Durch die heute nahezu unübersehbar große Zahl verschiedener Festplatten mit unterschiedlichster Geometrie (Zahl der Köpfe, Spuren, Sektoren) verbietet sich die Konfigurationseinstellung durch DIP-Schalter von selbst. Ein weiterer gravierender Nachteil war das Fehlen einer Echtzeituhr. Nach jedem Boot-Vorgang initialisierte sich der PC auf den 1.1.1980 0:00 Uhr. Der Benutzer musste über die DOS-Befehle DATE und TIME zunächst das aktuelle Datum und die gegenwärtige Uhrzeit eingeben. Da der erste PC erst nach diesem Datum ausgeliefert wurde, kennen PCs und damit auch DOS übrigens keinen früheren Zeitpunkt als den 1.1.1980 0:00 Uhr, DOS verwaltet alle Zeitpunkte relativ hierzu. IBM erkannte diese Schwächen und lieferte den AT mit einer Echtzeituhr und einem CMOSRAM aus, die beide von einem Akku oder einer eingebauten Batterie auch bei ausgeschaltetem PC mit Strom versorgt werden. Statt von CMOS-RAM spricht man häufig auch von einem NVR, das ist die Abkürzung für Non-Volatile-RAM, zu Deutsch: nicht-flüchtiger Speicher. Hierdurch soll ausgedrückt werden, dass die Daten in diesem Speicher auch nach dem Abschalten der Spannungsversorgung erhalten bleiben. Die Echtzeituhr ist von der CPU und den anderen Chips völlig unabhängig und zählt die Uhrzeit und das Datum im Hintergrund ständig weiter. Im CMOS-RAM werden schließlich die Konfigurationsdaten gespeichert. Das ROM-BIOS liest beide beim Booten aus und ermittelt so die aktuelle Konfiguration sowie Datum und Uhrzeit. CMOS-RAM und Echtzeituhr sind beide in einem Chip integriert, ursprünglich im MC146818 von Motorola oder einem hierzu kompatiblen Chip. Bei den heute üblichen PCs ist diese Schaltungseinheit mit in der Southbridge (z.B. PIIX4) oder einem Super I/O-Controller untergebracht. Für die Pufferung werden Knopfzellen oder Akkus benutzt. Akkus sind dabei häufig fest mit der Platine verbunden, Batterien in einer Fassung gehalten. Die Stromaufnahme durch den CMOSRAM und die Echtzeituhr ist so gering, dass sie für die Lebensdauer von Batterien und Akkus normalerweise keine Rolle spielt. Stattdessen ist die Lebensdauer von der Lagerungsbeständigkeit des Akkus oder der Batterie begrenzt und beträgt etwa drei, bei Lithiumbatterien auch bis zu zehn Jahre. Für den Uhr/RAM-Baustein MC146818 werden noch einige externe Bauelemente benötigt: ein Quarz, der den Takt für die Uhr erzeugt, und die Bauelemente für die Ladeschaltung sowie der Akku. Aus diesem Grunde ist dieser Baustein schon seit längerer Zeit nicht mehr auf Mainboards zu finden, sondern stattdessen der Typ DS1287 der Firma Dallas oder auch ein ähnlicher wie der DS12886, der DS12887, der Bq328MT der Firma Benchmarq oder auch der ODIN OEC12C887(A), um nur die gebräuchlichsten Typen zu nennen. Diese Chips beinhalten gleich
Sandini Bib Mainboard-Peripherieeinheiten
659
die notwendige Batterie, die für einen Datenerhalt von mindestens zehn Jahren sorgt. Sie benötigen keine externen Bauelemente und verfügen prinzipiell über die gleichen Funktionen wie der MC146818. Der Nachteil dieser Bausteine ist, dass man bei einem vermeintlichen Batterieproblem im Prinzip gleich das komplette Mainboard »abschreiben« kann. Einige Typen lassen sich allerdings öffnen, so dass die Batterie ausgetauscht werden kann. Falls man nicht mit einem Schraubendreher – ohne größere Gewalt – das Gehäuse aufhebeln kann, hat man leider Pech gehabt und muss sich einen neuen Chip besorgen, was eine beschwerliche Angelegenheit sein kann, denn er ist – wenn überhaupt – nur bei den offiziellen Distributoren der jeweiligen Firmen (Dallas, Benchmarq, ODIN) erhältlich und meist nicht beim Mainboard-Hersteller.
19.1.1 Aufbau und Programmierung Der Akku bzw. die Batterie versorgen folgende Elemente auch bei ausgeschaltetem PC mit Strom (siehe Abbildung 19.1):
: :
den CMOS-RAM mit den Konfigurationseinstellungen und Uhrzeit und Datum, die laufend von der Echtzeituhr aktualisiert werden die Echtzeituhr
Konfigurationsdaten
Konfigurationsdaten
Batterie
Datenregister
Konfigurationsdaten
CMOS-RAM
MC146818
Uhrzeit/Datum Statusregister A-D
Adreßregister
Echtzeituhr
Abb. 19.1: Technischer Aufbau des MC146818: Der MC146818 weist eine Echtzeituhr und 64 Byte batteriegepufferten CMOS-RAM auf. Programmiert wird der MC146818 über ein Adress- und Datenregister.
Standardmäßig weist der CMOS-RAM im MC146818 – oder in einem hierzu kompatiblen Chip – 64 einzeln ansprechbare Bytes auf. Die aktuellen Chips besitzen mehr als diese 64 Bytes. Die Bedeutung der einzelnen Bytes ist dann aber nicht mehr standardisiert, so dass ich mich hier auf die allgemein gültigen Bytes beschränken möchte. Von den 64 Bytes des CMOS-RAM sind die ersten 14 Bytes (Adressen 00h bis 0dh) für Uhrzeit, Datum und Steuer- bzw. Statusregister der Echtzeituhr reserviert. Die restlichen 50 nehmen die Informationen über die Konfiguration des PC auf. In Tabelle 19.1 ist die Speicherkonfiguration des CMOS-RAMs angegeben.
Sandini Bib 660
Byte
Kapitel 19
Byte
Adresse
Inhalt
0 1 2 3 4
Adresse Inhalt 00h 01h 02h 03h 04h
Sekunde*) Alarmsekunde*) Minute*) Alarmminute*) Stunde*)
18 19 20 21 24
12h 13h 14h 15h 18h
5 6 7 8 9 10
05h 06h 07h 08h 09h 0ah
Alarmstunde*) Tag der Woche*) Tag des Monats*) Monat*) Jahr*) Statusregister A
27–31 32–39 40–45 46 47 48
1bh–1fh 20h–27h 28h–2dh 2eh 2fh 30h
11
0bh
Statusregister B
49
31h
12 13 14 15 16 17
0ch 0dh 0eh 0fh 10h 11h
Statusregister C Statusregister D Diagnosestatus Shutdown-Status Typ der Diskettenlaufwerke reserviert
50 51 52 53–60 61–63
32h 33h 34h 35h–3ch 3dh–3fh
Typ der Festplattenlaufwerke reserviert Gerätebyte Basisspeicher (niederwertiges Byte) Extended Memory (höherwertiges Byte) laut SETUP reserviert Parameter Festplattentyp 48 reserviert Prüfsumme (niederwertiges Byte) Prüfsumme (höherwertiges Byte) Extended Memory (niederwertiges Byte) laut POST Extended Memory (höherwertiges Byte) laut POST Jahrhundert*) Setup-Informationen reserviert Parameter Festplattentyp 49 reserviert
*) binärcodierte Dezimalzahlen (1 Byte)
Tab. 19.1: Speicherkonfiguration des CMOS-RAMs
Zu beachten ist, dass alle Uhrzeit- und Datumsangaben üblicherweise als binärcodierte Dezimalzahlen vorliegen. Diese standardmäßige Kodierung ist aber über das Statusregister B (siehe Abbildung 19.2) veränderbar. Arbeitet die Echtzeituhr im 12-Stunden-Modus, so werden Vormittags- und Nachmittagsstunden durch das Bit 7 im Eintrag Stunde bzw. Alarmstunde unterschieden: Ein gelöschtes Bit zeigt Vormittagsstunden, ein gesetztes Nachmittagsstunden an. Der Wertebereich lautet also $01–$12 für Vormittags- und $81–$92 für Nachmittagsstunden. Beispiel: 39 (= 27h) in Byte 2/Adresse 02H (Minute) ergibt 27 Minuten. Alle anderen Angaben sind binärcodiert. Die zwei Bytes umfassenden Größen sind im Intel-Format abgelegt. Beispiel: Basisspeicher. 80H (= 128) in Byte 21/Adresse 15h 02H (= 2) in Byte 22/Adresse 16h ergibt somit 2*256 + 128 = 640 (KByte) Basisspeicher
Neben der normalen Zeit- und Datumsfunktion besitzt der Baustein noch eingebaute Funktionen für die Sommerzeit (zu aktivieren über das Statusregister B, siehe Abbildung 19.2) sowie Funktionen zur Bestimmung von Wochen- und Monatstag. Für die Überwachung und Programmierung des Uhr/RAM-Chips sind die vier Statusregister A bis D von besonderer Bedeutung. Mit ihnen legen Sie den Betriebsmodus des Chips fest. In Abbildung 19.2 sehen Sie die Formate dieser vier Bytes.
Sandini Bib Mainboard-Peripherieeinheiten
661
Statusregister A 6 5
UIP
7
4 3
2
1 0
Rate
Basis
UIP:
Update-Flag (Update in Progress) 1=Datum/Uhrzeit wird gerade aktualisiert 0=Datum/Uhrzeit ist zugänglich Basis: Zeitbasis Standardwert 010 = 32.768 Hz Rate: Ratenauswahl = 65.536Hz/2Rate Standardwert 0110=1.024Hz (=65.536/26)
6 5
PI AI UI
SET: PI: AI: UI: REC: DM: 24h: SOM:
4 3
2
1 0
REC DM 24h SOM
7
SET
Statusregister B
Aktualisierungszyklus (Set Update Cycle) 1=gesperrt 0=aktiv (Standard) periodischer Interrupt 1=aktiv 0=gesperrt (Standard) Alarm-Interrupt 1=aktiv 0=gesperrt (Standard) Aktualisierungs-Interrupt 1=aktiv 0=gesperrt (Standard) Rechtecksignal 1=aktiv 0=gesperrt (Standard) Datenmodus 1=Datum/Uhrzeit BCD-codiert (Standard) 0=binärcodiert Uhrzeitmodus 1=24-Stunden-Uhr (Standard) 0=12-Stunden-Uhr Sommerzeit 1=Sommerzeit aktiv 0=Normalzeit (Standard)
Statusregister C IRQ
7
6 5
4 3
2
1 0
PF AF UF reserviert
IRQ: PF: AF: UF:
Interrupt-Anforderung (Request) 1=Interrupt ist angefordert 0=kein Interrupt angefordert Quelle von IRQ ist periodischer Interrupt 1=ja 0=nein Quelle von IRQ ist Alarm-Interrupt 1=ja 0=nein Quelle von IRQ ist Aktualisierungs-Interrupt 1=ja 0=nein
Statusregister D 6 5
gül
7
gül:
4 3
2
1 0
reserviert
Gültigkeit der Daten im CMOS-RAM 1=gültig (Batterie o.k.) 0=ungültig
Abb. 19.2: Formate der Statusregister A bis D
Der Uhr/RAM-Chip stellt jede Sekunde die Uhr nach, indem er die Bytes 0, 2, 4, 6, 7, 8, 9 und 50 des CMOS-RAMs aktualisiert. Während dieser Aktualisierung können die Bytes 0 bis 9 nicht angesprochen werden, ein Zugriff liefert möglicherweise sinnlose Werte. Der Uhr/RAM-Chip
Sandini Bib 662
Kapitel 19
setzt daher das Bit UIP im Statusregister A, um den Aktualisierungsvorgang anzuzeigen. Die Bits Basis definieren die Zeitbasis, mit der die Echtzeituhr arbeitet. Standardmäßig ist der Wert 010 eingestellt, der eine Zeitbasis von 32.768 Hz liefert. Andere Werte beschleunigen oder bremsen die Echtzeituhr. Mit den vier Bits Rate können Sie ferner die Rate des Rechtecksignals oder des periodischen Interrupts (siehe unten) einstellen. Gültige Werte liegen zwischen 0011 und 1111. Über die Formel Frequenz=65.536Hz/2Rate ergeben sich Raten von 8192 Hz (Zykluszeit 122µs) bis 2 Hz (500 ms). Rate bezeichnet dabei den Wert der Ratenauswahlbits. Standardmäßig wird die Ratenauswahl auf 0110 entsprechend 1.024Hz (=65,536/26) bzw. einer Zykluszeit von 976,56µs initialisiert. Ein Eintrag 0000 deaktiviert den Ratengenerator. Die beiden Funktionen 83h und 86h des Interrupts INT 15h verwenden den 1024-Hz-Takt der Echtzeituhr für die Bestimmung von Warteintervallen (siehe unten). Durch das Bit SET im Statusregister können Sie die Aktualisierung der Bytes für Uhrzeit und Datum im CMOS-RAM deaktivieren. Es ist also möglich, den Uhr/RAM-Chip in Ruhe zu initialisieren und erst anschließend die Uhr zu starten. Der Chip kann nicht nur als Echtzeituhr und NVR dienen, sondern auch ein Rechtecksignal erzeugen. Die Frequenz des Signals ist durch die Ratenbits (Ratenauswahl) im Statusregister A definiert. Im PC wird der betreffende Ausgang des Uhr/RAM-Chips aber nicht benutzt, so dass diese Möglichkeit so lange nur theoretisch gegeben ist, bis Sie nicht selbst zum Lötkolben greifen und den Rechteckausgang für Ihre Privatzwecke gebrauchen. Die im CMOS-RAM abgelegten Werte für Datum und Uhrzeit sind, wie bereits erwähnt worden ist, üblicherweise im BCD-Format gespeichert. Über das Bit DM kann der Uhr/RAM-Chip dazu gebracht werden, dass alle Datums- und Uhrzeitangaben mit binärer Kodierung abgelegt werden, aber alle DOS- und BIOS-Funktionen im PC setzen das BCD-Format voraus. Ferner ist zwischen einer 12-Stunden- und einer 24-Stunden-Uhr zu wählen, und über das Bit 24h kann die Echtzeituhr zwischen diesen beiden Modi umgeschaltet werden. Beachten Sie dabei, dass im Falle einer 12-Stunden-Uhr das höchstwertige Stundenbit für Zeiten nach 12 Uhr Mittags gesetzt wird, die Stundenzählung also von $81 bis $92 läuft. Anhand des höchstwertigen Stundenbits können Sie zwischen Vormittag (AM bzw. a.m.) und Nachmittag (PM bzw. p.m.) unterscheiden. Durch das Bit SOM ist die Sommerzeitfunktion des Uhr/RAM-Chips einzuschalten, die aber nichts mit den in Deutschland hierfür festgelegten Daten zu tun hat. Mit den Bits PI, AI und UI können Sie verschiedene Interrupt-Anforderungen einschalten. Ein gesetztes Bit PI führt zu einer periodischen Interrupt-Anforderung mit einer Rate, die durch die vier Ratenbits im Statusregister A definiert ist. Das AI-Bit aktiviert die Alarmfunktion des Uhr/ RAM-Chips. Bei jeder Aktualisierung der Zeiteinträge prüft der Baustein, ob die aktualisierte Uhrzeit mit der in den Bytes 1, 3 und 5 gespeicherten Alarmzeit übereinstimmt. Ist das der Fall, so löst er einen Alarm-Interrupt aus. Falls das Bit UI gesetzt ist, so tritt nach jeder abgeschlossenen Aktualisierung von Uhrzeit und Datum im CMOS-RAM eine Interrupt-Anforderung auf. Sie wird als Aktualisierungs-Interrupt bezeichnet. Der Ausgang des Uhr/RAM-Chips für das Interrupt-Signal ist über IRQ8 mit dem Slave-PIC 8259A verbunden. Alle drei Quellen führen also zum selben Interrupt, nämlich dem Interrupt 70h. Ähnlich wie beim Timer-Interrupt 08h über IRQ0 ruft der Handler des Interrupt 70h einen weiteren Interrupt als User-Exit auf, den Interrupt 4ah. Normalerweise besteht der Handler aus einer einfachen IRET-Anweisung.
Sandini Bib Mainboard-Peripherieeinheiten
663
Der Handler des Interrupts 70h oder 4ah muss je nach Quelle unterschiedlich reagieren. Bei einer Interpretation der periodischen Interrupt-Anforderung als Alarm-Interrupt wird der Benutzer des PC sicher seines Computers nicht mehr froh. In diesem Fall hilft das Statusregister C; es dient zur Ermittlung der Quelle einer Interrupt-Anforderung. Das Bit IRQ gibt als Interrupt-Flag an, ob der Uhr/RAM-Chip überhaupt eine Interrupt-Anforderung ausgelöst hat. Ist IRQ gesetzt, so geben die Bits PF, AF und UF an, ob eine periodische Anforderung, eine Alarm- oder eine Aktualisierungsanforderung vorliegt. Sind durch mehrere gesetzte Aktivierungsbits im Statusregister B mehrere Interrupt-Anforderungen erlaubt, so können diese natürlich auch gleichzeitig auftreten. In diesem Fall sind auch mehrere der Bits PF, AF und UF gesetzt, und der Handler muss festlegen, welche Anforderung zuerst bedient wird. Im Uhr/RAM-Chip ist eine Funktion eingebaut, die ständig den Zustand der Batterie bzw. des Akkus überwacht. Fällt die Spannung einmal unter einen kritischen Wert, so setzt die Funktion das Bit gül im Statusregister D (siehe Abbildung 19.2), um anzuzeigen, dass die gespeicherten Werte möglicherweise nicht mehr gültig sind. Das BIOS überprüft beim Booten das Statusregister D, um einen solchen Stromausfall zu ermitteln und gegebenenfalls eine entsprechende Meldung auf dem Bildschirm auszugeben. Während eines Aktualisierungszyklus (Bit UIP im Statusregister A) des Uhr/RAM-Chips sind die Uhrzeit- und die Datumsbytes 0 bis 9 sowie die vier Statusregister nicht zugänglich. Die im Folgenden erläuterten Konfigurationsbytes können in der Regel jedoch ausgewählt werden. 6
5
4
3
2
STR SUM KFG MEM HD UHR
7
1 0
res
STR: Stromversorgung des MC146818 1=zeitweise unterbrochen SUM: Prüfsummentest 1=o.k. KFG: Konfiguration 1=ungültige Konfiguration MEM: ermittelte Speichergröße 1=abweichend von Eintrag HD: Festplatte 1=Controller oder Festplatte UHR: Uhrzeit 1=Uhrzeit ungültig res: reserviert
0=o.k. 0=Prüfsumme falsch 0=o.k. 0=o.k. nicht korrekt initialisierbar
0=o.k.
0=o.k.
Abb. 19.3: Diagnosestatusbyte (14, 0eh)
Im Diagnosestatusbyte (siehe Abbildung 19.3) legt die POST-Routine des BIOS bestimmte Ergebnisse von Prüfungen ab, die der PC beim Booten ausführt. Wie bereits erwähnt worden ist, setzt der Uhr/RAM-Chip im Statusregister D das Bit gül, wenn die Spannung der Batterie oder des Akkus einmal unter einen bestimmten Minimalwert abgesunken ist. Das BIOS liest diesen Eintrag beim Booten und setzt oder löscht das Bit STR im Diagnosestatusbyte. In den Bytes 46 und 47 speichert das BIOS eine Prüfsumme ab, die aus den Bytes 16 bis 45 gebildet wird. Beim Booten ermittelt der PC, ob die gespeicherte Prüfsumme mit der neu berechneten übereinstimmt, und er setzt (falls Prüfsumme o.k.) oder löscht (falls Prüfsumme falsch) das Bit SUM. Nicht der Uhr/RAM-Chip, sondern das BIOS berechnet die Prüfsumme. Wenn an den Bytes 16 bis 46 eine Änderung vorgenommen wird, muss die Prüfsumme neu berechnet und in den Bytes 46 und 47 abgespeichert werden. Passiert dies, meldet das BIOS beim nächsten Booten einen CMOS-Prüfsummenfehler. Beim Booten prüft das BIOS ferner, ob die angegebene Konfiguration erstens in sich konsistent ist und zweitens mit den tatsächlich vorhandenen Controllern etc. übereinstimmt. Das Ergebnis der Prüfung wird im Bit KFG abgelegt. Das Bit MEM gibt
Sandini Bib 664
Kapitel 19
an, ob die POST-Routine dieselbe Speichergröße ermittelt hat, wie Sie über das Setup-Programm eingegeben haben. Beim Booten versucht das BIOS, alle Controller zu initialisieren. Am Bit HD ist zu erkennen, ob dieser Vorgang im Fall der Festplatte C: erfolgreich war. Schließlich gibt das Bit UHR Auskunft darüber, ob die aktuelle Uhrzeit korrekt ist oder einen ungültigen Wert wie z.B. 12:78 Uhr anzeigt. 7
0
Shutdown-Status
Shutdown-Status: 00h=normaler System-Reset 01h=Initialisierung für Real Mode 04h=JMP zum Bootstrap 05h=EOI an PIC ausgeben, Tastatur löschen, JMP mit Far-Zeiger bei 40:67h 06h=JMP mit Far-Zeiger bei 40:67h ohne EOI 07h=Return zu INT 15h, Funktion 87h “Block im Extended Memory verschieben” 08h=Return zum POST-Speichertest 09h=Return zu INT 15h, Funktion 87h “Block im Extended Memory verschieben” 0ah=JMP mit Far-Zeiger bei 40:67h ohne EOI 0bh=IRET über Far-Zeiger bei 40:67h 0ch=Return über Far-Zeiger bei 40:67h Abb. 19.4: Shutdown-Statusbyte (15, 0fh)
Bei einem Prozessor-Reset wird das Shutdown-Statusbyte (siehe Abbildung 19.4) mit einem Wert geladen, der dem BIOS beim nachfolgenden Boot-Vorgang Informationen über die Ursache des Resets gibt. Ein Wert 00h des Shutdown-Status kennzeichnet einen normalen Reset, der z.B. vom Benutzer durch die Reset-Taste ausgelöst wird. Programme wie SMARTDRV.SYS oder RAMDRIVE.SYS, die im Protected Mode auf den Extended Memory zugreifen, setzen das ShutdownStatusbyte auf den Wert 09h, um dem BIOS anzuzeigen, dass kein »wirklicher« Reset, sondern eine Umschaltung vom Protected Mode in den Real Mode ausgeführt werden soll. 7
4
Typ LW A:
3
0
Typ LW B:
Typ LW A: Typ des ersten Diskettenlaufwerks (i.allg. A:) Typ LW B: Typ des zweiten Diskettenlaufwerks (i.allg. B:) 0000=nicht vorhanden 0001=5 1/4” 360KByte 0010=5 1/4” 1,2MByte 0011=3 1/2” 720KByte 0100=3 1/2” 1,44MByte 0101–1111=reserviert Abb. 19.5: Typ der Diskettenlaufwerke (16, 10h)
Das Byte 16 im CMOS-RAM gibt den Typ des ersten (höherwertiges Nibble) und zweiten Diskettenlaufwerks (niederwertiges Nibble) an (siehe Abbildung 19.5). Die Werte 0101–1111 sind reserviert. 7
4
Typ LW C:
3
0
Typ LW D:
Typ LW C: Typ der ersten Festplatte (i.allg. C:) Typ LW D: Typ der zweiten Festplatte (i.allg. D:) 0000=nicht vorhanden 0001–1110=Typen 1 bis 14 1111=Typen 16 bis 255 anhand des Festplatten-Erweiterungsbytes Abb. 19.6: Festplattentyp (18, 12h)
Sandini Bib Mainboard-Peripherieeinheiten
665
In ähnlicher Weise sind im Byte 18 die Typen der Festplatten abgelegt. Das höherwertige Nibble gibt den Typ der ersten, das niederwertige den Typ der zweiten Festplatte an. 7
3
4
0
Festplattentyp LW7..LW0
Abb. 19.7: Festplatten-Erweiterungsbyte (25, 19h bzw. 26, 1ah)
Der Wert 15 (= 0FH) ist als erweitert reserviert. Ist für eines der Laufwerke dieser Wert eingetragen, so ist das tatsächliche Typenbyte unter der Adresse 19h (erste Festplatte) bzw. 1ah (zweite Festplatte) abgelegt. Das Format dieses Festplatten-Erweiterungsbytes sehen Sie in Abbildung 19.7. Die für eine Festplatte durch das höher- oder niederwertige Nibble im Festplattenbyte oder durch das Festplatten-Erweiterungsbyte angegebene Nummer dient als Index in eine BIOSTabelle, in der die Geometrie der betreffenden Festplatte angegeben ist. Von Hersteller zu Hersteller können sich die BIOS-Tabellen allerdings voneinander unterscheiden. Byte-Nr. Typ 48/ Typ 49
7
4
3
0
32/53
Anzahl der Zylinder (niederw. Byte)
33/54
Anzahl der Zylinder (höherw. Byte)
34/55
Anzahl der Köpfe
35/56
Write-Precomp.-Zylinder (niederw. Byte)
36/57
Write-Precomp.-Zylinder (höherw. Byte)
37/58
Landezone (niederw. Byte)
38/59
Landezone (höherw. Byte)
39/60
Sektoren pro Spur
Abb. 19.8: Parameterblock der Festplattentypen 48 und 49 (32, 20h bzw. 53, 35h)
Alle aktuellen BIOS-Versionen gestatten die Definition benutzereigener Festplattentypen, wo die einzelnen Festplattendaten (Anzahl der Köpfe usw.) manuell festgelegt werden können. Meistens sind die Festplattentypen 48 und 49 für frei definierbare Typen reserviert, für die im CMOSRAM zwei Parameterblöcke vorgesehen sind (siehe Abbildung 19.8). Diese Blöcke sind jeweils acht Byte groß und beginnen beim Byte 32 bzw. 53. 5
4
3
2
res
1 0
x87 FLP
6
FL1 FL0 GR1 GR0
7
FL1, FL0: Anzahl der installierten Diskettenlaufwerke (wenn FLP=1) 00=1 Laufwerk 01=2 Laufwerke GR1, GR0: Typ des primären Bildschirm-/Grafikadapters 00=Adapter mit eigenem BIOS (EGA, VGA etc.) 01=CGA mit 40 Zeichen/Zeile 10=CGA mit 80 Zeichen/Zeile 11=Monochrom (MDA, Hercules) x87: Coprozessor 1=installiert 0=nicht installiert FLP: Diskettenlaufwerk 1=mindestens eines installiert 0=keines installiert Abb. 19.9: Gerätebyte (20, 14h)
Sandini Bib 666
Kapitel 19
Im Gerätebyte (siehe Abbildung 19.9) legt das Setup-Programm Daten über bestimmte Komponenten des PC ab. Die Bits FL1, FL0 geben die Zahl der installierten Diskettenlaufwerke an, wenn das Bit FLP gesetzt ist; ansonsten ist der Eintrag sinnlos. Mit den Bits GR1, GR0 wird der Typ des primären Bildschirmadapters festgelegt. Grafikadapter mit eigenem BIOS werden durch einen Eintrag 00 gekennzeichnet. 7
4
3
0
21 Basisspeicher in kByte (niederw. Byte) 22 Basisspeicher in kByte (höherw. Byte)
Abb. 19.10: Basisspeicher (21, 15h und 22, 16h)
Die beiden Basisspeicherbytes (siehe Abbildung 19.10) geben als 16-Bit-Zahl im Intel-Format die Größe des Basisspeichers in KByte an. 7
3
4
0
23/48 Extended Memory in kByte (niederw. Byte) 24/49 Extended Memory in kByte (höherw. Byte)
Abb. 19.11: Eingetragener bzw. vom BIOS ermittelter Extended Memory (23, 17h und 24, 18h bzw. 48, 30h und 49, 31h)
Den Wert für die Größe des Extended Memory legt das Programm in den beiden ExtendedMemory-Bytes 23 und 24 ab, die wie die beiden Basisspeicherbytes die Größe in KByte als 16-BitZahl im Intel-Format angeben. Beim Booten testet die POST-Routine des BIOS, wie groß der Extended Memory tatsächlich ist, und legt den ermittelten Wert für die Größe des Extended Memory in KByte in den Extended-Memory-Byte 48 und 49 ab. Stimmen die beiden Werte nicht überein, so erlitt das CMOS-RAM einen Stromausfall oder mit den Speichern stimmt etwas nicht. 7
4
3
46
Prüfsumme (niederw. Byte)
47
Prüfsumme (höherw. Byte)
0
Abb. 19.12: Prüfsumme (46, 2eh und 47, 2fh)
In den Bytes 46 und 47 des CMOS-RAMs ist die Prüfsumme der Bytes 16 bis 45 abgelegt. Sie wird durch einfache Addition der Werte der Bytes 16 bis 45 ermittelt und vom BIOS als 16-BitZahl im Intel-Format abgespeichert. 7
50
4
3
0
Jahrhundert JH7..JH0
Abb. 19.13: Jahrhundertbyte (50, 32h)
Im Byte 50 ist das Jahrhundert abgelegt, normalerweise im BCD-Format. Durch das DM-Bit im Statusregister B ist es aber auch als binärcodiertes Format festzulegen. Im Byte 9 des CMOSRAMs sind nur die Dekade und das Jahr des Datums, nicht aber unbedingt das Jahrhundert zu finden, was vom jeweiligen Uhr/RAM-Chip abhängt und bekanntlich das Jahr-2000-Phänomen verursacht.
Sandini Bib Mainboard-Peripherieeinheiten
667
In den reservierten Bits und Bytes legen die BIOS-Versionen hardware-spezifische Informationen ab, wie z.B. die Taktgeschwindigkeit des Prozessors, die Größe des BIOS-ROM, die Größe des Datenbusses, das Shadowing von ROM-Code oder das Caching beim Speicherzugriff. Die Belegung der einzelnen Bits und Bytes sind in diesen Fällen in keiner Weise standardisiert. Man sollte daher nicht versuchen, reservierte Bits und Bytes selbst zu benutzen oder in irgendeiner Weise zu verändern. Einträge im batteriegepufferten CMOS-RAM sind sehr langlebig: Auch ein Ausschalten und erneutes Booten befreit Sie nicht von fehlerhaften Einträgen im CMOS-RAM, die Ihren PC auch komplett »lahm legen« können. Sie können die beschriebenen Bytes im CMOS-RAM und die vier Steuerregister A bis D auf zwei Arten ansprechen:
: :
in eingeschränkter Weise (Datum/Uhrzeit und Alarm) über den BIOS-Interrupt 1ah vollständig durch die Adress- und Datenregister bei den Ports 70h und 71h
19.1.2 Der Zugriff über das BIOS Im BIOS stehen für den Interrupt 1ah verschiedene Funktionen zur Verfügung. Die ersten beiden betreffen die DOS-interne Systemuhr, die anderen die Echtzeituhr. Mit ihrer Hilfe können Sie die Uhrzeit setzen und löschen, das Datum setzen und löschen sowie eine Alarmzeit einstellen und löschen. Der Zugriff über das BIOS ist also recht beschränkt, Konfigurationsdaten lassen sich weder lesen noch schreiben. Das ist nur durch einen direkten Zugriff über die Ports möglich. Beispiel: Uhrzeit auf 12.45 Uhr ohne Sommerzeit setzen. mov mov mov mov mov int
ah, cl, ch, dl, dh, 1ah
03h 45h 12h 00h 00h
; ; ; ; ; ;
Funktion 03h 45 Minuten 12 Stunden keine Sommerzeit 0 Sekunden Uhrzeit über Interrupt 1ah setzen
Beachten Sie, dass die Übergabe der Datums- und Zeitangaben vom oder zum Interrupt 1ah durch binärcodierte Dezimalzahlen erfolgt. Kann der Interrupt-Handler die betreffenden Daten nicht aus dem CMOS-RAM lesen oder in diesen schreiben, weil der Chip z.B. gerade eine Aktualisierung ausführt, so ist das Carry-Flag gesetzt, und die in den Registern übergebenen Werte sind sinnlos. Neben der Programmierung von Datum und Uhrzeit können Sie noch die beiden Funktionen 83h und 86h des Interrupts 15h dazu benutzen, bestimmte Zeitintervalle einzustellen, bis eine Funktion auftritt. Bei Funktion 83h wird die Abarbeitung des Programms weiter ausgeführt und nach dem Verstreichen der Wartezeit ein benutzerdefiniertes Bit im Hauptspeicher gesetzt; Funktion 86h setzt die Abarbeitung des Programms dagegen aus, bis das eingestellte Zeitintervall abgelaufen ist. Es findet ein tatsächliches Warten statt.
19.1.3 Der Zugriff über Adress- und Datenregister Für den Zugriff über Adress- und Datenregister sind die Ports 70h (Adressregister) und 71h (Datenregister) relevant. Beachten Sie, dass das Datenbit 7 von Port 70h das NMI-Maskierungsregister steuert. Ändern Sie niemals seinen Wert, sondern lesen Sie erst den Wert des Bytes von Port 70h und überschreiben Sie nur die fünf niederwertigen Bits, die für eine Adressierung der 64 Bytes im CMOS-RAM ausreichen. Um ein Datenbyte zu lesen oder auszugeben, gehen Sie folgendermaßen vor:
Sandini Bib 668
: :
Kapitel 19
Lesen Sie über Port 70h das alte Byte ein, und geben Sie mit Hilfe der fünf niederwertigen Bits die Adresse des anzusprechenden Datenbytes aus. Lesen Sie über Port 71h das damit angesprochene Datenbyte, oder geben Sie es aus.
Beispiel: Typ der Festplattenlaufwerke lesen. IN al, 70h AND al, e0h OR al, 12h OUT 70h, al IN al, 71h
; ; ; ; ; ;
Byte aus Port 70h einlesen fünf niederwertige Bits löschen Akkumulator al mit Adresse des Bytes 18 laden Bit 7 bleibt unverändert; Adresse des Bytes 18 in Adressregister schreiben Laufwerkstyp in den Akkumulator lesen
Das im Beispiel ausgelesene Byte enthält die Typen beider Festplatten. Beispiel: Größe des Basisspeichers ermitteln. IN al, 70h AND al, e0h OR al, 16h OUT IN MOV IN AND OR
70h, al al, 71h ah, al al, 70h al, e0h al, 15h
OUT 70h, al IN al, 71h
; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
Byte aus Port 70h einlesen fünf niederwertige Bits löschen Adresse des höherwertigen Basisspeicherbytes in al laden Adresse an das Adressregister im Chip ausgeben höherwertiges Basisspeicherbyte einlesen höherwertiges Basisspeicherbyte in ah übertragen Byte aus Port 70h einlesen fünf niederwertige Bits löschen Adresse des niederwertigen Basisspeicherbytes in al laden Adresse an Adressregister im Chip ausgeben niederwertiges Basisspeicherbyte einlesen; damit enthält ax=ah.al die Größe des Basisspeichers in KByte
Wenn Sie einen Eintrag ändern, beachten Sie, dass der CMOS-RAM in den Bytes 46 und 47 eine Prüfsumme der Konfigurationsbytes 10h bis 2dh speichert. Sie müssen also auch die Prüfsumme neu berechnen und eintragen. Das ROM-BIOS prüft beim Booten, ob Konfigurationsdaten und Prüfsumme konform sind. Ist dies nicht der Fall, so gibt das BIOS die Mitteilung aus, dass ein CMOS-RAM-Fehler vorliegt, und verweigert das Booten. Hierdurch soll verhindert werden, dass das Betriebssystem beim Booten falsch konfiguriert wird und durch einen Konfigurationsfehler möglicherweise Daten oder sogar Hardware-Komponenten beschädigt. Alle Funktionen, die über den BIOS-Interrupt 1ah erreichbar sind, kann man natürlich auch direkt über die Ports programmieren. Für die Einstellung einer Alarmzeit ist beispielsweise Byte 1 (Alarmsekunde), Byte 3 (Alarmminute) und Byte 5 (Alarmstunde) entsprechend der gewünschten Alarmzeit und des im Statusregister B festgelegten Datenmodus zu schreiben und außerdem der Alarm-Interrupt durch das Bit AI im Statusregister B zu aktivieren.
19.2 Timer Eine wichtige Einheit ist der Timer, der mittlerweile ebenfalls Bestandteil eines Chipsets und auf Mainboards daher nicht mehr als einzelner Chip zu identifizieren ist. Der PC verfügt seit Anbeginn über einen so genannten PIT (8253/8254), was für Programmable Intervall Timer steht. Bei den folgenden Erläuterungen möchte ich mich, wie auch bei den Interrupt- und DMA-Controllern, auf diesen »Urahn«beziehen, da diese Einheiten nun einmal den PC-Standard mitbegründen, der auch in aktuellen Chipsets seine Gültigkeit hat.
Sandini Bib Mainboard-Peripherieeinheiten
669
Wohl schon jeder Programmierer ist einmal mit dem Problem konfrontiert worden, bestimmte zeitliche Verzögerungen in ein Programm einzubauen. Häufig werden hierzu »Dummy-Schleifen« der folgenden Form eingebaut: FOR I=0 TO 1000:NEXT I
Steuerwortregister
WR
RD
A0
A1
CS
Solche Verzögerungsschleifen haben aber einen erheblichen Nachteil: Sie sind von der Prozessorgeschwindigkeit abhängig. Hierfür kommt im PC dann ein programmierbarer Timer zum (PIT) Einsatz. Der PIT erzeugt aus einem externen Taktsignal programmierbare Zeitintervalle, die unabhängig von der CPU definiert sind. Der PIT im PC ist recht flexibel einzusetzen und kennt insgesamt sechs Betriebsmodi. In Abbildung 19.14 ist zunächst ein Blockdiagramm für den internen Aufbau des 8253/8254 gezeigt.
Schreib-/Leselogik
D7-D0
Datenpuffer
interner Bus
OUT2
GATE2
CLK2
Zähler 2
OUT1
GATE1
CLK1
Zähler 1
OUT0
CLK0
GATE0
Zähler 0
Abb. 19.14: Der Timerchip weist intern drei unabhängig arbeitende Zähler 0 bis 2 auf, die separat mit Takt- und Steuersignalen versorgt werden.
Der 8253/8254 weist drei voneinander völlig unabhängige und getrennt programmierbare Zähler mit den Nummern 0 bis 2 auf, die jeweils 16 Bit breit sind. Jedem der Zähler wird ein eigenes Taktsignal (CLK0 bis CLK2) zugeführt, das als Zeitbasis für den jeweiligen Zähler dient. Im UrPC sorgt ein 14,317-MHz-Quarz für das Basistaktsignal, das durch drei geteilt wird, um das Taktsignal des Prozessors von 4,77 MHz zu erzeugen. Durch eine weitere Vierteilung entsteht ein Signal mit etwa 1,193180 MHz, das den drei Eingängen CLK0 bis CLK2 des 8253/8254 als Taktsignal zugeführt wird. Im PC arbeitet also jeder der drei voneinander unabhängigen Zähler mit derselben Zeitbasis von 0,838 µs. Auch die heutigen Personal Computer besitzen einen Oszillator, der diese 1,19318 MHz für den oder die PITs zur Verfügung stellt. Um einen Zähler zu aktivieren oder zu triggern (siehe den Abschnitt Zählmodi weiter unten), wird ihm ein Gattersignal GATE0 bis GATE2 zugeführt. Je nach Zählmodus wird der zugehörige Zähler durch einen Übergang niedrig-hoch oder einen hohen Pegel des GATEx-Signals aktiviert. Über den entsprechenden Ausgang der Ausgänge OUT0 bis OUT2 gibt der Zähler ein Signal ab. Auch die Form des Ausgangssignals hängt vom Modus des Zählers ab.
Sandini Bib 670
Kapitel 19
Der Datenbuspuffer dient zusammen mit der Schreib-/Steuerlogik zum Schreiben und Lesen von Daten in bzw. aus dem PIT. Das Steuerregister lädt die Zähler und steuert die verschiedenen Betriebsmodi. Hierdurch lassen sich bestimmte Zeitintervalle und Signalformen an den Ausgängen OUT0 bis OUT2 einstellen. Die Zähler können ausgelesen und beschrieben werden; das Steuerregister ist nur beschreibbar. Beim 8254 steht zum Lesen des Steuerregisters ein zusätzlicher Befehl zur Verfügung – der Read-Back-Befehl. interner Bus
CRn
CRh
CE
Latch
Steuerlogik
Statusregister
OUTx
OLn
CLKx GATEx
OLh
Steuerwort
Abb. 19.15: Interner Aufbau eines Zählers im PIT
In Abbildung 19.15 ist der interne Aufbau eines Zählers verdeutlicht. Zentraler Bestandteil ist das Zählelement CE (engl. Counting Element), in dem der Zählvorgang abläuft. Das programmierbare Steuerregister legt die Betriebsart der Steuerlogik fest, die wiederum das Zählelement CE, die höher- und niederwertigen Ausgabe-Latches OLh, OLn (engl. Output Latches) sowie die höher- und niederwertigen Zählregister CRh, CRn (engl. Count Register) ansteuert. Der 8254 besitzt zusätzlich noch ein Status-Latch, über das der 8254 mit Hilfe des Read-Back-Befehls Statusinformationen ausgeben kann. Beim Schreiben von Zählwerten werden die von der CPU übergebenen Bytes erst in die Zählregister CRh und CRn geschrieben. Erst dann überträgt die Steuerlogik die beiden Bytes gleichzeitig in das 16-Bit-Zählelement.
19.2.1 Anschlüsse und Signale D7
1
24
Vcc
D6
WR
D5
RD
D4
CS
D3
A1
8253/ 8254
D2 D1
A0 CLK2
D0
OUT2
CLK0
GATE2
OUT0
CLK1
GATE0 GND
GATE1
12
13
OUT1
Abb. 19.16: Anschlussschema des 8253/8254
Sandini Bib Mainboard-Peripherieeinheiten
671
Die beiden Timer 8253 und 8254 stimmen in ihrem Anschlussschema und der Bedeutung der Signale überein, der einzige Unterschied zwischen ihnen ist, dass der 8254 einen zusätzlichen Befehl für das Auslesen des zuvor einprogrammierten Status kennt (Read-Back-Befehl). Üblicherweise ist in der Southbridge eines Chipsets ein 8254 nachgebildet, und welche Anschlüsse dann nach außen geführt werden, ist unterschiedlich. A0, A1 (I) Anschlüsse 19, 20 Die Adresssignale an diesen Pins geben die Nummer des Zählers oder das Steuerregister an, auf den bzw. auf das die CPU lesend oder schreibend zugreift. A0 und A1 sind üblicherweise mit dem Adressbus des Systems verbunden. Für die Kombinationen (A1,A0) gelten folgende Bedeutungen: (00) (01) (10) (11)
Zähler 0 Zähler 1 Zähler 2 Steuerregister
CLK0, CLK1, CLK2 (I, I, I) Anschlüsse 9, 15, 18 Diesen Pins wird das Taktsignal für die Zähler 0, 1 bzw. 2 zugeführt. CS (I) Anschluss 21 Liegt dieser Chip-Select-Pin auf einem niedrigen Pegel, so kann die CPU über den Datenbus D7– D0 mit Hilfe der Signale RD und WR Daten aus internen Registern des 8253/8254 lesen bzw. in diese schreiben. Das Signal CS aktiviert also den PIT für Schreib- und Lesevorgänge. Für die Zähloperationen und die vom PIT abgegebenen Signale ist CS ohne Bedeutung. D7–D0 (I/O) Anschlüsse 1–8 Die acht Anschlüsse bilden den bidirektionalen Datenbus, über den der 8253/8254 Daten und Befehle von der CPU empfängt oder an sie abgibt. GATE0, GATE1, GATE2 (I, I, I) Anschlüsse 11, 14, 16 Diesen Pins werden die Gattersignale der Zähler 0, 1 bzw. 2 zugeführt, um die Zähler zu aktivieren. OUT0, OUT1, OUT2 (O, O, O) Anschlüsse 10, 13, 17 Diese Anschlüsse geben die Ausgangssignale der Zähler 0, 1 bzw. 2 ab. RD (I) Anschluss 22 Ist das Signal an diesem Read-Pin auf einem niedrigen Pegel, so kann die CPU über den Datenbus D7–D0 Daten aus den internen Registern des PIT 8253/8254 lesen.
Sandini Bib 672
Kapitel 19
WR (I) Anschluss 23 Ist das Signal an diesem Write-Pin auf einem niedrigen Pegel, so schreibt die CPU über den Datenbus D7–D0 Daten in interne Register des PIT 8253/8254. GND (Pin 12) An diesen Pin wird das Massepotenzial (üblicherweise 0 V) angelegt. Vcc (Pin 24) Diesem Pin wird die Versorgungsspannung (üblicherweise +5 V) zugeführt.
19.2.2 Programmierung Die Programmierung des Timers wird derart ausgeführt, dass zunächst über den Port 043h ein Steuerwort in das Steuerregister und anschließend ein oder zwei Datenbytes über den Port des gewünschten Zählers ausgegeben werden. Ist das Steuerregister einmal geladen worden, so können die Zähler auch mit Werten beschrieben werden, ohne dass das Steuerregister erneut angesprochen wird; Zählmodus und -format bleiben unverändert. In Tabelle 19.2 sind die Portadressen der verschiedenen Register angegeben. Port (1. PIT)
Port (2. PIT)
Register
Zugriffsarten
040h 041h 042h 043h
048h 049h 04ah 04bh
Zähler 0 Zähler 1 Zähler 2 Steuerregister
schreiben/lesen schreiben/lesen schreiben/lesen nur schreiben
Tab. 19.2: Timer-Ports
Das Steuerregister des älteren Typs 8253 ist nur-schreibbar, aus ihm können keine Daten gelesen werden. Für den 8254 steht jedoch zusätzlich ein Befehl zur Verfügung, der Read-Back-Befehl, über den sich bestimmte Steuerinformationen ermitteln lassen. 6
SC
5
4
RW
3
2
1 0
Modus
BCD
7
SC:
Select Counter (Zähler auswählen) 00=Zähler 0 01=Zähler 1 10=Zähler 2 11=ungültig beim 8253, Read-Back-Befehl beim 8254
RW:
Read/Write 00=Zähler-Latch-Befehl 01=Lesen/Schreiben nur des niederwertigen Zählerbytes 10=Lesen/Schreiben nur des höherwertigen Zählerbytes 11=Lesen/Schreiben des niederwertigen, anschließend des höherwertigen Zählerbytes
Modus: Zählmodus des PIT 000=Modus 0 001=Modus 1 011=Modus 3 100=Modus 4 BCD:
010=Modus 2 101=Modus 5
Zählformat 0=binäre Zählung mit 16 Bit (Werte 0h bis ffffh) 1=Zählung mit binärcodierten Dezimalzahlen (Werte 0 bis 9999)
Abb. 19.17: Format des Steuerworts
Sandini Bib Mainboard-Peripherieeinheiten
673
Eingeleitet wird die Programmierung eines der drei Zähler des 8253/8254, indem man über Port 043h (1. PIT) bzw. 04bh (2.PIT) ein Steuerwort schreibt. In Abbildung 19.17 ist das Format angegeben. Schreiben von Zählerwerten Um einen Zähler zu starten oder mit neuen Werten zu laden, ist zuerst ein Steuerwort auszugeben, in dem der gewünschte Zähler, die Anzahl und Art der zu schreibenden Bytes, der Zählmodus des betreffenden Zählers sowie das Zählformat zu benennen sind. Die beiden SC-Bits legen den Zähler fest, auf den sich die nachfolgenden Einträge beziehen sollen. Die Kombination SC=11b ist beim 8253 ungültig, beim 8254 wird damit der Read-BackBefehl zum Auslesen des Steuerregisters ausgelöst (siehe unten). Die RW-Bits geben an, welche (nieder- oder höherwertig) und wie viele Zählerbytes zu schreiben sind. Wenn Sie beim Schreiben angeben, dass nur das nieder- oder höherwertige Byte geschrieben werden soll, so können Sie bei einem späteren Leseversuch auch nur das nieder- bzw. höherwertige Zählerbyte auslesen. Der Timer arbeitet intern aber dennoch als 16-Bit-Zähler, d.h., ein höherwertiges Zählerbyte 10 bedeutet keinen Zählerwert 10, sondern 256*10=2560. Der Zähler-Latch-Befehl ist nur für das Lesen eines Zählers von Bedeutung. Mit den drei Modus-Bits wird der Zählmodus des über SC ausgewählten Zählers festgelegt (Näheres zu den Zählmodi erfahren Sie im nächsten Abschnitt). Schließlich gibt das Bit BCD das Zählformat an. Bei gesetztem BCD-Bit arbeitet der Zähler mit binärcodierten Dezimalzahlen. Daher steht ein Bereich von 0 bis 9999 zur Verfügung. Ist BCD gleich 0, so zählt der Zähler binär mit 16 Bit, der Zählbereich beträgt daher 0 (0h) bis 65.535 (ffffh). Nachdem das Steuerwort übergeben worden ist, müssen Sie entsprechend den RW-Bits das niederwertige, höherwertige oder auch beide in den Zähler schreiben. Bei der Kombination RW=01b (nur niederwertiges Byte schreiben) geben Sie über den Port des entsprechenden Zählers das niederwertige Zählerbyte aus. Die Steuerlogik erkennt anhand des Steuerwortes, dass nur das niederwertige Byte übergeben wird, und setzt das höherwertige Byte in CRh automatisch auf 0. Analoges gilt für die Kombination RW=10b (nur höherwertiges Byte schreiben). In diesem Fall setzt die Steuerlogik das niederwertige Byte in CRn automatisch auf 0. Ist sowohl RW=11b, ist mittels zweier OUTBefehle erst das niederwertige und dann das höherwertige Byte auszugeben. Die Steuerlogik überträgt das zuerst empfangene Byte in das Register CRn, das zweite in das Register CRh. Für kleine Zählwerte oder Zählwerte, die ein Vielfaches von 256 sind, genügt also die Übergabe des niederwertigen bzw. höherwertigen Zählerbytes. So kann man sich dann einen OUT-Befehl sparen. Beispiel: Zähler 2 soll ein Rechtecksignal (Modus 3) mit einer Frequenz von 10 kHz abgeben; die CLK-Frequenz beträgt im PC 1,19318 MHz, der Teiler ist also 119; hierfür genügt das niederwertige Zählerbyte des Zählers 2, das höherwertige wird automatisch auf 0 gesetzt. MOV al, 01010110b OUT 43h, al
MOV al, 119 OUT 42h, al
; ; ; ; ; ; ; ;
Akkumulator mit entsprechendem Steuerwort laden Steuerwort über Port 43h in das Steuerregister des ersten PIT schreiben zu erzeugende Frequenz 10kHz, CLK-Frequenz 1,19318MHz -> Teiler 129 niederwertiges Byte des Zählwertes in Akkumulator übertragen Zählwert in den 2. PIT schreiben
Der maximal ladbare Zählerwert beträgt nicht ffffh (binäre Zählung) bzw. 9999 (BCD-Zählung), sondern 0. Beim nächsten CLK-Impuls springt der betreffende Zähler auf ffffh bzw. 9999, ohne eine Aktion auszulösen. Erst wenn er den Wert erneut auf 0 heruntergezählt hat, gibt er über den OUT-Pin ein Signal entsprechend dem programmierten Modus ab. Der Wert 0 entspricht also 216 beim binären Zählen und 104 beim Zählen mit BCD-Zahlen.
Sandini Bib 674
Kapitel 19
Lesen von Zählerwerten Für das Auslesen eines Zählers stehen für den 8253 zwei, für den 8254 drei Möglichkeiten zur Verfügung:
: : :
direktes Auslesen durch einen oder zwei IN-Befehle Zähler-Latch-Befehl Read-Back-Befehl (nur beim 8254)
Beim Auslesen eines Zählers sollte nicht auf die erste Möglichkeit zurückgegriffen werden, sondern der aktuelle Stand des Zählelements CE durch den Zähler-Latch- oder Read-Back-Befehl in die Ausgabe-Latches OLh und OLn übertragen und dort verriegelt werden. Das Latch OLh nimmt dabei das höherwertige Byte und das Latch OLn das niederwertige Byte des Zählelements CE auf. Erst durch einen oder zwei nachfolgende IN-Befehle für die Port-Adresse des betreffenden Zählers werden diese Latches dann ausgelesen. Ist beim Schreiben des Anfangszählwertes nur das niederwertige (RW=01b) oder höherwertige Byte (RW=10b) geschrieben worden, so lesen Sie den aktuellen Zählerwert des ursprünglich geschriebenen Bytes durch einen einzelnen IN-Befehl. Durch einen nachfolgenden IN-Befehl lesen Sie den nicht verriegelten Wert des nieder- bzw. höherwertigen Zählerbytes zum Zeitpunkt des IN-Befehls und nicht das entsprechende zweite Byte des 16-Bit-Zählelements aus. Dies ist nur möglich, wenn Sie sowohl das nieder- als auch das höherwertige Zählerbyte geschrieben haben. In diesem Fall müssen Sie den Zählerstand durch zwei IN-Befehle auslesen. Der PIT übergibt beim ersten IN-Befehl das niederwertige und beim zweiten IN-Befehl das höherwertige Byte des 16-Bit-Zählers. Der Prozessor greift dabei nicht direkt auf das Zählelement CE zu, sondern auf die Ausgabe-Latches. Ist der Inhalt von CE einmal durch einen Zähler-Latch-Befehl in die Ausgabe-Latches übertragen worden, so bleiben die Werte dort gespeichert, bis die CPU einen bzw. zwei IN-Befehle ausführt oder der zugehörige Zähler neu programmiert wird. Nachfolgende Zähler-LatchBefehle werden ignoriert, wenn die Ausgabe-Latches vorher nicht gelesen worden sind. Das Zählelement CE zählt jedoch auch nach einem Zähler-Latch-Befehl weiter; der Zähler-Latch macht also nur eine kurze »Aufnahme« des Zählelements CE. Falls der Zähler im Modus RW=00b ohne Zähler-Latch-Befehl direkt über zwei IN-Befehle ausgelesen wird, so hat sich der Zählerstand beim zweiten IN-Befehl möglicherweise bereits verändert – das als zweites gelesene höherwertige Byte des Zählelements CE passt also nicht mehr zum zuerst gelesenen niederwertigen Byte. Die ermittelten Werte stimmen mit den tatsächlichen nicht überein. Da zwischen zwei aufeinander folgenden IN-Befehlen beispielsweise ein Interrupt oder ein Speicher-Refresh auftreten kann, ist der Abstand, in dem zwei IN-Befehle ausgeführt werden, nicht vorhersehbar. Deshalb sollte stets ein Zähler-Latch-Befehl ausgelöst oder der Zählerstand über den Read-Back-Befehl ermittelt werden. Abbildung 19.18 gibt das Format des Steuerwortes für den Zähler-Latch-Befehl an. 7
6
SC
5
4
3
2
1 0
0 0 X X X X
SC: zu verriegelnder Zähler X: Werte sind ohne Bedeutung, für Kompatibilität wird X=0 empfohlen Abb. 19.18: Format des Zähler-Latch-Befehls
Sandini Bib Mainboard-Peripherieeinheiten
675
Um den aktuellen Zählerstand zu ermitteln, muss über den Port 043h bzw. 04bh ein ZählerLatch-Befehl für den auszulesenden Zähler angegeben werden. Anschließend werden je nach programmiertem Modus ein oder zwei IN-Befehle bezüglich des betreffenden Zählers ausgelesen. Dabei ist darauf zu achten, ob der betreffende Zähler mit einem oder zwei Bytes programmiert worden ist. Der eingelesene 8- oder 16-Bit-Wert gibt dann den aktuellen Zählerstand zum Zeitpunkt des Zähler-Latch-Befehls im programmierten Zählmodus (binär oder BCD) an. Stellt der so ermittelte 8-Bit-Wert das höherwertige Zählerbyte dar, so müssen Sie ihn (zumindest in Gedanken) mit 256 multiplizieren, um den »echten« Wert zu erhalten, den das Zählelement CE im PIT verwendet. Beispiel: Stand von Zähler 2 ermitteln; der Zähler wurde zu Beginn mit nieder- und höherwertigem Byte geladen. MOV al, 10000000b OUT 43h, al IN al, 42h IN ah, 42h
; ; ; ; ;
Zähler-Latch-Befehl bezüglich Zähler 2 in al laden Zähler-Latch-Befehl an Steuerregister ausgeben niederwertiges Zählerbyte in al einlesen höherwertiges Zählerbyte in ah einlesen damit enthält ax=ah.al den aktuellen 16-Bit-Zählerstand
Der erste IN-Befehl überträgt das vom Latch CLn gehaltene niederwertige Byte des Zählelementes CE in das niederwertige Byte al des Akkumulators ax, und der zweite IN-Befehl überträgt das vom Latch CLh gehaltene höherwertige Byte in das höherwertige Byte ah des Akkumulators ax. Somit enthält ax nach den beiden INs den 16-Bit-Wert des Zählers. Leider gibt es keine Möglichkeit, den Anfangswert eines Zählers direkt zu ermitteln. Somit bleibt nichts anderes übrig, als den betreffenden Zähler sehr oft abzufragen und den maximal ausgelesenen Wert als Anfangswert anzusehen. Eine weitere Unannehmlichkeit ist, dass beim 8253 der programmierte Zählmodus nicht abgefragt werden kann, so ist z.B. die Interpretation des ausgelesenen Zählerwertes ganz verschieden, je nachdem, ob der Zähler mit Binär- oder BCD-Zahlen arbeitet. Außerdem lässt sich nicht ermitteln, ob der Zähler mit nieder- und höherwertigem Byte oder nur mit dem nieder- bzw. höherwertigen Byte geladen worden ist. Dies ist aber für die Bestimmung der Zählrate eines unbekannt programmierten PIT unbedingt erforderlich. Ohne Kenntnis des Zählmodus sind ist man bei der Interpretation der ausgelesenen Zählerstände daher auf Spekulationen angewiesen. Der neuere Vertreter der PITs, der als Standard gilt, besitzt als wesentliche Neuerung die Möglichkeit, über einen Read-Back-Befehl auch den Modus eines Zählers abfragen zu können. Zusätzlich können Sie über den Read-Back-Befehl auch den Stand des Zählers ermitteln. Der Read-Back-Befehl wird über das Steuerregister (Port 43h bzw. 04bh) ausgelöst. In Abbildung 19.19 sehen Sie das Format dieses Befehls. 6
5
4
ZW ST
7
1 1
3
2
1 0
Z2 Z1 Z0 0
ZW:
Zählerwert des ausgewählten Zählers ermitteln 1=Zählerwert nicht ermitteln 0=Zählerwert ermitteln
ST:
Status des ausgewählten Zählers ermitteln 1=Zählerstatus nicht ermitteln 0=Zählerstatus ermitteln
Z2, Z1, Z0: ausgewählter Zähler 1=Zähler ausgewählt Abb. 19.19: Format des Read-Back-Befehls
0=Zähler nicht ausgewählt
Sandini Bib 676
Kapitel 19
Die beiden höchstwertigen Bits legen mit dem Wert 11b den Read-Back-Befehl fest (vgl. mit Abbildung 19.17). ZW gibt an, dass der Stand ST eines Zählers ermittelt werden soll. ZW und ST sind komplementierte Signale, d.h., die gewünschte Aktion wird ausgelöst, indem das betreffende Bit auf 0 und nicht auf 1, wie meistens üblich, gesetzt wird. Mit den Bits Z2 bis Z0 wird der Zähler bestimmt, dessen Wert oder Modus ermittelt werden soll. Mit dem Read-Back-Befehl können mehrere Zähler-Latch-Befehle gleichzeitig ausgelöst werden, indem über die Bits Z2 bis Z0 mehrere Zähler simultan bestimmt werden. Der 8254 verhält sich dann so, als ob mehrere Zähler-Latch-Befehle einzeln hintereinander ausgelöst worden wären, und überträgt die Werte der einzelnen CEs in die Latches CLn und CLh der jeweiligen Zähler. Alle nachfolgenden Zähler-Latch-Befehle – egal ob sie durch einen eigenen Zähler-Latch- oder einen weiteren Read-Back-Befehl ausgelöst wurden – werden ignoriert, wenn der betreffende Zähler nicht durch einen oder zwei IN-Befehle ausgelesen worden ist. Ferner ist es möglich, mit einem Read-Back-Befehl sowohl den Wert als auch den Modus eines Zählers zu ermitteln. Möchten Sie nur den Wert eines Zählers ermitteln, so setzen Sie ZW=0 und ST=1. Der Read-Back-Befehl ist in diesem Fall äquivalent zu einem (nur ein Zx=1 setzen; x = 0, 1, 2) oder mehreren Zähler-Latch-Befehlen (wenn mehrere Zx=1). Für die Zahl und Interpretation der IN-Befehle gilt dasselbe wie für den normalen Zähler-Latch-Befehl. Falls demgegenüber der Modus bestimmt werden soll, in dem ein bestimmter Zähler programmiert ist, so werden ST=0 und ZW=1 gesetzt. Auch hier ist es möglich, mehrere Zähler gleichzeitig auszuwählen. Hierfür sind nur mehrere Zx auf 1 zu setzen. Der Read-Back-Befehl verriegelt den aktuellen Modus und stellt dann bei der Port-Adresse des oder der ausgewählten Zähler ein Statusbyte zur Verfügung, das über dessen Portadresse mit einem IN-Befehl ausgelesen werden kann. Wird ein neuer Read-Back-Befehl ausgelöst, um den Modus zu ermitteln, ohne den betreffenden Zähler vorher ausgelesen zu haben, so wird der zweite Befehl ignoriert, und die Latches enthalten weiter den Modus zum Zeitpunkt des ersten Befehls. In Abbildung 19.20 ist das Format des Statusbytes angegeben. 5
4
RW
3
2
1 0
Modus
BCD
6
Pin Null
7
Pin:
Status des OUTx-Pins 1=OUTx-Pin hoch 0=OUTx-Pin niedrig
Null:
Zählelement mit Anfangswert geladen? 1=Zählelement noch nicht geladen, Zählerwert kann nicht gelesen werden 0=Zählelement geladen, Zählerwert kann gelesen werden
RW, Modus, BCD:
programmierter Zählmodus (siehe Abbildung 19.17)
Abb. 19.20: Format des Statusbytes
Das Bit Pin gibt den Status des OUT-Pins des betreffenden Zählers an. Ist Pin=1, so gibt der Zähler ein Signal mit hohem Pegel (+5 V), ansonsten mit niedrigem Pegel (0 V) ab. Das Bit Null zeigt an, ob der letzte geschriebene Zählerwert bereits von den Latches CRn und CRh in das Zählelement CE übertragen worden ist. Je nach programmiertem Zählmodus kann dies längere Zeit dauern. Erst wenn Null=0 ist, hat es Sinn, den Zählerwert zu lesen. Vorher übergibt der PIT einen Wert, der noch den alten Zustand widerspiegelt. Die restlichen sechs Bits RW, Modus und BCD geben die Werte zurück, mit denen sie beim letzten Schreiben des Steuerregisters für den betreffenden Zähler geladen wurden (siehe Abbildung 19.17). Beispielsweise kann man ermit-
Sandini Bib Mainboard-Peripherieeinheiten
677
teln, ob nur das nieder- oder höherwertige Byte mit einem IN-Befehl oder beide mit zwei INBefehlen ausgelesen werden müssen, um den aktuellen Wert eines Zählers zu erhalten. Beispiel: Modus des Zählers 0 ermitteln. MOV al, 11100010b ; ; OUT 43h, al ; IN al, 40h ;
Akkumulator mit Read-Back-Befehl für Modus laden: ZW=1, ST=0 Read-Back-Befehl an Steuerregister ausgeben Modus über Port des Zählers 0 einlesen
Das Statusbyte im Akkumulator al besitzt den Wert 00110100. Der OUT-Pin liegt somit auf 0 V, der Zähler ist bereits mit dem zuletzt übergebenen Wert geladen worden, es werden das niederund höherwertige Byte benutzt, der Zählmodus lautet 2, und die Zählung erfolgt binär mit 16 Bit. Dieser Modus wird benutzt, um den Interrupt 08h auszulösen, der die interne Systemuhr nachstellt. Im Read-Back-Befehl ist die Ermittlung von Modus und Wert eines Zählers auch kombinierbar. In diesem Fall ist sowohl ZW als auch ST auf 0 zu setzen. Alle Zähler, die mit Z2 bis Z0 spezifiziert werden, geben dann Informationen über den Zählmodus und den Zählwert zurück. Mit dem ersten IN-Befehl bezüglich eines ausgewählten Zählers erhält man das Statusbyte, mit dem zweiten bzw. zweiten und dritten das nieder- und/oder höherwertige Byte des aktuell verriegelten Zählerstandes. Alle weiteren IN-Befehle übergeben nicht verriegelte Zählerwerte, wie sie unmittelbar aus dem Zählelement CE entnommen werden, aber keine Statusbytes mehr. Zu beachten ist, dass auch alle mit den Bits Z2 bis Z0 angegebenen Zähler vollständig mit zwei oder drei IN-Befehlen ausgelesen werden, da andernfalls spätere Zähler-Latch- oder Read-BackBefehle möglicherweise ignoriert werden. Wenn ein Zähler-Latch-Befehl und später ein Read-Back-Befehl zum Einlesen des Modus ausgegeben wird, ohne den Zählerstand vorher eingelesen zu haben, so übergibt der PIT mit dem ersten IN-Befehl zuerst das Statusbyte und erst dann das oder die Bytes, die den Zählerwert angeben. Die Reihenfolge der Übergabe verriegelter Bytes bleibt also stets gleich. Wurde der Zählerwert vor dem Read-Back-Befehl abgefragt, so übergibt der IN-Befehl nach dem Read-Back-Befehl natürlich das verriegelte Statusbyte. Zählmodi Der Timer kennt insgesamt sechs verschiedene Zählmodi. Außerdem kann der PIT binär oder mit Hilfe binärcodierter Dezimalzahlen zählen. In Abbildung 19.21 sind Diagramme der Signale, die vom Anschluss OUTx im jeweiligen Modus abgegeben werden, sowie die Bedeutung der Triggersignale am Eingang GATEx dargestellt. Im Folgenden werden nun die verschiedenen Betriebsmodi kurz erläutert. In allen Modi zählt der PIT vom Anfangswertzählerwert zu kleineren Werten. Beim Neuschreiben des Steuerregisters wird die Steuerlogik sofort zurückgesetzt und der Ausgang OUT des betreffenden Zählers in einen definierten Anfangszustand zurückversetzt. Neue Zählerwerte können unter Beachtung des zuletzt programmierten Modus (nieder- und/ oder höherwertiges Zählerbyte etc.) jederzeit in einen der Zähler eingeschrieben werden. Die neuen Werte erlangen jedoch in den verschiedenen Modi zu unterschiedlichen Zeitpunkten Bedeutung. Hat ein Zähler den Wert 0 erreicht, so hört er bei den nicht-periodischen Modi 0, 1, 4 und 5 nicht etwa auf zu zählen, sondern macht mit ffffh (BCD=0) oder 9999 (BCD=1) weiter. Der OUT-Pin wird jedoch nicht zurückgesetzt, d.h. die Zählung findet nur intern ohne externe Auswirkung statt.
Sandini Bib 678
Kapitel 19
CLK WR
CW=12 LSB=4
CW=10 LSB=4
CW=14 LSB=4
GATE OUT GATE OUT
(a) Modus 0
(b) Modus 1
(c) Modus 2
CLK CW=10 LSB=4
CW=12 LSB=4
CW=14 LSB=4
WR GATE OUT GATE OUT
(d) Modus 3
(a) (b) (c) (d) (e) (f)
Modus Modus Modus Modus Modus Modus
0: 1: 2: 3: 4: 5:
(e) Modus 4
(f) Modus 5
Interrupt bei Zählende Programmierbares Monoflop Ratengenerator Rechteckgenerator Software-getriggerter Impuls Hardware-getriggerter Impuls
Abb. 19.21: Betriebsmodi des 8253/8254
In manchen Modi dient das GATE-Signal dazu, den Zählvorgang auszuführen: Ist GATE=1, so zählt der 8253/8254, ansonsten hält er den gerade gespeicherten Wert. Bei anderen Modi startet ein Übergang niedrig-hoch oder ein hoher Pegel am GATE-Eingang den Zählvorgang. Der GATE-Impuls wirkt somit als Trigger. Selbst wenn GATE anschließend wieder auf einen niedrigen Pegel zurückkehrt, arbeitet der Zähler weiter. Die Größe N in den folgenden Beschreibungen bezeichnet den anfänglichen Wert des Zählers. Modus 0 (Interrupt bei Zählende) Nachdem das Steuerregister und der Anfangszählwert geschrieben worden sind, wird der Zähler beim nächsten CLK-Impuls geladen. Der OUT-Pin ist ab Zählbeginn auf einem niedrigen Pegel (0 V). Erreicht der Zähler den Wert 0, so steigt OUT an und bleibt auf einem hohen Pegel (+5 V), bis ein neuer Zählwert oder ein neues Steuerwort für den Modus 0 geschrieben wird. Ist GATE=1, so zählt der betreffende Zähler herunter, ist GATE=0, so ist er deaktiviert, und der Zählwert bleibt fest. Wird ein neuer Zählwert in einen Zähler geschrieben, so wird er mit dem nächsten CLK-Impuls geladen, und der Zähler zählt beginnend mit dem neu geladenen Zählwert weiter. Auch bei GATE=0 kann der Zähler geladen werden, der Zählvorgang beginnt jedoch erst, wenn GATE auf einen hohen Pegel ansteigt. Der Modus 0 wird meist dazu verwendet, um nach Ablauf einer gewissen Zeit einen Hardware-Interrupt auszulösen. Im PC wird für den periodischen TimerInterrupt aber Modus 2 benutzt, da Modus 0 nicht periodisch ist. Modus 1 (programmierbares Monoflop) Nach dem Schreiben des Steuerregisters und des Anfangszählwerts liegt der Ausgang OUT zunächst auf einem hohen Pegel (+5 V). Ein Trigger (Übergang niedrig-hoch) am GATE-Eingang lädt den Zähler. Beim nächsten CLK-Impuls fällt OUT auf einen niedrigen Pegel (0 V) ab und
Sandini Bib Mainboard-Peripherieeinheiten
679
bleibt auf diesem Pegel, bis der Zähler den Wert 0 erreicht hat. OUT steigt dann wieder auf einen hohen Pegel an. Erst einen CLK-Impuls nach dem nächsten Trigger fällt OUT erneut auf einen niedrigen Pegel ab. Der PIT erzeugt im Modus 1 also einen getriggerten Einzelimpuls mit einer Länge von N CLK-Impulsen und einem niedrigen Pegel. Tritt während eines Zählvorgangs, d.h., während OUT auf einem niedrigen Pegel liegt, am GATE-Eingang nochmals ein Trigger-Impuls auf, so lädt der PIT den Zähler erneut mit dem Anfangswert. Der OUT-Pin liegt daher N CLK-Zyklen nach dem letzten Trigger-Impuls auf einem niedrigen Pegel, und der PIT ist im Modus 1 im Gegensatz zu Modus 0 neu triggerbar. Wenn während eines Zählvorgangs im Modus 1 ein neuer Zählwert geschrieben wird, so hat der neue Wert keine Auswirkungen auf den gegenwärtigen Vorgang. Erst mit dem nächsten TriggerImpuls am GATE-Eingang wird der neue Zählwert in den Zähler übertragen. Der Trigger-Impuls kann natürlich auch dann auftreten, wenn der PIT den gegenwärtigen Zählvorgang noch nicht beendet hat. Der Einzelimpuls mit einem niedrigen Pegel dauert in diesem Fall so lange an, bis der PIT den neuen Zählwert auf 0 heruntergezählt hat. Modus 2 (Ratengenerator) Nachdem das Steuerwort und der Anfangszählerwert N geladen worden sind, beginnt der PIT beim nächsten CLK-Impuls mit der Zählung. Erreicht der Zähler den Wert 1, so fällt OUT für einen CLK-Impuls auf einen niedrigen Pegel, der 8253/8254 erzeugt also einen Nadelimpuls. Anschließend wird der Anfangszählerwert automatisch neu geladen, und der PIT beginnt denselben Zählvorgang erneut, Modus 2 ist somit periodisch. Der Abstand zwischen zwei OUTImpulsen beträgt N CLK-Zyklen. Ein Signal GATE=1 aktiviert den Zähler, ein Signal GATE=0 deaktiviert ihn. Fällt GATE während des Zählvorgangs auf einen niedrigen Pegel und steigt es später wieder auf einen hohen Pegel an, so lädt der PIT mit dem Anstieg auf einen hohen Pegel den Anfangszählerwert und beginnt mit der Zählung. Der Chip kann im Modus 2 also durch einen Hardware-Impuls getriggert werden. Andererseits beginnt der PIT auch sofort nach dem Schreiben des letzten Datenbytes. Bei aktivem GATE kann der PIT also auch durch Software, d.h. den letzten Schreibbefehl, getriggert werden. Der Modus 2 wird beim Zähler 0 des 8253/8254 im PC für den periodischen Timer-Interrupt benutzt. Der Übergang niedrig-hoch beim Wiederanstieg des Signals CLK0 löst über den MasterPIC 8259A einen Hardware-Interrupt IRQ0 entsprechend Interrupt 08h aus. Der Zählwert muss dabei von 1 verschieden sein. Modus 3 (Rechteckgenerator) Modus 3 erzeugt ein periodisches Rechtecksignal mit einer Periode von N CLK-Zyklen. Zu Beginn liegt OUT auf hohem Pegel, ist die Hälfte der N CLK-Zyklen verstrichen, so fällt OUT auf einen niedrigen Pegel ab. Nachdem der Zählwert gleich 0 geworden ist, steigt OUT erneut auf einen hohen Pegel an, und der anfängliche Wert N wird wieder in den Zähler geladen. Modus 3 ist somit wie Modus 2 periodisch. Im Gegensatz zu Modus 2 beträgt die Niedrig-Phase des OUTPins aber N/2 CLK-Zyklen und nicht nur einen CLK-Zyklus. Ist GATE=1, arbeitet der Zähler; ist GATE=0, ist er deaktiviert. Fällt GATE auf einen niedrigen Pegel, während auch der OUT-Pin auf einem niedrigen Pegel liegt, so wird OUT sofort auf einen hohen Pegel angehoben. Ein Anstieg von niedrig nach hoch am Gate-Eingang (Trigger-Impuls) lädt den Zähler mit dem Anfangszählwert und startet den Zählvorgang. Der PIT kann somit im Modus 2 durch Hardware synchronisiert werden. Nachdem Steuerregister und Anfangszählwert geschrieben worden sind, lädt der Timer den Zähler mit dem nächsten CLK-Impuls. Der PIT kann also auch mittels Software synchronisiert werden.
Sandini Bib 680
Kapitel 19
Ein neuer Zählwert, der während eines aktiven Zählvorgangs eingegeben wird, beeinflusst den gegenwärtigen Vorgang nicht. Erst nach dem Ende des aktuellen Halbzyklus im Modus 3 lädt der PIT den neuen Wert. Die Längen der Niedrig- und Hoch-Zustände unterscheiden sich für geradzahlige und ungeradzahlige Werte N. Da ein CLK-Zyklus die feinste zeitliche Auflösung definiert, können keine Zeiten mit der halben CLK-Zykluslänge erzeugt werden. Bei ungeradzahligem N liegt OUT zu Beginn auf einem hohen Pegel. Der PIT lädt N-1, d.h. eine gerade Zahl, in den Zähler und beginnt, diesen Wert in Zweierschritten zu verkleinern. Einen CLK-Impuls, nachdem der Zähler den Wert 0 erreicht hat, fällt OUT auf einen niedrigen Pegel ab, und der Zähler wird wieder mit N-1 geladen. Der Wert wird erneut in Zweierschritten dekrementiert. Ist 0 erreicht, so steigt OUT auf einen hohen Pegel an, und der Vorgang beginnt von vorne. Das Signal am OUT-Pin ist also für (N+1)/2 CLK-Zyklen auf dem hohen Pegel und für (N-1)/2 CLK-Zyklen auf einem niedrigen Pegel, d.h., das Signal ist etwas länger hoch als niedrig. Bei geradzahligen N-Werten wird N unverändert in den Zähler geladen und in Zweierschritten verkleinert. Ist der Wert 0 erreicht, fällt OUT auf einen niedrigen Pegel ab, und der Anfangswert N wird sofort erneut geladen. Nachdem der Zähler in Zweierschritten auf 0 heruntergezählt hat, steigt OUT wieder auf einen hohen Pegel an, und der gesamte Vorgang beginnt von neuem. Bei geraden N-Werten sind die Phasen mit Pegel hoch und niedrig also gleich lang. In beiden Fällen beträgt die Periode des Rechtecksignals N-CLK-Zyklen. Der Anfangswert des Zählers muss mindestens 2 betragen. Das erzeugte Rechtecksignal kann beispielsweise für die Übermittlung von Daten über serielle Schnittstellen benutzt werden, der PIT arbeitet dann als Baudratengenerator. Im PC werden die Zähler 1 und 2 im Modus 3 betrieben, um den DMA-Chip für die Speicherauffrischung bzw. den Lautsprecher anzusteuern. Modus 4 (Software-getriggerter Impuls) Zu Beginn liegt OUT auf einem hohen Pegel. Hat der Zähler den Wert 0 erreicht, fällt OUT für einen CLK-Impuls auf einen niedrigen Pegel ab und steigt dann wieder auf einen hohen Pegel an. Befindet sich GATE auf einem hohen Pegel, so arbeitet der Zähler; ist GATE=0, so ist er deaktiviert. Die Triggerung erfolgt also durch Software, da der PIT nach dem Schreiben von Steuerregister und Anfangszählwert mit dem Zählvorgang beginnt. Da der Zähler mit dem ersten CLKImpuls nach dem Schreiben geladen wird und erst beim nächsten CLK-Impuls mit dem Zählen beginnt, fällt OUT (bei GATE=1) N+1 CLK-Zyklen nach dem Schreiben auf einen niedrigen Pegel ab. Der PIT arbeitet im Modus 4 im Gegensatz zu Modus 2 nicht periodisch, erst ein neu geschriebener Zählwert triggert den Zähler. Wenn während des Zählvorgangs ein neuer Zählwert geschrieben wird, lädt der PIT den neuen Wert beim nächsten CLK-Impuls und setzt den Zählvorgang beginnend mit dem neuen Anfangswert fort. Der 8253/8254 ist im Modus 4 also durch Software neu triggerbar. Modus 5 (Hardware-getriggerter Impuls) Die Impulsform am OUT-Pin stimmt mit dem Modus 4 überein. Die Triggerung erfolgt jedoch durch einen Übergang von niedrig nach hoch von GATE. Hierdurch lädt der PIT beim nächsten CLK-Impuls den Anfangszählwert in den Zähler und der Zählvorgang beginnt. Ist der Wert 0 erreicht, so fällt OUT für einen CLK-Impuls auf einen niedrigen Pegel ab und steigt anschließend wieder auf einen hohen Pegel an. OUT fällt also N+1 CLK-Zyklen nach einem Trigger-Impuls am GATE-Eingang auf einen niedrigen Pegel ab. Tritt während eines Zählvorgangs ein TriggerImpuls auf, so lädt der PIT den Anfangswert erneut in den Zähler und fährt beginnend mit dem
Sandini Bib Mainboard-Peripherieeinheiten
681
Anfangswert mit dem Zählen fort. Der 8253/8254 kann im Modus 5 also durch Hardware getriggert werden. Das Neuschreiben eines Zählwerts während eines aktuellen Zählvorgangs hat keinen Einfluss auf den Vorgang. Erst beim nächsten Trigger-Impuls lädt der PIT den neuen Anfangswert.
19.3 Super I/O-Controller Neben dem Ersatz der Legacy-Schnittstellen bieten die so genannten Super I/O-Controller noch weitere Funktionseinheiten. Sie sind schaltungstechnisch betrachtet als Ergänzung zur Southbridge auf einem Mainboard zu verstehen und beinhalten, vereinfacht dargestellt, all die Peripherieeinheiten, die die jeweils verwendete Southbridge eben nicht bietet. Die Real Time Clock mit dem CMOS-RAM kann beispielsweise entweder in der Southbridge (PIIX4) oder auch in einem Super I/O-Controller wie dem FDC37C93xAPM von SMSC (Standard Micro Systems Corporation) integriert sein. Entsprechendes gilt für andere Einheiten wie etwa das EIDE-Interface oder den Keyboard-Controller. Die Super I/O-Controller verwenden als Interface (zum Systembus) in der Regel aber nicht den PCI-Bus, sondern den ISA-Bus bzw. eine spezielle 8-Bit-Schnittstelle (LPC), die vom Chipset zur Verfügung gestellt wird, was für die eher langsame Peripherie, die hier angeschlossen wird, von der Leistung her aber keine Rolle spielt. Die im Super I/O-Controller integrierten Einheiten verhalten sich genauso, als wenn sie mit Hilfe einzelner Chips realisiert worden wären und belegen auch dieselben Interrupt- und DMA-Kanäle. Ein Super I/O-Controller präsentiert sich im System zumeist wie ein ISA-Plug&Play-Gerät mit mehreren logischen Devices. Letztendlich stellt ein Super I/O-Controller neben aktuellen Einheiten wie für ACPI (Advanced Power Management) oder IrDa (Infrarot-Schnittstelle) oder den SMB (System Management Bus) genau diejenigen Einheiten zur Verfügung, die man im Sinne von Intel einerseits als »Altlasten« ansehen könnte. Andererseits sorgen diese Einheiten, die auch unter Legacy Devices firmieren, für die oft zitierte PC-Kompatibilität und somit für die Weiterverwendung der gewohnten Schnittstellen (RS232, Parallel-Port) und Geräte (Diskettenlaufwerk). Super I/O-Controller können ganz allgemein die unterschiedlichsten Schaltungseinheiten beinhalten, gemeinsam ist ihnen jedoch meist der Diskettenlaufwerkscontroller, der auf dem ursprünglichen Chip von NEC basiert (µPD765). In Abbildung 19.22 ist als Beispiel das Innenleben des FDC37C93xAPM von SMSC gezeigt, der in einem 160-Pin-QFP-Gehäuse hergestellt wird. Sie erkennen hier die unterschiedlichen Funktionseinheiten wie eben den Floppy Disk Controller mit dazugehöriger Digital Data SeparatorEinheit, wobei die zweite (16C550 Compatible Serial Port 2) auch als Infrarot-Port verwendet werden kann. Außerdem sind hier gleich der Keyboard Controller (8042) und die Real Time Clock (RTC) mit dem CMOS-RAM untergebracht. Die Steuerelektronik eines oder auch zweier IDE-Controller sind Bestandteil des Chips. Des Weiteren sind noch ein Interface zum BIOS und der Access-Bus-Controller für das System-Management, der für die Kommunikation mit einem Supervisory-Chip (siehe den folgenden Abschnitt) oder auch den EEPROMs auf den DIMMs verwendet werden kann, integriert. Die Schaltungseinheiten für die Stromsparfunktionen (Power Management, SMI) fehlen ebenso wenig wie das Interface zum obligatorischen EEPROM (Serial EEPROM), das die Ressource-Daten für dieses ISA-Plug&Play-Device – den gesamten Super I/O-Controller – enthält.
Sandini Bib 682
Kapitel 19
Abb. 19.22: Dieser Super I/O-Controller (FDC37C93xAPM von SMSC) enthält eine Vielzahl von Schaltungseinheiten zur Komplettierung eines Chipsets.
19.4 Supervisory-Chips Der erste bekannte Baustein für die oben erwähnten Aufgaben zur Überprüfung des »PC-Wohlbefindens« ist der Typ LM78 der Firma National Semiconductor (NS). Der LM78 besitzt integrierte Watchdog-Register, die beim Überschreiten der festgelegten Grenzwerte zwei InterruptAusgänge (SMI, NMI/IRQ) aktivieren können. Als Interfaces zum Chipset ist eines vom Typ ISA und ein serielles Interface vorgesehen. Es besteht aus dem Taktsignal SCL und dem Datensignal SDA, die zusammen als SMB (System Management Bus) bezeichnet werden. Der LM78 verfügt über neun Register sowie über ein 32 Byte großes POST- und ein 64 Byte großes Value-RAM. Das POST-RAM (Power On Self Test) kann die vom BIOS gesendeten POSTCodes speichern, und das Value-RAM enthält die Ergebnisse der einzelnen Überwachungseinheiten sowie die Watchdog-Einstellungen – die festgelegten Grenzwerte. Zur Selektierung des LM78 werden ein Adressregister (typischerweise 295h) und ein Datenregister (typischerweise 296h) verwendet, wobei sich die verwendeten I/O-Ports durchaus von Hersteller zu Hersteller (des jeweiligen Mainboards) unterscheiden können.
Sandini Bib Mainboard-Peripherieeinheiten
683
In Designs mit dem LM78 kommt meist auch ein Temperatursensor vom Typ LM75 zum Einsatz, der sich unter der CPU (im Sockel-Hohlraum) befindet und elektrisch direkt mit dem LM78 verbunden ist. Auf Grund des Abstandes des Temperatursensors von der CPU ist diese Messung jedoch nicht besonders präzise und hängt in ihrer Genauigkeit zudem vom Mainboard-Design und auch von der eingesetzten CPU ab. Im BIOS wird daher eine Tabelle geführt, die für den jeweils verwendeten Prozessor einen Aufschlag zum gemessenen Wert addiert, der keineswegs von Mainboard zu Mainboard identisch ist. Für den Sensor selbst wird ein Messbereich von -55 ºC bis 125 ºC bei einem maximalen Fehler von 3 ºC angegeben. Eine drohende Überhitzung der CPU lässt sich jedoch auch frühzeitig anhand der Lüfterdrehzahl erkennen, wofür der LM78 drei »Tachometer-Eingänge« besitzt. Demnach werden hierfür spezielle Lüfter benötigt, die typischerweise zwei Impulse pro Umdrehung generieren. Zur Überwachung verschiedener Analogspannungen verfügt der LM78 insgesamt über fünf Eingänge für positive und zwei für negative Spannungen. Im einfachsten Fall werden hiermit die Versorgungsspannungen des PC-Netzteils gemessen, die vom LM78 intern mit einem 8-Bit-A/D-Wandler verarbeitet werden. Des Weiteren enthält der LM78 einen Eingang (Chassis Intrusion) für einen Sensor, der das Öffnen des PC-Gehäuses entdecken kann. Allerdings unterstützen diese Möglichkeit nicht alle PC bzw. Mainboards, die über einen LM78 oder einen ähnlichen Baustein verfügen. Ein Problem ist dabei, dass der PC normalerweise im ausgeschalteten Zustand aufgeschraubt wird. Demnach muss der Schalter auch ohne Spannung das Öffnen feststellen können und nach dem Wiedereinschalten des PC diese Information an den LM78 übergeben. Zurzeit gibt es hierfür verschiedene Lösungen wie etwa mechanische Schalter, die jedoch leicht zu manipulieren sind, und optische Sensoren mit integriertem, batteriegepuffertem Speicher. Der LM78 wird üblicherweise mit von der Batterie versorgt, die für das CMOS-RAM verwendet wird. Wie es auch bei den Super I/O-Controllern der Fall ist, gibt es mittlerweile eine Vielzahl von Supervisory-Chips der bekannten Hersteller wie NS, Winbond oder auch SMSC, die im Prinzip jedoch alle auf die anhand des LM78 erläuterte Art und Weise funktionieren. In Abbildung 19.23 ist als Beispiel das Anschlussschema des Typs MON35W42 der Firma SMSC angegeben. Es ist erkennbar, dass er über ein ISA-Bus-Interface verfügt, das aus den Signalen IOR (Pin 1), IOW (Pin 2), D7–D0 (Pin 4–Pin 11) und SA2–SA0 (Pin 45–47) besteht, sowie über die beiden I2C-BusSignale SCL und SDA. Ob ISA- oder I2C-Bus-Adressen mit SAx/IAx (Pin 45–47) verarbeitet werden sollen, entscheidet der Pegel am Anschluss 43 (ADRMSEL), der mit einer Null (über einen 47-kOhm-Widerstand) auf ISA geschaltet wird. Der Baustein ist dann selektiert, wenn der Eingang CS (Chip Select, Pin 48) auf Low gesetzt wird. Dieses Signal wird aus einer Adressendekodierung gewonnen, und üblicherweise kommen dann die Adressen 295h (Index, Adresse) und 296h (Data) für die Kommunikation mit dem Chip zum Einsatz, wie es mit dem LM78 ebenfalls üblich ist. Einen Takt benötigt der MON35W42 auch noch, der in der Regel 24 MHz beträgt, und am Pin 3 (CLKIN) eingespeist wird. Der MON35W42 kann aufgrund eines integrierten 8-Bit-Analog/Digital-Umsetzers verschiedene Spannungen des PC überwachen, und zwar: -5 V (Pin 28), 5 VSB (Pin 29), VBAT (Pin 30), -12 V (Pin 32), +12 V (Pin 32) +5 V (Pin 33) und 3,3 V (Pin 34), VINR0 (Pin 36) und VCOREA (Pin 36). Diese Signale sind üblicherweise mit den entsprechenden Anschlüssen des PC-Netzteils, der Puffer-Batterie (3,3 V an VBAT) und der CPU (an VCOREA) verbunden. Der Eingang 5 VSB ist für die Überprüfung der Stand-By-Spannung eines ATX-Netzteils vorgesehen. Die Eingänge für die negativen Spannungen von -5 V und -12 V werden über Widerstände an den Anschluss VREF (Pin 37) gelegt, um den Pegel an den Supervisory-Chip (max. 4,096 V) entsprechend anpassen zu können.
Sandini Bib 684
Kapitel 19
Abb. 19.23: Das Anschlussschema des Hardware-Monitoring-Chips MON35W42
Des Weiteren ist die Umdrehungszahl der Lüfter mit Hilfe von drei Tachometer-Eingängen (Pins 18–20) zu detektieren, wobei der Anschluss 18 auch als Ausgang (PWMOUT2) einzusetzen ist. Er dient in diesem Fall der Regelung der Lüfterdrehzahl, was sich für möglichst geräuscharme PCs empfiehlt, und ebenfalls mit den anderen PWMOUT-Signalen (Pin 23, Pin 10, Pin 11) praktiziert werden kann. Der Beep-Ausgang (Pin 26) ist explizit für die Ausgabe eines Tonsignals bei der Überschreitung der festgelegten Grenzwerte vorgesehen. Das Ausgangssignal OVT (Over Temperature Shutdown, Pin 42) zeigt an, ob die festgelegten Temperaturen überschritten worden sind. Hiermit können dann verschiedene PC-Aktionen ausgelöst werden, z.B. die Ausgabe eines Alarms und/ oder die Abschaltung bestimmter Mainboard-Einheiten. Die Anforderung eines System Management Interrupts ist zudem mit Hilfe des Signals SMI (Pin 44) möglich. Wie beim LM78 ist auch hier ein spezieller Eingang CASEOPEN (Pin 16) vorhanden, der mit einer Vorrichtung zu verbinden ist, die beim Öffnen des PC-Gehäuses ein geeignetes Signal auslösen kann. Für den direkten Anschluss von Temperatursensoren, die an verschiedenen Stellen eines PC montiert sein können, gibt es die Eingänge VTIN3–VTIN1 (Pins 38–40). Alternativ können hier auch die Temperatursignale verarbeitet werden, die etwa von der temperaturdetektierenden Diode eines Pentium II (daher auch die Bezeichnung PIITDx) stammen. Für Pentium II und kompatible CPUs sind außerdem die VID-Eingänge (Pin 41, Pin 12, Pin 24, Pin 25, Pin 17) ausgelegt, denn hiermit ist die aktuelle CPU-Core-Spannungseinstellung mit in den Registern des MON35W42 abgelegten Werten zu vergleichen. Von diesen Registern gibt es eine ganze Reihe. Abbildung 19.24 soll Ihnen einen Eindruck davon vermitteln.
Sandini Bib Mainboard-Peripherieeinheiten
Abb. 19.24: Eine Übersicht über die Supervisory-Chip-Register aus der Warte des ISA-Bus
685
Sandini Bib 686
Kapitel 19
Zu Mainboards, die mit einem Supervisory-Chip ausgestattet sind, gehört ein entsprechender (Windows-)Treiber und eine mehr oder weniger komfortable Software zur Konfigurierung und Anzeige der einzelnen »Überwachungsdaten«. Üblicherweise können die aktuellen Werte auch im BIOS-Setup eingesehen und die Grenzwerte entsprechend festgelegt werden.
19.5 System Management Bus Der SMBus wird von einem Funktionsblock der Southbridge oder auch eines Super I/O-Controllers gesteuert. Er entspricht in seiner Funktionalität und auch in den wesentlichen elektrischen Eigenschaften dem I2C-Bus von Philips. Der Inter Integrated Circuit Bus wird bereits seit vielen Jahren in Geräten, insbesondere in der Consumer-Elektronik wie bei CD-Playern, Autoradios und der allgemeinen HIFI-Technik verwendet. Der I2C-Bus stellt serielle Verbindungen von integrierten Schaltungen auf einer Platine bzw. innerhalb eines Gerätes her. Statt zahlreicher paralleler Leitungen werden für die Kopplung der Bauelemente lediglich zwei Verbindungen und eine Masseleitung benötigt, was die mögliche Packungsdichte der Bauelemente auf der Platine vergrößert; und da weniger Anschlüsse und Steck- und Lötverbindungen nötig sind, wird auch die Zuverlässigkeit der Geräte erhöht. Der I2C-Bus, der bei der Verwendung im PC eben als System Management Bus bezeichnet wird, ist als reiner Peripherie-Bus anzusehen. Dies deutet bereits auf die Abgrenzung zur zweiten Kategorie von seriellen Bussystemen hin, bei der die Bussysteme mit relativ hohen Datenübertragungsraten (PCI-Express, Hypertransport) arbeiten und prinzipiell die gleichen Einsatzgebiete abdecken können wie die etablierten parallelen Bussysteme, beispielsweise der PCI- oder auch der SCSI-Bus. Erläuterungen zu den erwähnten seriellen Bussystemen finden Sie in Kapitel 22, während es an dieser Stelle allein um den I2C-Bus bzw. den SMB gehen soll, der nicht als PC-Systembus, sondern gewissermaßen nur als »Hilfsbus« auf einem Mainboard zum Einsatz kommt. Eine externe Version des I2C-Bus stellt der Access-Bus dar, der insbesondere für die Kommunikation mit einem Monitor – Plug&Play – zum Einsatz kommt. Darüber hinaus soll er ebenfalls andere Geräte wie eine Maus oder einen Joystick automatisch konfigurieren. Der Access-Bus, der bei den Grafikkarten und Monitoren praktisch unbemerkt seinen Dienst verrichtet, hat sich jedoch bei anderen Produkten nicht merklich auf dem Markt durchsetzen können, und stattdessen wird zumeist der Universal Serial Bus (USB) verwendet.
19.5.1 Funktionsweise Zunächst seien kurz die Unterschiede zwischen dem I2C- und dem System Management Bus erwähnt. Beim SMBus entspricht ein High einer Spannung von mindestens 1,4 V und ein Low einer Spannung von kleiner 0,6 V, während die Pegel beim I2C-Bus von der Versorgungsspannung abhängig sind. Der Pull-Up-Strom darf beim I2C-Bus maximal 3 mA betragen, und beim SMBus sind es lediglich 0,350 mA. Beide Unterschiede sind jedoch nicht gravierend, so dass sich übliche I2C-Bus-Bauelemente auch am SMBus betreiben lassen, wofür bei einigen Mainboards sogar ein Anschluss (Pfostenstecker) zu finden ist. Jedes I2C-Bauelement verfügt über eine eigene Adresse und kann in Abhängigkeit von seiner Funktion als Sender (Transmitter) oder Empfänger (Receiver) arbeiten. Des Weiteren kann ein Bauelement entweder als Master, von denen mehrere am Bus möglich sind (Multimasterbus), oder als Slave arbeiten. So stellen beispielsweise ein Mikroprozessor oder ein Mikrocontroller einen Master und eine LCD-Anzeige einen Slave dar. Im PC befindet sich der Master – der aber
Sandini Bib Mainboard-Peripherieeinheiten
687
auch als Slave fungieren kann – zumeist in der Southbridge, eher seltener ist der SMBus-Controller als eigenständiger Chip ausgeführt. Die räumliche Ausdehnung eines I2C-Bussystems darf nur wenige Meter betragen, was auf einem Mainboard logischerweise keine Probleme bereitet. Die typische maximale Datenübertragungsrate beträgt 100 KBit/s, wobei es aber auch einen I2C-High-Speed-Modus mit 400 KBit/s gibt, der jedoch beim SMBus keine Verwendung findet. Zwei Busleitungen sind für die Datenübertragung zwischen den ICs zuständig: eine Datenleitung (SDA, Serial Data Line) und eine Taktleitung (SCL, Serial Clock Line). Innerhalb der ICs befinden sich Transistoren mit Open-Collector- oder mit Open-Drain-Ausgängen, wodurch sich eine Wired-AND-Verknüpfung aller Busteilnehmer ergibt. Die SMBus-Spezifikation definiert zusätzlich zwei (optionale) Signale, und zwar SMBSUS und SMBALERT. Falls sich der PC in einen Stromsparmodus begibt, informiert er die SMBus-Einheiten hierüber mit SMBSUS, und über SMBALERT kann eine Einheit von sich aus den Host darüber informieren, dass sie Daten senden möchte. Nach dem Absetzen einer Bestätigung durch den Host (SMB Alert Response), findet daraufhin eine übliche I2C-Datenübertragung statt. Die beiden Datenbussignale werden über Pull-Up-Widerstände mit der positiven Versorgungsspannung verbunden. Die Generierung des Taktsignals wird stets von einem Master-IC vorgenommen. Dabei erzeugt jeder Master sein eigenes Taktsignal, sobald er für die Datenübertragung verantwortlich ist. Mit den AND-Verknüpfungen über die SCL-Leitung findet eine synchronisierte Kombination der einzelnen Taktsignale statt, wodurch Teilnehmer mit unterschiedlichen Taktraten am Bus verwendet werden können und die Erlangung der Buszugriffsrechte (Arbitration) durchgeführt wird.
Abb. 19.25: Über die Innenschaltung der Busteilnehmer findet eine Wired-AND-Verknüpfung statt.
Greifen ein oder mehrere Master auf den Bus zu, generiert der erste eine »1«, die vom zweiten mit einer »0« wieder überschrieben werden kann, damit er den Buszugriff erlangt. Für die Datenübertragung gilt grundsätzlich: Eine »0« ist das bestimmende Bussignal, das eine »1« überschreibt, und eine »0« kann nicht überschrieben werden. In Abbildung 19.26 ist gezeigt, wie die Taktsignale zweier Bauelemente (CLK1, CLK2) in einem einzigen SCL-Signal resultieren. Die Dauer der logischen 1 wird dabei immer vom schnellsten Bauelement bestimmt. Während derjenigen Zeit, die ein Teilnehmer für eine interne Operation benötigt, setzt er sein Taktsignal auf »1« und sorgt somit für das Einfügen von Wartezyklen.
Sandini Bib 688
Kapitel 19
Abb. 19.26: Durch die Wired-AND-Verknüpfung der einzelnen Taktsignale (CLK 1, CLK2) können Einheiten mit unterschiedlicher Taktrate miteinander kommunizieren.
Findet keine Busaktivität statt, befinden sich SDA und SCL auf High-Potenzial. Die Datenübertragung beginnt mit dem Übergang des Datensignals (SDA) von High nach Low, während SCL auf High verbleibt, was als Start Condition bezeichnet wird. Die daraufhin übertragenen Daten sind nur dann gültig, wenn sich SCL auf High befindet. Mit jedem Taktimpuls wird ein Bit übertragen, und das Ende der Datenübertragung (Stop Condition) ist durch einen Low-High-Übergang des Datensignals gekennzeichnet, wobei SCL wieder einen High-Pegel aufweist.
Abb. 19.27: Die Datenübertragung beginnt mit einer Start- und endet mit einer Stoppbedingung. Die ansteigenden Flanken des SDA- und des SCL-Signals betragen maximal 1µs, die abfallenden hingegen 300 ns.
Nach der Startbedingung (Start Condition) folgt eine 7 Bit lange Slave-Adresse. Das MSB wird sowohl bei der Adresse als auch bei den Daten immer zuerst übertragen. Mit dem folgenden R/W-Bit wird die Datenübertragungsrichtung festgelegt, wobei jede Datenübertragung mit Acknowledge bestätigt wird. Der Master setzt hierfür die SDA-Leitung auf High und erwartet vom Slave, dass er nach der Datenübertragung das SDA-Signal auf Low zieht. Geschieht dies nicht, bricht der Master die Übertragung ab (Stop Condition). Ist ein Master hingegen der Datenempfänger, belässt der Slave das SDA-Signal auf High, setzt es selbst zurück und führt die Stop Condition durch.
Abb. 19.28: Datenformat für Lese- und Schreiboperationen
Sandini Bib Mainboard-Peripherieeinheiten
689
Als Datentelegramm ist ebenfalls eine Kombination aus Lese- und Schreibzugriffen möglich. Nach der ersten Stop Condition folgt dann unmittelbar ein zweites Telegramm, das ebenfalls dem Aufbau aus Abbildung 19.28 entspricht. Zur Erkennung von Übertragungsfehlern existieren keine speziellen Vorkehrungen, wie etwa Parität oder Prüfsumme. Dies muss allein durch die Software realisiert werden. In den meisten Fällen werden durch Tiefpassfilter lediglich hochfrequente Störungen auf der SDA- und der SDC-Leitung unterdrückt.
19.5.2 Adressen In den meisten Fällen verfügt jedes Bauelement am I2C-Bus über eine vom Hersteller fest vergebene Adresse. Bei einigen Bauelementen, die mehrfach in einem Gerät vorkommen können, wie beispielsweise Analog/Digital-Wandler, können die niedrigstwertigen Adressbits jedoch durch eine äußere Beschaltung verändert werden, weil jedes Bauelement am Bus nun einmal über eine eigene Adresse verfügen muss. (Slave)-Adresse
Bezeichnung
Bedeutung/Funktion
000 0000 000 0001 000 0010 000 0011
Special Function CBUS Address Reserved Special Function
0000 1xx 1111 1xx 1111 0xx
Reserved Reserved Special Function
General Call Address Für CBUS-ICs Reserviert für andere Busformate Reset und Schreiben der aus Hard- und Software zusammengesetzten Slave-Adresse Reserviert Reserviert 10-Bit-Slave-Adressierung
Tab. 19.3: Reservierte I2C-Bus-Adressen
Einige Adressen sind für spezielle Aufgaben vorgesehen, die in Tabelle 19.3 erläutert sind und nicht als Chip-Adressen verwendet werden dürfen. Durch die General Call Address werden gleichzeitig alle Slaves angesprochen, die, falls sie diese Funktion unterstützen, mit einem Acknowledge antworten. Die anderen ICs können diese Adresse einfach ignorieren. Der General Call Address folgt ein zweites Byte, das die eigentliche Aktion festlegt.
Abb. 19.29: Entspricht das erste Byte der »General Call Address« (00000000), legt ein zweites Byte die darauf folgende Aktion fest.
Das LSB (B) des zweiten Bytes hat noch eine besondere Bedeutung. Enthält es eine 0, gelten die in Tabelle 19.3 angegebenen Funktionen; enthält es hingegen eine 1, stellt dies einen Hardware General Call dar. Diese Funktion wird für die Adressierung von Chips verwendet, die nicht das I2C-Bus-Format unterstützen, sowie für die Festlegung einer programmierbaren Busadresse. Intel bzw. die SMBus-Spezifikation erweitert die reservierten Adressen um weitere, die in Tabelle 19.4 angegeben sind. Dabei fällt auf, dass insbesondere Notebooks einen regen Gebrauch vom SMBus machen, weil für die hier benötigten Controller eine ganze Reihe von Adressen reserviert sind, etwa für das Laden des Akkus (Smart Battery), für die Konfigurierung des PCMCIA-Socket-Controllers oder auch für die Steuerung des Displays (Graphics LCD, CCFL). Daneben sind auch die bevorzugten Adressen zu finden, wie sie für die SPD-EEPROMs oder den Taktgenerator (Clock Generator) empfohlen werden.
Sandini Bib 690
Kapitel 19
Adresse
Funktion
000 1000 000 1001 000 1010 000 1011 000 1100 010 1000 010 1100 010 1101 011 0111 100 00xx 100 0100 100 10xx 100 1110 101 00xx 110 0001
SMB Host Smart Battery Charger Smart Battery Selector Smart Battery SMB Alert Response Access Bus Host LCD Contrast Controller CCFL Backlight Controller, Supervisory-Chip Access Bus Host Default Address PCMCIA Socket Controller Graphics Controller Prototyping I2C-Multiplexer DIMM-EPROMs SMB Device Default Address, Clock Generator
Tab. 19.4: Reservierte Adressen des SMBus-Standards
19.5.3 Programmierung Der SMBus hat im Wesentlichen die folgenden Aufgaben, die vom PC-BIOS softwaretechnisch unterstützt werden:
: : :
Kommunikation mit Supervisory- oder System-Health-Chips, die mit Hilfe von Sensoren die Temperatur der CPU und weitere Parameter überwachen. Lesen der Daten der seriellen EEPROMs (SPD-EEPROM), die sich auf den Speichermodulen befinden, um dem BIOS die jeweiligen Chip-Parameter für die automatische Konfigurierung mitzuteilen. Kommunikation mit dem Taktgenerator auf dem Mainboard, der für die Festlegung des System-, der Speicher- und der Bustakte zuständig ist.
Zunächst ist nur das Lesen von Daten aus den jeweiligen Chips vorgesehen, wobei das BIOS es möglicherweise auch erlaubt, die Takte im Setup manuell festzulegen oder Grenzwerte für bestimmte PC-Überwachungsparameter im Supervisory-Chip bestimmen zu können. In diesen Fällen ist auch das Schreiben von Daten über den SMB zu den Chips hin möglich. Die SPDEEPROMs sind jedoch üblicherweise als schreibgeschützt »verdrahtet«, so dass hier keine Manipulationen an den Speicherparametern möglich sind. Auch wenn das BIOS (scheinbar) keine Schreibfunktionalität für den SMB aufweist, ist es dennoch möglich, mit bestimmten »Tuning-Tools« etwa auf den Takt-Chip zuzugreifen, um beispielsweise den Systemtakt (unzulässigerweise) zu erhöhen. Derartige Programme arbeiten ausschließlich unter Windows (und ggfs. auch Linux), also unter einem Betriebssystem, das selbst eine SMB-Unterstützung mitbringt. Hierfür gibt es eine ausführliche Spezifikation (SMBus Control Method Interface Specification), die zumindest bei Windows mit unter den ACPI-Funktionen (Advanced Configuration and Power Interface) firmiert. In Kapitel 16.3 wird anhand eines Beispiels gezeigt, wie man über den SMBus die Daten der SPD-EEPROMs auslesen kann. Die Schwierigkeit ist dabei festzustellen, wo sich die Adressen (zumindest die Basisadresse) des SMBBus-Controllers befinden, denn dies ist keineswegs standardisiert. Bei der Intel Southbridge PIIX4 findet man den Zugang zum SMBus-Controller im
Sandini Bib Mainboard-Peripherieeinheiten
691
I/O-Space beispielsweise über den Offset 0x7000h. Unter Windows, wo die entsprechenden Chipset-Treiber (ACPI) installiert sind, ist die Sachlage hingegen klar, denn man setzt hier programmtechnisch auf diese Treiber auf, was hier aber nicht Gegenstand der weiteren Betrachtungen sein soll. Falls man die Basisadresse (s.u.) in Erfahrung gebracht hat, kann man von einer Organisation der SMBus-Register, wie sie in der Tabelle 19.5 für den PIIX4 angegeben sind, ausgehen. I/O-Offset
Register
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh
SMBus Host Status SMBus Slave Status SMBus Host Control SMBus Host Command SMBus Host Address SMBus Host Data 0 SMBus Host Data 1 SMBus Block Data SMBus Slave Control SMBus Slave Shadow Command SMBus Slave Event SMBus Slave Data
Tab. 19.5: Register des System Management Bus
Der in Kapitel 19.4 erwähnte Supervisory-Chip LM78 wird in der Regel über das Adressregister unter der Adresse 295h und über das Datenregister unter der Adresse 296h angesprochen. Unter dieser Voraussetzung lassen sich Informationen über den SMBus zutage fördern und die Chips ansprechen, z.B. mit folgendem Programm. Smbus.c #include #include #include #include
<stdio.h> <dos.h> "smbus.h"
#define LM78ADR 0x295 #define LM78DATA LM78ADR+1 #define LM75SMB 0x49 static int check_SMBus() { unsigned char m_ah; asm { mov ax, 53B0h mov bh, 01h mov bl, 72h mov ch, 61h mov cl, 64h int 15h mov [m_ah], ah jc command_failed cmp ch, 'i' jnc install_check_fail cmp cl, 'A' jnc install_check_fail } (void) printf ("Succeed - proceed\n"); return 0; install_check_fail: (void) printf ("Install check Fail\n"); return 1;
Sandini Bib 692
Kapitel 19
command_failed: if (m_ah == 0x0A) (void) printf ("SMBus invalid signature\n"); else if (m_ah == 0x86) (void) printf ("SMBus not supported\n"); else (void) printf ("Command failed\n"); return -1; } static int real_mode_connect () { word smb_off = 0; word smb_seg = 0; asm { mov ax, 53B0h mov bh, 02h mov ch, 'i' mov cl, 'A' int 15h jc command_failed mov smb_off, bx mov smb_seg, ax } return 0; command_failed: return -1; } static int SMBus_Disconnect (word smb_off) { asm { mov ax, 53B0h mov bh, 05h mov ch, 'i' mov cl, 'A' /*call far [smb_off]*/ jc command_failed } return 0; command_failed: return -1; } static int SMBus_Device_Address () { unsigned char count=0; unsigned char m_bh, m_bl; (void) printf ("Get a list of the SMBus devices present\n"); loopl: asm { mov mov mov mov mov int jc mov mov }
ax, 53B0h bh, 06h bl, [count] ch, 'i' cl, 'A' 15h error_or_maybe_no_more_device [m_bh], bh [m_bl], bl
(void) printf ("No %02X. Address %02X\n", (int)m_bh, (int)m_bl);
Sandini Bib Mainboard-Peripherieeinheiten
693
asm { mov bl, [count] inc bl mov [count], bl jmp loopl } error_or_maybe_no_more_device: return 0; } main (int argc, char *argv[]) { clrscr(); (void) printf ("Program Read SMBus ...\n"); (void) printf ("SMBus Installation Check - "); if (check_SMBus () == 0) { if (real_mode_connect () != 0) { (void) printf ("Real Mode Connect Error\n"); exit (1); } SMBus_Device_Address (); SMBus_Disconnect (0); } (void) getch (); return 0; } ) Smbus.h #include <dos.h> #include #include <stdio.h> #define TRUE #define FALSE
1 0
typedef unsigned char byte; typedef unsigned short word; typedef unsigned long dword;
/* 8-bit */ /* 16-bit */ /* 32-bit */
#define CARRY_FLAG 0x01
Die SMBus-Basisadresse bzw. die SMBus-Kennung ist, wie es dem Listing zu entnehmen ist, aber auch hier Chipset-abhängig (PIIX4). Wenn Sie sich das Kapitel 22.7 über den PCI-Configuration Space sowie über die Software-Routinen für die Kommunikation (Kapitel 22.10) näher ansehen, könnten Sie auf die nahe liegende Idee kommen, ohne die Kenntnis der Device- und der VendorID den SMBus-Controller mithilfe der Classcodes (Basis: 0ch, Sub: 05h) selektieren zu können. Prinzipiell ist dies auch richtig, allerdings funktioniert dies nicht immer, wenn sich der SMBusController in der Southbridge befindet, wie es eben meist der Fall ist. Diese wird dann zwar mit den unterschiedlichen Einheiten unter Preisgabe der Adressen detektiert, jedoch nicht zwangsläufig auch der SMBus-Controller. Dies funktioniert nur dann einwandfrei, wenn der SMBusController gewissermaßen als eigenständige Einheit ausgeführt ist oder die jeweilige Southbridge den Controller so ausweist, als wenn er dies wäre. Aus diesen Gründen erscheint es praktikabler, SMBus-Anwendungen, wenn man diese möglichst universell einsetzbar gestalten will, unter Windows zu programmieren.
Sandini Bib
Sandini Bib
Teil 4: Personal Computer-Architekturen und -Bussysteme Ein ganz wesentliches – und für den enormen Erfolg gerade der IBM-kompatiblen Personal Computer entscheidendes – Merkmal sind die sehr flexiblen Bussysteme mit einem Erweiterungsbus. Erst dies macht die einfache Installation einer Vielzahl von LAN-, Grafik- und anderen Adaptern möglich. Teil 4 ist aus diesem Grund dem Aufbau und der Struktur (also der Architektur) der verschiedenen »Klassen« von Personal Computern und den zugehörigen Bussystemen gewidmet.
20
Bussysteme im PC
Es ist klar, dass sich mit den PCs auch die verwendeten Bussysteme verändert haben. Der PC/XT war der erste IBM Personal Computer. Seine 8-Bit-Architektur ist mittlerweile völlig überholt, dennoch bestimmen die ursprünglich eingesetzten Komponenten aus der PC/XT-Zeit die logische Struktur und auch das Verhalten selbst des modernsten Chipsatzes. Für die Verbindung der PC-Einsteckkarten mit der Mainboard-Elektronik sind je nach PC-Typ verschiedene Steckplätze (Slots) auf dem Mainboard vorgesehen, die die Signale des jeweiligen Bussystems führen. Mit dem ursprünglichen Original-PC der Firma IBM wurde der 8 Bit breite PCBus eingeführt, der später um Signale für den 16-Bit-Betrieb erweitert wurde und seitdem unter der Bezeichnung ISA-Bus (Industry Standard Architecture) firmiert. Entgegen dieser Bezeichnung erfolgte eine tatsächliche Standardisierung erst im Jahre 1990 (IEEE-P996), was als später Schritt verstanden werden muss, denn bis zu diesen Zeitpunkt war das Bus-Timing nie klar definiert worden, was dazu führte, dass eine Reihe von Einsteckkarten überhaupt nicht – oder nur mit Einbußen in der Leistung – in bestimmten PCs funktionierten. Im Gegensatz zu den industriellen Systemen (z.B. VMEBus, Compact PCI), die in der Regel 96polige Steckverbinder zur Busankopplung verwenden, wird die Verbindung zwischen der Karte und dem PC-Slot über Platinenkontakte der Karte hergestellt. Speziell für den rauen industriellen Einsatz werden PCs auch in Rack-Bauweise realisiert und mit mechanisch stabilen und kontaktzuverlässigeren ISO-Steckverbindungen ausgestattet, was hier jedoch nicht weiter von Belang sein soll. ISA-Slots werden auf aktuellen PC-Mainboards schon gar nicht mehr eingebaut, und allein PCI stellt heutzutage das Standard-Bussystem in PCs dar. Gleichwohl haben ISA-Karten andere fortschrittlichere Systeme wie EISA (Extended Industry Standard Architecture), den Microchannel (MCA, Micro Channel Architecture) oder auch den VLB (VESA Local Bus) gewissermaßen überlebt, denn PCs mit ISA-Slots sind noch in einer großen Anzahl im Einsatz. Aus diesem Grunde wird auf ISA im folgenden Kapitel noch gesondert eingegangen, während die bereits seit einiger Zeit vom Markt verschwundenen anderen Bussysteme in diesem Kapitel nur noch in einem kurzen Abriss behandelt werden. In Tabelle 20.1 sind zunächst
Sandini Bib 696
Kapitel 20
die wesentlichen Merkmale der PC-üblichen Bussysteme angegeben. Für EISA und MCA existieren darüber hinaus noch erweiterte Spezifikationen, die hier aber unberücksichtigt bleiben, da sie sich kaum in entsprechenden PCs wiederfinden. Bussystem
PC
ISA
VLB
MCA
EISA
PCI
Protokoll CPUs typischer Takt in MHz Multimaster-fähigkeit Datenbusbreite Adressraum Transferrate in MByte/s
synchron ab 8088 4,7 nein 8 Bit 1 MByte 1
synchron ab 286 8 nein 16 Bit 16 MByte 4–5
synchron ab 386 25–50 ja (Vers. 2) 32/64 Bit 4 GByte 40/64 (Burst)
asynchr. ab 386 10–25 ja 32 Bit 4 GByte 40 (Burst)
synchron ab 386 8,33 ja 32 Bit 4 GByte 33 (Burst)
synchron ab 486 25–33 ja 32 Bit 4 GByte 132 (Burst)
Tab. 20.1: Die wichtigsten Daten der verschiedenen PC-Bussysteme in der Übersicht
Der PCI-Bus, der meist als 32-Bit-Version implementiert ist, stellt sich bei einigen Hardware-Einheiten wie Ultra 160 SCSI oder auch Gigabit-Ethernet-Karten bereits als Nadelöhr für die Datenübertragung dar, so dass es hierfür entsprechende Weiterentwicklungen wie 64-Bit-PCI oder auch PCI-X gibt, die in Kapitel 22 erläutert werden, wo auch die als PCI-Nachfolger gedachten Varianten aufgeführt sind. Der Accelerated Graphics Port (AGP) ist im Grunde genommen keines dieser universellen Bussysteme, sondern allein für die Aufnahme einer AGP-Grafikkarte vorgesehen. Auf Mainboards existiert immer nur ein einziger AGP-Slot. Was es damit auf sich hat, wird in Kapitel 23 näher erläutert. Bei einigen Mainboards befindet sich neben den PCI-Slots und dem AGP-Slot noch ein weiterer, der einem von drei so genannten Riser-Standards (AMR, CNR, ACR, siehe Kapitel 24) gehorcht. Obwohl sich diese Realisierungen (bisher zumindest) nicht durchgesetzt haben, lohnt es sich dennoch, sie kurz zu behandeln, damit abzuschätzen ist, was man hiervon zu erwarten hat. Bei Notebooks kann es schon aus Platzgründen keine der bisher genannten Bussysteme mit Slots für übliche Einsteckkarten geben. Stattdessen sind hier PCMCIA- oder der Card-Bus zu finden, die sich leistungstechnisch gesehen zu ISA bzw. PCI als ebenbürtig erweisen. In Kapitel 31 sind hierzu die entsprechenden Erläuterungen zu finden. Wer bei dieser kurzen Übersicht über den Teil 4 dieses Buches den Universal Serial Bus und Firewire (IEEE 1394) vermisst, wird in Teil 6 fündig, da diese beiden Systeme primär für die Anbindung externer Peripherie vorgesehen sind. SCSI wird in Teil 5 behandelt.
20.1 Die 8-Bit-Architektur – PC-Bus Zunächst möchte ich darauf hinweisen, dass im Folgenden von einem PC, XT und auch von einem AT die Rede sein wird, was die klassische Art zur Kennzeichnung der Unterschiede bei den PC-Architekturen darstellt. Heutzutage wird allerdings ausschließlich von einem PC zur Abgrenzung gegenüber anderen Architekturen (Apple Macintosh, Power PC, Sun Workstations etc.) gesprochen, die eben nicht auf einem PC-Design, wie es ursprünglich von IBM definiert wurde, basieren.
Sandini Bib Bussysteme im PC
697
Steuerbus Adreßbus
Busslots
8086 8088
Datenpuffer
Multiplexer
Steuerlogik
Datenpuffer
Paritätslogik
8237
Adreßpuffer
RAM AdreßLatch
8288
I/ODekodierlogik
PageRegister Datenpuffer
lokaler Bus
8087
Adreßpuffer
NMILogik Adreßpuffer
8284
14,31818MHz
Daten- bus
8255
DIP
Konfiguration
Lautsprecher Cass.Recorder
8253
TastaturSchnittst.
8259A
WaitState
ROM
Abb. 20.1: Die Architektur des PC/XT
In Abbildung 20.1 sehen Sie das Blockdiagramm eines PC/XT. Zentraler Bestandteil ist – wie könnte es anders sein – der Prozessor. Im PC finden Sie einen 8088, im XT einen 8086. Zusätzlich zum 8086/88 kann ein mathematischer Coprozessor 8087 eingebaut sein, zumindest ist aber ein Sockel für ihn auf dem PC-Mainboard vorhanden. Für den Systemtakt sorgt ein Taktgenerator 8284, der im Ur-PC mit einem Signal von 14.318.180 Hz versorgt wird. Er teilt diese Frequenz durch drei, um den effektiven Systemtakt von 4,77 MHz zu erzeugen. Einen wesentlichen Bestandteil des Computers bildet der Hauptspeicher (RAM). Der Prozessor ist mit ihm über einen Daten-, einen Adress- und einen Steuerbus verbunden. Die CPU adressiert den Speicher durch den Adressbus, steuert die Datenübertragung durch den Steuerbus und überträgt die Daten über den Datenbus. Die notwendigen Steuersignale werden dabei nach Anweisung vom 8086/88 vom Buscontroller 8288 erzeugt. Um den Datenaustausch möglichst störungsfrei und geordnet zu gestalten, werden die Signale in verschiedenen Adress- und Datenpuffern zwischengespeichert und verstärkt. Im PC/XT unterscheidet man vier verschiedene Adress- und Datenbusse:
:
:
Lokaler Bus: Der lokale Adressbus umfasst die 20 Adresssignale vom 8086/88. Externe Adresspuffer und Adress-Latches trennen den lokalen Bus vom Systemadressbus ab. Der lokale Datenbus umfasst die 16 bzw. 8 Datensignale vom 8086/88. Zusätzlich ist eine Buslogik notwendig, die Byte- und Wortzugriffe unterscheidet. Externe Datenpuffer und Daten-Latches trennen den lokalen Bus vom Systemadressbus ab. Im PC ist er acht Bit, im XT 16Bit breit. Systembus: Er ist der wesentliche PC/XT-Adressbus und stellt die gelatchte Version des lokalen Adressbus dar. Das Signal zur Verriegelung der Adresssignale auf dem lokalen Adressbus in den Latches für den Systemadressbus ist das Signal ALE. Der Systemadressbus wird beim PC/XT in die Busslots herausgeführt. Der dazugehörige Datenbus stellt die gelatchte Version des lokalen Datenbus des PC/XT dar und ist im PC acht Bit, im XT dagegen 16 Bit breit. Ein Byte des Systemdatenbus wird beim PC/XT in die Busslots herausgeführt.
Sandini Bib 698
:
:
Kapitel 20
Speicherbus: Der Speicheradressbus ist nur auf dem Mainboard vorhanden und stellt die gemultiplexte Version des Systemadressbus dar; über ihn werden nacheinander die Zeilenund Spaltenadressen an die DRAM-Chips übergeben. Der Speicherdatenbus stellt die Verbindung zwischen dem Hauptspeicher und dem Systemdatenbus her. Im PC ist er acht Bit, im XT 16 Bit breit. X-Bus: Er ist über Puffer und Treiber vom Systembus abgetrennt und dient der Kommunikation mit I/O-Einheiten und dem ROM-BIOS auf dem Mainboard, wie z.B. mit den Registern des Interrupt- oder eines On-Board-Diskettenlaufwerks-Controllers. I/O-Ports und ZusatzBIOS auf Erweiterungskarten werden hingegen über den Systembus angesprochen.
Der Unterschied zwischen dem 8086 und dem 8088 besteht im Wesentlichen in der Breite des Datenbus. Besitzt der 8086 einen 16-Bit-Datenbus, so weist der 8088 nur einen acht Bit breiten Datenbus auf. Im PC ist also der Datenbus auf dem Mainboard für den Zugriff auf den Hauptspeicher nur acht Bits, beim XT dagegen 16 Bit breit. In die Busslots münden die wichtigsten Signale des Systembus, wie z.B. die Adress-, Daten- und bestimmte Steuersignale, die notwendig sind, um die Steckkarten in das PC-System integrieren zu können. Der PC/XT besitzt ein ROM, in dem Code und Daten für den Boot-Vorgang und die BIOS-Routinen des PC gespeichert sind. Der 8086/88 spricht das BIOS im ROM in gleicher Weise wie den Hauptspeicher an. Etwaige Wartezyklen beim Zugriff der CPU auf Hauptspeicher, ROM oder den I/O-Adressbereich werden von der Wait-State-Logik erzeugt. Zur Unterstützung von CPU und Peripheriegeräten befindet sich im PC/XT ein programmierbarer Interrupt-Controller 8259A. Er verwaltet externe Hardware-Interrupts von Peripherieeinheiten wie z.B. dem Festplattencontroller oder dem Timer-Chip. Der 8259A besitzt acht Eingangskanäle, die jeweils mit einem Baustein verbunden sind, der einen Interrupt auslösen kann. Sie werden im PC mit IRQ0 bis IRQ7 bezeichnet. In Tabelle 20.2 finden Sie die Zuordnung von Interrupt-Kanal IRQx und Peripheriegerät bzw. Support-Chip. Kanal
Interrupt
Verwendung
NMI IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7
02h 08h 09h 0ah 0bh 0ch 0dh 0eh 0fh
Parität, 8087-Fehler Kanal 0 des Timers 8253 Tastatur reserviert COM2 COM1 Festplattencontroller Diskettencontroller LPT1
Tab. 20.2: Hardware-Interrupt-Kanäle
Außer dem PIC ist ein weiterer Support-Chip vorhanden, nämlich der programmierbare Intervall-Timer (PIT) 8253 oder kurz Timer-Chip. Er weist insgesamt drei individuell programmierbare Zähler auf (siehe Tabelle 20.3). Der Zähler 0 wird im PC/XT zum periodischen Nachstellen der internen Systemuhr benutzt und ist mit IRQ0 des PIC verbunden. Der so ausgelöste Hardware-Interrupt stellt die interne Uhr nach, die Sie über die DOS-Befehle TIME und DATE abfragen können. Der Zähler 1 führt zusammen mit dem DMA-Chip die Speicherauffrischung aus, und der Zähler 2 erzeugt eine Tonfrequenz für den Lautsprecher.
Sandini Bib Bussysteme im PC
Kanal 0 1 2
699
Verwendung interne Systemuhr (IRQ0) Speicherauffrischung Frequenz für Lautsprecher
Tab. 20.3: Timer-Kanäle im PC/XT
Die Tastatur ist über ein programmierbares Peripherie-Interface (PPI) 8255 mit dem Systembus des PC/XT verbunden. Über denselben Baustein kann das BIOS beim Booten auch die Systemkonfiguration abfragen, die durch die DIP-Schalter eingestellt worden ist. Eine Echtzeituhr mit einem CMOS-RAM, in dem alle Konfigurationsdaten gespeichert sind, war damals noch nicht eingebaut. Am PPI hängen außerdem noch der Lautsprecher und die Kassettenlogik zur Ansteuerung eines Kassettenlaufwerks. Versorgt wird der gesamte PC durch ein Netzteil, das Spannungen von -12 V, -5 V, 0 V, +5 V und +12 V liefert. Als Hardware-Komponenten werden die Support-Chips über Ports im I/O-Adressbereich angesprochen. Der PC/XT verwendet also eine I/O-Mapped-Ein-/Ausgabe (auch als I/O-Mapped I/O bezeichnet). In Tabelle 20.4 finden Sie die Port-Adressen der wichtigsten Hardware-Bausteine im PC/XT. Port-Adresse
Verwendung
000h–00fh 020h–021h 040h–043h 060h–063h 080h–083h 0a0h–0afh 0c0h–0cfh 0e0h–0efh 100h–1ffh 200h–20fh 210h–217h 220h–24fh 278h–27fh 2f0h–2f7h 2f8h–2ffh 300h–31fh 320h–32fh 378h–37fh 380h–38fh 3a0h–3afh 3b0h–3bfh 3c0h–3cfh 3d0h–3dfh 3e0h–3e7h 3f0h–3f7h 3f8h–3ffh
DMA-Chip 8237A PIC 8259A PIT 8253 PPI 8255 DMA-Seitenregister NMI-Maskierungsregister reserviert reserviert nicht benutzt Spieleadapter Erweiterungseinheit reserviert Paralleldrucker (LPT) reserviert COM2 Prototypkarte Festplattencontroller parallele Schnittstelle (LPT) SDLC-Adapter reserviert Monochromadapter/parallele Schnittstelle (LPT) EGA Farb-/Grafikadapter reserviert Diskettencontroller COM1
Tab. 20.4: Port-Adressen im PC/XT
Sandini Bib 700
Kapitel 20
Neben dem Prozessor gibt es einen weiteren Chip, der Speicher- und I/O-Zugriffe ausführen kann, den DMA-Chip 8237A. Er dient zur schnellen Übertragung von Daten zwischen dem Hauptspeicher und den I/O-Einheiten wie z.B. dem Diskettencontroller. Im Gegensatz zum 8086/88 kann der 8237A aber keinerlei Daten verarbeiten, sondern nur übertragen, das aber mit (relativ) hoher Geschwindigkeit. Der 8237A weist vier getrennt programmierbare Übertragungskanäle auf, deren Verwendung im PC/XT in Tabelle 20.5 ausgeführt ist. Kanal
Verwendung
0 1 2 3
Speicherauffrischung SDLC-Adapter Diskettencontroller Festplattencontroller
Tab. 20.5: DMA-Kanäle im PC/XT
Kanal 0 ist zur Speicherauffrischung reserviert. Er wird vom PIT 8253A periodisch aktiviert, um einen Blindzugriff auf den Speicher auszuführen und diesen auf diese Weise aufzufrischen. Im AT enthält das Page-Register für Kanal 4 – der nur zur Kaskadierung dient – die Page-Adresse für die Speicherauffrischung. Die restlichen drei Kanäle stehen zur Datenübertragung zur Verfügung. Hat z.B. der Festplattencontroller einen Sektor eingelesen, so aktiviert er Kanal 3 des 8237A und überlässt ihm ohne Einwirkung der CPU die Datenübertragung. Der 8237A stellt also neben der CPU 8086/88 einen weiteren und von ihr unabhängigen Chip zur Ausführung von Buszyklen dar. Neben der CPU stellt der DMA-Chip den zweiten Baustein dar, der selbstständig Buszyklen ausführen kann. Er ist also ein so genannter Busmaster – wenn auch mit etwas eingeschränkter Funktion. Der PC besitzt durch den 8088-Prozessor nur einen 8-Bit-Datenbus und einen 20-Bit-Adressbus. Für den PC ist dadurch für jeden Kanal ein DMA-Page-Register mit einer Breite von nur 4 Bits erforderlich, deren I/O-Adressen Sie in Tabelle 20.6 finden. (Die acht Adressbits vom 8237A plus acht Adressbits vom DMA-Adress-Latch plus vier Bits vom Page-Register ergeben somit eine 20-Bit-Adresse für den PC/XT-Adressraum.) Durch den 8-Bit-Datenbus des PC sind nur 8-BitDMA-Kanäle möglich. Bei einem Lesetransfer gibt der 8237A die Speicheradresse aus und aktiviert das Signal MEMR, um ein Datenbyte aus dem Speicher auf dem 8-Bit-Datenbus auszulesen. Anschließend aktiviert er das Signal IOW, damit die Peripherieeinheit das Datenbyte übernehmen kann. Ein Schreibtransfer findet genau umgekehrt statt: Der 8237A gibt die Speicheradresse aus und aktiviert das Signal IOR, um ein Datenbyte aus dem I/O-Register der Peripherieeinheit auf dem 8-Bit-Datenbus auszulesen. Anschließend aktiviert er das Signal MEMW, damit der Speicher das Datenbyte übernehmen kann. Im PC/XT ist den beiden Kanälen 0 und 1 physikalisch dasselbe Page-Register zugeordnet, daher wird also über die zwei verschiedenen I/O-Adressen 87h und 83h auf dasselbe physikalische Register zugegriffen. Dadurch ist ein Speicher-SpeicherTransfer nur innerhalb einer DMA-Page von 64 KByte möglich, weil nur die Kanäle 0 und 1 eine solche Übertragung ausführen könnten und sich im PC/XT ein Register teilen müssen. Port
Page-Register
87h 83h 81h 82h
Kanal 0 Kanal 1 Kanal 2 Kanal 3
Tab. 20.6: I/O-Adressen der PC/XT-Page-Register
Sandini Bib Bussysteme im PC
701
Diese Erläuterungen zur grundsätzlichen Funktionsweise eines PC/XT sollten ausreichen, und weiterführende Informationen zum AT, der mit seiner Architektur auch den (doch recht langlebigen) ISA-Bus begründet hat, finden Sie in Kapitel 21.
20.2 32-Bit-Architekturen – EISA und MCA Mit dem IBM-AT wurde die 16-Bit-Architektur mit dem ISA-Bus eingeführt, und es ist erstaunlich, dass ISA-Bus-Slots über einen langen Zeitraum weiterhin auf Mainboards eingebaut worden sind, denn bereits für einen 386-PC erscheint ein 16-Bit-Bus-System für Einsteckkarten eigentlich schon nicht mehr ausreichend. Aus diesem Grunde sind in der Zeit vor PCI (siehe Kapitel 22) zwei unterschiedliche 32-Bit-Systeme mit den Bezeichnungen EISA und MCA angetreten, um den ISA-Bus abzulösen. Um es gleich vorwegzunehmen: Beide Systeme haben es nicht geschafft, den ISA-Bus vom Markt zu verdrängen. Dies ist erst PCI gelungen. Gleichwohl haben diese beiden 32-Bit-Architekturen einen maßgeblichen Einfluss auf die PCI-Bus-Architektur und ganz allgemein auf die PC-Technik gehabt. Die folgenden Erläuterungen beschreiben daher kurz die wesentlichen Details von EISA und MCA, auch wenn diese Systeme nur noch historischen Wert haben. Neben den Einschränkungen des ISA-Bus, der ja nur für eine Datenbusbreite von 16 Bit und einen Adressraum von 16 MByte ausgelegt ist, erschien für den Einsatz von 80386- und 80486CPUs die Beschränkung auf 64-KByte-Datenblöcke bei der DMA-Übertragung und die fehlende Busmasterfunktion für Einsteckkarten nicht mehr zeitgemäß. Außerdem ist bei ISA die wenig benutzerfreundliche Konfiguration von Einsteckkarten über Jumper und DIP-Schalter plus herstellerspezifischer Setup-Programme immer schon ein fehlerträchtiges Unterfangen gewesen. Erst ISA-Plug&Play, das nach PCI auf den Markt kam, hat für ISA-Karten mit derartigen Problemen aufgeräumt. Doch dazu später mehr in Kapitel 21. Als Lösung dieser Probleme wurden zwei verschiedene Konzepte entwickelt: der MicroChannel (MCA) von IBM für die PS/2-Serie und EISA von einem Zusammenschluss führender Hersteller, wie z.B. Compaq oder Hewlett Packard. Mit dem MicroChannel von IBM wurden sowohl hinsichtlich der Architektur als auch der geometrischen Gestaltung der Busslots vollkommen neue und eigene Wege beschritten. Überdies hatte IBM den MicroChannel durch Patente und andere Schutzrechte wirksam gegen die Konkurrenz abgeschottet, die IBM zuvor beim PC/XT/AT als führenden Anbieter verdrängt hatte. Dagegen sah EISA die völlig problemlose Einbindung von ISA-Komponenten in das EISA-System vor, was eine identische Geometrie der Steckkarten bedingte – und leider auch die Übernahme teilweise veralteter Konzepte für den ISA-Anteil am EISA-System. 16-Bit-ISA-Komponenten können dadurch problemlos in ein EISA-System integriert werden, nur hat man davon nicht den geringsten Vorteil – der EISA-Bus arbeitet praktisch genau so wie der bisherige ISABus. Erst 16- oder 32-Bit-EISA-Komponenten nutzen die Vorteile des EISA-Bussystems, u.a. mit Burst-Zyklen oder 32-Bit-DMA. Der EISA-Bus schafft eine Datenübertragungsrate von bis zu 33 MByte/s gegenüber den 8,33 MByte/s für den ISA-Bus. Technisch gesehen ist EISA aufwändiger als der MicroChannel, weil EISA nicht nur EISA-, sondern aus Kompatibilitätsgründen auch ISA-Zyklen ausführen muss. Das betrifft z.B. DMA, wo das EISA-System zu entscheiden hat, ob ein 8237A-kompatibler DMA-Zyklus mit den bekannten Nachteilen oder ein vollwertiger 32-BitEISA-DMA-Zyklus ausgeführt werden soll. Die Hardware muss demnach beides können und ist dadurch natürlich recht komplex. In dieser Hinsicht hat es der Mikrokanal einfacher – er wirft die untauglichen Konzepte des PC/XT/AT einfach über Bord und beginnt quasi von neuem.
Sandini Bib 702
Kapitel 20
EISA-Systeme sind eine Zeit lang noch häufig als Serverhardware (sogar neben PCI) eingesetzt worden. Der MicroChannel wurde mit der PS/2-Serie von IBM eingeführt und hat dann, nachdem er sich auf dem PC-Markt nicht durchsetzen konnte, in den IBM-RISC-Workstations jahrelang weitergelebt. Die mit der PS/2-Serie eingeführten anderen Neuerungen, wie beispielsweise die PS/2-Anschlüsse für Maus und Tastatur, die PS/2-Speichermodule, der bidirektionale Parallel-Port für einen Drucker und die diversen On-Board-Schnittstellen sind hingegen als Standard auch für nachfolgende Architekturen übernommen worden.
20.2.1 Extended Industry Standard Architecture – EISA Das eigentliche Herzstück des EISA-Bus ist der EISA-Buscontroller (vgl. Abbildung 20.2). Er unterscheidet EISA- von ISA-Buszyklen, gibt alle notwendigen ISA- und EISA-Bussignale aus, führt normale und Burst-Zyklen aus und erledigt die ganze Bussteuerung im EISA-PC. Zusammen mit dem Daten-Swapper zerlegt er 32-Bit-Größen in 8- oder 16-Bit-Portionen für 8- und 16Bit-Peripherieeinheiten oder fügt solche Portionen wieder zu einer 32-Bit-Größe zusammen. Das ist z.B. dann notwendig, wenn ein 16-Bit-ISA-Adapter in einen EISA-Slot eingesetzt wird. Die reinen EISA-Karten teilen über zwei neue Signale (EX32, EX16) dem EISA-System mit, dass es sich um EISA-Komponenten mit den erweiterten Funktionen handelt, die für EISA vorgesehen sind. EISA-Steckkarten mit einem eigenen Busmaster weisen eine Busmaster-Schnittstelle auf, die es einer lokalen CPU, dem Busmaster, ermöglicht, den EISA-Bus zu steuern. EISA ist also ein ganz wesentlicher Schritt hin zu einer Multiprozessorumgebung. Außerdem unterstützen die Arbitrierungslogik und die gegenüber dem AT veränderte Zuweisung von DMA- und InterruptKanälen bereits auf der Hardware-Ebene die Multitasking-Betriebssysteme. Frequenzteiler
TastaturController
DMA Controller
Floppy Controller
EISABuspuffer DatenSwapper EISA-BusController
DRAM ISA
EISA-Bus Abb. 20.2: EISA-Architektur
Echtzeituhr CMOS RAM ROM BIOS
BusmasterSchnittstelle
Datenbus
NMI-Logik
Steuerbus
Busarbitrierung Timer
DRAMSteuerung
X-Bus
Interrupt Controller
Adreßbus
CPU
lokaler Bus
Taktgenerator
8,33MHz max.
EISA-Steckkarte
lokale CPU
lokale Logik
Sandini Bib Bussysteme im PC
703
Der Taktgenerator versorgt die CPU und nach einer Teilung der Frequenz im Frequenzteiler auch den EISA-Bus. Es handelt sich hier also um ein synchrones Bussystem, weil CPU und EISABus von derselben Taktsignalquelle versorgt werden und dadurch synchron arbeiten. Die maximale Frequenz für den EISA-Bus liegt bei 8,33 MHz – diese Frequenz bestimmt den Zugriff der CPU auf alle externen Einheiten. Auch bei EISA werden die Support-Chips und Controllerbausteine über Ports angesprochen, und es ist hier in der jeweiligen Belegung logischerweise eine Übereinstimmung mit den ISAPorts (siehe auch Tabelle 20.4 für die Port-Adressen im PC/XT) gegeben. Zusätzlich sind für EISA verschiedene Adressbereiche mit den Basisadressen 1000h bis 8000h definiert, mit deren Hilfe die EISA-Slots bzw. EISA-Karten einzeln angesprochen werden können, was für die automatische Konfigurierung notwendig wird. Wie ISA so sieht auch EISA 15 Interrupt-Ebenen vor, die vom EISA-Interrupt-Controller verwaltet werden. Aus Kompatibilitätsgründen ist IRQ2 durch eine Kaskadierung belegt. Der EISAInterrupt-Controller verhält sich genauso wie die beiden kaskadierten PIC 8259A im AT. Im Gegensatz zum AT können die von EISA-Karten belegten Interrupt-Kanäle aber auch mit Pegelstatt Flankentriggerung arbeiten. Der Pegel einer IRQ-Leitung über einem bestimmten Niveau löst dann eine Interrupt-Anforderung aus und nicht der Anstieg selbst. Dadurch ist es möglich, dass sich mehrere Quellen einen IRQ teilen können. Wenn eine Quelle bedient wird, bleibt der entsprechende IRQ trotzdem aktiv und spiegelt die Tatsache wider, dass eine weitere Einheit auf derselben IRQ-Leitung einen Interrupt anfordert. Dadurch können im Prinzip beliebig viele Einheiten einen Interrupt anfordern: Im Gegensatz zum PC/XT und AT ist eine Leitung nicht mehr exklusiv für eine einzige Einheit reserviert. Wenn jedoch eine ISA-Karte verwendet wird, muss der eventuell zugeordnete Interrupt aus Kompatibilitätsgründen (im BIOS-Setup) als flankengetriggert festgelegt werden. Das Prinzip der IRQ-Pegeltriggerung wurde später mit PCI ebenfalls zum Standard für PCI-Karten erhoben.
Abb. 20.3: Die Kontakte einer EISA-Karte befinden sich unterhalb der ISA-Kontakte.
Sandini Bib 704
Kapitel 20
Für die Erweiterung des ISA-Bus auf 32 Bit sieht EISA insgesamt 90 neue Kontakte vor, wobei jedoch auch ISA-Karten hier ihren Platz finden können, so dass eine neue – aber ISA-kompatible – Steckverbindung eingeführt wurde. Beim MicroChannel wird diese Schwierigkeit umgangen, indem die Kontakte einfach kleiner sind und enger beieinander liegen. Dadurch ist aber der Mikrokanal bereits steckerinkompatibel. Bei EISA liegen die zusätzlichen Signale eine Ebene tiefer als die ISA-Kontakte, und sind so versetzt, dass sie nur von einer EISA-Karte im EISA-Slot erreicht werden können. ISA-Steckkarten schließen die Kontakte nicht kurz, weil eine ISA-Karte nicht tief genug in den EISA-Slot eindringen kann. Auf EISA-Adaptern werden Sie vergeblich nach den DIP-Schaltern suchen, die die Konfigurierung von ISA-Karten manchmal zu einem Lotteriespiel mit ungewissem Ausgang werden lassen. EISA löst das Konfigurationsproblem wesentlich einfacher und effizienter: Jedem EISAAdapter und -Mainboard liegt eine Diskette mit einer Konfigurationsdatei (CFG = Configuration File) bei. Die CFG speichert die benutzten Systemelemente des EISA-PC wie z.B. die belegten IRQ- und DMA-Kanäle. Die Informationen werden von einem Konfigurations-Utility, das mit jedem EISA-PC ausgeliefert wird, dazu benutzt, Adapter und PC korrekt zu konfigurieren. Außerdem ist das Utility (ECU, EISA Configuration Utility) intelligent genug, um Zugriffskonflikte zu erkennen und entsprechend darauf zu reagieren. Beispiele dafür sind Adresskonflikte zweier Adapter, deren Adressbereiche zumindest teilweise überlappen. Das kann bei Schnittstellen, deren Registeradressen gleich sind, oder bei gleichen ROM-Basisadressen von SCSI-Host-Adapter und VGAGrafik passieren. Solche Adresskonflikte sind beim AT häufig die Ursache dafür, dass der PC den Dienst verweigert. Der Name einer jeden EISA-CFG-Datei beginnt stets mit einem »!« und trägt die Extension »CFG«. Dazwischen befinden sich Kürzel für den Hersteller und eine Produktidentifizierung. Die CFG-Dateien selbst sind reine ASCII-Dateien und verwenden eine Sprache mit definierten Anweisungen, die an die CONFIG.SYS unter MS-DOS erinnern. Der Hersteller kann über die CFG-Anweisungen alle wichtigen Parameter für seinen EISA-Adapter festlegen, so dass das Konfigurations-Utility nur noch die CFG-Datei lesen muss, um den EISA-PC mit dem neu eingebauten Adapter korrekt zu konfigurieren. Die Konfigurationsdaten werden im erweiterten EISACMOS-RAM abgelegt, das dazu um 4 KByte erweitert worden ist. Der EISA-PC bootet beim nächsten Mal dann ohne weitere Konfigurierungsmaßnahmen.
20.2.2 Micro Channel Architecture – MCA Der MicroChannel wendet sich sowohl in seiner Geometrie als auch von seinem logischen Aufbau her radikal vom ISA-Bus ab, d. h. die Hardware-Kompatibilität zur bisherigen PC-Schiene bleibt auf der Strecke. Erklärtes Ziel bei der Einführung der PS/2-Serie war der Übergang zu multitasking-fähigen Systemen. Die Intention ähnelt also denen, die ich bereits oben im Zusammenhang mit EISA beschrieben habe. Interessant mag sein, dass der MicroChannel wesentlich früher als EISA vorgestellt wurde – EISA wurde bewusst als Reaktion auf den MicroChannel entworfen, um IBM nicht die Vorherrschaft bei 32-Bit-PCs zu lassen. Identische Probleme führen meist zu ähnlichen Lösungen. Es verwundert also nicht, dass sich der Mikrokanal bis auf den völlig inkompatiblen Busslot gar nicht so wesentlich von EISA unterscheidet – schließlich soll spätestens auf Betriebssystemebene und vor allem natürlich auf Anwenderebene eine vollständige Kompatibilität zum AT bestehen. Programme, die nicht explizit auf die Register der Computer-Hardware zugreifen, laufen auf einer PS/2-Maschine daher auch problemlos.
Sandini Bib Bussysteme im PC
705
10MHz max.
CPU-Takt
DMA Controller
Tastaturcontroller
Interrupt Controller
Floppy Controller
Busarbitrierung CACP
parallele Schnittstelle
Timer
VGA
ROM BIOS
sonstige Schnittstelle
serielle Schnittstelle
Datenbus
Steuerbus
NMI-Logik
Adreßbus
I/O-Support Chip BusmasterSchnittstelle
lokaler Bus
CPU
DRAMSteuerung
lokaler Kanal
Systemtakt
MCABuspuffer
MCA-BusController
Echtzeituhr CMOS RAM
MCA-Steckkarte lokale CPU
lokale Logik
DRAM
Mikrokanal
Abb. 20.4: MicroChannel-Architektur
Ein wesentlicher Unterschied zu EISA ist der separate Systemtakt, der alle Komponenten des MicroChannel mit einer Frequenz von maximal 10 MHz versorgt; nur der lokale Bus zwischen CPU und Speicher läuft schneller, um den Datenzugriff der CPU auf den Hauptspeicher mit maximaler Geschwindigkeit auszuführen. Der MicroChannel ist also ein asynchrones Bussystem, d. h. die CPU wird von einem eigenen CPU-Takt versorgt. Etwas steigern lässt sich die Übertragungsrate durch die so genannten Matched-Memory-Zyklen. Durch die hier kürzere Zykluszeit ist eine Übertragungsrate von maximal 21,4 MByte/s möglich, eine Steigerung von sagenhaften 7%. Kein Wunder, dass IBM den Matched-Memory-Zyklus bald wieder eingemottet und das Konzept der Streaming-Data-Procedures oder kurz SDP eingeführt hat. Die 32-Bit-SDP stimmt vom Signalverlauf mit dem Burst-Modus des i486 überein. Um eine 32Bit-SDP anzufordern, deaktiviert der Busmaster das Signal BLAST. Die adressierte Einheit reagiert mit einem BRDY, um anzuzeigen, dass sie einen 32-Bit-Burst-Modus ausführen kann. Bei der 32-Bit-SDP werden pro MCA-Bustakt 4 Byte übertragen. Dadurch steigt die Datenübertragungsrate kurzzeitig auf 40 MByte/s. Diese ist sogar höher als beim Burst-Modus des EISA-Bus mit 33 MByte/s. Eine weitere Steigerung ergibt sich bei 64-Bit-SDP. Hier wird nur im ersten Buszyklus die Adresse übergeben, die adressierte Einheit nimmt sie entgegen und speichert sie. Anschließend werden die Daten sowohl über den 32-Bit-Datenbus als auch über den 32-Bit-Adressbus übertragen, d.h. mit einer Breite von insgesamt 64 Bit oder 8 Byte. Die adressierte Einheit besitzt einen Adresszähler, der bei einer 64-Bit-SDP die Adresse selbstständig hochzählt und dadurch von der CPU nur die Startadresse benötigt. Mit der 64-Bit-SDP erreicht man eine Übertragungsrate von 80 MByte/s. Noch leistungsfähiger ist die erweiterte 64-Bit-SDP. Hier wird der Buszyklus von 100 ns auf 50 ns
Sandini Bib 706
Kapitel 20
verkürzt, die weitere Übertragung läuft wie bei der normalen 64-Bit-SDP ab. Die Übertragungsrate wird also auf 160 MByte/s verdoppelt, was sicher ein beeindruckender Wert ist. Ähnlich wie EISA unterstützt auch MCA externe Busmaster auf Adapterkarten; einschließlich der CPU können maximal 16 verschiedene Busmaster integriert werden. IBM hat zu diesem Zweck einen Baustein, den so genannten Central-Arbitration-Control-Point (CACP) vorgesehen, der die Busarbitrierung und die Übergabe der Steuerung an einen Busmaster vornimmt. Busmaster können bei MCA die CPU des Mainboard, die Refresh-Logik, der DMA-Controller und externe Busmaster auf Adapterkarten sein. Die Support-Chips des MicroChannels unterscheiden sich in ihrer Funktion nicht wesentlich von ihren EISA-Pendants. Sie sind aber vollständig auf das neuartige Bussystem abgestimmt, der DMA-Controller führt bei einem 32-Bit-MicroChannel also stets einen 32-Bit-DMA-Transfer für den gesamten Adressraum aus – es gibt keinen 8237A-kompatiblen DMA-Transfer. Außerdem erlaubt es die MCA, dass gleichzeitig alle acht DMA-Kanäle aktiv sind. Es wird kein Kanal für eine Kaskadierung verschwendet. Neben dem Bussystem und dem DMA-Controller ist auch der Interrupt-Controller konsequent auf die neue Architektur abgestimmt; alle Interrupts werden ausschließlich pegelgetriggert ausgelöst. Bei EISA können Interrupts dagegen pegel- oder flankengetriggert sein, um ISA-Adapter, wie z.B. serielle Schnittstellen, die ausschließlich mit Flankentriggerung arbeiten, in einem EISASlot zu betreiben. Durch die reine Pegeltriggerung können sich verschiedene Quellen eine Interrupt-Leitung IRQx teilen. Außerdem ist die Pegeltriggerung weniger störungsanfällig als die Flankentriggerung, weil ein Störimpuls nur einen kurzzeitigen Spannungsanstieg auslöst, für Pegeltriggerung aber ein beständig hoher Pegel notwendig ist. Für den MicroChannel sind 255 verschiedene Hardware-Interrupts möglich; im AT sind nur 15 zugelassen. Die Belegung der IRQ-Leitungen und die Zuordnung von Hardware-Interrupt und zugehörigem Interrupt-Vektor stimmen aber mit dem AT und EISA überein. Dies gilt im Wesentlichen ebenfalls für die Portbelegung (I/O-Adressbereiche), gleichwohl sind einige Bereiche hinzugekommen, die der automatischen Konfigurierung dienen, d.h., es gibt bei MCA wie bei EISA keine DIP-Schalter und Jumper mehr für die manuelle Einstellung der jeweils zu verwendenden PC-Ressourcen. IBM teilt hierfür jedem Adapter eine Kennziffer zu, die vom System gelesen und ausgewertet werden kann. Diese Konfigurationsinformation wird wie bei EISA in einem erweiterten CMOSRAM abgelegt. Auf jedem MCA-Adapter und dem MCA-Mainboard gibt es so genannte programmierbare Auswahlregister (Programmable Option Select Register) POS. Diese belegen stets den I/O-Adressbereich 0100h–0107h. Beim Booten liest die POST-Routine des BIOS die Adapteridentifizierung ID aus und vergleicht sie mit den Konfigurationsdaten, die im CMOS-RAM gespeichert sind. Die Adapteridentifizierung ID wird von IBM zentral vergeben, d.h., IBM teilt jedem Hersteller eines MCA-Adapters eine solche Nummer für das entsprechende Produkt zu. Ähnlich wie bei EISA wird auch für jedes MCA-Produkt eine Konfigurationsdiskette mitgeliefert, die eine Datei mit den notwendigen Informationen enthält. Diese Datei wird als Adapter Description File oder kurz ADF bezeichnet. Der Dateiname hat dabei das Format @iiii.adf, wobei iiii die vierstellige Kartenidentifizierungsnummer in hexadezimaler Notation ist. Ähnlich wie bei EISA verwendet auch die ADF eine Konfigurationssprache, die an CONFIG.SYSBefehle erinnert.
Sandini Bib
D8 D9 GND D12 D14 D15 GND IRQ10 IRQ11 IRQ12 GND
10
20
30
40
45 48
58
+5V D10 D11 D13 +12V res SBHE CDDS16 +5V IRQ14 IRQ15
M4
D8 D9 GND D12 D14 D15 GND IRQ10 IRQ11 IRQ12 GND res res res res GND D16 D17 D18 GND D22 D23 res GND D27 D28 D29 GND BE0 BE1 BE2 GND TR32 A24/D56 A25/D57 GND A29/D61 A30/D62 A31/D63 GND res res
48
M1 01
10
20
30
40
45
50
60
70
80
89
res MMCCMD GND MMC CDSETUP MADE 24 GND A11/D43 A10/D42 A9/D41 +5V A8/D40 A7/D39 A6/D38 +5V A5/D37 A4/D36 A3/D35 +5V A2/D34 A1/D33 A0/D32 +12V ADL PREEMPT BURST -12V ARB0 ARB1 ARB2 -12V ARB3 ARB/GNT TC +5V S0 S1 M/IO +12V CDCHRDY D0 D2 +5V D5 D6 D7 GND DS16RTN REF
+5V D10 D11 D13 +12V res SBHE CDDS16 +5V IRQ14 IRQ15 res res GND res res res +12V D19 D20 D21 +5V D24 D25 D26 +5V D30 D31 res +12V BE3 DS32RTN CDDS32 +12V A26/D58 A27/D59 A28/D60 +5V res res res GND
Matched-MemoryErweiterung
CDSETUP MADE 24 GND A11 A10 A9 +5V A8 A7 A6 +5V A5 A4 A3 +5V A2 A1 A0 +12V ADL PREEMPT BURST -12V ARB0 ARB1 ARB2 -12V ARB3 ARB/GNT TC +5V S0 S1 M/IO +12V CDCHRDY D0 D2 +5V D5 D6 D7 GND DS16RTN REF
GND res MMCR res AudioGND Audio GND 14,3MHz GND A23/D55 A22/D54 A21/D53 GND A20/D52 A19/D51 A18/D50 GND A17/D49 A16/D48 A15/D47 GND A14/D46 A13/D45 A12/D44 GND IRQ9 IRQ3 IRQ4 GND IRQ5 IRQ6 IRQ7 GND res res CHCK GND CMD CHRDYRTN CDSFDBK GND D1 D3 D4 GND CHRESET res res GND
8-Bit-Abschnitt
01
VSYNC HSYNC BLANK GND P6 EDCLK DCLK GND P7 EVIDEO
16-Bit-Abschnitt
AudioGND Audio GND 14,3MHz GND A23 A22 A21 GND A20 A19 A18 GND A17 A16 A15 GND A14 A13 A12 GND IRQ9 IRQ3 IRQ4 GND IRQ5 IRQ6 IRQ7 GND res res CHCK GND CMD CHRDYRTN CDSFDBK GND D1 D3 D4 GND CHRESET res res GND
V1
707
32-Bit-Abschnitt
VideoErweiterung
V10
16-Bit-Abschnitt
ESYNC GND P5 P4 P3 GND P2 P1 P0 GND
8-Bit-Abschnitt
Bussysteme im PC
Abb. 20.5: Die MCA-Slots. Doppelt belegte Adressanschlüsse werden in einer 64-Bit-SDP für die Datenübergabe verwendet.
Die MCA weist verschiedene Slots- bzw. Erweiterungen auf, wie Sie sie in Abbildung 20.5 sehen. Eine Erläuterung der einzelnen Signale spare ich mir, vielmehr soll die Abbildung lediglich die
Sandini Bib 708
Kapitel 20
Slot-Topologie verdeutlichen, die auf den entsprechenden Mainboards zu finden ist, wobei es unterschiedliche Kombinationen geben kann. Das bedeutet, dass etwa die Video- oder MatchedMemory-Erweiterung bei einem MCA-PC nicht zwangsläufig vorhanden sein muss. Der Kern des MCA-Slots ist der 8-Bit-Abschnitt mit 90 Kontakten. Im Gegensatz zu EISA sind beim MCA-Slot die Kontakte nur auf einer Ebene, dafür aber wesentlich enger beieinander liegend angeordnet, und jeder vierte Kontakt einer Kontaktreihe liegt auf Masse oder einem Versorgungspegel. Die Masse- und Versorgungskontakte auf den beiden Seiten sind um zwei Positionen gegeneinander verschoben, so dass im Endeffekt jedes zweite Kontaktpaar einen Masse- oder Versorgungsanschluss aufweist. Durch das definierte Potenzial dieser Kontakte ist die Störsicherheit wesentlich besser als beim AT, der teilweise bis zu 31 aufeinander folgende Signalanschlüsse ohne dazwischen liegende Masse- oder Versorgungskontakte aufweist. Beim EISA-Slot wird die Störanfälligkeit etwas gemildert, indem die tieferliegende EISA-Kontaktreihe wesentlich mehr solcher Anschlüsse aufweist als der AT-Anteil am EISA-Slot. Neben dem 8-Bit-Abschnitt gibt es verschiedene Erweiterungen, nämlich den 16-Bit-Abschnitt für 16-Bit-MCA-Adapter, den 32-Bit-Abschnitt für 32-Bit-MCA-Adapter, die Video-Erweiterung für zusätzliche Grafikadapter und die Matched-Memory-Erweiterung für Speicher mit hoher Zugriffsgeschwindigkeit.
20.3 Local Bus-Systeme Der lokale Bus eines PC (der auch als CPU-Bus bezeichnet wird) verbindet über entsprechende Bausteine wie über den Memory-Controller (DRAM-Steuerung) im Wesentlichen die CPU mit dem DRAM und dem externen Cache-Speicher. Bei Systemen mit mindestens einem 80386Mikroprozessor ist dieser Bus dementsprechend in 32-Bit-Breite ausgeführt und wird mit der externen Prozessorfrequenz getaktet. Zahlreiche Hersteller stellten aus diesem Grunde einen speziellen Anschluss auf den Mainboards zur Verfügung, der vorwiegend für die Aufnahme von Grafikkarten vorgesehen ist, da gerade diese Komponente von einer höheren Datenübertragungsrate profitiert. Da aber fast jeder Hersteller einen eigenen Standard für diesen Anschluss definierte, war damit die im PC-Bereich wichtige Kompatibilität nicht mehr gewahrt, und die Video Engineering Standards Association (VESA) definierte den VLB – VESA Local Bus. Dieser Bus ist im Grunde genommen nur ein leicht modifizierter CPU-Bus eines 80386, 80486 oder Pentium und daher äußerst kostengünstig zu realisieren. Dadurch verwendet er Buszyklen, die denen der 80x86-Prozessoren weitgehend gleich sind, so dass ich hier auch auf eine Beschreibung der Buszyklen verzichten möchte. Der VLB versteht sich lediglich als Erweiterung zu ISA, EISA oder auch MCA und ist nicht als eigenständiges Bussystem für einen PC vorgesehen. Der VLB ist gegenüber seinem später erschienenen Konkurrenten PCI wesentlich mehr als lokaler Bus konzipiert, und daher erscheint die Bezeichnung Local Bus für den VLB auch treffender als bei PCI, der zwar ebenfalls unter dieser Bezeichnung geführt wird, demgegenüber jedoch mit den bis dato üblichen PC-Architekturen radikal aufräumt, wie es in Kapitel 22 beschrieben wird. Wie die MicroChannel-Architektur und der EISA-Bus sind auch PCs mit VLB mittlerweile als veraltet anzusehen. Das schematische Konzept des VL-Bus sehen Sie in Abbildung 20.6. Wie der PCI-Bus befindet sich auch der VL-Bus zwischen dem Prozessor- und Speichersystem und dem Standarderweiterungsbus. In der Abbildung können Sie schon erkennen, dass der VL-Bus nicht ganz so streng vom Prozessorsystem auf der einen und dem Standarderweiterungsbus auf der anderen Seite
Sandini Bib Bussysteme im PC
709
entkoppelt ist wie PCI. Beim VLB gibt es demnach keine Entkopplung von Prozessor- und Erweiterungsbus, und er arbeitet stets mit der Prozessorfrequenz, was maximal 66 MHz Onboard oder 40 MHz (Spezifikation 1.0) bzw. 50 MHz (Spezifikation 2.0) im Slot bedeutet. Mit der 32-Bit-Standardbusbreite erreicht man eine Transferrate mit maximal 133 MByte/s laut der VLB-Spezifikation 1.0 und 160 MByte/s laut der Spezifikation 2.0, die eine 64-Bit-Breite vorsieht, jedoch kaum in auf dem Markt verfügbaren Produkten in Erscheinung getreten ist. Prozessorsystem Coprozessor
Cache Controller
Cache SRAM
0
1
DRAMSteuerung
DRAM
CPU
2
VL-BusController
VL-BusEinheiten
ISA/EISABussteuerung
Busslots
Motherboard-Slots
Motherboard-Chipsatz
Priorität
3
4
Abb. 20.6: Der VL-Bus
Der VL-Bus sieht bis zu drei VL-Bus-Einheiten vor, die von einem VL-Buscontroller gesteuert werden. Er erzeugt alle notwendigen Adress-, Daten- und Steuersignale für den Local-Bus oder nimmt sie entgegen. In den meisten Fällen ist auf einem VLB-Mainboard allerdings nur ein einziger VLB-Slot für die Aufnahme einer entsprechenden Grafikkarte vorgesehen. Die VLB-Slots weisen eine 116-polige Fassung ähnlich den MicroChannel-Slots auf, die jeweils 5 mm hinter einem Slot des Standarderweiterungsbus (in der Regel ISA) liegen. Dadurch kann ein VL-Bus-Adapter nicht nur die Signale und Kontakte des VL-Bus, sondern auch den davor liegenden ISA-Slot verwenden, wie es in der Regel auch praktiziert wird. Ein VLB-Adapter wird zunächst über den PC- bzw. ISA-Bus initialisiert, bevor der VLB überhaupt erst mit seinem 32Bit-Mode in Aktion tritt. Falls dabei etwas schief gehen sollte (Treiber- und BIOS-Probleme), arbeitet der VLB-Adapter lediglich im 8-Bit- (PC-Bus) oder günstigenfalls im 16-Bit-Mode (ISABus). Ersteres tritt häufig bei VLB-Controllerkarten (Schnittstellen, IDE, SCSI), Letzteres bei Grafikkarten auf, ohne dass der Anwender (außer vielleicht an einer mageren Transferrate) etwas davon bemerken würde. Außerdem haben es die Hersteller mit der VLB-Spezifikation nie so genau genommen, denn obwohl er für maximal 66 MHz ausgelegt ist, darf dann kein VLB-Slot vorhanden sein, sondern der Controller muss sich in diesem Fall Onboard befinden, was keineswegs konsequent beachtet wurde. Dämpfungen, Signalreflexionen und Kapazitäten verhindern im Prinzip eine solch hohe
Sandini Bib 710
Kapitel 20
Frequenz bei einem VL-Busslot. Mit Erweiterungsslots darf der VL-Bus daher mit höchstens 50 MHz verwendet werden. Bei zu hoch getakteten CPUs senkt ein Frequenzteiler den Versorgungstakt ab, was – je nach Mainboard-Typ – über Jumper auf dem Board oder auch im BIOSSetup einzustellen ist. Wie bei PCI ist auch beim VLB kein direkter Speicherzugriff (DMA) vorgesehen. Da ein VLBAdapter üblicherweise auch einen ISA- oder EISA-Slot und somit die darin mündenden (E)ISASteuersignale benutzt, kann er jedoch die Signale DREQx und DACKx für einen DMA-Transfer im Stil eines ISA- bzw. EISA-DMA-Zugriffs ausführen. Verwendet eine VLB-Einheit lediglich den VL-Bus, um eine Datenübertragung auszuführen, dann muss sie einen VL-Busmaster darstellen, der den VL-Bus vollständig steuern kann. Diese Strategie erlaubt im Normalfall ungleich höhere Datenübertragungsraten als die klassische DMA-Technik, weil der VL-Busmaster ja den breiten (32 Bits oder sogar 64 Bits) und schnellen (bis 50 MHz in den Slots) VL-Bus im BurstModus nutzen kann. Die notwendige Busarbitrierung wird wie bei PCI über den VL-Buscontroller ausgeführt. Auch beim VL-Bus ist das Konzept des direkten Speicherzugriffs also durch das flexiblere und leistungsfähigere Prinzip der externen Busmaster ersetzt worden. Die VLB-Spezifikation sieht nur einen einzigen Interrupt-Anschluss vor, nämlich IRQ9. Er arbeitet pegelgetriggert mit einem aktiv-hohen Pegel und ist unmittelbar mit IRQ9 des (E)ISA-Bus verbunden. Weil ein VL-Bus im Allgemeinen eine Erweiterung für ein ISA/EISA- oder auch MCASystem darstellt, sind die betreffenden I/O-Ports auch mit den entsprechenden Registern belegt. Die VLB-Spezifikation sieht leider keine eigenen, fest definierten Konfigurationsregister an klar vorgegebenen I/O-Adressen vor. Meistens sind solche aber herstellerabhängig vorhanden, damit Sie z.B. im Setup die Anzahl der VLB-Waitstates oder die VLB-Taktfrequenz festlegen können. Allein aus der Sicht der (automatischen) Konfigurierung stellt sich der VLB als Rückschritt gegenüber EISA und MCA dar, denn es können durchaus VLB-Einstellungen im BIOS zu finden sein, gleichwohl können aber auch Jumper auf dem Mainboard hierfür zuständig sein. Außerdem gab es immer wieder Probleme mit zu hoch getakteten VLB-Slots, die sich nicht korrekt heruntertakten ließen, damit eine bestimmte VLB-Karte genutzt werden konnte; daher ist es nur gut, dass der VLB vom PCI-Bus abgelöst worden ist. Der VLB war gewissermaßen nur eine preisgünstige Notlösung für Grafikkarten, da die Transferraten von ISA, EISA und MCA damals nicht auszureichen schienen. Eine ähnliche Technologie (angeflickter bzw. aufgebohrter, nicht eigenständig funktionierender Bus) wurde uns später mit dem AGP (siehe Kapitel 23) präsentiert, wo zunächst die Signale vom PCI-Bus eine AGPKarte initialisieren, woraufhin dann erst der AGP in Aktion tritt. Auch bei diesem Vorgang können BIOS- und Treiberprobleme verhindern, dass eine AGP-Grafikkarte nachfolgend optimal funktioniert und nicht nur als lahme VGA-Grafikkarte daherkommt.
Sandini Bib
21
Die 16-Bit-Architektur – ISA-Bus
Der ISA-Bus für Einsteckkarten wurde mit den als AT, was für Advanced Technology steht, bezeichneten IBM-Computern mit einer 80286-CPU eingeführt. Aus dem vorangegangenen Kapitel konnten Sie bereits erfahren, dass diese Technologie letztendlich auf dem ursprünglichen PC/XTDesign beruht und andere Systeme wie EISA, MCA oder auch VLB trotz des ihnen gegenüber nicht mehr zeitgemäßen Designs überdauert hat. Dies mag nicht zuletzt daran liegen, dass es auch heute noch eine Vielzahl von ISA-Karten gibt und für viele Anwendungen eine 16-Bit-I/O-Architektur leistungstechnisch gesehen völlig auszureichen scheint. Die stets bemängelte, fehlende Funktionalität der automatischen Konfigurierung, die EISA und die MCA, nicht jedoch der VLB beherrschen, wurde für ISA-Systeme in Form von ISA-Plug&Play nachgereicht, was sich im Komfort eher an PCI-Plug&Play als an die beiden älteren Implementierungen hält. Diese zugegebenermaßen recht späte Anpassung hat die alte 16-Bit-Architektur letztendlich einige weitere Jahre – neben PCI – im PC-Geschäft gehalten. Der ISA-Bus verschwindet zwar in zunehmenden Maße von aktuellen Mainboards, gleichwohl ist er insbesondere in der Industrie für Mess-, Steuer- und Regelungssysteme, die es in unterschiedlichen miniaturisierten Formfaktoren gibt, nach wie vor sehr beliebt. Logischerweise sind die einzelnen Schaltkreise für den Timer, die Interrupt- und DMA-Controller usw. schon seit langer Zeit nicht mehr als einzelne Bausteine auf einem Mainboard auszumachen, denn sie sind seit den 386-PCs im jeweiligen Chipset integriert. Allerdings werden die ursprünglichen Chip-Funktionen hiermit nachgebildet. In Abbildung 21.1 finden Sie zunächst das Blockdiagramm eines klassischen AT, der eben mit einer 286-CPU begründet wurde. Diese CPU besitzt 24 Adressleitungen, womit maximal 16 MByte Speicher adressiert werden können. Für fortschrittlichere Betriebssysteme als DOS wurde mit dem 80286 bereits der Protected Mode eingeführt. Die Adressleitung A20 wird vom Tastaturcontroller gesteuert und kann gesperrt werden, damit der 80286 im Real Mode streng nur das erste MByte des Speichers adressiert und ein Wrap-around wie der 8086/88 ausführt. Zusätzlich zum 80286 kann der mathematische Coprozessor 80287 eingebaut sein. Für den Systemtakt sorgt der Taktgenerator 82284, das Nachfolgemodell des 8284 für den 8086/88. Der erste AT arbeitete mit einem effektiven Prozessortakt von 6 MHz, so dass der Taktgenerator die doppelte Frequenz von 12 MHz abgab. Ein weiterer wesentlicher Bestandteil des AT ist – wie bei jedem Computer – der Hauptspeicher. Der Prozessor ist mit ihm wie beim PC/XT über einen Daten-, Adress- und Steuerbus verbunden. Die CPU adressiert den Speicher durch einen 24-BitAdressbus, steuert die Datenübertragung mit dem Steuerbus und überträgt die Daten über einen 16-Bit-Datenbus. Die notwendigen Steuersignale werden dazu vom Buscontroller 82288 erzeugt, dem Nachfolger des 8288 für den 80286. Um den Datenaustausch möglichst störungsfrei und geordnet zu gestalten, werden die Signale in verschiedenen Adress- und Datenpuffern zwischengespeichert und verstärkt. Im AT unterscheidet man fünf verschiedene Adressbusse:
:
Lokaler Adressbus: Er umfasst die 24 Adresssignale vom 80286. Externe Adresspuffer und Adress-Latches trennen den lokalen Bus vom Systemadressbus ab.
Sandini Bib 712
:
Kapitel 21
Systemadressbus: Er ist wie beim PC/XT der wesentliche Adressbus im AT und stellt die gelatchte Version der Bits A0–A19 des lokalen Adressbus dar – der Systemadressbus im AT ist also nur ein 20-Bit-Adressbus. Das Signal zur Verriegelung der Adresssignale auf dem lokalen Adressbus in den Latches für den Systemadressbus ist ALE. Der Systemadressbus ist beim AT als A0–A19 an die Busslots herausgeführt. 12MHz
82284
80286
80287
8259A
lokaler Bus
WaitstateLogik
Adreßpuffer
Datenpuffer
82288
Adreßpuffer
NMILogik
Adreßpuffer I/ODekodierlogik Datenpuffer
8237
AdreßLatch
PageRegister
CMOS
Tastaturcontroller
8253
ROM
Adreßbus
bus
Steuerbus
Daten
Echtzeituhr Steuerlogik Multiplexer
Lautsprecher
Datenpuffer
RAM
Parität
AT-Busslots
Abb. 21.1: Die klassische AT-Architektur
:
Speicheradressbus: Dieser Adressbus ist nur auf dem Mainboard vorhanden und stellt die gemultiplexte Version des Systemadressbus dar; über ihn werden nacheinander die Zeilenund Spaltenadressen an die DRAM-Chips übergeben.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
: :
713
X-Adressbus: Er ist über Puffer und Treiber vom Systembus abgetrennt und dient zur Adressierung der I/O-Einheiten und des ROM-BIOS auf dem Mainboard, wie z.B. die Register des Interrupt-Controllers, des Timers oder eines On-Board-Diskettencontrollers. I/O-Ports und ROM-BIOS auf Erweiterungskarten werden dagegen über den Systemadressbus angesprochen. L-Adressbus: Dieser Adressbus besteht aus den sieben höherwertigen (L=Large) und nichtgelatchten Adressbits A17–A23 des lokalen Adressbus. Er wird als LA17–LA23 in die ATSlots herausgeführt.
Daneben gibt es im AT vier unterschiedliche Datenbusse:
: : : :
Lokaler Datenbus: Er umfasst die 16 Datensignale vom 80286. Zusätzlich ist eine Buslogik notwendig, die Byte- und Wortzugriffe unterscheidet. Externe Datenpuffer und Daten-Latches trennen den lokalen Bus vom Systemdatenbus ab. Systemdatenbus: Er stellt die gelatchte Version des lokalen Datenbus des AT dar und ist 16 Bit breit. Der Systemdatenbus ist an die Busslots herausgeführt. Speicherdatenbus: Dieser Datenbus ist nur auf dem Mainboard vorhanden und stellt die Verbindung zwischen dem Hauptspeicher und dem Systemdatenbus her. X-Datenbus: Er ist über Puffer und Treiber vom Systembus abgetrennt und spricht I/O-Einheiten und ROM-BIOS auf dem Mainboard an. I/O-Ports und Zusatz-BIOS auf Erweiterungskarten werden dagegen vom Systemdatenbus versorgt.
Im Gegensatz zum XT wird der Datenbus mit einer Breite von 16 Bit in die Busslots geführt. Die zusätzlichen Steuer- und Datensignale sind in einem neuen Slot-Abschnitt mit 38 Kontakten untergebracht. Durch die beiden neu hinzugekommenen Steuersignale MEM CS16 und I/O CS16 können aber auch ältere XT-Steckkarten mit einem 8-Bit-Datenbus in die AT-Slots eingesetzt werden – die Buslogik erkennt selbstständig, ob eine 16-Bit-AT- oder eine 8-Bit-PC/XTKarte im Busslot steckt. Wie der PC/XT-Bus unterstützt auch der AT- oder ISA-Bus nur die CPU und die DMA-Chips auf dem Mainboard uneingeschränkt als Busmaster. Auf externen Steckkarten in den Busslots können keine reinen Busmaster arbeiten und den AT-Bus steuern. Die Übergabe erfolgt nur mittelbar über einen DMA-Kanal und nicht direkt durch ein Master-Request. Die Firma Adaptec hat für ihre SCSI-ISA-Hostadapterkarten ein Verfahren entwickelt, das als Busmaster-DMA bezeichnet wird und nach der Initialisierung über einen der üblichen DMA-Kanäle einen eigenen (schnelleren) DMA-Controller auf der Einsteckkarte ins Spiel bringt, der daraufhin die Daten direkt in den Speicher »schaufeln« kann, wobei er mehrere der vorhandenen DMA-Kanäle nutzen kann. In der Anfangszeit war der ISA-Bus-Takt nicht standardisiert, d.h., es waren hier 6 MHz bis hin zu über 12 MHz möglich, was einige Karten (z.B. ISA-Controller) zum Aussteigen veranlasste. Erst mit der Standardisierung des ISA-Bus im Jahre 1996 wurde er verbindlich auf maximal 8,33 MHz für die Busslots festgelegt. Um die Adressen vom Prozessor bei einem Zugriff auf den Speicher zu dekodieren, weist der AT wie der PC/XT einen Adressmultiplexer auf. Er steuert zusammen mit dem Speicherpuffer die Speicherchips auf dem Mainboard an. Die Logik zur Prüfung der Speicherparität löst einen NMI aus, wenn die Daten beim Auslesen nicht mit dem zusätzlich gespeicherten Paritätsbit konform sind. Auch Zusatzspeicher auf einer Steckkarte kann einen Speicherparitätsfehler auslösen. Andere Quellen für einen NMI sind im AT Fehler auf einer Steckkarte, die über I/O CH CK angezeigt werden. Beim PC/XT erfolgte die Auffrischung ausschließlich über den Kanal 0 des DMA-Chips, der vom Kanal 1 des Timer-Chips periodisch aktiviert wird. Beim AT wird der Zeit-
Sandini Bib 714
Kapitel 21
punkt der Auffrischung nach wie vor über den Kanal 1 des Timer-Chips bestimmt, die Auffrischung erfolgt aber üblicherweise über eine spezielle Refresh-Logik, die vom Timer 1 angesteuert wird. Kanal 0 des ersten DMA-Chips steht also im Normalfall zur freien Verfügung, wobei aber nicht ausgeschlossen ist, dass er weiterhin zur Speicherauffrischung verwendet wird. Im AT-Slot münden aus diesem Grund die Leitungen DACK0 und REF. Im Gegensatz zum PC/XT wird eine programmierbare Tastatur des AT über einen Tastaturcontroller mit dem Systembus des AT verbunden; im PC/XT war dafür ein programmierbares Peripherie-Interface (PPI) 8255 vorhanden. Anstelle der Mäuseklaviere mit der Bezeichnung DIPSchalter finden Sie im AT ein CMOS-RAM, der die Systemkonfiguration speichert und dem BIOS beim Booten zur Verfügung stellt. Zusammen mit dem CMOS-RAM ist eine Echtzeituhr integriert, die auch bei abgeschaltetem PC Datum und Uhrzeit laufend nachstellt. Versorgt wird der gesamte AT wie der PC/XT durch ein Netzteil, das Spannungen von -12 V, -5 V, 0 V, +5 V und +12 V liefert. Die Steckkarten in den Busslots werden auch im AT über entsprechende Kontakte in den Slots mit Strom versorgt.
21.1 Interrupts Auch der AT weist zur Unterstützung von CPU und Peripheriegeräten mehrere Support-Chips auf. Statt eines programmierbaren Interrupt-Controllers (PIC) 8259A befinden sich im AT derer zwei: ein Master-PIC und ein Slave-PIC. Der INT-Ausgang des Slave ist mit dem Eingang IR2 des Master verbunden, die beiden PICs sind also kaskadiert. Dadurch stehen beim AT statt acht nun 15 IRQ-Ebenen zur Verfügung. In Tabelle 21.1 finden Sie die Zuordnung von InterruptKanal IRQx und Peripheriegerät oder Support-Chip. Neben den IRQs ist auch der NMI als Hardware-Interrupt aufgeführt, wobei der NMI aber unmittelbar auf die CPU einwirkt und der PIC 8259A dafür nicht benutzt wird. Kanal
Interrupt
Verwendung
NMI IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15
02h 08h 09h 0ah 0bh 0ch 0dh 0eh 0fh 0fh 0fh 0fh 0fh 0fh 0fh 0fh 0fh
Parität, Fehler auf Erweiterungskarten, Speicherauffrischung Kanal 0 des Timers 8253 Tastaturcontroller Kaskadierung vom Slave-PIC COM2 COM1 LPT2 Diskettencontroller LPT1 Echtzeituhr Redirection zu IRQ2 reserviert reserviert reserviert Coprozessor Festplattencontroller reserviert
Tab. 21.1: Hardware-Interrupt-Kanäle im AT
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
715
Die grundsätzliche Belegung der Interrupt-Kanäle, wie sie in Tabelle 21.1 angegeben ist, hat sich über die Jahre nicht wesentlich verändert, und auch wenn etwa ein Pentium 4-PC überhaupt keine ISA-Slots mehr aufweisen sollte, werden die auf dem Mainboard vorhandenen Einheiten (z.B. Timer, Tastatur-Controller, Echtzeituhr) genauso im System abgebildet. Lediglich der IRQ15 wird standardmäßig für den zweiten (E)IDE-Controller eingesetzt, und der IRQ12 wird oftmals von einer PS/2-Maus verwendet. Neben den PICs ist wie beim PC/XT ein programmierbarer Intervall-Timer (PIT) 8253/8254 oder kurz Timer-Chip vorhanden. Der 8254 ist das verbesserte Nachfolgemodell des 8253, besitzt aber im Wesentlichen denselben Funktionsumfang. Er weist insgesamt drei individuell programmierbare Zähler auf (siehe Tabelle 21.2). Der Zähler 0 wird im AT wie beim PC/XT zum periodischen Nachstellen der internen Systemuhr benutzt und ist mit IRQ0 des Master-PICs verbunden. Der so ausgelöste Hardware-Interrupt stellt die interne Uhr nach, die Sie über die DOS-Befehle TIME und DATE abfragen können. Der Zähler 1 aktiviert periodisch die Speicherauffrischung, die durch ein aktives Signal REF im AT-Busslot angezeigt wird, und der Zähler 2 erzeugt wie beim PC/XT die Tonfrequenz für den Lautsprecher. Kanal
Verwendung
0 1 2
interne Systemuhr (IRQ0) Speicherauffrischung Frequenz für Lautsprecher
Tab. 21.2: Timer-Kanäle im AT
21.2 I/O-Ports und Adressen Als Hardware-Komponenten werden die Support-Chips über Ports im I/O-Adressbereich angesprochen. Der AT verwendet also wie der PC/XT eine I/O-Mapped Ein-/Ausgabe. In Tabelle 21.3 finden Sie die Port-Adressen der wichtigsten Hardware-Bausteine. Port-Adresse
Verwendung
000h–00fh 020h–021h 040h–043h 060h–063h 070h–071h 080h–083h 0a0h–0afh 0c0h–0cfh 0e0h–0efh 0f0h–0ffh 100h–1ffh 200h–20fh 210h–217h 220h–26fh 278h–27fh 2b0h–2dfh 2f8h–2ffh
1. DMA-Chip 8237A 1. PIC 8259A PIT 8253 Tastaturcontroller 8042 Echtzeituhr DMA-Seitenregister 2. PIC 8259A 2. DMA-Chip 8237A reserviert reserviert für Coprozessor 80287 frei verfügbar Spieleadapter, Game Port reserviert frei verfügbar 2. Parallelschnittstelle (LPT2) EGA COM2
Tab. 21.3: Port-Adressen im AT
Sandini Bib 716
Kapitel 21
Port-Adresse
Verwendung
300h–31fh 320h–32fh 378h–37fh 380h–38fh 3a0h–3afh 3b0h–3bfh 3c0h–3cfh 3d0h–3dfh 3e0h–3e7h 3f0h–3f7h 3f8h–3ffh
Prototypkarte frei verfügbar 1. Parallelschnittstelle (LPT1) SDLC-Adapter reserviert Monochromadapter/parallele Schnittstelle (LPT1/2) EGA Farb-/Grafikadapter reserviert Diskettencontroller COM1
Tab. 21.3: Port-Adressen im AT (Forts.)
Genau genommen kann ein AT-Computer lediglich eine 80286-CPU beinhalten, was letztendlich der IBM-Definition entspricht. Als die Firma Compaq mit dem ersten 386-PC auf dem Markt auftauchte (vor IBM), verschwand auch langsam die AT-Bezeichnung zur Klassifizierung eines PCs, obwohl der ISA-Bus mit seinen grundlegenden, hier geschilderten Eigenschaften, weiterhin über ca. 15 Jahre das PC-Design für (Einsteckkarten) maßgeblich beeinflusste. Wenn bei einem PC ausschließlich der ISA-Bus vorhanden ist, kann prinzipiell eine 80286-, eine 80386-, eine 80486 oder sogar auch eine Pentium-CPU eingebaut sein. Gleichwohl münden in die ISA-Busslots – wie beim Original-AT – nur 24 Adressleitungen und 16 Datenleitungen. Die Umlegung auf 32und 64-Bit-Größen für den 32- bzw. 64-Bit-Datenbus erfolgt über spezielle Swapper und Puffer. Im Prinzip unterscheidet sich die Architektur dieser i386-, i486- oder Pentium-ATs also nicht von einem gewöhnlichen AT, nur sind die internen Adress- und Datenbusse angepasst.
21.3 DMA-Architektur Für Speicher- und I/O-Zugriffe unter Umgehung der CPU weist der AT zwei DMA-Chips 8237A auf, die kaskadiert sind, so dass insgesamt sieben DMA-Kanäle zur Verfügung stehen. Zu diesem Zweck arbeitet ein 8237A als Master und ist mit der CPU verbunden. Die Anschlüsse HRQ und HLDA des Slave-DMA sind mit Kanal 0 des Master-DMA verbunden, so dass die Kanäle 0 bis 3 des Slave höhere Priorität als die verbleibenden drei Kanäle des Master-DMA haben. Die Kanäle 0 bis 3 des Masters werden allgemein als DMA-Kanäle 4 bis 7 des AT bezeichnet. Die vier Kanäle des Slave-DMA bedienen 8-Bit-Peripheriegeräte, während die drei freien Kanäle 5 bis 7 meist für 16-Bit-Einheiten konfiguriert sind. Die Verwendung der getrennt programmierbaren Übertragungskanäle sehen Sie in Tabelle 21.4. Kanal 0 ist für die Speicherauffrischung reserviert, obwohl in den meisten ATs eine eigene Refresh-Logik für die Auffrischung vorgesehen ist. Die restlichen drei 8-Bit-Kanäle stehen für eine 8-Bit-Datenübertragung zur Verfügung. Die DMA-Chips arbeiten im Normalfall mit einer wesentlich geringeren Taktfrequenz als die CPU. Es verwundert also nicht, dass die meisten ATFestplattencontroller Daten nicht über DMA, sondern mittels programmierter I/O übergeben. Die 16-Bit-Festplattencontroller werden zuweilen aber auch über einen der DMA-Kanäle 5 bis 7 bedient. Der AT weist wegen seines 16-MByte-Adressraums ein 8-Bit-Page-Register auf (PC/XT: 4-Bit-Page-Register), um zusammen mit den zwei 8-Bit-Adressen vom 8237 und DMA-AdressLatch eine 24-Bit-Adresse zu erzeugen.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
717
Kanal
Verwendung
Breite
0 1 2 3 4 5 6 7
reserviert (Speicherauffrischung) SDLC-Adapter/Bandlaufwerk Diskettencontroller reserviert Kaskadierung DMA1->DMA2 reserviert reserviert reserviert
8 Bits 8 Bits 8 Bits 8 Bits -16 Bits 16 Bits 16 Bits
Tab. 21.4: DMA-Kanäle
Die Funktionsweise des AT-DMA stimmt im Prinzip mit dem Betrieb im PC/XT überein, abgesehen von der Möglichkeit, 24-Bit-Adressen zu erzeugen und 16-Bit-Kanäle zu nutzen. Bei einem Lesetransfer gibt der 8237A also die Speicheradresse aus und aktiviert das Signal MEMR, um ein Datenwort aus dem Speicher auf den 16-Bit-Datenbus des AT auszulesen. Anschließend aktiviert er das Signal IOW, damit die Peripherieeinheit ein (8-Bit-Kanal) oder zwei (16-Bit-Kanal) Datenbytes übernehmen kann. Ein Schreibtransfer findet genau umgekehrt statt: Der 8237A gibt die Speicheradresse aus und aktiviert das Signal IOR, um ein oder zwei Datenbytes aus dem I/ORegister der Peripherieeinheit auf den 16-Bit-Datenbus auszulesen. Anschließend aktiviert er das Signal MEMW, damit der Speicher das oder die Datenbytes übernehmen kann. Dazu muss die Systemsteuerung aber erkennen können, ob ein 8-Bit- oder ein 16-Bit-DMA-Kanal verwendet wird und Signale erzeugen, die BHE und A0 entsprechen . Beim 80286 müssen die Daten von einer 8-Bit-Peripherieeinheit je nach Speicheradresse auf den nieder- oder höherwertigen Teil des Datenbus gelegt oder von diesem übernommen werden. Noch umständlicher ist dies mit Prozessoren ab dem 80386, die einen Hauptspeicher mit 32-BitOrganisation (ab Pentium 64 Bit) aufweisen. Dort ist je nach Speicheradresse in analoger Weise eines der vier Datenbusbytes für die Übernahme oder Abgabe der 8-Bit-Daten von oder für die Peripherieeinheit verantwortlich. Eine Zusatzlogik, die die beiden niederwertigen Adressbits vom DMA-Chip dekodiert, kann die Übertragung aber auf einfache Weise erledigen. Die drei freien Kanäle des zweiten DMA-Chips sind von sich aus bereits für die Bedienung von 16-Bit-Peripherieeinheiten eingerichtet. Das kann z.B. ein 16-Bit-Controller für Festplatten sein. Obwohl der 8237A nur ein 8-Bit-Chip ist, kann er problemlos eine 16- oder sogar 32-Bit-Übertragung zwischen Peripherie und Hauptspeicher ausführen. Aus den bisherigen Beschreibungen ist zu erkennen, dass für eine Übertragung zwischen Peripherie und Speicher das interne 8-Bit-Zwischenregister des 8237A keine Rolle spielt (es ist nur für Speicher-Speicher-Transfers von Bedeutung). Das Übertragungsziel übernimmt die Daten von der Quelle direkt vom Datenbus. Das einzige Problem ist nun nur noch, dass das Adressregister des 8237A Byte- und keine Wortadressen ausgibt. Wenn aber die Aufschaltung der Adressbits A0–A15 von 8237A und DMA-AdressLatch auf den Systemadressbus um eins verschoben wird, was einer Multiplikation von zwei entspricht, und das Adressbit A0 des Systemadressbus stets gleich 0 gesetzt wird, dann erzeugt der 8237A effektiv Wortadressen. Genau das geschieht auch bei den 16-Bit-DMA-Kanälen im AT. A0 ist hier also stets gleich 0, 8237A und DMA-Adress-Latch geben die Adressbits A1–A16 aus, und das DMA-Page-Register stellt die Adressbits A17–A23 bereit. Dadurch ist eine DMA-Page für die 16-Bit-Kanäle nun 128 KByte statt 64 KByte groß, und die Übertragung erfolgt in 16-BitPortionen. Eine Übertragung der Datenbytes je nach gerader oder ungerader Adresse auf den nieder- oder höherwertigen Teil des Datenbus ist nicht erforderlich.
Sandini Bib 718
Kapitel 21
Bei Systemen mit 32-Bit-Datenbus (ab 80386) müssen die Worte entsprechend der Tatsache, ob ihre Adressen Doppelwortgrenzen darstellen oder nicht, durch eine 16/32-Bit-Zusatzlogik auf das nieder- oder höherwertige Datenbuswort umgeladen werden. Das erfolgt analog zur Umladung von 8-Bit-Größen auf die beiden Bytes eines 16-Bit-Bus. Für eine Übertragung zwischen Speicher und Peripherie – den Hauptzweck von DMA – ist es also völlig nebensächlich, ob es sich um einen 8- oder 32-Bit-Chip handelt. Die Verschiebung der vom 8237A gelieferten Adressbits um eine oder zwei Stellen liefert 16- oder sogar 32-Bit-Adressen. Logischerweise kann die Übertragung dann nur an Wort- oder Doppelwortgrenzen beginnen oder enden und die übertragenen Größen sind auf 16 oder 32 Bits beschränkt.
21.3.1 Speicher-Speicher-Tansfers Jedem der Kanäle ist ein Page-Register zugeordnet, deren Adressen Sie in Tabelle 21.5 finden. Wie erwähnt, hat IBM aber beim PC/XT den Kanälen 0 und 1 nur ein gemeinsames Page-Register spendiert. Dadurch ist beim PC/XT ein Speicher-Speicher-Transfer nur innerhalb einer DMAPage von 64 KByte möglich, weil nur die Kanäle 0 und 1 eine solche Übertragung ausführen könnten und sich im PC/XT ein Register teilen müssen. Port
Page-Register
Port
Page-Register
87h 83h 81h 82h
Kanal 0 Kanal 1 Kanal 2 Kanal 3
8fh 8bh 89h 8ah
Kanal 4 (Refresh) Kanal 5 Kanal 6 Kanal 7
Tab. 21.5: I/O-Adressen der AT-Page-Register
Auch beim klassischen AT ist kein Speicher-Speicher-Transfer möglich, und zwar aus folgenden Gründen: Der DMA-Kanal 4, der dem Kanal 0 des Masters entspricht, ist durch die Kaskadierung vom Slave-DMA blockiert. Der Master-DMA-Chip steht also für eine Speicher-SpeicherÜbertragung nicht zur Verfügung. Bliebe also nur der Slave-DMA. Beim AT und den modernen Nachfolgern wird die Speicherauffrischung meistens aber nicht mehr über einen DMA-Zyklus ausgeführt, und Kanal 0 wäre dann für eine Speicher-Speicher-Übertragung frei. Für die Speicher-Speicher-Übertragung ist das interne Zwischenregister im 8237A notwendig – und das ist nur acht Bits breit. 16-Bit-Daten auf dem 16-Bit-Datenbus können also nicht zwischengespeichert werden, dazu wäre ein 16-Bit-DMA-Chip notwendig. Wenn man sich auf einen 8-Bit-Transfer beschränkt, kann das Datenbyte zwar zwischengespeichert werden, je nach gerader oder ungerader Quellenadresse erscheint es aber auf dem nieder- oder höherwertigen Teil des Datenbus und muss in Abhängigkeit von einer geraden oder ungeraden Zieladresse auf dem nieder- oder höherwertigen Teil des Datenbus wieder bereitgestellt werden. Das ist mit einer entsprechenden externen Zusatzlogik im Prinzip machbar, aber recht aufwändig, wie es z.B. bei Adaptec SCSI-Hostadaptern praktiziert wird. Im Allgemeinen implementieren die reinen ISAMainboards daher keine Speicher-Speicher-Übertragung. Das ist kein Beinbruch, weil der Befehl REP MOVS Daten beim 80286 in 16-Bit- oder mit einem 386/486 sogar in 32-Bit-Portionen sehr schnell verschieben kann. Die höhere Taktung der CPU steigert den Effekt nochmals ganz deutlich. IBM hat in seinem AT den zweiten DMA-Chip wohl nur aus Sorge darüber vorgesehen, dass einige Peripherieeinheiten einen 16-Bit-DMA-Kanal verlangen könnten.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
719
21.4 Busslots und -Signale A1
8-Bit-PC/XT-Slot
B10 A10
B20 A20
B31 A31
C1
D1
ISA-Erweiterung
MEM CS16 I/O CS16 IRQ10 IRQ11 IRQ12 IRQ15 IRQ14 DACK0 DRQ0 DACK5 DRQ5 DACK6 DRQ6 DACK7 DRQ7 +5V MASTER GND
B1
D10 C10
16-Bit-AT/
GND RESET DRV +5V IRQ2 -5V DRQ2 -12V 0WS +12V GND SMEMW SMEMR IOW IOR DACK3 DRQ3 DACK1 DRQ1 REF CLK IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 DACK2 TC ALE +5V OSC GND
D18 C18
I/O CH CK D7 D6 D5 D4 D3 D2 D1 D0 I/O CH RDY AEN A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
SBHE LA23 LA22 LA21 LA20 LA19 LA18 LA17 MEMR MEMW SD08 SD09 SD10 SD11 SD12 SD13 SD14 SD15
Abb. 21.2: Der ISA-Busslot weist einen separaten Abschnitt mit den 38 neuen Kontakten für die Erweiterung auf 16 Bit auf.
Wie beim PC/XT ist ein großer Teil des Systembus an die Busslots geführt. Die ISA-Busslots weisen gegenüber dem PC-Busslot 36 neue, also insgesamt 98 Kontakte auf, um die zusätzlichen Adress-, Daten-, DMA- und IRQ-Leitungen aufzunehmen. Die zusätzlichen AT-Kontakte sind in einem separaten Abschnitt untergebracht, der sich jeweils unmittelbar neben dem Slot mit den bisherigen PC-Kontakten befindet. Auch hier ist es völlig unerheblich, in welchen Slot Sie eine Steckkarte einsetzen, Sie müssen nur darauf achten, dass Sie eine ISA-Karte – die Sie an den zusätzlichen Kontakten auf der Unterseite erkennen – auch in einen ISA-Slot und nicht in einen PC-Slot einsetzen. PC-Karten passen demgegenüber selbstverständlich auch in einen ISA-Slot, ohne dabei natürlich die hinzugekommenen AT-Bus-Signale nutzen zu können. In Abbildung 21.2 sehen Sie den Aufbau und die Belegung eines ISA-Busslots.
Sandini Bib 720
Kapitel 21
In den folgenden Abschnitten möchte ich Ihnen die Kontakte und die Bedeutung der ISA-Bussignale erläutern, was auch die Signale des PC-Bus beinhaltet, die daher zunächst an der Reihe sind.
21.4.1 PC-Bus-Signale des ISA-Bus Einige Signalfunktionen des PC-Bus haben sich beim Übergang auf den ISA-Bus verändert. Dazu gehört der Kontakt B8, der beim PC-Bus als reserviert gekennzeichnet ist und dort mitunter für herstellerspezifische Funktionen zum Einsatz kommt. Beim ISA-Bus wird er hingegen als OWS (ZerO Wait States) bezeichnet. Außerdem ist DACK0 (B19) vom PC-Bus in REF umbenannt worden, weil es für den Speicher-Refresh zuständig ist. Weil der ISA-Bus prinzipiell Busmaster auf externen Adaptern in gewissem Maße unterstützt, sind alle Anschlüsse bidirektional. Um den Daten- und Signalfluss klarer darzustellen, habe ich für die angegebenen Übertragungsrichtungen aber angenommen, dass die CPU (oder eine andere Einheit des Mainboards) den gegenwärtigen Busmaster darstellt. A19–A0 (O) Anschlüsse A12–A31 Diese Kontakte bilden den 20-Bit-Adressbus und geben unmittelbar den Zustand der Adresssignale A19–A0 des Prozessors an oder werden von der DMA-Logik erzeugt. AEN (O) Anschluss A11 Ist das Address-Enable-Signal an diesem Kontakt aktiv, so kontrolliert die DMA-Steuerung den Bus für eine Datenübertragung. Der Prozessor und die anderen Peripherieeinheiten sind vom Bus getrennt worden. ALE (O) Anschluss B28 Das Address-Latch-Enable-Signal ALE wird vom Buscontroller erzeugt und gibt an, dass auf dem I/O-Kanal gültige Adresssignale vorhanden sind. Die Steckkarten können dann die Adresse dekodieren. CLK (O) Anschluss B20 CLK stellt den Systemtakt dar. Im Ur-PC wurde OSC durch drei geteilt, um den Systemtakt mit einer Frequenz von 4,77 MHz zu erhalten. Bei allen folgenden Modellen entspricht dieser Takt in der Regel dem Mainboard-Takt. D7–D0 (I/O) Anschlüsse A2–A9 Die Signale bilden einen 8-Bit-Datenbus für die Übertragung von Daten zu und von den Steckkarten. DACK3–DACK0 (O) Anschlüsse B15, B17, B19, B26 Die vier DMA-Acknowledge-Kontakte werden für die Bestätigung der DMA-Anforderungen DRQ3–DRQ1 und zur Speicherauffrischung (DACK0) verwendet. Erst wenn eine Anforderung DRQx mit einem DACKx bestätigt worden ist, kann die Datenübertragung über den entspre-
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
721
chenden DMA-Kanal erfolgen. Das Signal DACK0 (B19) wurde beim ISA-Bus in REF (refresh) umbenannt, weil es für den Speicher-Refresh zuständig ist. DRQ3–DRQ1 (I) Anschlüsse B6, B16, B18 Über diese DMA-Request-Kontakte kann eine Peripherieeinheit auf einer Steckkarte dem System des Mainboards mitteilen, dass sie Daten über einen der drei DMA-Kanäle übertragen möchte. Der Kanal 0 des DMA-Chips ist auf dem Mainboard mit dem Kanal 1 des Timer-Chips verbunden, um in regelmäßigen Abständen die Speicherauffrischung auszuführen. DRQ0 ist daher nicht in den Busslot herausgeführt. Die Leitungen DRQ3–DRQ1 müssen so lange aktiviert bleiben, bis das entsprechende DACK-Signal aktiv wird, ansonsten wird die DMA-Anforderung ignoriert. I/O CH CK (I) Anschluss A1 Über diesen I/O-Channel-Check-Kontakt geben die Adapter Fehlerinformationen an das Mainboard ab, um z.B. einen Paritätsfehler auf einer Speichererweiterungskarte oder einen allgemeinen Fehler auf einer Steckkarte anzuzeigen. Ein aktives Signal I/O CH CK, d.h. ein Signal mit niedrigem Pegel, löst einen NMI entsprechend Interrupt 2 aus. I/O CH RDY (I) Anschluss A10 Der Kontakt überträgt das I/O-Channel-Ready-Signal von adressierten Einheiten auf einer Steckkarte. Liegt I/O CH RDY auf einem niedrigen Pegel, so verlängert der Prozessor oder DMAChip die Buszyklen, er legt also einen oder mehrere Waitstates ein. IOR (O) Anschluss B14 Das I/O-Read-Signal an diesem Kontakt gibt an, dass der Prozessor oder die DMA-Steuerung Daten lesen möchte und die adressierte Peripherieeinheit Daten auf den Datenbus übergeben soll. Ein aktives IOR entspricht dem aktiven IORC des Buscontrollers 8288, das einen lesenden Zugriff auf den I/O-Adressraum anzeigt. IOW (O) Anschluss B13 Das I/O-Write-Signal an diesem Kontakt gibt an, dass der Prozessor oder die DMA-Steuerung Daten schreiben möchte und die adressierte Peripherieeinheit Daten vom Datenbus übernehmen soll. Ein aktives IOW entspricht dem aktiven IOWC des Buscontrollers 8288, das einen schreibenden Zugriff auf den I/O-Adressraum anzeigt. IRQ2–IRQ7 (I) Anschlüsse B4, B21–B25 Diese Kontakte übertragen die Hardware-Interrupt-Anforderungen entsprechend den Kanälen IRQ2 bis IRQ7 zum PIC auf dem Mainboard. Der Festplattencontroller aktiviert z.B. IRQ5, nachdem er Daten von der Festplatte in einen internen Puffer gelesen hat. Die Leitungen IRQ0 und IRQ1 sind dem Kanal 0 des Timer-Chips bzw. der Tastatur zugeordnet und müssen daher nicht in die Busslots integriert werden.
Sandini Bib 722
Kapitel 21
(S)MEMR (O) Anschluss B12 Durch ein aktives Memory-Read-Signal mit niedrigem Pegel zeigt das Mainbord den Steckkarten an, dass der Prozessor oder die DMA-Steuerung Daten aus dem Hauptspeicher lesen möchte. Ein aktives MEMR entspricht dem aktiven MRDC des Buscontrollers 8288, das einen lesenden Zugriff auf den Speicheradressraum anzeigt. Beim PC-Bus wird das Signal als MEMR, beim ISABus hingegen als SMEMR (Small) zur Unterscheidung gegenüber MEMR (Kontakt C9, siehe unten) bezeichnet. (S)MEMW (O) Anschluss B11 Durch ein aktives Memory-Write-Signal mit niedrigem Pegel zeigt das Mainboard den Steckkarten an, dass der Prozessor oder die DMA-Steuerung Daten in den Hauptspeicher schreiben möchte. Ein aktives MEMW entspricht dem aktiven MWTC des Buscontrollers 8288, das einen schreibenden Zugriff auf den Speicheradressraum anzeigt. Beim PC-Bus wird das Signal als MEMW, beim ISA-Bus hingegen als SMEMW (Small) zur Unterscheidung gegenüber MEMW (Kontakt C10, siehe unten) bezeichnet. OSC (O) Anschluss B30 Der Kontakt überträgt das Taktsignal vom Oszillator mit einer Frequenz von 14.318.180 Hz, das von vielen Einsteckkarten als Takt oder Referenz-Clock verwendet wird. 0WS (I) Anschluss B8 Das Signal von einer Peripherieeinheit an diesem Kontakt zeigt an, dass die Einheit schnell genug arbeitet, um ohne Wartezyklen (ZerO Wait States) auszukommen. Beim PC-Bus ist dieser Kontakt mit reserviert (s.o.) bezeichnet. RESET DRV (O) Anschluss B2 Der Kontakt überträgt ein Rückstellsignal, um das gesamte System beim Einschalten oder einem Hardware-Reset zurückzusetzen. TC (O) Anschluss B27 Hat der Zähler eines DMA-Kanals seinen Endstand erreicht, ist die DMA-Übertragung also abgeschlossen, so liefert der Terminal-Count-Kontakt TC einen Impuls, der das Ende des DMAZyklus anzeigt. Alle anderen Kontakte liegen auf Masse (GND) oder übertragen Versorgungsspannungen für die Chips (+5 V, -5 V) sowie Schnittstellen und Laufwerke (+12 V, -12 V).
21.4.2 Input/Output-Interface Die häufigste Anwendung für den PC-Bus (und eigentlich auch für den ISA-Bus) sind relativ einfach aufgebaute Controller- und I/O-Karten für unterschiedliche Anwendungen, wie sie etwa in der Mess-, Steuer- und Regelungstechnik vorkommen. Hierfür sind Relais und LEDs sowie auch A/D- und D/A-Umwandler anzusteuern, was sich mit einer simplen Interfaceschaltung realisieren lässt, die hier kurz erläutert wird und auch das Signalverhalten noch etwas verdeutlichen mag.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
723
Abb. 21.3: I/O-Interfaceschaltung
Ein I/O-Interface ist für den PC-Bus relativ einfach mit Standard-TTL-Bausteinen aufzubauen. Der I/O-Adressbereich liegt praktisch parallel zum Memory-Bereich, erstreckt sich jedoch von 000h bis lediglich 3FFh (vgl. Tabelle 21.3). Für die Erweiterungskarten steht der I/O-Bereich von 200–3FF zur Verfügung, denn die unteren Adressen werden von den Komponenten des Mainboards verwendet. Es hängt von der Ausstattung des PCs ab, welche Adressen noch frei sind. Der Bereich von 300h–31Fh ist der Bereich der so genannten Prototypkarte, der meist noch für Erweiterungen genutzt werden kann. Mit dem DIP-Schalter (DIP-SWITCH, Abbildung 21.3) wird diejenige Adresse eingestellt, unter der das Interface angesprochen werden soll, also beispielsweise 300h, wofür die Schalter 1 und 2 auf OFF (A9, A8) und alle anderen (A7–A2) auf ON zu setzen sind. Sollte diese Adresse bereits belegt sein, ist man durch den Schalter flexibel und kann auf eine andere freie Adresse im Bereich von 200–3FFh ausweichen. Die festgelegte Adresse ist als Basis-Adresse zu verstehen, denn es werden durch die hier gezeigte Interface-Schaltung insgesamt vier Adressen belegt, da die Adressleitungen A0 und A1 nicht mit in die Dekodierung einbezogen sind. Die vom Programm über den Bus gesendete Adresse wird im Baustein 74LS688 mit der durch den DIP-Schalter eingestellten Adresse verglichen. Sind die Adressen identisch, geht der Ausgang P=Q (Anschlusskontakt 19) auf Low. Dieses Signal wird nachfolgend durch ein als Inverter verschaltetes NAND-Gatter (C) invertiert. Der Vergleich der Adressen liefert nur dann ein Low am Ausgang des 74LS688, wenn er durch ein Low am Eingang G (Pin 1) freigegeben (enabled) ist. Das Signal AEN muss also ebenfalls Low sein, und dies ist bei einer I/O-Operation der Fall. High ist es bei einem DMA-Zyklus, der ja ausgeschlossen werden muss.
Sandini Bib 724
Kapitel 21
Abb. 21.4: Bus-Timing für I/O-Zugriffe
Ist ein Kontakt des DIP-Schalters geschlossen (On), liegt die daran angeschlossene Leitung an der Schaltungsmasse (Ground). Sie weist demnach einen Low-Pegel auf. Die korrespondierende Adressleitung muss für die gültige Adresse dann ebenfalls Low sein. Da die Adressleitungen A0 und A1 nicht dekodiert werden, ist der Baustein 74LS688 im Bereich von 300h–303h aktiviert. Diese beiden Leitungen führen vom PC-Slot direkt zur nachgeschalteten Peripherie. Die Schreibleitung IOW wird mit Hilfe eines NAND-Gatters 74LS00 mit der Leseleitung IOR ODER-verknüpft. Ist eine der beiden Leitungen aktiv (Low), liefert das erste Gatter (A) an seinem Ausgang ein High. Im zweiten NAND-Gatter (B) wird dieses Signal mit dem aus dem Vergleicher-Baustein gelieferten und durch Gatter C invertierten Signal verknüpft (High). Der Ausgang des Gatters B liefert nur dann ein Low, wenn I/O-Schreiben oder -Lesen stattfindet und die gesendete Adresse mit der eingestellten übereinstimmt. Dadurch wird ein so genanntes Chip-Select-Signal (CS) erzeugt, das zum einen zur Peripherie gelangt und zum anderen den Transceiver 74LS245 durchschaltet (Pin 19). Die Richtung der Datenübertragung – ob Daten zum Interface gesendet oder von ihm empfangen werden – wird mit dem Transceiver durch den Eingang DIR (Direction) umgeschaltet. Das IOR-Signal bedient den DIR-Eingang. Ist es Low (aktiv), ist der Transceiver von B nach A geschaltet, und es wird vom Interface gelesen. Im anderen Fall wird geschrieben, der DIR-Eingang ist High. Der Transceiver wird dann von A nach B geschaltet.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
725
21.4.3 Signale der ISA-Bus-Erweiterung Im Folgenden sind die Signale der 16-Bit-Erweiterung näher erläutert. DACK0, DACK5–DACK7 (O) Anschlüsse D8, D10, D12, D14 Die vier (neuen) DMA-Acknowledge-Kontakte werden für die Bestätigung der DMA-Anforderungen DRQ0 und DRQ5–DRQ7 verwendet. Gegenüber dem PC-Bus ist DACK0 durch REF ersetzt worden, weil die Speicherauffrischung beim ISA-Bus hierüber erfolgt. DRQ0, DRQ5–DRQ7 (I) Anschlüsse D9, D11, D13, D15 Über diese DMA-Request-Kontakte kann eine Peripherieeinheit auf einer Steckkarte dem System des Mainboards mitteilen, dass sie Daten über einen der DMA-Kanäle übertragen möchte. Der Kanal 0 des ersten DMA-Chips ist für 8-Bit-Transfers ausgelegt, die drei (neuen) Kanäle 5 bis 7 dagegen für 16-Bit-Übertragungen. Kanal 4 wird für die Kaskadierung der beiden DMA-Chips verbraucht. I/O CS16 (I) Anschluss D2 Das Signal an diesem Kontakt muss von der bereits adressierten ISA-Einsteckkarte auf Low gezogen werden, damit die I/O-Datenübertragung daraufhin in 16-Bit-Breite ausgeführt wird. Die erste Adressierung wird dabei von den Signalen des PC-Bus ausgeführt. Falls I/O CS16 nicht rechtzeitig auf Low gesetzt wird, findet nur ein 8 Bit breiter Datentransfer statt. Entsprechendes gilt für das Signal MEM CS16, das für Speicher- statt I/O-Adressen zuständig ist. IRQ10–IRQ12, IRQ14, IRQ15 (I) Anschlüsse D3–D7 Diese Kontakte übertragen die Hardware-Interrupt-Anforderungen entsprechend den Kanälen IRQ10 bis IRQ12 und IRQ14, IRQ15 zum Slave-PIC auf dem Mainboard. IRQ13 ist beim AT für den Coprozessor reserviert, der sich auf dem Mainboard befindet und somit nicht in den Busslot herausgeführt ist. LA17–LA23 (O) Anschlüsse C2–C8 Die Large-Address-Kontakte übertragen die sieben höherwertigen Bits des CPU-Adressbus. Im Vergleich zu den Adresskontakten A0–A19 des XT-Bus sind die Signale an diesen Kontakten bereits wesentlich früher gültig und können einen halben Bustakt vor den Adressbit A0–A19 dekodiert werden. Zu beachten ist, dass sich LA17–LA19 und A17–A19 in der Bedeutung überschneiden. Dies ist notwendig, weil die Signale auf A17–A19 verriegelt (gelatcht) und dadurch verzögert werden. Für eine rechtzeitige Rückmeldung der Signale MEM CS16 und I/ O CS16 ist es aber notwendig, dass auch die Adresssignale A17–A19 frühzeitig genug zur Verfügung stehen. Weil ISA auch Busmaster auf Erweiterungskarten über einen DMA-Kanal in beschränktem Maße unterstützt, sind alle Adressanschlüsse bidirektional (also auch A0–A19). MASTER (I) Anschluss D17 Das Signal an diesem Kontakt dient dazu, Busmastern auf Steckkarten die Möglichkeit zu geben, den Systembus zu steuern. Sie müssen dazu MASTER aktivieren, d.h. dem Kontakt ein Signal mit niedrigem Pegel zuführen. Beim AT erfolgt die Einbindung eines Busmasters über einen ihm
Sandini Bib 726
Kapitel 21
zugeordneten DMA-Kanal, über den der Busmaster ein DRQx ausgibt. Der DMA-Chip klemmt die CPU über HRQ und HLDA quasi vom Bus ab und aktiviert das dem Busmaster zugeordnete DACKx. Der Busmaster reagiert mit einem aktiven Signal MASTER und übernimmt dadurch die Kontrolle über den Bus. MEM CS16 (I) Anschluss D1 Eine Adapterkarte muss rechtzeitig ein gültiges Signal MEM CS16 zurückgeben, wenn sie mit einer Datenbusbreite von 16 Bits bedient werden will. Durch MEM CS16 können 8- und 16-BitKarten problemlos in einen ISA-Slot eingesetzt werden. Die Buslogik erkennt dann, ob die Steckkarte mit acht oder 16 Bits angesprochen werden muss. MEMR (O) Anschluss C9 Ein aktives Memory-Read-Signal mit niedrigem Pegel zeigt an, dass der Prozessor oder die DMASteuerung Daten aus dem Hauptspeicher mit einer Adresse zwischen 0–16 MByte lesen möchte. Demgegenüber bezieht sich das Signal SMEMR im PC-Slot nur auf den Adressraum zwischen 0 bis 1 MByte. Bei einer Adresse unter 1 MByte ist MEMR inaktiv, also auf einem hohen Pegel. MEMW (O) Anschluss C10 Ein aktives Memory-Write-Signal mit niedrigem Pegel zeigt an, dass der Prozessor oder die DMA-Steuerung Daten in den Hauptspeicher mit einer Adresse zwischen 0–16 MByte schreiben möchte. Demgegenüber bezieht sich das Signal SMEMW im PC-Slot nur auf den Adressraum zwischen 0 bis 1 MByte. Bei einer Adresse unter 1 MByte ist MEMW inaktiv, also auf einem hohen Pegel. SBHE (O) Anschluss C1 Werden von der CPU oder einem anderen Baustein Daten über das höherwertige Byte SD8–SD15 des Datenbus ausgegeben oder eingelesen, ist das System-Bus-High-Enable-Signal aktiv, weist also einen niedrigen Pegel auf. SD8–SD15 (I/O) Anschlüsse C11–C18 Diese acht Systemdatenkontakte bilden das höherwertige Byte des 16-Bit-Datenbus.
21.4.4 16-Bit-Dekodierung und Programmierung Die Dekodierung für eine 16-Bit-ISA-Karte ist im Vergleich zu der Dekodierung für den 8-BitPC-Bus (siehe Kapitel 21.4.2) etwas aufwändiger, wobei das oben erläuterte I/O CS16-Signal eine wichtige Rolle spielt, denn es muss von der bereits adressierten ISA-Einsteckkarte rechtzeitig auf Low gezogen werden, damit die I/O-Datenübertragung daraufhin in 16-Bit-Breite ausgeführt werden kann. Das ist im Übrigen ein Manko recht vieler ISA-Karten im Zusammenspiel mit einigen Mainboards, wenn das Timing zwischen den beiden Einheiten nicht stimmig ausfällt. Ich vermute, dass unzählige 16-Bit-ISA-Karten aus diesem Grunde nur im 8-Bit-Modus arbeiten, zumindest ist mir eine ganze Reihe von derartigen Fällen untergekommen.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
727
Abb. 21.5: 16-Bit-ISA-Interface
Die bereits bekannte Adressenvergleicherstufe mit dem Typ 74LS688 (vgl. Abbildung 21.3) ist für den 16-Bit-Bus in diesem Beispiel (vgl. Abbildung 21.5) zweimal ausgeführt und erlaubt daher auch eine vollständige Dekodierung des I/O-Adressraumes. Zur Signalverknüpfung beider Ausgänge kommt hier der Typ 74LS32 – ein OR-Gatter – zum Einsatz. Außerdem wird hier die gleiche Verknüpfung der Steuerleitungen mit Hilfe von NOR-Gattern (74LS02) wie im Beispiel aus Kapitel 21.4.2 verwendet und zweimal der Transceiver 74LS245. Die Programmierung einer I/O-Übertragung ist unter DOS mit den bekannten, älteren Programmierhochsprachen wie QBasic, Turbo Pascal und den verschiedenen C-Dialekten kein Problem, zumal diese hierfür extra Befehle mitbringen. Um etwa mit Microsoft C auf einen I/O-Port zu schreiben, lautet der allgemeine Befehl OUTP (addr, data), und um einen Wert von einer I/O-Adresse zu lesen, dementsprechend data:=INP(addr). In Turbo Pascal ist stattdessen PORT[addr]:=data und data:=PORT[addr] anzuwenden. Zu beachten ist dabei, dass es auch spezielle Befehle für einen 16-Bit-breiten Zugriff gibt, beispielsweise PORTw statt nur PORT in Turbo Pascal. Dass diese Art der Programmierung mit Windows aus der Mode gekommen ist und ab Windows NT (demnach auch bei Windows 2000 und Windows XP) keine direkten I/OZugriffe mehr möglich sind, ist wohl bekannt, so dass im Kapitel Windows-Hardware-Programmierung gezeigt wird, wie dies zu bewerkstelligen ist.
Sandini Bib 728
Kapitel 21
21.5 ISA-Plug&Play Als PCI auf den Plan trat (ca. 1993) war noch der ISA-Bus das beherrschende Bussystem, und eine Vielzahl von Einsteckkarten waren nicht als PCI-Versionen erhältlich, wie es bei spezielleren Karten auch heute noch vorkommt. Aus diesem Grunde wurde von Intel und Microsoft ISAPlug&Play entwickelt, um somit auch ISA-Karten einen automatischen Konfigurationsmechanismus zu verleihen. Die Festlegung der durch die ISA-Karten zu verwendenden Ressourcen erfolgt in vielen Fällen mit Hilfe von Jumpern oder DIP-Schaltern, wie es zuvor erläutert wurde. Es existieren jedoch auch ISA-Einsteckkarten, die sich per Software konfigurieren lassen. Vereinfacht ausgedrückt, werden in diesen Applikationen die Schalterstellungen einfach durch ein Latch (74LS373) oder einen Registerbaustein (D-Flip-Flop, 74LS374) ersetzt. Durch einen Softwaretreiber, der sich üblicherweise in der Datei CONFIG.SYS befindet, werden die zuvor – per Installationsprogramm – festgelegten Daten dann in das Latch geschrieben und gelten damit bis zum nächsten Bootvorgang für die entsprechende Karte. Dieses Verfahren wird insbesondere bei Soundkarten häufig angewendet. Eine automatische Konfigurierung der verschiedenen PC-Karten ist damit jedoch kaum möglich, da das herstellerspezifische Installationsprogramm keine zuverlässige Information darüber erhalten kann, welche Ressourcen (I/O, IRQ, DMA) des PCs bereits belegt sind und welche nicht. Wie die typischen Diagnoseprogramme auch – beispielsweise Microsoft Diagnostic (MSD) – kann das betreffende Installationsprogramm nur versuchen, die noch freien Ressourcen zu ermitteln, was mehr oder weniger gut funktioniert, da die (alten) ISA-Karten keinen allgemein gültigen Mechanismus bieten, der die tatsächlich festgelegten Schalterstellungen ermitteln und auch feststellen kann, von welcher Karte welche Ressourcen belegt werden. Diese Datenermittlung kann nur anhand von Treibereinträgen wie in der AUTOEXEC.BAT, der CONFIG.SYS oder den INI-Dateien durchgeführt werden, wie es die erwähnten Installations- und Diagnose-Programme praktizieren, wobei diese Einträge nicht zwangsläufig mit den gejumperten Einstellungen übereinstimmen müssen. Zur Implementierung eines automatisch stattfindenden Konfigurierungsmechanismus von ISAKarten bedarf es daher eines standardisierten Verfahrens, ohne dass dabei – aus Kompatibilitätsgründen – elektrische Änderungen am ISA-Bus oder zusätzliche Signale nötig sind. Intel und Microsoft haben hierfür ISA-Plug&Play entwickelt, das auf den einzelnen Karten einerseits eine spezielle Hardware und andererseits ein Plug&Play-BIOS und/oder ein Plug&Play-fähiges Betriebssystem voraussetzt. Eine konventionelle ISA-Karte – auch als Legacy ISA bezeichnet – kann daher nicht einfach ohne Änderungen des ISA-Interfaces für ISA Plug&Play verwendet werden. Leider ist der Begriff Plug&Play nicht geschützt, so dass am Markt eine Vielzahl von Einsteckkarten existiert, die zwar diese Bezeichnung führen, aber keineswegs dem Intel/Microsoft-Standard gehorchen. Diese Karten werden lediglich ohne Jumper oder DIP-Schalter wie oben beschrieben auf herstellerspezifische Art und Weise konfiguriert und haben im Prinzip nichts mit dem Intel/ Microsoft-Standard gemein. Das erste Betriebssystem, das ISA-Plug&Play standardmäßig unterstützt, ist Windows 95. Da weder Intel noch Microsoft erwarten konnten, dass die Anwender ihren konventionellen PC, der eben nicht über ein Plug&Play-BIOS verfügt und auch übliche ISA-Karten verwendet, sofort ersetzen würden, musste in Windows 95 selbst eine eigene Plug&Play-Funktionalität implementiert werden.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
729
Generell bedient sich Windows 9x zur Ermittlung der PC-Ressourcen und Hardwarekonfigurierung einer Reihe verschiedener Methoden wie auch der Analyse der Konfigurationsdateien und führt eine interne Datenbank für gebräuchliche, konventionelle ISA-Karten mit voreingestellten Werten, die wiederum nicht mit den tatsächlich festgelegten Werten übereinstimmen müssen, so dass hier möglicherweise manuelle Änderungen für die betreffenden Karten in der Systemsteuerung nötig sind. Mit ISA-Plug&Play-Karten ist dies bei Windows 9x in der Regel nicht notwendig, denn das Betriebssystem erkennt beim Bootvorgang, unabhängig davon, ob der PC nun über ein Plug&Play-BIOS verfügt oder nicht, die vorhandenen ISA-Plug&Play-Karten und verwaltet die PC-Ressourcen daraufhin konfliktfrei. Plug&Play-BIOS bedeutet in diesem Zusammenhang, dass das BIOS explizit ISA-Plug&Play-Devices unterstützen muss, denn da ISAPlug&Play zeitlich nach PCI entwickelt wurde, gibt es durchaus BIOS-Versionen, die zwar den Begriff Plug&Play führen – allerdings gilt dies ausschließlich für PCI, und ISA-Plug&Play-Karten werden dann nicht erkannt.
21.5.1 Der Konfigurationsmechanismus ISA-Plug&Play, wie es Microsoft und Intel definiert haben, musste nachträglich in das ISA-Konzept eingebracht werden, ohne dass es zu Schwierigkeiten mit dem üblichen Aufbau eines ISAPCs führte. Es wurden hierfür drei zusätzliche Register von jeweils 8 Bit Breite definiert, über die die gesamte Plug&Play-Konfigurierung absolviert wird und die so gewählt worden sind, dass es keine Kollision mit bereits standardmäßig verwendeten Registern geben kann. Wenn Sie den Konfigurationsmechanismus von ISA-Plug&Play mit dem von PCI vergleichen, werden Sie sicher feststellen, dass er weit komplexer und auch etwas undurchsichtiger erscheint, was sicher als Tribut an bestehende ISA-Systeme zu sehen ist. Port-Name
Adresse
übliche ISA-Funktion
Typ
Address Write-Data Read-Data
0279h 0A79h 0203–03FFh
Printer-Status-Port Printer-Status-Port + 0800h verschiedene
W W R
Tab. 21.6: Die Register für die Konfigurierung von ISA-Plug&Play-Karten
Alle ISA-Plug&Play-Karten verwenden zur Konfigurierung ausschließlich diese drei Register. Der Printer-Status-Port, wie er bei ISA benutzt wird, und die um 800h höhere Adresse werden für Plug&Play als Schreibregister verwendet, so dass Kompatibilitätsprobleme vermieden werden. Um die Daten der Plug&Play-Karte lesen zu können, wird eine als frei erkannte Adresse im Bereich 0203h–03FFh ausgewählt. Bei aktuelleren Mainboards wird diese Adresse quasi vom Hersteller vorgegeben (typischerweise 273h), während sie bei den älteren Modellen erst durch die Software ermittelt werden muss, was bei den neueren Modellen auch dann erfolgt, wenn sie sich als bereits belegt erweisen sollte. Dieser Vorgang wird automatisch durch das Plug&PlayBIOS und Windows 9x ausgeführt. Über den Address-Port wird das jeweilige interne Plug&Play-Register selektiert, damit anschließend Daten zum Write-Data-Port geschrieben oder Daten vom Read-Data-Port gelesen werden können. Jede Plug&Play-Karte verfügt über drei Registersätze: Card Control, Logical Device Control und Logical Device Configuration. Über die Card-Control-Register werden globale Funktionen für die Steuerung der Karte festgelegt. Die Logical-Device-Control-Register sind für jedes logische Gerät einmal vorhanden und bestimmen, ob der betreffende Schaltungsteil (z.B. bei Multifunktionskarten) für den ISA-Bus aktiv ist. Außerdem dienen sie zur Überprüfung eines I/O-Konflikts. Die Logical-Device-Configuration-Register sind ebenfalls für jedes logische Gerät einmal vor-
Sandini Bib 730
Kapitel 21
handen und bestimmen die Speicher-, I/O-, Interrupt- und DMA-Einstellungen. Es sind ebenfalls einige herstellerspezifische Register möglich, die es den Herstellern erlauben, eigene Funktionen über den Plug&Play-Mechanismus zu integrieren.
Abb. 21.6: Der logische Aufbau des ISA-Plug&Play-Interface Adresse/Hex
Funktion
0x00–0x07 0x08–0x1f 0x20–0x2f 0x30–0x31 0x32–0x37 0x38–0x3f 0x40–0x75 0x76–0xef 0xf0–0xfe 0xffF
Card Control (einmal für jede Karte) Card Level (reserviert) Card Level (herstellerspezifisch) Logical Device Control (einmal für jedes logische Gerät) Logical Device Control (reserviert) Logical Device Control (herstellerspezifisch) Logical Device Configuration (einmal für jedes logische Gerät) Logical Device Configuration (reserviert) Logical Device Configuration (herstellerspezifisch) reserviert
Tab. 21.7: Die ISA-Plug&Play-Register
Eine ISA-Plug&Play-Karte stellt sich – je nach Typ – als ein oder mehrere Logical Devices dar. Die Logical Devices enthalten wiederum verschiedene physikalische Devices, für die entsprechende PC-Ressourcen zu konfigurieren sind. Die Initialisierung einer ISA-Plug&Play-Karte läuft im mehreren Schritten ab, wobei sie sich immer in einem von vier Zuständen befindet:
:
Wait For Key State
Nach einem Reset des PCs oder einem Wait-For-Key- oder auch Reset-Kommando befindet sich jede Karte zunächst im Wait-For-Key-State. Solange nicht der Initiation-Key über den ISA-Bus empfangen worden ist, sind die Karten nicht aktiv und können nicht selektiert werden. Nach einer erfolgreich verlaufenen Konfigurierung wird von jeder Karte wieder der Wait-For-KeyState eingenommen, und sie ist nunmehr einsatzbereit.
:
Sleep State
In diesem Status warten alle Karten auf das Wake[CSN]-Kommando. Mit Hilfe dieses Kommandos kann dann jede Plug&Play-Karte selektiv über die ihr zugeordnete Card-Select-Number
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
731
(CSN) angesprochen werden, woraufhin sie entweder in den Isolation- oder den Config-State schaltet. Alle Karten, die noch keine CSN erhalten haben, schalten nach dem Empfang des Wake[CSN]-Kommandos, das eine Null überträgt, in den Isolation State. Wenn die Schreibdaten des Wake[CSN]-Kommandos ungleich Null sind, also einer gültigen, vergebenen Card-SelectNumber entsprechen, wechselt die betreffende Karte in den Config-State.
:
Isolation State
Im Isolation State antworten die Karten auf die Lesezugriffe auf das Serial-Isolation-Register (Isolation Protocol). Wenn eine Karte daraufhin isoliert ist, erhält sie eine eigene Card Select Number, mit der sie dann über das Wake[CSN]-Kommando selektiert werden kann. Nach dem Schreiben der CSN geht die betreffende Karte in den Config-State.
:
Config State
Befindet sich eine Karte im Config-State, wobei immer nur jeweils eine Karte auf einmal diesen Zustand einnehmen kann, antwortet sie auf alle Konfigurationskommandos, erlaubt auch das Auslesen ihrer Ressource-Daten und kann programmiert werden.
Abb. 21.7: Eine ISA-Plug&Play-Karte befindet sich immer in einem von vier Zuständen. Der Konfigurationsprozess erfolgt über den Wait-For-Key-, Sleep-, Isolation- und Config-Status. Ist die Karte daraufhin aktiviert, befindet sie sich wieder im Wait-For-Key-State. Der Ablaufplan zeigt alle gültigen Kommandos und Operationen, mit denen eine Karte entsprechend zu programmieren ist.
Nach dem Einschalten des PCs erfolgt ein Reset durch das entsprechende Signal des ISA-Bus. Alle ISA-Plug&Play-Karten setzen ihre CSN auf Null und gehen in den Wait-For-Key-Status. Eine Verzögerung von typisch 2 ms ist dabei nach dem Reset zu berücksichtigen, damit die Kar-
Sandini Bib 732
Kapitel 21
ten ihre Daten aus dem EEPROM lesen können. Als Nächstes wird ein so genannter Initiation Key über den Write-Data-Port (0a79h) gesendet, der aus 32-I/O-Schreibsequenzen besteht und genau die folgenden Daten enthalten muss. Initiation Key: 6A, DF, B0, E8,
B5, 6F, 58, 74,
DA, 37, 2C, 3A,
ED, 1B, 16, 9D,
F6, 0D, 8B, CE,
FB, 86, 45, E7,
7D, C3, A2, 73,
BE, 61, D1, 39
Die Daten des Initiation Key sind nicht etwa zufälliger Natur, sondern es handelt sich dabei um die fortlaufenden Ergebnisse der Berechnung eines binären Polynoms. Aus diesem Grunde ist es äußerst unwahrscheinlich, dass diese Bytefolge einmal unabsichtlich entsteht und zu einem Fehler bei der Kartenkonfiguration führt oder auch andere Systemprobleme hervorrufen kann.
21.5.2 Linear Feedback Shift Register Das Linear Feedback Shift Register (LFSR) ist Bestandteil eines jeden Plug&Play-Chips und für die Initialisierung der Karte zuständig. Es generiert einerseits Daten für das Initiation-Key-Protokoll und dient andererseits, während der Ausführung des Isolation-Protokolls, zur Überprüfung auf eine korrekte Checksumme. Die empfangenen Daten des Initiation Key werden intern mit denen des vom 8-Bit-LFSRegisters erzeugten Wertes verglichen. Um sicherzugehen, dass sich das LFSR im Grundzustand befindet, sind vor dem Senden des Initiation Key zunächst zwei Schreiboperationen (mit 0x00) auf den Address-Port auszuführen. Danach enthält das LFSR den Wert 6ah, der auch dem ersten gesendeten Wert des Initiation Key entspricht. Die beiden letzten Bits des Schieberegisters (1, 0) gelangen auf ein Exklusiv-Oder-Gatter, das daraus nunmehr eine 1 liefert. (Das Exklusiv-Oder-Gatter liefert nur dann eine 0 am Ausgang, wenn die Eingangssignale 0, 0 oder 1, 1 lauten). Die 1 wird an die Bitposition 7 gesetzt und einmal nach rechts geschoben. Dieser Vorgang (LFSR[1] XOR LFSR[0]) wird danach noch weitere 31-mal ausgeführt, und das LSFR sollte am Ende dieses Vorgangs den Wert 39h enthalten, was dazu führt, dass die Karte in den Sleep-Status wechselt. Andernfalls nimmt das LFSR wieder den ursprünglichen Wert (6Ah) ein, was bedeutet, dass die Karte nicht angesprochen werden kann und weiterhin im Wait-For-Key-Status verharrt. Der Übergang vom Sleep-Status in den nächsten Zustand (Isolation) erfolgt daraufhin mit der Befehlsfolge Wake=0 AND CSN=0 durch zwei Schreibzugriffe auf die entsprechenden Register (0x03, 0x06 auf den Address-Port, 0279h).
Abb. 21.8: Das Linear Feedback Shift Register während der Ausführung des Initiation-Key-Protokolls.
Jede Plug&Play-Einheit besitzt einen 72 Bit langen Serial Identifier, der sich aus einer 4 Byte langen Herstellerkennung (Vendor ID), einer 4 Byte langen Serial-Number und einer 8 Bit langen Checksumme zusammensetzt. Die Vendor-ID wird üblicherweise zentral vergeben, so dass es keine zufällige Übereinstimmung bei verschiedenen Firmen geben kann. Für die Serial Number ist der Hersteller der Karte verantwortlich, der diese Nummer selbst vergeben kann.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
733
Jede einzelne Karte einer Produktreihe muss dabei eine individuelle Nummer erhalten, damit z.B. auch zwei Karten des gleichen Typs wie etwa zwei Schnittstellenkarten in einem PC verwendet werden können. Die zweite Aufgabe des LFSRs besteht in der Berechnung der Checksumme für den Serial Identifier, der sich neben allen anderen für die Karte geltenden Ressource-Daten im EEPROM auf der Karte befindet. Nur wenn die durch das LFSR berechnete Checksumme mit der im EEPROM abgelegten übereinstimmt, kann das Isolation-Protokoll korrekt ausgeführt werden, und die Karte gelangt daraufhin auch in den gewünschten Configuration State.
Abb. 21.9: Der Aufbau des Serial Identifiers, der durch das LFSR geschoben wird
Der Serial-Identifier wird durch das LFSR verarbeitet, wie es in Abbildung 21.9 zu erkennen ist. Nach dem Empfang der erwähnten Befehlsfolge Wake=0 AND CSN=0 wird das LFSR auf 6ah zurückgesetzt. Das erste Bit des Serial-Identifiers (Vendor-ID) wird auf den einen Eingang des ersten XOR-Gatters gelegt (z.B. 1). Die unteren Bits von 6ah liefern eine 1 am Ausgang des zweiten XOR-Gatters und bilden das zweite Eingangssignal für das erste XOR-Gatter (1). Da beide Eingangssignale einer 1 entsprechen, erscheint am Ausgang eine 0, die nach einmaligem Rechtsschieben (Lese-Zugriff auf das Serial Isolation Register) in das Bit LFSR[7] wandert. Nun findet der gleiche Prozess für die weiteren Bits des Serial- Identifiers statt, und nach insgesamt 64-maliger (Länge des Serial-Identifiers = 64 Bit) paarweiser Lese-Prozedur steht im LFSR die ermittelte Checksumme, die für die Verarbeitung des Isolation-Protokolls benötigt wird.
Abb. 21.10: Die Checksummen-Berechnung mit dem LFSR bei der Ausführung des Isolation-Protokolls
21.5.3 Isolation-Protokoll Das Isolation-Protokoll sorgt für die Isolierung der einzelnen Plug&Play-Karten und weist ihnen jeweils eine Card-Select-Number (CSN) zu, über die sie nachfolgend einzeln zu selektieren sind. Gelesen werden die Daten vom Read-Data-Port, dessen Adresse irgendwo im Bereich von 203– 3ffh liegen kann. Wichtig ist dabei, dass die beiden letzten Bits dieser Adresse immer 11b lauten müssen, denn andernfalls kann die Dekodierungslogik der Plug&Play-Karten den gewünschten Port nicht zuweisen. Er wird über den Befehl Set-RD-Data-Port (0x00 auf den Address-Port, 0279h), gefolgt von der Adresse über den Write-Data-Port (0a79h), im Isolation-Status, festgelegt. Danach wird der Befehl Serial Isolation (Adresse: 0x01) abgesetzt, und es findet ein Lesezugriff auf den festgelegten Read-Data-Port (z. B. 0203h, 0213h, 0273h) statt. Es hängt nun vom Aufbau des Serial-Identifiers (ID) der einzelnen Plug&Play-Karten ab, in welcher Reihenfolge sie erkannt und selektiert werden.
Sandini Bib 734
Kapitel 21
Das nächste Bit der Karten-ID ist 1: Die Karte(n) liefert bzw. liefern bei der folgenden geradzahligen Leseoperation den Wert 55h, bei der nächsten ungeradzahligen Leseoperationden Wert aah. Das nächste Bit der Karten-ID ist 0: Die betreffende(n) Karte(n) antwortet bzw. antworten nicht und überwacht bzw. überwachen bei den beiden folgenden Leseoperationen lediglich die unteren zwei Bits des Datenbus. Sie detektieren somit, was die anderen Karten im System signalisieren. Erscheinen die Werte 01b und 10b – die unteren Bis von 55h bzw. aah –, schaltet die Karte ab (Sleep-Modus) und scheidet aus dem weiteren Wettbewerb aus. Generell gilt in einem laufenden Wettbewerb, dass diejenige Plug&Play-Karte gewinnt, deren ID an der Stelle eine 1 enthält, bei der die anderen eine 0 führen. Die noch am Wettbewerb beteiligten Karten setzen im nächsten Schritt ihren internen Zähler auf das zweite Bit der ID, und der Vorgang wiederholt sich so lange, bis alle 72 Bit der ID (inklusive der Checksumme, die dabei überprüft wird) abgearbeitet sind. Nach jeder Runde bleibt eine einzige Karte übrig, die vom System eine CSN erhält und aus dem weiteren Wettbewerb (erfolgreich) ausscheidet. Der Identifizierungsvorgang findet daraufhin erneut statt, bis letztendlich alle im System vorhandenen Karten eine CSN erhalten haben. Der Identifizierungsprozess wird immer einmal mehr durchlaufen, als Karten im PC eingebaut sind. Dass keine weitere Karte vorhanden ist, wird ganz einfach daran erkannt, dass keine Antwort mehr auf die paarweisen Lesezugriffe erscheint. In Kurzform stellt sich die gesamte Initialisierung wie folgt dar:
: : :
:
: :
Senden des Initiation-Key über den Write-Data-Port (0a79h). Alle Karten gehen dadurch vom Wait-For-Key- in den Sleep-Status. Befehlsfolge Wake=0 AND CSN=0 mit Hilfe der entsprechenden Register (0x03, 0x06) senden. Die Karten befinden sich daraufhin im Isolation-Status. Den Befehl Set-RD-Data-Port (0x00) auf den Address-Data-Port (0279h) und die gewünschte Read-Data-Address nachfolgend aus dem Bereich 0203–03FFh über den Write-Data-Port (0a79h) senden. Der Wert für die Read-Data-Address entspricht dabei den Bits 9–2, während die Bits 1–0 stets auf 11b und die Bits 15–12 auf 0000b festgelegt sind (hardwired). Alle Karten verwenden die angegebene Adresse daraufhin als Read-Data-Port. Falls die gewählte Adresse von einer Standard-ISA-Karte verwendet wird, kann das Isolation-Protokoll nicht ausgeführt werden, und es ist dann eine neue Adresse für Read-Data-Address festzulegen. Ausführen des Isolation-Protokolls: Zunächst den Befehl Serial Isolation (0x01) senden und dann 144 Byte-Lesezugriffe auf den Read-Data-Port anwenden. Ist eine Karte selektiert, wird die CSN in das Register 0x06 (Card Select Number) geschrieben. Über den Befehl Wake[CSN] (0x03) wird die betreffende Karte dann selektiert und befindet sich nachfolgend im ConfigStatus. Dieser Vorgang wird für alle im PC integrierten ISA-Plug&Play-Karten wiederholt. Im Config State ist der Zugriff auf die Register der Karte möglich, und es können beispielsweise deren Status und Ressourcen ausgelesen werden, während die eventuell vorhandenen weiteren Karten sich im Sleep-Modus befinden. Über den Befehl Active (Register 0x30, Logical Device Control) oder auch einen Schreibbefehl auf das Bit 1 (High) des Configuration-Control-Registers (0x02) wird die Karte aktiviert und geht wieder in den Wait-For-Key-Zustand. Sie ist jetzt einsatzbereit.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
735
21.5.4 ISA-Plug&Play-Register In den vorangegangenen Kapiteln wurden Register und Adressen erwähnt, über die jede ISAPlug&Play-Karte verfügen muss. Einige davon wirken bei einem Schreibzugriff direkt als Kommando wie beispielsweise Serial Isolation (0x00). Tabelle 21.7 zeigt eine Übersicht, und Abbildung 21.11 dient zur Verdeutlichung. Je nach Komplexität der Plug&Play-Karte kann sie ein oder auch mehrere Logical-Devices beinhalten und mehr oder weniger PC-Ressourcen (I/O, IRQ, Memory, DMA) beanspruchen.
Abb. 21.11: Die Organisation der Resource-Daten und des Serial Identifiers
Card Control Register Set_RD_Data_Port: 00h Das Register kann lediglich beschrieben werden, was auch nur im Isolation State zulässig ist. Die Bits 7–0 enthalten die Adressbits 9–2 des Datenlese-Registers (Read-Data-Port). Serial Isolation: 01h Das Register kann nur gelesen werden, und ein Zugriff auf eine Karte, die sich im Isolation State befindet, bewirkt, dass deren Daten gelesen werden können. Falls das Isolation-Protokoll nicht durchführbar ist, geht die Karte in den Sleep-State. Configuration Control: 02h Ein Schreib-/Lese-Register mit drei Kommandos, die jeweils mit einer 1 aktiviert werden. Die anderen Bits (3–7) haben keine Bedeutung und müssen jeweils eine 0 enthalten.
Sandini Bib 736
Kapitel 21
Bit 0: Reset Bit, Zurücksetzen (Reset) aller Kartenregister, wobei die CSN erhalten bleibt. Bit 1: Die Karte wird in den Wait-For-Key-Zustand versetzt, wobei die CSN und die Registerwerte nicht verändert werden. Bit 2: Reset CSN, die CSN wird auf 0 gesetzt. Wake [CSN]: 03h Hier ist nur ein Schreibzugriff möglich, der die Karte aus dem Sleep-Status in den Isolation-Status versetzt, wenn die Daten (0) mit der CSN der Karte übereinstimmen. Falls die Daten nicht 0 sind, geht die Karte stattdessen vom Sleep- in den Configuration- Status. Resource Data: 04h Ein Leseregister, das die Resource-Daten des Devices (EEPROM) liefert. Zwischen jedem Lesezyklus muss überprüft werden, ob das Status-Register im Bit 0 eine 1 enthält, damit die nachfolgenden Daten verfügbar sind. Status: 05h Das Register kann nur gelesen werden und liefert im Bit 0 eine 1, wenn das nächste Byte der Ressource-Daten verfügbar ist. Card Select Number: 06h Ein Schreibzugriff setzt die CSN für die Karte, die daraufhin mit dem Wake[CSN]-Kommando zu selektieren ist. Logical Device Number: 07h Dieser Registerinhalt spezifiziert das betreffende logische Device. Eine Plug&Play-Karte – oder ein entsprechender Plug&Play-Chip – kann mehrere Logical Devices enthalten. Die Selektierung erfolgt über dieses Register, und falls nur ein Logical Device vorhanden ist, enthält dieses Register eine 0. Reserved Card Level Register: 08h–1Fh Die Register sind für zukünftige Plug&Play-Entwicklungen reserviert. Vendor Defined Card Level Register: 20h–2Fh Diese Register können für herstellereigene Funktionen verwendet werden und werden nicht in der Spezifikation definiert.
Logical Device Control Register Die folgenden Register sind für jedes logische Gerät einmal vorhanden. Active: 30h Das Schreib-/Lese-Register aktiviert mit einer 1 im Bit 0 das Logical Device, während der Inhalt der Bits 7–1 keine Bedeutung hat. Vor dem Aussenden dieses Kommandos muss das I/O Range Check Register deaktiviert werden. I/O Range Check: 31h Dieses Register wird zur Überprüfung eines I/O-Konflikts mit einer Standard-ISA-Karte verwendet und ist optional. Die Bits 7–2 enthalten stets eine 0. Bei gesetztem Bit 1 wird die Überprüfung ausgeführt, die nur bei nicht aktivem Gerät (Active-Register-Bit 0 = 0) möglich ist. Wird das
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
737
Bit 0 auf 1 gesetzt, antwortet das Logical Device mit 55h bei einem Lesezugriff auf den verwendeten I/O-Bereich. Ist das Bit 0 hingegen auf 0 gesetzt, wird AAh zurückgegeben. Alle überprüften Adressbereiche, die bereits verwendet werden, liefern bei einem Lesezugriff 55h, gefolgt von AAh. Bei einem festgestellten Konflikt ordnet die Plug&Play-Software dem Logical Device eine neue I/O-Adresse zu. Reserved For Future Use: 31h–37h Diese Register sind für zukünftige Funktionen vorgesehen. Vendor Defined Logical Device Control Register: 38h–3Fh Herstellerspezifische Funktionen können mit diesen Registern festgelegt werden.
Logical Device Configuration (Resource Data) Die folgenden Register (40–5Fh) beziehen sich auf eine 8- oder 16-Bit-Speicherkonfiguration. Ab der Adresse 76h sind die Register für eine 32-Bit-Verarbeitung lokalisiert. In Anbetracht der Tatsache, dass übliche ISA-Plug&Play-Karten – wenn überhaupt – lediglich einen mit 8 oder 16 Bit organisierten Speicherbereich verwenden können, wird hier auf die Beschreibung der 32-BitAuslegung verzichtet, die nur für EISA-Plug&Play-Karten von Bedeutung ist, die jedoch meines Wissens nie auf dem Markt erschienen sind. Memory Base Address [23:16], 40h Falls das logische Gerät über die Funktionalität eines Speicherzugriffs verfügt, werden in diesem Register die Bits 23–16 der Memory-Base-Adresse angegeben. Andernfalls enthalten alle Bits jeweils 0. Memory Base Address [15:8], 41h An dieser Stelle werden die unteren Bits für die Memory-Base-Adresse (siehe oben) festgelegt. Memory Control, 42h Das Bit 0 legt mit einer 1 fest, dass der Registerinhalt der beiden Upper-Limit-Address-Register als oberes Limit der Adressen zu verstehen ist. Andernfalls (Bit 0 = 0) wird der Inhalt dieser Register als gültige Speicherbereichslänge (Range Length) interpretiert. Das Bit 1 dient der Festlegung, ob der Speicher in 16-Bit-Breite (1) oder 8-Bit-Breite (0) verwendet werden soll. Für die Verarbeitung von 32-Bit-Speicher dienen die Register ab der Adresse 76h. Memory Upper Limit Address [23:16], 43h Die oberen Bits (23–16) für den Maximalwert (Upper Limit) des zu verwendenden Speicherbereichs werden mit Hilfe dieses Registers festgelegt. Alternativ kann der angegebene Wert – wenn der Plug&Play-Baustein dies explizit unterstützt – auch als Speicherbereichslänge verstanden werden. Memory Upper Limit Address [15:8], 44h Die unteren Bits (15–8) für den Maximalwert des zu verwendenden Speicherbereichs werden mit Hilfe dieses Registers festgelegt (siehe oben). Filler: 45h–47h Diese Adressen sind lediglich als Fülladressen vorgesehen, deren Inhalt für die Funktion keine Bedeutung hat.
Sandini Bib 738
Kapitel 21
Memory Descriptor 1: 48h–4Ch Entsprechend den obigen Erläuterungen zur Memory-Konfiguration (Memory Descriptor 0), kann ein Device auch mehrere Speicherbereiche verwenden, was aber eher als Ausnahme gilt. Es gilt für die Speicherbereiche 1–3 die gleiche Registerzuordnung, wie oben erläutert – lediglich die Adressen sind unterschiedlich. Filler: 4Dh–4Fh Memory Descriptor 2: 50h–54Ch Filler: 55h–57h Memory Descriptor 3: 58h–5Ch Filler: 5Dh–5Fh I/O-Port Base Address [15:8]: 60h Dieses Register identifiziert die oberen Bits der zu verwendenden I/O-Basisadresse für das Logical Device. Bei einer 10-Bit-Dekodierung werden die Bits 7–2 nicht verwendet, und die Bits 1–0 bestimmen die Adressbits 9 und 8. I/O-Port Base Address [7:0]: 61h Dieses Register identifiziert die unteren Bits der I/O-Basisadresse. Die Bits 7–3 enthalten die Adressbits 7–3. Falls das logische Gerät nur über acht I/O-Register verfügt, sind die Bits 0–2 ohne Bedeutung. I/O-Port Base Address: 62h–6Fh Entsprechend den zuvor erläuterten Adressen enthalten diese die Basisadressen für die eventuell vorhandenen weiteren logischen Geräte. Nicht verwendete I/O-Port-Base-Adressen sind jeweils Low. Interrupt Request Level Select: 70h Dieses Register legt den jeweiligen Interrupt-Kanal fest, beispielsweise 3h für IRQ3 oder ah für IRQ10. Der IRQ2 wird auf den IRQ9 des zweiten Controllers umgeleitet (Kaskadierung der Interrupt-Controller). Um IRQ2 zu selektieren, ist hier eine 2 festzulegen. Interrupt Request Type: 71h Die Bits 0–1 dieses Registers spezifizieren den Typ und den aktiven Pegel des unter dem Register 70h festgelegten Interrupt-Kanals. Das Bit 0 legt mit einer 0 den Typ Edge und mit einer 1 den Typ Level fest. Der erstere ist der bei ISA-PCs traditionelle Typ, der bei einer ansteigenden Flanke ausgelöst wird. Für Level wird im Bit 1 des Weiteren der aktive Pegel (0=low, 1=high) bestimmt. Alle anderen Bits sind hier ohne Bedeutung. Interrupt Request Level Select: 72h Interrupt Request Type: 73h DMA Channel Select 0: 74h Unterstützt das logische Gerät die DMA-Verarbeitung, wird hier der entsprechende Wert für einen DRQ/DACK-Kanal mit den Bits 0–2 festgelegt. Der Wert 000 entspricht dem DMA-Kanal 0 und 111 dem Kanal 7. Ein Wert von 4 (Kaskadierung) ist anzugeben, wenn keine DMA-Unterstützung gewünscht wird.
Sandini Bib Die 16-Bit-Architektur – ISA-Bus
739
DMA Channel Select 1: 75h Falls das logische Gerät für die DMA-Verarbeitung zwei Kanäle verwenden soll, wird hier der entsprechende Wert für den zweiten DMA-Kanal angegeben. Ein Wert von 4 signalisiert auch hier keine DMA-Unterstützung. Diverse Register für 32-Bit-Memory: 76h–A8h
21.5.5 Der Zugriff auf ISA-Plug&Play-Devices Welchen IRQ-Kanal und welche I/O-Adresse das Plug&Play-Device nach der Initialisierung verwendet, kann entweder mit dem Tool ISOLATE von Intel, mit Windows ab der 95er-Version oder auch mit einem eigenen Programm festgestellt werden. Das folgende kleine Listing zeigt ein einfaches Beispiel für die Kommunikation mit einem Plug&Play-Device, wobei es sich hier um eine Karte mit einem UART vom Typ TL16PNP550 der Firma Texas Instruments handelt. Zu beachten ist dabei, dass die Karte natürlich funktionstüchtig sein muss, d.h., sie wird vom BIOS detektiert, und die Ressource-Daten, die üblicherweise in einem EEPROM auf der Karte abgespeichert sind, entsprechen gültigen Werten, die der Hersteller hierfür entsprechend programmiert hat. Zur Vereinfachung wird hier einmal davon ausgegangen, dass sich nur eine einzige Plug&PlayKarte im PC befindet und dieser daher die CSN=1 zugeordnet werden kann. Dies erspart die Durchführung des Isolation-Protokolls und auch die Ermittlung der Read Data Address, die sich – je nach PC-Ausstattung – auf unterschiedlichen Adressen befinden kann und für einigen Programmieraufwand sorgt. Soll im Anwenderprogramm selbst eine Ressourcenermittlung der Plug&Play-Devices stattfinden, ist hier dann auch die komplette Initialisierung durchzuführen, damit der Zugriff (im Config State) auf die entsprechenden Register (0x60, 0x61, 0x70) möglich ist. Eine Alternative hierzu bietet das Plug&Play-BIOS, beispielsweise über die Funktion 40h (Get PnP E/ISA Configuration Table). PROGRAM ISAPNP;
{ Testprogramm für TL16PNP550 }
VAR N:Integer; Read_Data, CSN, Data:Word; CONST Address: WORD=$279; {Printer Status Port} Write_Data: Word=$A79; {Printer + 800h} Init_Key: Array [1..32] of Byte = ($6A, $B5, $DA, $ED, $F6, $FB,$7D, $BE, $DF, $6F, $37, $1B, $0D, $86, $C3, $61, $B0, $58, $2C,$16, $8B, $45, $A2, $D1, $E8, $74, $3A, $9D, $CE, $E7, $73, $39); Begin {Karte ist ohne Initialisierung im Wait for Key State} {PNPS1=0, PNPS0=0} Port[Address]:=$02; {Reset, zur Sicherheit} Port[Write_Data]:=$07; {Senden des Initiation Key} For N:=1 to 32 do begin Port[Address]:=Init_Key[N]; End; {Karte ist jetzt im Sleep State, PNPS1=0, PNPS0=1} Port[Address]:=$03; {Wake=0} Port[Write_Data]:=$00; {Karte ist jetzt im Isolation State, PNPS1=1, PNPS0=0}
Sandini Bib 740
Kapitel 21
CSN:=1; {hier CSN=1, nur eine Karte} Port[Address]:=$06; {Set CSN Command} Port[Write_Data]:=CSN; {CSN=1} Port[Address]:=$03; {Wake CSN Command} Port[Write_Data]:=CSN; {CSN=1} {Karte ist jetzt im Config State, PNPS1=1, PNPS0=1} Port[Address]:=$02; {Control} Port[Write_Data]:=$02; {Activate} {Karte ist wieder im Wait for Key State} End.
Sandini Bib
22
Der PCI-Bus
Der PCI-Bus löst, technologisch gesehen, alle vorherigen PC-Bussysteme wie EISA, die MCA oder auch den VLB ab. Peripheral Component Interconnect (PCI) verbindet dabei die Vorteile eines schnellen lokalen Bus mit denen der automatischen Konfigurierungsmöglichkeit, was gemeinhin unter dem Begriff Plug&Play firmiert. Der PCI-Bus stellt außerdem das erste plattformübergreifende und standardisierte Bussystem dar, das sowohl in PCs als auch in Power-PCs (Motorola, Apple) und Workstations (z.B. Compaq/DEC Alpha) zum Einsatz kommt. Des Weiteren existieren zwei industrielle Ausführungen des PCI-Bus, die nicht miteinander kompatibel sind: Compact PCI der Industrial Manufacturer´s Group (PICMG) und das weniger verbreitete Industrial-PCI (IPCI) der deutschen Herstellervereinigung SIPS. Wie beim VLB hat man sich bei PCI, wie es auf den üblichen Mainboards realisiert wird, auf die mechanische Slot-Lösung geeinigt, die erstmalig beim MicroChannel verwendet wurde. Die PCISlots befinden sich jedoch nicht hinter dem ISA- oder EISA-Anschluss, sondern bei typischen PCMainboards unmittelbar neben ihnen, oder sie werden an anderer Stelle des Mainboards, abgesetzt von den anderen Slots, positioniert. Wie bereits erwähnt, ist auf einigen neueren Mainboards aber überhaupt kein ISA-Bus mehr als Slot ausgeführt. PCI gilt heute als Standardlösung für Personal Computer, und für Grafikkarten kommt heutzutage meist der Accelerated Graphics Port (AGP) zum Einsatz, der mit einigen Gemeinsamkeiten zu PCI aufwarten kann und im Kapitel 23 näher erläutert wird. Die meisten PCs verwenden die ursprüngliche 32-Bit-PCI-Bus-Implementierung, die sich bei einigen Anwendungen wie Ultra SCSI 160 oder auch Gigabit-Ethernet bereits als Schwachstelle herausstellt, weil mit 32-Bit-PCI und dem hier maximal vorgesehenen Takt von 33 MHz (nur) eine theoretische Datenübertragungsrate von 132 MByte/s zu erreichen ist. Daher ist bereits in der PCI-Spezifikation aus dem Jahre 1994 ein 64 Bit breiter PCI-Bus definiert, der die zusätzlichen Signale an einem gegenüber 32-Bit-PCI verlängerten Slot zur Verfügung stellt. Mit dem hier festgelegten Maximalwert für den Bustakt von 66 MHz ergibt sich damit eine theoretische Datenübertragungsrate von maximal 528 MByte/s. Für die Erläuterungen zum PCI-Bus in den nächsten Unterkapiteln werde ich mich jedoch auf die 32Bit-Implementierung beziehen, soweit nicht explizit etwas anderes angegeben ist. Neuere Erweiterungen des PCI-Bus-Konzeptes wie PCI-X oder auch PCI-Express gehen noch weit darüber hinaus (ca. 10 GByte/s), worauf im Kapitel 22.11 eingegangen wird. Die hier erwähnten Werte für die Datenübertragungsraten gehen stets vom (optimalen) Burst-Mode aus, der generell dadurch gekennzeichnet ist, dass nur einmal die Adresse gesendet wird, woraufhin im Prinzip ein beliebig langer Datenblock (bis zur maximalen Adressierungsgröße) folgen kann, denn Sender und Empfänger erhöhen dabei selbsttätig die Adresse. Dieser Idealfall, bei dem auch nur eine Einheit auf den PCI-Bus zugreift, ist in der Praxis allerdings eher selten gegeben, so dass die tatsächlichen Datenübertragungsraten meist weit darunter liegen. PCI ist laut Spezifikation zwar nicht vom verwendeten Prozessor abhängig; er ist allerdings bei den Mainboards mit Intel- oder kompatiblen Prozessoren in der Regel meist mit dem externen CPU-Takt (Mainboard-, Systemtakt) gekoppelt und arbeitet zu ihm synchron. Es ist demnach eine eindeutige Beziehung zwischen dem Mainboard-, dem CPU- und dem PCI-Bus-Takt gegeben, was maßgebliche Auswirkungen auf die Leistungsfähigkeit eines PC hat. Dies ist insbesondere immer dann zu beachten, wenn der Systemtakt außerhalb der Spezifikation des Boards konfiguriert wird, denn u.U. fällt der PCI-Bus-Takt (und auch der AGP-Takt) bei einem zu hohen Systemtakt ebenfalls zu hoch aus, was dazu führt, dass die Karten dem Timing nicht mehr folgen können und daraufhin den Dienst verweigern.
Sandini Bib 742
Kapitel 22
22.1 PCI-Busstruktur Beim PCI-Bus handelt es sich um einen gemultiplexten Adressen/Datenbus, was bedeutet, dass über dieselben Leitungen die Adressen und nachfolgend die Daten übertragen werden, was mithilfe spezieller Signale (z.B. FRAME, IRDY) gekennzeichnet wird (siehe Kapitel 22.2). Eine wesentliche Eigenschaft des PCI-Konzepts ist die Entkopplung des Prozessor-HauptspeicherSubsystems und des Standarderweiterungsbus wie beispielsweise ISA. In Abbildung 22.1 sehen Sie das Schema des PCI-Bus, wie er auf Mainboards realisiert werden kann.
Abb. 22.1: Der PCI-Bus als wichtigstes Bussystem in einem PC
Die Verbindung zwischen dem Prozessor-Hauptspeicher-Subsystem und dem PCI-Bus stellt eine PCI-Bridge her. Bridges sind für den Benutzer transparente Schnittstellen zwischen zwei Bussystemen (oder auch Netzwerken). Am PCI-Bus hängen nun die einzelnen PCI-Einheiten (auch als PCIAgents oder PCI Devices bezeichnet), wie z.B. SCSI-Host-Adapter, LAN-Adapter, I/O-Einheit und der Grafikadapter (siehe Abbildung 22.1). Im Gegensatz zum VL-Bus können diese Einheiten auf dem Mainboard integriert sein, sie werden aber oftmals auch als Adapter ausgeführt. Eine Klasse von PCI-Einheiten ist die Schnittstelle zum Erweiterungsbus. Das bedeutet, dass der Standarderweiterungsbus – prinzipiell ist es egal, ob dies ISA, EISA oder ein anderes Bussystem ist – hier als PCI-Einheit betrachtet wird. Dadurch kann im Prinzip jedes Bussystem integriert und dem PCIBus nachgeschaltet werden. Insgesamt ist es (theoretisch) möglich, den PCI-Bus mit bis zu zehn PCI-Einheiten zu verbinden. In Abbildung 22.2 sehen Sie den typischen Aufbau einer PCI-Bridge.
Sandini Bib Der PCI-Bus
743
Der lokale Bus zur Host-CPU oder einer PCI-Bridge, die sich näher bei der Host-CPU befindet, wird als primärer Bus (Northbridge) bezeichnet, der PCI-Bus zu PCI-Einheiten oder zu einer weiteren PCI-Bridge als sekundärer Bus (Southbridge). Die Register des Konfigurationsadressraums speichern Konfigurationsdaten. Die Prefetch-Puffer lesen Daten auf Vorrat ein, wenn vorher ein Lesezugriff erfolgt ist und möglicherweise weitere Daten angefordert werden. In ähnlicher Weise speichern die Posting-Puffer Schreibdaten zwischen, um sie erst später an den adressierten Bus weiterzugeben. Insbesondere die Ankopplung des Speichersystems über eine PCI-Bridge hat sich im Laufe der Zeit allerdings als zu langsam erwiesen, weil die möglichen Transferraten der Speicherchips (EDO, SDRAM, DDR-SDRAM) immer größer geworden sind. Die elektrische Verbindung zwischen North- und Southbridge wird bei neueren Designs daher nicht mehr über den PCI-Bus, sondern über ein spezielles Hub-Link-Interface hergestellt, wobei es hierfür unterschiedliche Implementierungen (von Intel, VIA, SiS) gibt, die in Kapitel 17 bei den Chipsets näher erläutert sind, denn an dieser Stelle sollen zunächst die grundlegenden und allgemein gültigen Zusammenhänge bei PCI betrachtet werden. Die Verwendung des Multiplexing-Schemas, in dem die PCI-Bus-Leitungen abwechselnd als Adress- und Datenleitungen benutzt werden, spart zwar Leitungen ein, dafür sind nun aber zwei bis drei Taktzyklen für einen Einzeltransfer notwendig, weil im ersten Zyklus die Adresse und im zweiten (Schreiben) oder dritten (Lesen) die Daten übergeben werden. Die maximale Datenübertragungsrate beträgt daher 66 MByte/s (Schreiben) bzw. 44 MByte/s (Lesen) für eine Busbreite von 32 Bit. Mit dem Burst-Modus können hingegen beliebig viele Übertragungszyklen ausgeführt werden. Die maximale Datenübertragungsrate steigt im Burst-Modus dann auf 132 MByte/s bei einem 32-Bit-Datenbus und auf 264 MByte/s bei einem 64-Bit-Datenbus an. Host-Bus
sekundäre Buseinheit
primäre Buseinheit
Konfigurationsregister
Prefetch- PostingPuffer Puffer
Prefetch- PostingPuffer Puffer
PCI-Bus
Abb. 22.2: Typischer Aufbau einer PCI-Bridge
Eine ganz wesentliche Eigenschaft der PCI-Bridge ist – und darin unterscheidet sie sich deutlich von den anderen PC-Bussystemen –, dass sie die Burst-Zugriffe selbstständig zusammensetzt. Das bedeutet, dass die PCI-Bridge als Einzeltransfers einlaufende Lese- und Schreibvorgänge selbstständig zu Burst-Zugriffen zusammensetzt, wenn die Adressen der Einzelzugriffe sequenziell aufeinander folgen. Das funktioniert z.B. auch dann, wenn die CPU bei einem 32-Bit-Bus die Adressen DW0–DW1–DW3–DW4–DW5 hintereinander anspricht. Zu beachten ist hier, dass kein DW2 auftritt. PCI löst dieses »Loch-Problem« elegant, indem die Bridge den Burst DW0–DW1– DW2–DW3–DW4–DW5 erzeugt und für DW2 einfach alle BEx-Signale deaktiviert, um anzuzeigen, dass keine Daten übergeben werden.
Sandini Bib 744
Kapitel 22
Zu diesem Zweck sind in der Bridge umfangreiche und intelligente Schreib- und Lesepuffer vorhanden. Schon der 80486-50 hat mit 100 MByte/s im Einzeltransfermodus eine Busbandbreite, die weit über die Übertragungsrate im Einzeltransfermodus des PCI-Bus hinausgeht. Ohne PCIBurst wäre der PCI-Bus also hier bereits die Engstelle. Die PCI-Bridge erkennt nun selbstständig, dass die Einzeltransfers sequenzielle Adressen ansprechen und setzt diese Einzeltransfers zu einem Burst zusammen. Dadurch steigt die PCI-Busbandbreite bei 32 Bits auf 132 MByte/s an, PCI ist also nicht mehr der Flaschenhals. Auch Pentium-Einzeltransfers werden durch solche Bursts voll bedient, weil in Einzeltransfers nur 32 Bits des 64-Bit-Adressbus genutzt werden. Das ergibt bei 66 MHz eine maximale Pentium-Busbandbreite von 132 MByte/s. Der Spitzenwert im 64-Bit-Pipelined-Burst-Modus mit 528 MByte/s übersteigt den PCI-Spitzenwert (264 MByte/s bei 64 Bit) deutlich, ist aber in erster Linie zum Nachladen oder Zurückschreiben von CacheLines in einen L2-Cache und nicht über den PCI-Bus gedacht. Neben den Speicher- und I/O-Adressräumen, die bereits von den 80x86-CPUs her bekannt sind, implementiert PCI noch einen dritten, nämlich den Konfigurationsadressraum (Configuration Space). Er dient zum Zugriff auf die Konfigurationsregister und den Konfigurationsspeicher jeder PCI-Einheit. Für jede Einheit ist ein Konfigurationsspeicher mit 256 Bytes vorgesehen. Die Entkopplung von Prozessor-Speicher-Subsystem und dem PCI-Bus über die PCI-Bridge ist so stark, dass Bridge und CPU parallel arbeiten können, wenn die CPU nicht gerade eine PCIEinheit adressiert. Dadurch ist es z.B. möglich, Daten zwischen zwei PCI-Einheiten über die PCI-Bridge auszutauschen, während die CPU nur den zugeordneten Speicher anspricht, um ein Programm auszuführen.
22.2 Buszyklen Eine PCI-Bridge schaltet CPU-Zugriffe auf die adressierte PCI-Einheit durch oder filtert solche Zugriffe, um die Einheit in optimaler Weise (durch die PCI-Bridge) anzusprechen. PCI kennt zwölf Zugriffsarten, die durch vier Command-Signale C/BE3–C/BE0 unterschieden werden (die Command- und Byte-Enable-Signale werden gemultiplext). Die Transfertypen heißen (in den Klammern sind die Pegel der Command-Signale C/BE3–C/BE0 angegeben):
: : : : : : : : : : : :
INTA-Sequenz (0000) Sonderzyklus (0001) I/O-Lesezugriff (0010) I/O-Schreibzugriff (0011) Speicher-Lesezugriff (0110) Speicher-Schreibzugriff (0111) Konfiguration-Lesezugriff (1010) Konfiguration-Schreibzugriff (1011) Speicher-Mehrfachlesezuriff (1100) Dual-Adressierungszyklus (1101) (Line-)Speicher-Lesezugriff (1110) Speicher-Schreibzugriff mit Invalidierung (1111)
Jeder Transfer wird durch eine Adressphase eingeleitet, während der die Adress/Daten-Pins ADx eine Adresse und die C/BEx-Anschlüsse einen Befehlscode übertragen. Auf diese Phase
Sandini Bib Der PCI-Bus
745
folgen eine oder mehrere Datenphasen, während der oder denen die Adress/Daten-Pins AdxDaten und die C/BEx-Anschlüsse die Byte-Enable-Signale übertragen. In einem Burst-Zyklus können mehrere Datenphasen auf eine einzige Adressphase folgen. In der PCI-Nomenklatur wird die anfordernde PCI-Einheit als Initiator bezeichnet (ISA/EISA/MCA: Busmaster), die adressierte PCI-Einheit als Target (ISA/EISA/MCA: Slave). Jeder Transfer wird durch das Aktivieren des FRAME-Signals eingeleitet. Das Target zeigt seine Bereitschaft mit einem aktiven TRDY-Signal (Target Ready) an. Ein aktives TRDY gibt in einem Schreibzugriff an, dass das Target die Daten auf den Leitungen AD31–AD0 (32 Bits) bzw. A63–A0 (64 Bits) übernehmen kann, und in einem Lesezugriff gibt es an, dass es die adressierten Daten auf die Leitungen AD31–AD0 bzw. A63–A0 gelegt hat. TRDY entspricht in seiner Funktion also dem bekannten READY oder BREADY-Signal für die 80x86-CPUs. Zusätzlich muss auch der Initiator seine Bereitschaft der PCI-Bridge gegenüber anzeigen, nämlich durch ein aktives IRDY-Signal (Initiator Ready). Ein aktives IRDY gibt in einem Schreibzugriff an, dass der Initiator die Schreibdaten auf die Leitungen AD31–AD0 bzw. A63–A0 gelegt hat, in einem Lesezugriff, dass es die adressierten Daten von den Leitungen AD31–AD0 bzw. A63–A0 übernehmen kann. Die PCI-Bridge kann dadurch quasi als schneller Puffer zwischen Initiator und Target wirken und die beiden PCI-Einheiten synchronisieren. Erst dadurch ist es möglich, dass die Bridge CPUEinzelzugriffe in einen PCI-Burst umwandelt. Mit Hilfe von IRDY und TRDY kann die PCIBridge auch ein Write Posting und ein Read Prefetching ausführen. Beim Write Posting schreibt die CPU die Daten mit hoher Geschwindigkeit (schneller, als der PCI-Bus sie gegenwärtig weiter transportieren kann) zunächst in einen Puffer. Für diese Übertragung ist das READY-Signal zum 80x86 maßgeblich. Der Posting-Puffer übergibt dann die Daten an die adressierte PCI-Einheit. Hier sind IRDY und TRDY entscheidend. Kann der PCI-Bus aus irgendeinem Grund die Daten schneller abtransportieren, als die CPU sie nachliefert, deaktiviert die PCI-Bridge das IRDY-Signal, um dem Target anzuzeigen, dass der Transfer zwar noch nicht beendet ist, die Bridge aber auf Daten von der CPU wartet. Beim Read Prefetching liest die PCI-Bridge weitere Daten vom Target quasi auf Vorrat in einen Prefetch-Puffer ein und gibt sie erst später an die CPU weiter. Ist der Prefetch-Puffer voll, weil die Daten nicht schnell genug abgeholt werden, muss die Bridge IRDY deaktivieren, um dem Target anzuzeigen, dass es vorläufig keine weiteren Daten liefern soll. IRDY und TRDY können natürlich auch zum Datenaustausch zwischen zwei PCI-Einheiten ohne Einwirkung der CPU verwendet werden (z.B. wenn Daten von einer Festplatte mit PCIAdapter direkt in den Video-RAM auf einer PCI-Grafikkarte geschrieben werden, um ein Fenster wiederherzustellen). Durch das Deaktivieren von FRAME beendet der Initiator den Transfer oder bricht ihn ab. Auch das Target kann einen Transfer abbrechen, indem es das Signal STOP aktiviert; das führt zu einem so genannten Target-Abort. Die Bustransfertypen möchte ich im Folgenden kurz erläutern. INTA-Sequenz: Im INTA-Verlauf wird ein Interrupt-Controller implizit adressiert, d.h. ohne Ausgabe einer expliziten I/O- oder Speicheradresse (der betreffende Controller erkennt die INTA-Sequenz selbstständig und reagiert automatisch darauf). In der Datenphase übergibt er den Interrupt-Vektor über die ADx-Leitungen. Sonderzyklus: Ein Sonderzyklus kann dazu benutzt werden, Nachrichten an alle PCI-Agenten zu übergeben, z.B. über den Prozessorzustand. Das niederwertige ADx-Wort AD15–AD0 liefert einen Nachrichtencode entsprechend Tabelle 22.1. Die x86-spezifischen Codes entsprechen den Codes für i486- und Pentium-Sonderzyklen, wie z.B. Flush, INTA etc. und werden auf dem niederwertigen ADx-Wort AD31–AD16 ausgegeben.
Sandini Bib 746
Kapitel 22
AD15..AD0
Nachricht
0000h 0001h 0002h 0003h bis ffffh
Prozessor-Shutdown Prozessor-Halt x86-spezifischer Code reserviert
Tab. 22.1: Nachrichtencodes für den PCI-Sonderzyklus
I/O-Lesezugriff: Dieser Zugriff liest Daten von einer PCI-Einheit im I/O-Adressraum ein. Die Adresse ADx definiert eine Byte-Adresse, d.h. auch AD1 und AD0 müssen dekodiert werden, weil im PCI-Adressraum 8-Bit- und 16-Bit-Ports vorhanden sein können. Der Zugriff besteht üblicherweise aus einer Adress- und einer Datenphase. I/O-Schreibzugriff: Der Zugriff übergibt Daten an einen PCI-Agenten im I/O-Adressraum. Auch hier definieren die ADx eine Byte-Adresse. Der Zugriff besteht meistens aus einer Adressund einer Datenphase. Speicher-Lesezugriff: Der Speicher-Lesezugriff adressiert eine PCI-Einheit im Speicheradressraum und liest Daten von diesem Agenten. Ein Read-Prefetch-Puffer kann den Lesezugriff wirksam unterstützen und beschleunigen. Die Adresse ADx definiert eine Doppelwortadresse, d.h. AD1 und AD0 müssen nicht dekodiert werden, stattdessen geben die Byte-Enable-Signale BEx an, welche Byte-Gruppen des 32-Bit- oder 64-Bit-Datenbus gültige Werte aufweisen. Der Zugriff umfasst üblicherweise eine Adress- und eine Datenphase. Speicher-Schreibzugriff: Dieser Zugriff adressiert einen PCI-Agenten im Speicheradressraum und übergibt ihm Daten. Ein Write Posting beschleunigt den Schreibvorgang meistens erheblich, weil der Initiator nicht auf die Rückmeldung vom Target, sondern nur vom Posting-Puffer warten muss. Wie beim Speicher-Lesezugriff definiert die Adresse ADx eine Doppelwortadresse, d.h. AD1 und AD0 müssen nicht dekodiert werden, wohl aber die Byte-Enable-Signale BEx. Der Zugriff besteht üblicherweise aus einer Adress- und einer Datenphase. Konfiguration-Lesezugriff: PCI benutzt diesen Zugriff, um den Konfigurationsadressraum der jeweiligen PCI-Einheiten anzusprechen. Hier wird IDSEL aktiviert, um die Einheit auszuwählen. Die Adressbits AD7–AD2 geben die Adresse des zu lesenden Doppelworts im Konfigurationsadressraum der Einheit an, AD1 und AD0 sind gleich 0. Für eine Multifunktionseinheit legen AD10–AD8 noch die adressierte Einheit fest. Alle anderen ADx sind ohne Bedeutung. Der Zugriff besteht meistens aus einer Adress- und einer Datenphase. Konfiguration-Schreibzugriff: Dieser Zugriff ist das Pendant zum Konfiguration-Lesezugriff, nur schreibt der Initiator Daten in den Konfigurationsadressraum des Targets. Die Adressierung erfolgt wie beim Konfiguration-Lesezugriff. Der Zugriff umfasst üblicherweise eine Adress- und eine Datenphase. Speicher-Mehrfachlesezugriff: Der Zugriff stellt eine Erweiterung des Line-Speicher-Lesezugriffs (und dadurch natürlich des gewöhnlichen Speicher-Lesezugriffs) dar und zeigt dem Target an, dass der Initiator (Busmaster) mehr als eine ganze Cache-Line oder einen entsprechend umfangreichen Datenblock ohne Caching aus dem Speicher lesen möchte. Der Zugriff ist vor allem für lange sequenzielle Speicherzugriffe vorteilhaft, z.B. wenn ein großer Teil des VideoRAM entsprechend einem Fenster gesichert werden soll. Der Zugriff besteht also aus einer Adress- und mehreren Datenphasen, bis der Initiator FRAME wieder deaktiviert.
Sandini Bib Der PCI-Bus
747
Dual-Adressierungszyklus: Dieser Zyklus wird dazu benutzt, eine 64-Bit-Adresse an PCI-Einheiten zu übergeben, die nur einen 32-Bit-Adress-/Datenpfad aufweisen. Normalerweise wird die 64-Bit-Adresse über den 64-Bit-Adress-/Datenpfad in einem einzigen Zyklus übergeben. Ist aber nur ein 32-Bit-Adress-/Datenpfad vorhanden, muss die 64-Bit-Adresse in eine niederwertige 32-Bit-Adresse (erster Adressierungszyklus) und eine höherwertige 32-Bit-Adresse (zweiter Adressierungszyklus) aufgespalten werden. Dazu dient der Dual-Adressierungszyklus. Im ersten Adressierungszyklus treibt die PCI-Bridge einen Dual-Adressierungszyklus und übergibt die niederwertige 32-Bit-Adresse. Im zweiten Adressierungszyklus übergibt sie dann die höherwertige 32-Bit-Adresse. Das Target setzt dann die 64-Bit-Adresse wieder zusammen. Erst im zweiten Adressierungszyklus wird also festgelegt, ob es sich um einen einfachen Lesezugriff, einen I/O-Zugriff etc. handelt. Selbst PCI-Agenten, die den 64-Bit-PCI-Datenbus AD63–AD0 unterstützen, verarbeiten aber nicht notwendigerweise auch 64-Bit-Adressen. (Beispielsweise hat der Pentium zwar einen 64-Bit-Datenbus, aber nur einen 32-Bit-Adressraum.) Umgekehrt kann eine PCI-Einheit zwar eine 64-Bit-Adressierung unterstützen, aber nur einen 32-Bit-Datenbus aufweisen (z.B. Memory-Mapped Register). Line-Speicher-Lesezugriff: Der Zugriff stellt eine Erweiterung des gewöhnlichen Speicher-Lesezugriffs dar, umfasst aber nicht so viele Datentransfers wie der Speicher-Mehrfachlesezugriff. Der Befehl zeigt dem Target an, dass der Initiator mehr als zwei 32-Bit-Datenblöcke aus dem Speicher lesen möchte, typischerweise bis zum Ende einer Cache-Line. Auch dieser Zugriff ist vor allem für lange sequenzielle Speicherzugriffe vorteilhaft. Der Zugriff umfasst eine Adressund mehrere Datenphasen, bis der Initiator FRAME wieder deaktiviert. Speicher-Schreibzugriff mit Invalidierung: Dieser Zugriff ist das Pendant zum Line-SpeicherLesezugriff oder Speicher-Mehrfachlesezugriff. Durch einen Speicher-Schreibzugriff mit Invalidierung zeigt der Initiator an, dass mindestens eine ganze Cache-Line übertragen werden soll. Dadurch ist anschließend der Hauptspeicherinhalt automatisch aktueller als der Cache-Inhalt, so dass die betreffende Line auch invalidiert werden kann; man umgeht also ein Write-Back. Die Cache-Line-Größe wird in einem Konfigurationsregister des Masters, von dem das Cache-LineWrite-Back ja ausgeht, definiert. Wenn mit diesem Zugriff ein Wert einer anschließenden CacheLine geschrieben werden soll, muss die gesamte Cache-Line übertragen oder ein einfacher Speicher-Schreibzugriff ausgeführt werden. Die PCI-Spezifikation empfiehlt die Verwendung der verschiedenen Lesezugriffsmodi auf den Speicher nach Tabelle 22.2, je nachdem, ob ein Register für die Cache-Line-Größe im Busmaster implementiert ist oder nicht. Mit Register für Cache-Line-Größe zu übertragende Datenmenge halbe Cache-Line oder weniger halbe bis drei Cache-Lines mehr als drei Cache-Lines
Modus Speicher-Lesezugriff Line-Speicher-Lesezugriff Speicher-Mehrfachlesezugriff
Ohne Register für Cache-Line-Größe zu übertragende Datenmenge zwei Transfers oder weniger drei bis zwölf Datentransfers mehr als zwölf Datentransfers Tab. 22.2: Verwendung der PCI-Blockzugriffsmodi
Modus Speicher-Lesezugriff Line-Speicher-Lesezugriff Speicher-Mehrfachlesezugriff
Sandini Bib 748
Kapitel 22
Für umfangreiche, sequenzielle Schreibzugriffe sollte so weit wie möglich der Speicher-Schreibzugriff mit Invalidierung benutzt werden. Dazu ist aber ein Register für die Cache-Line-Größe im Initiator notwendig. Für Speicherzugriffe werden die Adressbits AD1 und AD0 generell nicht zur Adressierung dekodiert. PCI adressiert also immer Doppelworte, die aktiven Bytes innerhalb eines Doppelwortes werden dann durch BEx angegeben. AD1 und AD0 fallen aber nicht ganz unter den Tisch. Vielmehr sind sie sehr wichtig, um die Adressenreihenfolge festzulegen. PCI unterscheidet für alle Burst-Zugriffe eine lineare und eine Toggle-Inkrementierung der Adressen. Lineare Inkrementierung (AD1=AD0=0) bedeutet, dass alle Adressen sequenziell aufeinander folgen, und Toggle-Inkrementierung (AD1=0, AD0=1) bedeutet, dass die Adressen nach Art des CacheLine Fill z.B. beim Pentium verzahnt sind, also nicht sequenziell aufeinander folgen. In Abbildung 22.3 ist der Verlauf der wichtigsten Signale für einen typischen PCI-Lesezugriff angegeben. Zu beachten ist dabei, dass der erste Taktzyklus nach der Adressphase zur Umschaltung der Transferrichtung des gemultiplexten PCI-Adress-/Datenbus verbraucht wird. Während der Adressphase liefern die ADx-Anschlüsse nämlich einen Wert (die Adresse), während sie in der Datenphase einen Wert (Lesedaten) annehmen. Auch beim 8086/88 mit seinem gemultiplexten Adress-/Datenbus war ein Blindzyklus für die Richtungsumkehr notwendig. Der erste Wert kann also frühestens im dritten PCI-Taktzyklus übernommen werden, und der PCI-LesetransferBurst wird im günstigsten Fall (keine Wartezyklen) als 3-1-1-1-... Burst ausgeführt. 0
1
3
2
5
4
6
7
8
CLK FRAME
BEx 2
BEx 3
BEx 4
Wartezyklus
Datentransfer
Daten 4
Datentransfer
Daten 3
Wartezyklus
BEx 1
Daten 2
Datentransfer
TRDY
Bus CMD
Datentransfer
IRDY
Daten 1
Blindzyklus
C/BEx
Adresse
Adressausgabe
ADx
DEVSEL Adressphase
Datenphase 1
3
Datenphase 2
Datenphase 3
Datenphase 4
1
2
2
Abb. 22.3: Der PCI-Lesetransfer-Burst: Abweichend vom optimalen 3-1-1-1-... Burst ist ein 3-1-2-2 Burst dargestellt, wobei einmal ein inaktives TRDY, das andere Mal ein inaktives IRDY einen Wartezyklus anfordert. Die adressierte PCI-Einheit reagiert mit einem aktiven DEVSEL-Signal, wenn sie sich als Target des PCITransfers identifiziert hat. Der Transfer (3-1-2-2 Burst) wird durch die Deaktivierung von FRAME beendet.
Ein typischer PCI-Schreibzugriff läuft sehr ähnlich ab. Er wird ebenfalls durch Aktivieren von FRAME eingeleitet. In Abbildung 22.4 ist der Verlauf der wichtigsten Signale dargestellt. Im Gegensatz zum Lesezugriff braucht hier der gemultiplexte PCI-Adress-/Datenbus nicht umgeschaltet zu werden. Unmittelbar nach der Adressphase kann die Datenphase folgen, ohne dass ein Blindzyklus notwendig wäre. Der erste Wert kann also bereits im zweiten PCI-Taktzyklus übergeben werden und der PCI-Lesetransfer-Burst wird im günstigsten Fall (keine Wartezyklen) als 2-1-1-1-... Burst ausgeführt.
Sandini Bib Der PCI-Bus
749
0
1
3
2
5
4
6
7
CLK FRAME
Bus CMD
BEx 1
BEx 2
BEx 3
BEx 4
Wartezyklus
Datentransfer
Daten 4
Datentransfer
Daten 3
Wartezyklus
TRDY
Daten 2
Datentransfer
IRDY
Daten 1
Datentransfer
C/BEx
Adresse
Adressausgabe
ADx
DEVSEL Adress- Daten- Datenphase phase 1 phase 2
2
1
Datenphase 3
Datenphase 4
2
2
Abb. 22.4: Abweichend vom optimalen 2-1-1-1-... Burst ist ein 2-1-2-2 Burst dargestellt, wobei einmal ein inaktives TRDY, das andere Mal ein inaktives IRDY einen Wartezyklus anfordert. Die adressierte PCI-Einheit reagiert mit einem aktiven DEVSEL-Signal, wenn sie sich als Target des PCI-Transfers identifiziert hat. Der Transfer (2-1-2-2 Burst) wird durch Deaktivierung von FRAME beendet.
22.3 Busarbitrierung Die Busarbitrierung erfolgt bei PCI für jeden Zugriff getrennt, d.h. ein Busmaster kann den PCIBus zwischen zwei Zugriffen nicht behalten. Bei EISA und MCA ist dies hingegen möglich. Dafür kann sich ein PCI-Burst, der einen einzelnen Zugriff im Sinne der Busarbitrierung darstellt, auf beliebig viele Transferzyklen erstrecken. Diese Einzelarbitrierung verschlechtert die Übertragungsbandbreite des PCI-Bus aber nicht, weil die Arbitrierung hinter dem aktiven Buszugriff versteckt wird, es findet eine Hidden-Arbitrierung statt. Das bedeutet, dass die Arbitrierung bereits ausgeführt wird, wenn der aktive Buszugriff noch läuft. Dadurch werden keine PCI-Buszyklen für die Arbitrierung verbraucht.
Abb. 22.5: Die Struktur der PCI-Bus-Arbitrierung, wobei hier vier PCI-Slots verdrahtet sind.
Sandini Bib 750
Kapitel 22
PCI sieht zur Arbitrierung zwei Steuersignale vor: REQ und GNT. Jeder Busmaster besitzt ein eigenes Request- und Grant-Signal, die von einer zentralen Arbitrierungslogik erfasst bzw. angesteuert werden. Die PCI-Spezifikation legt das Arbitrierungsschema aber nicht explizit fest. Die PCI-Spezifikation fordert lediglich, dass ein PCI-Busmaster das Signal REQ aktivieren muss, um eine Anforderung des PCI-Bus anzuzeigen, und dass die Arbitrierungslogik das Signal GNT aktivieren muss, damit ein anfordernder Master die Kontrolle über den Bus erhält. Der Busmaster muss dann innerhalb von 16 CLK-Zyklen mit einem Bustransfer beginnen, sonst tritt ein Zeitüberschreitungsfehler auf.
22.4 DMA und Busmastering Im Unterschied zu ISA/EISA und dem MicroChannel ist bei PCI kein direkter Speicherzugriff DMA vorgesehen. Es fehlen die vom gewöhnlichen PC bekannten Signale DREQx und DACKx. Dies erscheint auf den ersten Blick vielleicht als ein Rückschritt, weil vor allem in EISA- und MCA-PCs die Übertragung großer Datenmengen von der Peripherie zum Hauptspeicher und umgekehrt per DMA sehr schnell absolviert werden kann. Das Busmaster-Konzept (nicht nur von PCI, sondern bereits von EISA und dem MicroChannel her bekannt) macht den direkten Speicherzugriff aber eigentlich überflüssig: Der DMA-Controller befindet sich üblicherweise auf dem Mainboard, steuert aber typischerweise eine I/O-Einheit auf einem Adapter an (z.B. den Festplattencontroller). Die Datenübertragung wird dabei z.B. vom DREQ-Signal getriggert (Einzeltransfermodus). Die notwendigen Bussteuersignale (wie z.B. IOW, MEMR etc.) erzeugt aber der DMA-Controller als Busmaster selbst, d.h., die CPU ist an dieser Datenübertragung nicht beteiligt. Anders ausgedrückt könnte man das Zusammenwirken des (Busmaster-) DMA-Controllers und des Triggersignals DREQ als einen Busmasterbetrieb des Adapters auffassen, wobei sich der Busmasterchip standardmäßig auf dem Mainboard befindet und dort die Bussteuersignale erzeugt, während der Adapter diesen zweiten Busmaster neben der CPU durch sein DREQ-Signal benutzt. Ein eigener Busmasterchip auf dem Adapter selbst macht dieses etwas umständliche Verfahren überflüssig: Der Adapter-Busmaster kann nun alle Bussteuersignale selbst erzeugen und dadurch in beliebiger Weise den I/O- und Speicheradressraum adressieren. Das erfordert aber eine Busarbitrierung über den Erweiterungsbus (oder: die Slots) hinweg, während bei DMA die Arbitrierung nur zwischen der CPU und dem DMA-Controller auf dem Mainboard durchgeführt wird. Die Verwendung externer Busmaster ist also flexibler und leistungsfähiger als DMA, macht aber auch eine kompliziertere Arbitrierung notwendig. Es ist aber natürlich möglich, dass der externe Busmaster auf dem Adapter eine Art DMA-Controller darstellt und Daten schnell zwischen Hauptspeicher und Adapter austauscht. Das Busmaster-Konzept ist allgemeiner gefasst als der direkte Speicherzugriff, bzw. DMA ist ein Teilaspekt des Busmaster-Konzepts. Bei PCI gibt es also keine DMA-Übertragung im klassischen Sinne, und direkte Speicherzugriffe werden grundsätzlich im Burst-Modus von einem Busmaster ausgeführt. Bitte beachten Sie, dass bei älteren Mainboards nicht alle PCI-Slots busmasterfähig sind, sondern vielfach nur ein einziger, was den Einsatz mehrer Master (SCSI- und LAN-Controller) nicht gestattet. Wenn dennoch von DMA im Zusammenhang mit PCI die Rede ist, ist genauer zu untersuchen, was hiermit eigentlich gemeint ist. Beispielsweise ermöglichen es einige PCI-Interface-Chips (z.B. PLX9060) von der Local-Bus-Seite (Schaltungsseite) her, DMA-Zyklen auszulösen. Der Chip wirkt dann gleichzeitig sowohl bei diesem Bus als auch beim PCI-Bus als Master. Es wird demnach durch Auslösung eines lokalen DMAs automatisch ein Transfer auf dem PCI-Bus initiiert, was zu einer Vereinfachung der lokalen Logik und auch der Programmierung führt. Gleichwohl erscheint der Begriff DMA als PCI-Bus-Funktion doch eher ungeeignet und sorgt hier oftmals für Verwirrung.
Sandini Bib Der PCI-Bus
751
22.4.1 Scatter Gather Bus Mastering Im Zusammenhang mit dem Busmastering wird mitunter die Funktion des so genannten Scatter Gather Bus Mastering angeführt. Für einen Datenzyklus mit dem DRAM des PCs als Ziel ist zu beachten, dass der Speicher nicht als zusammenhängender physikalischer Block vorliegt, sondern aus einzelnen (fragmentierten) Segmenten besteht. Bei der Ausführung eines Burst (Busmastering) kann nun der Fall auftreten, dass die Daten auf Grund ihrer Größe in mehreren Segmenten abzuspeichern sind. Ohne die Scatter-Gather-Funktion, die der PCI-Controller beherrschen muss, wäre der Transfer nicht als ununterbrochener Zyklus durchzuführen, da zwischenzeitlich eine Neuadressierung des noch freien Speichers durch die CPU nötig wäre. Ein PCI-Controller mit Scatter-Gather-Funktion ermittelt vor der Datenübertragung die vom Betriebssystem als frei ausgewiesenen Speicherbereiche und führt daraufhin den Transfer zum segmentierten Speicher aus, wie beispielsweise der PCI-SCSI-Controller NCR 53C810.
22.5 Interrupts Die PCI-Spezifikation sieht Interrupts eigentlich nur optional vor. Diese Interrupts sollen pegelgetriggert und low-aktiv sein. Einer PCI-Einheit ist eine Interrupt-Leitung, beispielsweise INTA, zugeordnet. Nur Multifunktionseinheiten sollten auch die anderen drei Interrupt-Leitungen des PCI-Bus INTB, INTC und INTD benutzen können. Die PCI-Interrupts werden in der CPU-PCIBridge auf die Interrupt-Requests IRQx der ISA-Architektur abgebildet. Dies hat zur Folge, dass ein PCI-PC nicht mehr Interrupt-Leitungen als ein ISA-PC zur Verfügung hat, sondern es werden sogar weniger, wenn alle INTx-Interrupts (über ISA) im System abgebildet werden sollen. In welcher Form die PCI-Interrupts nun aber konkret mit den ISA-Interrupts verdrahtet werden, hängt vom Mainboard-Design ab. Das heißt, es gibt hier eine Vielzahl an möglichen Kombinationen, was auch über die Jahre praktiziert worden ist, wovon die folgende Liste einen Eindruck vermitteln soll.
: : : : :
Jedem PCI-Slot ist ein INTx (A-D) fest zugeordnet, und im BIOS bzw. per Jumper wird festgelegt, über welchen IRQ die PCI-Interrupts abgewickelt werden sollen. Den einzelnen PCI-Slots können die INTx-Signale per BIOS und/oder Jumper manuell zugeteilt werden. Auch hier wird dann im BIOS bzw. per Jumper noch festgelegt, über welchen IRQ die PCI-Interrupts dann abzubilden sind. Auf vorwiegend älteren PCI-Karten befinden sich Jumper (!), mit denen ein PCI-Interrupt (INTA-INTD) auszuwählen ist, der natürlich mit demjenigen harmonieren muss, der dem PCI-Slot zugeteilt worden ist. Alle PCI-Slots verwenden nur den INTA, der sich gleichzeitig unterschiedlicher ISA-Interrupts bedienen kann. Jedem PCI-Slot kann explizit ein IRQ zugeordnet werden, ungeachtet der Tatsache, welcher INTx dann im Einzelnen verwendet wird.
Idealerweise erfolgt die Interrupt-Zuteilung mit Hilfe des Setup im PC-BIOS. Bei älteren Mainboards und einigen PCI-Einsteckkarten sind allerdings oftmals noch Jumper für die jeweilige Zuordnung zu stecken, was dem Plug&Play-Ansatz von PCI im Prinzip zuwiderläuft. Im BIOSSetup ist üblicherweise festzulegen, welche IRQs als ISA-Interrupt-Pins (Legacy Devices) und welche IRQs für die PCI- und auch ISA-Plug&Play-Devices verwendet werden sollen. Wer ausschließlich Plug&Play-Karten (PCI, ISA-Plug&Play) im PC einsetzt, macht meist nichts falsch, wenn er die BIOS-Automatik (Resources controlled by: AUTO) für die Interrupt-Vergabe bemüht.
Sandini Bib 752
Kapitel 22
Beim Booten des PC wird die Interrupt-Zuteilung in der Regel angezeigt, und vielfach ist dann zu erkennen, dass mehrere PCI-Devices ein und denselben IRQ verwenden. Dies ist zunächst kein Grund zur Beunruhigung, denn da PCI mit einer Level-Triggerung (statt Edge wie bei ISA) arbeitet, können sich mehrere PCI-Einheiten einen Interrupt teilen (Interrupt Sharing). Problematisch kann es jedoch werden, wenn die Windows-Treiber der entsprechenden Geräte nicht die Funktionalität des Interrupt Sharing besitzen, was zu einem Fehlverhalten der Einheiten führen kann. In solch einem Fall ist die BIOS-Automatik für die Interrupt-Vergabe abzuschalten und die einzelnen Kanäle sind explizit den Slots und somit den hier eingesetzten Karten zuzuteilen. Auch heute noch sind einige PCI-Karten problematisch bei der Konfigurierung, wozu in erster Linie Soundkarten (Soundblaster) zu rechnen sind, die aus traditionellen Gründen (ihr Design stammt aus der ISA-Welt) gleich mehrere Interrupts benötigen, was aber nicht von allen PCIMainboards unterstützt wird. Selbst wenn man per BIOS-Setup eine für seinen PC optimal erscheinende Interrupt-Zuordnung realisiert hat, kann das Betriebssystem diese Zuordnung wieder zunichte machen, was prinzipiell ab Windows 98 möglich ist. Was es genau damit auf sich hat, wurde im Kapitel über die Hardware-Interrupts (Kapitel 18) näher beschrieben. Dort finden sich auch Erläuterungen zum APIC-Modus, der die immer wieder als problematisch erscheinende Interrupt-Verarbeitung entschärfen kann, weil hiermit 24 Interrupt-Kanäle (statt 16, die zudem teilweise fest zugeordnet sind) nutzbar sind.
22.6 I/O-Adressraum Der PCI-Bus unterstützt nach seinen Spezifikationen einen 32-Bit- oder auch 64-Bit-I/O-Adressraum. Das betrifft aber nur reine PCI-Einheiten. Diese können ab einer Adresse von 64 KByte von einer 80x86-CPU nicht mehr angesprochen werden, weil diese Prozessoren nur eine 16-BitI/O-Adresse erzeugen. Die Ports in einem Personal Computer mit PCI-Bus liegen alle unterhalb von 64 KByte, und die Belegung und Adresse der jeweiligen Ports hat sich gegenüber ISA (und auch EISA, MCA) nicht verändert (siehe Kapitel 21). PCI legt zwei PCI-Register in einen I/O-Adressbereich. Diese beiden 32-Bit-Register CONFIG_ADDRESS und CONFIG_DATA dienen zum Zugriff auf den Konfigurationsadressraum (Configuration Space) und liegen an den Adressen 0cf8h (ADDRESS) bzw. 0cfch (DATA). Wenn Sie ein Doppelwort im Konfigurationsraum einer PCI-Einheit lesen oder schreiben möchten, müssen Sie zunächst die entsprechende Adresse an das CONFIG_ADDRESS-Register übergeben. Ein Schreiben des CONFIG_DATA-Registers überträgt den Wert an die festgelegte Stelle im Konfigurationsadressraum der adressierten Einheit, und ein Lesen übergibt den Wert von dieser Stelle. Den Aufbau des Adressregisters sehen Sie in Abbildung 22.6. ECD
31 30
24 23
reserviert
16 15
Bus
11 10
Einheit
ECD: Enable CONFIG_DATA 0=CONFIG_DATA-Register nicht aktiviert 1=CONFIG_DATA-Register aktiviert Typ: Übertragungstyp 00=Einheit dekodieren 01=CONFIG_ADDRESS-Wert auf ADx kopieren Abb. 22.6: CONFIG_ADDRESS-Register
8
Funktion
7
2
Register
1 0
Typ
Sandini Bib Der PCI-Bus
753
Wenn das ECD-Bit gesetzt wird, führt die Bridge für die I/O-Adresse 0cfch (entsprechend CONFIG_DATA) einen Konfigurationszyklus aus. Ansonsten führt sie einen gewöhnlichen I/OZyklus aus, der den Konfigurationsadressraum nicht erreicht, sondern zum normalen I/OAdressraum durchgeschaltet wird. Der Eintrag Bus legt die Nummer des PCI-Bus in einem hierarchisch strukturierten System mit maximal 256 PCI-Bussen fest. Solche hierarchisch strukturierten PCI-Bussysteme können durch PCI-PCI-Bridges implementiert werden. Einheit wählt einen von 32 möglichen PCI-Agenten aus, Funktion eine von maximal acht Funktionen innerhalb einer PCI-Multifunktionseinheit. Schließlich adressiert Register einen von 64 möglichen DWort-Einträgen im spezifizierten Konfigurationsadressraum. Typ dient dazu, der Bridge mitzuteilen, ob die adressierte Einheit mit ihr verbunden ist (Typ=0) und ob sie nach Dekodierung der Einheit- und Funktion-Einträge einen Konfigurationszyklus treiben soll. Ist Typ gleich 01b, dann befindet sich die Einheit hinter dieser Bridge, und die Bridge kopiert den Inhalt von CONFIG_ADDRESS unverändert auf den Adress-/Datenbus. Ein Zugriff auf den Konfigurationsadressraum über die beiden Register CONFIG_ADDRESS und CONFIG_DATA wird als Konfigurationsmechanismus #1 bezeichnet. Damit kann eine PCI-Bridge auch angewiesen werden, einen Sonderzyklus zu treiben, indem Sie im Adressregister für den BusEintrag die PCI-Bridge spezifizieren und die Einträge für Einheit und Funktion mit lauter Einsen sowie den Register-Eintrag mit lauter Nullen beschreiben. Der nächste Zugriff auf das Datenregister löst dann einen Sonderzyklus aus. AD31–AD0 übergeben dabei den Datenregisterwert. Zusätzlich gibt es noch einen Konfigurationsmechanismus #2, der aber nur für PC-Systeme vorgesehen ist (als prozessorunabhängiges Bussystem wird PCI z.B. auch für den Alpha und den PowerPC eingesetzt). Hier wird der PCI-Konfigurationsraum einer Einheit in den 4KByte großen I/O-Adressbereich zwischen c000h bis cfffh eingeblendet. Das geschieht über das Aktivierungsregister CSE (Configuration Space Enable) für den Konfigurationsraum an der Port-Adresse 0cf8h. Die Struktur ist in Abbildung 22.7 zusammen mit dem Aufbau des Forward-Registers angegeben. CSE-Register (Port 0cf8h) 4
3
1 0
Schlüssel Funktion
Forward-Register (Port 0cfah) 7
0
SCE
7
PCI-Bus
I/O-Adresse 31
16 15
12 11
8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 PCI-Einheit
Schlüssel: 0000=Normalmodus SCE:
7
2
Registerindex
1 0
0 0
0001..1111=Konfigurationsraum aktiviert
Sonderzyklusaktivierung (Special Cycle Enable) 0=Konfigurationszyklus 1=Sonderzyklus
Abb. 22.7: Aktivierungsregister, Forward-Register und I/O-Adresse für den Konfigurationsraum
Ein von Null verschiedener Wert für Schlüssel aktiviert die Einblendung des Konfigurationsraums, d.h., alle I/O-Zugriffe mit einer Adresse zwischen c000h und cfffh lösen einen Konfigurationszyklus aus. Sonst werden I/O-Zugriffe auf den 4KByte-Bereich zwischen c000h bis cfffh als normale I/O-Zyklen verarbeitet. Der Eintrag PCI-Bus im Forward-Register an der Port-Adresse 0cfah gibt denjenigen PCI-Bus an, für den der Konfigurationszyklus ausgeführt werden soll. Ein Wert von 00h entspricht z.B. dem
Sandini Bib 754
Kapitel 22
Bus unmittelbar hinter der Host-Bridge. Wenn Sie nun einen Wert in den 4KByte-I/O-Bereich zwischen c000h bis cfffh schreiben, geben die Adressbits AD11–AD8 der I/O-Adresse die PCIEinheit, der Eintrag Funktion im CSE-Register die Funktionsnummer innerhalb dieser PCI-Einheit (wenn sie eine Multifunktionseinheit darstellt) und die Adressbits AD7–AD2 der I/OAdresse den Registerindex (oder den DWort-Registeroffset) an. Die beiden Adressbits AD1 und AD0 der I/O-Adresse werden ignoriert (sie sollten am besten auf 00 gesetzt werden), die Adressbits AD31–AD12 sind gleich 0000ch oder 0000 0000 0000 0000 1100. Neben diesen direkten Zugriffen auf den Konfigurationsraum einer PCI-Einheit über I/O-Ports stellen Personal Computer mit PCI-Bus im Allgemeinen noch eine Schnittstelle über den BIOSInterrupt 1ah zur Verfügung. Seine standardisierten Funktionen sind in Kapitel 22.8 aufgeführt. Nun aber zuerst zum Aufbau des Konfigurationsraums.
22.7 Konfigurationsraum – Configuration Space Für jede PCI-Einheit (und für jede Funktion einer Multifunktionseinheit getrennt) ist ein Konfigurationsraum von 256 Bytes vorgesehen, also 64 Register zu je 32 Bits. Am Anfang befindet sich ein fest definierter Header mit 64 Bytes, der für jede Einheit mit dieser Struktur vorgeschrieben ist. Die Belegung der restlichen 192 Bytes hängt von der jeweiligen PCI-Einheit ab. Die Konfigurations-Software für eine solche Einheit kennt dann die Belegung dieses Bereichs. In Abbildung 22.8 sehen Sie den Aufbau des Konfigurationsraums (Configuration Space) und des Header laut der ursprünglichen PCI-Spezifikation. Mittlerweile sind hierfür einige Erweiterungen (PCI-Spec. 2.2, 2.3, PCI-X) eingeführt worden, auf die noch im Detail eingegangen werden wird. Zunächst jedoch zu den grundlegenden Eigenschaften des Headers. 256-Byte-Konfigurationsraum 64-Byte-Header
64-Byte-Header 31
16 15
0
Einheiten-ID Hersteller-ID Status Befehl Klassencode Revision BIST Header Latenz CLG
Basisadressregister
192 Bytes frei verfügbar für PCI-Einheit reserviert oder Card Bus CIS Pointer reserviert oder Subsystem IDs
Erweiterungs-ROM-Basisadresse reserviert oder Capabilities Pointer
reserviert MaxLat MinGNT INT-Pin INT-Leit.
00h 04h 08h 0ch 10h 14h 18h 1ch 20h 24h 28h 2ch 30h 34h 38h 3ch
Abb. 22.8: 256-Byte-Konfigurationsraum und 64-Byte-Header
Gültige Werte für die Einheiten-ID (Device ID) liegen zwischen 0000h und fffeh. Ein Wert ffffh bezeichnet eine nicht vorhandene PCI-Einheit. Dadurch kann die Startroutine des PCI-BIOS alle PCI-Einheiten erfassen. Die Einträge im Konfigurationsraum folgen dem Little-Endian-Format. Der Header selbst ist wiederum in zwei Abschnitte aufgeteilt: Die ersten 16 Bytes (00h bis 0fh) sind für alle PCI-Einheiten belegt, die folgenden 48 Bytes können für verschiedene PCI-Einheiten ein unterschiedliches Layout aufweisen. Diese Layouts werden durch den Eintrag Header (Offset 0eh) unterschieden. Das höchstwertige Header-Bit 7 gibt an, ob es sich um eine Multifunktionseinheit handelt (Bit 7=1) oder um eine Einzelfunktionseinheit (Bit 7=0). Beachten Sie, dass die
Sandini Bib Der PCI-Bus
755
(ursprüngliche) PCI-Spezifikation lediglich fordert, dass die Einträge Hersteller-ID, Einheiten-ID, Befehl und Status vorhanden sind. Die Hersteller-ID (Vendor ID) wird von der PCI SIG vergeben (dem Gremium, das den PCI-Standard erstellt). Dagegen werden die Einheiten-ID und Revision vom jeweiligen Hersteller eingetragen. Der Eintrag Befehl im Header vermittelt eine Möglichkeit zur Steuerung der Einheit, d.h. in welcher Weise sie auf PCI-Zyklen reagiert. Abbildung 22.9 zeigt die Struktur dieses Eintrags. Wenn Sie das Befehlsregister mit einem Wert 0000h schreiben, deaktivieren Sie die zugehörige PCI-Einheit; sie reagiert dann nur noch auf Konfigurationszyklen. 10 9
reserviert
8
7
6
5
4
3
2
1 0
FBB SEE WZ PER VPS MWI SZ BM MAR IOR
15
FBB: Fast-Back-to-Back-Zyklen (Fast Back-to-Back Enable) 0=deaktiviert 1=aktiviert SEE: SERR Enable 0=deaktiviert WZ:
1=aktiviert
Wartezyklensteuerung 0=kein Adress/Daten-Stepping 1=Adress/Daten-Stepping möglich
PER: Paritätsfehler (Parity Error Response) 0=ignorieren 1=verarbeiten VPS: VGA Palette Snoop 0=normale Reaktion
1=keine Reaktion
MWI: Speicherschreibzugriff mit Invalidierung 0=deaktiviert 1=aktiviert SZ: BM:
Sonderzyklen 0=ignorieren
1=erfassen
Busmaster 0=nein
1=ja
MAR: Speicheradressraum 0=deaktiviert
1=aktiviert
IOR: I/O-Adressraum 0=deaktiviert
1=aktiviert
Abb. 22.9: Befehlsregister
Ein gesetztes FBB-Bit ermöglicht so genannte Fast-Back-to-Back-Zyklen für verschiedene Targets. Dadurch sind weniger Blindzyklen zwischen zwei CPU-Bustransaktionen notwendig. Das SEE-Bit aktiviert (SEE=1) oder deaktiviert (SEE=0) den Treiber für das SERR-Signal. Wenn der Systemsteuerung Adressparitätsfehler mitgeteilt werden sollen, müssen SEE und PER beide gesetzt sein. Für PCI-Einheiten, die ein Adress/Daten-Stepping ausführen, muss das WZ-Bit gesetzt werden. Adress/Daten-Stepping bedeutet, dass nicht alle erforderlichen Adress-/Datensignale auf einmal aktiviert werden. Um die Belastung interner Treiber beim Aktivieren der Leitungen zu vermindern, werden sie nur blockweise oder über mehrere Taktzyklen hinweg allmählich hochgetrieben. Dadurch müssen die PCI-Einheiten etwas warten, bis alle Potenziale stabilisiert worden sind. Wenn das PERBit gesetzt ist, reagiert die PCI-Einheit auf Paritätsfehler; bei einem gelöschten PER-Bit werden alle Paritätsfehler ignoriert. Durch Setzen des VPS-Bits weisen Sie eine VGA-kompatible PCI-
Sandini Bib 756
Kapitel 22
Einheit an, Zugriffe auf das Palettenregister zu ignorieren. Für VPS=0 reagiert die Einheit normal. Ein gesetztes MWI-Bit erlaubt der Einheit, einen Speicherschreibzugriff mit Invalidierung auszulösen; ist MWI gelöscht, dann muss die Einheit stattdessen den gewöhnlichen Speicherschreibzugriff verwenden. Durch Löschen von SZ können Sie die Einheit anweisen, alle Sonderzyklen zu ignorieren. Ist SZ=1, dann erfasst die Einheit auch Sonderzyklen und reagiert ggf. darauf. Wenn eine Einheit als Busmaster wirken soll, müssen Sie das BM-Bit setzen. Ist MAR gesetzt, dann reagiert die Einheit auf einen Zugriff auf den Speicheradressraum, bei einem gesetzten IOR-Bit auf I/O-Zyklen.
8
DP FBB
DEV TIM
15 14 13 12 11 10 9
PER SER MAB TAB STA
Neben dem Befehls- ist auch ein Statusregister vorhanden, das den Status der betreffenden Einheit für einen PCI-Vorgang kennzeichnet. Der Aufbau des Registers ist in Abbildung 22.10 angegeben. 7
6
0
reserviert
PER: Paritätsfehler 0=kein Paritätsfehler
1=Paritätsfehler erfasst
SER: Systemfehler 0=kein Systemfehler
1=Systemfehler signalisiert
MAB: Master-Abort 0=kein Master-Abort
1=Master-Abort empfangen
TAB: Target-Abort 0=kein Target-Abort
1=Target-Abort empfangen
STA: Target-Abort 0=kein Target-Abort
1=Target-Abort signalisiert
DEVTIM: DEVSEL-Timing 00=schnell 01=mittel DP:
Datenparitätsfehler 0=kein Paritätsfehler
10=langsam
11=reserviert
1=Paritätsfehler erfasst
FBB: Fast-Back-to-Back-Zyklen 0=nicht unterstützt 1=unterstützt Abb. 22.10: Statusregister
Erfasst die Einheit einen Paritätsfehler, setzt sie das PER-Bit. Das SER-Bit wird gesetzt, wenn die Einheit das Signal SERR aktiviert. Bricht eine als Busmaster wirkende Einheit eine Transaktion ab, muss sie das MAB-Bit setzen. Ähnliches gilt für TAB, nur dass hier das Target den Vorgang abgebrochen hat. MAB und TAB werden vom Busmaster gesetzt. Dagegen wird STA von einer als Target arbeitenden Einheit gesetzt, wenn sie ein Target-Abort herbeigeführt hat. Die beiden DEVTIM-Bits legen das Zeitverhalten des DEVSEL-Signals fest. Das DP-Bit ist nur für Busmaster implementiert und wird gesetzt, wenn PERR aktiviert worden ist, die Einheit als Busmaster arbeitet und im Befehlsregister das PER-Bit gesetzt ist. Schließlich zeigt das für Targets implementierte FBB-Bit an, ob das Target Fast-Back-to-Back-Zyklen unterstützt (FBB=1) oder nicht unterstützt (FBB=0). Die Bits 6–0 sind reserviert und werden bis zur PCI-Version 2.0 nicht für PCI-Einheiten verwendet. Reservierte und nicht unterstützte Bereiche enthalten üblicherweise jeweils eine Null. Ab der Version 2.2, die ab dem Jahre 1999 in PCs realisiert wird, sind nur noch die Bits 0–3 und das Bit 6 im Statusregister als reserviert anzusehen. Bei einer PCI-Einheit, die 33 MHz unterstützt, steht im Bit 5 (66 MHz Capable, MHz) eine »0«. Einheiten, die 66 MHz (64 Bit) unterstützen, werden hier mit einer »1« ausgewiesen.
Sandini Bib Der PCI-Bus
757
Das Bit 4 firmiert ab PCI 2.2 als Capability List-ID (CPL). Befindet sich dieses Bit auf High, wird hiermit signalisiert, dass das Gerät erweiterte Funktionen unterstützt, und der Capabilities Pointer (34h, Byte 0) verweist auf das entsprechende Register im erweiterten Configuration Space, das die genaue Gerätefunktion definiert. Hiermit wird auch der AGP-Zugriff (Capability: 02) ermöglicht, worauf in Kapitel 23 eingegangen wird. Bits:
31–16
15–8
7–0
Typ: Funktion:
Feature Specific Register Gerätefunktion
Pointer to Next Capability 0: keine vorhanden
Capability ID 00: Reserviert 01: PCI Power Management 02: AGP 03: VPD (Virtual Product Data) 04: Slot Identification (Bridge) 05: Message Signaled Interrupts 06: CompactPCI Hot Swap
Tab. 22.3: Capability-Register
Prinzipiell können auf diese Art und Weise fast beliebig viele Erweiterungen des Configuration Space vorgenommen werden, was eben anhand der Capability List zu weiteren, fest definierten Bereichen innerhalb des 256 Byte umfassenden Bereichs führt. Falls das Capability Pointer Register (34h, Byte 0, acht Bit) Null enthält, ist keine Erweiterung vorhanden. Die neueste PCI-Spezifikation mit der Versionnummer 2.3 ist im Jahre 2002 in Kraft getreten. Im Befehlsregister (vgl. Abbildung 22.9) ist das Bit 10 nunmehr als Interrupt Disable-Bit (IDB) definiert, zuvor war es als reserviert gekennzeichnet. Dieses Bit wird nach einem Reset standardmäßig auf Null gesetzt, was bedeutet, dass dann eine Interrupt-Verarbeitung nach dem klassischen Prinzip erfolgt, also die INTA-INTD-Pins (über die ISA-IRQs gemappt) verwendet werden. Wird dieses Bit auf 1 gesetzt, was per BIOS-Setup oder auch von Windows (ab XP) durchgeführt werden kann, findet keine derartige Interrupt-Verarbeitung mehr statt. Stattdessen können Interrupts als Message Signaled Interrupts (MSI) verarbeitet werden. Dabei werden Interrupt Requests in Form von Nachrichten über einen hierfür reservierten Bereich im Speicher verarbeitet. MSIs werden über die Capability ID (siehe Tabelle 22.3) selektiert, und jedes geeignete PCI-Device muss hierfür ein eigenes Register (Message Control Register) in seinem Konfigurationsraum besitzen. Generell ist der klassische Interrupt-Modus aber noch der vorherrschende Mechanismus, und der APIC-Modus (siehe Kapitel 18) kann quasi die MSIs subsummieren.
Befehlsregister: reserviert
8
7
6
5
4
3
2
1 0
IDB FBB SEE WZ PER VPS MWI SZ BM MAR IOR
11 10 9
15
Statusregister: 5
4
3
MHz CPL ISB
DP FBB res.
DEV TIM
8
PER SER MAB TAB STA
7
6
15 14 13 12 11 10 9
2
0
reserviert
Abb. 22.11: Befehls- und Statusregister mit den Erweiterungen der PCI-Spezifikationen 2.2 und 2.3
Auch das Statusregister hat mit der PCI 2.3-Version ein neues Bit erhalten, und zwar Interrupt Status (ISB) im Bit 3. Der Sinn und Zweck dieses Bits ist in der Spezifikation (bisher) nicht eindeutig definiert. Es könnte jedoch für das Interrupt Sharing sinnvoll eingesetzt werden, weil
Sandini Bib 758
Kapitel 22
diese Aufgabe bisher dem Betriebssystem und den Gerätetreibern aufgebürdet wurde. Anhand dieses Bits wäre es daher möglich, ohne großen Aufwand festzustellen, welche PCI-Einheit einen Request angefordert hat, wenn sich eben mehrere PCI Devices einen Interrupt teilen. In Abbildung 22.11 sehen Sie die Belegung des Befehls- und Statusregisters mit den als fett gekennzeichneten Veränderungen gegenüber der PCI 2.0-Spezifikation. Ein Klassencode (0Ah–0Bh) gibt an, um welche Art von PCI-Einheit es sich jeweils handelt. Dazu ist dieses Feld in drei 1-Byte-Abschnitte unterteilt. Das höchstwertige Byte (bei Offset 0bh) spezifiziert den Basisklassencode, das mittlere Byte (bei Offset 0ah) den Subklassencode, und das niederwertige Byte (bei Offset 09h) liefert eine Programmierschnittstelle (Register Level Programming Interface, I/F), die bei einigen Einheiten stets fest als 00h definiert ist, zur entsprechenden Einheit. Die gültigen Basis- und Subklassencodes sind in Tabelle 22.4 angegeben, wobei auch hier wieder Erweiterungen durch die PCI-Bus-Spezifikationen 2.2 und 2.3 eingeflossen sind, was in der Tabelle mit Version 2.2 bzw. Version 2.3 entsprechend gekennzeichnet ist, und alle anderen gibt es bereits seit der Version 2.0 der PCI-Bus-Spezifikation. Basisklassencode 00h: Kompatibilität, bevor Klassencodedefinition erstellt wurde Subklassencode 00h 01h
Level Programming Interface 00h 00h
Typ alle bisherigen Einheiten außer VGA VGA-kompatibel
Basisklassencode 01h: Controller für Massenspeicher Subklassencode 00h 01h 02h 03h 04h 05h 05h 80h
Level Programming Interface 00h xxh 00h 00h 00h 20h (Version 2.3) 30h (Version 2.3) 00h
Typ SCSI IDE Floppy IPI RAID ATA, Single DMA ATA, Chained DMA anderer
Basisklassencode 02h: Netzwerk-Controller Subklassencode 00h 01h 02h 03h 04h 05h 06h 80h
Level Programming Interface 00h 00h 00h 00h 00h (Version 2.2) 00h (Version 2.3) xxh (Version 2.3) 00h
Typ Ethernet Token-Ring FDDI ATM ISDN World FIP (Feldbus) PICMG 2.14, Multi-Computing anderer
Basisklassencode 03h: Display-Controller Subklassencode 00h 00h 01h
Level Programming Interface 00h 01h 00h
Tab. 22.4: Die Klassencodes
Typ VGA 8514 XGA
Sandini Bib Der PCI-Bus
759
Basisklassencode 03h: Display-Controller Subklassencode 02h 80h
Level Programming Interface 00h 00h
Typ 3D anderer
Basisklassencode 04h: Multimedia-Controller Subklassencode 00h 01h 02h 80h
Level Programming Interface 00h 00h 00h (Version 2.2) 00h
Typ Video Audio Telefonie anderer
Basisklassencode 05h: Speicher-Controller Subklassencode 00h 01h 80h
Level Programming Interface 00h 00h 00h
Typ RAM Flash anderer
Basisklassencode 06h: Bridges Subklassencode 00h 01h 02h 03h 04h 0hh 05h 06h 07h 08h 09h 09h 0Ah 80h
Level Programming Interface 00h 00h 00h 00h 00h 01h (Version 2.2) 00h 00h 00h xxh (Version 2.2) 40h (Version 2.3) 80h (Version 2.3) 00h (Version 2.3) 00h
Typ Host-PCI PCI-ISA PCI-EISA PCI-MCA PCI-PCI PCI-PCI, Subtractive Decode PCI-PCMCIA PCI-NuBus PCI-CardBus Raceway, Switched Fabric Semi-transparent, primär zum Host Semi-transparent, sekundär zum Host InfiniBand anderer
Basisklassencode 07h: Standard-Controller Subklassencode 00h 00h 00h 00h 00h 00h 00h 01h 01h 01h 01h
Level Programming Interface 00h 01h 02h 03h (Version 2.2) 04h (Version 2.2) 05h (Version 2.2) 06h (Version 2.2) 00h 01h 02h 03h (Version 2.2)
Tab. 22.4: Die Klassencodes (Forts.)
Typ XT-kompatibler UART 16450-UART 16550-UART 16650-UART 16750-UART 16850-UART 16950-UART Standard-Parallel-Port Bi-directional Parallel Port ECP 1.0 Parallel Port IEEE 1284 Controller
Sandini Bib 760
Kapitel 22
Basisklassencode 07h: Standard-Controller Subklassencode 01h 02h 03h 03h 04h 04h 04h 04h 05h 80h
Level Programming Interface FEh (Version 2.2) 00h (Version 2.2) 00h (Version 2.2) 01h (Version 2.2) 00h (Version 2.3) 02h (Version 2.2) 03h (Version 2.2) 04h (Version 2.2) 00h (Version 2.3) 00h
Typ IEEE 1284 Device, Target Multiport Serial Controller Standard-Modem Hayes-kompatibles Modem (16450) IEEE 488 (GPIB) Hayes-kompatibles Modem (16550) Hayes-kompatibles Modem (16650) Hayes-kompatibles Modem (16750) Smart Card anderer
Basisklassencode 08h: System-Peripherie Subklassencode 00h 00h 00h 00h 00h 01h 01h 01h 02h 02h 02h 03h 03h 04h 80h
Level Programming Interface 00h 01h 02h 10h (Version 2.2) 20h (Version 2.2) 00h 01h 02h 00h 01h 02h 00h 01h 00h (Version 2.2) 00h
Typ 8259 Interrupt Controller ISA-PIC EISA-PIC IO-APIC, EISA IOx-APIC 8237-DMA-Controller ISA-DMA-Controller EISA-DMA-Controller Standard-8254-Timer ISA-System-Timer EISA-System-Timer Standard Real Time Clock ISA Real Time Clock PCI Hot Plug Controller anderer
Basisklassencode 09h: Input-Controller Subklassencode 00h 01h 02h 03h 04h 04h 80h
Level Programming Interface 00h 00h 00h 00h (Version 2.2) 00h (Version 2.2) 10h (Version 2.2) 00h
Typ Keyboard Digitizer, Stift Maus Scanner Standard-Gameport Gameport anderer
Basisklassencode 0Ah: Docking-Stations Subklassencode 00h 80h
Level Programming Interface 00h 00h
Tab. 22.4: Die Klassencodes (Forts.)
Typ Standard-Docking-Station anderer
Sandini Bib Der PCI-Bus
761
Basisklassencode 0Bh: Prozessor-Devices Subklassencode Level Programming Interface 00h 00h 01h 00h 02h 00h 10h 00h 20h 00h 30h 00h (Version 2.2) 40h 00h
Typ 386 486 Pentium Alpha PowerPC MIPS Coprozessor
Basisklassencode 0Ch: Serielle Buscontroller Subklassencode 00h 00h 01h 02h 03h 03h 03h 03h 04h 05h 06h 07h 07h 07h 08h 09h
Level Programming Interface 00h 10h (Version 2.2) 00h 00h 00h (Version 2.2) 10h (Version 2.2) 80h (Version 2.2) FEh (Version 2.2) 00h 00h (Version 2.2) 00h (Version 2.3) 00h (Version 2.3) 01h (Version 2.3) 02h (Version 2.3) 00h (Version 2.3) 00h (Version 2.3)
Typ Firewire, IEEE 1394 Firewire, Open HCI Spec. Access-Bus Serial Storage Architecture, SSA USB-Controller, USB Spec. USB Controller, Open Host Spec. USB Controller ohne I/F USB Device Fibre Channel System Management Bus, SMB InfiniBand IPMI SMIC Interface IPMI Keyboard Style Interface IPMI Block Transfer Device SERCOS Interface CANBus
Basisklassencode 0Dh: Drahtlose Controller Subklassencode 00h 01h 10h 11h 12h 80h
Level Programming Interface 00h (Version 2.2) 00h (Version 2.2) 00h (Version 2.2) 00h (Version 2.3) 00h (Version 2.3) 00h (Version 2.2)
Typ iRDA Consumer Infrared Radio Frequency Bluetooth Broadband anderer
Basisklassencode 0Eh: Intelligente Controller Subklassencode 00h 00h
Level Programming Interface xxh (Version 2.2) 00h (Version 2.2)
Typ I2O-Architektur Message FIFO
Basisklassencode 0Fh: Satelliten-Kommunikations-Controller Subklassencode Level Programming Interface Typ 01h 00h (Version 2.2) TV 02h 00h (Version 2.2) Audio 03h 00h (Version 2.2) Sprache 04h 00h (Version 2.2) Daten Tab. 22.4: Die Klassencodes (Forts.)
Sandini Bib 762
Kapitel 22
Basisklassencode 10h: Encryption/Decryption-Controller Subklassencode Level Programming Interface Typ 01h 00h (Version 2.2) Netzwerk 10h 00h (Version 2.2) Entertainment 80h 00h (Version 2.2) anderer Basisklassencode 11h: Datenerfassungs- und Signalprozessor-Controller Subklassencode Level Programming Interface Typ 00h 00h (Version 2.2) Digital Input/Output Module 01h 00h (Version 2.3) Zähler 10h 00h (Version 2.3) Synchronisation und Frequenzmessung 20h 00h (Version 2.3) Management Card 80H 00h (Version 2.2) anderer Sonstiges: 12h-FEH=reserviert, FFh= keine Gerätezuordnung möglich Tab. 22.4: Die Klassencodes (Forts.)
In der Praxis stellt sich bei der Verwendung der Klassencodes für eigene Entwicklungen heraus, dass man nicht zu frühzeitig die neueren Codes verwenden sollte, weil es nicht sichergestellt ist, dass das BIOS, mit dem die eigene Karte auch korrekt angezeigt werden soll, tatsächlich ebenfalls auf dem gleichen technischen Stand ist. Falls dies nicht der Fall sein sollte, wird beim Boot vielfach unknown Device angezeigt, was doch eher zur Verwirrung beiträgt, zumal sich dieses Device dann lediglich über die Vendor- und Device-ID, die natürlich beide bekannt sein müssen, ansprechen lässt und nicht über einen Klassencode. Dies ist auch der Grund dafür, warum speziellere Karten oftmals als Multimedia-Devices bezeichnet werden, obwohl man den jeweiligen Typ nicht im Standard (siehe Tabelle 22.4) findet. Genaueres zur Selektierung und Programmierung von PCI-Einheiten finden Sie in Kapitel 22.10. Für viele der spezifizierten Basis- und Subklassencodes existieren klar definierte Programmierschnittstellen, so dass dann keine Programmierschnittstelle über das niederwertige Byte (bei Offset 09h) des Klassencodeeintrags notwendig ist. Für einige andere Einheiten ist bisher keine solche Programmierschnittstelle definiert worden. Alle aufgeführten Klassen haben dann einen Eintrag 00h im Feld Level Programming Interface. Der Eintrag Revision im Header (08h, Byte 0) enthält eine ID, die die jeweilige Hardware-Version des PCI-Device ausweist. Der Header-Eintrag CLG (Cache-Line-Größe, 0Ch Byte 0) definiert die Cache-Line-Größe des Systems in Einheiten zu 32 Bytes. Er ist z.B. für den Befehl Speicherschreibzugriff mit Invalidierung notwendig. Der Eintrag Latenz gibt an, wie lange ein PCI-Busvorgang dauern kann: Die effektive Zeitspanne beträgt Latenz+8 PCI-Taktzyklen. Das höchstwertige Bit im BIST-Register gibt an, ob die Einheit einen Selbsttest (Built-In Self-Test) ausführen kann (Bit 7=1). Ist das der Fall, so können Sie den BIST auslösen, indem Sie das Bit 6 (Start BIST) mit einem Wert 1 beschreiben. Der BIST gibt dann in den vier niederwertigen BISTBits 3...0 einen Abschlusscode (Completion Code) zurück. Jeder von Null verschiedene Wert zeigt dabei einen Fehler an. PCI-Einheiten weisen häufig einen separaten I/O- oder Speicherbereich auf, den sie nutzen, um z.B. Peripherie anzusteuern, Daten abzulegen, Programme auszuführen etc. PCI erlaubt nun mit Hilfe des oder der Basisadressregister(s), diese I/O- und Speicherbereiche beliebig im I/O- oder Speicheradressraum anzuordnen. In Abbildung 22.12 sehen Sie die Struktur der Basisadressregister für eine 32/64-Bit-Speicherbasis und eine 32-Bit-I/O-Basis. Je nach Implementierung kann der Speicheradressraum 32 oder 64 Bits umfassen, der I/O-Adressraum aber stets nur 32 Bits (wovon die 80x86-CPUs wiederum nur das niederwertige Adresswort AD15–AD0 verwenden).
Sandini Bib Der PCI-Bus
763
Bit 0 unterscheidet eine Speicherbasisadresse (Bit 0=0) von einer I/O-Basisadresse (Bit 0=1). Je nach Adressgröße sind drei bis sechs Basisadressen möglich; der entsprechende Eintrag im Header umfasst 24 Bytes. Zunächst möchte ich den Eintrag für eine Speicherbasis erläutern. Um ein Remapping eines Adressbereichs ausführen zu können, muss die POST-Routine natürlich wissen, wie groß der abzubildende Bereich sein soll. Zu diesem Zweck sind alle Bits im zugehörigen Basisregister, die praktisch einen Offset innerhalb des abzubildenden Adressbereichs darstellen, als Wert 0 fest verdrahtet. Die POST-Routine kann dann die Größe des Bereichs einfach bestimmen, indem sie die Basisadresse mit lauter Einsen beschreibt und anschließend den Basisadresswert ausliest. Alle mit dem Wert Null zurückgegebenen Bits befinden sich innerhalb des abzubildenden Adressbereichs, alle auf 1 gesetzten Bits sollen dem Remapping unterworfen werden. Wenn z.B. die Bits 15 bis 4 als 0 und die Bits 31 (oder 63) bis 16 als 1 zurückgegeben werden, umfasst der abzubildende Bereich 64 KByte, weil die 16 niederwertigen Bits 216 Byte = 64 KByte adressieren können (die vier niederwertigen Bits 3 bis 0 können zwar nicht verändert werden, gehen aber in die Ermittlung der Bereichsgröße ein). Das Remapping wird ausgeführt, indem die POST-Routine die als 1 zurückgegebenen Adressbits mit der gewünschten Basisadresse überschreibt. Wie Sie erkennen, wird das Remapping in Blöcken zu 16 Bytes, 32 Bytes, 64 Bytes, ..., 1 KByte, 2 KByte etc. ausgeführt. Weil der Basisadresseintrag im Header mehrere Basisadressen aufnehmen kann, lässt sich auch eine fragmentierte Abbildung realisieren.
63
32 31
16 15
4
Basisadresse
3
2
PRF
Basisadressregister für Speicheradressraum Typ 0
1 0
Basisadressregister für I/O-Adressraum 31
16 15
2
1 0
0 1
Basisadresse
Basisadressregister für Erweiterungs-ROM 16 15
Basisadresse
PRF: Prefetching 0=nicht möglich
2
reserviert
1 0
0
1=Prefetching möglich
Typ: Positionierungstyp 00=beliebige 32-Bit-Adresse 10=beliebige 64-Bit-Adresse AD:
11 10
AD
31
01=unterhalb von 1 MByte 11=reserviert
Adressdekodierung und Erweiterungs-ROM 0=deaktiviert 1=aktiviert
Abb. 22.12: Basisadressregister für Speicher- und I/O-Ports sowie Erweiterungs-ROM-Basisadresse
Ermöglicht die Einheit ein Prefetching, d.h., kann die Bridge Daten auf Vorrat von der Einheit in einen Puffer lesen, ohne dass die Einheit gestört wird oder ungünstige Nebeneffekte auftreten, dann ist das PRF-Bit gesetzt. Der 2-Bit-Eintrag Typ gibt an, auf welchen Adressbereich die Abbildung erfolgen kann. Ein Wert 00b bedeutet, dass es sich um ein 32-Bit-Register handelt, das auf eine beliebige Adresse im 32-Bit-Adressraum abgebildet werden kann; ein Wert 10b hat eine ähnliche Bedeutung, nur umfassen hier das Register und der Adressraum jeweils 64 Bits. Der Wert 01b ist für 32-Bit-Register vorgesehen, die auf eine 20-Bit-Adresse unterhalb von 1 MByte abgebildet werden müssen.
Sandini Bib 764
Kapitel 22
Das Remapping für I/O-Adressen erfolgt in analoger Weise, nur sind hier lediglich die beiden niederwertigen Bits 1 und 0 unveränderlich (Bit 0=1 gibt an, dass eine Abbildung im I/O-Adressraum ausgeführt wird). I/O-Adressbereiche lassen sich also in Einheiten zu 2 Bytes, 4 Bytes, ... abbilden. Ein Remapping von zwei Bytes bedeutet üblicherweise, dass ein einziger 32-Bit-I/O-Port an einer geeigneten Stelle des I/O-Adressraums platziert wird. Unter der Adresse 28h befindet sich im Header bei Card-Bus-Einheiten ein Pointer-Register für die so genannte CIS (Card Information Structure). Wie es im Kapitel über PCMCIA und den Card Bus erläutert wird, stellt der bei Notebooks übliche Card Bus quasi das Pendant zu PCI bei einem Standard-PC dar und hält sich an das PCI-Plug&Play. Optional sind die Einträge unter 2Ch, denn hier kann eine Subsystem Vendor ID (Byte 0–1) und eine Subsystem Device ID (Byte 2–3) festgelegt werden, wobei hier prinzipiell die gleichen Zusammenhänge gelten wie bei den oben erläuterten Einheiten- und Hersteller-IDs. Die Subsystem IDs erlauben eine genauere Spezifizierung der PCI-Einheit. Vielfach werden die Einheitenund Hersteller-IDs, die vom Hersteller des Chips stammen und demnach auch von der PCI-SIG abgesegnet worden sind, verwendet, und bei den Subsystem-IDs werden die Codes des jeweiligen Kartenherstellers eingesetzt. Durch die Erweiterungs-ROM-Basisadresse können Sie eine ROM-Erweiterung an eine beliebige Stelle in einem 32-Bit-Speicheradressraum verschieben. Das Remapping erfolgt genauso wie für 32-Bit-Basisadressen, nur sind hier die 21 höherwertigen Bits für die Abbildung vorgesehen. ROMs können also in Einheiten zu 2 KByte, 4 KByte, ... auftreten und abgebildet werden. Durch Setzen von AD aktivieren Sie das Erweiterungs-ROM, d.h. Adressen werden dekodiert; ein Wert Null deaktiviert die ROM-Erweiterung. Dadurch lässt sich eine PCI-Einheit wahlweise mit oder ohne ROM-Erweiterung betreiben. Nur wenn AD gesetzt ist, hat die Remapping-Adresse in den Bits 32–11 eine Bedeutung. Der Header-Eintrag INT-Leit. gibt an, auf welche Hardware-Interrupt-Leitung IRQx der InterruptAnschluss der Einheit oder Funktion abgebildet wird. Gültig sind die Werte 0 bis 15 entsprechend IRQ0 bis IRQ15. Die Interrupt-Routing-Logik der PCI-Bridge aktiviert dann den entsprechenden Eingang des PIC. Welchen Interrupt-Anschluss die Einheit oder Funktion tatsächlich verwendet, ist durch INT-Pin definiert: Ein Wert 1 bedeutet INTA, ein Wert 2 INTB etc. Verwendet die Einheit keine Interrupts, ist hier der Wert 0 notwendig. Die beiden nur-lesbaren Register MinGNT und MaxLat geben den vom Hersteller der PCI-Einheit gewünschten minimalen bzw. maximalen Latenzwert an, damit die Einheit den PCI-Bus optimal nutzen kann.
22.7.1 PCI-Power Management Die PCI-Bus-Version 2.2 bringt einige Veränderungen des Konfigurationsraums mit sich, wobei die CIS, die Subsystem-IDs sowie der Capability Pointer bereits behandelt worden sind. Die wichtigste Neuerung betrifft jedoch das Power Management. Die hierfür relevanten Register werden über die Capability-ID PCI Power Management (01, siehe Tabelle 22.3) selektiert. In Next Item Pointer (siehe Tabelle 22.5) kann die Adresse einer weiteren Configuration-Space-Erweiterung angegeben werden. Falls es keine davon gibt, ist dieses Byte mit Null belegt. Ganz allgemein ist das Power Management für PCs mit etwas Skepsis zu betrachten, wenn man einerseits den technischen Aufwand für den Entwickler und Programmierer mit ins Kalkül zieht und andererseits zur Kenntnis nehmen muss, dass sich der Stromverbrauch aktueller CPUs und Grafikkarten laufend drastisch steigert, was immer stärkere (und lautere) PC-Netzteile erfordert. Dagegen mögen sich die paar mA einer PCI-Karte geradezu lächerlich gering ausmachen. Gleichwohl erscheint es sinnvoll, einen PC bei Nichtbenutzung in einen Schlafmodus schicken
Sandini Bib Der PCI-Bus
765
zu können, der bei Reaktivierung genau an der Stelle fortfährt (geöffnete Programme, Dokumente etc.), wo er zuvor unterbrochen wurde. Deswegen müssen konsequenterweise auch PCIEinheiten mit in die (globalen) Power-Management-Funktionen einbezogen werden. Für das PCI Power Management gibt es am PCI-Slot nunmehr zwei zusätzliche Signale, und zwar PME (Pin A19) und VAUX mit 3,3 V (Pin A14), die bei den vorherigen PCI-Bus-Versionen mit reserviert gekennzeichnet sind. Wie die oben erwähnten Neuerungen stellt das PCI-Power Management aber lediglich eine optionale Eigenschaft dar, die nicht zwangsläufig implementiert werden muss. Mithilfe des Signals PME wird das System in einen Schlafmodus und auch wieder zurück in den normalen Betriebsmodus versetzt. Über die 3,3 V-Spannung an VAUX wird das PCI-Device im Schlafmodus mit Spannung versorgt, damit es das Signal PME entsprechend verarbeiten kann. Die Spannung VAUX ist also bei einem ATX-PC, der nicht per Schalter (Mechanical Off) vom Netz getrennt ist, auch im ausgeschalteten Zustand vorhanden. Das Power Management des PCI-Bus hält sich im Wesentlichen an ACPI (Advanced Configuration and Power Management Interface), wobei hier jedoch auch Bus-spezifische Besonderheiten mit berücksichtigt werden. Grundsätzlich werden die verschiedenen Power States eines (beliebigen) Gerätes durch D-States beschrieben, und für den PCI-Bus selbst sind vier PCI-Bus Power States definiert worden, die als B-States bezeichnet werden. Eine Besonderheit ist, dass der D3-Zustand noch einmal unterteilt wird, und zwar in D3hot und D3cold, wobei der wesentliche Unterschied darin besteht, dass bei letzterem die Betriebsspannung abgeschaltet wird. Vorgeschrieben ist für PCI-Devices neben diesen beiden D3-States nur noch D0 (voll betriebsbereit). Bei D1 werden einige Funktionen der PCI-Einheit zum Stromsparen abgeschaltet, was unter Light Sleep State firmiert. D2 (Deep Sleep) entspricht prinzipiell D1, jedoch soll hiermit eine signifikante Reduzierung der Leistungsaufnahme erreicht werden, was allerdings nicht im Detail definiert ist und in der Regel in die Verantwortung des Betriebssystems verlagert wird. Der D3-Zustand (Full Off) stellt die höchste Stufe des Power Managements dar, bei dem es sich quasi um den Aus-Zustand einer Einheit handelt. Bei D3hot ist das PCI-Device nicht betriebsbereit, der PCI-Bus ist dabei jedoch weiterhin aktiv. Sowohl bei D1, D2 und auch D3hot muss die PCI-Einheit auf Configuration-Space-Zugriffe reagieren können, um per Software wieder aktiviert werden zu können. Um aus dem D3cold-State wieder in den aktiven D0-State zu gelangen, ist nach der Wiederherstellung der Versorgungsspannung ein Reset über den PCI-Bus notwendig. Die PCI-Bus Power States (B-States) betreffen nicht das eigentliche PCI Device, sondern den PCI-Bus selbst. B0 entspricht einem voll betriebsbereiten PCI-Bus. Im B1-State sind die Versorgungsspannungen und der PCI-Bus-Takt zwar vorhanden, es werden aber keine Transaktionen durchgeführt, und das Signal PME wird ausgewertet, um wieder in den B0-State zurückkehren zu können. Der B2-State unterscheidet sich vom B1-State lediglich dadurch, dass das PCI-Bus-Taktsignal abgeschaltet ist, und im B3-State ist außerdem auch noch die Versorgungsspannung abgeschaltet. Das Device wird dann ausschließlich von VAUX versorgt und reagiert allein auf PME, um wieder in einen anderen State umgeschaltet werden zu können. In der Tabelle 22.5 sehen Sie die Erweiterungen für das PCI-Power-Management.
Sandini Bib 766
Kapitel 22
Byte 3
Offset 40h
Byte 2
Power Management Capabilities
44h
Data
Bridge Support
Byte 1
Byte 0
Next Item Pointer
Capabilities ID (01)
Power Management Control/Status
Tab. 22.5: Ergänzungen des Konfigurationsraums für das PCI-Power Management
PME Support
8
7
6
AUX Current
5
4
DSI res.
11 10 9
D2 D1
15
3
2
CLK
Das Register mit der Bezeichnung Power Management Capabilities (PMC) beschreibt alle Eigenschaften eines PCI-Device bezüglich des Power Managements. In der Regel sind die hier abgelegten Informationen durch das Design des PCI-Gerätes festgelegt und können nicht verändert werden; sie sind dann also nur lesbar. 1 0
Version
VERSION: Spezifiziert die Power Management-Version 001=Version 1.0 010=Version 1.1 CLK: PME-Takt 0=Einheit benötigt kein Taktsignal für die PME-Signalerkennung 1=Einheit benötigt Taktsignal für die PME-Signalerkennung res.: Reserviert und hier ohne Bedeutung DSI: Device Specific Initialisation 0=keine zusätzliche Initialisierung notwendig 1=zusätzliche Initialisierung notwendig AUX Current: Kennzeichnet die Stromaufnahme der PCI-Einheit 111:375 mA 110:320 mA 101:270 mA 100: 220 mA 011:160 mA 010:100 mA 001:55 mA 000:Angabe im Data-Register oder VAUX wird nicht verwendet D1: Zustand D1 0=wird nicht unterstützt
1=wird unterstützt
D1: Zustand D2 0=wird nicht unterstützt
1=wird unterstützt
PME Support: Kennzeichnet, in welchem D-Zustand das PME-Signal vom Device generiert werden kann xxx1:D0 xx1x:D1 xx1xx:D2 x1xxx:D3hot 1xxx:D3cold
Abb. 22.13: Power Management Capabilities
Das Power Management Control- und Status-Register (PMCSR) enthält Informationen über den aktuellen Zustand des Power-Managements. Alle Bits bis auf die mit reserviert bezeichneten sowie Bit 13 und 14 (Data Scale) sind sowohl les- als auch beschreibbar. Üblicherweise ist das Betriebssystem mit dem passenden Treiber für das PCI-Device für die entsprechende Interpretation und Verwaltung der hier geltenden Funktionen zuständig. Den Aufbau des PMCSR sehen Sie in Abbildung 22.14.
Sandini Bib
8
Data Select
7
2
reserviert
1 0
PS1 PS0
15 14 13 12 11 10 9
EN
767
ST DS1 DS0
Der PCI-Bus
PS0,PS1: Festlegen oder Lesen des Power State 00=D0 01=D1 10=D2 11=D3hot res.:
Reserviert(0)und hier ohne Bedeutung
EN:
Enable PME, einschalten der PME-Signal-Funktion 0=abschalten 1=einschalten
Data Select: nur bei implementiertem Data Register DS0,DS1: Data Scale, nur bei implementiertem Data Register ST:
Status von PME 0=kein Ereignis aufgetreten
1=Ereignis aufgetreten
Abb. 22.14: Power Management Control/Status
Die Data-Select- und die Data-Scale-Bits sind nur dann von Bedeutung, wenn das PCI-Device auch über ein Data-Register (siehe Offset 04h Byte 3 in Tabelle 22.6) verfügt, andernfalls sind die Bits 9–14 fest auf 0 gelegt. Die Verwendung eines Data-Registers ist also nur eine optionale Funktion, wobei es mehrere Bedeutungen, die nur lesbar sind, haben kann. Die genaue Bedeutung des Data-Register-Inhalts ergibt sich aus dem Wert in den Data-Select-Bits, und mithilfe der beiden Data-Scale-Bits wird die Wertigkeit der Daten im Data-Register bestimmt, wie es in Tabelle 22.6 angegeben ist. Data Select 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h-FFh
Data Scale
Bedeutung im Data Register
00b=unbekannt 01b=multipliziert mit 0.1 10b=multipliziert mit 0.01 11b=multipliziert mit 0.01
Leistungsaufnahme in W im D0-Zustand Leistungsaufnahme in W im D1-Zustand Leistungsaufnahme in W im D2-Zustand Leistungsaufnahme in W im D3-Zustand Wärmeabgabe in W im D0-Zustand Wärmeabgabe in W im D1-Zustand Wärmeabgabe in W im D2-Zustand Wärmeabgabe in W im D3-Zustand Leistungsaufnahme in W bei Multi-Function Devices Reserviert für zukünftige Anwendungen
Tab. 22.6: Mithilfe der Data-Select- und Data-Scale-Bits wird die Bedeutung der Daten im Data-Register festgelegt.
22.8 PCI-Bus-Slots PCI ist auf eine Adress- und Datenbusbreite von mindestens 32 Bits ausgelegt, separate 8-Bitund 16-Bit-Abschnitte gibt es hier nicht. Stattdessen ist eine Erweiterung nach oben auf 64 Bits vorgesehen. Aufbau und Signalbelegung eines PCI-Slots sehen Sie in Abbildung 22.15. Deutlich ist das Multiplexing-Schema für die Daten- und Adressbits zu erkennen. Der 32-Bit-Abschnitt weist 124 Kontakte auf, von denen aber nur 120 tatsächlich belegt sind. Die restlichen vier Kontakte sind durch Kodierstege blockiert. PCI trägt durch die verschiedenen Slots der technischen Entwicklung Rechnung, dass für stromsparende PCs die 3,3 V-Technologie
Sandini Bib 768
Kapitel 22
eingesetzt wird. Dadurch wird bei CMOS-Schaltkreisen die Leistungsaufnahme halbiert. Sie hängt nämlich quadratisch von der Versorgungsspannung ab. Manche höchstintegrierten Schaltungen können darüber hinaus die normalen 5 V gar nicht mehr vertragen, weil ihre internen Strukturen (vor allem die Kanalbreite der MOSFETs) durchbrennen würden. Eine weitere PCIForderung im Hinblick auf eine geringe Leistungsaufnahme ist, dass jede PCI-Einheit mit einem Taktsignal zwischen 0 MHz und 33 MHz arbeiten können muss. Dadurch kann z.B. das Taktsignal abgeschaltet werden (0 MHz), um die Leistungsaufnahme um mehr als 99,9% zu reduzieren. Zunächst möchte ich die Signale der ursprünglichen PCI-Bus-Spezifikation, der Version 2.0, erläutern. Mit den Erweiterungen der Versionen 2.2 und 2.3 sind einige Signale am Slot hinzugekommen, die in Kapitel 22.9.3 näher beschrieben werden. Die ursprüngliche Version stellt immer den kleinsten gemeinsamen Nenner dar. Vielfach ist weder der Beschreibung zum Mainboard noch der Beschreibung zur PCI-Einsteckkarte zu entnehmen, welche Spezifikation hier jeweils zugrunde liegt, so dass man dann eigentlich nur davon ausgehen kann, dass es sich um die am weitesten verbreitete Version 2.0 handelt. Die beiden Present-Kontakte PRSNT1 und PRSNT2 werden einzeln oder zusammen von einem eingesetzten PCI-Adapter auf Masse gelegt oder offen gelassen, um neben dem Vorhandensein eines Adapters auch seine Leistungsaufnahme anzugeben. Ist kein Adapter eingesetzt, dann bleiben natürlich beide Kontakte offen. Im Einzelnen gelten die Zuordnungen nach der Tabelle 22.7. PRSNT1
PRSNT2
Bedeutung
offen GND offen GND
offen offen GND GND
kein Adapter eingesetzt Adapter mit max. 25 W Leistungsaufnahme Adapter mit max. 15 W Leistungsaufnahme Adapter mit max. 7,5 W Leistungsaufnahme
Tab. 22.7: Present-Kontakte
Die mit I/O gekennzeichneten Anschlüsse stellen besondere Versorgungsanschlüsse für einen Universaladapter dar, der sowohl mit 5 V als auch mit 3,3 V betrieben werden kann. Solche Adapter können in einen beliebigen Slot eingesetzt werden. Zu beachten ist dabei, dass neben den besonderen +5 V-I/O- und +3,3 V-I/O-Anschlüssen auch gewöhnliche +5 V-Anschlüsse (5 V-Slot) und normale 3,3 V-Anschlüsse (3,3 V-Slot) vorhanden sind. PCI sieht in der 32-Bit-Version drei verschiedene Platinentypen vor, nämlich 5 V-, 3,3 V- und Universalplatinen. Die 5 V-Platinen weisen eine Aussparung an den Pin-Stellen A50/B50 und A51/B51 auf. Sie passen also nur in 5 V-Slots. In ähnlicher Weise haben die 3,3 V-Adapter eine Aussparung an den Pin-Stellen A12/B12 und A13/B13. Damit die Universalplatinen sowohl in 5 V- als auch 3,3 VSlots eingesetzt werden können, sind dort zwei Aussparungen vorhanden, nämlich bei A50/B50, A51/B51 (5 V-Kodierung) und bei A12/B12, A13/B13 (3,3 V-Kodierung). Der 64-Bit-Abschnitt ist vom 32-Bit-Anteil durch einen Steg getrennt. Er ist optional und nimmt das höherwertige Doppelwort eines Quadwort-Wertes oder einer Quadwort-Adresse auf. Die Steuer- und Statusanschlüsse REQ64 und ACK64 zur Aktivierung der 64-Bit-Erweiterung sind aber bereits im 32-Bit-Anteil untergebracht. Durch die eng beieinander liegenden Kontakte ist der 64-Bit-PCI-Slot trotz seiner maximal 188 Kontakte recht kompakt. Neben der 64-Bit-Erweiterung sind auch einige Signale des Standard-32-Bit-Slots optional, müssen also nicht unbedingt implementiert sein, um der PCI-(Minimal-)Spezifikation zu genügen. Die geforderten und optionalen Signale sind in Tabelle 22.8 zusammengefasst dargestellt.
Sandini Bib Der PCI-Bus
769
5V-Platine
64-Bit-Abschnitt
32-Bit-Abschnitt
B -12V TCK GND TDO +5V +5V INTB INTD PRSNT1 res PRSNT2 GND GND res GND CLK GND REQ +5VI/O AD31 AD29 GND AD27 AD25 +3,3V C/BE3 AD23 GND AD21 AD19 +3,3V AD17 C/BE2 GND IRDY +3,3V DEVSEL GND LOCK PERR +3,3V SERR +3,3V C/BE1 AD14 GND AD12 AD10 GND Cod. Cod. AD8 AD7 +3,3V AD5 AD3 GND AD1 +5VI/O ACK64 +5V +5V res GND C/BE6 C/BE4 GND AD63 AD61 +5VI/O AD59 AD57 GND AD55 AD53 GND AD51 AD49 +5VI/O AD47 AD45 GND AD43 AD41 GND AD39 AD37 +5VI/O AD35 AD33 GND res res GND
A 01
10
20
30
40
49 52
60 62 63
70
80
90 94
3,3V-Platine B
TRST +12V TMS TDI +5V INTA INTC +5V res +5VI/O res GND GND res RST +5VI/O GNT GND res AD30 +3,3V AD28 AD26 GND AD24 IDSEL +3,3V AD22 AD20 GND AD18 AD16 +3,3V FRAME GND TRDY GND STOP +3,3V SDONE SBO GND PAR AD15 +3,3V AD13 AD11 GND AD9 Cod. Cod. C/BE0 +3,3V AD6 AD4 GND AD2 AD0 +5VI/O REQ64 +5V +5V
-12V TCK GND TDO +5V +5V INTB INTD PRSNT1 res PRSNT2 Cod. Cod. res GND CLK GND REQ +3,3VI/O AD31 AD29 GND AD27 AD25 +3,3V C/BE3 AD23 GND AD21 AD19 +3,3V AD17 C/BE2 GND IRDY +3,3V DEVSEL GND LOCK PERR +3,3V SERR +3,3V C/BE1 AD14 GND AD12 AD10 GND GND GND AD8 AD7 +3,3V AD5 AD3 GND AD1 +3,3VI/O ACK64 +5V +5V
GND C/BE7 C/BE5 +5VI/O PAR64 AD62 GND AD60 AD58 GND AD56 AD54 +5VI/O AD52 AD50 GND AD48 AD46 GND AD44 AD42 +5VI/O AD40 AD38 GND AD36 AD34 GND AD32 res GND res
res GND C/BE6 C/BE4 GND AD63 AD61 +3,3VI/O AD59 AD57 GND AD55 AD53 GND AD51 AD49 +3,3VI/O AD47 AD45 GND AD43 AD41 GND AD39 AD37 +3,3VI/O AD35 AD33 GND res res GND
A 01
10 11 14
20
30
40
50
60 62 63
70
80
90 94
TRST +12V TMS TDI +5V INTA INTC +5V res +3,3VI/O res Cod. Cod. res RST +3,3VI/O GNT GND res AD30 +3,3V AD28 AD26 GND AD24 IDSEL +3,3V AD22 AD20 GND AD18 AD16 +3,3V FRAME GND TRDY GND STOP +3,3V SDONE SBO GND PAR AD15 +3,3V AD13 AD11 GND AD9 GND GND C/BE0 +3,3V AD6 AD4 GND AD2 AD0 +3,3VI/O REQ64 +5V +5V GND C/BE7 C/BE5 +3,3VI/O PAR64 AD62 GND AD60 AD58 GND AD56 AD54 +3,3VI/O AD52 AD50 GND AD48 AD46 GND AD44 AD42 +3,3VI/O AD40 AD38 GND AD36 AD34 GND AD32 res GND res
Abb. 22.15: Die PCI-Slots nach der ursprünglichen PCI-Bus-Spezifikation: PCI definiert zwei verschiedene SlotGeometrien für 5 V-, 3,3 V- und Universaladapter (für 3,3 V und 5 V). Sie werden durch verschiedene Kodierstege unterschieden, so dass Adapter nicht fehlerhaft eingesetzt werden können. Außerdem ist ein 64-Bit-Abschnitt vorgesehen.
Sandini Bib 770
Kapitel 22
gefordert
optional
AD31–AD0, C/BE3–C/BE0, PAR, FRAME, TRDY, IRDY, STOP, DEVSEL, IDSEL, PERR, SERR, REQ, GNT, CLK, RST
AD63–AD32, C/BE7–C/BE4, PAR64, REQ64, ACK64, LOCK, INTA, INTB, INTC, INTD, SBO, SDONE, TDI, TDO, TCK, TMS, TRST
Tab. 22.8: Geforderte und optionale PCI-Anschlüsse und Signale
Bei einem so genannten Shared-Slot finden Sie direkt neben dem PCI-Slot noch einen ISA- oder EISA-Slot. Shared-Slot besagt nichts anders, als dass hier entweder eine ISA/EISA- oder eine PCIKarte eingesteckt werden kann – natürlich nicht in den gleichen Slot, sondern die beiden verschiedenen Slot-Typen liegen nur mechanisch sehr dicht beieinander.
22.9 PCI-Bus-Signale Weil PCI wie der MicroChannel oder EISA auch Busmaster auf PCI-Adaptern unterstützt, sind alle Anschlüsse bidirektional. Um den Daten- und Signalfluss klarer darzustellen, habe ich für die angegebenen Übertragungsrichtungen aber angenommen, dass die CPU (oder eine andere Einheit des Mainboards) den gegenwärtigen Busmaster darstellt. Die Anschlüsse sind nach der 32-Bit- und 64-Bit-Gruppe geordnet und alphabetisch aufgeführt.
22.9.1 Standard-32-Bit-Abschnitt ACK64 (I/O) Anschluss B60 Ein aktives Acknowledge-64-Bit-Transfer-Signal mit niedrigem Pegel zeigt an, dass sich die PCIEinheit als Target des gegenwärtigen Buszyklus identifiziert hat und den angeforderten 64-BitTransfer ausführen kann. AD31–AD0 (I/O) Anschlüsse A20, A22–A23, A25, A28–A29, A31–A32, A44, A46–A47, A49, A54–A55, A57–A58, B20–B21, B23–B24, B27, B29–B30, B32, B45, B47–B48, B52–B53, B55–B56, B58 Die 32 Adress- und Datenanschlüsse bilden den zeitlich gemultiplexten PCI-Adress- und Datenbus. Jeder PCI-Busvorgang besteht aus einer Adressierungsphase, während der die Anschlüsse AD31–AD0 eine Adresse übertragen, und einer oder mehreren Datenphasen, in denen Daten übergeben werden. C/BE3–C/BE0 (I/O) Anschlüsse A52, B26, B33, B44 Die Bus-Command- und Byte-Enable-Signale werden auf diesen vier Anschlüssen übertragen. Sie bilden wie AD31–AD0 einen zeitlich gemultiplexten Bus. Während der Adressierungsphase geben die Signale C/BE3–C/BE0 den Buszyklustyp an. Dabei sind den möglichen Kombinationen von C/BE3–C/BE0 folgende Bedeutungen zugeordnet: C/BE3–C/BE0
Kommando
C/BE3–C/BE0
Kommando
0000 0001 0010
INTA-Sequenz Sonderzyklus I/O-Lesezugriff
1000 1001 1010
reserviert reserviert Konfiguration-Lesezugriff
Tab. 22.9: Die PCI-Buskommandos
Sandini Bib Der PCI-Bus
771
C/BE3–C/BE0
Kommando
C/BE3–C/BE0
Kommando
0011 0100 0101 0110 0111
I/O-Schreibzugriff reserviert reserviert Speicher-Lesezugriff Speicher-Schreibzugriff
1011 1100 1101 1110 1111
Konfiguration-Schreibzugriff Speicher-Mehrfachlesezuriff Dual-Adressierungszyklus Line-Speicher-Lesezugriff Speicher-Schreibzugriff mit Invalidierung
Tab. 22.9: Die PCI-Buskommandos (Forts.)
In der Datenphase definieren die Byte-Enable-Signale BE3–BE0, welche Bytes des 32-Bit-Datenbus gültige Werte übertragen. Beachten Sie, dass zwischen den gültigen Bytes »Lücken« auftreten können (z.B. ist die Kombination BE3=0, BE2=1, BE1=BE0=0 gültig). CLK (O) Anschluss B16 Der Anschluss gibt das PCI-Taktsignal für alle PCI-Vorgänge an. Laut Spezifikation hat es eine Frequenz zwischen 0 MHz und 33 MHz. DEVSEL (I/O) Anschluss B37 Ein aktives Device-Select-Signal mit niedrigem Pegel zeigt an, dass die Dekodierlogik die zugehörige PCI-Einheit als Target eines Busvorgangs identifiziert hat. FRAME (I/O) Anschluss A34 Das FRAME-Signal wird vom aktiven PCI-Master getrieben. Ein Abfallen von FRAME auf einen niedrigen, d.h. aktiven Pegel leitet die Adressierungsphase ein. Der Master deaktiviert FRAME wieder, um die letzte Datenphase eines Busvorgangs anzuzeigen. GNT (O) Anschluss A17 Ein aktives Grant-Signal mit niedrigem Pegel zeigt der zugehörigen Einheit an, dass die Arbitrierungslogik ihr den Bus zugeteilt hat und sie den PCI-Bus nun als Master benutzen kann. Jeder Master weist einen eigenen GNT-Eingang auf. IDSEL (O) Anschluss A26 Das Initialization-Device-Select-Signal wird während eines Zugriffs auf den Konfigurationsadressraum als Chipauswahlsignal verwendet, um die zu konfigurierende Einheit festzulegen und anzusprechen. INTA, INTB, INTC, INTD (I, I, I, I) Anschlüsse A6–A7, B7–B8 Jede PCI-Funktionseinheit kann über ein Signal mit niedrigem Pegel an diesen Anschlüssen maximal vier Hardware-Interrupts auslösen. Hardware-Interrupts sind pegelgetriggert mit einem aktiv-niedrigen Pegel. Für einen PC werden INTA bis INTD der jeweiligen Einheiten aus Kompatibilitätsgründen auf den Hardware-Interrupts IRQ0 bis IRQ15 abgebildet.
Sandini Bib 772
Kapitel 22
IRDY (I/O) Anschluss B35 Das Initiator-Ready-Signal zeigt an, dass der Initiator (Busmaster) bereit ist und die gegenwärtige Datenphase abschließen kann. Bei einem Schreibzugriff aktiviert der Initiator das IRDY-Signal, um anzuzeigen, dass gültige Daten auf dem Bus liegen. Für einen Lesezugriff gibt IRDY an, dass der Initiator die Lesedaten annehmen kann. IRDY entspricht also dem Prozessor-READY, nur dass es vom Initiator (Master) und nicht vom Target (Slave) ausgegeben wird. Nur wenn IRDY und TRDY zugleich aktiv sind, wird die Datenphase auch tatsächlich abgeschlossen. LOCK (I/O) Anschluss B39 Ein aktives LOCK-Signal mit niedrigem Pegel definiert einen atomischen Zugriff, der sich über mehrere Busvorgänge erstreckt. Zugriffe auf nicht-verriegelte Elemente können dennoch ausgeführt werden, d.h. LOCK sperrt nur den Zugriff auf das PCI-Element, nicht aber den PCI-Bus als Ganzes für fremde Zugriffe. Das LOCK-Signal der 80x86-CPUs sperrt dagegen den kompletten lokalen CPU-Bus und damit die Übergabe an einen anderen Master. PAR (I/O) Anschluss A43 Der Paritätsanschluss übergibt ein Paritätsbit so, dass gerade Parität über AD31–AD0 und C/BE3– C/BE0 erzielt wird, d.h., die Anzahl aller Einsen in AD31–AD0, C/BE3–C/BE0 und PAR ist gerade. PERR (I/O) Anschluss B40 Ein aktives Parity-Error-Signal mit niedrigem Pegel zeigt für alle PCI-Vorgänge außer Sonderzyklen an, dass ein Datenparitätsfehler aufgetreten ist. PRSNT1, PRSNT2 Anschlüsse B9, B11 Die beiden Present-Kontakte PRSNT1 und PRSNT2 werden einzeln oder zusammen von einem eingesetzten PCI-Adapter auf Masse gelegt oder offen gelassen, um neben dem Vorhandensein eines Adapters auch seine Leistungsaufnahme anzugeben (siehe Tabelle 22.7). REQ (I) Anschluss B18 Ein aktives Request-Signal mit niedrigem Pegel zeigt der Arbitrierungslogik an, dass die zugehörige Einheit den Bus als Master benutzen möchte. Jeder Master weist einen eigenen REQ-Ausgang auf. REQ64 (I/O) Anschluss A60 Ein aktives Request-64-Bit-Transfer-Signal mit niedrigem Pegel zeigt an, dass der gegenwärtige Busmaster einen 64-Bit-Transfer ausführen möchte. RST (O) Anschluss A15 Ein aktives Reset-Signal mit niedrigem Pegel setzt alle angeschlossenen PCI-Einheiten zurück.
Sandini Bib Der PCI-Bus
773
SBO (I/O) Anschluss A41 Ein aktives Snoop-Backoff-Signal mit niedrigem Pegel an diesem Anschluss zeigt einen Abfragetreffer auf eine modifizierte Cache-Line an. SBO unterstützt zusammen mit SDONE einen WriteThrough- oder Write-Back-Cache, der sich dann im Bereich der PCI-Bridge befindet und im Adressraum der CPU liegt. SDONE (I/O) Anschluss A40 Ein aktives Snoop-Done-Signal mit hohem Pegel gibt an, dass der gegenwärtige Abfragezyklus abgeschlossen ist. SERR (I/O) Anschluss B42 Ein aktives System-Error-Signal mit niedrigem Pegel zeigt für alle PCI-Vorgänge einen Adressparitätsfehler, einen Datenparitätsfehler für Sonderzyklen oder einen anderen schwerwiegenden Systemfehler an. STOP (I/O) Anschluss A38 Durch ein aktives STOP-Signal mit niedrigem Pegel zeigt das Target einem Master (Initiator) an, dass der Master den gegenwärtigen Vorgang abbrechen soll (Target-Abort). TCK, TDI, TDO, TMS, TRST (I, O, O, O, O) Anschlüsse A1, A3, A4, B2, B4 Die fünf Anschlüsse bilden die Schnittstelle für einen JTAG-Boundary-Scan-Test nach IEEE 1149.1. Über TDI (Test Data Input) werden im Takt von TCLK (Test Clock) Testdaten oder Testbefehle eingegeben und über TDO (Test Data Output) werden sie ausgegeben. Ein aktives TMS-Signal (Test Mode Select) aktiviert die TAP-Steuerung, ein aktives TRST (Test Reset) setzt sie zurück. TRDY (I/O) Anschluss A36 Das Target-Ready-Signal zeigt an, dass die adressierte PCI-Einheit – das Target – bereit ist und die gegenwärtige Datenphase abschließen kann. Bei einem Schreibzugriff aktiviert das Target TRDY, um anzuzeigen, dass es die Schreibdaten übernehmen kann. Für einen Lesezugriff gibt TRDY an, dass das Target nun die Lesedaten bereitstellt. TRDY entspricht also dem ProzessorREADY. Nur wenn TRDY und IRDY zugleich aktiv sind, wird die Datenphase auch tatsächlich abgeschlossen.
22.9.2 Die 64-Bit-Erweiterung Die 64-Bit-Erweiterung für den PCI-Bus erfordert 39 zusätzliche Signal-Pins, die an einem verlängerten PCI-Bus-Slot zur Verfügung gestellt werden. Bisher ist diese Erweiterung eher selten in üblichen Standard-PCs zu finden, sondern vielmehr bei Mainboards, die bei Servern zum Einsatz kommen. Mit einer 32-Bit-Adressierung lässt sich ein maximaler Speicher von 4 GByte adressieren, wohingegen sich mit einer 64-Bit-Adressierung die (unvorstellbare) Größe von 17 Milliarden Gigabyte adressieren lässt. Auch wenn wir von derartigen Speichergrößen noch entfernt sind, gibt es durchaus Anwendungen, bei denen sich 4 GByte als zu knapp bemessen erweisen können, wie etwa in leistungsfähigen Multiprozessor-Systemen.
Sandini Bib 774
Kapitel 22
Prinzipiell kann zwar auch in einem 32-Bit-PCI-System eine 64-Bit-Adressierung ausgeführt werden, indem zwei 32-Bit-Zyklen absolviert werden, was als Dual Address Cycle (DAC) bezeichnet wird. Gleichwohl ist von dieser Möglichkeit bisher kaum Gebrauch gemacht worden, zumal ein konsequentes 64-Bit-Design gegenüber 32 Bit den Vorteil der doppelten Transferrate (bei gleichem Takt) mit sich bringt, wie es für Gigabit-Ethernet- und Ultra 160 SCSI- und erst recht für Ultra 320 SCSI-Adapter notwendig wird. Zu beachten ist, dass die Signale ACK64 sowie REQ64 für die Absolvierung eines 64-Bit-Datentransfers mit in der 32-Bit-PCI-Bus-Sektion (s.o.) untergebracht sind, so dass die Beschreibung der zusätzlichen 64-Bit-Signale hier recht knapp ausfallen kann. Generell wird eine PCI-Einheit, die den 64-Bit-PCI-Bus unterstützt, durch die Aktivierung von REQ64 während der Reset-Phase (RST) erkannt. AD63–AD32 (I/O) Anschlüsse A68, A70–A71, A73–A74, A76–A77, A79–A80, A82–A83, A85–A86, A88–A89, A91, B68–B69, B71–B72, B74–B75, B77–B78, B80–B81, B83–B84, B86–B87, B89–B90 Diese 32 Adress- und Datenanschlüsse bilden die Erweiterung des zeitlich gemultiplexten PCIAdress- und Datenbus auf 64 Bits. Jeder PCI-Busvorgang besteht aus einer Adressierungsphase, während der die Anschlüsse AD63–AD32 eine Adresse übertragen, falls REQ64 und ein DACCommand (Dual Address Cycle) aktiv sind; sonst sind AD63–AD32 reserviert. In der oder den Datenphasen wird über AD63–AD32 das höherwertige Doppelwort eines 64-Bit-Quadworts übergeben, wenn REQ64 und ACK64 beide aktiv sind. C/BE7–C/BE4 (I/O) Anschlüsse A64–A65, B65–B66 Die Bus-Command- und Byte-Enable-Signale werden ähnlich wie C/BE3–C/BE0 auf diesen vier Anschlüssen übertragen. Sie bilden also einen zeitlich gemultiplexten Bus. Während der Adressierungsphase geben die Signale C/BE7–C/BE4 in gleicher Weise wie C/BE3–C/BE0 den Buszyklustyp an (siehe dort). In der Datenphase definieren die Byte-Enable-Signale BE7–BE4 zusammen mit BE3–BE0, welche Bytes des 64-Bit-Datenbus gültige Werte übertragen. PAR64 (I/O) Anschluss A67 Der Paritätsanschluss übergibt ein Paritätsbit so, dass gerade Parität über AD63–AD32 und C/BE7– C/BE4 erzielt wird. PAR64 hat dasselbe Timing wie AD63–AD32, ist demgegenüber aber um einen Clock-Takt verzögert. Neben der Erweiterung auf 64-Bit ist außerdem statt 33 MHz ein maximaler Takt von 66 MHz möglich, was somit neben der Verdoppelung der Bus-Bandbreite eine weitere Verdoppelung der Datentransferrate zur Folge hat. Die Erhöhung der Taktfrequenz geht dabei mit der Reduzierung der Versorgungsspannung auf 3,3 V statt 5 V einher. Dies bedeutet für die Praxis, dass entweder eine explizit als 3,3 V gekennzeichnete Erweiterungskarte oder eine Universal-PCI-Karte, die sowohl 5 V als auch 3,3 V unterstützt, im 64-Bit-Betrieb zu verwenden ist, was gleichermaßen für PCI-X gilt. Durch die Kodierstege in den PCI-Slots soll das Einstecken nicht geeigneter PCI-Karten in einen bestimmten Slot-Typ zwar verhindert werden, allerdings kann man sich nicht immer darauf verlassen, dass die Hersteller auch die gebotene Sorgfalt haben walten lassen, so dass sicherheitshalber eine genaue Kontrolle der Karten und Mainboard-Slots anzuraten ist, wenn es sich nicht um eine gebräuchliche 32-Bit-PCI-Karte handeln sollte.
Sandini Bib Der PCI-Bus
775
Üblicherweise realisiert ein PCI-Chipset, der auch 64-Bit-Slots unterstützt, zwei PCI-Bus-Segmente: ein konventionelles Segment mit 32 Bit und eines mit 64 Bit, wobei nur dieses auch 66 MHz unterstützt. Falls in die Slots eines 64-Bit-Segments eine konventionelle PCI-Karte eingesteckt wird, arbeiten alle hier angeschlossenen Slots aber nur mit maximal 33 MHz. Der Vollständigkeit halber sei angemerkt, dass es durchaus 64-Bit-PCI-Bus-Implementierungen gibt, die keinen Takt von 66 MHz, sondern nur 33 MHz bieten, wie es beispielsweise bei einigen (älteren) Dual-Mainboards für Athlon-CPUs der Fall ist. Die Erhöhung der PCI-Bus-Taktfrequenz auf 66 MHz (oder 133 MHz bei PCI-X; siehe Kapitel 22.11) hat generell zur Folge, dass die machbaren Distanzen und auch die Anzahl der möglichen Slots (typischerweise zwei) gegenüber einem Takt von 33 MHz geringer ausfallen, was schon von anderen Bussystemen (z.B. VLB) her eine bekannte Tatsache ist. Schon aus diesem Grunde erscheint die Aufteilung in verschiedene PCI-Bussegmente notwendig zu sein, wofür wieder entsprechende Bridges (z.B. 66-MHz-PCI-Bridge) zum Einsatz kommen.
22.9.3 Signalerweiterungen der Spezifikationen 2.2 und 2.3 Wie eingangs bereits erwähnt, haben sich die nachfolgenden PCI-Spezifikationen nicht nur in einem erweiterten Configuration Space (siehe Kapitel 22.7) niedergeschlagen, sondern haben auch einige Signalerweiterungen am Slot zur Folge. Mit der Spezifikation 2.2 sind lediglich die Pins PME und VAUX hinzugekommen, die zudem auch nur als optional zu interpretieren sind. PME (I) Anschluss A19 Mit dem Signal PME (Power Management Enable) wird das System in einen Schlafmodus (Low) und auch wieder zurück in den normalen Betriebsmodus versetzt. Der Kontakt A19 war zuvor als reserviert gekennzeichnet. VAUX (O) Anschluss A14 Diese Hilfsspannung von 3,3 V dient der Versorgung eines PCI-Devices im Power Management D3cold-State. Die übliche Versorgungsspannung ist dabei abgeschaltet. Nach dem Aufwachimpuls ist ein Reset-Signal für die Neuinitialisierung der Einheit notwendig. Das Timing des ResetSignals (RST) ist hierfür gegenüber der ursprünglichen PCI-Bus-Spezifikation geändert worden. Der Kontakt A14 war zuvor als reserviert gekennzeichnet. SMBCLK (O) Anschluss A40 Der System-Management-Bus (SMB), der in Kapitel 19.5 beschrieben ist, wird auf Mainboards bereits seit geraumer Zeit als serieller Hilfsbus verwendet, etwa für die Ansteuerung des ClockChips, das Auslesen der EEPROMs auf den Speichermodulen oder auch für die SupervisoryChips, mit deren Hilfe Temperaturen und Lüfterdrehzahlen ermittelt werden. Nunmehr können auch PCI-Karten direkt mit diesem Bus kommunizieren, und SMBCLK stellt das Taktsignal hierfür dar. Der Kontakt A40 war zuvor mit dem Signal SDONE belegt, das es demnach nicht mehr gibt, und somit ist auch keine Snooping-Möglichkeit mehr gegeben. SMBDAT (I/O) Anschluss A41 System-Management-Bus-Data bildet das Datensignal des SMBs, das mit dem Taktsignal SMBCLK synchronisiert ist. Der Kontakt A41 war zuvor mit dem Signal SBO belegt, das es demnach nicht mehr gibt.
Sandini Bib 776
Kapitel 22
PCIXCAP (O) Anschluss A38 Das Signal PCI-X-Capability wird für die Detektierung einer PCI-X-Karte (siehe Kapitel 22.11) verwendet. Bis auf diese Veränderung gibt es am PCI-Slot keinen Unterschied zwischen PCI-64Bit, wo sich dieser Pin auf Masse befindet, und PCI-X. Die genannten Signalveränderungen sind für viele Anwendungen im Prinzip nicht von großer Bedeutung. Allerdings werden PCI-Karten nach der 2.3-Spezifikation entweder als UniversalKarten ausgelegt, d.h., es ist ein Betrieb mit 5 V oder 3,3 V möglich, oder aber es sind ausgesprochene 3,3 V-Karten. Reine 5 V-PCI-Karten werden nicht mehr unterstützt, was somit einen »Umzug« von älteren PCI-Karten auf ein aktuelleres Mainboard möglicherweise nicht erlaubt. Der Wegfall der beiden Signale (SBO, SDONE), die für CPU-externe Cache-Implementierungen gedacht waren, ist sicher zu verschmerzen, da hiervon ohnehin kaum Gebrauch gemacht wurde.
22.10 PCI-spezifische BIOS-Routinen Auf den PCI-Konfigurationsraum kann man mit den einzelnen Funktionen des BIOS-Interrupts 1ah zugreifen. Ich möchte sie zunächst kurz aufführen und in den folgenden Kapiteln praktische Beispiele hierfür aufzeigen. PCI-BIOS vorhanden? Diese Funktion ermittelt, ob ein PCI-BIOS vorhanden ist. Register
Aufrufwert
Rückgabewert
AH AL BH BL CL EDX Carry
b1h 01h
00h=vorhanden, 01h-ffh=nicht vorhanden 1) Konfigurationsmechanismen, Sonderzyklen 2) Version (Hauptebene), Major Number Version (Subebene), Minor Number Nummer des letzten PCI-Bus im System String »PC« ('P' in DL, 'C' in DH etc.) Status: 1=kein PCI-BIOS 1)
1)
PCI-BIOS nur vorhanden, wenn auch EDX gleich »PCI « 0=1: Konfigurationsmechanismus #1, Bit 1=1: Konfigurationsmechanismus #2, Bit 4=1: Sonderzyklus durch Konfigurationsmechanismus #1, Bit 5=1: Sonderzyklus durch Konfigurationsmechanismus #2
2) Bit
PCI-Einheit suchen Diese Funktion ermittelt anhand der Einheiten- und Herstelleridentifizierung sowie eines Index N die PCI-Adresse der Einheit, d.h. Busnummer, Einheitennummer und Funktionsnummer der N-ten Einheit, die die Suchmaske erfüllt. Register
Aufrufwert
Rückgabewert
AH AL BH BL CX
b1h 02h
Erfolgscode nach Tabelle 22.10 Busnummer Bits 7...3: Einheit, Bits 2...0: Funktion
Einheit
Sandini Bib Der PCI-Bus
777
Register
Aufrufwert
DX SI Carry
Hersteller Index
Rückgabewert
1=Fehler, 0=o.k.
PCI-Einheit nach Klassencode suchen Diese Funktion ermittelt anhand eines bestimmten Klassencodes die PCI-Adresse der N-ten Einheit, die diesen Klassencode aufweist. Register
Aufrufwert
Rückgabewert
AH AL BH BL ECX SI Carry
b1h 03h
Erfolgscode nach Tabelle 22.10 Busnummer Bits 7...3: Einheit, Bits 2...0: Funktion
Klassencode Index 1=Fehler, 0=o.k.
Sonderzyklus auslösen Diese Funktion löst auf einem bestimmten PCI-Bus des Systems einen Sonderzyklus aus. Der 32-Bit-Wert in EDX wird in der Datenphase auf den Adress-/Datenbus ADx gesendet. Register
Aufrufwert
Rückgabewert
AH AL BH EDX Carry
b1h 06h Busnummer Daten
Erfolgscode nach Tabelle 22.10
1=Fehler, 0=o.k.
Konfigurationsbyte/Wort/Doppelwort lesen Die drei Funktionen lesen ein Byte (8 Bits), Wort (16 Bits) oder Doppelwort (32 Bits) aus dem Konfigurationsraum einer PCI-Einheit. Register
Aufrufwert
AH AL BH BL CL/CX/ECX DI Carry
b1h Erfolgscode nach Tabelle 22.10 08h (Byte), 09h (Wort), 0ah (DWort) Busnummer Bits 7...3: Einheit, Bits 2...0: Funktion gelesenes Byte, Wort, DWort Registernummer 1=Fehler, 0=o.k.
Rückgabewert
Konfigurationsbyte/Wort/Doppelwort schreiben Die drei Funktionen schreiben ein Byte (8 Bits), Wort (16 Bits) oder Doppelwort (32 Bits) in den Konfigurationsraum einer PCI-Einheit.
Sandini Bib 778
Kapitel 22
Register
Aufrufwert
Rückgabewert
AH AL BH BL CL/CX/ECX DI Carry
b1h Erfolgscode nach Tabelle 22.10 0bh (Byte), 0ch (Wort), 0dh (DWort) Busnummer Bits 7...3: Einheit, Bits 2...0: Funktion zu schreibendes Byte/Wort/DWort Registernummer 1=Fehler, 0=o.k.
Die Funktionen geben im Register AH einen Erfolgscode zurück. Die möglichen PCI-BIOSErfolgscodes sind in der Tabelle 22.10 zusammengefasst angegeben. Code
Bedeutung
00h 81h 83h 86h 87h 88h 89h
erfolgreicher Abschluss Funktion wird nicht unterstützt ungültige Herstelleridentifizierung Einheit nicht gefunden ungültige Registernummer Fehlfunktion Buffer zu klein
Tab. 22.10: PCI-BIOS-Erfolgscodes
22.10.1 Das Interface zum BIOS Unter Verwendung der erläuterten grundlegenden BIOS-Routinen des Interrupts 1ah ist die Kommunikation mit den PCI-Devices möglich. Der Vollständigkeit halber sei erwähnt, dass noch weitere Funktionsaufrufe im BIOS implementiert sind, die zusammengefasst in der Tabelle 22.11 angegeben sind. Funktionsnummer
Bedeutung
B101h B102h
Installation Check Find PCI Device
Funktion
Testet, ob ein PCI-BIOS vorhanden ist Suchen eines PCI-Device anhand der Vendor- und Device-ID B103h Find PCI Class Code Suchen eines PCI-Device anhand der Class-Codes B106h PCI specific operations Auslösen eines Special Cycle, je nach Gerätefunktion B108h Read Configuration Byte Lesen der Konfigurationsdaten als Byte B109h Read Configuration Word Lesen der Konfigurationsdaten als Word B10Ah Read Configuration Double Word Lesen der Konfigurationsdaten als Double-Word B10BH Write Configuration Byte Schreiben der Konfigurationsdaten als Byte B10Ch Write Configuration Word Schreiben der Konfigurationsdaten als Word B10Dh Write Configuration Double Word Schreiben der Konfigurationsdaten als Double-Word B10Eh Get IRQ Routing Information Lesen der Interrupt-Zuordnung B10Fh Set PCI IRQ Setzen der Interrupt-Zuordnung B181h-B18Fh 32 Bit Section BIOS-API für den Protected Mode (32 Bit) Tab. 22.11: Die BIOS-Funktionsaufrufe für PCI in der Übersicht
Sandini Bib Der PCI-Bus
779
Da mit ein paar dieser Routinen alle wichtigen Eigenschaften von PCI-Devices zu ermitteln sind (Chipset, eingesetzte Karten, AGP vorhanden? etc.), wird im Folgenden gezeigt, wie dies programmiertechnisch realisiert werden kann. Die Funktion pci_bios_present Bevor eine PCI-Einheit angesprochen werden soll, ist zunächst zu prüfen, ob ein PCI-BIOS vorhanden ist. Dazu bedient man sich der Funktion pci_bios_present: int pci_bios_present(byte *hardware_mechanism, word *interface_level_version, byte *last_pci_bus_number)
Es folgt die Definition der Variablen: int ret_status; byte bios_present_status; dword pci_signature; word ax, bx, cx, flags; ;
Funktionswert Zeigt an, ob das PCI-BIOS gefunden wurde PCI–Signatur ('P', 'C', 'I', ' ') Temporäre Variablen zum Zwischenspeichern der Registerwerte
Die Parameterübergabe an Interrupt-Funktionen erfolgt über die Prozessorregister. Sie werden hier mit ihren Werten versorgt. Im Register _AH steht für alle PCI-BIOS-Funktionen der Wert B1h. Das Register _AL wird mit 01h initialisiert, der Code für die BIOS-Funktion mit pci_bios_present: _AH = PCI_FUNCTION_ID; _AL = PCI_BIOS_PRESENT;
Nun kann der BIOS-Interrupt aufgerufen werden: geninterrupt(0x1a); (Borland C)
In den folgenden Registern stehen daraufhin die Ergebnisse des Aufrufs. Sie müssen gesichert werden, bevor der nachfolgende Programmcode sie wieder überschreibt: ax = _AX; bx = _BX; cx = _CX; pci_signature = _EDX; flags = _FLAGS; bios_present_status = HIGH_BYTE(ax);
Wenn das Carry-Flag gesetzt ist, ist das PCI-BIOS nicht vorhanden: if ((flags & CARRY_FLAG) == 0)
Nun muss geprüft werden, ob AH (BIOS Present Status) gleich 0 ist: if (bios_present_status == 0) {
Die Bytes in pci_signature werden geprüft. Sie müssen den String »PCI« ergeben: if ((pci_signature & 0xff) ((pci_signature >> 8) & 0xff) ((pci_signature >> 16) & 0xff) ((pci_signature >> 24) & 0xff)
== == == ==
'P' && 'C' && 'I' && ' ') {
Das BIOS ist vorhanden, der Rückgabewert der Funktion wird entsprechend gesetzt: ret_status = SUCCESSFUL;
Die Rückgabewerte werden initialisiert. Die Variable hardware_mechanism gibt an, welcher Konfigurationsmechanismus (1 oder 2) unterstützt wird. Die Variable interface_level_version enthält die
Sandini Bib 780
Kapitel 22
Versionsnummer des PCI-BIOS. Wird eine Eins zur Variablen last_pci_bus_number addiert, so erhält man die Anzahl der PCI-Busse im System: if (hardware_mechanism != NULL) { *hardware_mechanism = LOW_BYTE(ax); } if (hardware_mechanism != NULL) { *interface_level_version = bx; } if (hardware_mechanism != NULL) { *last_pci_bus_number = LOW_BYTE(cx); } } } else ret_status = NOT_SUCCESSFUL; } else ret_status = NOT_SUCCESSFUL; return (ret_status); }
Die Funktion find_pci_device Ist das PCI-BIOS vorhanden, kann nach der Karte gesucht werden. Dies erledigt die Funktion Suche PCI-Einheit, die über den Interrupt-Offset 02h aufgerufen wird. Der Funktion sind als Suchkriterien die Geräte- und Herstellernummer sowie ein Index zu übergeben. Der Index kann die Karte spezifizieren, falls mehrere Karten mit gleicher Hersteller- und Gerätenummer im System gefunden werden. Ist der Index 0, wird die erste Karte gesucht, 1 sucht die zweite usw. Die Funktion gibt dann im Erfolgsfall die Busnummer zurück, auf dem das Gerät erkannt wurde, sowie ein Byte, in dem der Index (obere 5 Bits) und die Funktionsnummer (untere 3 Bits) zurückgegeben werden. Beide Werte werden später zum Aufruf anderer BIOS-Funktionen benötigt (z.B. für Zugriffe auf den Konfigurationsraum mit der Funktion read_configuration_word) und sollten vom Programm vermerkt werden. Die Funktion ist folgendermaßen definiert: int find_pci_device(word word word byte byte
device_id, vendor_id, index, *bus_number, *device_and_function){
Es folgt die Definition der Variablen: int ret_status; word ax, bx, flags; ;
Funktionswert Temporäre Variablen zum Zwischenspeichern der Registerwerte
Die Prozessorregister werden mit ihren Werten versorgt. Im Register _CX erwartet das PCI-BIOS die Gerätenummer und im Register _DX die Herstellernummer. _SI muss den Index enthalten, und in _AH steht wieder wie für alle PCI-BIOS-Funktionen der Wert B1h. Das Register _AL wird mit 02h initialisiert, dies ist der Code für die BIOS-Funktion find_pci_device: _CX _DX _SI _AH _AL
= = = = =
device_id; vendor_id; index; PCI_FUNCTION_ID; FIND_PCI_DEVICE;
Es folgt der Aufruf des Interrupts: geninterrupt(0x1a);
In den folgenden Registern stehen nun die Ergebnisse des Aufrufs. Sie müssen gesichert werden, bevor der nachfolgende Programmcode sie wieder überschreibt:
Sandini Bib Der PCI-Bus
781
ax = _AX; bx = _BX; flags = _FLAGS;
Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: if ((flags & CARRY_FLAG) == 0) {
Der BIOS-Returncode wird ausgewertet: ret_status = HIGH_BYTE(ax); if (ret_status == SUCCESSFUL) {
Wenn das BIOS keine Fehlermeldung zurückgegeben hat, können die Rückgabewerte (Busnummer, Index und Funktionsnummer) ausgewertet werden: if (bus_number != NULL) { *bus_number = HIGH_BYTE(bx); } if (device_and_function != NULL) { *device_and_function = LOW_BYTE(bx); } } } else ret_status = NOT_SUCCESSFUL; return (ret_status); }
Die Funktion find_pci_class_code Diese Funktion ist der eben beschriebenen Funktion find_pci_device sehr ähnlich. Sie liefert die gleichen Parameter zurück, verwendet jedoch andere Suchkriterien. Statt der Geräte- und Herstellernummer verlangt sie die Angabe des Klassencodes. Der Index ist weiterhin anzugeben, da auch hier mehrere Karten gefunden werden können. Die Definition der Funktion ist wie folgt: int find_pci_class_code(dword class_code, word index, byte *bus_number, byte *device_and_function) { int ret_status; Funktionswert word ax, bx, flags; Temporäre Variablen zum Zwischenspeichern ; der Registerwerte
Die Prozessorregister werden mit ihren Werten versorgt. Das Register _SI muss wieder den Index enthalten, und im Register _ECX wird nun der Klassencode als Suchkriterium übergeben. Der Interrupt-Offset für diese Funktion ist 03h (übergeben im _AL-Register): _ECX = class_code; _SI = index; _AH = PCI_FUNCTION_ID; _AL = FIND_PCI_CLASS_CODE;
Es folgt der Interrupt-Aufruf: geninterrupt(0x1a);
Die Register werden wieder gesichert, bevor sie vom nachfolgenden Programmcode überschrieben werden: ax = _AX; bx = _BX; flags = _FLAGS;
Sandini Bib 782
Kapitel 22
Auch hier zeigt das ggf. gesetzte Carry-Flag einen Fehler an: if ((flags & CARRY_FLAG) == 0) {
Der BIOS-Returncode wird ausgewertet: ret_status = HIGH_BYTE(ax); if (ret_status == SUCCESSFUL) {
Wenn das BIOS keine Fehlermeldung zurückgegeben hat, können die Rückgabewerte (Busnummer, Index und Funktionsnummer) ausgewertet werden: if (bus_number != NULL) { *bus_number = HIGH_BYTE(bx); } if (device_and_function != NULL) { *device_and_function = LOW_BYTE(bx); } } } else ret_status = NOT_SUCCESSFUL; return (ret_status); }
Die Funktion read_configuration_area Die Funktion read_configuration_area ist eine Sammelfunktion für die PCI-BIOS-Funktionen read_configuration_byte, read_configuration_word und read_configuration_dword (Offsets 08h bis 0Ah). Sie wird über Zwischenfunktionen gleichen Namens aufgerufen, die der universellen Funktion read_configuration_area mitteilen, in welcher Datenwortbreite der Zugriff erfolgen soll. Exemplarisch soll hierzu die Funktion read_configuration_dword vorgestellt werden: Die Funktion read_configuration_dword: int read_configuration_dword(byte bus_number, byte device_and_function, byte register_number, dword *dword_read) { int ret_status; Funktionswert dword data;
BIOS-Funktion read_configuration_area aufrufen: ret_status = read_configuration_area(READ_CONFIG_DWORD, bus_number, device_and_function, register_number, &data); if (ret_status == SUCCESSFUL) { /* Doppelwort auswerten: */ *dword_read = data; } return (ret_status); }
Man erkennt, dass diese Funktion lediglich mit den ihr übergebenen Parametern die Funktion read_configuration_area aufruft, wobei der zusätzliche Parameter function (siehe unten) der Funktion mitteilt, welche Wortbreite gewünscht wird.
Sandini Bib Der PCI-Bus
783
Die Funktion read_configuration_area: static int read_configuration_area(byte function, byte bus_number, byte device_and_function, byte register_number, dword *data) { int ret_status; Funktionswert word ax, flags; Temporäre Variablen zum Zwischenspeichern der ; Registerwerte dword ecx;
Die PCI-BIOS-Register werden initialisiert. Das Register _BH speichert die Busnummer, das Register _BL Gerät und Funktion (wie mit der Funktion find_pci_device ermittelt); das Register _AL speichert die Funktion (08h für Bytezugriff, 09h für Wort- und 0Ah für Langwortzugriff) und das Register _DI speichert die Nummer des gewünschten Registers: _BH _BL _DI _AH _AL
= = = = =
bus_number; device_and_function; register_number; PCI_FUNCTION_ID; function;
Der PCI-BIOS-Interrupt 1Ah wird aufgerufen: geninterrupt(0x1a);
Auch hier müssen die Register wieder zwischengespeichert werden: ecx = _ECX; ax = _AX; flags = _FLAGS;
Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: if ((flags & CARRY_FLAG) == 0) {
Returncode vom BIOS auswerten: ret_status = HIGH_BYTE(ax);
Wenn der Zugriff erfolgreich war, kann das Datum weitergegeben werden: if (ret_status == SUCCESSFUL) { *data = ecx; } } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); }
22.10.2 Eine universelle PCI-Unit Mithilfe dieser grundlegenden Operationen sollte es nicht allzu schwer fallen, eine Unit zu erstellen, die die wichtigsten PCI-Funktionen implementiert, um dann mit einem Anwenderprogramm (Testprogramm, Treiber) hierauf zugreifen zu können. Das folgende Listing zeigt, wie eine derartige PCI-Unit aussehen kann.
Sandini Bib 784
Kapitel 22
/***********************************************************************/ /* Interface-Unit zum PCI-BIOS */ /* pciunit.h */ /* Hier definierte Funktionen: */ /* PCI_BIOS_PRESENT */ /* FIND_PCI_DEVICE */ /* FIND_PCI_CLASS_CODE */ /* GENERATE_SPECIAL_CYCLE */ /* READ_CONFIGURATION_BYTE */ /* READ_CONFIGURATION_WORD */ /* READ_CONFIGURATION_DWORD */ /* WRITE_CONFIGURATION_BYTE */ /* WRITE_CONFIGURATION_WORD */ /* WRITE_CONFIGURATION_DWORD */ /* OUTPD */ /* INPD */ /* INSB */ /* INSW */ /* INSD */ /* OUTSB */ /* OUTSW */ /* OUTSD */ /* */ /* Lokale Funktionen: */ /* */ /* READ_CONFIGURATION_AREA */ /* WRITE_CONFIGURATION_AREA */ /* */ /***********************************************************************/ /* Programm-Module: */ #include <dos.h> #include <stddef.h> /***********************************************************************/ /* Allgemeine Konstanten: */ #define TRUE 1 #define FALSE 0 typedef unsigned char byte; /* 8-bit */ typedef unsigned short word; /* 16-bit */ typedef unsigned long dword; /* 32-bit */ #define CARRY_FLAG 0x01 /* 80x86 Flags Register Carry Flag Bit */ /***********************************************************************/ /* PCI-Funktionen: */ /***********************************************************************/ #define PCI_FUNCTION_ID 0xb1 #define PCI_BIOS_PRESENT 0x01 #define FIND_PCI_DEVICE 0x02 #define FIND_PCI_CLASS_CODE 0x03 #define GENERATE_SPECIAL_CYCLE 0x06 #define READ_CONFIG_BYTE 0x08 #define READ_CONFIG_WORD 0x09 #define READ_CONFIG_DWORD 0x0a #define WRITE_CONFIG_BYTE 0x0b #define WRITE_CONFIG_WORD 0x0c #define WRITE_CONFIG_DWORD 0x0d /***********************************************************************/ /* PCI-Returncode-Liste: */ /***********************************************************************/ #define SUCCESSFUL 0x00 #define NOT_SUCCESSFUL 0x01 #define FUNC_NOT_SUPPORTED 0x81 #define BAD_VENDOR_ID 0x83 #define DEVICE_NOT_FOUND 0x86 #define BAD_REGISTER_NUMBER 0x87 /***********************************************************************/ /* PCI-Konfigurationsadressraum-Register: */ /***********************************************************************/ #define PCI_CS_VENDOR_ID 0x00 #define PCI_CS_DEVICE_ID 0x02 #define PCI_CS_COMMAND 0x04 #define PCI_CS_STATUS 0x06
Sandini Bib Der PCI-Bus
#define PCI_CS_REVISION_ID 0x08 #define PCI_CS_CLASS_CODE 0x09 #define PCI_CS_CACHE_LINE_SIZE 0x0c #define PCI_CS_MASTER_LATENCY 0x0d #define PCI_CS_HEADER_TYPE 0x0e #define PCI_CS_BIST 0x0f #define PCI_CS_BASE_ADDRESS_0 0x10 #define PCI_CS_BASE_ADDRESS_1 0x14 #define PCI_CS_BASE_ADDRESS_2 0x18 #define PCI_CS_BASE_ADDRESS_3 0x1c #define PCI_CS_BASE_ADDRESS_4 0x20 #define PCI_CS_BASE_ADDRESS_5 0x24 #define PCI_CS_EXPANSION_ROM 0x30 #define PCI_CS_INTERRUPT_LINE 0x3c #define PCI_CS_INTERRUPT_PIN 0x3d #define PCI_CS_MIN_GNT 0x3e #define PCI_CS_MAX_LAT 0x3f /***********************************************************************/ /* Prototypen: */ int pci_bios_present(byte *hardware_mechanism, word *interface_level_version, byte *last_pci_bus_number); int find_pci_device(word device_id, word vendor_id, word index, byte *bus_number, byte *device_and_function); int find_pci_class_code(dword class_code, word index, byte *bus_number, byte *device_and_function); int generate_special_cycle(byte bus_number, dword special_cycle_data); int read_configuration_byte(byte bus_number, byte device_and_function, byte register_number, byte *byte_read); int read_configuration_word(byte bus_number, byte device_and_function, byte register_number, word *word_read); int read_configuration_dword(byte bus_number, byte device_and_function, byte register_number, dword *dword_read); int write_configuration_byte(byte bus_number, byte device_and_function, byte register_number, byte byte_to_write); int write_configuration_word(byte bus_number, byte device_and_function, byte register_number, word word_to_write); int write_configuration_dword(byte bus_number, byte device_and_function, byte register_number, dword dword_to_write); void outpd(word port, dword value); dword inpd(word port);
785
Sandini Bib 786
Kapitel 22
void insb(word port, void *buf, int count); void insw(word port, void *buf, int count); void insd(word port, void *buf, int count); void outsb(word port, void *buf, int count); void outsw(word port, void *buf, int count); void outsd(word port, void *buf, int count); static int read_configuration_area(byte function, byte bus_number, byte device_and_function, byte register_number, dword *data); static int write_configuration_area(byte function, byte bus_number, byte device_and_function, byte register_number, dword value); /***********************************************************************/ /* Makros: */ /***********************************************************************/ #define HIGH_BYTE(ax) (ax >> 8) #define LOW_BYTE(ax) (ax & 0xff) /***********************************************************************/ /* PCI_BIOS_PRESENT */ /* ================ */ /* Diese Funktion prueft, ob ein PCI-BIOS vorhanden ist. */ /* Rueckgabewerte: */ /* --------------*/ /* byte *hardware_mechanism */ /* Gibt an, welche Konfigurationsmechanismen unterstuetzt werden. */ /* Im Fehlerfall wird ein Nullpointer zurueckgegeben. */ /* Bit 0 - Mechanismus #1 unterstuetzt */ /* Bit 1 - Mechanismus #2 unterstuetzt */ /* */ /* word *interface_level_version */ /* Im Fehlerfall wird ein Nullpointer zurueckgegeben. */ /* High Byte - Major-Versionsnummer */ /* Low Byte - Minor-Versionsnummer */ /* */ /* byte *last_pci_bus_number */ /* Nummer des letzten PCI-Bus im System. */ /* Im Fehlerfall wird ein Nullpointer zurueckgegeben. */ /* */ /* Funktionswert: */ /* -------------*/ /* SUCCESSFUL - PCI-BIOS vorhanden */ /* NOT_SUCCESSFUL - PCI-BIOS nicht vorhanden */ /***********************************************************************/ int pci_bios_present(byte *hardware_mechanism, word *interface_level_version, byte *last_pci_bus_number) { int ret_status; /* Funktionswert */ byte bios_present_status;/* Zeigt an, ob das PCI-BIOS gefunden wurde */ dword pci_signature; /* PCI-Signatur ('P', 'C', 'I', ' ') */ word ax, bx, cx, flags; /* Temporaere Variablen, Zwischenspeichern */ /* der Registerwerte */ /* PCI-BIOS-Register */ _AH = PCI_FUNCTION_ID; _AL = PCI_BIOS_PRESENT; /* PCI-BIOS-Interrupt 1Ah aufrufen */ geninterrupt(0x1a); /* Register retten, bevor der Compiler sie ueberschreibt: */ ax = _AX;
Sandini Bib Der PCI-Bus
787
bx = _BX; cx = _CX; pci_signature = _EDX; flags = _FLAGS; bios_present_status = HIGH_BYTE(ax); /* Wenn das Carry-Flag gesetzt ist, ist das BIOS nicht vorhanden: */ if ((flags & CARRY_FLAG) == 0) { /* Nun pruefen, dass AH (BIOS Present Status) == 0: */ if (bios_present_status == 0) { /* Bytes in pci_signature pruefen: if ((pci_signature & 0xff) ((pci_signature >> 8) & 0xff) ((pci_signature >> 16) & 0xff) ((pci_signature >> 24) & 0xff)
*/ == == == ==
'P' && 'C' && 'I' && ' ') {
/* Funktionswert entsprechend setzen (BIOS vorhanden): */ ret_status = SUCCESSFUL; /* Parameter der gesicherten Register auswerten: */ if (hardware_mechanism != NULL) { *hardware_mechanism = LOW_BYTE(ax); } if (hardware_mechanism != NULL) { *interface_level_version = bx; } if (hardware_mechanism != NULL) { *last_pci_bus_number = LOW_BYTE(cx); } } } else { ret_status = NOT_SUCCESSFUL; } } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); } /***********************************************************************/ /* FIND_PCI_DEVICE */ /* =============== */ /* Sucht PCI-Geraete anhand der gegebenen Hersteller- und Geraete-ID */ /* sowie einem Index. Um das erste Geraet zu finden, ist als Index 0 */ /* anzugeben, fuer das zweite Geraet 1 usw. */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word device_id */ /* Geraete-ID des gesuchten Geraets */ /* */ /* word vendor_id */ /* Hersteller-ID des gesuchten Geraets */ /* */ /* word index */ /* Geraetenummer (0 bis (n-1)) */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* byte *bus_number */ /* PCI-Bus, in dem das Geraet gefunden wurde */ /* */ /* byte *device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* Funktionswert: */ /* -------------*/
Sandini Bib 788
Kapitel 22
/* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* DEVICE_NOT_FOUND - Geraet nicht gefunden */ /* BAD_VENDOR_ID - Falsche Hersteller-Nummer */ /***********************************************************************/ int find_pci_device(word device_id, word vendor_id, word index, byte *bus_number, byte *device_and_function) { int ret_status; /* Funktionswert */ word ax, bx, flags; /* Temporaere Variablen zum Zwischenspeichern der */ /* Registerwerte */ /* PCI-BIOS-Register */ _CX = device_id; _DX = vendor_id; _SI = index; _AH = PCI_FUNCTION_ID; _AL = FIND_PCI_DEVICE; /* PCI-BIOS-Interrupt 1Ah aufrufen */ geninterrupt(0x1a) ; /* Register retten, bevor sie ueberschrieben werden: */ ax = _AX; bx = _BX; flags = _FLAGS; /* Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: */ if ((flags & CARRY_FLAG) == 0) { /* Returncode vom BIOS holen: */ ret_status = HIGH_BYTE(ax); if (ret_status == SUCCESSFUL) { /* Falls erfolgreich, Busnummer, Geraet & Funktion auswerten: */ if (bus_number != NULL) { *bus_number = HIGH_BYTE(bx); } if (device_and_function != NULL) { *device_and_function = LOW_BYTE(bx); } } } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); } /***********************************************************************/ /* FIND_PCI_CLASS_CODE */ /* =================== */ /* Liefert den Ort eines Geraets mit einem anzugebenden Klassencode. */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word class_code */ /* Klassencode des gesuchten Geraets */ /* */ /* word index */ /* Geraetenummer (0 - (N-1)) */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* byte *bus_number */ /* PCI-Bus, in dem das Geraet gefunden wurde */
Sandini Bib Der PCI-Bus
789
/* */ /* byte *device_and_function */ /* Device Number in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* DEVICE_NOT_FOUND - Geraet nicht gefunden */ /***********************************************************************/ int find_pci_class_code(dword class_code, word index, byte *bus_number, byte *device_and_function) { int ret_status; /* Funktionswert */ word ax, bx, flags; /* Temporaere Variablen zum Zwischenspeichern der / /* Registerwerte */ /* PCI-BIOS-Register */ _ECX = class_code; _SI = index; _AH = PCI_FUNCTION_ID; _AL = FIND_PCI_CLASS_CODE; /* PCI-BIOS-Interrupt 1Ah aufrufen */ geninterrupt(0x1a); /* Register retten, bevor sie ueberschrieben werden: */ ax = _AX; bx = _BX; flags = _FLAGS; /* Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: */ if ((flags & CARRY_FLAG) == 0) { /* Returncode vom BIOS holen: */ ret_status = HIGH_BYTE(ax); if (ret_status == SUCCESSFUL) { /* Falls erfolgreich, Busnummer, Geraet & Funktion auswerten: */ if (bus_number != NULL) { *bus_number = HIGH_BYTE(bx); } if (device_and_function != NULL) { *device_and_function = LOW_BYTE(bx); } } } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); } /***********************************************************************/ /* GENERATE_SPECIAL_CYCLE */ /* ====================== */ /* Loest einen Sonderzyklus aus. */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, auf dem der Sonderzyklus stattfinden soll */ /* */ /* dword special_cycle_data */ /* Sonderzyklus-Datum, das uebertragen werden soll */ /* */
Sandini Bib 790
Kapitel 22
/* Funktionswert: */ /* -------------*/ /* SUCCESSFUL - Geraet gefunden */ /* DEVICE_NOT_FOUND - Geraet nicht gefunden */ /***********************************************************************/ int generate_special_cycle(byte bus_number, dword special_cycle_data) { int ret_status; /* Funktionswert */ word ax, flags; /* Temporaere Variablen zum Zwischenspeichern der */ /* Registerwerte */ /* PCI-BIOS-Register */ _BH = bus_number; _EDX = special_cycle_data; _AH = PCI_FUNCTION_ID; _AL = FIND_PCI_CLASS_CODE; /* PCI-BIOS-Interrupt 1Ah aufrufen */ geninterrupt(0x1a); /* Register retten, bevor sie ueberschrieben werden: */ ax = _AX; flags = _FLAGS; /* Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: */ if ((flags & CARRY_FLAG) == 0) { /* Returncode vom BIOS holen: */ ret_status = HIGH_BYTE(ax); } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); } /***********************************************************************/ /* READ_CONFIGURATION_BYTE */ /* ======================= */ /* Liest ein Byte aus dem Konfigurationsadressraum eines Geraets */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, von dem gelesen werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsadressraum die gelesen werden soll */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* byte *byte_read */ /* Das gelesene Byte */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ int read_configuration_byte(byte bus_number, byte device_and_function, byte register_number, byte *byte_read) {
Sandini Bib Der PCI-Bus
int ret_status; /* Funktionswert */ dword data; /* BIOS-Funktion read_configuration_area aufrufen: */ ret_status = read_configuration_area(READ_CONFIG_BYTE, bus_number, device_and_function, register_number, &data); if (ret_status == SUCCESSFUL) { /* Byte auswerten: */ *byte_read = (byte)(data & 0xff); } return (ret_status); } /***********************************************************************/ /* READ_CONFIGURATION_WORD */ /* ======================= */ /* Liest ein Wort aus dem Konfigurationsadressraum eines Geraets */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, von dem gelesen werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsadressraum die gelesen werden soll */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* word *word_read */ /* Das gelesene Wort */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ int read_configuration_word(byte bus_number, byte device_and_function, byte register_number, word *word_read) { int ret_status; /* Funktionswert */ dword data; /* BIOS-Funktion read_configuration_area aufrufen: */ ret_status = read_configuration_area(READ_CONFIG_WORD, bus_number, device_and_function, register_number, &data); if (ret_status == SUCCESSFUL) { /* Wort auswerten: */ *word_read = (word)(data & 0xffff); } return (ret_status); } /***********************************************************************/ /* READ_CONFIGURATION_DWORD */ /* ======================== */ /* Liest ein Doppelwort aus dem Konfigurationsadressraum eines Geraets */
791
Sandini Bib 792
Kapitel 22
/* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, von dem gelesen werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsadressraum die gelesen werden soll */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* dword *dword_read */ /* Das gelesene Doppelwort (Langwort, 32 Bit) . */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ int read_configuration_dword(byte bus_number, byte device_and_function, byte register_number, dword *dword_read) { int ret_status; /* Funktionswert */ dword data; /* BIOS-Funktion read_configuration_area aufrufen: */ ret_status = read_configuration_area(READ_CONFIG_DWORD, bus_number, device_and_function, register_number, &data); if (ret_status == SUCCESSFUL) { /* Doppelwort auswerten: */ *dword_read = data; } return (ret_status); } /***********************************************************************/ /* READ_CONFIGURATION_AREA */ /* ======================= */ /* Liest ein Byte, Wort oder Doppelwort aus dem Konfigurationsraum */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, von dem gelesen werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsadressraum die gelesen werden soll */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* dword *dword_read */ /* Das gelesene Doppelwort */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */
Sandini Bib Der PCI-Bus
/***********************************************************************/ static int read_configuration_area(byte function, byte bus_number, byte device_and_function, byte register_number, dword *data) { int ret_status; /* Funktionswert */ word ax, flags; /* Temporaere Variablen zum Zwischenspeichern der */ dword ecx; /* Registerwerte */ /* PCI-BIOS-Register */ _BH = bus_number; _BL = device_and_function; _DI = register_number; _AH = PCI_FUNCTION_ID; _AL = function; /* PCI-BIOS-Interrupt 1Ah aufrufen */ geninterrupt(0x1a); /* Register retten, bevor der Compiler sie ueberschreibt: */ ecx = _ECX; ax = _AX; flags = _FLAGS; /* Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: */ if ((flags & CARRY_FLAG) == 0) { /* Returncode vom BIOS holen: */ ret_status = HIGH_BYTE(ax); /* Wenn erfolgreich, Datum weitergeben: */ if (ret_status == SUCCESSFUL) { *data = ecx; } } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); } /***********************************************************************/ /* WRITE_CONFIGURATION_BYTE */ /* ======================== */ /* Schreibt ein Byte in den Konfigurationsadressraum eines Geraets */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, auf dem geschrieben werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsraum die geschrieben werden soll */ /* */ /* byte byte_to_write */ /* Byte, das in den Konfigurationsadressraum geschrieben werden soll */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ int write_configuration_byte(byte bus_number, byte device_and_function,
793
Sandini Bib 794
Kapitel 22
byte register_number, byte byte_to_write) { int ret_status; /* Funktionswert */ /* BIOS-Funktion write_configuration_area aufrufen: */ ret_status = write_configuration_area(WRITE_CONFIG_BYTE, bus_number, device_and_function, register_number, byte_to_write); return (ret_status); } /***********************************************************************/ /* WRITE_CONFIGURATION_WORD */ /* ======================== */ /* Schreibt ein Wort in den Konfigurationsadressraum eines Geraets */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, auf dem geschrieben werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsraum die geschrieben werden soll */ /* */ /* word word_to_write */ /* Wort, das in den Konfigurationsadressraum geschrieben werden soll */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ int write_configuration_word(byte bus_number, byte device_and_function, byte register_number, word word_to_write) { int ret_status; /* Funktionswert */ /* BIOS-Funktion write_configuration_area aufrufen: */ ret_status = write_configuration_area(WRITE_CONFIG_WORD, bus_number, device_and_function, register_number, word_to_write); return (ret_status); } /***********************************************************************/ /* WRITE_CONFIGURATION_DWORD */ /* ========================= */ /* Schreibt ein Doppelwort in den Konfigurationsraum eines Geraets */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, auf dem geschrieben werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsraum die geschrieben werden soll */ /* */
Sandini Bib Der PCI-Bus
/* dword dword_to_write */ /* DWort, das in den Konfigurationsadressraum geschrieben werden soll */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ int write_configuration_dword(byte bus_number, byte device_and_function, byte register_number, dword dword_to_write) { int ret_status; /* Funktionswert */ /* BIOS-Funktion write_configuration_area aufrufen: */ ret_status = write_configuration_area(READ_CONFIG_DWORD, bus_number, device_and_function, register_number, dword_to_write); return (ret_status); } /***********************************************************************/ /* WRITE_CONFIGURATION_AREA */ /* ======================== */ /* Schreibt ein Byte, Wort oder DWort in den Konfigurationsadressraum */ /* eines Geraets */ /* */ /* Inputs: */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* byte bus_number */ /* PCI-Bus, auf dem geschrieben werden soll */ /* */ /* byte device_and_function */ /* Geraetenummer in den oberen 5, Funktionsnummer in den unteren 3 Bits*/ /* */ /* byte register_number */ /* Registernummer im Konfigurationsraum, die geschrieben werden soll */ /* */ /* dword value */ /* Wert, der geschrieben werden soll */ /* */ /* Funktionswert: */ /* -------------*/ /* Zeigt an, ob das gesuchte Geraet gefunden wurde: */ /* SUCCESSFUL - Geraet gefunden */ /* NOT_SUCCESSFUL - BIOS-Fehler */ /* BAD_REGISTER_NUMBER - Falsche Registernummer */ /***********************************************************************/ static int write_configuration_area(byte function, byte bus_number, byte device_and_function, byte register_number, dword value) { int ret_status; /* Funktionswert */ word ax, flags; /* Temporaere Variablen zum Zwischenspeichern der */ /* Registerwerte */ /* PCI-BIOS-Register */ _BH = bus_number; _BL = device_and_function; _ECX = value; _DI = register_number; _AH = PCI_FUNCTION_ID; _AL = function;
795
Sandini Bib 796
Kapitel 22
/* PCI-BIOS-Interrupt 1Ah aufrufen */ geninterrupt(0x1a); /* Register retten, bevor der Compiler sie ueberschreibt: */ ax = _AX; flags = _FLAGS; /* Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten: */ if ((flags & CARRY_FLAG) == 0) { /* Returncode vom BIOS holen: */ ret_status = HIGH_BYTE(ax); } else { ret_status = NOT_SUCCESSFUL; } return (ret_status); } /***********************************************************************/ /* OUTPD */ /* ===== */ /* Schreibt ein Doppelwort zu einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, zu dem geschrieben werden soll */ /* */ /* dword value */ /* Wert, der geschrieben werden soll */ /***********************************************************************/ void outpd(word port, dword value) { _DX = port; _EAX = value; /* Since asm cannot generate OUT __emit__(0x66, 0xEF);
DX, EAX must force in */
} /***********************************************************************/ /* INPD */ /* ==== */ /* Liest ein Doppelwort aus einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, von dem gelesen werden soll */ /* */ /* Rueckgabewerte: */ /* --------------*/ /* dword value */ /* Der gelesene Wert */ /* */ /***********************************************************************/ dword inpd(word port) { /* DX-Register mit Portnummer initialisieren, von dem gelesen werden soll: */ _DX = port; /* Since asm cannot generate IN __emit__(0x66, 0xED);
EAX, DX, must force in */
return(_EAX); } /***********************************************************************/ /* INSB */ /* ==== */ /* Liest einen String von Bytes von einem Hardware-Port */
Sandini Bib Der PCI-Bus
/* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, von dem gelesen werden soll */ /* */ /* void *buf */ /* Puffer, in dem die gelesenen Daten abgelegt werden */ /* */ /* int count */ /* Anzahl der zu lesenden Bytes */ /***********************************************************************/ void insb(word port, void *buf, int count) { _ES = FP_SEG(buf); /* Segment des Puffers */ _DI = FP_OFF(buf); /* Offset des Puffers */ _CX = count; /* Anzahl der zu lesenden Bytes */ _DX = port; /* Port */ asm REP INSB; } /***********************************************************************/ /* INSW */ /* ==== */ /* Liest einen String von Worten aus einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, von dem gelesen werden soll */ /* */ /* void *buf */ /* Puffer, in dem die gelesenen Daten abgelegt werden */ /* */ /* int count */ /* Anzahl der zu lesenden Worte */ /***********************************************************************/ void insw(word port, void *buf, int count) { _ES = FP_SEG(buf); /* Segment des Puffers */ _DI = FP_OFF(buf); /* Offset des Puffers */ _CX = count; /* Anzahl der zu lesenden Bytes */ _DX = port; /* Port */ asm REP INSW; } /***********************************************************************/ /* INSD */ /* ==== */ /* Liest einen String von Doppel-Worten von einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, von dem gelesen werden soll */ /* */ /* void *buf */ /* Puffer, in dem die gelesenen Daten abgelegt werden */ /* */ /* int count */ /* Anzahl der zu lesenden Worte */ /***********************************************************************/ void insd(word port, void *buf, int count) { _ES = FP_SEG(buf); /* Segment des Puffers */ _DI = FP_OFF(buf); /* Offset des Puffers */ _CX = count; /* Anzahl der zu lesenden Bytes */ _DX = port; /* Port */ __emit__(0xf3, 0x66, 0x6D); /* asm REP INSD */ } /***********************************************************************/ /* OUTSB */
797
Sandini Bib 798
Kapitel 22
/* ===== */ /* Schreibt einen String von Bytes zu einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, zu dem geschrieben werden soll */ /* */ /* void *buf */ /* Puffer, in dem die zu schreibenden Daten abgelegt sind */ /* */ /* int count */ /* Anzahl der zu schreibenden Bytes */ /***********************************************************************/ void outsb(word port, void *buf, int count) { _SI = FP_SEG(buf); /* Offset des Puffers */ _CX = count; /* Anzahl der zu schreibenden Bytes */ _DX = port; /* Port */ asm REP OUTSB; } /***********************************************************************/ /* OUTSW */ /* ===== */ /* Schreibt einen String von Worten zu einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, zu dem geschrieben werden soll */ /* */ /* void *buf */ /* Puffer, in dem die zu schreibenden Daten abgelegt sind */ /* */ /* int count */ /* Anzahl der zu schreibenden Worte */ /***********************************************************************/ void outsw(word port, void *buf, int count) { _SI = FP_SEG(buf); /* Offset des Puffers */ _CX = count; /* Anzahl der zu schreibenden Bytes */ _DX = port; /* Port */ asm REP OUTSW; } /***********************************************************************/ /* OUTSD */ /* ===== */ /* Schreibt einen String von Doppel-Worten zu einem Hardware-Port */ /* */ /* Zu uebergebende Werte: */ /* ---------------------*/ /* word port */ /* Hardware-Port, zu dem geschrieben werden soll */ /* */ /* void *buf */ /* Puffer, in dem die zu schreibenden Daten abgelegt sind */ /* */ /* int count */ /* Anzahl der zu schreibenden Doppel-Worte */ /***********************************************************************/ void outsd(word port, void *buf, int count) { _SI = FP_SEG(buf); /* Offset des Puffers */ _CX = count; /* Anzahl der zu schreibenden Bytes */ _DX = port; /* Port */ __emit__(0xf3, 0x66, 0x6F); /* asm REP OUTSD; */ }
Sandini Bib Der PCI-Bus
799
22.11 PCI-X Ende 1999 hat sich die Firma Compaq von der PCI SIG (PCI Special Interest Group) das zu PCI abwärtskompatible PCI-X (PCI-eXtended) als Standard anerkennen lassen. Firmen wie IBM und Hewlett-Packard waren an der Entwicklung ebenfalls beteiligt, und einige wie 3COM oder Adaptec haben bereits im Jahre 2000 die ersten Produkte hierfür in den Handel gebracht. Die PCI SIG rekrutiert sich mittlerweile aus über 800 Mitgliedsfirmen, so dass PCI-X in Zukunft wahrscheinlich eine größere Rolle spielen wird, als es zunächst den Anschein hatte, weil Compaq mit PCI-X eine ganze Weile als alleiniger Verfechter dieser Technologie auftrat. Mit der PCI-Bus-Spezifikation 3.0 werden PCI 2.3 und PCI-X gewissermaßen zusammengeführt, und somit wird PCI-X als offizieller Zukunftspfad für PCI anerkannt. PCI-X stellt jedoch nur einen optionalen Hochgeschwindigkeitsbus dar und wird daher klassische PCI-Implementierungen nicht komplett ersetzen. PCI-X ist eine zum konventionellen PCI-Bus abwärtskompatible Lösung. Es entspricht zunächst der PCI-64-Bit-Auslegung, arbeitet demgegenüber jedoch mit einem maximalen Bustakt von 133 MHz, was somit zu einer Datenübertragungsrate von 1 GByte/s führen kann. Karten, die ausschließlich mit 5 V arbeiten, sind hierfür nicht mehr erlaubt, sondern nur noch 3,3 V- oder auch Universal-Karten, die sowohl mit 5 V als auch mit 3,3 V umgehen können. PCI-X definiert verschiedene Betriebsarten (auch 32-Bit, 66 MHz und 100 MHz sind möglich), wobei – wie bei PCI-64 – derjenige Mode automatisch aktiviert wird, den die langsamste PCIKarte noch unterstützen kann. Tabelle 22.12 zeigt die hier möglichen Kombinationen. Zu beachten ist, dass PCI-X gegenüber PCI-64 bei einem Takt von 66 MHz vier statt wie bisher nur zwei Slots erlaubt. Bei einem Takt von 100 MHz sind zwei und bei 133 MHz bisher nur ein einziger PCI-X-Slot auf dem Mainboard gestattet. Eine PCI-X-Einheit muss nicht zwangsläufig über eine Einsteckkarte im System integriert werden, sondern sie kann sich auch direkt mit auf dem Mainboard befinden, wie es insbesondere mit LAN- und SCSI-Controllern gehandhabt wird. Daten
Konventionelle PCI-Karten
PCI-X-Karten
Bus-Frequenz Spannung
33 MHz 5V
33 MHz 66 MHz 3,3 V oder 3,3 V oder universal universal
66 MHz 3,3 V oder universal
133 MHz 3,3 V oder universal
33 MHz –
33 MHz 33 MHz
33 MHz 33 oder 66 MHz
33 MHz 33 oder 66 MHz
Mainboard PCI PCI
33 MHz 66 MHz
33 MHz 66 MHz
PCI-X
66 MHz
–
33 MHz
33 oder 66 MHz
66 MHz
66 MHz
PCI-X
100 MHz
–
33 MHz
33 oder 66 MHz
66 MHz
100 MHz
PCI-X
133 MHz
–
33 MHz
33 oder 66 MHz
66 MHz
133 MHz
Tab. 22.12: Kombinationsmöglichkeiten mit den verschiedenen PCI-Standards
Eine PCI-X-Karte kann, wie es auch die Tabelle zeigt, in einem bisher gebräuchlichen PCI-Slot verwendet werden, wobei sie sich dementsprechend wie eine übliche PCI-Karte verhält. In Kapitel 22.9.3 wurde auf das hierfür wichtige Signal PCIXCAP (Pin B38 am PCI-Slot) hingewiesen, das sich bei Standard-PCI auf Massepotenzial befindet und bei PCI-X als Detektierungssignal fungiert. Durch eine logische Verknüpfung der PCI-Bussignale FRAME, IRDY, TRDY, STOP und DEVSEL wird während der ansteigenden RESET-Signalflanke vom konventionellen PCI-BusModus in den PCI-X-Modus geschaltet, wobei die Busfrequenz anhand der Signalzustände von TRDY, STOP und DEVSEL übermittelt wird.
Sandini Bib 800
Kapitel 22
Konfigurationsraum Das PCI-X-Protokoll ist zu existierenden Treibern und Betriebssystemen kompatibel, was einen relativ einfachen Übergang von PCI zu PCI-X ermöglicht. Es sind jedoch einige interessante und neue Eigenschaften bzw. Funktionen hinzugekommen, die ich im Folgenden erläutern möchte. Der Configuration-Space ist von 48h bis hin zu FFh erweitert worden. Das heißt, nach der Erweiterung des Configuration-Space mit der PCI-Spezifikation 2.2 um das Power-Management (vgl. Tabelle 22.13) ist der Bereich nunmehr erneut ausgedehnt worden. PCI-X verwendet allerdings nur den Bereich bis maximal 5Ch, wo Statusinformationen für PCI-X verarbeitet werden. Der Bereich darüber ist als reserviert ausgewiesen bzw. steht für (hersteller-) eigene Implementierungen zur Verfügung. Grundsätzlich funktioniert der Datentransfer bei PCIX nahezu wie bei Standard-PCI, und auch die Konfigurierung erfolgt gemäß des PCI-Bus. Für die Message Signaled Interrupts (MSI) und PCI-X werden die entsprechenden Capability-IDs und -Items mit den dazugehörigen Pointern (Next Item) verwendet, wie es prinzipiell auch bei den Power-Management-Funktionen und dem AGP praktiziert wird. Offset
Byte 3
48h
Byte 2
Message Control
4Ch
Byte 1
Byte 0
Next Item Pointer
MSI Cap. ID
Message Address
50h
Message Upper Address
54h
reserviert
58h
PCI-X-Command
5Ch
Message Data Next Item Pointer
PCI-X Cap. ID
PCI-X-Status
60h–7Fh
reserviert
80h–FFh
User Configuration Space
Tab. 22.13: Ergänzungen des Konfigurationsraums für PCI-X
Zugriffsarten PCI kennt verschiedene Zugriffsarten, die durch Command-Signale C/BE7–C/BE0 unterschieden werden. Dies ist auch bei PCI-X der Fall, allerdings sind demgegenüber neue Zugriffsarten hinzugekommen bzw. die ursprünglich für PCI verwendeten in ihrer Funktion geändert worden. In Tabelle 22.14 sind die PCI-X-Neuerungen fett gekennzeichnet. Der Line-Speicher-Lesezugriff (Memory Read Line) ist zu einer Zugriffsart mit der Bezeichnung Memory Read Block und der Speicher-Schreibzugriff mit Invalidierung ist zu Memory Write Block geworden. Hiermit sind nunmehr Speicherblock-Transfers (Burst Mode) möglich, und die ebenfalls dazugehörigen Alias-Befehle (C/BE[3:0]=1000, C/BE[3:0]=1001) liegen auf zuvor nicht verwendeten Befehlscodes. Der Speicher-Mehrfachlesezugriff (C/BE[3:0]=1100) ist durch die Block-Codes überflüssig geworden, so dass unter dem Code 1100 jetzt eine Zugriffsart namens Split Completion zu finden ist. C/BE[3:0] C/BE[7:4]
Kommando
0000 0001 0010 0011 0100
Interrupt Acknowledge Special Cycle I/O Read I/O Write reserviert
Tab. 22.14: Die PCI-Zugriffsarten mit den PCI-X-Erweiterungen
Sandini Bib Der PCI-Bus
801
C/BE[3:0] C/BE[7:4]
Kommando
0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
reserviert Memory Read Dword Memory Write Alias to Memory Read Block Alias to Memory Write Block Configuration Read Configuration Write Split Completion Dual Address Cycle Memory Read Block Memory Write Block
Tab. 22.14: Die PCI-Zugriffsarten mit den PCI-X-Erweiterungen (Forts.)
Split Transactions und Attribut-Phase Die Split-Completion erscheint, neben der Takterhöhung, als wichtigste Neuerung, denn sie erlaubt es, weitere Datenübertragungen auszulösen, ohne dass die zuvor adressierte Einheit bereits alle Daten zur Verfügung gestellt haben muss. Beim konventionellen PCI-Bus muss die selektierte Einheit so lange die Daten im Polling-Modus anfordern, bis sie komplett sind, was auch unter Delayed Transaction firmiert. In dieser Zeit ist die involvierte Bridge und damit unter Umständen der gesamte PCI-Bus für weitere Datentransfers blockiert. 1. Initiator-Attribut-Phase:
Byte Count
rsv.
32 31 30 29 28
NS RO
35
24 23
Tag
Initiator-Bus-Nummer
8
11 10
16 15
IDN
7
0
IFN
Byte Count
2. Target-Attribut-Phase: 32 31 30 29 28
0
0
24 23
Tag
8
11 10
16 15
Initiator-Bus-Nummer
IDN
7
rsv.
1 1
rsv. rsv. RO
35
IFN
6
0
Address [6:0]
3. Target-Attribut-Phase:
Byte IFN: IDN: RO: NS: rsv: TFN: TDN: SCM: SCE: BCM:
SCM
Byte Count
SCE
32 31 30 29 28
BCM
35
24 23
reserviert
Target-Bus-Nummer
8
11 10
16 15
TDN
TFN
7
0
Byte Count
Count: Angabe der Byte-Anzahl Initiator-Funktionsnummer Initiator-Device-Nummer Relax Ordering No Snoop reserviert Target-Funktionsnummer Target-Device-Nummer Split Completion Message Split Completion Error Byte Count Modified (nähere Erläuterungen siehe Text)
Abb. 22.16: Die Phasen für Split-Transactions
Sandini Bib 802
Kapitel 22
Geteilte Transaktionen – Split-Transactions – können den Durchsatz erhöhen, weil der PCI-X-Bus nach einer Leseanforderung unmittelbar nach einer Leseanforderung von einer anderen Einheit genutzt werden kann. Jede Transaction erhält eine Nummer, die in einem Register der PCI-XBridge gespeichert wird, damit die einzelnen Transactions eindeutig dem richtigen Initiator zuzuordnen sind. So neu sind Split-Transactions allerdings nicht, denn bei Prozessoren (ab Pentium) ist dies eine übliche Zugriffsart, die es sogar schon bei einem Systembus – dem MicroChannel – gegeben hat. Für die Absolvierung der Split-Transactions setzt der Initiator eine Attribut-Phase mit Bus-, Device- und Function-Number sowie einigen weiteren Informationen (s.u.) ab und initiiert damit eine Transaction. Die Target-Einheit bestätigt daraufhin den Empfang der Split-Funktion, indem sie die Attribute des Initiators sowie der Adresse (Lower Address) zurückgibt, und initiiert das Split-Completion-Kommando. Damit ist diese Verbindung quasi etabliert, und der Initiator kann weitere Transactions auslösen. Unterdessen können die selektierten Targets mit der Bereitstellung der Daten beschäftigt sein. Das jeweilige Target sendet zum Abschluss der Transaction wiederum in einer Attribut-Phase die Information über die Komplettierung der Leseoperation an den Initiator bzw. kennzeichnet den aktuellen Stand der Datenübertragung, wofür die Bits SCM (Split Completion Message) und SCE (Split Completion Error) mit herangezogen werden. Wer sich bisher darüber gewundert haben mag, wo diese PCI-Attibut-Phase plötzlich herkommt, sei beruhigt: Die PCI-Attribut-Phase wurde mit PCI-X als Neuerung eingeführt, und beim konventionellen PCI-Bus gibt es sie nicht. Der Adressphase folgt hier nicht unmittelbar eine Datenphase, sondern nach der Adressphase gibt es die Attribut-Phase, was einen Transferzyklus zwar jeweils um einen Takt erhöht, aber durch die höhere Taktrate nicht weiter von Belang sein dürfte. Die Attribut-Phase erlaubt generell die Übermittlung zusätzlicher Informationen für die Steuerung der Datenübertragung, wie etwa für die erläuterten Split-Transactions. 0
1
3
2
5
4
6
7
8
CLK FRAME ADx C/BEx
Adresse Attribut Bus CMD
Attribut
Adressphase
Attributphase
Daten 0
Daten 1
Daten 2
Daten 3
Daten 4
BEx 0
BEx 1
BEx 2
BEx 3
BEx 4
IRDY TRDY DEVSEL Blindzyklus
Datenphasen PCI-X Bus Transaktion
Abb. 22.17: PCI-X kennt eine zusätzliche Attribut-Phase.
Mit PCI-X werden die bei PCI oftmals benötigten Waitstates oder auch extra Takte drastisch reduziert, denn eine PCI-X-Einheit, die aktuell keine Daten liefern kann, koppelt sich (logisch) vom Bus ab, so dass andere Einheiten die zur Verfügung stehende Bandbreite nutzen können. Darüber hinaus gibt es eine verbesserte Fehlerbehandlung, die nach dem Auftreten eines ParityError nicht gleich zu einem Reboot führt, sondern einen fehlerhaften Transfer neu initiieren oder das betreffende PCI-X-Device bei einem kritischen Fehler abschalten kann. Diese Features sind allerdings im Geräte-Treiber bzw. im Betriebssystem entsprechend zu programmieren und somit nicht automatisch gegeben.
Sandini Bib Der PCI-Bus
803
Im Attribut-Feld sind noch verschiedene Optionen (vgl. Abbildung 22.16) zu finden. Zunächst gibt es die so genannten None-Cache-Coherent-Transactions. Hierfür kann das Bit NS (No Snoop) aktiviert werden, was zur Folge hat, dass keine Snoop-Operation von der CPU durchzuführen ist. Das heißt, der Hauptspeicher und der Cache müssen nicht auf Konsistenz hin überprüft werden, wenn eine PCI-X-Einheit Speicherdaten anfordert. Beim PCI-Bus werden Anfragen von einer Bridge in der Reihenfolge beantwortet, wie sie eingetroffen sind, und eine übliche Bridge kann nicht erkennen, welche Übertragung für welche Einheit bestimmt ist. Durch das Setzen des Relaxed-Ordering-Bit (RO) kann die hiermit gekennzeichnete PCI-X-Übertragung anderen vorgezogen werden, wie es etwa für Audio- und VideoStreams sinnvoll erscheint. Eine weitere Option bezieht sich ebenfalls auf Bridges, die für jede Datenanfrage eine voreingestellte Anzahl von Cache-Lines anfordern, weil sie nicht in der Lage sind, den tatsächlichen Speicherbedarf zu ermitteln. Im Attribut-Feld sind bei PCI-X daher die Byte-Count-Bits vorgesehen, die für jeden Transfer die Byte-Anzahl kennzeichnen, was eine effizientere Nutzung der Bridge-Buffer ermöglicht und zudem die Busauslastung reduzieren kann. Im Target-AttributPaket (3. in Abbildung 22.16) gibt es für die Kennzeichnung, dass sich die Byte-Anzahl verändert hat, außerdem das Byte-Count-Modified-Bit (BCM). Des Weiteren ermöglicht eine Sequence-Number die Kennzeichnung, welche Daten Bestandteil der gleichen Sequenz sind, was ebenfalls eine bessere Effizienz zur Folge haben kann, weil hiermit zweifelsfrei der Initiator festzustellen ist und deutlich wird, an welchem Bus-Segment er sich befindet. Diese Sequence-Number wird aus den jeweiligen Funktions-, Einheiten- (Device) und Bus-Nummern gebildet.
Abb. 22.18: Der Aufbau einer PCI-X-Bridge (IBM 133)
Eine typische PCI-X-Bridge unterstützt einen maximalen Takt von 133 MHz mit einer Busbreite von 64 Bit, wobei sie neben den PCI-X-Datenübertragungen auch die PCI-Bus-üblichen Transfers
Sandini Bib 804
Kapitel 22
verarbeiten kann. Der primäre und der sekundäre Bus einer PCI-X-Bridge kann dabei mit unterschiedlichen Takten umgehen, und es gibt eine ganze Reihe von Buffern für die Zwischenspeicherung der Daten. Die Buffer sind insbesondere für die Konvertierungen zwischen den Bussträngen von Bedeutung, die möglicherweise mit unterschiedlichen Takten und Busbreiten arbeiten. Die ursprüngliche PCI-X-1.0-Spezifikation wurde im Jahre 2002 von der Revision 2.0 abgelöst. Die wesentliche Neuerung besteht darin, dass zwei Address-Strobe-Leitungen (AD_STB, AD_STB) eingeführt worden sind. Das Prinzip ist quasi vom AGP abgeschaut worden und wird in Kapitel 23 näher erläutert. Mithilfe dieser Strobe-Signale lässt sich auch bei PCI-X 2.0 die Bandbreite bei gleich bleibender Taktfrequenz (133 MHz) erhöhen. Es gibt hier den Double-DataRate- und den Quad-Data-Rate-Betrieb, was zu Transferraten von fast 2 bzw. 4 GByte führt. Die Konsequenz ist auch hier (wie beim AGP x 4), dass der Spannungspegel von 3,3 V auf 1,5 V herabgesetzt wird.
22.12 Switched Fabrics Die Probleme eines parallel arbeitenden Bussystems sind bereits in den vorherigen Kapiteln angeklungen. Im Wesentlichen führt die Vielzahl der einzelnen Leitungen zu kritischen Layouts, wobei auf der einen Seite die immer höheren Taktraten zwar den Durchsatz steigern, auf der anderen Seite werden die erlaubten Leitungswege und die Anzahl der Slots dabei immer geringer. Als Lösung bieten sich seriell arbeitende Bussysteme an, wie es bereits mit Serial-ATA oder auch dem Fibre-Channel sowie Firewire praktiziert wird, die aber nicht als Ersatz für einen Systembus gedacht sind, sondern für die Ankopplung von Peripherie. Eine schnelle serielle Technologie ist in der Netzwerktechnik Stand der Dinge, wie etwa bei Gigabit-Ethernet. Eine Schlüsselrolle spielen dabei die Switches, die es, bei einer entsprechend hohen Taktung der Switching-(Back-)Plane, erlauben, quasi gleichzeitig mehrere Datenpfade mit der vollen Bandbreite herzustellen. Nach diesem Prinzip soll in Zukunft auch auf den Mainboards für den Systembus verfahren werden. Wie immer, wenn neue Technologien in den Markt drängen, treten gleich mehrere miteinander konkurrierende Realisierungen auf den Plan, die von unterschiedlichen Firmen propagiert werden. Die Firmen Intel, Dell, Fujitsu und einige andere haben Next Generation I/O (NGIO) definiert, während die andere Fraktion, bestehend aus Firmen wie Compaq, IBM und Hewlett-Packard, Future I/O als Favorit propagierten. Beiden Konzepten ist gemeinsam, dass ausschließlich mit Punkt-zu-Punkt-Verbindungen gearbeitet wird, d.h., es handelt sich nicht wie bei PCI um einen Shared-Bus, dessen Bandbreite sich die einzelnen Einheiten untereinander teilen müssen. Die Einheiten werden über serielle Links verbunden, denen jeweils die volle Datenübertragungsrate zur Verfügung steht. Die zahlreichen parallelen Verbindungen, die den Aufbau kompliziert und auch teuer machen, sind dadurch nicht mehr nötig. Da die Funktionsweise mit einem Switch in einem Netzwerk vergleichbar ist, wird diese Technologie auch als Switched Fabric bezeichnet, so dass ich die aktuellen Entwicklungen auf diesem Gebiet unter dieser Überschrift zusammenfasse, auch wenn es zwischen InfiniBand, PCI-Express und Hypertransport recht große Unterschiede gibt, wie es in den folgenden Kapiteln noch erläutert wird.
Sandini Bib Der PCI-Bus
805
Abb. 22.19: Moderne PC-Architekturen verwenden zur Kommunikation seriell arbeitende Links.
Die wesentlichen Unterschiede zwischen NGIO und Future I/O sind zunächst, dass NGIO sehr umfassende Spezifikationen beinhaltet, die fast alle Aspekte eines SANs (Storage Area Networks) umfassen, während Future I/O lediglich grundlegende Dinge (Target Switches, Target Devices) einer neuen Architektur definiert. Future I/O gibt als maximale Datenübertragungsrate für jeden Link 1066 MByte/s an, zeitgleich in beiden Richtungen, und NGIO demgegenüber nur 2,5 GBit/s (200 MByte/s). Das NGIO-Prinzip geht von einem Host-Channel-Adapter (HCA) aus, der mit einem zentralen Switch kommuniziert, an den die einzelnen Controller mittels Target-Channel-Adapter (TCA) angeschlossen sind. NGIO ist in erster Linie für die Kommunikation zwischen eigenständigen Geräten (Chassis-zu-Chassis) vorgesehen, während Future I/O sich auch auf die Board-Ebene bezieht (Chip-zu-Chip). Beide Systeme, deren Spezifikationen seit ca. 1999 in Arbeit sind, haben sich allerdings nicht in Produkten am Markt niedergeschlagen; stattdessen sind hiermit gewissermaßen die Vorarbeiten für die aktuellen paketorientiert arbeitenden Bussysteme geleistet worden.
22.12.1 InfiniBand Aus NGIO ist unter maßgeblicher Beteiligung von Intel die Technologie InfiniBand geworden, die mit den entsprechenden Bridges in die PCI-Spezifikation 2.3 (siehe Kapitel 22.7, Basisklassencode 06h) mit aufgenommen wurde. In der Organisation InfiniBand Trade Association haben sich eine ganze Reihe von Firmen zusammengefunden, wie beispielsweise auch IBM und Dell, die im Jahre 2001 die ersten Systeme mit InfiniBand realisiert haben. Die Kopplung einer Vielzahl von Servern, wie sie insbesondere für Datenbanksysteme zur Anwendung kommt, ist hierfür eine bevorzugte Anwendung. Die bereits mit NGIO zugrunde gelegte Datenübertragungsrate von 2,5 GBit/s ist (zunächst) auch für InfiniBand gültig, wobei sich mit Hilfe entsprechender Switches mehrere Links zu einem logischen Datenkanal mit entsprechend höherer Datenrate (z.B. 30 GBit/s) bündeln lassen. Dies ist im Grunde genommen nichts Neues und bereits ein gängiges Verfahren in der klassischen Netzwerktechnik, das dort beispielsweise unter Port Trunking firmiert. Außerdem wird bei InfiniBand die 8B/10B-Kodierung eingesetzt, wie es auch beim Fibre-Channel sowie GigabitEthernet über Kupferverbindungen der Fall ist, und da es für InfiniBand auch eine LAN-Emula-
Sandini Bib 806
Kapitel 22
tion (IEEE 802.3, Ethernet) gibt und hiermit TCP/IP zum Einsatz kommen kann, muss man sich eigentlich fragen, warum dann nicht gleich Gigabit-Ethernet oder 10GE für diese Art der Gerätekopplung verwendet wird. Daher erscheint es doch fraglich, ob sich InfiniBand gegen die bereits seit längerem verfügbaren SAN-Lösungen (z.B. mit Fibre Channel oder Gigabit-Ethernet) durchsetzen wird. InfiniBand soll bei genauerer Betrachtung nicht für eine Vernetzung von Speichersystemen (SANs), sondern für die Vernetzung von Serverknoten eingesetzt werden, wobei die Unterschiede dazwischen eigentlich immer schwieriger auszumachen sind. Auf jeden Fall ist InfiniBand kein Ersatz für den PCI-Bus, und aktuelle InfiniBand-Adapter sind zumeist mit einem PCI-X-Interface ausgestattet. Microsoft hat mittlerweile die zunächst zugesagte Unterstützung für InfiniBand zurückgenommen und ursprüngliche »InfiniBand-Verfechter« wie Intel sowie IBM haben sich Mitte des Jahres 2002 dazu entschlossen, keine Chips für InifiniBand (mehr) herzustellen, so dass diese Technologie in PC-üblichen Bereichen wahrscheinlich auch keine große Rolle spielen wird.
22.12.2 PCI-Express Auf der Board-Ebene und damit gewissermaßen als Fortentwicklung von Future-I/O ist von Intel die Third Generation I/O (3GIO) auf den Weg gebracht worden, was in diesem Sinne die dritte Generation nach ISA und PCI bedeutet. 3GIO firmiert auch unter Arapahoe und seit neuestem unter PCI-Express.
Abb. 22.20: PCI-Express verwendet stets 1:1-Verbindungen zwischen den Einheiten und kann auch einen Switch zur Verfügung stellen.
Bei PCI-Express ist ebenfalls ein Switch als zentrales Element vorgesehen, über das Einheiten auf dem Mainboard oder auch über einen PCI-Express-Slot angesprochen werden können. Ein Switch ist jedoch nicht zwangsläufig notwendig, da auch direkte 1:1-Verbindungen zwischen einer Bridge und einer AGP- oder Gigabit-Einheit möglich sind. Für typische I/O-Einheiten, die sich mit geringeren Datenübertragungsraten begnügen, ist (zunächst) jedoch auch der traditionelle
Sandini Bib Der PCI-Bus
807
PCI-Bus neben PCI-Express vorgesehen, der dann mithilfe einer Bridge weiterhin die Verwendung der bewährten PCI-Karten erlaubt. Laut Intel sollen für PCI-Express ab Mitte des Jahres 2003 die ersten Chipsets verfügbar sein. Lanes und Links PCI-Express definiert zunächst eine Datenübertragungsrate von 2,5 GBit/s pro Richtung, und laut Intel sind bis zu 10 GBit/s in der Zukunft denkbar, was dem Maximum der Datentransferrate auf (kurzen) Kupferverbindungen entspricht. Lichtwellenleiter sind als Verbindungsmöglichkeit aber ebenfalls vorgesehen. Die jeweils benötigte Bandbreite eines Links – auch als I/O-Connect bezeichnet – lässt sich recht flexibel anpassen, indem mehr oder weniger viele Lanes zu einem Link zusammengefasst werden. Eine Lane (x1) setzt sich aus jeweils vier Signalleitungen zusammen, d.h., es gibt dann jeweils zwei differenzielle Leitungen pro Richtung, und es ist gleichzeitiges Senden und Empfangen möglich. PCI-Express definiert Links mit einer Lane-Anzahl von x1, x2, x4, x8, x12, x16 und x32.
Abb. 22.21: Eine Lane besteht aus vier Leitungen, und mehrere Lanes können zu einem Link (hier x2-Link) zusammengefasst werden.
Beispielsweise besteht ein x16-Link demnach aus 16 Lanes, was zu 16 x 2,5 GBit/s = 5 GByte/s (Byte!) in jeder Richtung führt und daher zu einer Gesamttransferrate von 10 GByte/s. In Tabelle 22.15 ist dieser Zusammenhang für die weiteren Möglichkeiten angegeben, wobei der Overhead für die Abwicklung des Protokolls nicht mitgerechnet ist, so dass die Nutzdatenrate unter (ca. -20%) den angegebenen Werten liegt. Link
Lanes
Leitungen
Transferrate pro Richtung in GBit/s
Gesamtrate in GByte/s
x1 x2 x4 x8 x12 x16 x32
1 2 4 8 12 16 32
4 8 16 32 48 64 128
2,5 5 10 20 30 40 80
0,625 1,25 2,5 5 7,5 10 20
Tab. 22.15: Die maximal möglichen Transferraten bei PCI-Express
Sandini Bib 808
Kapitel 22
Slots und Signale Für einen PCI-Express-Slot sind – je nach Anzahl der verwendeten Lanes – unterschiedlich viele Kontakte möglich, wobei mindestens 36 Pins für einen x8-Link vorgesehen sind. Der neue Slot ist vom mechanischen Aufbau her einem üblichen PCI-Slot ähnlich, hat im Vergleich zu diesem jedoch weniger Kontakte und ist daher kleiner. Zurzeit sind PCI-Express-Slots noch nicht endgültig spezifiziert, und es ist auch möglich, dass sie direkt hinter einen üblichen PCI-Slot gesetzt werden und dass daher auch Kombikarten vorgestellt werden, die sowohl über PCI- als auch über PCI-Express-Signale verfügen.
Abb. 22.22: Es existieren verschiedene Vorschläge, wie Slots und Einsteckkarten für PCI-Express zu realisieren sind.
Neben den 32 Signalen der acht Lanes eines x8-Links sind noch einige weitere Signale für die Stromversorgung und auch für den optionalen System-Management-Bus (SMB) vorgesehen, was bei einem x8-Link zu insgesamt 36 Signalen führt. Die differenziellen Signalleitungen werden jeweils mit 100 Ohm terminiert, und die Spannung (LVDS) zwischen diesen beiden Signalen ist auf maximal 1,2 V festgelegt. Darüber hinaus gibt es keine speziellen Leitungen bei PCIExpress, sondern nur die Link-Signale. Datenübertragung Die Datenübertragung findet in Paketform statt, und wie es in der Netzwerktechnik üblich ist, bezieht man sich auch für PCI-Express auf ein Schichtenmodell. Als Basis-Kodierung kommt 8B/10B zum Einsatz, was bedeutet, dass man es hier mit einem recht großen Overhead zu tun hat, was somit zu relativ hohen Latenzzeiten führt. Der Takt wird mithilfe des 8B/10B-Verfahrens generiert und verarbeitet, das im Kapitel über die lokalen Netzwerke näher erläutert ist. Als Prozessor-Systembus oder auch für den Ersatz des Speicherbus ist PCI-Express aufgrund der entstehenden Latenzzeiten nicht geeignet. Hierfür ist wie bisher die Northbridge (Memory Hub) zuständig. PCI-Express soll jedoch die Verbindung zwischen der North- und der Southbridge ersetzen, wofür anfangs der PCI-Bus zum Einsatz kam und wofür aktuell Hub-Link bei den Intel-Chipsets bzw. V-Link bei den VIA- und MuTIOL bei den SiS-Chipsets verwendet wird.
Sandini Bib Der PCI-Bus
809
Der Physical-Layer unterstützt die Lanes mit einer Breite von x1, x2, x4, x8, x12, x16 sowie x32, und die zu übertragenden Daten eines Streams können auf einzelne Lanes verteilt werden – je nachdem, wie viele davon implementiert sind –, wobei das 8B/10B-Verfahren die Kodierung übernimmt. Jedes Byte wird 8B/10B-kodiert über die zur Verfügung stehenden Lanes transportiert, und während der Initialisierung werden automatisch die Lane-Anzahl und die zu verwendende Arbeitsfrequenz zwischen zwei Agents ausgehandelt.
Abb. 22.23: Die Daten werden bei PCI-Express mit entsprechenden Paketen, vergleichbar mit den Verfahren der Netzwerktechnik, übertragen und verarbeitet.
Der Data-Link-Layer (DLL) vermittelt zwischen dem Physical-Layer und dem TransactionLayer, der das eigentliche paketbasierte Transport-Protokoll implementiert. Der DLL bietet Funktionen für die Datenflusskontrolle, die Fehlererkennung, führt Empfangsbestätigungen aus und verarbeitet die Informationen für die Initialisierung und das Power-Management. Der DLL versieht den Blockanfang eines jeden Datenpakets mit einer Packet-Sequence-Number, womit jeder PCI-Express-Übertragungsvorgang eindeutig gekennzeichnet wird. Außerdem wird an das Ende eines Pakets eine Prüfsumme (CRC) zur Fehlererkennung angehängt, damit fehlerhaft übertragene Daten einen erneuten Blocktransfer nach sich ziehen, der vom DLL ausgelöst wird. Der Transaction-Layer unterstützt vier Adressierungsarten mit entsprechenden Read- und WriteModi. Zunächst gibt es die drei PCI-Bus-üblichen, also Configuration, I/O sowie Memory, und neu ist der Message Space. Dieser ermöglicht die Unterstützung aller spezielleren Funktionen, wie beispielsweise Reset, die Interrupt- und auch die Power-Management-Verarbeitung. Vereinfacht kann man sich die zuvor mit separaten PCI-Bussignalen ausgeführten Funktionen bei PC-Express als »virtuelle Signale« vorstellen, die quasi im Message-Space ausgeführt werden. Bereits mit der PCI-Spezifikation 2.2 wurde ja das Verfahren der Message-Signaled-Interrupts (MSI) als Option eingeführt, das statt der Interrupt-Leitungen einen bestimmten Speicherbereich zur Abwicklung der Interrupt-Verarbeitung einsetzt. Durch die Verwendung eines MessageSpace bei PCI-Express wird dieses Verfahren demnach um weitere »Special-Cycles« erweitert. Ein Transaction-Paket besteht aus einem Header, einem Datenbereich und einem Anhang zur Fehlererkennung, der allerdings nur als Option vorgeschrieben ist. Der Header des TransactionLayer-Pakets setzt sich aus insgesamt 16 Bytes zusammen, und lediglich die ersten vier sind bei allen Transaction-Layer-Paketen gleich. Im Header werden im Wesentlichen die Informationen für den jeweiligen Transfermode (Memory, I/O etc.), die Service-Klasse (QoS), die Fehlererkennung sowie für das Cache-Coherency- und das Power-Management transportiert. Das PowerManagement orientiert sich dabei in seinem Funktionsumfang an den Optionen, die in Kapitel 22.7.1 erläutert sind.
Sandini Bib 810
Kapitel 22
Das Transaction-Layer-Protokoll übermittelt Datenpakete immer nur dann, wenn die Zieleinheit über eine ausreichende Anzahl von freien Puffern verfügt, was eine unnötige Belegung des Busses und damit Reduzierung der Bandbreite verhindert. Für dieses Verfahren mit der Bezeichnung Credit Based Flow sind in den PCI-Express-Einheiten entsprechend große Zwischenspeicher notwendig. Außerdem erlaubt das Transaction-Layer-Protokoll eine prioritätsgesteuerte Flusskontrolle (auch als QoS: Quality of Service bekannt) unter Berücksichtigung der zur Verfügung stehenden Bandbreite, was ebenfalls in der Netzwerktechnik zur Anwendung kommt, etwa bei ATM unter der Bezeichnung Generic Flow Control. Es werden demnach virtuelle Kanäle für die geschalteten Datenströme (Switch-Prinzip) gebildet. Der Data-Link-Layer wiederholt automatisch eine Datenübertragung, falls die Daten aus Mangel an zur Verfügung stehenden Puffern oder bei Nichtkonsistenz nicht übertragen werden konnten. Alle Daten-Requests werden vom Transaction-Layer als Split-Transactions absolviert, damit auch die Ausführung einer Empfangsbestätigung möglich ist, weil einige Transfers ein entsprechendes Response-Paket verlangen. Das Transaction-Paket-Format unterstützt eine 32-Bit-Speicheradressierung sowie die Extended 64Bit-Speicheradressierung mit Attributen wie No-Snoop oder auch Priority. Konfiguration Mit PCI-Express soll die Software-Kompatibilität zum bisherigen PCI-Standard beibehalten werden, was daher keine Anpassung an die Applikationssoftware oder an das Betriebssystem erfordert. PCI-Express übernimmt die bisherigen PCI-Konfigurationsmechanismen und emuliert die üblichen PCI-Register sowie Programmierschnittstellen. Die Modifizierungen durch PCI-Express beziehen sich also auf den Physical-, den Data-Link- sowie auf den Transaction-Layer. Ab der Treiberebene, die sich über dem Transaction-Layer befindet, bleibt damit gewissermaßen alles wie bisher. Der Configuration-Space wird bei PCI-Express von den bisherigen 256 Bytes einer PCI-Einheit auf 4096 Bytes erweitert. Der untere Bereich von 256 Bytes ist aber auch bei PCI-Express nach dem PCI-Standard 2.3 festgelegt. Der Zugriff auf diesen Bereich kann daher mit beiden PCI-Versionen erfolgen, während der Zugriff auf den erweiterten Bereich nur mit PCI-Express-Einheiten möglich ist.
22.12.3 HyperTransport Die Intel-Konkurrenz, wobei hier AMD als treibende Kraft fungiert, favorisiert statt PCI-Express ein Verfahren mit der Bezeichnung HyperTransport. Mittlerweile haben sich ca. 100 Firmen zum HyperTransport Technology Consortium zusammengefunden, um die Standardisierung und die Entwicklung von HyperTransport-Einheiten voranzutreiben. Wie die zuvor behandelten Systeme wird HyperTransport ausschließlich für die Verbindung von zwei Einheiten (Chips) verwendet, und es kommt ebenfalls ein serielles, paketorientiertes Übertragungsverfahren zum Einsatz. Damit ist aber auch schon fast Schluss mit den Gemeinsamkeiten, denn wie noch erläutert wird, schließen sich HyperTransport und PCI-Express keineswegs aus und können sich sogar vorteilhaft ergänzen. HyperTransport wird bereits mit der AMD-Hammer-CPU (64 Bit) als Systembus eingesetzt. Die Hammer-CPUs kommunizieren mit der Außenwelt über voneinander unabhängige HyperTransport-Links. HyperTransport eignet sich daher auch als Bus für Multiprozessor-Systeme, und ohne großen Aufwand lassen sich beispielsweise acht Opterons (multiprozessortaugliche CPU aus der Hammer-Serie) per HyperTransport zu einem SMP-System (Symmetric Multi-Processing) zusammensetzen, wobei die CPUs auf Teile des Hauptspeichers direkt zugreifen können.
Sandini Bib Der PCI-Bus
811
In einer Hammer-CPU ist der Memory-Controller (für DDR-SDRAM) mit eingebaut, was somit zu deutlich verkürzten Latenzzeiten beim Zugriff auf den Speicher führt. Damit hat man gewissermaßen auch gleich die zweite leistungsbestimmende Schnittstelle – zum Speicher – elegant verbessert. Demnach ist eine klassische Northbridge in Designs mit Hammer-CPUs und Hypertransport fast arbeitslos, denn sie bedient dann nur noch den AGP und stellt eine Verbindung zur Southbridge, ebenfalls per Hypertransport, her. Die Southbridge kommuniziert mit den üblichen Einheiten (BIOS, Super I/O etc.) und stellt auch einen PCI-Bus mit Slots zur Verfügung. Hypertransport ist im Gegensatz zu PCI-Express bereits seit Ende des Jahres 2002 im Einsatz, fungiert als Systembus, jedoch noch nicht als typischer I/O-Bus mit Slots für die Aufnahme von Einsteckkarten. Topologien und Links Es sind verschiedene HyperTransport-Device-Typen definiert worden, die in Kombination miteinander unterschiedlichste Topologien (Fabrics) erlauben. Eine HyperTransport-Fabric wird durch Hintereinanderschaltung (Daisy Chain Connect) mehrerer Einheiten (maximal 32) realisiert, wobei unterschiedlich viele Chains möglich sind, die auch zu einer Baumstruktur (Tree) zusammengefasst werden können. Gleichwohl gibt es ausschließlich 1:1-Verbindungen zwischen den einzelnen HyperTransport-Links, und eine Host-Bridge befindet sich am Kopf der Topologie. Der Single-Link-Typ (I/O-Device) verfügt nur über einen HyperTransport-Link und bildet das Ende eines HyperTransport-Segments, wo sich dann beispielsweise das BIOS oder ein ATA-Controller zum Anschluss anbietet. Der Tunnel-Typ besitzt zwei HyperTransport-Links. Er empfängt Daten, filtert die für ihn bestimmten heraus und gibt die für andere Devices bestimmten Daten auf dem anderen Link weiter. Der Tunnel-Typ verfügt lediglich über einen primären Interface-Capability-Block, während eine Hypertransport-Bridge auch noch einen sekundären Interface-CapabilityBlock besitzt. Der Primary Link ist für die Uplink-Stream-Richtung – zum Host hin – und der Secondary Link für die »untergeordneten« Devices (Down-Stream-Richtung) zuständig, was durch eine entsprechende Bus-Nummer für die hier angeschlossenen Einheiten gekennzeichnet wird, für die sich diese HyperTransport-HyperTransport-Bridge dann als Host-Bridge darstellt. Des Weiteren kann eine HyperTransport-Bridge mit einem Tunnel kombiniert sein, so dass diese Bridge dann über drei Link-Anschlüsse verfügt und der Tunnel-Zweig die Bus-Nummer der Host-Bridge führt. Hypertransport definiert lediglich die zwei untersten Layer entsprechend des OSI-Schichtenmodells mit differenziellen, unidirektionalen Punkt-zu-Punkt-Verbindungen. Es gibt hier weder eine 8B/10B-Kodierung noch einen Transaction-Layer mit netzwerk-typischen Frames und Mechanismen wie etwa bei PCI-Express. Die HyperTransport zugrunde liegende Technik ist bereits vor einiger Zeit als Lightning Data Transport (LDT) angetreten und wurde maßgeblich von AMD zur jetzigen HyperTransport-Technologie weiterentwickelt. Ein unidirektionaler (!) HyperTransport-Link besteht aus mindestens zwei Link-Signalen, die als CAD bezeichnet werden, was für Command, Address und Data steht. Die Kommandos, Adressen und Daten nutzen also dieselben Leitungen, und anhand eines Control-Signals (CTL) findet die Unterscheidung zwischen Kommandos mit Adressen sowie den Daten statt.
Sandini Bib 812
Kapitel 22
Abb. 22.24: Beispiele für HyperTransport-Topologien mit verschiedenen HyperTransport-Einheiten. (»P« steht für Primary Link und » S« für Secondary Link)
Außerdem gibt es ein Taktsignal (CLK), das für maximal acht Bits zuständig ist. Die Einschränkung auf ein Taktsignal pro Byte ergibt sich aus der Tatsache, dass dadurch Timing-Probleme möglichst vermieden werden. Bei einem 32-Bit-HyperTransport-Bus sind demnach vier CLKSignale notwendig.
Abb. 22.25: Für die Minimalausführung eines HyperTransport-Links werden 16 Leitungen benötigt.
Die Daten werden jeweils an der ansteigenden und an der abfallenden Flanke von CLK übernommen, so dass die Datenfrequenz dem doppelten Bustakt (200-800 MHz) entspricht, wie es beispielsweise auch bei den DDR-SDDRAMs praktiziert wird. Als Bustakt sind zunächst 200 MHz und 400 MHz als üblich anzusehen, und 800 MHz kommt bei den Designs mit AMDs Opteron-CPUs seit Ende des Jahres 2002 zum Einsatz. Weiterhin ist bereits ein maximaler Bustakt von 1600 MHz bei einigen Designs realisiert worden. HyperTransport-Links sind mit einer Breite von x2, x4, x8, x16 und x32 definiert, und Links mit einer Breite von 16 oder 32 Bits werden aus der entsprechenden Anzahl von acht Bit-Links gebildet. Da es sich, wie bereits erwähnt, (zunächst) um eine unidirektionale Ausführung handelt, ist
Sandini Bib Der PCI-Bus
813
die doppelte Anzahl an Leitungen notwendig, um einen bidirektionalen Link zu realisieren, und außerdem wird ein Signal jeweils auf einem Leitungspaar (differenziell) übertragen, so dass die Leitungsanzahl noch einmal zu verdoppeln ist. Für die Minimalausführung eines HyperTransport-Links (x2-Link) werden daher 16 Leitungen benötigt, wie es in Abbildung 22.25 gezeigt ist, und ein x32-Link verlangt demgegenüber 148 Link-Leitungen. HyperTransport erlaubt aber, wie im Grunde genommen auch PCI-Express, sehr unterschiedliche und flexible Realisierungen mit unterschiedlichen Taktfrequenzen und Busbreiten, so dass eine Vielzahl von Kombinationsmöglichkeiten gegeben ist und auch noch genügend Spielraum für zukünftige Systeme auf der Basis von HyperTransport bleibt. Dem Einsatz von HyperTransport (HT) steht demnach sowohl in ausgesprochenen Multiprozessor- als auch in kleineren Embedded-Systemen – mit entsprechend angepasster, reduzierter Bandbreite – nichts entgegen. Insbesondere die Firmen AMD, VIA und PLX haben im Jahre 2002 eine ganze Reihe von HT-Chips vorgestellt. In Abbildung 22.26 ist der Aufbau eines Chips mit der Bezeichnung HyperTransport-Tunnel to Dual PCI-X-Bridge (PowerDrive HT 7520) der Firma PLX gezeigt, der in Upstream-Richtung (A) – zum Host hin – über ein 16-Bit- und in Downstream-Richtung (B) über ein 8-Bit-HT-Interface sowie über zwei X-Bridges verfügt. Hiermit ist in A-Richtung eine Bandbreite von 6,4 GByte/s und in B-Richtung eine Bandbreite von 3,2 GByte/s gegeben. Die Interfaces lassen sich im Bedarfsfall auf eine Breite von x8, x4 oder x2 konfigurieren, und es sind Taktfrequenzen von 200, 400, 600 sowie 800 MHz möglich, was verdeutlicht, dass HT-Chips sich tatsächlich flexibel in unterschiedlichen Systemumgebungen integrieren lassen. Allerdings sind derartige HT-Chips mit einer Vielzahl von Kontakten ausgestattet; beispielsweise befindet sich der HT 7520 in einem 829-poligen OBGA-Gehäuse.
Abb. 22.26: Der HT 7520 der Firma PLX erlaubt die Integration von zwei unabhängigen PCI-X-Bussystemen in einer HyperTransport-Umgebung.
In der einfachsten Ausführung, was einem bidirektionalen x2-Link mit 200-MHz-Bustakt entspricht, stehen vier CAD-Signale zur Verfügung, was somit zu 800 MBit/s und laut DoubleData-Rate-Prinzip (Datentakt ist demnach doppelt so hoch) wiederum zu einer Transferrate von 1,6 GBit/s oder ca. 200 MByte/s führt. Bei einem Bustakt von 800 MHz und einem x32-Link führt dies dann zum (theoretischen) Maximum von 12,8 GByte/s, wie es in Tabelle 22.16 zur Übersicht angegeben ist.
Sandini Bib 814
Link-Typ
Kapitel 22
Link-Leitungen
x2
16
x4
24
x8
40
x16
76
x32
148
Bustakt in MHz
Gesamtrate in GByte/s
200 400 800 200 400 800 200 400 800 200 400 800 200 400 800
0,2 0,4 0,8 0,4 0,8 1,6 0,8 1,6 3,2 1,6 3,2 6,4 3,2 6,4 12,8
Tab. 22.16: Die maximal möglichen Transferraten mit HyperTransport-Links
Neben den bisher ausschließlich betrachteten Link-Signalen gibt es des Weiteren noch ein PWROK- und ein RESET-Signal, die im Grunde genommen für jede HyperTransport-Einheit dieselben sind und demnach auch nicht als Link-Signale ausgewiesen sind. PWROK signalisiert, dass sich die Spannungen und die Taktsignale innerhalb der Spezifikation befinden, und RESET versetzt die HyperTransport-Einheiten in ihren logischen Grundzustand. Diese Signale wirken also für HyperTransport-Einheiten zunächst als Eingangssignale, wobei es durchaus möglich ist, dass die Einheiten diese Signale auch treiben können, indem Wired-OR-Verbindungen (Open Drain) realisiert werden. HyperTransport ist als plattformübergreifendes System ausgelegt und demnach nicht ausschließlich auf x86-kompatible Implementierungen beschränkt. Allein für x86-kompatible Systeme sind noch zwei optionale Power-Management-Signale vorgesehen: LDTSTOP, das die Links ein- und ausschalten kann, sowie LDTREQ, das als Anforderungssignal dient, um die Links wieder in den normalen Betriebszustand versetzen zu können. Auch diese Signale können per Wired-OR »verdrahtet« sein, damit mehrere Einheiten diese Signale auslösen und verarbeiten können. Die Signale PWROK und RESET sowie die beiden Signale für das Power-Management werden nicht als differenzielle Link-Signale ausgeführt, sondern entsprechen gewissermaßen konventioneller Logik (2,5 V CMOS). Allein CAD, CTL und CLK stellen die Link-Signale dar (LVDS mit 1,2 V), die auf jeweils zwei Leitungen (differenziell) übertragen werden, wie es in Abbildung 22.27 für ein einziges Link-Signal mit dem entsprechenden Treiber (Driver) und Empfänger (Receiver) gezeigt ist.
Abb. 22.27: Eine HyperTransport-Link-Verbindung
Sandini Bib Der PCI-Bus
815
Die Leitungsimpedanz (RLine) beträgt 60 Ohm, und die maximal zulässige Leitungslänge ca. 60 cm, so dass sich auch HT-Steckverbinder relativ problemlos realisieren lassen, wobei Ende des Jahres 2002 jedoch noch keine endgültige Version auszumachen war. Pakete und Kommunikation Die Datenübertragung wird in Paketen absolviert, die stets Vielfachen von vier Bytes entsprechen. Die HT-Kommunikation findet grundsätzlich über explizit ausgewiesene Adressbereiche (siehe Tabelle 22.17) statt, so dass keine weiteren speziellen Signale, wie etwa für die Absolvierung der Interrupt-Verarbeitung, notwendig sind. Basisadresse
Obere Adresse
Größe
Verwendung
00.0000.0000 FD.0000.0000 FD.F900.0000 FD.F910.0000 FD.F920.0000 FD.FC00.0000 FD.FE00.0000 FE.0000.0000
FC.FFFF.FFFF FD.F8FF.FFFF FD.F90F.FFFF FD.F91F.FFFF FD.FBFF.FFFF FD.FDFF.FFFF FD.FFFF.FFFF FF.FFFF.FFFF
1012 GByte 3984 MByte 1 MByte 1 MByte 46 MByte 32 MByte 32 MByte 8 GByte
Speicher, Memory-Mapped-I/O Interrupt/EOI Legacy PIC System-Management Reserviert I/O Konfiguration Reserviert
Tab. 22.17: HyperTransport-Adressbereiche
Als Standard wird ein 8-Bit-Paket angenommen, und 16- sowie 32-Bit-Pakete werden durch eine entsprechende Verkettung von 8-Bit-Paketen innerhalb einer definierten Bit-Time gebildet, die vom Bustakt abhängig ist. Die Bit-Time (BT) entspricht der halben Bustaktperiode, d.h., zwei Datenbits werden demnach in einem Zyklus übertragen. Die Pakete für x2- und x4-Links werden von der 8-Bit-Paketstruktur durch Teilung der Bit-Time abgeleitet. Die folgende Liste zeigt die jeweils notwendige Teilung bzw. Verkettung (»| |«) der verschiedenen Link-Pakete. x2-Link-Paket: BT12[1:0] = BT18[1:0] BT22[1:0] = BT18[3:2] BT32[1:0] = BT18[5:4] BT42[1:0] = BT18[7:6] x4-Link-Paket: BT14[3:0] = BT18[3:0] BT24[3:0] = BT18[7:4] x8-Link-Paket: BT18[7:0] = BT18[7:0] x16-Link-Paket: BT116[15:0] = BT28[7:0] | | BT18 [7:0] X32-Link-Paket: BT132[31:0] = BT48[7:0] | | BT38 [7:0] | | BT28 [7:0] | | BT18 [7:0]
Sandini Bib 816
Kapitel 22
Den allgemein gültigen Aufbau der Request- und Response-Pakete sehen Sie in den Abbildungen 22.28 und 22.29. Nicht nur die Pakete selbst, sondern auch die Bits in den Paketen unterscheiden sich je nach Kommando, was in den Abbildungen jeweils durch die Bezeichnung »Kommando-spezifisch« gekennzeichnet ist. Auf alle Paket-Details möchte ich allerdings nicht eingehen und hier nur die wesentlichen Dinge für den HT-Datenaustausch erläutern, d.h., in erster Linie die allgemein gültigen Bits in den beiden Pakettypen etwas näher beschreiben. Datenpakete folgen stets einem Write-Request- und einem Read-Response-Paket und haben eine Länge von 4 bis 64 Bytes. Info-Pakete haben stets eine Länge von vier Bytes und werden für die direkte Kommunikation zwischen HT-Einheiten verwendet. Diese Pakete werden nicht gepuffert und auch nicht innerhalb einer HT-Fabric geroutet. Wichtig sind für die Request- und die Response-Pakete die im Folgenden erläuterten Bit-Felder. SeqID[3:0] Diese Bits (Sequence IDs) dienen der Kennzeichnung von Anfragen (Requests) einer Einheit, um eine bestimmte Reihenfolge innerhalb eines Virtual-Channels festzulegen. Der Wert von 0x0 ist reserviert und weist eine Transaktion aus, die nicht Teil einer Sequenz ist. CMD[5:0] Bestimmt den jeweiligen Kommandotyp (Command). In Tabelle 22.18 sind die Kommandos mit ihrer jeweiligen Bedeutung sowie die Pakettypen angegeben, mit denen sie transportiert werden. Bestimmte Kommandos – gewissermaßen die elementaren – sind drei unterschiedlichen Virtual Channels zugeordnet, und zwar für: Posted Requests, Nonposted Requests und Responses. Dadurch wird sichergestellt, dass die zwischengespeicherten oder eben nicht zwischengespeicherten Anfragen (Requests) und die jeweiligen Antworten (Responses) der verschiedenen Einheiten sich auf dem Bus nicht »ins Gehege« kommen (Bus-Blocking o.Ä.) und jederzeit entsprechend große Puffer zur Verfügung stehen, damit auch keine Daten verloren gehen können. CMD[5:0]
Kommando
Virtual Channel
Bedeutung
Paket-Typ
00.0000
NOP
-
Info
00.0001 00.0010 00.0011 00.01xx 00.1xxx
Reserved-Host Flush Reserved-Host
Nonposted -
Paket ohne Daten, keine Flusskontrolle Reserviert Flush Posted Writes Reserviert
Write
Nonposted
10.1xxx
Write
Posted
Tab. 22.18: Die Kommandos und ihre Funktionen
Write Request [2] Datenlänge 0=Byte 1=Doubleword [1] Bandbreite 0=Normal 1=Isochronous [0] Host-Cache 0=Noncoherent 1=Coherent Write Request (Bits wie zuvor)
Request Request/Address/Data
Request/Address/Data
Sandini Bib Der PCI-Bus
817
CMD[5:0]
Kommando
Virtual Channel
Bedeutung
Paket-Typ
01.xxxx
Read
Nonposted
Request/Address
10.0xxx 11.0000 11.0001 11.0010 11.0011 11.010x 11.011x 11.100x 11.1010 11.1011 11.1100 11.1101 11.1110 11.1111
Reserved-I/O RdResponse Reserved-Host
Response -
Read Request [3] Response-Reihenfolge 0=Ändern nicht erlaubt 1=Ändern erlaubt [2] Datenlänge 0=Byte 1=Doubleword [1] Bandbreite 0=Normal 1=Isochronous [0] Host-Cache 0=Noncoherent 1=Coherent Reserviert Read Response Reserviert
TgtDone Reserved-Host Reserved-I/O Reserved-Host Broadcast Reserved-Host Fence Atomic Reserved-I/O Sync/Error
Response Posted Posted Nonposted -
Target ist bereit Reserviert Reserviert Reserviert Broadcast-Message Reserviert Gesperrt für Posted-Requests Atomic Read-Modify-Write Reserviert Link-Synchronisation und Fehler-Paket
Response/Data Response Request/Address Request Request/Address/Data Info
Tab. 22.18: Die Kommandos und ihre Funktionen (Forts.)
PassPW Kennzeichnet, dass andere Pakete vor diesem Paket verarbeitet werden dürfen, also entgegen der aufgetretenen Request-Reihenfolge. Diese Funktion (Pass Posted Writes) ist auch für den Zugriff auf den PCI-Bus von Bedeutung. Dieses Bit sollte zumindest dann gesetzt werden, wenn keine PCI-Bus-Funktion notwendig ist, da das HyperTransport-Protokoll dann die Pakete entsprechend der aktuell zur Verfügung stehenden Bandbreite in einer optimierten Reihenfolge abarbeiten kann und keinerlei PCI-Bus-spezifischen Funktionen zu beachten sind. UnitID[4:0] Mithilfe dieser IDs werden die Daten eindeutig einer bestimmten Quell- oder Zieleinheit zugeordnet, d.h. einem Request- oder einem Response-Paket und damit einer bestimmten Transaktion zugehörig erklärt. Pakete der Host-Bridge (Downstream) führen als UnitID stets 00000. Bit-Time 0 1
7
6
5
SegID[3:2] PassPW
4
3
2 Cmd[5.0]
SegID[1:0]
2
Kommando-spezifisch
3
Kommando-spezifisch
Abb. 22.28: Request-Paket mit Adresse
UnitID[4:0]
1
0
Sandini Bib 818
Kapitel 22
Bit-Time
7
6
5
4
3
2
4
Adresse [15:8]
5
Adresse [23:16]
6
Adresse [31:24]
7
Adresse [39:32]
1
0
Abb. 22.28: Request-Paket mit Adresse (Forts.)
Bei einem Read-Request wird innerhalb der Bit-Time 2 anhand der Bits 7 und 6 ([1:0]) und innerhalb der Bit-Time 3 anhand der Bits 1 und 0 ([3:2]) die Größe des Datenblocks festgelegt. Das Feld SrcTag [4:0] (Bit-Time 2, Bits [4:0]) dient der Identifizierung der ausstehenden Antworten, die von einer Einheit (UnitID) initiiert worden sind. Es dient dem Abgleich der Antworten auf die Anfragen und wird nur für Nonposted-Requests verwendet. Zeitgleich können maximal 32 dieser Transaktionen aktiviert sein. Die darauf folgenden Adressfelder [39:0] müssen nicht alle verwendet werden, sondern in den Adressfeldern können auch Mask-Bits transportiert werden, um eine feinere Granularität zu erreichen, damit auch einzelne Bits zu selektieren sind. Bit-Time
7
6
5
0
Kommando-spezifisch
1
PassPW
2 3
Bridge
reserviert reserviert
NXA
4
3
2
1
0
Cmd[5.0] Kommando-spezifisch
UnitID[4:0]
Error
Kommando-spezifisch reserviert
Kommando-spezifisch
Abb. 22.29: Response-Paket
Ein Response-Paket führt neben den bisher erläuterten und den kommando-spezifischen Bits generell ein Bridge-Bit zur Kennzeichnung, dass die Kommunikation eben über eine Bridge stattfindet. Ein Error-Bit kennzeichnet, dass die Antwort auf den Request nicht korrekt beendet werden konnte. Ist es gesetzt, gilt das NXA-Bit (Non Existent Address) als gültig, d.h., wenn dieses ebenfalls gesetzt ist, hat überhaupt keine Einheit den Request akzeptiert. Ist NXA hingegen nicht gesetzt, ist der Request zwar akzeptiert worden, jedoch konnte dieser Zyklus nicht beendet werden. Ein Datentransfer funktioniert damit kurz zusammengefasst wie folgt, wenn etwa die CPU von einem Festplattencontroller Daten lesen soll. Die CPU sendet zunächst ein Read-Request-Paket (8 Bytes), das die Datenblockgröße und die Adressen ausweist. Sobald der Controller die Daten verfügbar hat, sendet er seinerseits ein Read-Respond-Paket (4 Bytes) als Antwort, woraufhin unmittelbar die Daten folgen. Zur Unterscheidung zwischen Daten und Kommandos wird das Control-Signal (CTL) verwendet, das bei Kommandos eine logische 1 führt. Während die CPU auf die Daten des Controllers wartet, kann sie weitere Kommandos absetzen. Zur Unterscheidung der Antwortpakete jeder Einheit (ausgewiesen per Unit ID) dient das 5 Bit breite Feld SrcTAG im Read-Request-Paket. Die Bits PassPW und die SeqIDs steuern dabei die Reihenfolge der Antworten mit den Virtual Channels.
Sandini Bib Der PCI-Bus
819
Konfiguration Die HyperTransport-Konfigurierung funktioniert nach dem PCI-Bus-Prinzip, und dementsprechend wird auch hierfür der Configuration-Space (64-Byte-Header) verwendet, wie er in Kapitel 22.7 erläutert ist. Anhand der Capability-Register (vgl. Tabelle 22.3, Capability ID) werden die speziellen HT-Register für die Konfigurierung der Links (Link-Control, Link-Frequency etc.) selektiert. Außerdem werden die zwölf verschiedenen PCI-Buszyklen (siehe Kapitel 22.2) komplett unterstützt, so dass sich HyperTransport und der PCI-Bus nicht nur ergänzen, sondern HT durchaus auch als PCI-Bus-Fortentwicklung mit einem erheblich erweiterten Funktionsumfang verstanden werden kann. Nach einem System-Reset sendet die HT-Hostbridge automatisch Testbits, um die zur Verfügung stehende Busbreite und die zulässige Taktfrequenz zu ermitteln, die zunächst auf 200 MHz reduziert und daraufhin ggf. auf den maximal möglichen Wert erhöht wird. Obwohl sich HT-Einheiten bei der Konfigurierung prinzipiell wie PCI-Bus-Devices verhalten, bedarf es aber einer entsprechenden Anpassung der BIOS-Routinen. Erweiterungen HT-Erweiterungen sind bereits auf den Weg gebracht worden, und die Spezifikation 2.0, die sich in Produkten aber erst wohl im Jahre 2004 niederschlagen wird, sieht eine Erhöhung der Taktfrequenz vor sowie eine Verbreiterung des SrcTag-Feldes, um die Maximalanzahl der Transaktionen von 32 auf 1024 pro Einheit zu erhöhen. Es wird noch Erweiterungen in Form eines Message-Passing-Protokolls geben, was insbesondere für Multiprozessorsysteme und allgemein vernetzte Strukturen von Bedeutung ist, um die Parallelität von Operationen und Daten-Streams zu verbessern. Außerdem soll auch eine Peer-to-Peer-Kommunikation möglich sein, also ein Datenaustausch zwischen Einheiten, der nicht wie bisher grundsätzlich über die Host-Bridge laufen muss, sondern direkt von einer HT-Einheit zu einer anderen.
Sandini Bib
Sandini Bib
23
Accelerated Graphics Port
Der Accelerated Graphics Port – kurz AGP – wird seit Mitte 1997 auf Mainboards in Form eines einzigen Steckplatzes (Slots) eingebaut und ist allein für die Aufnahme einer entsprechenden AGPGrafikkarte vorgesehen. Alternativ kann der AGP-Grafikchip auch direkt auf dem Mainboard vorhanden sein. Eine AGP-Karte ist dafür ausgelegt, dass sie gegenüber einer PCI-Grafikkarte eine höhere Leistung zur Verfügung stellt, was insbesondere für 3D-Spiele von Bedeutung ist. Der AGP stellt heute im PC-Bereich generell den Standard für Grafikkarten dar, und auch dieser Bus ist auf Bestreben von Intel entwickelt worden, dessen wesentliche Kenndaten ich Ihnen zunächst vorstellen möchte.
: : : : :
Der AGP ist wie der PCI-Bus 32 Bit breit, arbeitet demgegenüber jedoch mit 66 MHz und in verschiedenen Betriebsarten (1x, 2x, 4x, 8x) mit unterschiedlichen Pegeln und Betriebsspannungen. Daher ist beim AGP keine durchgängige elektrische Kompatibilität gegeben. Die Initialisierung einer AGP-Grafikkarte wird zunächst über herkömmliche PCI-Bus-Transfers abgewickelt, bevor der AGP aktiviert wird. Die eigentlichen AGP-Funktionen werden nicht durch das BIOS, sondern durch das Betriebssystem (z.B. mit Direct Draw) aktiviert. AGP ist gewissermaßen ein PCI-Ableger und wird daher ebenfalls als PCI-Bus detektiert (PCIBus 1, der PCI-Bus 0 ist der Mainboard-übliche). Eine AGP-Grafikkarte verlangt – im Gegensatz zu einer PCI-Karte – stets auch einen InterruptKanal (IRQ).
23.1 AGP-Struktur Der AGP ist kein Ersatz und keine Erweiterung des PCI-Bus, sondern er wird eben in Form eines zusätzlichen Steckplatzes für eine Punkt-zu-Punkt-Verbindung (kein Bus) auf dem Mainboard realisiert. Eine AGP-Grafikkarte muss sich demnach nicht die Bandbreite mit anderen Busteilnehmern teilen, wie es beim klassischen PCI-Bus der Fall ist. Der AGP ist wie der PCI-Bus 32 Bit breit, arbeitet demgegenüber jedoch mit 66 MHz. Der AGPSteckplatz ist weder in elektrischer noch in mechanischer Hinsicht zum PCI-Slot kompatibel und ein ganzes Stück kleiner. Trotz dieser Unterschiede werden einige PCI-Signale (Steuerleitungen) ebenfalls vom AGP verwendet. Dass die eigentlichen AGP-Funktionen nicht durch das BIOS, sondern durch das Betriebssystem aktiviert werden, kommt bekannt vor, denn dieses Prinzip wurde in ähnlicher Art und Weise schon vor Jahren beim VESA-Local-Bus für VLB-Controllerkarten angewendet: Die VLB-Karte wird über den ISA-Bus initialisiert, und dann wird der VLB über einen zu ladenden Treiber aktiviert, und wenn dies aus irgendeinem Grunde nicht funktioniert, arbeitet die VLB-Karte (32 Bit) als 8-Bit-ISA-Karte. Beim AGP bedeutet dies analog dazu, dass die AGP-Karte lediglich als PCI-Karte arbeitet, wenn die softwaretechnische Initialisierung aus irgendeinem Grunde nicht korrekt funktionieren sollte.
Sandini Bib 822
Kapitel 23
Abb. 23.1: Die Integration des AGPs in der Mainboard-Elektronik. Eine AGP-Grafikkarte kann einen Teil des PC-Speichers als Texture-Memory verwenden.
Der AGP ist als Bridge im Chipsatz integriert und von der CPU des PC unabhängig, was somit einen Parallelbetrieb von CPU und Grafikchip, der als Busmaster arbeitet, ermöglicht. 3DAnwendungen, vorwiegend die beliebten Spiele, sind auf einen möglichst großen Grafikspeicher angewiesen, der prinzipiell aus drei Bereichen besteht: Frame-Buffer, Z-Buffer und einem Bereich für die Texturdaten (Texture Buffer). Für die Texturen kann bei AGP-Grafikkarten ein Teil des normalen PC-Speichers verwendet werden. Die jeweilige Festlegung ist hierfür im BIOSSetup unter dem Punkt AGP Aperture Size zu treffen. Dies ist die maximale Speichergröße in MByte im üblichen normalen DRAM-Speicher, die von der AGP-Grafikkarte für die Texturen verwendet werden kann. Diese werden demnach über den AGP transportiert. Die AGP Aperture Size kann üblicherweise auf 4, 8, 16, 32, 64, 128 oder 256 MByte festgelegt werden. Die optimale Größe hängt davon ab, ob die AGP-Karte einen eigenen Texturenspeicher besitzt und wie groß dessen Kapazität ist. Die hier festgelegte Speichergröße wird dynamisch verwendet, was bedeutet, dass der Bereich dem jeweiligen Datenaufkommen angepasst wird und keineswegs konstant ist, sondern lediglich maximal 4 oder 256 MByte beträgt. In der Regel wird der externe Texturenspeicher im DRAM automatisch dann verwendet, wenn die jeweilige Applikation (das Spiel) dies verlangt. Falls sich bei hohen Auflösungen merkliche Verzögerungen einstellen, kann dies ein Indiz dafür sein, dass die AGP Aperture Size zu knapp bemessen ist, so dass diese Einstellung dann nach oben hin anzupassen ist.
23.2 AGP-Slots Die erste Generation von AGP-Grafikkarten ist für eine Spannung von 3,3 V ausgelegt und beherrscht den 1x- und möglicherweise auch den 2x-Mode. Neuere Modelle, die den 4x- oder sogar den 8x-Mode unterstützen, arbeiten demgegenüber mit 1,5 V. Tabelle 23.1 zeigt die jeweilige Zuordnung zu den AGP-Standards, auf die im Folgenden noch genauer eingegangen wird.
Sandini Bib Accelerated Graphics Port
823
Standard
AGP 1.0
AGP 2.0
AGP 3.0
Modi I/O-Level Typ
1x, 2x 3,3 V 3,3 V
1x, 2x, 4x 1,5 V 1,5 V und Universal (3,3 V und 1,5 V)
4x, 8x 0,8 V 1,5 V und Universal (1,5 V und 0,8 V)
Tab. 23.1: Die AGP-Standards legen verschiedene Betriebsarten und -spannungen fest.
Damit die jeweiligen AGP-Karten nicht fälschlicherweise in einen ungeeigneten AGP-Slot eingesteckt werden, befinden sich im Slot entsprechende Stege, die dies mechanisch verhindern. Bis auf diese Einkerbungen in den AGP-Karten bzw. Stegen in den Slots – die zusammengefasst als Keys bezeichnet werden – gibt es keinen weiteren mechanischen Unterschied zwischen den verschiedenen AGP-Varianten.
Abb. 23.2: Die verschiedenen AGP-Slots
Einige AGP-Karten verfügen über eine extrem hohe Stromaufnahme (7–10 A), die nicht über die üblichen Kontakte des AGP-Slots zu bewältigen ist, was zu einer Erweiterung namens AGP-Pro geführt hat. Ein AGP-Pro-Slot besitzt an den beiden Seiten des üblichen AGP-Slots 28 zusätzliche Kontakte für 3,3 V, Masse und 12 V, was laut Spezifikation für eine Leistung von bis zu 110 W ausreichen soll. Des Weiteren bietet AGP-Pro zwei zusätzliche Signale (PRSNT[1:2]), mit deren Hilfe eine AGPPro-Karte, die nicht in einem Standard-AGP-Slot verwendet werden kann, ihre Leistungsaufnahme signalisiert. Die Funktion ist dabei die gleiche, die beim PCI-Bus beschrieben ist.
Sandini Bib 824
Kapitel 23
PRSNT1
PRSNT2
AGP-Pro-Karte
1 0 1 0
1 1 0 0
keine maximal 50 W Leistungsaufnahme reserviert maximal 110 W Leistungsaufnahme
Tab. 23.2: Die Bedeutung der Present-Signale für AGP-Pro-Karten
23.3 AGP-Signale Bedingt durch die verschiedenen Betriebsarten und die unterschiedlichen AGP-Slot-Typen unterscheidet sich die jeweilige Signalbelegung der AGP-Slots (geringfügig) voneinander. Tabelle 23.3 zeigt zunächst die Signalbelegung für den (ursprünglichen) 3,3 V-Slot. Die fett markierten Kontakte werden bei den anderen Slot-Varianten unterschiedlich verwendet, wie es noch im Einzelnen erläutert wird. Pin Nr.
Signal
Pin Nr.
Signal
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
OVRCNT 5V 5V USB+ GND INTB CLK REQ Vcc3.3 ST0 ST2 RBF GND Reserviert SBA0 Vcc3.3 SBA2 SB_STB GND SBA4 SBA6 Key Key Key Key AD31 AD29 Vcc3.3 AD27 AD25 GND
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
12 V TYPEDET Reserviert USBGND INTA RST GNT Vcc3.3 ST1 Reserviert PIPE GND Reserviert SBA1 Vcc3.3 SBA3 Reserviert GND SBA5 SBA7 Key Key Key Key AD30 AD28 Vcc3.3 AD26 AD24 GND
Tab. 23.3: Die Signale am AGP-3,3 V-Slot
Sandini Bib Accelerated Graphics Port
825
Pin Nr.
Signal
Pin Nr.
Signal
B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 B46 B47 B48 B49 B50 B51 B52 B53 B54 B55 B56 B57 B58 B59 B60 B61 B62 B63 B64 B65 B66
AD_STB1 AD23 Vddq3.3 AD21 AD19 GND AD17 C/BE2 Vddq3.3 IRDY 3,3 VAux GND Reserviert Vcc3.3 DEVSEL Vddq3.3 PERR GND SERR C/BE1 Vddq3.3 AD14 AD12 GND AD10 AD8 Vddq3.3 AD_STB0 AD7 GND AD5 AD3 Vddq3.3 AD1 Reserviert
A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 A46 A47 A48 A49 A50 A51 A52 A53 A54 A55 A56 A57 A58 A59 A60 A61 A62 A63 A64 A65 A66
Reserviert C/BE3 Vddq3.3 AD22 AD20 GND AD18 AD16 Vddq3.3 FRAME Reserviert GND Reserviert Vcc3.3 TRDY STOP PME GND PAR AD15 Vddq3.3 AD13 AD11 GND AD9 C/BE0 Vddq3.3 Reserviert AD6 GND AD4 AD2 Vddq3.3 AD0 Reserviert
Tab. 23.3: Die Signale am AGP-3,3 V-Slot (Forts.)
Im 1x-AGP-Transfer-Mode wird jeweils ein DWORD (4 Bytes) auf der ansteigenden Flanke von CLK übertragen, was einem üblichen PCI-Bus-Transfer entspricht. Ab dem 2x-Mode sind zwei Strobe-Signale (AD_STB0, AD_STB1) für die Übertragung von Bedeutung. Während eines jeden AGP-Taktes (CLK) werden hiermit zwei DWORDs (8 Bytes) transferiert, wobei AD_STB0 auf abfallender und ansteigender Flanke jeweils die unteren 4 Bytes (auf AD[15:0] mit BE[1:0]) treibt und AD_STB1 dementsprechend die oberen (auf AD[31:16] mit BE[3:2]). Im 4x-Mode, der bei AGP-Grafikkarten ab Baujahr 1999 als Standard anzusehen ist, kommen zu diesen zwei Strobe-Signalen jeweils zwei komplementäre Signale hinzu (AD_STB0, AD_STB1), die am Slot jeweils am gegenüberliegenden Kontakt (A18, A59) lokalisiert sind. Der Slot muss dabei dem 1,5 V- oder dem Universal-Typ entsprechen, denn beim 3,3 V-Slot sind diese »neuen«
Sandini Bib 826
Kapitel 23
Signale nicht vorhanden, und die jeweiligen Kontakte werden als reserviert bezeichnet. Dies bedeutet, dass der 4x-Mode nur von AGP-Devices genutzt werden kann, die die 1,5 V-Technologie verwenden. Prinzipiell lassen sich die nunmehr vier Strobe-Signale als differenzielle oder phasenverschobene Leitungspaare einsetzen, was leistungstechnisch gesehen jedoch zum gleichen Ergebnis führt, denn es ist die doppelte Byteanzahl (16 Bytes, 4 DWORDs) gegenüber dem 2x-Mode in der gleichen Zeit zu übertragen. In Abbildung 23.3 ist der Daten-Transfer im 2x- und im 4x-Mode noch einmal grafisch dargestellt.
Abb. 23.3: AGP-Datentransfer im 2x- und im 4x-Mode
Neben den beiden (komplementären) Strobe-Signalen an A18 und A59 gibt es noch einige weitere Unterschiede in der Slot-Kontaktbelegung zwischen einem 3,3 V-, einem Universal- und einem 1,5 V-Typ. Der wesentliche Unterschied ist zunächst mechanischer Natur, denn die Keys (A22–A25, B22–B25) gibt es nur beim 3,3 V-Typ. Der Universal-Typ verfügt über keinerlei Keys (vgl. Abbildung 23.2), und beim 1,5 V-Typ sind entsprechende Keys an den Positionen A42–A45, B42–B45 angebracht. An denjenigen Slots, wo sich an den angegebenen Positionen keine Keys befinden, sind stattdessen Kontakte vorhanden, die mit der Masse (GND) verbunden sind, eine Hilfsspannung (3,3 Vaux) führen oder aber als reserviert ausgewiesen sind (vgl. Tabelle 23.2). Des Weiteren gibt es noch Unterschiede in der Spannungsversorgung an den Pins (A34, B34, A40, B40, B47, A52, B52, A58, B58, A64, B64), die mit Vddq, sowie an A66 und B66, die beim 3,3 V-Slot mit reserviert bezeichnet sind. Letztere werden beim Universal- und beim 1,5 V-Slot mit Vrefcg-Signalen belegt, die als Referenzsignale zwischen dem Chipset (speist B66) und dem AGP-Adapter (speist A66) fungieren. Die Vddq-Kontakte führen – je nach Typ – entweder explizit 3,3 V oder 1,5 V bzw. eine von diesen beiden Spannungen bei einem Universal-Slot und sind für die Speisung des I/O-Interface zuständig. Die beiden letzten Unterschiede betreffen die beim 3,3 V-Slot mit reserviert ausgewiesenen Kontakte A14 und A18. Der Universal- und der 1,5 V-Typ haben an A14 ein Signal mit der Bezeichnung WBF, was für Write Buffer Full steht. Dieses Signal kennzeichnet, ob der Master für weitere Write-Daten bereit (Fast Write) ist. Es wird vom AGP-Target bedient und fungiert demnach als Eingangssignal für den Master.
Sandini Bib Accelerated Graphics Port
827
Für die unten näher erläuterten Side-Band-Address-Signale (SBA) gibt es am Kontakt A18 ein Strobe-Signal, das für den Universal- und den 1,5 V-Typ um ein komplementäres Signal (SB_STB) erweitert wurde und demnach (Prinzip wie bei den AD_STB-Strobe-Signalen) am gegenüberliegenden Kontakt (B18) zu finden ist.
23.3.1 Signalbeschreibung In der AGP-Terminologie ist, wie bei anderen Bussystemen auch, von einem Master und einem Target die Rede, wobei der Master dem Grafikcontroller auf der AGP-Karte und das Target der AGP-Logik auf dem Mainboard entspricht. Die AGP-Logik ist als Bridge im Chipsatz integriert. Die folgende Beschreibung sieht die Signale aus der Warte des AGP-Masters, und es werden nur die neuen AGP-Signale erläutert und nicht diejenigen, die bereits vom PCI-Bus her bekannt sind. Eine Erläuterung der Signale, wie sie beim AGP-3.0-Standard (8x-Mode) verwendet werden, ist in Kapitel 23.4 zu finden. AD0–AD31 (I/O) Anschlüsse A65, B65, A63, B63, A62, B62, A60, B60, B57, A56, B56, A54, B54, A53, B53, A51, A39, A38, A36, B36, A35, B35, A30, B30, A29, B29, A27, B27, A26, B26 Der gemultiplexte 32-Bit-Adressen-/Datenbus des AGP. AD_STB0 (I/O) Anschluss B59 AddressData-Strobe-0, Taktsignal für den 2x- und den 4x-Transfer-Mode über AD[15:0] mit C/ BE[1:0]. AD_STB0 (I/O) Anschluss A59 AddressData-Strobe-0, komplementäres Taktsignal für den 4x-Transfer-Mode über AD[15:0] mit C/BE[1:0]. AD_STB1 (I/O) Anschluss B32 AddressData-Strobe-1, Taktsignal für den 2x-Transfer-Mode und den 4x-Transfer-Mode über AD[31:16] mit C/BE[3:2] . AD_STB1 (I/O) Anschluss A32 AddressData-Strobe-1, komplementäres Taktsignal für den 4x-Transfer-Mode über AD[31:16] mit C/BE[3:2]. CLK (O) Anschluss B7 Allgemeines Taktsignal (66 MHz) für den AGP. Im 1x-Mode werden die Daten auf der ansteigenden CLK-Signalflanke übernommen. Im 2x-Mode findet die Datenübernahme mit dem Signal AD_STB[1:0] statt, und der 4x-Mode benötigt zusätzlich das (invertierte) Signal AD_STB[1:0] (differenzielle Übertragung).
Sandini Bib 828
Kapitel 23
GND (I) Anschlüsse A5, B5, A13, B13, A19, B19, A31, B31, A37, B37, A43, B43, A49, B49, A55, B55, A61, B61 Die Masseleitungen. Zu beachten ist, dass sich – je nach Slot-Typ – noch weitere Leitungen auf GND-Potenzial befinden können, wie es oben im Zusammenhang mit den Keys erläutert worden ist. OVRCNT (O) Anschluss B1 USB-Overcurrent ist ein Meldesignal, das Low wird, wenn mehr als der zulässige Strom vom Monitor über die 5 V-Leitung aufgenommen wird. Der maximale Wert ist nicht vorgeschrieben, und AGP-Karten, die den Monitor nicht speisen, legen dieses Signal über einen Pull-Up-Widerstand an Vddq. PIPE (I) Anschluss A12 Pipelined-Request zur Unterscheidung zwischen einem PCI- und einem AGP-Zyklus. Das Signal wird vom AGP-Master bedient. PME (I/O) Anschluss A48 Power-Management wird nicht direkt vom AGP-Protokoll, sondern nur dann für das AGPDevice verwendet, wenn es (auch) einem PCI-Target entspricht. Bindend ist hierfür das PowerManagement der PCI-Bus-Spezifikation. RBF (I) Anschluss B12 Read-Buffer-Full kennzeichnet, ob der Master für weitere Read-Daten (Low Priority) bereit ist. RBF wird vom AGP-Target bedient. Reserviert Anschlüsse A3, A11, A14, B14, A18, A32, A42, A44, B44, A59, A66, B66 Diese Anschlüsse werden laut der ersten AGP-Spezifikation nicht verwendet. Zu beachten ist aber, dass in Abhängigkeit vom Slot-Typ einige dieser Kontakte u.a. für die komplementären Strobe-Signale zum Einsatz kommen, wie es oben im Zusammenhang mit den Keys erläutert ist. SBA[7:0] (I) Anschlüsse A21, B21, A20, B20, A17, B17, A15, B15 Der SideBand-Address-Port stellt einen separaten Adressen- und Kommandobus vom Target zum Master (Grafik-Chip) dar. Die Verwendung des SBA-Ports ist (zunächst) nicht zwingend vorgeschrieben, und die AGP-Kommandos können alternativ auch über den Datenbus gesendet werden, was dann mit Hilfe der C/BE[3:0]-Signale erfolgt, die in Tabelle 23.4 angegeben sind. C/BE3
C/BE2
C/BE2
C/BE0
AGP-Kommando
0 0 0 0 0
0 0 0 0 1
0 0 1 1 0
0 1 0 1 0
Read (Low Priority) Read (High Priority) Reserviert Reserviert Write (Low Priority)
Tab. 23.4: Die AGP-Kommandos
Sandini Bib Accelerated Graphics Port
829
C/BE3
C/BE2
C/BE2
C/BE0
AGP-Kommando
0 0 0 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 1 1 1 1
0 1 1 0 0 1 1 0 0 1 1
1 0 1 0 1 0 1 0 1 0 1
Write (High Priority) Reserviert Reserviert Long Read (Low Priority) Long Read (High Priority) Flush (Abschluss der High Priority Writes) Reserviert Fence (verhindern von vorgezogenen Reads) Dual Address Cycle (PCI) Reserviert Reserviert
Tab. 23.4: Die AGP-Kommandos (Forts.)
Der Vorteil der Verwendung des SBA-Ports ist der, dass ein AGP-Adapter stets darauf zugreifen kann und zuvor kein Arbitrationsvorgang zu absolvieren ist, wie es bei der Verwendung der C/ BE[3:0]-Signale gemäß PCI stets notwendig ist. Demnach ist der SBA spätestens mit dem 4xMode als Standard anzusehen. Ein SBA-Transfer funktioniert wie eine übliche AD-Datenübertragung. Es sind verschiedene SBA-Kommandotypen mit unterschiedlicher Adressbreite definiert, mit deren Hilfe die AGP-Kommandos (vgl. Tabelle 23.4) dann direkt abgesetzt werden können. SB_STB (I) Anschluss B18 SideBand-Strobe, +-Taktsignal für den SBA-Bus, das vom AGP-Master bedient wird. SB_STB (I) Anschluss A18 SideBand-Strobe, –-Taktsignal für den SBA-Bus (Kommando-Bus). Es wird nur für den 4x-Mode vom AGP-Master bedient. Dieser Kontakt ist beim 3,3 V-Slot nicht belegt und wird mit reserviert bezeichnet. ST[2:0] (O) Anschlüsse B11, A10, B10 Der Status-Bus sendet Informationen vom Arbiter (Chip für die Buszuteilung auf dem Mainboard) zum AGP-Master. Die Signale sind nur dann gültig, wenn GNT (PCI-Signal) aktiv ist. ST2
ST1
ST0
Bedeutung/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
Der angeforderte Low Priority-Read oder Flush wird zum Master zurückgegeben Der angeforderte High Priority-Read wird zum Master zurückgegeben Der Master wird Low Priority-Write-Daten senden Der Master wird High Priority-Write-Daten senden Reserviert Reserviert Reserviert Signalisiert, dass der Master die Berechtigung für eine PCI-Bus-Übertragung mithilfe von PIPE oder FRAME hat
Tab. 23.5: Die AGP-Statusmeldungen
Sandini Bib 830
Kapitel 23
TYPEDET (O) Anschluss A2 Das Signal Type Detect signalisiert, ob das I/O-Interface der AGP-Karte mit 1,5 V oder 3,3 V arbeitet. Der Pegel an den Vddq-Anschlüssen bestimmt die jeweilige Interface-Spannung. Eine AGP-Karte kann entweder 1,5 V oder 3,3 V verwenden, wobei entsprechende Keys in den Slot eingearbeitet sind, damit keine Vertauschungsmöglichkeit gegeben ist. USB+ (I/O) Anschluss B4 Positives Daten-Differenzsignal des Universal Serial Bus, der optional für AGP zur Kommunikation mit dem Monitor implementiert werden kann. USB- (I/O) Anschluss A4 Negatives Daten-Differenzsignal des Universal Serial Bus. Vcc3.3 (I) Anschlüsse A9, B9, A16, B16, A28, B28, A45 Diese Kontakte führen die Versorgungsspannung von 3,3 V. Vddq (I) Anschlüsse A34, B34, A40, B40, A52, B52, A58, B58, A64, B64 Der Pegel an den Vddq-Anschlüssen bestimmt die jeweilige Interface-Spannung, die 3,3 V oder auch 1,5 V – je nach Typ – betragen kann. WBF (I) Anschluss A14 Das Signal Write Buffer Full kennzeichnet, ob der Master für weitere Write-Daten bereit (Fast Write) ist. WBF wird beim 2x- und 4x-Mode und den entsprechenden Slots (1.5 V-, Universal-, nicht aber beim 3,3 V-Slot) verwendet und vom AGP-Target bedient.
23.4 AGP-3.0-Standard Die bisherigen Erläuterungen beziehen sich auf den 1x-, 2x- und 4x-Mode, die (theoretische) maximale Transferraten von 266 MByte/s, 532 MByte/s und 1064 MByte/s ermöglichen. Dies scheint für die immer aufwändigeren Textur- und Polygondaten aktueller Spiele nicht immer auszureichen, so dass Ende des Jahres 2002 die ersten AGP-Grafikkarten mit einem 8x-Mode auf den Markt kamen, der zumindest theoretisch eine Übertragungsrate von 2,1 GByte/s bietet. Im Grunde genommen profitieren allerdings nur diejenigen Applikationen von einem schnelleren AGP-Modus, die laufend große Datenmengen aus dem RAM des PC für den Grafikaufbau benötigen. Inwieweit diese oder jene Applikation (welches Spiel?) tatsächlich darauf angewiesen ist, lässt sich eigentlich nur durch den Test anhand konkreter Beispiele ermitteln, denn es hängt letztlich auch davon ab, wie die Applikation programmiert worden ist und welche Größe der lokale Speicher auf der AGP-Grafikkarte aufweist. Daher kommt es in der Praxis durchaus vor, dass sich durch die Steigerung des AGP-Modes überhaupt keine merkliche Leistungsverbesserung ergibt oder dass eine 2x-Grafikkarte mit relativ großem und schnellem lokalen Speicher einer 4x-Grafikkarte überlegen ist, die demgegenüber einen kleineren und vielleicht auch langsameren lokalen Speicher besitzt.
Sandini Bib Accelerated Graphics Port
831
Wie dem auch sei, 8x-AGP-Grafikkarten scheinen jedoch die 4x-Modelle abzulösen, wie es bei den vorherigen Versionen (1x, 2x) ebenfalls passiert ist, so dass man auch über die 8x-Technik informiert sein sollte, die laut Intel allerdings die letzte (parallele) AGP-Version sein soll, denn in Zukunft soll hierfür PCI-Express (vgl. Kapitel 22.12.2) zum Einsatz kommen. Der 8x-Mode ist im AGP-Standard 3.0 (siehe auch Tabelle 23.1) definiert, der wiederum einige signaltechnische Veränderungen gegenüber dem Vorgänger AGP 2.0 mit den bereits bekannten Modi 2x und 4x zur Folge hat. Der AGP-Takt beträgt aber weiterhin 66 MHz, und es gibt 1,5 Vsowie Universal-Slots, die von außen prinzipiell keinerlei Veränderungen gegenüber den älteren AGP-Slots erkennen lassen. Die Keys sorgen auch hier, wie bei der vorherigen 1,5 V-Slot-Version, für den Einsatz der passenden Karten, die nicht zwangsläufig den 8x-Mode unterstützen müssen, sondern auch vom 4x-Typ sein können. Karten mit 1x- und 2x-Modus können allerdings nicht in Slots laut AGP-Standard 3.0 verwendet werden, da die I/O-Interface-Spannung von 3,3 V nicht mehr zur Verfügung steht. Der I/O-Level beträgt für AGP 3.0 nur noch 0,8 V, was jedoch kein Problem sein soll, da auch weiterhin der 1,5 V-Level unterstützt wird. Das Mainboard muss hierfür aber einen Universal-Slot (ohne Keys) laut AGP 3.0 bieten, sodass das Timing und die Signale zwischen AGP 2.0- und AGP 3.0-konformer Betriebsart entsprechend umgeschaltet werden können. Bei den Erläuterungen zu den AGP-Standards unterscheide ich im Übrigen nur zwischen AGP 3.0 und AGP 2.0, der den ersten Standard AGP 1.0 gewissermaßen – und damit vereinfacht gesehen – beinhaltet. Aus den Erfahrungen mit den unterschiedlichen AGP-Versionen in der Vergangenheit ist zu hoffen, dass sowohl die Grafikkarten- als auch die Mainboard-Hersteller die AGP-Vorschriften konsequent beherzigen, denn es ist keine Seltenheit, dass die Keys nicht laut Standard ausgeführt werden oder dass ein Universal-Slot mit der einen oder anderen Karte nicht funktionieren will, was schlimmstenfalls sogar zum »Abrauchen« einer Grafikkarte oder der Mainboard-Elektronik führen kann. In der Praxis stellen sich immer wieder diejenigen Modi als problematisch dar, die in einem älteren Standard als maximale Betriebsart und im folgenden Standard (vgl. Tabelle 23.1) ebenfalls definiert sind; also der 2x-Modus (AGP 1.0 und AGP 2.0) und der 4x-Modus (AGP 2.0 und AGP 3.0). In beiden Fällen ist die betreffende Betriebsart prinzipiell mit zwei unterschiedlichen I/OSpannungen (I/O-Level) und nicht nur mit zwei unterschiedlichen Versorgungsspannungen möglich, und hier lauert die eigentliche Falle, in die schon viele Hersteller getappt sind. Die Keys mögen vielleicht korrekt ausgeführt sein, allerdings schaltet die Interface-Spannung (I/O-Level) nicht um bzw. ist fest auf einen Wert gelegt, was zu den häufigsten Fehlern im Zusammenhang mit dem AGP zu rechnen ist, die der Anwender meist nicht beheben kann. Als Ausnahme kann vielleicht noch ein BIOS-Update weiterhelfen, solange der Fehler nicht in der Elektronik selbst, sondern nur in den BIOS-Routinen begründet liegt. Die signaltechnischen Veränderungen mit AGP 3.0 stellen sich als die bisher drastischsten dar, die bisher beim AGP stattgefunden haben. Zunächst werden eine ganze Reihe von Signalen gegenüber AGP 2.0 invertiert. Als Grund wird dafür angeführt, dass bei einem Low-Signal, das bisher als active State angesehen wurde, nunmehr kein Strom fließen soll, d.h., Low (0 V) bedeutet ab jetzt inaktiv und High (0,8 V) eben aktiv. Diese Maßnahme soll letztendlich zu einem niedrigeren Stromverbrauch führen. Tabelle 23.6 zeigt die im Standard 3.0 geänderten Anschlüsse mit den jeweiligen Signalen.
Sandini Bib 832
Kapitel 23
AGP 2.0
AGP 3.0
Pins
AD_STB[1:0] AD_STB[1:0] C/BE[3:0] PIPE Reserviert DEVSEL FRAME Reserviert GNT IRDY Reserviert PERR RBF REQ SB_STB SB_STB SBA[7:0] SERR STOP TRDY WBF
AD_STBF[1:0] AD_STBS[1:0] C/BE[3:0] DBI_HI DBI_LO DEVSEL FRAME GC_DET GNT IRDY MB_DET PERR RBF REQ ST_STBF ST_STBS SBA[7:0] SERR STOP TRDY WBF
B32, B59 A32, A59 A33, B39, B51, A57 A12 B14 B46 A41 A3 A8 B41 A11 B48 B12 B8 B18 A18 A21, B21, A20, B20, A17, B17, A15, B15 B50 A47 A46 A14
Tab. 23.6: Signalunterschiede zwischen AGP 2.0 und AGP 3.0
Außer den Signal-Invertierungen und -umbenennungen, die Tabelle 23.6 zu entnehmen sind, gibt es vier neue Signale, die – bis auf eine Ausnahme – auf zuvor mit reserviert ausgewiesenen Kontakten zu finden sind. Diese Ausnahme ist das Signal DBI_HI am Pin A12, wo bei AGP 2.0 das PIPE-Signal lokalisiert ist. Eine Unterscheidung zwischen einem PCI- und AGP-Zyklus ist bei AGP 3.0 nicht mehr mit Hilfe von PIPE notwendig, so dass dieses Signal nicht mehr benötigt wird und durch DBI_HI ersetzt werden kann. Die Unterscheidung zwischen diesen beiden Zyklen (PCI, AGP) findet nunmehr allein über das Signal FRAME statt. Aus Kompatibilitätsgründen zum 4x-Modus funktioniert das PIPE-Signal aber weiterhin und wird mit DBI_HI im Multiplex übertragen. DBI steht für Dynamic Bus Inversion und beschreibt die Funktion für die Invertierung des Adress/Daten-Bus (AD-Signale), damit eine korrekte Signalinterpretation sowohl für den 4x- als auch den neuen (invertierten) 8x-Modus bei AGP 3.0 stattfinden kann. Mit DBI_LO=0 wird keine Invertierung auf AD[15:00] und mit DBI_HI=0 keine Invertierung auf AD[31:16] signalisiert. Bei DBI-High-Pegeln sind die AD-Signale hingegen als invertiert zu interpretieren. Die beiden weiteren neuen Signale sind für die Detektierung von AGP 3.0-Einheiten vorgesehen. GC_DET (Graphics Detect) wird von einer AGP 3.0-Grafikkarte auf Low gezogen, während es bei einem AGP 2.0-Typ auf High-Potenzial bleibt. Was die Mainboard-Elektronik mit dieser Information allerdings anfängt, ist nicht im Standard definiert, und es ist zu hoffen, dass die Hersteller tatsächlich diesen Anschluss zur Identifizierung des Kartentyps verwenden. Entsprechendes gilt für das Signal MB_DET, das vom Mainboard auf Low gezogen wird, um seine AGP 3.0Funktionalität an die AGP 3.0-Grafikkarte zu signalisieren. Der wesentliche Punkt des 8x-Modes besteht darin, dass gegenüber dem 4x-Mode die doppelte Anzahl an AD-Transfers innerhalb einer Taktperiode absolviert wird, was somit zu einem Transfer von 32 Bytes (8 DWORDs) pro Taktzyklus führt. Dies wird durch eine Takterhöhung der bei-
Sandini Bib Accelerated Graphics Port
833
den Strobe-Signale ermöglicht. Die Daten werden jeweils auf einer ansteigenden Flanke der beiden (neuen) Strobe-Signale (AD_STBS, AD_STBF) übernommen, wie es in Abbildung 23.4 gezeigt ist. Der AGP-Takt (CLK = 66 MHz) ist aber weiterhin die Referenz für alle PCI-Bus-basierten Signale wie GNT, TRDY und IRDY und damit für die Steuerung des Datenzugriffs relevant.
Abb. 23.4: Datentransfer im 8x-Mode
Mit dem AGP 3.0-Standard hat man einige AGP-Kommandos und -Statusmeldungen umfunktioniert bzw. gestrichen. In den Tabellen 23.3 und 23.4 finden Sie die Kommandos und Meldungen, wie sie für AGP 2.0-Einheiten gültig sind, und die Tabellen 23.7 und 23.8 zeigen die für AGP 3.0 zutreffenden. Es fällt auf, dass es nur noch vier Kommandos gibt: Read, Write, Flush und Fence. Diese Kommandos stellen übliche asynchron ausgeführte Befehle dar. Mit AGP 3.0 steht jedoch im 8x-Mode zusätzlich ein Isochronous-Mode zur Verfügung, der den Übertragungen eine garantierte Bandbreite und Latenzzeit einräumt, wie es auch bei Firewire und dem USB der Fall ist, was insbesondere für Video-Streams von Bedeutung ist. Der Isochronous-Mode ist im Standard (bisher) jedoch nur als Option ausgewiesen, d.h., falls die Hersteller ihn nicht implementieren, sind die für den Isochronous-Mode vorgesehenen Befehle als reserviert anzusehen und haben keine Bedeutung. C/BE3
C/BE2
C/BE2
C/BE0
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
Tab. 23.7: Die AGP-Kommandos bei AGP 3.0
AGP-Kommando Read Reserviert Reserviert Reserviert oder Isochronous Read Write Reserviert Reserviert oder Isochronous Read Unfenced Reserviert oder Isochronous Write Fenced Reserviert Reserviert Flush Reserviert Fence Reserviert Reserviert oder Isochronous Align Reserviert
Sandini Bib 834
Kapitel 23
Entsprechendes gilt für die Verwendung der Status-Codes, die in Tabelle 23.8 angegeben sind, und neben den beiden Isochronous-Codes wird noch explizit ein Kalibrationszyklus (Calibration Cycle, siehe Abbildung 23.7) ausgewiesen, der für die Einstellung der I/O-Buffer verwendet werden kann. ST2
ST1
ST0
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
Bedeutung/Funktion Read Reserviert Write Reserviert oder Isochronous Memory Read Reserviert oder Isochronous Memory Write Reserviert Calibration Cycle Signalisiert, dass der Master die Berechtigung für eine PCI-Bus-Übertragung mithilfe von FRAME hat
Tab. 23.8: Die AGP-Statusmeldungen bei AGP 3.0
23.5 Register Vom Betriebssystem her wird der AGP erst ab Windows 98 unterstützt, während es bei Windows 95 eine AGP-Unterstützung ab der Version OSR 2.1 gibt, die sich in der Praxis jedoch als recht fehlerträchtig erwiesen hat. Damit Windows 95 (OSR 2.1, Version 950B mit Service Pack 2.1) mit dem AGP arbeiten kann, muss die USB-Unterstützung (USBSUPP.EXE) installiert werden, auch wenn man gar keine USB-Geräte verwenden will, denn bei der USB-Installation wird ein neuer Speichermanager (VMM32.VXD) installiert, der auch für den AGP notwendig ist. Des Weiteren sind der GART-Treiber (Graphics Address Remapping Table), der üblicherweise zur AGP-Karte mitgeliefert wird, und mindestens DirectX Version 6 sowie der eigentliche Grafikkartentreiber zu installieren. GART stellt eine Remapping-Tabelle im System-RAM für den Zugriff auf den AGP-Aperture-Bereich dar. Jede AGP-Aperture-Seite verfügt über einen Eintrag im GART. Windows NT 4.0 kann weder mit dem AGP noch mit dem USB umgehen und ist technologisch gesehen von Windows 2000 bzw. Windows XP abgelöst worden, die selbstverständlich die entsprechende Unterstützung für AGP und USB mitbringen. AGP-Devices verhalten sich (zunächst) wie PCI-Devices, d.h., sie unterstützen den üblichen Konfigurationsraum (Configuration-Space), wie es im PCI-Kapitel erläutert ist. Die AGP-Register einer Grafikkarte werden im Configuration-Space mit Hilfe der Capabilities List (Capabilities ID = 02h) selektiert. AGP-Grafikkarten firmieren unter dem PCI Class Code 3 (Klassencode Display Controllers) und werden über die Vendor- und Device-IDs im Konfigurationsraum identifiziert. Die wichtigsten AGP-Register sind Major and Minor Revision (Capability Pointer), das AGP-Statusregister (Capability Pointer + 04h) und das AGP-Befehlsregister (Capability Pointer + 08h), die jeweils 4 Bytes umfassen. Je nach AGP-Device kann es noch eine ganze Reihe weiterer optionaler AGP-Register geben, auf die ich jedoch nicht eingehen möchte, da diese eben recht unterschiedlich, weil geräteabhängig, sind. Unter den optionalen AGP-Registern firmieren allerdings auch diejenigen für die AGP-Aperture (Aperture Size, GART), die im AGP-Target lokalisiert sind.
Sandini Bib Accelerated Graphics Port
835
Abb. 23.5: Selektierung der AGP-Register
Die Bits im Register Major and Minor Revision sind lediglich lesbar und enthalten Informationen über die Version (Revision) der AGP-Implementierung. Die reservierten Bits liefern beim Lesen stets Null. 24 23
31
reserviert
20 19
Major
8
16 15
Minor
Next Pointer
7
0
Capability ID
Capability ID: 00000010 = AGP-Master, xxxxxxxx = AGP-Target Next Pointer: Pointer für den folgenden Eintrag in der Capability-List. 0= letzter Eintrag Minor: Nummer der AGP-Revision Major: Nummer der AGP-Revision Major Minor Register-Set 2h x AGP 2.0-Register-Support >=3h 0h–4h AGP 3.0-Target-Register-Support >=3h 5h–9h AGP 3.0-Erweiterungsregister-Support >=3h Ah–Fh Reserviert reserviert: nicht verwendet, stets 0 Abb. 23.6: Major-and-Minor-Register
Sandini Bib 836
Kapitel 23
7
6
rsv.
10 9 8
Cycle
5
4
3 2 Mode
13 12
ARQSZ
4G
16 15
reserviert
FW
24 23
NORQ
SBA
31
GART
Die Bits im Statusregister sind nur lesbar und gelten für AGP-Master und Target, sofern nichts anderes bei der Registerbelegung angegeben ist. Die Bits im Befehlsregister sind sowohl beschreibbar als auch lesbar, allerdings ist hier genauer zu beachten, ob das Target oder aber der Master hierzu berechtigt ist, wie es Abbildung 23.8 zu entnehmen ist. Nach einem Reset enthalten die Bits im Befehlsregister in der Regel allesamt Nullen. 0
Rate
Rate:
Data Rate Support AGPSTAT[3:0] Modus 0xxx reserviert (AGP 2.0, 0=1x, 1=2x, 2=4x) 1001 4x (AGP 3.0) 1010 8x (AGP 3.0) 1011 4x und 8x (AGP 3.0)
Mode:
1= AGP 3.0,
FW:
1= Fast Mode wird unterstützt
4G:
1= Unterstützung von Adressen größer als 4 GByte
GART:
0= Übersetzung der Host-Zugriffe mithilfe der GART (nur Target) 1= kein Host-Zugriff über Aperture (nur Target)
0= AGP 2.0,
reserviert bei AGP 2.0
Reserviert, rsv.: nicht verwendet, stets 0 SBA:
1= Side Band Addressing Support (AGP 3.0) 0= reserviert (AGP 2.0)
Cycle: Periode für die Kalibrierung der I/O-Buffer Cycle Periode 000 4 ms 001 16 ms 010 64 ms 011 256 ms 100-110 reserviert 111 keine Kalibrierung notwendig ARQSZ: Asynchronous Request Size (nur Target) Größenangabe in Bytes–4 NORQ:
Number of Requests (nur Target), Anzahl der möglichen Kommandos 0= ein Eintrag, 0xFF= 256 Einträge
Abb. 23.7: AGP-Statusregister
Der SideBand-Address-Port, der einen separaten Adressen- und Kommandobus vom Target zum Master darstellt, ist zwar bereits in den älteren AGP-Spezifikationen definiert worden, er wird aber erst mit der AGP-3.0-Spezifikation zur Pflicht erhoben. Das SBAE-Bit im Befehlsregister erlaubt die Einschaltung des SBA-Ports, womit volle AGP-3.0-Funktionalität gegeben ist. Bei einem AGP-2.0-Target ist dieses Bit auf Low, was auch dem Zustand nach einem Reset entspricht, d.h., das Target wird dann alle möglicherweise eingehenden AGP-3.0-Operationen ignorieren. Demnach ist es wichtig, hier für Master und Target den passenden Mode zu aktivieren, um den 8x-Mode überhaupt nutzen zu können. Das Rate- (Status) bzw. das DRate-Register (Command) erlaubt dann die Detektierung sowie die Umschaltung zwischen der 4x- und der 8xBetriebsart.
Sandini Bib
7
6
rsv.
5
4
3 2 rsv.
10 9 8
4GE
13 12
PARQSZ PCycle
SBAE
17 16 15
reserviert
AGPE
24 23
PNORQ
rsv.
31
837
FWE
Accelerated Graphics Port
0
DRate
DRate:
Data Rate Enable (vgl. Rate-Bits im Statusregister) AGPSTAT Modus 001 4x 010 8x 100 reserviert (AGP 2.0)
Rsv.,
reserviert: nicht verwendet, stets 0
FWE:
1= Fast Mode Enable
4GE:
4 Gigabyte Enable 0= keine Unterstützung von Adressen größer als 4 GByte 1= Unterstützung von Adressen größer als 4 GByte
AGPE:
AGP Enable 0= keine AGP 3.0-Funktionalität 1= AGP 3.0-kompatibel
SBAE:
Side Band Addressing Enable 0= AGP 2.0-kompatibel 1= Aktiviert für AGP 3.0
PCycle: Programmed Cycle(nur Target): Periode für die Kalibrierung der I/O-Buffer, siehe CYCLE im AGP-Statusregister PARQSZ: Programmed Asynchronous Request Size (nur Master) Größenangabe in Bytes–4 PNORQ:
Programmed Number of Requests (nur Master) Anzahl der möglichen Kommandos 0= ein Eintrag, 0xFF= 256 Einträge
Abb. 23.8: AGP-Befehlsregister
Auf der anderen Seite sind die speziellen AGP-Register in der Northbridge des AGP-Chipsets implementiert. Demnach unterscheiden sich die Adressen und die Register hier voneinander, weil die Chipsets eben unterschiedlich aufgebaut sind. Beim Intel 440BX-Chipset und folgenden Typen wird der AGP beispielsweise mit Hilfe des Power Management Control Registers (PMCR) detektiert. Falls das Bit 1 = 0 ist (AGP Disable), unterstützt der Chipset den AGP, bei einer 1 hingegen nicht.
Abb. 23.9: Das Power Management Control Register beim 440BX-Chipset von Intel für den AGP-Zugriff
Sandini Bib
Sandini Bib
24
Riser-Slots
Die ISA-Steckplätze sind auf Mainboards immer seltener zu finden. Stattdessen gibt es einen anderen Slot, der prinzipiell einer der folgenden Implementierungen entsprechen kann:
: : : :
Audio Modem Riser (AMR) Communication Network Riser (CNR) Advanced Communication Riser (ACR) Herstellerspezifische Ausführung
Die Gemeinsamkeiten dieser unterschiedlichen Mainboard-Steckplätze bestehen darin, dass es sich dabei nicht um Anschlüsse eines Bussystems handelt, sondern in der Regel jeweils um einen einzigen Steckplatz, der aus einer Punkt-zu-Punkt-Verbindung zum Chipset besteht. Der jeweilige Chipset eines Mainboards ist explizit für den entsprechenden Steckplatz vorgesehen. Das heißt, Signale von bestimmten Einheiten, die im Chipset selbst integriert sind, wie etwa der USB oder ein AC97-Interface, können auf diesen Steckplatz geführt werden, was ein relativ einfaches serielles Interface für die Aufnahme verschiedener Einheiten bietet. Es mag in der Natur der Sache liegen – da eben unterschiedliche Chipsets von verschiedenen Herstellern existieren –, dass die genannten Realisierungen nicht miteinander kompatibel sind. Bisher hat sich auch noch kein allgemeiner Standard hierfür gebildet. Wie die Bezeichnung Audio Modem Riser impliziert, soll hiermit eine Audio und/oder Modem-Einheit implementiert werden. Der Kernpunkt ist dabei, wie es auch bei den anderen Riser-Varianten (CNR, ACR) der Fall ist, dass nur eine Minimalelektronik notwendig ist und die CPU neben ihren eigentlichen Aufgaben zusätzlich noch die Funktion einer Soundkarte und eines Modems übernimmt, was die hierfür benötigte Hardware und deren Integration im PC preiswerter machen soll. Für den Sound wird nur noch ein Umsetzerbaustein (CODEC, A/D und D/A), für ein Modem ein Line-Interface benötigt, und die Klangerzeugung und Berechnung der Modemfunktion wird per Software ausgeführt, was dann auch unter Softaudio bzw. Softmodem firmiert. Der Vorteil dieser Lösungen soll nun darin bestehen, dass demgegenüber aufwändigere und damit auch teurere Interfaces, wie beispielsweise für PCI, nicht benötigt werden. Stattdessen werden immer mehr Einheiten direkt im Chipset untergebracht, wie es über die Jahre ein ganz allgemeiner Trend ist, und dennoch soll durch Riser-Steckplätze eine gewisse Flexibilität bei der individuellen Ausstattung eines PC ermöglicht werden. Als Nachteil kann hingegen gewertet werden, dass die PC- bzw. Mainboard-Hersteller für die korrekte Integration und Funktion der Riser-Einheiten zuständig sind, die laut Vorgabe der Hersteller wie Intel oder VIA, die sich diese Riser-Lösungen ausgedacht haben, eigentlich nicht einzeln im Handel und somit auch nicht für den Einbau durch den Anwender verfügbar sein sollen. Gleichwohl gibt es diese Einheiten auch einzeln, was natürlich eine Reihe an Konfigurationsproblemen aufwirft. Das BIOS muss explizit auf den jeweiligen Riser-Standard und die zu verwendenden Karten zugeschnitten sein, Gerätetreiber gibt es in der Regel nur für aktuelle Windows-Betriebssysteme, und von einem herstellerübergreifenden Standard scheint man auch noch weit entfernt zu sein, was sich in der Praxis insgesamt als recht fehlerträchtig und unflexibel erweist.
Sandini Bib 840
Kapitel 24
24.1 Audio Modem Riser Im Jahre 1998 wurde erstmals ein von der Firma Intel definierter Riser-Steckplatz auf Mainboards verwendet, der als Audio Modem Riser (AMR) bezeichnet wird. Es handelt sich dabei um einen einzigen Steckplatz, der aus einer Punkt-zu-Punkt-Verbindung zum Chipset besteht. Bei Mainboards mit mehr als einem derartigen Connector verfügt der Chipset dementsprechend über mehrere Links, wobei pro Link maximal vier Einheiten verwendet werden können. Der I/O Controller-Hub eines Intel-Chipsets (ab i810, Whitney) bietet ein Interface laut der Audio Codec 97-Spezifikation (AC97), das für die Kommunikation mit einer AMR-Einheit verwendet werden kann. Diese muss nicht zwangsläufig über eine Einsteckkarte im System integriert werden, sondern kann auch gleich auf dem Mainboard lokalisiert sein. Während die meisten AMR-tauglichen Mainboards bereits über den notwendigen Audio-CODEC verfügen, ist für die Modem-Minimal-Elektronik, die im Grunde genommen nur aus dem LineInterface zum Telefonnetz besteht, ein spezieller, kleiner Slot (AMR) vorgesehen, der eine hierfür passende Karte aufnehmen kann. AMR-Einheiten setzen ein hierfür angepasstes BIOS voraus und werden nach der PCI-Plug&Play-Methode unter Windows konfiguriert. Demnach sind auch hier Vendor- und Device-IDs notwendig, die in einem EEPROM geführt werden können. Falls keines zum Einsatz kommt, sind die IDs entweder im Chip selbst abgelegt, oder die AMR-Einheiten werden während der PC-Herstellung allein mit Hilfe des BIOS im System integriert.
Abb. 24.1: Interface zu einem AMR-Device auf dem Mainboard
Maximal sind ein primärer (Down CODEC) und bis zu drei sekundäre CODECs (Up CODEC) möglich, und der AMR-Connector führt alle Signale zwischen dem Mainboard und dem AMRDevice, wenn es sich nicht gleich direkt auf dem Board befindet. PC-Rückseite Pin Nr.
Signal
Pin Nr.
Signal
B1 B2 B3 B4
Audio_Mute Masse (für Analog-Teil) Mono_Out, PC_Beep Reserviert
A1 A2 A3 A4
Audio_Power_Down Mono_Phone Reserviert Reserviert
Tab. 24.1: Signale des AMR-Connectors
Sandini Bib Riser-Slots
841
Pin Nr.
Signal
Pin Nr.
Signal
B5 B6 B7 B8 B9 B10 B11
Reserviert Primary_DN -12 V Masse (für -12 V) +12 V Masse ( für +12 V) +5 VD Key Key Masse (für +5 VD) Reserviert Reserviert +3,3 VD Masse (für +3,3 VD) AC97_SDATA_OUT AC97_RESET AC97_SDATA_IN3 Masse (für AC97-Interface) AC97_SDATA_IN2 Masse (für AC97-Interface) AC97_MSTRCLK
A5 A6 A7 A8 A9 A10 A11
Reserviert Masse (für +5 VSB) +5 V, +5 VSB USB_OC Masse (für USB+) USB+ USBKey Key Masse (für USB-) S/P-DIF-In Masse (für S/P-DIF) +3,3 V, +3,3 VSB Masse (für 3,3 VSB) AC97_SYNC Masse (für AC97-Interface) AC97_SDATA_IN1 Masse (für AC97-Interface) AC97_SDATA_IN0 Masse (für AC97-Interface) AC97_BITCLK
B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23
A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23
Tab. 24.1: Signale des AMR-Connectors (Forts.)
Die Signale des Audio-Modem-Riser lassen sich vier Gruppen zuordnen:
: : : :
AC97-Interface Audio-Signale USB-Signale Spannungsversorgung
Die Signale des AC97-Interfaces befinden sich im unteren Teil des Connectors und haben die im Folgenden angegebenen Bedeutungen und Funktionen, wobei mit Eingang bzw. Ausgang die Richtung der Datentransfers aus der Sicht des AC97-Controllers, der sich im IOCH (IO Controller Hub) auf dem Mainboard befindet, angegeben wird. AC97_SDATA_OUT, Pin Nr.: B17, Ausgang Das serielle Datenausgangssignal vom AC97-Controller zu den einzelnen CODECs. AC97_SYNC, Pin Nr.: A17, Ausgang Das Synchronisationssignal vom AC97-Controller mit einer Pulsbreite von 1,3 µs, das für die Synchronisierung aller am AC97-Link angeschlossenen Einheiten verwendet wird. AC97_RESET, Pin Nr.: B18, Ausgang Das Reset-Signal (Low-Aktiv) vom AC97-Controller zu den einzelnen CODECs. AC97_SDATA_IN0 bis AC97_SDATA_IN3, Pin Nr.: A21, A19, B21, B19, Eingänge Die vier Datensignale von den einzelnen CODECs zum AC97-Controller. Das Signal AC97_SDATA_IN0 ist dasjenige des primären CODECs, und die drei weiteren Signale sind die Signale der sekundären CODECs.
Sandini Bib 842
Kapitel 24
AC97_BITCLK, Pin Nr.: A23, Eingang/Ausgang Dieser Pin führt das serielle Taktsignal (Bit Clock) von 12,288 MHz zwischen den CODECs und dem AC97-Controller auf dem Mainboard. AC97_MSTRCLK, Pin Nr.: B23, Ausgang Der Master-Clock ist ein optionales Signal mit einer Frequenz von 24,576 MHz. Es wird vom Mainboard zum Riser geführt und ist laut Spezifikation nur für Devices notwendig, die diesen Takt benötigen, andernfalls ist es auf dem Mainboard auf Masse-Potenzial gelegt. Primary_DN, Pin Nr.: B6, Ausgang Mit Hilfe dieses Signals wird einem AMR-Modul das Vorhandensein eines primären CODECs (z.B. Soundchip) auf dem Mainboard signalisiert. Es wird üblicherweise beim Mainboard-Design auf Masse-Potenzial gelegt, was somit einem Low-Pegel entspricht. Für Audio-Funktionen sind fünf Signalleitungen am Riser-Anschluss vorhanden, die nur dann verwendet werden, wenn der Mainboard-Hersteller keinen Audio-CODEC direkt auf dem Mainboard vorgesehen hat. Audio_Mute, Pin Nr.: B1, Ausgang Bei einem Low-Pegel dieses Signals wird der Audioverstärker auf der Riser-Card stummgeschaltet. Audio_Power_Down, Pin Nr.: A1, Ausgang Bei einem High-Pegel dieses Signals wird das Audiosystem in den Stromsparmodus (Power Down) geschaltet. Mono_Phone, Pin Nr.: A2, Eingang Das Audiosignal in Mono von der Modem- zur Audioeinheit auf dem Mainboard. Das Audiosignal wird meist zur Ausgabe von Tönen beim Modembetrieb (Wählton etc.) verwendet. Mono_Out/PC_Beep, Pin Nr.: B3, Ausgang Wenn sich der Audiochip auf dem Mainboard befindet, dient dieses Signal als Ausgabesignal (Mono_Out). Falls sich der Audiochip auf der Riser-Card befindet, fungiert es hingegen als Beep-Signal, also zur Signalausgabe während der Power On Self Tests (POST). S/P-DIF-In, Pin Nr.: A13, Ausgang Der Eingang für ein digitales Audiosignal (PCM, AC3) vom Mainboard zur Riser-Card laut dem S/P-DIF-Standard (Sony/Philips Digital InterFace). Falls das Signal nicht verwendet wird, ist es auf dem Mainboard auf Masse-Potenzial gelegt. Als Spannungen stehen +/-12 V, 5 V und 3,3 V am Riser-Slot zur Verfügung, wobei eine Unterteilung in Versorgungen für die digitalen und die analogen Bauelemente vorgenommen wird. Außerdem ist eine optionale Standby-Versorgung (VSB, Pins A7, A15) möglich. Die Anschlüsse +5 VD (Pin B11) und +3,3 VD (Pin B15) stellen die Spannungsversorgung für den digitalen Teil dar. Die Masseleitungen korrespondieren mit den verschiedenen Spannungs- und Signalleitungen, wie es auch in der Tabelle 24.1 angegeben ist. Des Weiteren befinden sich am Riser-Connector drei USB-Signale: das differenzielle Datensignal (USB+, USB, Pins A10 und A11) und das Meldesignal für einen aufgetretenen Überstrom (USB_OC, Pin A8). Falls die Belastung des USB größer ist als 500 mA, wird dies durch einen Low-Pegel an USB_OC an den USB-Controller signalisiert.
Sandini Bib Riser-Slots
843
Die AMR-Lösung hat sich bisher als recht problematisch bei der Konfiguration erwiesen, und je nach PC-Aktivität kann der Modem- und insbesondere der Audio-Betrieb – man denke an »leistungshungrige« Spiele – ins Stocken geraten.
24.2 Communication and Networking Riser Seit Mitte des Jahres 2000 wird auf Mainboards (ab i815, Solano), die einen IOCH2 vom Typ 82801BA verwenden, ein weiterer Riser-Standard der Firma Intel verwirklicht, und einige Hersteller bieten hierfür auch entsprechende Karten an. Communication and Networking Riser (CNR) lautet die Bezeichnung für den AMR-Nachfolger (siehe vorheriges Unterkapitel). Neben Audiound Modem-Funktionen laut AC97 kann zusätzlich noch ein Netzwerk-Interface (LAN) auf zwei verschiedene Arten realisiert werden, wofür auch gleich zwei unterschiedliche Connectoren (A-CNR, B-CNR) definiert werden.
Abb. 24.2: Im I/O-Controller-Hub 82801BA ist ein LAN-Interface integriert, das auf zwei verschiedene Methoden als CNR realisiert werden kann.
CNR ist nicht kompatibel zum AMR-Standard, obwohl die Audio- und Modem-Funktion prinzipiell die gleiche ist. Es wird ein anderer Slot verwendet, und die Initialisierung (per BIOS) erfolgt ebenfalls unterschiedlich. Neben dem primären AC97-CODEC ist nunmehr nur noch ein sekundärer (statt derer drei bei AMR) erlaubt. Die SDATA_IN-Signale sind entsprechend in der Anzahl reduziert, wie es auch in Tabelle 24.2 angegeben ist. Insgesamt verfügt der CNR über die folgenden Signalgruppen:
: : : : :
AC97-Interface USB-Signale System Management Bus (SMB) EEPROM-Interface für die LAN-Funktion 8-Bit-LAN-Interface für den A-CNR-Connector
Sandini Bib 844
: :
Kapitel 24
17-Pin-LAN-Interface für den B-CNR-Connector Spannungsversorgung
PC-Rückseite Pin Nr.
Signal
Pin Nr.
Signal
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
Reserviert Reserviert Reserviert Masse Reserviert Reserviert Masse LAN_TXD1 LAN_RSTSYNC Masse LAN_RXD2 LAN_RXD0 Masse Reserviert +5 V USB_OC Masse -12 V +3,3 VD Key Key Masse EE_DOUT EE_SHCLK Masse SMB_A0 SMB_SCL CDC_DN_ENAB Masse AC97_SYNC AC97_SDATA_OUT AC97_BITCLK
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19
Reserviert Reserviert Masse Reserviert Reserviert Masse LAN_TXD2 LAN_TXD0 Masse LAN_CLK LAN_RXD1 Reserviert USB+ Masse USB+12 V Masse 3,3 V +5 VD Key Key Masse EE_DIN EE_CS SMB_A1 SMB_A2 SMB_SDA AC97_RESET Reserviert AC97_SDATA_IN1 AC97_SDATA_IN0 Masse
B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30
A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30
Tab. 24.2: Signale des CNR-A-Connectors
Wie oben erwähnt, besteht die wesentliche Änderung gegenüber dem Audio Modem Riser darin, dass zwei unterschiedliche LAN-Interfaces (Local Area Network) möglich sind. Die Belegung des Typ A-CNR-Connectors ist in Tabelle 24.2 angegeben. Das hier vorhandene achtpolige LANInterface, das aus einem Taktsignal (LAN_CLK, Pin A10), einem Synchronisierungssignal (LAN_RSTSYNC, B9) und jeweils drei Sende- (LAN_TXD 2:0) und Empfangssignalen (LAN_RXD 2:0) besteht, ist für den Anschluss an einen so genannten PLC (Platform LAN Connect) vom Typ 82562ET/EM der Firma Intel optimiert, der sich auf der Riser-Card oder auch auf dem Mainboard selbst befinden kann. Dieser Chip (48 Pin SSOP), dem nur noch ein Übertrager nachzuschalten ist, realisiert mit Hilfe des IOCH einen kombinierten 10Base-T/100Base-TX(Ethernet-, Fast Ethernet-)Netzwerkadapter nach dem IEEE 802.3-Standard.
Sandini Bib Riser-Slots
845
Der B-CNR-Connector entspricht bis auf die LAN-Signale in seiner Belegung der Belegung des A-Typs. Das LAN-Interface besteht hier allerdings aus 17 Signalen und ist für ein Netzwerksystem gedacht, das die Bezeichnung HomePNA trägt. Die Phone Networking Alliance, die sich aus verschiedenen Firmen wie auch aus Intel und AMD rekrutiert, möchte hiermit dem vernetzen Haushalt näher kommen und Geräte aus Büro, Küche und Kinderzimmer über 1-MBit/sModem-Verbindungen miteinander vernetzen und dabei auch einen Shared Internet Access zur Verfügung stellen. Es handelt sich dabei im Prinzip um eine Modemverbindung von Teilnehmer zu Teilnehmer in Verbindung mit dem vom Ethernet her bekannten Kollisionsprotokoll. Für ein Interface laut HomePNA ist beispielsweise der Intel-Chip 82562EH (HomePNA Physical Layer Interface) zuständig, der direkt mit den Signalen am B-CNR-Connector korrespondiert. Wie bei fast allen neuen Intel-Chips ist das Zeichenkürzel am Ende der Chipbezeichnung wichtig, denn der 82562ET/EM unterscheidet sich vom HomePNA-Chip 82562EH maßgeblich. Neben jeweils vier Sende- (MII_TXD 0:3) und Empfangsleitungen (MII_RXD 0:3) bietet der Interface-Chip für HomePNA die folgenden Signale:
: : : : : : : : :
Taktsignal für die Senderichtung: MII_TXC, Pin B3 Taktsignal für die Empfangsrichtung: MII_RCX, Pin A5 Handshake-Signal für Datenempfang: MII_RXDV, Pin A4 Error-Signal bei Datenempfang: MII_RXERR, Pin B5 Gültigkeitssignal für Sendedaten: MII_TXEN, Pin B9 Datenerkennungssignal (Carrier Sense): MII_CRS, Pin A2 Signal für die Kollisionserkennung: MII_COL, Pin B2 Managementdaten: MII_MDIO, Pin B1 Taktsignal für Managementdaten: MII_MDC, Pin A1
PC-Rückseite Pin Nr.
Signal
Pin Nr.
Signal
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
MII_MDIO MII_COL MII_TXC Masse MII_RXERR MII_TX3 Masse MII_TXD1 MII_TXEN Masse MII_RXD2 MII_RXD0 Masse Reserviert +5 V USB_OC Masse -12 V +3,3 VD Key
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19
MII_MDC MII_CRS Masse MII_RXDV MII_RXC Masse MII_TXD2 MII_TXD0 Masse Reserviert MII_RXD1 MII_RXD3 USB+ Masse USB+12 V Masse 3,3 V +5 VD Key
Tab. 24.3: Signale des CNR-B-Connectors
Sandini Bib 846
Kapitel 24
Pin Nr.
Signal
Pin Nr.
Signal
B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30
Key Masse EE_DOUT EE_SHCLK Masse SMB_A0 SMB_SCL CDC_DN_ENAB Masse AC97_SYNC AC97_SDATA_OUT AC97_BITCLK
A20 A21 A22 A23 A24 A25 B26 B27 B28 B29 A30
Key Masse EE_DIN EE_CS SMB_A1 SMB_A2 SMB_SDA AC97_RESET Reserviert AC97_SDATA_IN1 AC97_SDATA_IN0 Masse
Tab. 24.3: Signale des CNR-B-Connectors (Forts.)
24.3 Advanced Communication Riser Nicht alle Hersteller wollen nach Intels Vorgaben verfahren, und daher existiert – gewissermaßen von der Konkurrenz – ebenfalls ein Riser-Standard, der über die AMR- und auch CNR-Spezifikation hinausgeht: Der Advanced Communication Riser (ACR) wird von der ACR-SIG (Special Interest Group) propagiert, die sich aus Firmen wie AMD, VIA, 3COM und Texas Instruments zusammensetzt. ACR ist abwärtskompatibel zum ersten Riser-Standard (AMR), verwendet aber einen üblichen PCI-Slotanschluss, der auf dem Mainboard um 180° gedreht zu den eigentlichen PCI-Slots untergebracht ist. Eine AMR-Karte passt mechanisch in einen ACR-Slot hinein, so dass bei älteren Karten auch keine hardwaretechnischen Änderungen für ACR notwendig sein sollten. ACR bietet wie CNR die Unterstützung für den USB, Audio, Modem und HomePNA, darüber hinaus auch für drahtlose Kommunikationseinheiten (IrDA, Bluetooth) sowie für DSL (Dynamic Describer Line), das in Deutschland unter T-DSL bekannt ist.
Abb. 24.3: Mit Hilfe des ACR-Connectors soll eine Vielzahl von Funktionen ermöglicht werden, die über die der CNR-Spezifikation hinausgehen.
Es bleibt abzuwarten, welcher Standard sich durchsetzen und was möglicherweise noch an Riser-Versionen erscheinen wird, denn neben AMR, CNR und ACR gibt es noch eine ganze Reihe herstellerspezifischer Lösungen, die nur zu einem bestimmten Mainboard passen, was die ganze Angelegenheit noch unübersichtlicher macht. Daher sollte man alle Riser-Lösungen und die damit einhergehenden Karten tatsächlich eher als (festen) Bestandteil eines Mainboards sehen und weniger als eine universelle PC-Erweiterungsplattform, wie sie PCI oder auch ISA darstellen.
Sandini Bib
Teil 5: Laufwerke und ihre Interfaces – EIDE und SCSI In diesem Teil werden die typischen Laufwerke, wie Festplatten und CD- sowie DVD-Laufwerke, behandelt. Während den Festplatten und auch den Disketten eine magnetische Aufzeichnungstechnologie zugrunde liegt, arbeiten CD- und DVD-Laufwerke mit optischen Schreib- und Leseverfahren. Beide Typen mit den dazugehörigen Schnittstellen (EIDE, SCSI) sind Gegenstand der weiteren Kapitel.
25
Grundlagen der magnetischen Aufzeichnung und Datenorganisation
Eine Diskette ist ein Speichermedium, bei dem es über die Jahre keine bedeutenden Weiterentwicklungen gegeben hat. Das grundlegende Prinzip findet aber auch Anwendung bei Festplatten und Bandlaufwerken (Streamer, Tape-Dives), also bei allen Speichermedien, die mit einer magnetischen Aufzeichnung der Dateninformation arbeiten. Reine Magnetfelder im Vakuum, die z.B. durch einen Elektromagneten erzeugt werden, lassen sich physikalisch relativ einfach beschreiben. Komplizierter wird die Sache, wenn man Metalle oder Keramiken in das Magnetfeld bringt, weil solche Substanzen das Magnetfeld verändern. Je nach Stärke und Vorzeichen der Wechselwirkung unterscheidet man drei Arten von Magnetismus: Diamagnetismus, Paramagnetismus und Ferromagnetismus. Letzterer besitzt die größte technische Anwendung, und alle magnetischen Datenaufzeichnungen, egal ob auf Tonband, Magnetkarte, Diskette oder Festplatte, beruhen auf ihm.
25.1 Diamagnetismus und Paramagnetismus Alle Substanzen sind im Prinzip diamagnetisch, nur wird dieser Effekt durch den häufig vorkommenden Paramagnetismus überdeckt. Bringt man eine diamagnetische Substanz, wie Wasserstoff oder Silber, in ein Magnetfeld ein, so schwächt sie das Magnetfeld geringfügig ab, typischerweise um 0,000001% bis 0,05%. Reiner Diamagnetismus tritt nur bei Substanzen auf, die keine ungepaarten Elektronen haben, wie z.B. Edelgase oder Metallsalze. Das Besondere am Diamagnetismus ist, dass er im Gegensatz zu Para- und Ferromagnetismus vollkommen unabhängig von der Temperatur ist. Die meisten Atome besitzen mindestens ein ungepaartes Elektron in ihrer Hülle, dadurch tritt Paramagnetismus auf. Bringt man eine paramagnetische Substanz, wie z.B. Aluminium oder flüssigen Sauerstoff, in ein Magnetfeld ein, so verstärkt die Substanz das bereits vorhandene Mag-
Sandini Bib 848
Kapitel 25
netfeld um 0,00001% bis 0,05%. Ursache dafür ist die Ausrichtung der Atome durch das äußere Magnetfeld. Je tiefer die Temperatur ist, umso stärker wird der Effekt, da die Wärmebewegung der Atome diese Ausrichtung mit zunehmender Temperatur stört. Dem Dia- und demParamagnetismus ist gemeinsam, dass die Magnetisierung der Atome von der Existenz eines äußeren Magnetfeldes abhängig ist: Das äußere Feld führt zu einem magnetischen Effekt, der das bereits bestehende Magnetfeld schwächt (Diamagnetismus) oder verstärkt (Paramagnetismus). Schaltet man das äußere Magnetfeld ab, so verschwindet auch die Eigenmagnetisierung der Substanz. Dia- und paramagnetische Substanzen erzeugen also kein beständiges eigenes Magnetfeld und sind deshalb für eine lang andauernde Aufzeichnung von Daten ungeeignet.
25.2 Ferromagnetismus Von großer technischer Bedeutung sind die ferromagnetischen Substanzen, deren bekanntester Vertreter Eisen ist. Bei diesen Materialien sind mikroskopisch kleine Bereiche aus Milliarden Atomen, die so genannten Domänen oder Weiß’schen Bezirke, vollständig magnetisiert (siehe Abbildung 25.1). Da diese Bereiche normalerweise aber statistisch ausgerichtet sind, kompensiert sich makroskopisch gesehen ihre Wirkung, und die Substanz erscheint nach außen unmagnetisch. unmagnetisiertes Eisen
magnetisiertes Eisen
Domäne
Abb. 25.1: Ferromagnetikum: In unmagnetisiertem Eisen sind die Domänen regellos ausgerichtet, in magnetisiertem Eisen zeigen die Magnetfelder der Domänen dagegen einheitlich in eine Richtung.
Bringt man einen ferromagnetischen Körper in ein Magnetfeld, so richten sich (fast) alle Domänen nach dem externen Feld aus und können es auf diese Weise millionenfach verstärken (siehe Abbildung 25.1). Man verwendet z.B. Eisen als Kern für Transformatoren. Das Feld, das die Primärwicklung erzeugt, wird vom Eisenkern verstärkt und induziert in der Sekundärspule eine kräftigere Spannung. Dadurch erhöht sich der Wirkungsgrad. Einen ähnlichen Effekt können Sie auch bei Bestecken aus Eisen oder Stahlscheren beobachten: Wenn Sie sie immer in der gleichen Lage in die Schublade legen, so kann das stets vorhandene Erdmagnetfeld die ferromagnetischen Gegenstände magnetisieren; Besteck und Schere werden selbst magnetisch und ziehen andere Eisengegenstände wie z.B. Stecknadeln an.
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
849
Für die Datenaufzeichnung ist eine weitere Besonderheit ferromagnetischer Substanzen wichtig: die so genannte Remanenz. Hierunter versteht man die Erscheinung, dass ferromagnetische Substanzen nach dem Abschalten des äußeren Magnetfelds weiter magnetisch bleiben. Bei dia- und paramagnetischen Substanzen verschwindet demgegenüber die Magnetisierung völlig, nachdem das externe Magnetfeld abgeschaltet worden ist. In Abbildung 25.2 sehen Sie den Zusammenhang zwischen dem äußeren Magnetfeld H und der Magnetisierung M eines Ferromagnetikums. Mit wachsendem äußerem Magnetfeld H steigt die Magnetisierung M an und erreicht irgendwann einen Sättigungswert Js, der nicht überschritten werden kann, die sogenannte Sättigungsmagnetisierung. Mehr als alle Weiß’schen Bezirke können schließlich nicht ausgerichtet werden. Das Ferromagnetikum ist nun vollständig magnetisiert. Verringert man die Stärke des externen Magnetfelds, so nimmt auch die Magnetisierung wieder ab, allerdings in geringerem Maße, als das vorher umgekehrt bei der Zunahme des Feldes der Fall war. Erreicht das Magnetfeld den Wert »0«, ist das äußere Feld also abgeschaltet, dann bleibt eine Restmagnetisierung übrig, die man als Remanenz oder remanente Magnetisierung bezeichnet. Erst wenn ein entgegengesetztes Magnetfeld bestimmter Stärke angelegt wird, verschwindet auch die remanente Magnetisierung. Die Stärke des entgegengesetzten Feldes, das zur vollständigen Entmagnetisierung notwendig ist, bezeichnet man als Koerzitivität oder Koerzitivkraft. Schließlich nimmt das Ferromagnetikum bei weiter ansteigender Feldstärke eine Magnetisierung an, die der vorherigen maximalen Magnetisierung entgegengesetzt, aber betragsmäßig gleich groß ist. Verringert man nun das äußere Magnetfeld wieder und kehrt es schließlich um, so durchläuft die Magnetisierung eine Kurve, die symmetrisch zur vorherigen Änderung der Magnetisierung ist. Die gesamte Kurve wird als Hystereseschleife bezeichnet. Man sagt, Ferromagnetika zeigen eine Hysterese, weil hier die Magnetisierung nicht nur vom äußeren Magnetfeld, sondern auch von der Vorgeschichte des Stoffes abhängig ist. Die Bildung von Domänen und die im Vergleich zum Paramagnetismus starke Magnetisierung beruhen auf quantenphysikalischen Gesetzen, die zu einer starken magnetischen Kopplung benachbarter Atome und Moleküle in einem Festkörper führen. hartes Ferromagnetikum
weiches Ferromagnetikum
M
M
Remanenz
H
H
Koerzitivität
Abb. 25.2: Hystereseschleife: Ein magnetisch hartes Ferromagnetikum weist eine große Remanenz und Koerzitivität auf, die Hysterese ist groß. Bei einem weichen Ferromagnetikum fallen die beiden Kurven dagegen fast zusammen.
Durch bestimmte Zusätze und Behandlungsmethoden lassen sich Ferromagnetika konstruieren, die eine große Hysterese aufweisen, also eine starke Remanenz und hohe Koerzitivität besitzen. Solche Stoffe werden als magnetisch hart bezeichnet. Magnetisch weiche Substanzen mit kleiner Hysterese haben demgegenüber geringe Remanenz und kleine Koerzitivkraft. Die Hystereseeigenschaft ferromagnetischer Substanzen ist für die Datenaufzeichnung wesentlich. Üblicherweise stellt man ein Bit durch einen Bereich dar, der homogen in einer Richtung
Sandini Bib 850
Kapitel 25
magnetisiert ist. Dieser Bereich muss mindestens so groß wie eine Domäne sein. Das magnetische Feld zum Magnetisieren des Bereichs wird dabei meist durch einen kleinen Elektromagneten in einem so genannten Schreib-/Lesekopf des Disketten- oder Festplattenlaufwerks erzeugt. Die Weiß’schen Bezirke innerhalb des Bereichs richten sich also entsprechend dem erzeugten Magnetfeld aus: Es wird eine »1« gespeichert. Durch Umpolen des Magnetfelds werden die Bezirke ebenfalls ausgerichtet, nur in die andere Richtung: Es wird eine »0« gespeichert. Aus der Hystereseschleife erkennen Sie, dass für die Ausrichtung der Domänen oder ein Überschreiben alter Werte mindestens ein magnetisches Feld in Höhe der Koerzitivität notwendig ist. Die Daten selbst werden durch eine Magnetisierung in Höhe der Remanenz gespeichert. Magnetisch harte Substanzen speichern die Daten also stärker, da ihre Remanenz größer ist. Sie benötigen hierfür aber auch ein größeres Schreibfeld, um die Koerzitivitätskraft zu erzeugen, die für eine Magnetisierung notwendig ist. Eng benachbarte entgegengesetzt magnetisierte Domänen können sich gegenseitig beeinflussen und im Extremfall sogar gegenseitig entmagnetisieren. Will man möglichst viele Daten auf einen magnetischen Datenträger packen, die dann auch näher beieinander liegen, so benötigt man magnetisch härtere Substanzen als bei niedriger Packungsdichte. Disketten mit 1,2 MByte Speicherkapazität sind daher mit magnetisch härteren Substanzen beschichtet als Disketten mit nur einer Kapazität von 360 KByte. Die zugehörigen 1,2-MByte-Laufwerke erzeugen stärkere Magnetfelder, um die 1,2-MByte-Disketten zu formatieren und zu beschreiben. Wenn Sie nun eine magnetisch weiche 360-KByte-Diskette in einem 1,2-MByte-Laufwerk formatieren, sind die Spuren möglicherweise so stark magnetisiert, dass ein 360-KByte-Laufwerk, das ein entsprechend niedrigeres Feld für die weichen 360-KByte-Disketten erzeugt, die notwendige Koerzitivkraft nicht aufbringen kann. Solche in einem 1,2-MByte-Laufwerk formatierten und beschriebenen Disketten können Sie dann zwar in einem 360-KByte-Laufwerk lesen, aber Sie können weder die Daten überschreiben noch eine erneute Formatierung vornehmen. Erst nach mehreren Wiederholungen glückt dies – wenn überhaupt. Eine weitere Besonderheit ferromagnetischer Substanzen ist die Existenz einer scharf definierten Temperatur, der so genannten Curie-Temperatur Tc oder des Curie-Punkts. Bis zu dieser Temperatur verhalten sich Ferromagnetika in der beschriebenen Weise. Wird aber z.B. Eisen über 774°C, seinen Curie-Punkt, erhitzt, so verschwindet der Ferromagnetismus schlagartig, und das Eisen verhält sich wie eine paramagnetische Substanz mit wesentlich niedrigerer Magnetisierung. Diese Eigenschaft wird in magnetooptischen Laufwerken und bei magnetooptischen Datenträgern ausgenutzt. In Kapitel 28 erfahren Sie hierzu mehr. Die technisch bedeutendsten Ferromagnetika sind Eisen, Kobalt, Nickel und Legierungen aus diesen Stoffen. In der Tabelle 25.1 sind die wichtigsten Ferromagnetika mit ihrer Curie-Temperatur Tc und Sättigungsmagnetisierung Js angegeben. Ferromagnetika
Tc [°C]
Js [Tesla]
Eisen (Fe) Kobalt (Co) Nickel (Ni) Gadolinium Fe65Co35 MnBi*)
770 1121 358 20 920 360
2,15 1,76 0,68 2,52 2,45 0,78
*)
Mangan-Wismut-Legierung
Tab. 25.1: Ferromagnetika
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
851
25.3 Induktion Bisher haben wir nur die Grundlage für eine lang anhaltende Aufzeichnung von Daten kennen gelernt, aber nicht erfahren, auf welche Weise solche Magnetisierungen erzeugt und wie aus ihnen Daten wieder zurückgewonnen werden können. Es ist Ihnen wahrscheinlich bekannt, dass sich durch elektrische Ströme Magnetfelder erzeugen lassen: Fließt ein konstanter Strom durch eine Spule, so wird ein konstantes Magnetfeld erzeugt; die Spule wirkt als Elektromagnet. Mit Hilfe solch kleiner Spulen können also Domänen in einem Ferromagnetikum dauerhaft ausgerichtet werden – sie speichern Daten. Zum Erfassen der ausgerichteten Magnetbereiche macht man sich einen anderen Effekt der Elektrodynamik zunutze, die Induktion. Hierunter versteht man das Phänomen, dass ein sich veränderndes Magnetfeld eine elektrische Spannung erzeugt. Bringt man also eine Spule in ein Magnetfeld, das sich verändert, so führt die Induktion zu einer elektrischen Spannung. Bemerkenswert ist dabei, dass nur eine Änderung des Magnetfeldes zu einer Spannung führt, nicht aber das Magnetfeld selbst. Demgegenüber erzeugt ein konstanter Strom ein konstantes Magnetfeld oder, anders ausgedrückt, ein veränderlicher Strom ein veränderliches Magnetfeld. Genau diese beiden Effekte nutzt man in einem Transformator: Der Wechselstrom in der Primärspule erzeugt ein sich zeitlich veränderndes Magnetfeld, das in der Sekundärspule über den Effekt der magnetischen Induktion eine Spannung induziert, die im gleichen Takt wie der Strom in der Primärspule schwingt. Die bedeutet jedoch, dass ein homogen magnetisiertes Ferromagnetikum keine Spannungen induzieren kann. Bewegt man ein Spule über einen solchen Körper, wird keine Spannung induziert und es tritt kein (Daten-)Signal auf. Erst wenn das Ferromagnetikum abwechselnd magnetisierte Stellen aufweist, ändert sich das Magnetfeld bei der Bewegung der Spule und erzeugt so eine Spannung, die als Datensignal abgenommen und verstärkt werden kann. Für die Datenaufzeichnung ist also nicht eine gleichmäßige Magnetisierung von Disketten, Festplatten oder Magnetbändern notwendig, sondern gerade die Bildung abwechselnd ausgerichteter Bereiche.
25.4 Funktionsprinzip von Disketten Ihnen ist sicher das Funktionsprinzip des Tonbands bekannt: Dort bewegt ein Antriebsmotor das Band an einem Tonkopf vorbei, der die auf dem Band gespeicherte Information abnimmt oder neue Information auf das Band spielt. Die Information stellt beim Tonband im allgemeinen Musik oder sonstige Töne dar, die über einen Lautsprecher abgegeben oder von einem Mikrofon aufgenommen werden. Anstelle von Musik kann natürlich auch jede andere Art der »Information« auf das Magnetband gespielt werden, z.B. Programme oder Daten für einen Computer. Magnetbänder spielen als preisgünstiges Medium für die Archivierung von Daten eine große Rolle. Beim PC finden Sie sie in Form von Streamer-Kassetten wieder, bei denen das Band fest in einem Gehäuse installiert ist. Den großen Nachteil von Magnetbändern haben Sie sicher schon selbst feststellen können: Wenn Sie ein Lied nochmals von vorne hören oder überspringen möchten, müssen Sie das Band mehr oder weniger lange umspulen. Das Gleiche gilt natürlich auch im Computerbereich. Das Laden eines Programms artet dann meist in eine Geduldsprobe aus. Magnetbänder sind also als Online-Massenspeicher ungeeignet, aus Kostengründen für umfangreiche Datensicherungen (Backups) aber sehr vorteilhaft.
Sandini Bib 852
Kapitel 25
Das Umspulen der Magnetbänder führt zu einer großen Zugriffszeit, darunter versteht man die Zeitspanne zwischen einer Zugriffsanweisung und der Übergabe der Daten. Um die Zugriffszeit zu verkleinern, wurden Disketten und Festplatten entwickelt. In Abbildung 25.3 sehen Sie den Aufbau von 5¼"- und 3½"-Disketten (das " ist die gebräuchliche Abkürzung für Zoll). Verstärkungsring
HD-Kerbe
Schreibschutzschieber
Etikett Etikett
Schreibschutzkerbe
Indexloch Riegel Spindelloch
Aussparung für Köpfe
Abb. 25.3: Disketten
Im PC-Bereich finden Sie heutzutage nur noch die üblichen 3½"-Disketten mit einer Speicherkapazität von 1,44 MByte. Diese Disketten sind doppelseitig, die Daten werden also auf beiden Seiten aufgezeichnet. Um Daten auf den Disketten zu speichern oder von diesen zu lesen, werden sie in ein Diskettenlaufwerk (siehe Abbildung 25.4) eingelegt. Bei einer 5¼"-Diskette nimmt ein zentraler Dorn, der mit der Antriebsachse des Laufwerksmotors verbunden ist, die Diskette über das Spindelloch auf und presst sie fest gegen ein Widerlager. Die kompaktere 3½"-Diskette weist demgegenüber Aussparungen in der Metallscheibe auf. Beim Einlegen einer solchen Diskette greift die Antriebsachse direkt in diese Aussparungen ein, ein Verriegeln ist nicht erforderlich. Die Hüllen von 5¼"-Disketten und die Disketten selbst haben außerdem noch ein Indexloch, das zur Festlegung einer Nullposition ähnlich dem Meridian auf einem Globus dient. Wenn Sie eine solche Diskette in die Hand nehmen, ist der Datenträger wahrscheinlich so verdreht, dass Sie durch das Indexloch in der Hülle nur die Oberfläche des Datenträgers erkennen können. Wenn Sie den Datenträger mit Hilfe des Spindellochs und des Verstärkungsrings vorsichtig drehen, taucht irgendwann ein kleines Loch auf, das Indexloch im Datenträger. Mit Hilfe der Schreibschutzkerbe kann verhindert werden, dass Daten auf der Diskette versehentlich überschrieben werden. Bei der alten 5¼"-Diskette musste hierzu die Kerbe mit einem geeigneten Klebestreifen abgedeckt werden, während eine 3½"-Diskette über einen Schreibschutzschieber (vgl. Abbildung 25.3) verfügt. Die Diskettenlaufwerke besitzen intern eine Lichtschranke, die diese Kerbe bzw. das Loch abtastet. Wenn sie verschlossen ist, so verweigert das 5¼"-Laufwerk einen Schreibzugriff auf die eingelegte Diskette. Bei 3½"-Disketten ist es genau anders herum, d.h. das Loch muss durch den Schreibschutzschieber freigegeben sein, dann ist der Schreibschutz aktiviert. Diese Verweigerung geschieht auf Hardware-Ebene und kann somit durch Software-Befehle nicht umgangen werden – ein zuverlässiger Schutz vor Viren. Durch das Spindelloch, das Indexloch und die Aussparung für die Schreib-/Leseköpfe sind die 5¼"-Disketten recht anfällig für Verschmutzungen. Wesentlich besser geschützt sind hingegen die 3½"-Disketten; das ist wegen der höheren Datenaufzeichnungsdichte auch nötig. Sie befinden sich in einem starren und stabilen Kunststoffgehäuse, bei dem die Aussparung für die
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
853
Schreib-/Leseköpfe durch einen Riegel geschützt ist. Erst wenn Sie die Diskette in das Laufwerk einsetzen, schiebt der Laufwerksmechanismus den Riegel zur Seite. Anstelle eines Spindellochs besitzt die 3½"-Diskette eine zentrale Metallplatte, die zwei Aussparungen aufweist: eine für die Motorachse und eine als Ersatz für das Indexloch. Im Gegensatz zur 5¼"-Diskette wird die Diskette hier nicht von einem Dorn aufgenommen und gegen ein Widerlager gedrückt, sondern eine besonders geformte Motorachse greift in die mittlere Aussparung ein. Die zweite Aussparung dient ähnlich wie das Indexloch zur Angabe der Nullposition. 3½"-Disketten brauchen auch nicht wie die 5½"-Disketten manuell im Laufwerk verriegelt werden, das erledigt der Laufwerksmechanismus. Die 3½"-Disketten mit 1,44 MByte Speicherkapazität besitzen ferner noch eine HD-Aussparung, um dem Diskettenlaufwerk anzuzeigen, dass es sich um eine High-Density- oder abgekürzt HDDiskette handelt. Damit können die Probleme umgangen werden, die bei den 5¼"-Disketten auftreten, wenn 360-KByte-Disketten in einem 1,2-MByte-Laufwerk formatiert oder beschrieben werden. Da die beiden Diskettenarten gleich groß sind, muss die Packungsdichte bei den 1,2MByte-Disketten daher größer sein. Die magnetisierten Bereiche liegen also näher beieinander, und es ist eine größere Koerzitivität der Magnetbeschichtung erforderlich, um die Daten dauerhaft zu speichern. Der Laufwerksmotor dreht die eingelegte Diskette mit 300 Umdrehungen je Minute bei den 360KByte-Disketten oder mit 360 Umdrehungen pro Minute bei allen anderen Diskettenarten. Das bedeutet, dass nach 1/5 bzw. 1/6 Sekunde ein Umlauf des Datenträgers vollendet ist. Für die Aufzeichnung und Wiedergewinnung von Daten ist noch ein Schreib-/Lesekopf notwendig, der sich am Ende eines Zugriffsarms befindet. In der Abbildung 25.4 ist der prizipielle Aufbau eines Diskettenlaufwerks mit Motor, Diskette und Zugriffsarm angegeben. Diskette
Aufnahmedorn Schreib-/Lesekopf Schrittmotor für Kopfbewegung Kopfbewegung
Schrittmotordrehung Disketten- Zugriffsarm drehung Motorwelle Spur
Spindelmotor Abb. 25.4: Prinzipieller Aufbau eines Diskettenlaufwerks
Die heute allgemein üblichen doppelseitigen Laufwerke für doppelseitige Disketten besitzen zwei Schreib-/Leseköpfe, die allerdings am selben Zugriffsarm montiert sind und somit nicht unabhängig voneinander bewegt werden können. Sie werden aber getrennt aktiviert. Der Zugriffsarm wird meistens über einen Schrittmotor bewegt, der zunächst ein Schneckengetriebe
Sandini Bib 854
Kapitel 25
antreibt, das die Drehbewegung des Motors in eine lineare Bewegung des Zugriffsarms umwandelt. Um die Köpfe an eine bestimmte Position zu fahren, steuert die Elektronik des Diskettenlaufwerks auf Anweisung des Diskettencontrollers den Schrittmotor so an, dass er eine bestimmte Zahl von Drehschritten ausführt. Dabei findet also keine Rückkopplung statt. Die eindimensionale Bewegung des Magnetbands, vorbei am Schreib-/Lesekopf, ist also in eine zweidimensionale Bewegung umgewandelt worden, nämlich in die Drehbewegung des Datenträgers und in die lineare Bewegung des Schreib-/Lesekopfes. Im ungünstigsten Fall sind bestimmte Daten bei einer Diskette erst nach einer Umdrehung des Datenträgers und einer vollständigen linearen Bewegung des Zugriffsarms erreichbar. Eine Umdrehung wird in 170 bis 200 ms ausgeführt, die vollständige Linearbewegung des Kopfes in typischerweise 200 ms, maximal sind also 200 ms notwendig, um auf einen Wert zuzugreifen. Bisher haben Sie nur den Zugriff auf bestimmte Positionen auf dem Datenträger kennen gelernt, nicht aber erfahren, wie Daten geschrieben oder gelesen werden. Grundlage hierfür sind der Ferromagnetismus, die Induktion und die Existenz der Schreib-/Leseköpfe. Die Aufzeichnung und Wiedergewinnung von Daten findet genau an der Position der Schreib-/Leseköpfe statt. In Abbildung 25.5 ist der Querschnitt durch einen Schreib-/Lesekopf gezeigt, der sich über der Diskette befindet.
Spule
Datensignal
magnetisierbare Schicht
Zugriffsarm Spalt Schreib-/Lesekopf
Diskette
Trägermaterial Drehrichtung
Abb. 25.5: Schreib-/Lesekopf und Diskette: Der Schreib-/Lesekopf weist eine Spule auf, die ein elektromagnetisches Feld erzeugt. Das Feld tritt aus dem Spalt aus und magnetisiert die Beschichtung der Diskette.
In Kapitel 25.2 wurde erläutert, dass durch ein äußeres Magnetfeld die Weiß‘schen Bezirke in einem ferromagnetischen Material ausgerichtet werden und auch nach Abschaltung des externen Magnetfelds ihre Ausrichtung beibehalten. Diesen Effekt macht man sich bei der Aufzeichnung zunutze. Der Schreib-/Lesekopf besteht im Wesentlichen aus einem kleinen Elektromagneten mit Eisenkern, der innen eine kleinen Spalte aufweist. Durch den Spalt können die magnetischen Feldlinien des Elektromagneten beim Schreiben austreten und kleine Bereiche der Datenträgerbeschichtung magnetisieren. Je nach Ausrichtung der Domänen lässt sich an der betreffenden Stelle somit eine »1« oder »0« darstellen. Die mit einer Eisen- oder einer Kobaltverbindung beschichtete Diskette dreht sich unter dem Schreib-/Lesekopf weg, so dass die Laufwerkssteuerung in einem geeigneten Moment einen kurzen Stromimpuls durch den Elektromagneten des Kopfes schickt, um ein Magnetfeld mit der
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
855
gewünschten Ausrichtung aufzubauen. Es ist also notwendig, die Drehung des Datenträgers, die lineare Position des Zugriffsarms sowie den Zeitpunkt und die Richtung des Schreibimpulses so aufeinander abzustimmen, dass an einer beliebigen Stelle ein definiertes Bit als Magnetisierung eines winzigen Bereichs geschrieben werden kann. Sollen mehrere Datenbits hintereinander geschrieben werden, so gibt die Laufwerkssteuerung im Takt der Aufzeichnung einen Strom von Impulsen an den Schreib-/Lesekopf ab, der zur Aufzeichnung aller Datenbits führt. Wesentlichen Einfluss auf die Dichte der Aufzeichnung haben dabei die Größe des Spalts und der Abstand zwischen Kopf und Datenträger. Je kleiner der Spalt ist, umso kleiner wird auch der Bereich der austretenden Feldlinien und der Abschnitt auf der Datenträgeroberfläche, den diese Feldlinien beeinflussen. Ein kleinerer Spalt kann somit zu einer größeren Datendichte führen. Andererseits dehnt sich das Magnetfeld mit wachsendem Abstand vom Spalt immer mehr aus. Je weiter der Kopf also vom Datenträger entfernt ist, umso größer ist der beeinflusste Bereich. Ein geringer Abstand zwischen Kopf und Diskette unterstützt also ebenfalls die Erhöhung der Aufzeichnungsdichte. Diskettenlaufwerke, und vor allem Festplatten, besitzen deshalb einen kleinen Schreib-/Lesekopf mit kleinem Spalt, der sich in möglichst geringem Abstand vom Datenträger befindet. In Diskettenlaufwerken setzt der Schreib-/Lesekopf durch die Kraft einer Feder auf der Diskettenoberfläche auf und schleift hier; der Abstand zwischen Kopf und Datenträger ist praktisch Null. Die Disketten werden daher mit der Zeit abgenutzt, obwohl sie heute meist einen Überzug aus Teflon oder einem ähnlich widerstandsfähigen Material über der magnetischen Beschichtung aufweisen. Die Abnutzung hält sich aber durch die geringe Drehgeschwindigkeit und die Tatsache, dass der Datenträger nur bei einem Zugriff vom Laufwerksmotor gedreht wird, im Rahmen. Bei den schnell und vor allem ständig laufenden Festplatten würde ein Schleifen des Kopfes demgegenüber sehr schnell zu einer Beschädigung der magnetischen Schicht und somit zu einem Datenverlust führen. Bei Festplatten berührt der Kopf daher die Datenträgeroberfläche nicht. Beim Lesen der zuvor geschriebenen Daten nimmt die Spule im Schreib-/Lesekopf die Feldlinien der magnetisierten Datenträgeroberfläche auf, die über den Spalt in sie eindringen. Abwechselnde Magnetisierungen der Datenträgeroberfläche führen durch die Drehbewegung der Diskette zu einem veränderlichen Magnetfeld, das in der Spule eine Spannung induziert. Die Spannung spiegelt dabei die vorher geschriebenen Daten wider. Man erhält zunächst einen Strom von elektrischen Signalen, die von der Elektronik des Laufwerks und des Diskettencontrollers in einen Strom von Bits umgesetzt werden. Um einen bestimmten Wert zu lesen, fährt der Controller den Kopf an eine bestimmte Stelle und treibt den Laufwerksmotor an. Wenn die gewünschten Daten unter dem Schreib-/Lesekopf erscheinen, öffnet der Controller ein Gatter, um die induzierten Datensignale an einen Verstärker weiterzugeben. Auch beim Lesen ist also eine exakte Abstimmung von Drehbewegung, Linearbewegung und dem Zeitpunkt der Gatteröffnung notwendig. Diskettenlaufwerke werden aus nahe liegenden Gründen als Laufwerke mit wechselbarem Datenträger bezeichnet. Darin unterscheiden sie sich von den üblichen Festplattenlaufwerken. Die Austauschbarkeit der Disketten erkauft man sich aber mit einem erheblichen Nachteil für die Datensicherheit, da sich Staub, Fingerabdrücke und andere Verschmutzungen auf Dauer kaum vermeiden lassen und so zwischen den Schreib-/Lesekopf und den Datenträger gelangen. Durch die Drehung der Diskette wirken sie wie Scheuerpulver, die Beschichtung wird beschädigt oder zerstört, und Daten gehen verloren. Mittlerweile sind »Diskettenlaufwerke« und »Disketten« mit einer Kapazität von 750 MByte auf dem Markt, wie etwa das ZIP-Laufwerk von Iomega. Die um eine Größenordnung höhere Aufzeichnungsdichte verlangt nochmals einen besseren Schutz vor Verschmutzungen, die Disketten
Sandini Bib 856
Kapitel 25
werden daher in einem hermetisch abgeschlossenen Gehäuse ausgeliefert. Man sollte solche Datenträger daher nicht mehr als Disketten, sondern als Wechselplatten bezeichnen, da sie hinsichtlich Speicherkapazität und Technologie im Bereich zwischen Disketten und Festplatten angesiedelt sind.
25.5 Physikalische Organisation und Aufzeichnung Für eine korrekte und zuverlässige Verwaltung der geschriebenen Daten ist zusätzlich eine gewisse Organisation des Datenträgers notwendig. Die »Bahn«, die ein Schreib-/Lesekopf aus der Sicht des sich drehenden Datenträgers beschreibt, ist bei fester radialer Position des Kopfes, d.h. bei fester Stellung des Zugriffsarms, ein Kreis, der als Mittelpunkt die Spindel des Antriebsmotors hat. Wenn sich die radiale Position des Zugriffsarms durch eine Drehung des Schrittmotors ändert, so beschreibt der Schreib-/Lesekopf einen anderen Kreis mit unterschiedlichem Durchmesser. Daher liegt es nahe, eben solche Kreise zur Organisation von Disketten heranzuziehen. Allerdings heißen sie nun Spuren, denen eine Nummer zugeordnet ist (siehe Abbildung 25.6). Üblicherweise beginnt die Zählung bei der äußersten Spur mit »0«, also beim Kreis mit dem größten Radius. Zwischen den Spuren befinden sich schmale Bereiche, die nicht magnetisiert sind, so dass die Spuren eindeutig unterschieden werden können. Die heute gebräuchlichen 1,44-MByte-Disketten besitzen 80 Spuren.
t
Bi t
Bi
ur 0
B
Sek 5 tor Sek
4 tor Sek
6
3
tor
2
tor
Sek
79 ur
7
Sp
tor
tor
Sek
1
8
tor
tor
Sek
Sek
Sek
Sp
Abb. 25.6: Spuren, Zylinder und Sektoren: Jede Diskette ist in Form von Spuren organisiert, die in Sektoren unterteilt sind. Innerhalb eines Sektors stellt ein Bit die kleinste Datenmenge dar.
Bei doppelseitigen Disketten und Festplatten, die meistens mehr als eine Platte besitzen, ist nicht nur ein Schreib-/Lesekopf vorhanden, sondern mehrere. Jeder dieser Köpfe beschreibt eine eigene Spur, die zusammengefasst als Zylinder bezeichnet werden. Die einzelnen Spuren eines
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
857
Zylinders werden noch durch den Kopf unterschieden, zu dem sie gehören. Im Allgemeinen beginnt die Zählung des Kopfes mit 0. Mit der Spur treten ähnliche Schwierigkeiten wie mit der Diskette auf: Wo befindet sich der Anfang eines Kreises? Die Antwort lautet: nirgends. Aus diesen Gründen werden die Spuren noch weiter unterteilt, nämlich in so genannte Sektoren. Auch diese Sektoren werden wie die Spuren oder Zylinder durchnummeriert. Der Beginn des ersten Sektors einer Spur wird dem Laufwerk bei 5¼"-Disketten durch das oben erwähnte kleine Indexloch mitgeteilt. Bei 3½"-Disketten gibt die festgelegte Stellung der Aussparung in der zentralen Metallscheibe und bei Festplatten ein besonderes magnetisches Muster auf der Platte den Beginn des ersten Sektors an. 1,44-MByte-Disketten weisen 80 Spuren und 18 Sektoren pro Spur auf. Üblicherweise ist jeder Datenbereich eines Sektors 512 Bytes groß. DOS gruppiert außerdem einen oder mehrere Sektoren logisch zu einem so genannten Cluster oder einer Zuweisungseinheit. Eine 1,44-MByte-Diskette verfügt nur über einen Cluster. Vor jedem Sektor befindet sich eine so genannte Adressmarke, die die Nummer von Spur und Sektor angibt. Der eigentliche Datenbereich eines Sektors ist durch eine Datenmarke gekennzeichnet. Auch die Adress- und Datenmarken sowie bestimmte Synchronisationsmuster benötigen Speicherplatz auf dem Datenträger. Die formatierte Kapazität von Disketten und Festplatten ist daher kleiner als die unformatierte. Beim Formatieren werden magnetische Muster auf die Diskette oder Festplatte geschrieben, die die Spuren, Zylinder und Sektoren angeben. Dies wird als Low-Level-Formatierung bezeichnet. In Kapitel 26, Festplatten, finden Sie weitere Details dazu sowie auch zur High-Level-Formatierung.
25.5.1 FM- und MFM-Verfahren Das erläuterte Layout der Spuren und Sektoren legt nur die Anzahl und den Wert der einzelnen Datenbytes fest, nicht aber, wie diese konkret auf der Diskettenoberfläche als Magnetisierungen der ferromagnetischen Oberflächenbeschichtung angelegt werden. Die Informationen werden als kontinuierlicher Bitstrom auf die Oberfläche geschrieben. Für Disketten existieren zwei Aufzeichnungsverfahren: FM (Frequenz-Modulation) und MFM (Modifizierte Frequenz-Modulation). Da das MFM-Verfahren eine doppelte Informationsdichte bei gleicher Aufzeichnungsdichte gestattet, wird heute in allen Diskettenlaufwerken nur noch das MFM-Format verwendet. Aus Kompatibilitätsgründen unterstützen aber alle Diskettencontroller nach wie vor das ältere FM-Aufzeichnungsformat. In Abbildung 25.7 ist die Aufzeichnung des Bytes 01101001 einmal im FM- und einmal im MFM-Format verdeutlicht. Die Datenbits werden in einer so genannten Bitzelle gespeichert. Eine Bitzelle ist ein bestimmter Abschnitt auf der Diskettenoberfläche, der ein einzelnes Bit aufnimmt. Beim FM-Aufzeichnungsformat ist jede Bitzelle in zwei Halbzellen unterteilt, die ein Taktbit bzw. ein Datenbit aufnehmen. Jeder Impuls wird durch einen Flusswechsel erzeugt – im Normalfall eine Umpolung der Magnetisierung – und aus diesem Grund muss ein gesetztes Takt- oder Datenbit einen Wechsel enthalten. Die Körnigkeit des magnetischen Aufzeichnungsmediums und die Größe des Schreib-/ Lesekopfes beschränken die Größe einer solchen Bitzelle nach unten. Typische Werte für die Größe einer Bitzelle liegen bei Disketten zwischen 1 und 3µm.
Sandini Bib 858
Kapitel 25
Flussdichte
FM
D
T
T
FM-Daten Taktbit Datenbit Taktbit Datenbit
Bitzelle
Bitzelle
Flussdichte T
T
T D T D T
T D T
T
T D T
FM-Daten 0
0
1
1
0
1
0
0
1
Byte 01101001
Flussdichte
MFM
D
MFM-Daten Taktbit Datenbit Taktbit Datenbit
Bitzelle
Bitzelle
Flussdichte T
D
D
D
T
D
MFM-Daten
0
0
1
1
0
1
0
0
1
Byte 01101001
Abb. 25.7: FM- und MFM-Format des Byte 01101001
Kennzeichnend für das FM-Format ist, dass jede Bitzelle ein gesetztes Taktbit aufweist. Die eigentliche Information, die in den Datenbits gespeichert ist, erscheint zwischen zwei aufeinander folgenden Taktbits als aktives oder inaktives Signal, das einem Wert von »1« bzw. »0« entspricht. Das Schreiben von Daten im FM-Aufzeichnungsformat ist also sehr einfach. Man benötigt nur einen getakteten Zähler, der für alle ungeraden Zählimpulse einen Taktimpuls und für jeden geraden Zählimpuls einen Impuls an den Schreib-/Lesekopf abgibt, wenn der Wert des zu schreibenden Bits gleich »1« ist, oder keinen Impuls, wenn der betreffende Wert gleich »0« ist. Auch die Wiedergewinnung der Datenbits ist sehr einfach zu realisieren. Eine Lesesignallogik erfasst die Taktbits und ermittelt, ob zwischen zwei aufeinander folgenden Taktbits ein aktives Signal entsprechend einem gesetzten Bit oder ein inaktives Signal entsprechend einem Bitwert »0« auftaucht. Das FM-Verfahren arbeitet also auf einfache Art und Weise und damit auch sehr zuverlässig, die Informationsdichte auf dem Datenträger ist allerdings nicht besonders hoch. Das effektivere MFM-Verfahren steigert die Dichte um einen Faktor zwei, ohne dass die Dichte der Takt- und Datenbits erhöht werden müsste. In Abbildung 25.7 ist unten dasselbe Datenbyte gezeigt, wie es im MFM-Aufzeichnungsformat auf den Datenträger geschrieben wird. Es fällt
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
859
sofort auf, dass die Zahl der Taktbits viel geringer und der Abstand zwischen zwei aktiven Bits viel größer als beim FM-Verfahren ist. Die Ursache liegt in der Kodierungsregel zur MFM-Aufzeichnung von Daten:
: :
Ein Taktbit wird nur dann geschrieben, wenn sowohl die vorherige als auch die gegenwärtige Bitzelle kein gesetztes Datenbit aufweisen. Ein Datenbit wird immer dann geschrieben, wenn es gleich 1 ist.
In die Kodierung der Daten im MFM-Format geht also nicht nur das gegenwärtige Datenbit ein, wie das beim FM-Verfahren der Fall ist, sondern auch das vorherige Datenbit. Der in einer Bitzelle gespeicherte Wert ist also das Produkt von zwei aufeinander folgenden Datenbits. Entsprechend ist natürlich auch der elektronische Aufwand zur Ausführung dieser Kodierung und vor allem zur Rückgewinnung der Daten größer. Zum Ausgleich müssen aber weniger aktive Bits in die Bitzellen geschrieben werden. Beim FM-Verfahren besitzt jede Bitzelle ein aktives Taktbit, beim MFM-Verfahren treten dagegen aktive Taktbits nur dann auf, wenn mindestens zwei Datenbits mit dem Wert 0 aufeinander folgen. Wie man aus Abbildung 25.7 erkennen kann, ist als Ergebnis der Abstand zweier aufeinander folgender aktiver Bits – egal ob Takt- oder Datenbit – und somit zweier aufeinander folgender Flusswechsel mindestens so groß wie eine ganze Bitzelle und höchstens so groß wie zwei Bitzellen. Dagegen beträgt der Abstand zweier aktiver Bits beim FM-Verfahren mindestens eine halbe und höchstens eine ganze Bitzelle. Mit anderen Worten: Hier können die Bitzellen halb so groß gemacht werden, ohne dass die Bit- und Flusswechselfrequenz gegenüber dem FM-Aufzeichnungsverfahren zunimmt. Die Informationsdichte wird damit beim MFM-Verfahren doppelt so groß wie beim FM-Verfahren, und dies, ohne dass die Dichte der Flusswechsel auf der Datenträgeroberfläche vergrößert werden würde. Der Mehraufwand betrifft allein die Kodier- und Dekodierelektronik der Controller, was problemlos ohne große Schwierigkeiten zu bewältigen ist. Das Verfahren zur Rückgewinnung der Daten aus den MFM-Daten ist noch interessant und auch für ein Verständnis der Fehlerbehebungsstrategien von Festplattencontrollern wichtig. In Abbildung 25.8 ist ein Schema für die Wiederherstellung des Datenbytes 01101001 aus den MFMDaten von Abbildung 25.7 (unten) gezeigt. T
D
D
1
1
D
T
D
MFM-Daten
Flussdichte Datentaktsignal/ Datenfenster Taktsignal/ Taktfenster dekodierte Daten 0
0
0
1
0
0
1
Byte 01101001
Abb. 25.8: Dekodierung von MFM-Daten
Jeder Flusswechsel führt zu einem Impuls, was eine gleichmäßige Magnetisierung, aber keine Spannung erzeugt. Der Schreib-/Lesekopf nimmt nun die Signale fortlaufend auf und überträgt
Sandini Bib 860
Kapitel 25
diese an zwei Gatter: ein Daten- und ein Taktgatter. Dem Datengatter wird ein Datentaktsignal zugeführt, so dass die hohen Pegel des Signals ein sich periodisches öffnendes Datenfenster darstellen; das Datengatter schaltet dann einfach durch und lässt die Signale passieren. In gleicher Weise führt man dem Taktgatter ein Taktsignal zu, das gegenüber dem Datentaktsignal um 180° phasenverschoben ist. Die hohen Pegel des Taktsignals definieren dann ein sich periodisch öffnendes Taktfenster. Das Taktgatter schaltet dann einfach durch und lässt die Signale passieren. Die Phasenverschiebung ist so gewählt, dass das Signal durch einen Flusswechsel vom Datengatter durchgelassen wird, wenn es ein Datenbit darstellt. Andererseits passiert das Signal das Taktgatter, wenn es ein Taktbit darstellt. Wie man aus der Abbildung 25.8 ersehen kann, gibt das Datengatter somit die ursprünglich kodierten Datenbits ab, und die Dekodierung ist somit ausgeführt worden. Die durch das Taktfenster laufenden Taktbits dienen zur Aufrechterhaltung der Synchronisation, wenn die Datenbits gleich Null sind und dadurch keine Datensignale am Datengatter auftreten. Bei gesetztem Datenbit verwendet der MFM-Dekoder die Datenbits zur Aufrechterhaltung der Synchronisation. Dies ist wichtig, wenn viele gesetzte Bits hintereinander auftreten, wie z.B. 512 Bytes mit dem Wert ffh.
25.5.2 Synchronisation Der heikelste Punkt beim MFM-Aufzeichnungsverfahren ist, dass die Synchronisation durch die teilweise fehlenden Taktbits etwas schwieriger wird. Wie oben bereits erwähnt worden ist, tritt ein Taktbit nur dann auf, wenn mindestens zwei 0-Bits hintereinander erscheinen. Aus diesem Grund besitzen die Synchronisationsfelder der Spuren und Sektoren alle den Wert 00h (siehe Abbildung 25.9). Disketten, die für das MFM-Verfahren benutzt werden sollen, werden mit längeren Synchronisationsfeldern formatiert, als das bei FM-Disketten geschieht: Beim MFM-Verfahren sind die SYNC-Felder typischerweise 12 Byte, beim FM-Verfahren dagegen nur 6 Byte lang (siehe Abbildung 25.9). Auch die Werte für IAM, IDAM und DAM im Sektorformat erzeugen beim MFM-Verfahren Bitmuster, die der Controller einfach und vor allem zuverlässig dekodieren kann, um die entsprechenden Bitfolgen als Adressmarken zu identifizieren. In einem Sektor sind nicht nur die 512 Daten-Bytes vorhanden, sondern die Spuren und Sektoren weisen noch viele andere Bytes zur Adressierung und Synchronisation auf. Eine Spur beginnt stets mit dem GAP 4A (links in der Abbildung 25.9). Diese Lücke enthält 80 Bytes mit dem Wert 4eh, der auch in allen anderen GAPs zu finden ist. Den Anfang einer Spur zeigt eine Diskette zwar an, was aber viel zu ungenau ist, um den Beginn exakt genug festlegen zu können. Zwei Datenbits liegen auf einer 5¼"-Diskette mit 15 Sektoren je Spur nur etwa 2 µm auseinander, und eine solche Präzision lässt sich durch ein simples Loch mit einem Durchmesser von 1 mm nicht erreichen. Das Muster der 80 4eh-Bytes zeigt daher dem Controller den Beginn einer Spur genauer an und lässt ihm gleichzeitig genügend Zeit, damit seine Elektronik auf den Spurbeginn reagieren kann. Die nächsten 12 Bytes SYNC mit dem Wert 00h dienen zur Synchronisation des Controllers mit der Drehbewegung der Diskette. Die einzelnen Bits laufen ja unter dem Schreib-/Lesekopf hindurch und erzeugen durch elektromagnetische Induktion ein Impulsmuster für den Controller. Er muss sich also zunächst auf den Takt dieses Musters einstellen, da geringfügige Drehzahlschwankungen nicht zu vermeiden sind. Alle Synchronisationsmuster auf der Diskette bestehen aus einer 12-Byte-Kette mit dem Wert 00h. Die vier Bytes der Indexadressmarke IAM signalisieren dem Controller, dass nun die Sektoren der Spur folgen, wobei anschließend noch einmal eine Lücke, nämlich GAP 1, folgt. Die IAM
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
861
Sektoren 2...15
EOT
GAP 4B
CRC
GAP 3
Daten
CRC
DAM
SYNC
GAP 2
ID CRC
IDAM
SYNC
IAM
Sektor 1 GAP 1
SYNC
GAP 4A
Spurbeginn
GAP 3
besteht aus drei Bytes mit dem Wert a1h und einem vierten Byte fch, das die Adressmarke als Indexadressmarke definiert. Die Indexadressmarke kennzeichnet den Beginn der Spur wesentlich genauer als etwa das Indexloch in der Diskette.
MFM-Sektorformat
FM-Sektorformat
Spurbeginn
Spurbeginn
GAP 4A: SYNC: IAM: GAP 1: Sektor SYNC: IDAM: ID: CRC: GAP 2: SYNC: DAM:
80 Byte 4eh 12 Byte 00h 4 Byte c2h c2h c2h fch 50 Byte 4eh
Daten: CRC: GAP 3:
12 Byte 00h 4 Byte a1h a1h a1h feh 4 Byte tr hd sc sz*) 2 Byte CRC-Wert 22 Byte 4eh 12 Byte 00h 4 Byte a1h a1h a1h fbh oder 4 Byte a1h a1h a1h f8h 512 Daten-Byte 2 Byte CRC-Wert 80 Byte 4eh
EOT GAP 4B:
xx Byte 4eh
GAP 4A: SYNC: IAM: GAP 1: Sektor SYNC: IDAM: ID: CRC: GAP 2: SYNC: DAM:
40 Byte ffh 6 Byte 00h 1 Byte fch 26 Byte ffh
Daten: CRC: GAP 3:
6 Byte 00h 1 Byte feh 4 Byte tr hd sc 2 Byte CRC-Wert 11 Byte ffh 6 Byte 00h 1 Byte fbh oder 4 Byte f8h 512 Daten-Byte 2 Byte CRC-Wert 40 Byte ffh
EOT GAP 4B:
xx Byte ffh
*) die vier Bytes identifizieren den betreffenden Sektor im Format Spur(track)-Kopf(head)-Sektor(sector)-Sektorgröße(size) Abb. 25.9: Layout einer Diskettenspur
Nach diesem Spurbeginn, der bereits 146 Byte belegt, beginnt der Bereich mit den Sektoren. Jeder Sektor besteht aus zehn Abschnitten. Der erste stellt ein Synchronisationsmuster SYNC dar, das wie beim Spurbeginn aus 12 Bytes mit dem Wert 00h besteht. Auf SYNC folgt die ID-Adressmarke (IDAM), die den Beginn des Identifizierungsfeldes für den betreffenden Sektor anzeigt. Die IDAM besteht aus drei Bytes a1h und einem Byte feh. Nach der ID-Adressmarke findet der Controller die Sektoridentifizierung oder kurz ID. Sie identifiziert den betreffenden Sektor im Format Spur-Kopf-Sektor-Sektorgröße. Wenn eine Diskette formatiert wird, wird für jede zu formatierende Spur ein Formatpuffer für die Sektoren bereitgestellt, der genau diese Angaben enthält. Der Controller berechnet bei der Formatierung aus den vier Bytes der IDAM und der Sektoridentifizierung ID einen CRC-Prüfwert, der in den zwei Bytes des Abschnitts CRC abgelegt wird. CRC ist die Abkürzung für Cyclic Redundancy Check oder zyklische Redundanzprüfung und dient ähnlich wie die Parität zur Konsistenzprüfung von Daten. Auf das CRC-Feld folgt erneut eine Lücke, nämlich GAP 2 mit einer Länge von 22 Bytes. GAP 2 ist notwendig, da der Controller aus den zuvor gelesenen Bytes IDAM, ID und CRC zuerst einen CRC-Prüfwert berechnen und mit dem abgespeicherten CRC-Wert auf Konsistenz hin vergleichen muss. Da dies eine gewisse Zeit dauert, wären die nun folgenden Werte ohne diese Lücke bereits unter dem Kopf hindurchgelaufen.
Sandini Bib 862
Kapitel 25
Auf GAP 2 folgt wieder ein Synchronisationsfeld SYNC, um dem Controller nach der CRCBerechnung eine erneute Synchronisation mit der Diskettendrehung zu ermöglichen. Die Datenadressmarke DAM zeigt anschließend den Beginn des Sektordatenbereichs Daten an, also die 512 Bytes, die als physikalischer Sektor auf den Datenträger geschrieben werden. Neben den standardmäßigen 512 Bytes sind aber auch andere Werte für den Sektordatenbereich möglich, was beim Formatieren der Spur definiert werden kann. Gültige Größen sind 128, 256, 512 Byte bis 16 KByte. Große Werte können zu Schwierigkeiten bei der Synchronisation führen, da der Controller beim Lesen oder Schreiben eines Sektors lange Zeit ohne Synchronisationsmuster SYNC auskommen muss. Bei kleinen Sektorgrößen wird Speicherplatz verschwendet, weil der Controller auf der Diskette für jeden Sektor, ob groß oder klein, die oben genannten und noch folgenden Datenfelder anlegt. Ähnlich wie für IDAM und ID berechnet der Controller auch für den Sektordatenbereich einen CRC-Prüfwert und speichert diesen in CRC hinter dem Feld Daten ab. Beim Lesen eines Sektors wird der Prüfwert erneut errechnet, und der Controller vergleicht den berechneten mit dem gespeicherten Wert. Als Abschluss des Sektors ist nochmals eine Lücke – jetzt GAP 3 – vorgesehen. Ein Sektor ist damit nicht nur 512 Byte lang, sondern kann durch die ganzen Marken, die der Controller automatisch schreibt, bis auf 654 Byte anwachsen. Dies mag verdeutlichen, weshalb die formatierte Diskettenkapazität auch geringer als die unformatierte ausfällt. Die Lücke GAP 3 hat eine besondere Aufgabe: Da die Aufzeichnung der Daten eine recht heikle Angelegenheit ist und präzise ausgeführt werden muss, soll GAP 3 als elastischer Puffer zwischen zwei Sektoren wirken. Hat das Laufwerk durch thermische Verformungen, Drehzahlschwankungen oder nicht ganz korrekte Timings der Schreibsignale versehentlich einen Sektor wie ein Gummiband etwas auseinander gezogen, dann verhindert GAP 3, dass die Daten des betreffenden Sektors mit den Daten des nächsten Sektors überlappen und dort Schaden anrichten. Ein solches Auseinanderziehen kann z.B. dann verursacht werden, wenn die Drehzahl der Diskette durch verminderte Reibung plötzlich etwas ansteigt. Der Controller hatte aber vorher durch SYNC vor DAM die Schreibgeschwindigkeit auf eine bestimmte Drehzahl eingestellt, die er während des gesamten Sektors beibehält. Die erhöhte Drehzahl führt zu einem geringfügigen Auseinanderziehen des Sektordatenbereichs, der bis zu 5% betragen kann, ein Wert, der technisch in keiner Weise bedenklich ist. Auf den beschriebenen Sektor folgen nun die anderen Sektoren der Spur. Nach insgesamt acht bis 18 Sektoren ist eine Umdrehung vollendet, der Controller stößt auf mehr oder weniger Bytes mit dem Wert 4eh, die als GAP 4B zwischen dem Ende der Spur EOT und dem Spurbeginn liegen. Die Zahl ist nicht genau festgelegt, vielmehr dient GAP 4B als elastischer Puffer zwischen Ende und Beginn der Spur, wie es in ähnlicher Art und Weise für GAP 3 zwischen den Sektoren gilt.
25.6 Logische Organisation Wie bereits erwähnt wurde, benutzt das BIOS die physikalischen Sektoren zur Datenorganisation. DOS selbst und auch andere Betriebssysteme verwenden das hiervon abweichende Schema der so genannten logischen Sektoren. Den physikalischen Sektoren wird dazu eine fortlaufende Nummer zugeordnet, die mit 0 beginnt. Das Schema lautet also: Dem ersten physikalischen Sektor, d.h. dem Sektor mit der physikalischen »Adresse« Kopf 0, Zylinder 0, Sektor 1, wird die logische Sektorennummer 0 zugeordnet. Nun werden die Sektoren der Seite 0 fortlaufend hochgezählt. Anschließend fährt man mit Seite 1 bzw. Kopf 1 fort. Dieses Schema setzt sich fort, bis die letzte Seite erreicht ist. Wenn man die Zählung in gleicher Weise mit der nächsten Spur fortsetzt, so wird jedem physikalischen Sektor eine Nummer, nämlich der logische Sektor, zugewiesen.
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
863
Beispiel: Zweiseitige Diskette mit 80 Spuren und 18 Sektoren je Spur, entsprechend einer 3½"Diskette mit 1,44 MByte Speicherkapazität. physikalischer Sektor
logischer Sektor
Kopf 0, Spur 0, Sektor 1 ......................... Kopf 0, Spur 0, Sektor 18 Kopf 1, Spur 0, Sektor 1 ......................... Kopf 1, Spur 0, Sektor 18 ......................... Kopf 0, Spur 1, Sektor 1 ......................... ......................... Kopf 1, Spur 79, Sektor 18
0 ............ 17 18 ............ 35 ............ 36 ............ ............ 2879
Die Diskette weist insgesamt 2880 Sektoren zu 512 Bytes auf, was eine Speicherkapazität von 1,44 MByte ergibt. Die logischen Sektoren sind auf Disketten und auch auf Festplatten die kleinsten direkt adressierbaren Dateneinheiten, die stets als Ganzes gelesen oder geschrieben werden können. Die Abbildung physikalischer Sektoren auf logische Sektoren mit fortlaufender Nummer gilt aber nur für Disketten. Festplatten besitzen eine Besonderheit, die Partition.
25.6.1 Der Aufbau von Partitionen
4. Par tition
3. Par tition
2. Par tition
1. Par tition
Bei Festplatten sind die Steuerelektronik und die Mechanik meist teurer als der eigentliche Datenträger. Es ist also nahe liegend, nur eine große Festplatte für mehrere Betriebssysteme zu verwenden, statt jedem Betriebssystem eine eigene Festplatte zuzuordnen. Außerdem können die Controller-Hardware und das BIOS nur eine beschränkte Zahl von Festplatten verwalten. Ein Problem dabei ist, dass die Datenstrukturen von DOS und beispielsweise Linux vollkommen unverträglich sind. Daher ist jedem Betriebssystem ein bestimmter Abschnitt der Festplatte zuzuweisen, der exklusiv vom jeweiligen Betriebssystem benutzt und verwaltet wird. Einen solchen Abschnitt nennt man Partition (siehe Abbildung 25.10). Wie bereits erwähnt, werden die Spuren von übereinander liegenden Platten als Zylinder bezeichnet.
Spur 0
Kopf 0
Platte 1 Kopf 1 Kopf 2
Platte 2
Kopf 3 Kopf 4
Platte 3
Kopf 5
Zylinder 0 Zylinder 1
Abb. 25.10: Eine Festplatte wird in Partitionen unterteilt, die üblicherweise an Zylindergrenzen beginnen und enden.
Die Information, ob überhaupt mehrere Betriebssysteme vorhanden sind und wie groß gegebenenfalls die jeweils zugewiesenen Partitionen sind, muss irgendwo gespeichert werden. Diese
Sandini Bib 864
Kapitel 25
Information ist für eine bestimmte Festplatte spezifisch, und es liegt nahe, sie auf der Festplatte selbst abzulegen. Für die Speicherung der Partitionsinformation wird eine eindeutig bestimmbare und auf jeder Platte vorhandene Stelle ausgewählt: Kopf 0, Spur 0, Sektor 1; das ist der erste physikalische Sektor der Festplatte. Festplatten können unterschiedlich groß sein und somit eine nahezu beliebige Kombination von Kopfzahl, Spuren und Sektoren aufweisen. Der letzte Sektor auf der Platte scheidet somit aus, weil seine Adresse Kopf, Spur, Sektor von Platte zu Platte verschieden ist. Im ersten physikalischen Sektor, dem Partitionssektor, wird also die Information über die einzelne(n) Partition(en) durch Partitionseinträge in einer Partitionstabelle abgelegt. Disketten besitzen demgegenüber keine Partitionstabelle, weil es bei ihrer im Vergleich zu Festplatten geringen Kapazität nichts einzusparen gibt und der Datenträger ja wechselbar ist. In Abbildung 25.11 ist der Aufbau von Partitionssektor, Partitionstabelle und Partitionseintrag dargestellt. Die Partitionstabelle ist 64 Byte lang und kann Daten für maximal vier Partitionen aufnehmen, die in umgekehrter Reihenfolge abgelegt werden. Partitionstabelle
Programm zum Prüfen der Partitionstabelle und Aufrufen des Bootsektors (446 Bytes)
01beh/446
(64 Bytes)
Partitionstabelle 01feh/510 Signatur (stets aa55h)
512 Bytes
Partitionssektor 00h/0
Offset ab Größe Sektorbeginn (Bytes) 1beh (446) 1ceh (462) 1deh (478) 1eeh (494)
16 16 16 16
Inhalt Partition 4 Partition 3 Partition 2 Partition 1
(2 Bytes)
Struktur eines Partitionseintrages Offset ab Größe Sektorbeginn (Bytes) 00h (0) 01h (1) 04h (4) 05h (5) 08h (8) 0ch (12)
1 3 1 3 4 4
Inhalt Bootindikator1) Beginn der Partition Systemindikator2) Ende der Partition Startsektor relativ zum Anfang der Platte 3) Zahl der Sektoren in der Partition 3)
80h=bootfähig (aktiv), 00h=nicht bootfähig (inaktiv) 0=keine DOS-FAT 1=DOS mit 12-Bit-FAT 4=DOS mit 16-Bit-FAT 5=erweiterte DOS-Partition (ab DOS 3.30) 6=DOS-Partition größer als 32MByte (ab DOS 4.00) 3) Intel-Format low-high 1) 2)
Beginn/Ende der Partition Offset:
01h
02h
K7 K6 K5 K4 K3 K2 K 1 K0 Z9 Z8 S5 S4 S3 S2 S1 S0
Kopf K7 ..... K0
Zylinder Z9 ..... Z0
03h Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0
Sektor S5 ..... S0
Abb. 25.11: Partitionssektor, Partitionstabelle und Partitionseintrag am Beispiel von DOS
Der Partitionssektor enthält neben der Partitionstabelle noch ein kleines Programm mit maximal 446 Byte Länge sowie die 2-Byte-Signatur 0aa55h. Beim Einschalten des PC ruft das BIOS das Programm im Partitionssektor auf, das die innere Konsistenz der Einträge in der Partitionstabelle prüft und anschließend die Laderoutine für das Betriebssystem im Bootsektor (siehe unten)
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
865
aufruft. Ist die Partitionstabelle beschädigt oder inkonsistent, gibt das Programm eine Fehlermeldung aus und bricht den Ladevorgang ab. Festplatten mit beschädigtem Partitionssektor sind unbrauchbar, weil dem Betriebssystem dann keinerlei Informationen darüber zur Verfügung stehen, wo welche Partition beginnt und aufhört. In der Partitionstabelle sind die Einträge für maximal vier Partitionen gespeichert, sie geben die physikalischen Anfangs- und Endsektoren der jeweiligen Partitionen in einem komprimierten 3-Byte-Format an (Abbildung 25.11 unten). Befinden sich mehrere Betriebssysteme in getrennten Partitionen auf der Festplatte, so muss der PC beim Booten feststellen können, welches der verschiedenen Systeme geladen werden soll. Dazu dient der Bootindikator: Ein Eintrag 80h bezeichnet eine bootfähige, aktive Partition, ein Eintrag 00h eine nicht bootfähige, inaktive Partition. Das kleine Programm am Anfang des Partitionssektors stellt beim Booten fest, wo sich die bootfähige Partition befindet, und aktiviert dann deren Laderoutine. Der Systemindikator zeigt an, welches Dateisystem mit oder ohne FAT auf der Platte vorhanden ist. Die Aufgabe und Bedeutung der FAT werden weiter unten erläutert. Beispiel: Ende der Partition bei 04 a2 60 Kopf: 04h = 4 dezimal Zylinder: a2h = 10100010b 60h = 01100000b Die beiden höchstwertigen Bits 10 von a2h und 01 von 60h führen addiert zu 1001100000b= 260h = 608. Sektor:
sechs niederwertige Bit von a2h ergeben 100010b = 22h = 34
Das Ende der Partition damit bei Kopf 4, Zylinder (Spur) 608, Sektor 34.
Die beschriebene Abbildung auf logische Sektoren findet nun innerhalb der Partition statt: Dem ersten Sektor der Partition wird die logische Sektornummer 0 zugeordnet. Anschließend findet in gleicher Weise wie bei Disketten eine Abbildung der physikalischen Sektoren auf logische Sektoren statt, bis der letzte Sektor der betreffenden Partition – gekennzeichnet durch Kopf, Spur und Sektor in der Partitionstabelle – erreicht ist. Etwas salopp könnte man auch sagen, dass die Partitionstabelle die Festplatte in kleinere »Disketten« unterteilt, so dass das jeweilige Betriebssystem nur Zugriff auf die ihm zugeordnete Diskette hat. 00h/0
e9xxxxh oder ebxx90h
(3 Bytes)
OEM-Name und Nummer
(8 Bytes)
15h/21 16h/22
Bytes pro Sektor Sektoren pro Zuweisungseinheit (Cluster) reservierte Sektoren (für Boot-Record) Anzahl der FATs Anzahl der Stammverzeichniseinträge Anzahl der logischen Sektoren Medium-Deskriptor-Byte Sektoren pro FAT
(2 Bytes) (1 Byte) (2 Bytes) (1 Byte) (2 Bytes) (2 Bytes) (1 Byte) (2 Bytes)
18h/24
Sektoren pro Spur
(2 Bytes)
1ah/26 1ch/28
Anzahl der Köpfe Anzahl der verborgenen Sektoren
(2 Bytes) (2 Bytes)
03h/3 0bh/11 0dh/13 0eh/14 10h/16 11h/17 13h/19
1eh/30 Programm zum Laden des Betriebssystems (DOS)
Abb. 25.12: Bootsektor
Sandini Bib 866
Kapitel 25
Der Schlüssel für die Boot-Fähigkeit liegt im so genannten Bootsektor oder Boot-Record. Er belegt den ersten Sektor einer Diskette (Kopf 0, Spur 0, Sektor 1) oder einer Partition, d.h. den Startsektor der Partition. Die Struktur eines Bootsektors ist in Abbildung 25.12 angegeben. Ähnlich wie die Partitionstabelle einer Festplatte befindet sich auch der Bootsektor an einer klar definierten und bei allen Disketten oder Partitionen vorhandenen Stelle auf dem Datenträger. DOS und BIOS können somit den Bootsektor adressieren und lesen, ohne den genauen Datenträgertyp kennen zu müssen.
mv
erze
ichnis
B oo tsek t or Stamm ver zei ch n
h ereic teib Da
is
mv
Dateibereich
eich
Stamm
erz
AT 1. F
am St
ver zei ch Date n is iber eic h
am St
nis eich erz mv am reich t e S teib Da
nis 1. F AT Stamm ver zei ch n
Dateibereich
is
am St
2.FA T Date iber eic h
AT 2. F ichnis erze mv
Abb. 25.13: Auf einer Diskette befinden sich von außen nach innen der Bootsektor, die beiden FAT-Kopien und das Stammverzeichnis. Daran schließt sich der Dateibereich an, der die Diskette bis zum innersten Zylinder ausfüllt.
Dem Betriebssystem ist nun durch die Einträge im Bootsektor bekannt, wie groß die Speicherkapazität der Diskette oder Partition ist, wie viele Spuren, Sektoren pro Spur und Byte je Sektor vorhanden sind. Ein Datenverwaltungssystem lässt sich damit aber noch nicht organisieren. Jede Diskette oder Partition unter DOS besitzt dazu neben dem Bootsektor und der Partitionstabelle zwei weitere fest definierte Abschnitte: das Stammverzeichnis, das auch als »\« bezeichnet wird, und die FAT. 00h/0
0bh/11 0ch/12
(ASCII, 8 Bytes)
Erweiterung
(ASCII, 3 Bytes) (1 Byte)
Attribut
(10 Bytes)
reserviert 16h/22 18h/24 1ah/26 1ch/28
Uhrzeit Erstellung/Änderung
(2 Bytes)
Datum Erstellung/Änderung
(2 Bytes)
Startcluster
(binäre Ganzzahl, 2 Bytes)
Dateilänge
(binäre Ganzzahl, 4 Bytes)
32 Bytes
08h/8
Dateiname
Abb. 25.14: Aufbau von Stamm- und Unterverzeichnissen
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
867
Für die Datenverwaltung ist es notwendig, dass das Betriebssystem den Anfang des Datenspeicherbereiches kennt. Hierzu dient das Stammverzeichnis. Es beginnt unmittelbar nach dem Bootsektor und den FATs (siehe Abbildung 25.13). Im Stammverzeichnis werden die erforderlichen Informationen über Lage, Größe, Datum und Uhrzeit der letzten Änderung der Dateien und Unterverzeichnisse sowie bestimmte Attribute in Form eines Verzeichniseintrags gespeichert. In Abbildung 25.14 ist der Aufbau eines solchen 32-Byte-Eintrags gezeigt.
25.7 Dateizuordnungstabelle – FAT Den Dateien bzw. den Unterverzeichnissen wird ein Cluster zugewiesen, dessen Nummer im Verzeichniseintrag als Startcluster gespeichert ist. Zur Erinnerung: Ein Cluster fasst mehrere Sektoren logisch zu einer Einheit (Zuweisungseinheit) zusammen. Bei einer Diskette besteht ein Cluster lediglich aus einem Sektor, bei Festplatten mit weniger als 128 MByte aus vier Sektoren und bei Festplatten mit mehr als 1024 MByte aus 64 Sektoren entsprechend 32 KByte. Verzeichniseintrag Name
Startcluster 24 (18h)
Erw
rw Ve
FAT
eis
548 (0224h)
Zuo
rdn
ung
Ve r
we
Cl u
is
er st
24
Clu ste r
48 9
54 8
er
ng
42 8
489 (01e9h)
ter Clus
eis Verw ng rdnu Zuo Zuordn u
65535 (ffffh)
s Clu
t
ung
rdn
Zuo 428 (01ach)
eis
w Ver
Abb. 25.15: Jedem Cluster ist ein FAT-Eintrag zugeordnet, und jeder FAT-Eintrag verweist auf den nächsten Cluster in der Kette.
Eine zentrale Rolle für die Datenverwaltung spielt dabei die Dateizuordnungstabelle, die auch als FAT – File Allocation Table – bezeichnet wird. Die FAT liegt zwischen Bootsektor und Stammverzeichnis (siehe Abbildung 25.13), und sie wird beim Formatieren des Mediums automatisch angelegt. Ihre Zerstörung führt im Allgemeinen zu einem vollständigen Datenverlust auf dem Datenträger. Jede Diskette oder Festplatte besitzt daher üblicherweise zwei oder mehr FAT-
Sandini Bib 868
Kapitel 25
Kopien. Die genaue Zahl ist im Bootsektor ab Offset 10h abgelegt. Ab Offset 16h ist die Größe einer FAT in Sektoren angegeben. Für die FATs stehen verschiedene Formate zur Verfügung: 12-Bit-, 16-Bit- und ab Windows 95 (Version 950b) eine 32-Bit-FAT. Im ersten Fall ist jedem Cluster eine 12-Bit-Zahl zugeordnet, im zweiten eine 16-Bit-Zahl und im dritten eine 32-Bit-Zahl (wobei aber nur die 28 niederwertigen Bits benutzt werden, die vier höherwertigen sind reserviert), die jeweils mit Null beginnend nummeriert werden. Die ersten beiden Zahlen, d.h. 0 und 1, sind reserviert und werden von einer Kopie des MediumDeskriptor-Bytes sowie bei einer 12-Bit-FAT mit zwei oder bei einer 16-Bit-FAT mit drei Byte mit dem Wert 0ffh belegt. Ab FAT-Nummer 2 werden die Cluster in umkehrbar eindeutiger Weise den Cluster-Nummern zugeordnet: Cluster-Nummer 2 ist dem FAT-Eintrag Nummer 2 zugeordnet, Cluster-Nummer 3 dem FAT-Eintrag Nummer 3 usw., die Cluster-Zählung beginnt also mit 2 und nicht mit 0. Einer Datei mit beispielsweise 16 KByte muss DOS bei einer Cluster-Größe von vier Sektoren, d.h. 2048 Byte oder 2 KByte, demnach also acht Cluster zuweisen. Im Verzeichniseintrag ist aber nur der Beginn, nämlich der erste Cluster, der Datei angegeben. Es fehlt also noch die Information, wo die Datei fortgesetzt wird, d.h. ein Verweis auf den 2. bis 8. Cluster. Diese Aufgabe erledigt die FAT. In Tabelle 25.2 sind die Bedeutung der einzelnen FAT-Einträge angegeben. 12-Bit-FAT
16-Bit-FAT
32-Bit-FAT
Bedeutung
000h ff0h–ff6h ff7h ff8h–fffh xxxh
0000h fff0h–fff6h fff7h fff8h–ffffh xxxxh
00000000h 0ffffff0h–0ffffff6h 0ffffff7h 0ffffff8h–0fffffffh 0xxxxxxxh
frei reserviert Sektor schadhaft, für eine Zuweisung nicht verwendbar Ende der Clusterkette, letzter Cluster der Datei nächster Cluster der Datei
Tab. 25.2: FAT-Einträge
Eine wesentliche Bedeutung für die Zuweisung von Clustern haben die Werte xxxxh: Sie geben die Nummer des Clusters an, der den nachfolgenden Abschnitt der Datei oder des Verzeichnisses aufnimmt. Wenn die Datei nur zwei Cluster belegt, sie also nicht größer als 4096 Byte ist, dann besitzt der FAT-Eintrag, der diesem Cluster mit dem nachfolgenden Dateiabschnitt zugeordnet ist, einen Wert zwischen ff8h und fffh bzw. fff8h und ffffh oder 0ffffff8h und 0fffffffh. Ist die Datei oder das Verzeichnis größer, so setzt sich diese Form der Verkettung fort, bis ausreichend viele Cluster für die Aufnahme aller Datei- oder Verzeichnisabschnitte zugeordnet worden sind. Das erklärt auch die Bezeichnung Dateizuordnungstabelle. Im angegebenen Beispiel sind also sieben Verweise auf Cluster mit dem jeweils nachfolgenden Abschnitt sowie ein Wert fff8 bis ffffh vorhanden. Es ergibt sich eine so genannte Cluster-Kette (oder Cluster-Chain, siehe Abbildung 25.16). Die Cluster-Chain ist dabei stets vorwärtsgerichtet. Alle FAT-Einträge verweisen also auf den nächsten Cluster, und es sind keine Rückverweise auf den vorangegangenen Cluster gespeichert.
1. Cluster (#34)
2. Cluster (#35)
3. Cluster (#1421)
4. Cluster (#1422)
5. Cluster (#1423)
6. Cluster (#2485)
7. Cluster (#276)
Cluster-Kette
35 (0023h)
1421 (058dh)
1422 (058eh)
1423 (058fh)
2485 (09b5h)
276 (0114h)
65535 (ffffh)
zugeordnete FAT-Einträge
Abb. 25.16: Cluster-Chain
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
869
Nach der Formatierung haben alle FAT-Einträge mit Ausnahme der ersten drei bzw. vier Bytes den Wert 00h. Das bedeutet, dass in den entsprechenden Clustern keine Dateien und Verzeichnisse gespeichert sind. Das Gleiche gilt natürlich auch für gelöschte Dateien oder Verzeichnisse. Wenn eine Datei oder auch ein Verzeichnis gelöscht wird, wird zunächst nur das erste Zeichen im entsprechenden Verzeichnis mit dem Wert 229 überschrieben. Anschließend setzt DOS alle FAT-Einträge der Cluster-Kette, die der Datei bzw. dem Verzeichnis zugeordnet ist, auf den Wert 0h. Es wird also nicht der »physikalische« Inhalt einer Datei gelöscht, da bloß das erste Zeichen im Verzeichniseintrag sowie die FAT-Einträge überschrieben werden, sondern die logische Struktur der Datei oder des Verzeichnisses. Der Vorteil ist einmal, dass der Löschvorgang sehr schnell abläuft, es müssen ja nur die Einträge im Verzeichnis und der FAT, nicht aber die gesamte Datei mit den Löschzeichen überschrieben werden. Wenn Sie z.B. eine 10-MByte-Datei bei einer Cluster-Größe von vier Sektoren löschen, muss DOS oder Windows 95 statt der gesamten 10 MByte nur ca. 10 KByte in der FAT und ein Byte im Verzeichniseintrag überschreiben – das entspricht einem Tausendstel der Dateigröße. Der zweite Vorteil ist, dass sich versehentlich gelöschte Dateien und Verzeichnisse mit bestimmten Disk-Tools (Norton-Utilities o.Ä.) wiederherstellen lassen. Dies funktioniert aber nur, wenn die Programme die zuvor gelöschte logische Struktur wieder aufbauen können, d.h., seit dem Löschen sollte keine Speicherung von neuen Daten stattgefunden haben.
25.7.1 Fragmentierung Zunächst folgen die Cluster regelmäßig aufeinander, obwohl dies nicht unbedingt erforderlich ist. Vielmehr ist es gerade die Stärke des FAT-Konzepts, dass die Verkettung auch funktioniert, wenn die Cluster quasi regellos verteilt sind. Solche Dateien bezeichnet man dann als fragmentiert. Die FAT-Einträge stellen dann sicher, dass aufeinander folgende Abschnitte der Datei oder des Verzeichnisses logisch miteinander verknüpft sind. Die Fragmentierung ist ein ganz normaler Vorgang, der zwangsläufig auftritt, weil Dateien auf einer Festplatte eben oftmals gelöscht und neue geschrieben werden. Dabei passt eine neue Datei, die größer ist als eine zuvor gelöschte, eben nicht in den zuvor freigewordenen Platz hinein, so dass die neue Datei »verstreut« abgelegt wird. Dies ist auch der Grund dafür, warum man eine Festplatte regelmäßig defragmentieren (Programm Defrag o.Ä.) sollte, denn durch diesen Vorgang werden die zu einer Datei gehörenden Daten wieder in zusammenhängenden Clustern angeordnet, was zu einer ganz beachtlichen Beschleunigung des Festplattendatenzugriffs führen kann. Diese Fragmentierungen können allerdings auch bei der Wiederherstellung von gelöschten Dateien und Verzeichnissen unangenehme Folgen haben. Wiederherstellungsprogramme überschreiben im Verzeichniseintrag den Löschindikator wieder mit dem ersten Zeichen des Dateioder Verzeichnisnamens und versuchen automatisch die Cluster-Chain in der FAT aufzubauen. Das funktioniert natürlich nur dann automatisch korrekt, wenn die Cluster schön hintereinander abgelegt waren. Bei stark fragmentierten Dateien ist der Versuch, hier wieder eine Ordnung hineinzubringen, (fast) aussichtslos und hängt von der Intelligenz der eingesetzten Disk-Tools ab. Zur Verdeutlichung: Es gibt mehr als 3,6 Millionen Möglichkeiten, zehn Cluster hintereinander anzuordnen. Bei einer Clustergröße von vier Sektoren entspricht das einer maximalen Dateigröße von nur 20 KByte. Für eine 10-MByte-Datei übersteigt die Zahl der Möglichkeiten bei weitem die Zahl der Atome im Universum.
Sandini Bib 870
Kapitel 25
25.8 32-Bit- und andere Dateizuordnungstabellen Die FAT ist also ein bedeutendes Instrument zur Dateizuordnung. Ohne FAT wäre es bei fragmentierten Dateien unmöglich, den Cluster des jeweils nächsten Abschnitts einer Datei oder eines Verzeichnisses zu ermitteln. Die FAT liegt zur Sicherheit daher meist in Form zweier Kopien vor. Der Systemindikator in der Partitionstabelle zeigt an, um welche Art von FAT (12, 16, 32 Bit) es sich dabei handelt. Mit einer 12-Bit-FAT lassen sich nach Abzug der reservierten und unbenutzten Werte 4077 Cluster bedienen, mit einer 16-Bit-FAT 65.517. Die 32-Bit-FAT gibt es ab der Version 950b von Windows 95. Sie wurde als Reaktion auf die immer größer werdenden Festplatten und die damit steigende Cluster-Größe (zuletzt 32 KByte für Festplatten ab 1024 MByte) eingeführt. Die 16-Bit-FAT beschränkt die Größe der verwaltbaren Partitionen selbst bei einer Cluster-Größe von 32 KByte auf 2048 MByte = 2 GByte. Das ist heutzutage eindeutig zu wenig. Dagegen ermöglichen die 28 niederwertigen Bits der 321-Bit-FAT 228 = 256 Millionen Cluster. In der Tabelle 25.3 ist eine Zusammenfassung der Cluster-Größen und Festplattenkapazitäten für 16-Bit- und 32-Bit-FAT-Systeme angegeben. 16-Bit-FAT:
32-Bit-FAT:
Kapazität
Cluster-Größe
Kapazität
Cluster-Größe
16...128 MByte 128...256 MByte 256...512 MByte 512...1024 MByte 1024...2048 MByte
2 KByte = 4 Sektoren 4 KByte = 8 Sektoren 8 KByte = 16 Sektoren 16 KByte = 32 Sektoren 32 KByte = 64 Sektoren
0...6 GByte 6...16 GByte 16...32 GByte 32...2048 GByte
4 KByte = 8 Sektoren 8 KByte = 16 Sektoren 16 KByte = 32 Sektoren 32 KByte = 64 Sektoren
Tab. 25.3: Festplattenkapzitäten und Cluster-Größen
Durch die »feste Verwaltung« verändert sich die Cluster-Größe mit der Größe der Festplattenpartition, was bedeutet, dass bei der maximalen FAT-16-Partitionsgröße von 2 GByte ein Cluster eine Größe von 32 KByte aufweist. Da nun ein Cluster die kleinste Speichereinheit darstellt, belegt dann selbst eine nur 1 Byte große Datei einen Speicherplatz von 32 KByte. Bei einer Festplatte, die eine Partitionsgröße von 128 MByte aufweist, ist die Datei CONFIG.SYS beispielsweise 0,5 KByte groß. Doch da ein Cluster hier immer 2 KByte groß ist, belegt diese Datei damit auch 2 KByte auf der Festplatte, was einer Verschwendung von 1,5 KByte Speicherplatz (Verschnitt) gleichkommt. Noch schlimmer sieht es bei einer Partitionsgröße von 1 GByte aus, denn hier besteht ein Cluster aus 32 KByte, und die gleiche CONFIG.SYS führt damit zu einem Verschnitt von 31,5 KByte. Es ist sicher vorstellbar, dass diese »Speicherplatzverschwendung« bei vielen relativ kleinen Dateien, wie sie beispielsweise bei Datenbanken häufig vorkommen, ganz beträchtlich ausfallen kann. Tabelle 25.4 zeigt zur Verdeutlichung noch ein Beispiel. Cluster-Größe
Durchschnittlicher Verschnitt pro Datei
Anzahl der Dateien
gesamter Verschnitt
2 KByte 4 KByte 8 KByte 16 KByte 32 KByte
1 KByte 2 KByte 4 KByte 8 KByte 16 KByte
2000 4000 8000 16000 32000
2 MByte 8 MByte 32 MByte 128 MByte 512 MByte
Tab. 25.4: Ein Beispiel dafür, wie der Speicherplatz auf einer Festplatte bei verschiedenen Cluster-Größen und FAT-16-Format möglicherweise nicht ausgenutzt wird.
Sandini Bib Grundlagen der magnetischen Aufzeichnung und Datenorganisation
871
Die FAT-32 erlaubt nunmehr eine maximale Partitionsgröße von 2 TByte (2048 GByte, vgl. Tabelle 25.5). Da hier eine 32-Bit-Adressierung verwendet wird, ist dadurch aber keine Kompatibilität zum FAT-16-Format gegeben. Was jedoch für den Verschnitt auf einer Festplatte interessant ist, ist die Tatsache, dass die einzelnen Cluster-Größen geschrumpft sind und nicht mehr so viel Festplattenplatz wie mit FAT-16 verschwendet wird. Maximale Partitionsgröße
Cluster-Größe
255 MByte 8 GByte 16 GByte 32 GByte 2 TByte
512 Bytes 4 KByte 8 KByte 16 KByte 32 KByte
Tab. 25.5: Die Cluster-Größen sind bei FAT-32 wesentlich kleiner als bei FAT-16.
25.8.1 Virtual File Allocation Table – VFAT Mit der ersten Windows 95-Version wurde die Unterstützung von langen Dateinamen (max. 255) eingeführt, und die bis dato geltende Beschränkung auf 8 Zeichen (plus 3 Zeichen für die Extension) wurde aufgehoben, was eine Änderung des FAT-Formates nötig machte. Die V-FAT-Format (Virtual File Allocation Table) ist kompatibel zum FAT-16-Format und arbeitet im Protected Mode unter Windows 95.
25.8.2 New Technology File System – NTFS Windows NT und die darauf basierenden Nachfolger wie Windows 2000 und Windows XP können zwar auch für die FAT-16 und/oder die FAT-32 formatiert werden, bevorzugt sollte hierfür jedoch das leistungsfähigere NT File System (NTFS) eingesetzt werden, denn es bietet eine höhere Sicherheit und Zuverlässigkeit. NTFS erfüllt die gleichen Standardanforderungen wie Unix (POSIX.1), beispielsweise die Vergabe von Zugriffsrechten, damit nur bestimmte Personen auf die zuvor vom Systemadministrator festgelegten Dateien Zugriff haben. NT unterscheidet bei den Dateinamen – im Gegensatz zu FAT – zwischen Groß- und Kleinschreibung und registriert eine zusätzliche Zeitangabe, wann die jeweilige Datei zuletzt aufgerufen wurde. Auch für den Fehlerfall (Systemabsturz) sind besondere Vorkehrungen getroffen worden. Jede Änderung im Dateisystem wird dabei in eine Log-Datei geschrieben, die somit Informationen über alle korrekt absolvierten Transaktionen enthält. Nach einem Fehlerfall führt Windows NT beim nächsten Boot einen Check des Dateisystems (CHKDSK) aus und korrigiert gegebenenfalls die nicht korrekten Datenbestände mit Hilfe der Log-Datei bzw. lädt schadhafte Daten nicht erneut, falls keine Korrektur möglich sein sollte. Ein weiterer, für die Sicherheit relevanter Bestandteil von Windows NT ist die Master File Table (MFT), in der für jede Datei auf der Festplatte ein mindestens 2 KByte großer Datensatz geführt wird. Das Betriebssystem legt gleich mehrere Kopien von dieser Datei an. Diese Sicherheit kostet natürlich Festplattenkapazität, und daher ist es auch kaum sinnvoll, Windows NT mit NTFS auf einer Festplatte zu installieren, die nicht mindestens über eine Kapazität von 600 MByte verfügt. Auch Windows NT organisiert die Daten in Clustern, die entweder 512, 1024, 2048 oder 4096 KByte groß sind. Bei der Formatierung der Festplatte kann die gewünschte Größe optional angegeben werden. Standardmäßig verwendet NT bei der Formatierung eine von der Festplattenkapazität (Partition) abhängige Cluster-Größe, die in Tabelle 25.6 angegeben ist. Da Windows NT
Sandini Bib 872
Kapitel 25
(wie auch Windows 2000/XP) mit einem 64-Bit-Adressierungsschema arbeitet, beträgt die maximale Festplattenkapazität immense 2 hoch 64 oder 17 Milliarden GByte. Maximale Partitionsgröße
Cluster-Größe
511 MByte 1 GByte 2 GByte > 2 GByte
512 Byte 1024 Byte 2048 Byte 4096 Byte
Tab. 25.6: Die von Windows NT und den Nachfolgern standardmäßig verwendeten Cluster-Größen
25.8.3 High Performance File System – HPFS Das Betriebssystem OS/2 verwendet seit der Version 1.2 das High Performance File System (HPFS), das auch von Windows NT bis zur Version 3.5 unterstützt wurde. Ähnlich wie das NTFS erlaubt HPFS lange Dateinamen (254 Zeichen) und bietet entsprechende Sicherheitsmechanismen, unterscheidet allerdings nicht zwischen Groß- und Kleinschreibung.
Abb. 25.17: Die Organisation einer Festplatte mit dem HPFS
HPFS verwendet keine Cluster, sondern arbeitet ausschließlich mit 512 Byte großen Sektoren und organisiert diese in 8 MByte großen Einheiten. Die Wahrscheinlichkeit, dass eine Datei nicht »zerstückelt«, sondern in einem zusammenhängenden Bereich auf der Festplatte lokalisiert ist, ist daher größer als beim FAT- oder auch beim NTFS-Format. Einen Geschwindigkeitsvorteil gewinnt HPFS durch einen 2 KByte großen Bereich, der sich zwischen den 8-MByte-Abschnitten befindet. Hier sind Dateiinformationen abgelegt, die es ermöglichen, dass der Schreib-/Lesekopf nicht immer erst zur Spur 0 bewegt werden muss, falls sich Dateien geändert haben. In der Spur 0 sind die Bootroutine und die Partitionstabelle lokalisiert, sie enthält also die grundlegenden Dateiformatinformationen. Der erhöhte Verwaltungsaufwand des HPFSystems führt ebenfalls zu einem erhöhten Speicherplatzbedarf, der ungefähr dreimal größer ist als bei einem FAT-Format.
Sandini Bib
26
Festplatten
Viele PC-Anwender betrachten die Festplatte als den bedeutendsten und wertvollsten Teil Ihres Computers – was besonders dann berechtigt ist, wenn man keine Sicherungskopien der Daten erstellt und sich die gesammelten Werke der letzten drei Jahre auf der Festplatte befinden. Neben den Speicherchips und Prozessoren haben vor allem die Festplatten in den letzten zehn Jahren eine Entwicklung zu immer höheren Kapazitäten bei rasantem Preisverfall durchgemacht. Was dabei jedoch immer wieder vergessen wird, ist die Tatsache, dass es sich bei einer Festplatte um ein Verschleißteil handelt, das im Prinzip jederzeit einen Defekt aufweisen kann. Dies ist letztendlich besonders schlimm, wenn es sich um eine »hochkapazitive« Festplatte handelt, auf der sich im Laufe der Zeit eine ganze Reihe an Software angesammelt hat. Das Betriebssystem ist natürlich an die eigenen Bedürfnisse angepasst worden, und eigene Werke hat man auch noch produziert; nicht auszudenken, wenn dies alles von heute auf morgen unbrauchbar geworden ist. Eine Datensicherung ist daher absolut notwendig, und wer sich allein auf die Daten seiner Festplatte verlässt, ist leichtsinnig. Woher die Bezeichnung Festplatte stammt, ist strittig: Manche behaupten, wegen der fest eingebauten Platte, andere wiederum, weil die Platten starr, also fest sind. Eine in der Vergangenheit gebräuchliche, alternative Bezeichnung für Festplatte ist Winchester-Laufwerk, was historische Gründe hat: IBM brachte Anfang der sechziger Jahre ein schrankgroßes Plattenlaufwerk mit einer Gesamtkapazität von 60 MByte auf den Markt, bei dem 30 MByte fest installiert waren, und die anderen Platten mit 30 MByte ausgewechselt werden konnten. Zur Abkürzung bezeichnete man das Laufwerk auch als 30-30 für 30 MByte fest installierte und 30 MByte wechselbare Speicherkapazität. JohnWayne-Fans erinnern sich vielleicht daran, dass der Held stets seine Winchester 30-30 bereit hatte, und der gedankliche Weg war also nicht besonders weit, das 30-30-Laufwerk eben als Winchester zu bezeichnen. Mit Schlagbolzen oder ähnlichen Elementen hat das natürlich nichts zu tun.
26.1 Aufbau und Funktionsweise von Festplatten Die Unterschiede zwischen Diskettenlaufwerken und Festplatten sind vom Prinzip her nicht besonders groß, nur sind Letztere wesentlich leistungsfähiger. Auch bei einer Festplatte besteht der eigentliche Datenträger aus einer sich drehenden Platte, die aber im Gegensatz zu den biegsamen Disketten selbst steif ist. Die Daten sind außerdem wie bei Disketten in Spuren und Sektoren organisiert, wobei der Zugriff auf die Daten ebenfalls über Schreib-/Leseköpfe erfolgt, die von einem Aktuator bewegt werden. Dagegen ist die Mechanik und Steuerung von Festplatten wesentlich ausgeklügelter, um die höhere Kapazität und größere Leistung zu erzielen. In Abbildung 26.1 sehen Sie das Innenleben einer Festplatte. Für die Abbildung wurde der Deckel der Head-Disc-Assembly (HDA) abgenommen. Tun Sie das aber selbst niemals – Ihre Festplatte können Sie nämlich anschließend verschrotten, und alle gespeicherten Daten sind verloren. Besonders neugierigen Lesern möchte ich empfehlen, einmal auf die CeBIT zu fahren und dort an den Ständen der Festplattenhersteller die unter Glas befindlichen Laufwerke zu bewundern oder eine alte ausrangierte Festplatte zu nehmen und diese aufzuschrauben.
Sandini Bib 874
Kapitel 26
Spindelachse Platte
Aktuator Schreib-/Lesekopf
Aktuatorachse
Head-DiscAssembly (HDA) Frontplatte
Schrittmotorachse
Kabelstrang für Köpfe LED
Abb. 26.1: Festplattenlaufwerk
Die HDA umfasst alle mechanischen und elektronischen Komponenten, die gegen äußere Verschmutzungen besonders gesichert sein müssen. Dazu gehören die Platten, Köpfe, Laufwerksspindel und Aktuator. Die elektronische Steuerung befindet sich dagegen auf einer Platine außen am Laufwerk. Die Drehzahl des Spindelmotors einer Festplatte wird durch einen Regelschaltkreis stabilisiert, so dass die Platten mit einer konstanten Geschwindigkeit von bis zu 15.000 U/min rotieren. Der Schaltkreis reduziert die Drehzahlschwankungen dabei auf typischerweise ±0,1%. Während Sie in ein Diskettenlaufwerk höchstens eine Diskette mit zwei Seiten einlegen können, finden in den meisten Festplatten zwischen zwei und acht Platten Platz. Nur recht kleine 2,5"Festplatten für Notebooks weisen nur eine, aber dafür hochkapazitive Platte auf. Da jede Platte zwei Seiten besitzt, sind zwischen vier und 16 Köpfe notwendig, die sich ähnlich wie beim Diskettenlaufwerk am Ende eines Zugriffsarms befinden. Alle Köpfe sind mit demselben Aktuator verbunden und werden von diesem gemeinsam bewegt. Die Köpfe greifen also kamm- oder zangenartig um die Platten. In Abbildung 26.2 ist das grafisch dargestellt.
Aktuator Platte 1
Kopf 1 Kopf 2 Kopf 3 Kopf 4
Spindelwelle
Kopf 0
Platte 2 Platte 3
Kopf 5 Zugriffsarme
Spindelmotor
Abb. 26.2: Köpfe und Platten: Jeder Plattenoberfläche ist ein Kopf zugeordnet, der an einem Zugriffsarm angebracht ist. Alle Arme und Köpfe werden gemeinsam und gleichzeitig von einem Aktuator bewegt.
Sandini Bib Festplatten
875
Wie bei Diskettenlaufwerken ist – zumindest bei älteren Festplatten – maximal ein Kopf aktiv, um Daten zu lesen oder zu schreiben, während aktuelle Modelle mehrere Köpfe gleichzeitig aktivieren können. Angetrieben wird der Aktuator durch einen Schritt- oder Linearmotor. Anstelle der Bezeichnung Linearmotor finden Sie auch häufig den englischen Ausdruck VoiceCoil-Aktuator. Beide führen eine Positionierung der Köpfe über den betreffenden Spuren und Zylindern aus. Genaueres zur Technologie der Platten, Köpfe und Aktuatorantriebe erfahren Sie in den folgenden Abschnitten.
26.1.1 Platten Festplattenlaufwerke erhalten Sie heute in den meisten Fällen mit 3½"-Plattendurchmesser. Diese haben gegenüber den älteren, größeren Platten den Vorteil, dass die Köpfe nicht so weit verschoben werden müssen. Somit genügen kleinere Aktuator- und Spindelantriebe, der Stromverbrauch ist geringer und die Kopfpositionierzeit kürzer. Außerdem sind kleinere Laufwerke meist auch leiser. Bei manchen größeren und vor allem älteren Festplatten hat man ja öfter den Eindruck, dass im PC eine Kaffeemühle und kein High-Tech-Produkt arbeitet. Um Daten in der Form winziger Magnetisierungen überhaupt aufnehmen zu können, muss zumindest die Oberflächenschicht der Platten magnetisierbar sein. Heute verwendet man als Plattenmaterial hauptsächlich Aluminiumlegierungen, die leicht und trotzdem mechanisch stabil sind. Die geringe Masse der Aluminiumplatten gegenüber Platten aus Eisen z.B. führt durch das geringere Trägheitsmoment dazu, dass die Nenndrehzahl nach dem Einschalten schneller erreicht wird. Auf den Aluminiumträger bringt man dann eine magnetisierbare Schicht, das Datenmedium, auf. Die im Vergleich zu Disketten hohe Bitdichte verlangt magnetisch harte Substanzen. Man verwendet hierfür Kobalt oder spezielle Eisenkeramiken. Für die Beschichtung der Aluminiumplatte gibt es im Wesentlichen zwei Verfahren: Bei der Ferritbeschichtung wird Lösungsmittel mit dem Ferrit in der Nähe des Plattenmittelpunkts auf die Platte gespritzt, und die Platte selbst wird in eine schnelle Drehung versetzt. Durch die Zentrifugalkraft wandert das Lösungsmittel und somit auch das Ferritmaterial nach außen. Nachdem das Lösungsmittel verdampft ist, bleibt auf dem Aluminiumträger eine nur etwa 1 bis 2 µm dünne und gleichmäßige Ferritschicht zurück. Anschließend wird die Ferritschicht gehärtet, oder man bringt eine sehr dünne, aber harte Schutzschicht auf. Die Platte wird nun noch poliert, damit auch kleinste Unebenheiten beseitigt werden, die den darüber rasenden Kopf stören könnten. Durch das Ferritmaterial erhält die Platte eine rostrote bis braune Farbe, ein untrügliches Zeichen für eine ferritbeschichtete Platte. Dieses Verfahren ist mittlerweile als veraltet anzusehen. Stattdessen wird die Magnetschicht durch Galvanisierung oder bevorzugt durch Sputtern aufgebracht. Das Galvanisierungsverfahren finden Sie auch bei verchromten Autostoßstangen oder in der Schmuckindustrie: Der zu galvanisierende Gegenstand wird in eine Salzlösung getaucht, die Ionen des Metalls aufweist, mit dem der Gegenstand überzogen werden soll. Legt man nun an den zu galvanisierenden Gegenstand eine negative Spannung an, wandern die Metallionen zu ihm, werden dort entladen, zu Atomen neutralisiert und lagern sich gleichmäßig auf dem Gegenstand ab. Dadurch kann z.B. eine Stoßstange mit Chrom, Kupferschmuck mit Gold und die Aluminiumplatte für ein Festplattenlaufwerk mit Kobalt überzogen werden. Das Ergebnis ist eine harte und gleichmäßige Kobaltschicht mit einer Dicke von nur 0,1 bis 0,2 µm, das sind nur wenige hundert Atomlagen. Die Dicke kann auf einfache Weise durch den Galvanisierungsstrom und die Dauer der Galvanisierung geregelt werden.
Sandini Bib 876
Kapitel 26
Beim Sputtern wird das Metall, mit dem der Träger überzogen werden soll, im Vakuum durch Ionenbeschuss zu Atomen zerstäubt. Die Atome wandern zum zu überziehenden Gegenstand – hier also zur Aluminiumplatte – und lagern sich dort als sehr gleichmäßige und harte Schicht mit einer Dicke von 0,05 bis 0,2µm ab. Die Dicke kann auch hier auf einfache Weise durch die Stärke des Ionenbeschusses und die Dauer des Sputterns geregelt werden. Anschließend bringt man eine dünne Schicht (z.B. Graphit) auf, um das magnetische Medium vor mechanischen Beschädigungen zu schützen. Durch Galvanisierung oder Sputtern beschichtete Festplatten glänzen wie ein Spiegel und sind gegenüber einem Head-Crash, d.h. einem ungewollten harten Aufsetzer der Köpfe während der Drehung der Platten, wesentlich widerstandsfähiger als die ferritbeschichteten Platten. Normalerweise werden die Datenbits linear aufgezeichnet, die Magnetisierungen liegen in der Plattenebene: Wenn Sie sich einmal eine Magnetisierung für ein Datenbit als Stabmagneten vorstellen, so bedeutet das, dass der Stabmagnet in oder entgegen der Spurrichtung – je nach dem Bitwert – auf der Aluminiumplatte liegt. Daneben gibt es aber auch Festplatten mit senkrechter oder Vertikalaufzeichnung. Hier liegen die »Stabmagnete« nicht mehr in Spurrichtung, sondern stehen senkrecht auf der Aluminiumplatte. Die Aufzeichnung findet also in die Tiefe des Datenträgermediums statt, und es lassen sich wesentlich größere Bitdichten erzielen. In erster Linie werden heute aber Festplatten mit Horizontalaufzeichnung verwendet. Entscheidend für die Kapazität einer Platte ist die Anzahl der Flusswechsel, die sich unterbringen lassen. Sie erinnern sich aus dem vorherigen Kapitel 25, dass nur eine Änderung der Magnetisierung, also ein Flusswechsel, ein Signal in den Schreib-/Leseköpfen erzeugen kann. Die Zahl der Flusswechsel gibt man als fci (engl. flux changes per inch) an. Die Bitdichte bpi hängt dabei nicht nur von der maximalen Zahl der Flusswechsel fci, sondern auch vom speziellen Aufzeichnungsverfahren ab. Bei RLL-Festplatten ist die Zahl der Flusswechsel um ca. 50% kleiner als die Zahl der Bits, das RLL-Aufzeichnungsverfahren ist bereits derart leistungsfähig, dass ein Bit mit weniger als einem Flusswechsel kodiert werden kann. Beim Uralt-FM-Verfahren benötigt man dagegen zwei Flusswechsel für ein Bit, nämlich einen für das Takt- und einen für das Datensignal.
26.1.2 Köpfe Die Schreib-/Leseköpfe dienen wie beim Diskettenlaufwerk dazu, Daten als winzige Magnetisierungen auf die Platten zu schreiben oder diese Magnetisierungen als Datenbit zu erfassen. Die wesentlich höhere Bitdichte bei Festplatten verlangt aber gegenüber den Diskettenlaufwerken nach neuen Technologien. Wie Sie bereits in Abbildung 26.2 gesehen haben, ist für jede Plattenseite ein eigener Kopf vorhanden, und alle Köpfe werden gemeinsam von einem Aktuator bewegt. Je kleiner die Köpfe sind, umso winziger können die Magnetisierungen werden, die der Kopf auf das Medium schreibt. Außerdem bedeutet ein kleiner Kopf auch eine kleine Masse und somit geringe Trägheit – die Köpfe können schneller positioniert werden. Für die Erzeugung und Erfassung kleiner Magnetisierungsbereiche auf dem Datenträger ist es außerdem notwendig, dass sich die Köpfe in einem möglichst geringen Abstand über der Platte befinden. In Abbildung 26.3 ist das schematisch dargestellt. Das vom Schreib-/Lesekopf erzeugte Magnetfeld kann nämlich nicht scharf gebündelt werden, wie das Abbildung 26.3 links darstellt, sondern breitet sich fast halbkugelförmig mit leichter Konzentration senkrecht nach unten aus (Abbildung 26.3 rechts). Somit ist erkennbar, dass die horizontale Ausdehnung des Magnetfeldes auf der Plattenoberfläche ungefähr so groß ist wie der Abstand zwischen Kopf und Platte. Die Ausdehnung des Magnetfeldes bestimmt aber
Sandini Bib Festplatten
877
unmittelbar den kleinsten Mediumbereich, der in einer Richtung magnetisiert werden kann, also ein Bit. Das bedeutet, dass die Aufzeichnungsdichte nur über einen verminderten Abstand Kopf– Platte erhöht werden kann. Man versucht daher, die Köpfe möglichst klein zu konstruieren und in möglichst geringem Abstand von der Platte zu positionieren. Natürlich muss auch das magnetische Medium so feinkörnig sein, dass die Domänen nicht größer als ein solches Elementarbit werden. Kopf
Kopf
Feld
Platte
Abb. 26.3: Kopfflughöhe und Größe des Magnetisierungsbereichs: Das Magnetfeld tritt nicht gerichtet aus dem Spalt aus, sondern eher halbkreisförmig. Dadurch bestimmt der Abstand zwischen Kopf und Platte den elementaren Magnetisierungsbereich.
Im Wesentlichen gibt es drei Kopftechnologien: Ferritköpfe, Dünnfilmköpfe und magnetoresistive Köpfe. Die Ferritköpfe sind preiswerte und zuverlässige Vertreter der ältesten Kopfgeneration. Bei ihnen wird das Magnetfeld in einer Spule mit Ferritkern erzeugt, wie ich das bereits bei den Diskettenlaufwerken erläutert habe; sie stellen also einen einfachen Elektromagneten dar. Die Wicklungen lassen sich aber leider nicht beliebig verkleinern, so dass die Größe der Ferritköpfe nach unten begrenzt ist. Ferritköpfe besitzen durch den relativ schweren Ferritkern außerdem eine größere Masse als die Dünnfilmköpfe, der Kraftaufwand des Aktuators ist also groß. Aus diesen Gründen werden Ferritköpfe heute nicht mehr verwendet. Das modernere Konzept der Dünnfilmköpfe ist quasi ein »Abfallprodukt« der Mikroelektronik und der damit verbundenen Herstellungsverfahren. Halbleiterchips werden durch Aufbringen und Wegätzen verschiedener Materialschichten hergestellt. Was lag also näher, als diese mittlerweile einfach zu beherrschende Technik auch auf die Schreib-/Leseköpfe eines Festplattenlaufwerks anzuwenden? Die Köpfe werden nicht mehr durch Drahtwicklungen um einen Ferritkern gebildet, sondern durch verschiedene dünne Schichten erzeugt. Das Ergebnis ist ein mikroskopisch kleiner und vor allem sehr leichter Kopf, der dennoch ein beachtliches Magnetfeld erzeugen kann. Durch den geringen Abstand zwischen Kopf und Platte muss das vom Kopf erzeugte Feld ja nicht so groß wie bei den Ferritköpfen sein. Im Medium erzeugen die Dünnfilmköpfe damit ein ausreichend großes Feld, um die Kobaltdomänen magnetisieren zu können. Die so genannten magnetoresistiven Materialien (MR-Köpfe) finden heutzutage Verwendung. Der elektrische Widerstand solcher Materialien ändert sich in Abhängigkeit vom Magnetfeld. Der Vorteil ist die erheblich höhere Empfindlichkeit, so dass kleinere Magnetisierungsbereiche auf der Plattenoberfläche für ein ausreichend starkes Signal sorgen. Praktisch alle neueren Festplatten verwenden diese magnetoresistive (MR) Technologie, die im Gegensatz zu den DünnfilmKöpfen eine niedrigere Induktion realisiert, was vorteilhaft auch zu höheren Datenfrequenzen führt. MR arbeitet mit separaten Schreib- und Leseelementen, wobei die Schreibkomponente ein Dünnfilmelement auf induktiver Basis ist, das aus zwei Magnetpolen besteht. Zwischen diesen beiden Polen befindet sich die Lesekomponente, der MR-Sensor, der beim Lesevorgang mit einem Abtaststrom gespeist wird.
Sandini Bib 878
Kapitel 26
Beim Überfliegen der Platte ändert sich die MR-Schicht des Sensors je nach Magnetfeld der Platte, was als Widerstandsänderung detektiert wird und somit zu Impulsen führt, die die Bits der Platte repräsentieren. Das Signal des MR-Elements ist dabei unabhängig von der Umdrehungsgeschwindigkeit der Platte ausreichend stark und kann die sehr geringen Spurabstände detektieren. Beim Schreiben wird eine Spannung an die Magnetpole gelegt und dadurch ein Magnetfeld erzeugt, das die magnetische Schicht der Plattenoberfläche entsprechend den zu schreibenden Bits ausrichtet. Durch den Einsatz der MR-Technologie, mit deren Hilfe es möglich ist, gleich mehrere GByte auf einer Platte unterzubringen, kommen einige Modelle mit einer einzigen Platte aus. Das ungefähre Baujahr einer Festplatte lässt sich daher auch anhand ihrer Bauhöhe – bei vergleichbarer Kapazität – erkennen. Höhere Festplatten besitzen mehrere Platten und die niedrigen (z.B. nur 12 mm, Fujitsu MHG2102AT mit 10 GByte) eben nur eine, was sie durch die einfachere Mechanik preiswerter und auch zuverlässiger macht. Bei ausgeschaltetem Laufwerk liegen die Köpfe auf der Platte auf. Die heutigen Laufwerke »parken« ihre Köpfe automatisch auf einer hierfür reservierten Spur, die nicht zur Datenaufzeichnung vorgesehen ist. Dadurch soll vermieden werden, dass die Köpfe beim Anlaufen der Platten oder beim Abschalten des Laufwerks die Beschichtung an Stellen auf der Platte abkratzen, die mit gespeicherten Daten belegt sind. Wenn der Spindelmotor die Platten in Drehbewegung versetzt, nehmen sie die umgebende Luft ähnlich wie ein Ventilator mit; es bildet sich ein Luftstrom der kräftig genug ist, um über der Platte ein Luftpolster zu bilden. Die Köpfe heben dadurch von der Plattenoberfläche ab und reiten quasi in mikroskopisch kleinem Abstand von der Plattenoberfläche auf diesem Luftpolster, ohne die Plattenoberfläche zu berühren. Typische Abstände betragen bei Ferritköpfen 1µm und bei Dünnfilmköpfen zwischen 0,2 und 0,5 µm. In Abbildung 26.4 sehen Sie einen Größenvergleich zwischen einem Dünnfilmkopf, seiner Flughöhe, einem menschlichen Haar und verschiedenen Schmutzpartikeln.
Rauchpartikel (ca. 0,003mm)
Haar (ca. 0,01mm)
Fingerabdruck (ca. 0,003mm)
Dünnfilmkopf
Abstand Kopf/Platte (ca. 0,0003mm)
Abb. 26.4: Größenvergleich: Typische Größenverhältnisse für den Kopf, seine Flughöhe und verschiedene Verunreinigungen.
Die Flughöhe ist in erster Linie von der Form der Köpfe abhängig. Je nach aerodynamischer Ausprägung fliegen diese mehr oder weniger tief. Eine Festplatte kann im Vakuum also nicht – oder nur unter großen Schwierigkeiten – betrieben werden, weil hier das Luftpolster als Federung zwischen Kopf und Platte wegfällt. Die Dicke des Polsters ist übrigens vom Luftdruck abhängig, je geringer er ist, desto dünner wird auch das Luftpolster. Auf der Zugspitze fliegen die Köpfe also in niedrigerer Höhe als in Hamburg. Das ist der Grund, weshalb Sie in den Datenblättern von Festplatten eine Höhenangabe für den Einsatzbereich der Festplattenlaufwerke finden.
Sandini Bib Festplatten
879
26.1.3 Aktuator mit Schritt- oder Linearmotor Wie bereits erwähnt, werden die Schreib-/Leseköpfe gemeinsam von einem Aktuator bewegt. Als Aktuator bezeichnet man alle mechanischen Komponenten, die für die Kopfbewegung notwendig sind. Heute verwendet man Aktuatoren mit Schritt- oder Linearmotor. Weiter oben in Abbildung 26.1 ist ein Aktuator mit Schrittmotor dargestellt. Vom Schrittmotor selbst sehen Sie in der Abbildung allerdings nur die Welle. Wie beim Diskettenlaufwerk wird auch der Schrittmotor in Festplatten durch Schrittimpulse jeweils in Stufen in die eine oder andere Richtung gedreht. Diese Stufen sind fest und bedeuten jeweils eine festgelegte Veränderung der Drehstellung der Motorwelle, Zwischenabstufungen gibt es nicht. Kann ein Schrittmotor z.B. mit 180 Schritten einmal um seine Achse gedreht werden, so bedeutet das, dass jeder Schrittimpuls den Motor um 2° dreht. Es lassen sich also nur die Winkelstellungen 0°, 2°, 4°, ... 358° realisieren, eine Zwischenstellung von z.B. 3° ist unmöglich. Die Drehung der Motorwelle wird durch Reibung auf den Aktuator übertragen. Laut Abbildung 26.1 ist der Aktuator um die Aktuatorachse drehbar. Eine Rotation des Schrittmotors wird auf das bogenförmige Aktuatorteil übertragen, und der Aktuator dreht sich um die Aktuatorachse. Dadurch werden die an der Spitze des Aktuators befindlichen Köpfe radial verschoben, es findet eine Kopfpositionierung statt. Durch die schrittweise Drehung des Motors werden auch der Aktuator und mit ihm die Köpfe schrittweise bewegt. Üblicherweise entspricht ein Motorschritt einer Verschiebung der Köpfe um eine Spur nach innen oder außen. Kennzeichnend für die Aktuatoren mit Schrittmotor ist, dass keine Rückkopplung zwischen der Aktuatorposition und dem Schrittmotor existiert. Wenn der Motor die Köpfe z.B. von Spur 0 zu Spur 219 fahren soll, übergibt ihm die Motorsteuerung einfach 219 Schrittimpulse. Mit jedem Impuls bewegt sich der Motor um eine Stufe und der Aktuator somit um eine Spur weiter. Nach 219 Schrittimpulsen hat der Kopf dann die Spur 219 erreicht. Dass dies nicht besonders genau und zuverlässig funktioniert, ist einsichtig. Bei Diskettenlaufwerken mit einer Breite der Spuren von mindestens 0,1 mm gibt es selten Probleme, solche Versetzungen lassen sich technisch noch einfach beherrschen. Selbst bei einfachen Festplatten mit Schrittmotor, wie z.B. bei der früher weit verbreiteten ST-225 von Seagate mit 615 Spuren, beträgt die Spurbreite aber höchstens noch ein Zehntel der Diskettenwerte. Solche Positioniergenauigkeiten sind mit einem Schrittmotor gerade noch möglich, aber auch nicht mehr. Für eine einwandfreie Positionierung der Köpfe ist aber nicht nur die Genauigkeit, sondern auch die Reproduzierbarkeit, d.h. eine einwandfreie Wiederholbarkeit der Kopfpositionierung auf dieselbe Spur, maßgebend, und dabei hapert es bei Aktuatoren mit Schrittmotor am meisten. Die Kopplung zwischen Schrittmotorwelle und Aktuator erfolgt nur über die Reibung zwischen der Welle und dem bogenförmigen Teil. Obwohl die Welle meist mit einer Gummi- oder Kunststoffschicht überzogen ist, um den Schlupf möglichst klein zu halten, kann es vorkommen, dass der Aktuator bei großen Aktuatorbeschleunigungen kurzzeitig auf der Schrittmotorachse gleitet. Damit ist aber der feste Zusammenhang zwischen Drehstellung des Schrittmotors und Stellung des Aktuators verloren – es treten Positionierfehler auf, weil die Köpfe entweder über falsche Spuren oder zumindest an den Rand der Spuren gefahren werden. Dieses Problem kann auf recht einfache Weise behoben werden, indem das Laufwerk den Aktuator nach einem Befehl Laufwerk kalibrieren bis zum Anschlag zurückfährt, diese Stellung der Spur 0 zuordnet und nun erneut mit der Spur- und Schrittimpulszählung beginnt. Ein wesentlich unangenehmeres Problem im Zusammenhang mit Schrittmotoraktuatoren sind die Wärmedehnungen. Stellen Sie sich folgende Situation vor: Sie formatieren unmittelbar nach dem Einschalten des PC Ihre Festplatte, wenn alle Laufwerkkomponenten noch kalt sind. Mit jedem Schrittimpuls legen Sie also die nächste Spur an. Nachdem Ihr PC mehrere Stunden in
Sandini Bib 880
Kapitel 26
Betrieb ist, treten plötzlich Positionier- und Lesefehler auf. Die Ursache hierfür ist einfach die Wärmeausdehnung der mechanischen Komponenten. So verlängert sich z.B. der Aktuator mit einer Zunahme der Temperatur, und die Länge des Hebelarms von der Aktuatorachse bis zum Kopf wird größer. Dies führt dazu, dass die Kopfbewegung von Spur zu Spur geringfügig größer wird, als der tatsächliche und vorher durch die Formatierung mit einem kalten Aktuator festgelegte Spurabstand ist. Obwohl die Wärmedehnungen sehr gering sind, können sie ausreichen, um zumindest die Zylinder mit größerer Nummer unzugänglich zu machen. Wenn Sie umgekehrt Ihre Festplatte im warmen Zustand formatieren, meldet Ihr PC möglicherweise beim Einschalten Positionierfehler, wenn alle mechanischen Komponenten noch kalt sind. Die meisten Zugriffsfehler merken Sie nicht einmal unmittelbar, weil der Controller im Hintergrund eine eingebaute Fehlerbehandlungsroutine mit Neupositionierungen und anderen Prozeduren ausführt. Zugriffsfehler erkennen Sie dann nur indirekt an fast unendlich lang erscheinenden Plattenzugriffen für die Abspeicherung eines kurzen Briefs oder an einem lautstarken Agieren des Festplattenmotors und der Festplattenmechanik. Um dieses Problem zu lösen, haben die Hersteller eine thermische Kalibrierung in ihre Festplatten eingebaut. Durch die mit einem Sensor gemessene Temperatur wird die Position des Kopfes entsprechend korrigiert. Diese Festplatten setzen im laufenden Schreib- oder Lese-Betrieb kurzzeitig aus, um intern die thermische Kalibrierung auszuführen. Das wird Ihnen zwar kaum auffallen, kann jedoch dafür verantwortlich sein, dass der für das Brennen von CDs notwendige kontinuierliche Datenstrom nicht mehr aufrechterhalten werden kann, was dann zu der gefürchteten Fehlermeldung buffer underrun führt. Der eigentliche Grund für die Fehlfunktionen bei der Positionierung ist in beiden Fällen, dass keine Rückkopplung zwischen der Kopfposition und der Motorsteuerung stattfindet. Die Motorsteuerung übergibt dem Motor die Anzahl der vermeintlich notwendigen Schrittimpulse, und der Schrittmotor positioniert den Kopf gewissermaßen auf gut Glück. Befindet sich der Kopf dann zwischen zwei Spuren, ist ein Zugriff unmöglich, obwohl nur eine weitere Bewegung um eine halbe Spur notwendig wäre. Aktuelle Festplattenlaufwerke verwenden daher anstelle des Schrittmotors einen Linearmotor, wobei zusätzlich ein Regelkreis vorgesehen ist, der die aktuelle Kopfposition mit der Sollposition vergleicht und die Schreib-/Leseköpfe somit stets auf der korrekten Spur positioniert. Im Prinzip unterscheidet man zwei Arten von Aktuatoren mit Linearmotor (siehe Abbildung 26.5): eine lineare und eine rotierende Ausführung. Lineare Ausführung
Rotierende Ausführung Kopfbewegung
Platte
Spule Führung
Kopfbewegung Aktuatorbewegung
Schreib/ Lesekopf
Spule Achse
Permanentmagnet Permanentmagnet
Abb. 26.5: Aktuator mit Linearmotor
oruat g Akt egun w be
Sandini Bib Festplatten
881
Im Englischen bezeichnet man diese Aktuator-Art als Voice-Coil-Actuator, weil ihr Aufbau und ihre Wirkungsweise dem Membranantrieb in einem Lautsprecher ähnelt: Eine Spule umschließt einen Permanentmagneten oder bewegt sich zwischen zwei Permanentmagneten. Schickt man einen Strom durch die Spule, so wird ein Magnetfeld aufgebaut, das je nach Stromrichtung parallel zum Feld der Permanentmagneten oder diesem entgegengesetzt ist. Im ersten Fall wird die Spule abgestoßen, in letztem angezogen. Das führt zu einer linearen Bewegung der Spule und somit auch des Aktuators, der mit der Spule verbunden ist. Durch eine schnelle elektronische Regelung des Spulenstroms kann man die Spule und den Aktuator also entlang des Permanentmagneten verschieben und positionieren. Bei der linearen Ausführung läuft die Spule auf zwei Schienen in linearer Richtung. Der Kopf am Aktuatorende wird unmittelbar in gleicher Weise wie die Aktuatorspule bewegt und bezüglich der Platte rein radial verschoben. Selbst relativ geringe Stromimpulse in der Spule sorgen für beachtliche Magnetkräfte und Aktuatorbeschleunigungen. Man ist daher mehr und mehr dazu übergegangen, die rotierende Ausführung zu verwenden. Hier ist der Aktuator ähnlich wie bei der Schrittmotorausführung um die Aktuatorachse drehbar gelagert. Am einen Ende befinden sich die Schreib-/Leseköpfe, am anderen die Spule, die in oder um einen bogenförmigen Permanentmagneten eine bogenförmige Hin- und Herbewegung ausführt. Durch eine größere Hebellänge Aktuatorachse–Kopf gegenüber der Hebellänge Aktuatorachse– Spule wird eine geringe Spulenbewegung in eine große Kopfbewegung umgesetzt. Das ist günstig, weil die Spule und der damit verbundene Aktuatorteil vor allem gegenüber den winzigen Dünnfilmköpfen recht schwer und somit träge sind. Eine kleine Bewegung der massiven Teile mit geringem Kraftaufwand kann auf diese Weise in eine schnelle Positionierbewegung der Köpfe umgewandelt werden. Die rotierende Ausführung erlaubt also geringere Positionierzeiten bei verminderter Stromaufnahme durch die Spule. Gegenüber dem Schrittmotor hat der beschriebene Linearmotor aber leider einen Haken: Die Positionierungen sind nicht absolut. Ein kurzer Stromimpuls in der Spule bewegt zwar den Aktuator, um welche Strecke er bewegt wird, ist aber nicht eindeutig vorhersehbar. Außerdem verändern die von der Spule erzeugten Magnetfelder in geringem Maße die magnetischen Eigenschaften des Permanentmagneten. Man muss sich also auf andere Weise behelfen und eine aktive Rückkopplung einbauen, die stets die absolute Position von Schreib-/Lesekopf und Aktuator angibt. Das geschieht durch so genannte Servospuren und einen Servokopf, die auch als Indexspuren und Indexkopf bezeichnet werden. Vielleicht ist Ihnen schon einmal aufgefallen, dass manche Festplatten eine ungerade Anzahl von Köpfen aufweisen. Wieso haben die Konstrukteure dann nicht einfach einen weiteren Kopf hinzugefügt, um auch die letzte verbleibende Plattenseite zu nutzen? Die Antwort ist ganz einfach: Der Kopf ist zwar vorhanden, er dient aber zur Erkennung der Servospuren und ist Teil des Regelkreises zur Kopfpositionierung. Beim Hersteller wird nämlich die scheinbar unbenutzte Plattenseite in sehr präziser Weise mit den Servospuren versehen, deren einzige Aufgabe es ist, eine Referenz für die Kopfpositionierung zu schaffen. Wenn das Laufwerk eine bestimmte Spur anfahren möchte, wird der Servokopf über der betreffenden Servospur positioniert. Damit befinden sich automatisch auch alle anderen Schreib-/ Leseköpfe, die für die Datenaufzeichnung vorgesehen sind, über dieser Spur. Sie als Benutzer haben keinerlei Einflussmöglichkeiten, um die Servospuren zu verändern. Auch alle Low-LevelFormatierungen orientieren sich an diesen Servospuren und legen die Datenspuren auf allen Platten an derselben radialen Stelle wie die Servospuren an. Wenn das Laufwerk den Kopf über einer bestimmten Spur positionieren möchte, setzt die Laufwerkssteuerung die Spule des Linearmotors unter Strom, und der Servokopf ermittelt fortlaufend die Nummer derjenigen Spur, die sich gerade unter dem Servokopf befindet. Hat der Servokopf die gewünschte Spur erreicht,
Sandini Bib 882
Kapitel 26
bricht das Laufwerk diese Grobpositionierung ab, schaltet den Spulenstrom ab und führt eine Feinpositionierung aus. Dazu wird der Servokopf mit kleinen Stromimpulsen an die Aktuatorspule in winzigen Schritten vor- und zurückgefahren, bis das Signal von der Servospur maximal ist. Der Kopf befindet sich hier also stets exakt in der Mitte der betreffenden Spur. Es ist einleuchtend, dass die Positionierung mit einem Servokopf und Servospuren wesentlich genauer und vor allem vollkommen temperaturunabhängig vor sich geht.
26.1.4 Luftfilterung und Belüftung Alle Festplatten weisen einen Luftfilter auf, der in erster Linie aber nicht zur Filterung der Luft, die von außen in die HDA eindringt, sondern zur internen Filterung der Luft im Gehäuse dient. In Abbildung 26.6 sehen Sie ein Schema für die Luftzirkulation in einem Festplattenlaufwerk. Damit sich die HDA nicht durch einen geringen Umgebungsdruck aufbläht oder durch einen hohen Luftdruck zusammengedrückt wird, besitzt jedes Gehäuse einen Belüftungsschlitz, der in den Luftfilter mündet. Je nach Umgebungsdruck kann Luft über den Filter von außen eindringen oder nach außen entweichen. Das ist unbedingt notwendig: Wenn Sie eine 5¼"-Festplatte mit in ein Verkehrsflugzeug mit Druckkabine nehmen, würde der Gehäusedeckel einer Kraft ausgesetzt, die mehr als einem Zentner entspricht! Wahrscheinlich kämen Sie niemals auf die Idee, ein solches Gewicht auf Ihre Festplatte zu legen. In einem Flugzeug ohne Druckkabine würde Ihre Festplatte förmlich explodieren. Zirkulation
Plattendrehung
Luftfilter Frischluft
Abb. 26.6: Luftzirkulation in einem Festplattenlaufwerk: Die Plattendrehung nimmt die Luft im Laufwerk mit und erzeugt so eine Zirkulationsströmung.
Der Luftfilter eines Festplattenlaufwerks dient in erster Linie zur laufenden Filterung der bereits in der HDA befindlichen Luft. Durch leichte Kopfaufsetzer oder allgemeine Abnutzung der sich drehenden Bestandteile entsteht nämlich im Innern des Gehäuses ein Abrieb aus mikroskopisch kleinen Teilchen. Diese sind aber leider groß genug, um wie ein Scheuerpulver zu wirken, wenn sie zwischen Kopf und Platte gelangen. Die sich drehenden Platten nehmen nun die Luft mit und erzeugen so eine Zirkulationsströmung im Gehäuse. Der Luftfilter liegt im Strömungsbereich dieser Zirkulation und filtert laufend die kleinen Abriebteilchen aus.
Sandini Bib Festplatten
883
26.1.5 Interleaving oder Sektorversatz Beim Lesen oder Schreiben eines Sektors bewegt sich der gewünschte Sektor durch die Drehung der Diskette oder Platte unter dem Kopf weg, und der Controller aktiviert den Schreib-/Lesekopf. Dann werden die Daten des Sektors in den Sektorpuffer des Controllers geschrieben bzw. aus diesem Puffer gelesen. Wenn z.B. mehr Daten gelesen werden sollen, müssen die Daten des gerade gelesenen Sektors zuerst in den Hauptspeicher des PC übertragen werden, bevor der Sektorpuffer mit den Daten des nächsten Sektors gefüllt werden kann. Der Controller-interne Sektorpuffer weist nämlich üblicherweise nur eine Kapazität auf, die einem Sektor plus der zusätzlichen Redundanzbytes entspricht. Um den nächsten Sektor einlesen zu können, müssen diese Sektordaten innerhalb der kurzen Zeitspanne übertragen werden, die dem Durchlauf der Lücke zwischen den beiden Sektoren unter dem Kopf entspricht. Bei alten PCs ist der neue Sektor zumindest zum Teil schon unter dem Kopf weggelaufen, bis der Sektorpuffer zur Aufnahme des neuen Sektors bereit ist. Die CPU müsste also nun warten, bis der neue Sektor nach einer vollständigen Plattenumdrehung unter dem Schreib-/Lesekopf auftaucht. Bei einer Festplatte mit einer Drehzahl von etwa 3600 U/min dauert das aber bereits 16 ms. Möchten Sie eine noch nicht allzu große Datei mit 100 KByte entsprechend 200 Sektoren einlesen, dauert das 200 * 16 ms = 3,2 Sekunden. Das ist natürlich entschieden zu lange und führt die mögliche Übertragungsrate der Festplatten ad absurdum. Die Lösung dieser Probleme heißt Interleaving oder Sektorversatz: Die Sektoren werden nicht wie bei Disketten hintereinander aufgereiht, sondern um einen oder mehrere Sektoren versetzt. In Abbildung 26.7 ist das Schema dargestellt. Das Ausmaß des Versatzes gibt man durch den Interleave-Faktor an: Ein Faktor 3 bedeutet z.B., dass erst der dritte Sektor nach einem bestimmten Sektor den Sektor mit der nächsten laufenden Sektornummer darstellt; man könnte auch sagen, dass zwei Sektoren zwischen zwei aufeinander folgend nummerierten Sektoren liegen. Für eine Festplatte mit N Sektoren je Spur sind Interleave-Werte zwischen 1, was keinem Versatz entspricht, und N-1 erlaubt. Zwischen zwei aufeinander folgend nummerierten Sektoren befinden sich dann zwischen null und N-2 Sektoren. Der Effekt des Interleavings ist schnell erläutert: Sollen zwei aufeinander folgend nummerierte Sektoren gelesen werden, haben der Controller und der PC-Systembus genügend Zeit, die Daten im Sektorpuffer zum Hauptspeicher zu übertragen, bevor der nächste Sektor unter dem Schreib-/ Lesekopf auftaucht. Disketten werden stets mit einem Interleave-Faktor 1 betrieben. Außerdem werden bei Diskettenlaufwerken die Sektordaten quasi online ohne Zwischenabspeicherung in den Hauptspeicher übertragen. Bei Festplatten ist das nicht möglich, weil sie mit Hilfe der Redundanzbytes nicht nur eine CRC-Prüfung ausführen, sondern die Daten über die zusätzlichen ECC-Bytes sogar korrigieren können. Die Korrektur kann aber erst dann stattfinden, wenn alle Bytes gelesen worden sind. Sonst ist womöglich ein fehlerhaftes Byte schon übertragen worden, wenn die ECC-Logik den Fehler durch die zuletzt gelesenen ECC-Bytes erst ermittelt. Von Bedeutung ist, dass der Interleave-Faktor einer Festplatte bei der Low-Level-Formatierung aufgeprägt wird. Aktuelle Festplatten sind bereits mit einem 1:1-Interleave vorformatiert, und auch bei mehr als 100 Sektoren je Spur werden sie nicht aus dem Tritt gebracht. Das ist möglich, weil ein Cache-Speicher integriert ist, der mindestens eine komplette Spur aufnehmen kann. Die Daten werden also zuerst von der Platte in den Sektorpuffer und die Sektoren einer Spur während einer Plattenumdrehung in den Cache-Speicher geschrieben. Das Host-System kann den Cache-Speicher nun gemächlich auslesen. Auch wenn immer noch Tools zur Einstellung des Interleave-Faktors oder für die Low-Level-Formatierung zu finden sind, sind sie für aktuelle Festplatten völlig unnütz und mitunter sogar gefährlich, da die im Werk aufgeprägte Formatierung damit ruiniert werden kann und die Festplatte damit hinüber ist.
Sandini Bib 884
Kapitel 26
ur 0
9 ur 7 3
tor
7
8
tor
5 tor Sek
2 tor Sek
Sek
4
tor
Sek
6
Sp
tor
tor
S ek
1 tor Sek
Sek
Sek
Sp
Abb. 26.7: Beim Interleaving werden die Sektoren nicht aufeinander folgend aufgereiht, sondern entsprechend dem Interleave-Faktor versetzt.
26.1.6 Daten von Festplatten Hersteller und Verkäufer überschütten die Kunden gerne mit einer Menge an Schlagworten und zugehörigen Daten, um das jeweilige Produkt in einem möglichst guten Licht erscheinen zu lassen. Gelogen wird dabei selten, nur führt das Weglassen von Informationen über den Zusammenhang und Hintergrund – wie wir wissen, nicht nur hier – oft zu einem falschen Eindruck beim Kunden. In den folgenden Abschnitten möchte ich ein paar der häufig zitierten und »entscheidenden« Merkmale von Festplatten erläutern. Speicherkapazität Das erste Kennzeichen einer Festplatte ist natürlich die Speicherkapazität. Eine beliebte »Mogelpackung« ist es, die unformatierte Kapazität anzugeben. Wie Sie bereits von den Disketten wissen, legt der Controller neben den Datenbereichen auch noch Kennungsfelder und Lücken an. Die formatierte Kapazität ist im Mittel etwa 20% geringer. Achten Sie also darauf, ob der Hersteller oder Lieferant die (unformatierte) Brutto- oder die (formatierte) Nettokapazität angibt. Als Anwender ist für Sie ja nur die formatierte Datenkapazität der Festplatte entscheidend. Je nach Formatierungsparametern und Sektorgröße kann die formatierte Kapazität etwas schwanken. Im PC werden stets Festplatten mit einer Sektorgröße von 512 Byte verwendet, so dass die formatierte Kapazität einen besseren Vergleich mehrerer Festplatten ermöglicht. Eine weitere Möglichkeit, die Kapazität einer Festplatte etwas größer erscheinen zu lassen, ohne den Pfad der Wahrheit zu verlassen, besteht darin, die Kapazität nicht in MByte, sondern in MioByte (Millionen Byte) anzugeben. Sie erinnern sich: Ein KByte sind 1024 Byte und nicht 1000 Byte.
Sandini Bib Festplatten
885
Genauso sind ein MByte eben 1024 * 1024 = 1.048.576 Byte und nicht 1.000.000 Byte, ein Unterschied von immerhin 5%. Zugriffszeit Eine gebräuchliche Größe ist die Zugriffszeit. Hier ist zuerst zu bemerken, dass es mehrere Zugriffszeiten gibt: nämlich Spur–Spur, mittlere Positionierzeit, wahlfrei (random) und Full-Stroke. Die erste Größe gibt die Zeit an, die der Aktuator benötigt, um den Kopf von einer Spur zur benachbarten zu verschieben. In dem Wert ist auch die so genannte Kopfberuhigungszeit oder Settle-Time enthalten. Wenn Aktuator und Kopf nämlich vom Aktuatorantrieb schnell beschleunigt und kurz vor dem Erreichen der Zielspur wieder abgebremst werden, neigen sie zum Schwingen. Erst nachdem diese Schwingung abgeklungen ist, der Kopf sich also beruhigt hat, kann der Kopf die Spur korrekt ansprechen. Typische Werte für die Spur–Spur-Zugriffszeit liegen heute bei 2,5 ms. Ein kleiner Wert ist hier wichtig, weil die meisten Daten in aufeinander folgend nummerierten Sektoren abgelegt werden. Ist die Kapazität eines Zylinders erschöpft, dann setzt sich die Datei auf dem nächsten Zylinder fort, der Kopf muss also um eine Spur verschoben werden. Die mittlere Positionierzeit gibt die Zeitspanne an, die bei einer vollkommen zufälligen Kopfbewegung im Mittel notwendig ist, um den Kopf von der gegenwärtigen Spur zur Zielspur zu bewegen. In dieser Zeitangabe ist die »Kopfberuhigungszeit« mit enthalten, nicht aber die so genannte Latenz. Wenn über einen Controllerbefehl auf einen bestimmten Sektor der Platte zugegriffen wird, muss das Laufwerk zunächst den Kopf über der entsprechenden Spur positionieren. Damit ist der Sektor aber noch längst nicht zugänglich. Nur in wenigen Fällen wird er unmittelbar nach der Kopfberuhigung unter dem Schreib-/Lesekopf hindurchlaufen. Es kann aber auch vorkommen, dass der gewünschte Sektor gerade eben weg ist, und der Controller eine volle Plattenumdrehung warten muss. Im Mittel beträgt die Wartezeit oder Latenz gerade die Zeitspanne, die für eine halbe Plattenumdrehung notwendig ist. Da Festplatten mit 3600 U/min bis typischerweise 10.000 U/min rotieren, beträgt die Latenz im Allgemeinen zwischen 3 und 8 ms. Uraltplatten und modernste Platten unterscheiden sich hier nicht. Die Latenz macht sich vor allem bei geringen Positionierzeiten bemerkbar. Bei Festplatten mit geringer Zugriffszeit haben die Hersteller aus diesem Grund die Drehzahl der Platten auf bis zu 10.000 U/min angehoben, wodurch die mittlere Latenz abnimmt. Als Nebeneffekt wird auch die interne Datenübertragungsrate erhöht, weil nun mehr Sektoren pro Zeiteinheit unter dem Kopf hindurchlaufen. Die Positionierzeit und Latenz zusammengerechnet, führen zur mittleren Zugriffszeit oder Random Access Time. Das ist die Zeitspanne für einen zufälligen Zugriff auf einen bestimmten Sektor, also die mittlere Zeit für eine vollkommen zufällige Kopfbewegung von der gegenwärtigen Spur zur Zielspur und für das Warten, bis der betreffende Sektor nach der Latenzzeit unter dem Kopf erscheint. Typische Werte liegen heute bei 10 ms. Eine kleine mittlere Zugriffszeit ist wichtig, wenn Sie mit vielen Anwendungsprogrammen arbeiten, die statistisch verteilte Daten benutzen oder Indexdateien zum Suchen der eigentlichen Daten enthalten. Das sind in erster Linie Tabellenkalkulationen und Datenbanken. Um ein Byte in einer Datenbank zu lokalisieren, können durchaus mehrere Plattenzugriffe und damit einhergehende Kopfpositionierungen fällig sein. Eine geringe Zugriffszeit ist dann sehr wichtig. Auch bei der Interpretation der mittleren Zugriffszeit ist Vorsicht geboten. Es gibt nämlich eine elegante Möglichkeit, diese Zeit erheblich zu verkürzen: Platten-Caches. Das sind Cache-Speicher, die auf dem Laufwerk oder im Controller integriert sind und eine ganze Spur oder auch nur einzelne Sektoren aufnehmen, bevor die Spur- oder Sektordaten zum Hauptspeicher übertragen werden oder bevor die vom Hauptspeicher übergebenen Daten auf Platte geschrieben werden. Der Zugriff auf den Platten-Cache geht natürlich sehr schnell vor sich, die Zugriffszei-
Sandini Bib 886
Kapitel 26
ten betragen hier deutlich weniger als 1 ms. Die mittlere mechanische Zugriffszeit bleibt aber gleich und setzt sich nach wie vor aus der mittleren (mechanischen) Positionierzeit und der Latenz zusammen. Vor allem sequenzielle Plattenzugriffe werden vom Platten-Cache stark beschleunigt. Viele Hersteller gehen nun recht willkürlich vor und nehmen z.B. an, dass 40% aller Zugriffe sequenzielle Zugriffe mit der Cache-Zugriffszeit, 40% wahlfreie Zugriffe mit der mittleren mechanischen Zugriffszeit und 20% Schreibzugriffe mit ebenfalls der mittleren mechanischen Zugriffszeit seien. Das gewichtete Mittel beträgt in diesem Fall also 40% * Cache-Zugriffszeit + 60% * mittlere Zugriffszeit. Bei einer mittleren mechanischen Zugriffszeit von 20 ms ergibt sich so eine mittlere Zugriffszeit von 12 ms, ein Wert, der ganz toll aussieht. Die Bewertung der Aufteilung 40%-40%-20% möchte ich Ihnen überlassen. Erkundigen Sie sich beim Kauf einer Platte immer danach, ob die Zugriffszeit mit Cache gemeint ist oder nur die mechanische Zugriffszeit bedeutet. Eine Platte mit 30% größerer mechanischer Zugriffszeit liefert im Normalfall eine bessere Systemleitung als ein Pendant, das die geringere Zugriffszeit nur mit Cache erreicht. So richtig wirkungsvoll werden Platten-Caches erst bei Größen jenseits von 1 MByte, die entsprechenden Cache-Festplattencontroller beschleunigen z.B. Link-Vorgänge ganz enorm, in deren Verlauf sehr viele Bibliotheksdateien geöffnet und wieder geschlossen werden müssen. Neben diesen Zugriffszeiten geben die Hersteller häufig auch die Full-Stroke-Zeit an. Diese bezeichnet die Zeitspanne, um den Kopf von der Spur mit der minimalen Nummer zur Spur mit der maximalen Nummer oder zurück zu fahren, und ist entscheidend für den Zugriff auf Daten, die sehr weit auseinander liegen. Solche sehr stark fragmentierten Daten können dann auftreten, wenn Sie eine alte Datei nach langer Zeit erweitern, und fast alle Sektoren bis zum Plattenende von anderen Daten belegt sind. Das Betriebssystem weist den »Erweiterungsdaten« dann einen Sektor auf einer Spur ganz innen zu, die Köpfe müssen also sehr weit bewegt werden. Datenübertragungsrate Eine weiteres Feld sind die Datenübertragungsraten. Darunter versteht man allgemein den Quotienten aus einer übertragenen Datenmenge und der dazu benötigten Zeit. Genauso also, wie man unter der Geschwindigkeit den Quotienten aus der zurückgelegten Strecke und der dazu benötigten Zeit versteht. Gleichwohl nehmen es die Hersteller mit diesen Angaben nicht so genau und geben mitunter Werte an, die sich in der Praxis nicht einstellen, sondern lediglich in speziellen Tests ermittelt worden sind. Daher soll hier unter der Datenübertragungsrate derjenige Wert verstanden werden, mit dem sich eine realistische, nämlich mittelgroße Datei vom Laufwerk in den Hauptspeicher transportieren lässt. Alle anderen Angaben sind zwar im jeweils streng definierten Zusammenhang richtig, für den praktischen Einsatz aber nicht aussagefähig. Zur Übertragungsrate tragen vor allem drei Komponenten bei: die Übertragung Platte-Controller, die Verarbeitung im Controller und die Übertragung Controller-Hauptspeicher. Der erste Anteil, die so genannte interne Datenübertragungsrate, ist begrenzt durch die Zahl der Bytes, die pro Sekunde unter dem Schreib-/Lesekopf hindurchlaufen, und ist allgemein durch folgenden Ausdruck gegeben: Sektor/Spur * Byte/Sektor * Drehzahl interne Datenübertragungsrate = -----------------------------------Interleave
Eine Festplatte mit 70 Sektoren/Spur, 7200 U/min und Interleave 1:1 bietet somit eine interne Übertragungsrate von mehr als 4 MByte/s. Die Verarbeitungszeit im Controller ist im Allgemeinen sehr klein, weil die CRC- und ECC-Prüfung und ECC-Korrektur in sehr kurzer Zeit ausgeführt wird. Die Verarbeitungszeit beeinflusst die Übertragungsrate also nur in geringem Maße und ist somit vernachlässigbar.
Sandini Bib Festplatten
887
Bei geringer Sektorenzahl je Spur begrenzt die Anzahl der durchlaufenden Sektordatenbytes die Übertragungsrate und bei vielen Sektoren je Spur das Übertragungsvermögen des Systembus, was aber nur bei älteren Systemen (ISA) zu einem Leistungseinbruch führen kann. Gleichwohl schafft ein »Platten-Cache« auch hier noch Abhilfe, denn die Pufferung zwischen den zwei asynchron arbeitenden Systemeinheiten Festplatte und PC-Systembus kann die Übertragungsrate beträchtlich steigern. Der Platten-Cache auf dem Laufwerk oder Controller dient also in erster Linie zur Verbesserung der Datenübertragungsrate und nicht zur Verbesserung der Zugriffszeit. Benchmark-Programme zur Ermittlung der Datenübertragungsrate lesen wiederholt meist nur denselben Datenblock. Ist dieser Block nicht größer als der On-Board-Cache, muss das Laufwerk die Daten nur ein einziges Mal von der Platte lesen. Alle weiteren Zugriffe betreffen nur noch den schnellen Cache. Dadurch ermittelt man aber nur die Übertragungsrate Cache-Hauptspeicher, also die Leistungsfähigkeit der Verbindung. Übersteigt die Größe des Datenblocks das Speichervermögen des Controller-Caches, geht die Übertragungsrate in die Knie. Teilweise wird sie um den Faktor zehn (!) geringer, was man in den in Fachzeitschriften häufig abgedruckten Diagrammen zu den Übertragungsraten deutlich erkennen kann. Dateien oder Dateifragmente, die spielend in den Cache passen, zuvor aber in ihn eingelesen werden müssen, werden nur mit dieser viel geringeren Transferrate übergeben. Zuverlässigkeit und MTBF Außerdem ist vor allem noch die Zuverlässigkeit des Laufwerks von großer Bedeutung. Die Hersteller geben daher neben den Leistungs- im Allgemeinen auch die Zuverlässigkeitsdaten an. Die Zeitspanne zwischen zwei Totalausfällen des Laufwerks, die eine Reparatur verlangen, geben die Hersteller als MTBF (Mean Time Between Failures, dt. mittlere Zeitspanne zwischen zwei Ausfällen) an. Die MTBF muss folgendermaßen interpretiert werden: Betrachtet man eine Vielzahl gleichartiger Laufwerke, so tritt im Mittel nach der MTBF ein Ausfall auf. Es handelt sich also um eine statistische Größe, und statistische Größen sind stets mit Vorsicht zu genießen. MTBF-Werte von 300.000 Stunden besagen beispielsweise (auf den ersten Blick), dass ein mehr als 34 Jahre ununterbrochener 24-Stunden-Betrieb möglich wäre. Um einen fundierten Mittelwert für die MTBF zu erhalten, müsste man streng genommen eine Vielzahl von gleichartigen Laufwerken erheblich länger betreiben, als die MTBF angibt. Wie sonst kann man einen Zeitmittelwert angeben, wenn die Testzeit selbst ganz wesentlich darunter liegt? Bei 17 Jahren MTBF ist das natürlich völlig unmöglich, nach Erreichen der MTBF-Testzeit wäre das Laufwerk hoffnungslos veraltet. Die Hersteller machen stattdessen bestimmte Annahmen und erstellen statistische Ausfallmodelle, die auf den Erfahrungen mit anderen und älteren Laufwerken beruhen. Dann führt man einen Test aus, der sich vielleicht über sechs Monate, eher aber weniger, erstreckt. Aus der Ausfallrate in dieser Zeit und dem Vergleich mit der Ausfallrate von älteren Laufwerken, für die Erfahrungswerte existieren, interpoliert man die MTBF für das untersuchte Laufwerk. Am liebsten nehmen die Hersteller natürlich einen linearen Zusammenhang an, was aber das Technikverhalten nicht immer korrekt wiedergibt. Beispielsweise nimmt die Ausfallrate von Automobilen ja mit zunehmendem Alter ganz erheblich zu, bei einer linearen Extrapolation der Ausfallrate in den ersten zwei Jahren würde jedes Auto – statistisch – mindestens 30 Jahre alt. Die MTBF-Werte sind also mit Vorsicht zu interpretieren, zumal fast jeder Hersteller hierfür eine eigene Berechnungsgrundlage parat hat. Die Firma Fujitsu beispielsweise definiert die MTBF als: Anzahl aller Betriebsstunden aller ausgelieferten Festplatten, dividiert durch die Anzahl aller Defekte, wobei Defekte, die innerhalb der ersten drei Monate auftreten, nicht mitgerechnet werden. Die Firma Maxtor gibt stattdessen eine Annual Return Rate an, die bei ihren Laufwerken bei typischerweise 1% liegen soll. Demnach fallen innerhalb eines Jahres 1% aller ausgelieferten Laufwerke aus.
Sandini Bib 888
Kapitel 26
Aufgrund des drastischen Preisverfalls bei IDE-Festplatten gelten sie als die Standardtypen, die in fast jedem üblichen PC zu finden sind. SCSI-Festplatten sind demgegenüber, bei vergleichbarer Kapazität, zwei bis dreimal so teuer und werden heutzutage bevorzugt in Servern eingesetzt. Die Zeiten, in denen SCSI-Festplatten in üblichen Desktop-PCs verbaut wurden, scheinen somit vorbei zu sein. Im Zusammenhang mit den Angaben zur Zuverlässigkeit von Festplatten, gehen die Hersteller – wie erläutert – zwar unterschiedliche Wege, allerdings gibt es eine Gemeinsamkeit bei aktuellen IDE-Festplatten: Sie sind nicht für einen Dauerbetrieb ausgelegt(!), SCSI-Festplatten hingegen schon. Bei aktuellen IDE-Festplatten von Seagate wird beispielsweise von geregelten Arbeitszeiten bei den Zuverlässigkeitsangaben ausgegangen: acht Stunden pro Tag und fünf Mal pro Woche. IBM gibt hingegen 333 Stunden pro Monat an und Western Digital 60 Stunden pro Woche. Aus diesem Grunde sind die MTBF-Angaben bei IDE-Festplatten mit noch größerer Skepsis zu betrachten, als es sich ohnehin schon empfiehlt. Für einen Dauerbetrieb sind hingegen nur die SCSI-Festplatten spezifiziert, die ganz generell eine höhere Ausfallsicherheit bieten.
26.2 Aufzeichnungsformate Dieses Kapitel beschäftigt sich in erster Linie mit den Low-Level-Eigenschaften der Festplatten, also mit grundlegenden Dingen, die für das Verständnis der Funktionsweise von Festplatten sowie auch für deren Behandlung nützlich sind.
26.2.1 MFM und RLL Schon der Übergang vom FM- zum MFM-Verfahren brachte eine erhebliche Steigerung der Datendichte, ohne dass eine Erhöhung der Flusswechseldichte notwendig war. Es verwundert also nicht, dass die Entwickler von Festplatten nach weiteren Wegen gesucht haben, um immer höhere Speicherkapazitäten zu realisieren. Ein Weg dazu bietet das RLL-Verfahren. RLL ist zunächst einfach die Abkürzung für Run Length Limited oder begrenzte Lauflänge. Gemeint ist damit, dass die Anzahl der Nullbits zwischen zwei gesetzten Bits begrenzt ist. Beim MFM-Verfahren ist das nicht der Fall, hier kann ein 512-Byte-Sektor problemlos mit 4096 Nullbits gefüllt werden. Beim MFM-Verfahren werden dann nur die Takt-, aber keinerlei Datenbits aufgezeichnet. Genau hier liegt der springende Punkt: Das MFM-Verfahren zeichnet ein Taktbit auf, wenn zwei Nullbits aufeinander folgen; dagegen kommt das RLL-Verfahren völlig ohne Taktbits aus. Beim RLL-Verfahren ermittelt die RLL-Logik allein aus der Zeitspanne zwischen zwei gesetzten Bits, wie viele Nullbits dazwischen lagen. Das funktioniert aber wegen zeitlichen Instabilitäten durch Synchronisationsschwierigkeiten, Drehzahlschwankungen etc. nicht für beliebig viele Nullbits. Deren Zahl ist also begrenzt, um die RLL-Logik nicht aus dem Takt zu bringen. Die Bezeichnung RLL wird damit verständlich. Bei den am weitesten verbreiteten RLL-Verfahren befinden sich per Definition mindestens zwei und maximal sieben Nullbits zwischen zwei gesetzten Bits. Das Verfahren wird daher abgekürzt als RLL 2,7 bezeichnet. Nun tritt aber schon ein Problem auf: Eine 16-Bit-Ganzzahl mit dem Wert 0 besteht aus 16 Nullbits, für RLL entschieden zu viele. Das bedeutet, dass beim RLL-Verfahren die Datenbits zunächst so umkodiert werden müssen, dass stets mindestens zwei und höchstens sieben Nullbits aufeinander folgen. In Tabelle 26.1 ist die Kodierungstabelle für RLL 2.7 angegeben. Datenbit
RLL 2,7-Code
000 10
000100 0100
Tab. 26.1: Kodierung für RLL 2,7
Sandini Bib Festplatten
889
Datenbit
RLL 2,7-Code
010 0010 11 011 0011
100100 00100100 1000 001000 00001000
Tab. 26.1: Kodierung für RLL 2,7 (Forts.)
Es ist zu erkennen, dass unterschiedlich lange Datenbitgruppen zu unterschiedlich langen RLLCodes kodiert werden. In den RLL-Codes befinden sich maximal vier Nullbits vor und maximal drei Nullbits hinter einer »1«, es können also höchstens sieben Nullbits aufeinander treffen. Außerdem befinden sich hinter jeder »1« mindestens zwei Nullbits; zwischen zwei Einsen liegen also stets wenigstens zwei Nullbits, und die Voraussetzung für RLL 2,7 ist damit gegeben. Aus Tabelle 26.1 ist aber auch ein Nachteil des RLL-Verfahrens zu erkennen – die RLL-Codes sind wesentlich länger als die Datenbitgruppen, nämlich genau um den Faktor zwei. Weshalb RLL trotzdem eine höhere Datendichte bpi bei gleicher Flusswechseldichte fci ermöglicht, wird anhand der Abbildung 26.8 deutlich. RLL-Flussdichte RLL-Daten
MFM-Flussdichte MFM-Daten 0
0
1
0
Datenbit 011
0
0
1
0
0
1
Datenbit 010
0
0
1
0
0
1
0
0
Datenbit 01:0
Abb. 26.8: Das RLL 2.7-Verfahren
Aus der Tabelle 26.1 kann man ableiten, dass der RLL-Code für die neun Datenbits 01101001|0 folgendermaßen lautet: 001000100100100100. In der Abbildung sind unten die Daten und darüber die Flussdichte bzw. Flusswechsel für den Fall dargestellt, dass der RLL-Code im MFM-Verfahren aufgezeichnet wird. Die MFM-Flussdichte enthält neben den gesetzten RLL-Bits auch Taktbits, wenn zwei Nullbits aufeinander folgen. Dagegen zeichnet das RLL-Verfahren nur die gesetzten RLL-Bits auf, das sind beim angegebenen RLL-Code 001000100100100100 nur vier gesetzte Bits. Die Nullbits dazwischen werden beim Lesen von der RLL-Logik allein aus der zeitlichen Verzögerung zwischen zwei gesetzten RLLBits erzeugt und zu den 1-Bits hinzugefügt. Für die Aufzeichnung der neun Datenbits mittels des MFM-Verfahrens sind zwölf Flusswechsel, beim RLL-Verfahren dagegen nur fünf Flusswechsel erforderlich. Eine genaue mathematische Analyse des RLL-Verfahrens führt zu dem Ergebnis, dass im statistischen Mittel das MFM-Verfahren dreimal so viele Flusswechsel für die Datenaufzeichnung wie das RLL-Verfahren benötigt. Bei gleicher Packungsdichte der Flusswechsel können mit dem RLL-Verfahren also dreimal mehr Daten untergebracht werden wie mit dem MFM-Verfahren.
Sandini Bib 890
Kapitel 26
Wie ich bereits oben erwähnt habe, sind die RLL-Codes aber doppelt so lang wie die Datenbitgruppen, so dass die dreifache Packungsdichte durch die doppelt so langen RLL-Codes effektiv wieder halbiert wird. Als Nettogewinn verbleibt ein Faktor 1,5 oder anders ausgedrückt: Mit dem RLL-Verfahren können 50% mehr Daten als mit dem MFM-Verfahren auf einer Platte untergebracht werden. Im Mittel sind zur Aufzeichnung von drei Datenbits also nur zwei Flusswechsel notwendig. Wie beim Übergang vom FM- zum MFM-Verfahren bekommt man die Steigerung der Datendichte quasi »umsonst«, weil die Flusswechseldichte und somit die Güte von Platte und Schreib-/Lesekopf nicht erhöht werden muss. Die Verbesserung wird ausschließlich in das Kodierungsverfahren und damit in die RLL-Logik des Controllers gelegt. Neben dem beschriebenen RLL 2,7-Verfahren existieren noch weitere RLL-Verfahren, die als Advanced-RLL oder ARLL bezeichnet werden. Beispiele sind das RLL 1,7- und das RLL 3,9-Verfahren. Bei beiden ist zum einen der Kodieraufwand der Datenbitgruppen in RLL-Code höher, zum anderen stellt die größere Zahl von Nullbits zwischen zwei gesetzten RLL-Bits erheblich größere Anforderungen an die Stabilität der RLL-Elektronik, was jedoch heutzutage kein Problem darstellt, und alle aktuellen Festplatten verwenden eine Variation des hier erläuterten RLLVerfahrens.
26.2.2 Translation und Zonenaufzeichnung Der Umfang eines Kreises ist umso größer, je größer der Radius ist. Auf Festplatten übertragen bedeutet dies, dass die Länge einer Spur umso größer wird, je kleiner die Zylindernummer ist, da dem äußersten Zylinder mit dem größten Durchmesser die Nummer 0 und dem innersten mit dem kleinsten Durchmesser die größte Nummer zugeordnet wird. Die Zahl der Bytes je Spur ist von der Länge der Spur, also dem Umfang des Zylinders und somit der Zylindernummer abhängig. Es erscheint widersinnig, die großen äußeren Zylinder nur mit der gleichen Zahl von Sektoren wie die kleinen inneren Zylinder zu füllen, die äußeren Sektoren würden damit auseinander gezogen. Um die mögliche Speicherkapazität einer Platte am besten auszunutzen, wäre es also günstiger, die Zahl der Sektoren je Zylinder mit wachsendem Zylinderdurchmesser zu erhöhen. Das führt aber dazu, dass man die feste Zahl von Sektoren je Spur aufgeben muss. Entsprechend verkomplizieren sich die BIOS-Funktionen, weil man ja für jede Festplatte auch noch wissen muss, welcher Zylinder wie viele Sektoren aufweist. Einfachere, nicht intelligente Laufwerke ohne eigenen Controller begnügen sich daher mit einer festen Zahl von Sektoren je Spur über die gesamte Platte. Bei aktuellen und intelligenten Laufwerken, wie z.B. SCSI- und IDE-Bus-Festplatten, findet hingegen eine solche Umsetzung statt. Die Besonderheit besteht nun darin, dass dem Controller zwar bekannt ist, welche Spur jeweils wie viele Sektoren besitzt, die Platte erscheint aber gegenüber dem Benutzer auf BIOS-Ebene weiterhin homogen mit einer festen Zahl von Sektoren je Spur. Das bedeutet, dass der Controller ohne Einfluss von außen die Angabe Kopf, Zylinder und Sektor eines BIOS-Aufrufs in die tatsächlichen Werte für Kopf, Zylinder und Sektor auf der Festplatte umsetzt. Dieser Vorgang bleibt dem Benutzer völlig verborgen. In der Praxis unterteilt man eine Festplatte meist in mehrere Zonen, die jeweils eine feste Zahl von Sektoren je Spur aufweisen. Die Zahl der Sektoren je Spur ändert sich somit nur von Zone zu Zone und nicht von Spur zu Spur. Man bezeichnet das als Zonenaufzeichnung oder Zone-Recording. Das dem BIOS bekannte Format hat durch die umfangreiche Translation mit dem tatsächlichen Format kaum mehr etwas zu tun. Das hört sich alles komplizierter an, als es in Wirklichkeit ist. Ein vom Laufwerk getrennter Controller, wie er früher üblich war, muss natürlich sehr viele ver-
Sandini Bib Festplatten
891
schiedene Laufwerke steuern können. Ein Controller, der fest in das Festplattengehäuse integriert ist, kann dagegen in optimaler Weise auf diese eine Festplatte abgestimmt werden, auf der er sich befindet. Zur Feststellung, mit welchem geometrischen Format die Platte angesprochen wird, dient die Funktion 08h Format ermitteln des Interrupt INT 13h. Dieser gibt die geometrischen Parameter zurück, die zum Ansprechen der Festplatten verwendet werden können. Der Aufruf der Funktion wird vom BIOS auf die Festplattenelektronik ausgeführt, die sich beim Booten gewissermaßen in den bestehenden Interrupt 13h eingeklinkt hat.
26.2.3 High-Level-Formatierung Im Gegensatz zu Disketten legt der Format-Befehl bei Festplatten keine Spuren und Sektoren an. Bei dieser High-Level-Formatierung mithilfe von Format wird lediglich die logische Struktur der betreffenden Partition aufgebaut. Dazu gehört die Erstellung des Bootsektors, der zwei FATKopien und des Stammverzeichnisses. Alle Einträge in der FAT werden auf 00h gesetzt, um anzuzeigen, dass die Partition frei ist. Insbesondere werden die Sektoren der Unterverzeichnisse und Dateien nicht mit einem bestimmten Datenmuster überschrieben. Auf Festplatten können Sie mit Format nur Partitionen, nicht aber die gesamte Festplatte formatieren. Sie müssen Ihre Platte vor der Formatierung also zunächst mit FDISK oder einem entsprechenden Programm partitionieren und die Partitionstabelle erstellen lassen. Der Format-Befehl selbst wirkt nicht auf die Partitionstabelle ein, sondern liest nur die dort abgespeicherten Informationen, um den Anfang und die Größe der zu formatierenden Partition zu ermitteln und die Formatierung entsprechend auszuführen. Eine Neuformatierung mit Format löscht bei Festplatten nur die logische Struktur, physikalisch sind die Daten aber weiter vorhanden. Manche Dienstprogramme wie z.B. die Norton Utilities können dann selbst eine versehentlich formatierte Festplattenpartition wieder herstellen. Durch die Zerstörung von mehr als einer einzelnen Datei ist der Wiederaufbau der ursprünglichen Verzeichnis- und Dateistruktur wesentlich komplizierter. Bei ursprünglich fragmentierten Verzeichnissen und Dateien sind auch solche Programme fast chancenlos. Es gibt daher residente Programme, die sich in alle Festplattenoperationen »einklinken« und in eigens dafür reservierten Sektoren die logische Struktur der Festplatte zusätzlich ablegen. Das zugehörige Wiederherstellungsprogramm kennt die reservierten Sektoren, und weil durch eine High-Level-Formatierung ja nur die logischen Strukturen der Festplatte, nicht aber die Daten selbst zerstört worden sind, kann es aus den in den reservierten Sektoren abgelegten Informationen die logische Struktur der Festplatte wiederherstellen. Im Gegensatz zur Low-Level-Formatierung haben Sie mit Format aber keine Möglichkeit, beschädigte Sektoren und Spuren zu ersetzen. Erkennt Format einen beschädigten Sektor, so wird der zugehörige Cluster in der FAT einfach als bad oder schadhaft markiert.
26.2.4 Low-Level-Formatierung Um einer Festplatte Spuren und Sektoren aufzuprägen, wird sie Low-Level-formatiert. Wichtig ist aber, dass alle aktuellen Festplatten in vorformatierter Form ausgeliefert werden. Eine erneut ausgeführte Low-Level-Formatierung kann bei einigen Festplatten schlimme Auswirkungen haben, da die bei der Festplattenherstellung gesperrten Bereiche (Bad Sectors) dadurch wieder freigegeben werden können. Die Festplatte kann nach der Low-Level-Formatierung durchaus eine Zeit lang klaglos funktionieren, bis zu dem Zeitpunkt, zu dem auf die defekten Bereiche zugegriffen wird.
Sandini Bib 892
Kapitel 26
Welche Festplatte sich nun ohne nachfolgende Schäden Low-Level-formatieren lässt und welche nicht, ist nicht immer ohne weiteres ersichtlich. Diese Funktion wurde eigentlich für die alten MFM-Festplatten ins Leben gerufen, und Sie finden in älteren BIOS-Versionen hierfür noch einen entsprechenden Menüpunkt. Für SCSI-Festplatten ist diese Funktion meistens im SCSI-BIOSSetup abgelegt, und diese Festplatten kommen in der Regel ebenfalls mit einer nachfolgenden Low-Level-Formatierung klar. Bei IDE-Festplatten ist dies aber völlig unterschiedlich, und der jeweilige Hersteller sollte Auskunft darüber geben können, was eine Low-Level-Formatierung bei der jeweiligen Festplatte bewirkt. Auf den Internetseiten der bekannten Hersteller finden Sie hierzu in der Regel weitere Informationen und mitunter auch ein Programm für die Low-Level-Formatierung, wobei dieses möglicherweise aber ausschließlich für bestimmte Festplatten – des jeweiligen Herstellers – vorgesehen ist. Generell sollte bei Festplatten nur dann eine derartige Formatierung durchgeführt werden, wenn man an der Platte ohnehin nichts mehr verderben kann. Die Notwendigkeit für die Low-Level-Formatierung ist bei aktuellen Festplatten meist ein Anzeichen dafür, dass dieser Platte kein langes Leben mehr beschieden ist.
26.3 Traditionelle Festplattenschnittstellen Die früher weit verbreitete ST412/506-Schnittstelle ist wie ihr Nachfolger ESDI mittlerweile vollkommen von IDE oder ATA (AT Attachment), wie dieser Standard auch bezeichnet wird, abgelöst worden. Ich möchte mich daher bei diesen Schnittstellen nur auf die wesentlichsten Dinge beschränken, da sie nur noch von historischer Bedeutung sind. Bei IDE und SCSI gibt es hingegen laufend Weiterentwicklungen, was sowohl das Interface selbst als auch die hier anzuschließenden Geräte betrifft, wodurch es nicht immer leicht ist, hier noch die Orientierung zu behalten.
26.3.1 ST412/506 Die Bezeichnung der ST412/506-Schnittstelle hat historische Gründe: Seagate führte 1980 das System ST506 mit einer Speicherkapazität von 5 MByte und einer definierten Schnittstelle zum Controller ein. Ein Jahr später, 1981, kam das Nachfolgemodell System ST412 mit 10 MByte Speicherkapazität und einer geringfügig modifizierten Schnittstelle auf den Markt (man beachte die Speicherkapazitäten!). Die Schnittstellenkonzeptionen wurden von IBM für den Personal Computer übernommen und sind als ST412/506-Schnittstelle bekannt geworden. Der ST412/506-Standard fordert für die Übertragungsrate zwischen Laufwerk und Controller bei einer MFM-Kodierung einen Wert von 5 MBit/s und bei einer RLL-Kodierung einen Wert von 7,5 MBit/s. Die Werte sind nicht im Sinne einer »Höchstens-Spezifikation«, sondern einer »Gleich-Spezifikation« zu verstehen. In den 5 bzw. 7,5 MBit/s sind neben den eigentlichen Datenbits auch Adressmarken, CRC- und ECC-Bytes sowie Lückenbits enthalten. Mit einer Sektorlänge von etwa 575 Byte brutto bringen MFM-kodierte Festplatten mit ST412/506-Schnittstelle also 17 Sektoren unter, und RLL-kodierte Festplatten weisen 26 Sektoren je Spur auf. Obwohl ST412/506 nur die Schnittstelle zwischen Laufwerk und Controller spezifiziert, für die Einbindung von Controller und Laufwerk in das PC-System aber keine Angaben macht, hat sich folgende Konfiguration durchgesetzt: Der Controller befindet sich auf einer separaten Steckkarte, die in einem Busslot sitzt, und es werden maximal zwei Festplattenlaufwerke über ein Steuer- und ein Datenkabel mit dem Controller verbunden. Die Controllersteckkarte stellt gleichzeitig die Verbindung zum PC-Bus her. Im Gegensatz zu Diskettenlaufwerken, wo die Verbindung zwischen Laufwerk und Controller über ein einziges Flachbandkabel bewerkstelligt
Sandini Bib Festplatten
893
wird, laufen bei diesem System die Steuer- und Datensignale über getrennte Kabel: Das breitere Kabel mit 34 Adern stellt das Steuer-, das schmale mit nur 20 Adern das Datenkabel dar.
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34
Festplattencontroller
Masse
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34
Laufwerk D:
Laufwerk C:
verminderter Schreibstrom Kopfauswahl 2 Schreibgatter Positionierung beendet Spur 0 Schreibfehler Kopfauswahl 0 Kopfauswahl 3 Kopfauswahl 1 Indexsignal IDX Laufwerk bereit Schrittimpuls Auswahl Laufwerk 1 Auswahl Laufwerk 2 Auswahl Laufwerk 3 Auswahl Laufwerk 4 Schrittrichtung
1,3, ...,33
Masse
verminderter Schreibstrom Kopfauswahl 2 Schreibgatter Positionierung beendet Spur 0 Schreibfehler Kopfauswahl 0 Kopfauswahl 3 Kopfauswahl 1 Indexsignal IDX Laufwerk bereit Schrittimpuls Auswahl Laufwerk 1 Auswahl Laufwerk 2 Auswahl Laufwerk 3 Auswahl Laufwerk 4 Schrittrichtung
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34
Laufwerk D:
verminderter Schreibstrom Kopfauswahl 2 Schreibgatter Positionierung beendet Spur 0 Schreibfehler Kopfauswahl 0 Kopfauswahl 3 Kopfauswahl 1 Indexsignal IDX Laufwerk bereit Schrittimpuls Auswahl Laufwerk 1 Auswahl Laufwerk 2 Auswahl Laufwerk 3 Auswahl Laufwerk 4 Schrittrichtung
1,3, ...,33
Masse
1,3, ...,33
Masse
Festplattencontroller
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34
Laufwerk C:
Festplattencontroller
verminderter Schreibstrom Kopfauswahl 2 Schreibgatter Positionierung beendet Spur 0 Schreibfehler Kopfauswahl 0 Kopfauswahl 3 Kopfauswahl 1 Indexsignal IDX Laufwerk bereit Schrittimpuls Auswahl Laufwerk 1 Auswahl Laufwerk 2 Auswahl Laufwerk 3 Auswahl Laufwerk 4 Schrittrichtung
2,4,6,8,11,12, 15,16,19,20
Laufwerkauswahl reserviert (kein Pin) reserviert nicht benutzt nicht benutzt MFM/RLL-Schreibdaten MFM/RLL-Schreibdaten MFM/RLL-Lesedaten MFM/RLL-Lesedaten
1 3 5 7 9 10 13 14 17 18
Laufwerk C: oder D:
1,3, ...,33
Masse
Abb. 26.9: Steuer- und Signalkabel der ST412/506-Schnittstelle: Die Laufwerke werden über ein 34-poliges Steuerkabel und ein 20-poliges Datenkabel mit dem Controller verbunden.
An das Steuerkabel können beide Festplatten angeschlossen werden, sofern zwei Laufwerke installiert werden sollen. Dagegen ist für jede Festplatte ein eigenes Datenkabel vorgesehen. Dabei ist zu beachten, dass es auch hier wie bei den Diskettenlaufwerken Steuerkabel gibt, bei
Sandini Bib 894
Kapitel 26
denen die Adern (hier: 25 bis 29) zwischen dem mittleren Stecker und dem Kabelende gedreht sind. Im PC werden die Signale Auswahl Laufwerk 3 und Auswahl Laufwerk 4 nicht benutzt, so dass maximal zwei Festplatten angeschlossen werden können. Von allen im PC gebräuchlichen Festplattenschnittstellen ist die ST412/506 am wenigsten »intelligent«. Sie stellt eine reine Signalschnittstelle dar, der Controller kann dem Laufwerk also keine Befehle übergeben. Auf dem Laufwerk selbst sind nur die Steuerschaltungen für die Stabilisierung der Drehzahl und die Kopfpositionierung vorhanden. Alle anderen Steuerungsaufgaben übernimmt der Controller, z.B. die Interpretation der Befehle vom PC-System, die Kodierung und Dekodierung der Schreib- und Lesedaten, die Erzeugung von Adressmarken usw. ST412/506-Controller und -Laufwerke wurden zuerst im XT und später auch im AT eingesetzt. Weil das XT-BIOS standardmäßig nicht für eine Unterstützung von Festplatten eingerichtet war, müssen alle XT-Controller ein eigenes BIOS mit den Festplattenfunktionen des INT 13h aufweisen. Die Startadresse dieses Zusatz-BIOS lautet im Allgemeinen c8000h. Dagegen unterstützte der AT von Beginn an Festplatten, und die dazu notwendigen Routinen sind bereits im SystemBIOS ab Adresse f0000h integriert. Anschluss und Konfiguration Der Anschluss von ST412/506-Festplatten über das Steuerkabel an den Controller erfolgt in gleicher Weise wie bei den Diskettenlaufwerken. Die erste Festplatte wird mit dem Ende des Steuerkabels verbunden, eine eventuell zweite Festplatte mit dem mittleren Stecker. Falls ein Steuerkabel ohne gedrehte Leitungen zum Einsatz kommt, wird über die entsprechenden Jumper an der Festplatte Laufwerk C: als Drive Select 0 und Laufwerk D: als Drive Select 1 konfiguriert. Bei der Verwendung von Kabeln mit gedrehten Leitungen, kann man wie bei den Diskettenlaufwerken beide Festplatten als Drive Select 1 konfigurieren, und durch die Vertauschung der Auswahlsignale wird stets die korrekte Platte aktiviert. Die Parameter für die verschiedenen ST412/506-Festplatten sind im BIOS-Setup zu finden, und sie sind zumeist aus der Liste auszuwählen. Mit dem USER-Typ, bei dem die Parameter einzeln eingegeben werden können, funktionieren diese alten Festplatten jedoch nicht immer.
26.3.2 ESDI ESDI, das Enhanced Small Device Interface, wurde von der Firma Maxtor 1983 als leistungsfähige und intelligente Weiterentwicklung der ST412/506-Schnittstelle konzipiert. Das Problem der langen Übertragungswege zwischen Festplatte und Datenseparator wurde dadurch gelöst, dass bei ESDI der Datenseparator bereits auf dem Laufwerk integriert ist. ESDI ist für eine Übertragungsrate von bis zu 24 MBit/s zwischen Laufwerk und Controller ausgelegt, typischerweise werden 10 bis 15 MBit/s erreicht (1–2 MByte/s). ESDI-Festplatten verwenden zur Datenkodierung meist das RLL-Verfahren. Außerdem ist ein ESDI-Controller für den Anschluss von bis zu sieben ESDI-Laufwerken vorgesehen, und er kann Festplatten mit maximal 64 Köpfen in vier Gruppen zu je 16 Köpfen und mit maximal 4096 Zylindern ansprechen. Die Controller der Vorgängerschnittstelle ST412/506 erlaubten dagegen nur maximal 16 Köpfe und 1024 Zylinder. Ein ESDI-Controller kann dem Laufwerk auch komplette Befehle übergeben, die dann von der Laufwerkssteuerung dekodiert und ausgeführt werden. Dagegen werden die Erzeugung der Adressmarken, Synchronisationsmuster und die Dekodierung der NRZ- zu parallelen Bitdaten für den PC-Systembus auf dem speziellen ESDI-Controller ausgeführt. Ein ESDI-Controller ist also weder ein reiner Controller, der alle Steueraufgaben übernimmt, noch ein Adapter, der aus-
Sandini Bib Festplatten
895
schließlich die Verbindung zum Systembus herstellt. Vielmehr stellt ein ESDI-Controller ein Zwischenprodukt zwischen Controller und Adapter dar. Auf die ESDI-Signale und die ESDI-Befehle möchte ich wegen der Bedeutungslosigkeit der ESDI-Schnittstelle (ihr war nur ein kurzes Leben zwischen ST412/506 und IDE beschieden) nicht weiter eingehen. Anschluss und Konfiguration Für den Anschluss der ESDI-Festplatten gelten im Prinzip dieselben Regeln wie für die ST412/ 506-Festplatten. Zunächst müssen die Laufwerke konfiguriert werden, was hier bedeutet, dass sie jeweils eine eigene ESDI-Adresse erhalten müssen. Durch die abweichende Belegung der Kabel und die binäre Kodierung der Laufwerksadresse auf dem Steuerkabel gibt es für ESDI keine Kabel mit gedrehten Leitungen. Demnach ist es hier völlig egal, mit welchem Stecker des Steuerkabels welches ESDI-Laufwerk verbunden wird. Im BIOS-Setup ist für ESDI-Festplatten der »Typ 1« festzulegen, damit der PC erkennen kann, dass hier überhaupt eine Festplatte vorhanden ist. Die tatsächlichen Daten für die Festplatte werden dann vom ESDI-BIOS (von der Controllerkarte) überlagert.
26.4 IDE Bei den vorhergehenden Kombinationen Controller-Festplatte weist das Laufwerk selbst nur die elektronischen Baugruppen auf, die zu einer unmittelbaren Ansteuerung der Motoren und Gatter des Laufwerks notwendig sind. Die weitergehende Steuerung zur Ausführung von Befehlen – z.B. muss für das Lesen eines Sektors eine Kopfpositionierung, das Einlesen der kodierten Signale, die Trennung von Daten- und Taktsignal, die Übertragung zum Hauptspeicher etc. ausgeführt werden – übernimmt die Elektronik auf einem separaten Adapter, dem Festplattencontroller. Diese Laufwerke selbst sind also reichlich »dumm«. Ein weiterer Nachteil dieser getrennten Lösung ist, dass die noch nicht dekodierten Signale erst vom Laufwerk über ein Datenkabel zum Controller laufen müssen, um dort dekodiert zu werden. Der Übertragungsweg verschlechtert die Signale, und eine hohe Datenübertragungsrate zwischen Laufwerk und Controller scheitert an den relativ langen Signalwegen. Abhilfe schafft die so genannte IDE- oder AT-Bus-Schnittstelle. IDE ist die Abkürzung für Intelligent Drive Electronics – ein Hinweis darauf, dass die angeschlossenen Laufwerke selbst intelligent sind. Bei IDE-Festplatten ist der Controller gleich mit integriert, er wird nicht mehr von einer separaten Controllerkarte gebildet. Auf diese Weise sind die Signalwege von der Platte zum Controller sehr kurz, und der Controller kann optimal auf die eine Festplatte abgestimmt werden, die er steuert. Bei ESDI wurde als Mittelweg der Datenseparator auf dem Laufwerk integriert, der Rest des Controllers, wie z.B. Sektorpuffer und Laufwerksteuerung, befindet sich weiter auf einem separaten Adapter. Der Anstoß zur Entwicklung der IDE-Schnittstelle ging Ende 1984 von der Firma Compaq aus, die nach einem ST506-Controller suchte, der sich direkt auf dem Laufwerk montieren lässt und über einen einfachen Schaltkreis mit dem Hauptsystem verbunden werden kann. In Zusammenarbeit mit Festplattenherstellern wie Western Digital, Imprimis und Seagate entstand innerhalb kurzer Zeit die AT-Bus-Schnittstelle. Mehrere Köche verderben bekanntlich den Brei, und so waren zu Beginn Inkompatibilitäten an der Tagesordnung. Um Abhilfe zu schaffen, gründeten mehrere System-, Laufwerks- und Software-Hersteller die Interessengruppe CAM (Common Access Method), die im März 1989 einen Standard mit der Bezeichnung ATA (AT-Attachment) ausarbeitete. Neben anderen Eigenschaften ist auch der Befehlssatz für IDE-Laufwerke festgeschrieben worden. Zu den bereits beim AT-Controller vorhandenen acht Befehlen mit mehreren Unterbefehlen
Sandini Bib 896
Kapitel 26
sind zunächst 19 neue Befehle hinzugekommen, die sich in erster Linie mit der Steuerung der Laufwerke im Hinblick auf eine geringe Leistungsaufnahme befassen, wie z.B. der Sleep-Befehl zur Deaktivierung des Controllers und zur Abschaltung des Laufwerks, wenn längere Zeit kein Zugriff mehr ausgeführt worden ist. Im Laufe der Jahre ist dieser ATA-Standard und somit auch der Befehlsumfang mehrere Male überarbeitet und erweitert worden, wobei jedoch stets die Abwärtskompatibilität beachtet worden ist. Das heißt, selbst ein uraltes IDE-Laufwerk kann an einer neuen IDE-Schnittstelle betrieben werden.
26.4.1 Signale IDE ist aus dem AT-Controller mit ST506-Schnittstelle hervorgegangen, so dass sich die AT-BusFestplatten am Registersatz und der Leistung solcher Festplatten orientieren. IDE bildet also wie SCSI eine logische Schnittstelle zwischen System und Festplatte und akzeptiert High-LevelBefehle wie z.B. Sektor lesen oder Spur formatieren. ESDI und ST412/506 sind hingegen physikalische Schnittstellen zwischen Controller und Laufwerk und betreffen z.B. Steuersignale für die Motoren der Laufwerke, um den Kopf über einer gegebenen Spur zu positionieren. Da bei IDE Controller und Festplatte eine untrennbare Einheit bilden, ist es jedem Hersteller selbst überlassen, wie er die Ansteuerung des Laufwerks und die Übertragung der Daten gestalten möchte. Die Definition einer physikalischen Schnittstelle ist hier also überflüssig. Die physikalische Verbindung zwischen dem Bus im PC und der IDE-Schnittstelle der Laufwerke – oder besser: den Controllern auf den Laufwerken – stellt ein so genannter IDE-Adapter her, der in früheren Zeiten eine simple Einsteckkarte war und heute auf allen Mainboards integriert ist. Das Mainboard übernimmt dabei die Rolle des Hosts. Der Adapter selbst nimmt nur ein paar Puffer und Dekoderschaltkreise auf, die notwendig sind, um die IDE-Laufwerke und den Systembus miteinander zu verbinden. Viele der separaten IDE-Adapter (als ISA-Einsteckkarte) weisen darüber hinaus noch einen Diskettencontroller auf, so dass diese häufig als AT-Bus-Controller bezeichnet werden. Das ist aber nicht ganz korrekt: Der Controller befindet sich nach wie vor unmittelbar auf der Platine des Laufwerks, der Adapter (Host) stellt nur die Verbindung zwischen Laufwerk und Systembus her. Gegenüber dem System erscheinen AT-Bus-Laufwerke prinzipiell wie die Controller und Laufwerke mit ST412/506-Schnittstelle, zumindest war dies der ursprüngliche Ansatz, denn mittlerweile hat sich IDE aufgrund der zahlreichen Erweiterungen im Funktionsumfang SCSI stark angenähert. Zur Verbindung der Laufwerke ist nur ein einziges 40-poliges Flachbandkabel notwendig, mit dem der IDE-Anschluss auf der Einsteckkarte oder dem Mainboard verbunden wird. Maximal kann die IDE-Schnittstelle zwei Laufwerke verwalten. Eines davon muss über Jumper oder DIPSchalter als Master, das andere als Slave konfiguriert werden. Dem Master-Laufwerk ist dann die Adresse 0, dem Slave die Adresse 1 zugeordnet. In Tabelle 26.2 ist die Belegung der 40 Leitungen sowie die Bedeutung der Signale angegeben. IDE-Signal
Pin
Signalbedeutung
AT-Signal
Signalrichtung
RESET GND DD7 DD8 DD6 DD9
1 2 3 4 5 6
Laufwerke zurücksetzen Masse Datenbus 7 Datenbus 8 Datenbus 6 Datenbus 9
RESET DRV 1) -SD7 SD8 SD6 SD9
Host->Laufwerk -bidirektional bidirektional bidirektional bidirektional
Tab. 26.2: Die Belegung des IDE-Schnittstellenkabels
Sandini Bib Festplatten
897
IDE-Signal
Pin
Signalbedeutung
AT-Signal
Signalrichtung
DD5 DD10 DD4 DD11 DD3 DD12 DD2 DD13 DD1 DD14 DD0 DD15 GND 2) DMARQ3) GND DIOW GND DIOR GND IORDY3) SPSYNC DMACK3) GND INTRQ IOCS16 DA1 PDIAG DA0 DA2 CS1Fx CS3Fx DASP GND
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
Datenbus 5 Datenbus 10 Datenbus 4 Datenbus 11 Datenbus 3 Datenbus 12 Datenbus 2 Datenbus 13 Datenbus 1 Datenbus 14 Datenbus 0 Datenbus 15 Masse Markierung für Pin 20 DMA Request Masse Daten über I/O-Kanal schreiben Masse Daten über I/O-Kanal lesen Masse I/O-Zugriff ausgeführt (ready) Spindelsynchronisation DMA Acknowledge Masse Interrupt Request 16-Bit-Transfer über I/O-Kanal Adressbus 1 Passed Diagnostic vom Slave Adressbus 0 Adressbus 2 Chip Select für Basisadresse 1f0h Chip Select für Basisadresse 3f0h Drive Active/Slave Present Masse
SD5 SD10 SD4 SD11 SD3 SD12 SD2 SD13 SD1 SD14 SD0 SD15 DRQx IOW IOR IOCHRDY DACKx IRQx I/OCS16 SA1 SA0 SA2 -
bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional bidirektional Laufwerk->Host Host->Laufwerk Host->Laufwerk Laufwerk->Host Laufw.->Laufw. Host->Laufwerk Laufwerk->Host Laufwerk->Host Host->Laufwerk Laufw.->Laufw. Host->Laufwerk Host->Laufwerk Host->Laufwerk Host->Laufwerk Laufwerk->Host -
1) invertiertes Signal des AT-Bus-Signals 2) Pin gesperrt, um ein verkehrtes Einsetzen des Steckers zu verhindern 3) optional
Tab. 26.2: Die Belegung des IDE-Schnittstellenkabels (Forts.)
Pin 20 des Kabels ist gesperrt, um ein versehentlich verkehrtes Einsetzen des Steckers zu verhindern. Die meisten der 40 IDE-Leitungen können unmittelbar mit dem AT-Systembus (ISA) des PC verbunden werden. Das erklärt auch die Bezeichnung AT-Bus-Schnittstelle. Zwischen dem IDE-Adapter und dem IDE-Laufwerk gibt es nur fünf Signale (CS1Fx, CS3Fx, SPSYNC, DASP und PDIAG), die zur Ansteuerung der IDE-Laufwerke dienen und nicht mit dem AT-Bus verbunden sind. Die ersten beiden Signale CS1Fx und CS3Fx sind Chip-Auswahlsignale, die von der Minimaladapter-Elektronik erzeugt werden, um die Registergruppe mit der Basisadresse 1f0h oder die Registergruppe mit der Basisadresse 3f0h auszuwählen. Welche Bedeutung die zugehörigen Register haben, erfahren Sie weiter unten.
Sandini Bib 898
Kapitel 26
Über das Spindelsynchronisationssignal SPSYNC kann die Rotation der Spindelmotoren von Master und Slave synchronisiert werden. Das ist günstig, wenn z.B. Drive-Arrays gebildet oder ein Mirroring ausgeführt werden soll. Bei vielen IDE-Laufwerken ist diese Möglichkeit aber nicht implementiert, und der SPSYNC-Pin ist dann nicht belegt. Die beiden Signale DASP (Drive Active/Slave Present) und PDIAG (Passed Diagnostic) dienen zur Rückmeldung des Slave an den Master bei der Initialisierung. Auch diese Signale sind bei vielen älteren IDE-Modellen, deren Herstellungsdatum vor der Erstellung des ATA-Standards liegt, nicht vorhanden. Ein optionales, aber dennoch wichtiges Signal ist IORDY. Mit einem niedrigen Pegel kann ein Laufwerk der CPU anzeigen, dass es für den gegenwärtigen I/O-Zyklus, z.B. zum Auslesen des Sektorpuffers oder zur Übergabe des Befehlscodes, zusätzliche Taktzyklen benötigt, also WaitStates eingelegt werden müssen. Viele IDE-Laufwerke verwenden dieses Signal aber nicht und legen die entsprechende Leitung stets auf einen hohen Pegel. Zur Leistungssteigerung definiert der IDE-Standard zwei weitere Signale: DMARQ (DMA Request) und DMACK (DMA Acknowledge), mit deren Hilfe die Datenübertragung per DMA, statt ausschließlich mit programmierter I/O, möglich ist. Die Integration der Controller auf den Laufwerken macht es auch möglich, mehr Intelligenz in die Festplattensteuerung zu packen. Hierzu gehören u.a. intelligente Wiederholungsversuche, wenn ein Zugriff zunächst fehlgeschlagen ist. Wichtig ist in diesem Zusammenhang, dass IDELaufwerke ein automatisches Bad-Sector-Remapping ausführen. Der integrierte Controller reserviert hierfür mehrere Sektoren und Spuren der Festplatte für eine spätere Verwendung im BadSector-Remapping. Erfasst der Controller nun mehrmals hintereinander vergebliche Zugriffe auf den Sektor, die aber trotzdem letztendlich zu einem korrekten Datenzugriff führen, werden die Daten des betreffenden Sektors in einen der reservierten Ersatzsektoren geschrieben und der fehlerhafte Sektor als schlecht markiert. Der Controller aktualisiert anschließend eine interne Tabelle, so dass alle späteren Zugriffe auf den beschädigten Sektor auf den reservierten Sektor umgeleitet werden. Das System oder der Benutzer merken davon überhaupt nichts, denn das intelligente IDE-Laufwerk führt dieses Remapping ohne weiteres Zutun im Hintergrund aus. In einem Computer gehören leistungsfähige Festplatten mit zu den großen Stromverbrauchern, da für eine schnelle Kopfpositionierung relativ hohe Stromimpulse notwendig sind und die Festplatten im Gegensatz zu Diskettenlaufwerken ständig rotieren. Die meisten Laufwerke für mobile Computer (Notebooks) können daher durch Software-Befehle abgeschaltet oder deaktiviert werden, um den Stromverbrauch zu minimieren. Für die IDE-Festplatten nach dem ATA-Standard waren solche Befehle zunächst optional vorgesehen, mittlerweile sind sie jedoch Standard (z.B. S.M.A.R.T). In der Reihenfolge sinkender Leistungsaufnahme können Festplatten in den Modi Aktiv, Idle, Standby und Sleep betrieben werden. Natürlich dauert es am längsten, das Laufwerk vom Sleep- in den Aktiv-Zustand zu bringen. Dazu muss nämlich die Platte erst vom Stillstand auf Nenndrehzahl beschleunigt, der Kopf positioniert und der Controller aktiviert werden. Als intelligente Laufwerke mit integriertem Controller führen die IDE-Festplatten eine Translation von logischer zu physikalischer Geometrie aus. Sie arbeiten ausschließlich mit einem Interleave-Faktor von 1:1 und mit einem RLL-Aufzeichnungsverfahren. Eine IDE-Schnittstelle kann maximal zwei Laufwerke verwalten, die Weiterentwicklung EIDE, die prinzipiell zwei IDEStränge realisiert, demgegenüber vier. Solange sich ein angeschlossenes Laufwerk an die Schnittstellenspezifikation hält, ist es völlig egal, welchen internen Aufbau das Laufwerk besitzt, es muss nur entweder als Master oder als Slave gejumpert werden und das System-BIOS bietet dann die entsprechende Unterstützung.
Sandini Bib Festplatten
899
Eine Beschränkung von IDE ist die maximale Kabellänge von 18 Zoll gleich 46 cm, manche Hersteller erlauben auch bis zu 24 Zoll gleich 61 cm. Für einen Personal Computer in einem großen Tower-Gehäuse ist dies noch ausreichend. Bei diesen Werten handelt es sich um Forderungen des IDE-Standards, es ist also nicht ausgeschlossen, dass die Kabel auch länger sein können. Nur garantiert der IDE-Standard dann keine korrekte Funktion.
26.4.2 Adressen und Register Die CPU greift auf den Controller der IDE-Festplatten über mehrere Daten- und Steuerregister zu, die zusammen als auch AT-Task-File bezeichnet werden und in Tabelle 26.3 ngegeben sind. Sie teilen sich in zwei Registergruppen mit den Port-Basisadressen 1f0h und 3f0h auf. Register
Adresse
Breite [Bit]
Lesen (R)/Schreiben (W)
Datenregister Fehlerregister Vorkompensation Featureregister Sektorenzahl Sektornummer Zylinder LSB Zylinder MSB Laufwerk/Kopf Statusregister Befehlsregister Statusregister (alternativ) Digitales Ausgaberegister Laufwerksadresse
1f0h 1f1h 1f1h 1f2h 1f3h 1f4h 1f5h 1f6h 1f7h 1f7h 3f6h 3f6h 3f7h
16 8 8 8 8 8 8 8 8 8 8 8 8
R/W R W R/W R/W R/W R/W R/W R W R W R
Tab. 26.3: IDE-Kommando und Steuerregister
Das Datenregister kann von der CPU gelesen oder geschrieben werden, um Daten zwischen dem Hauptspeicher und dem Controller zu übertragen. Die Original AT-Schnittstelle unterstützte nur programmierte Ein-/Ausgabe über Register und Ports, nicht aber eine Datenübertragung mit Hilfe der DMA-Steuerung. Das Lesen und Schreiben erfolgt dabei in Portionen zu 16 Bits, nur die ECC-Bytes bei einem Long-Befehl werden byte-weise übergeben. In diesem Fall muss das niederwertige Byte des Registers verwendet werden. Die Daten im Datenregister sind aber nur dann gültig, wenn das DRQ-Bit im Statusregister gesetzt ist. Das Fehlerregister enthält Fehlerinformationen zum zuletzt aktiven Befehl, wenn das ERR-Bit im Statusregister gesetzt und das BSY-Bit im Statusregister gelöscht ist. Ansonsten sind die Einträge im Fehlerregister nicht definiert. In Abbildung 26.10 ist der Aufbau des Fehlerregisters gezeigt. Ein gesetztes Bit NDM zeigt an, dass der Controller auf dem Datenträger keine Datenadressmarke gefunden hat. Ist NT0 gesetzt, so bedeutet dies, dass das Laufwerk nach einem entsprechenden Befehl den Schreib-/Lesekopf nicht über die Spur 0 positionieren konnte. Musste der Controller durch einen Fehler die Ausführung des aktiven Befehls abbrechen, wird das Bit ABT gesetzt. Ist das Bit NID gleich 1, konnte der Controller auf dem Datenträger die betreffende IDAdressmarke nicht finden. Ein gesetztes Bit UNC zeigt an, dass ein nicht korrigierbarer Datenfehler aufgetreten ist: Die Daten sind selbst nach Anwendung des ECC-Codes ungültig. Wenn BBK gleich 1 ist, hat die CPU bereits früher den betreffenden Sektor als schadhaft markiert, auf ihn kann nicht mehr zugegriffen werden.
Sandini Bib 900
6
5
4
3
2
1 0
BBK UNC MC NID MCR ABT NT0 NDM
7
Kapitel 26
BBK: 1=Sektor vom Host als schlecht markiert
0=kein Fehler
UNC: 1=nicht korrigierbarer Datenfehler
0=kein oder behebbarer Datenfehler
NID: 1=ID-Marke nicht gefunden
0=kein Fehler
ABT: Befehlsabbruch (Abort) 1=Befehl abgebrochen
0=Befehl ausgeführt
NT0: 1=Spur 0 nicht gefunden NDM: 1=Datenadressmarke nicht gefunden
0=kein Fehler 0=kein Fehler
nur Enhanced-IDE: MC: 1=Medium gewechselt MCR: 1=Mediumwechsel angefordert
0=Medium nicht gewechselt 0=kein Mediumwechsel angefordert
Abb. 26.10: Fehlerregister
Für die Unterstützung von Laufwerken mit wechselbarem Datenträger sieht Enhanced-IDE (siehe Kapitel 26.5) die beiden (früher reservierten) Bits MC und MCR vor. Ein gesetztes MC-Bit zeigt an, dass das Medium im Laufwerk gewechselt wurde. Es entspricht in seiner Funktion also im Wesentlichen dem Disc-Change-Bit der Diskettenlaufwerke. Ein gesetztes Bit MCR gibt dagegen an, dass der Benutzer z.B. durch Betätigen der Auswurftaste eines CD-ROM-Laufwerks einen Mediumwechsel angefordert hat. Das System muss dann alle laufenden Zugriffe abschließen und einen Impuls oder Befehl an das Laufwerk senden, damit der Datenträger auch wirklich ausgeworfen wird. Bei einem Schreibzugriff fungiert das Fehlerregister (1f1h) als Vorkompensationsregister oder auch als so genanntes Feature-Register. Als Vorkompensationsregister ist es nur aus Kompatibilitätsgründen mit dem Original-AT vorhanden. Die IDE-Festplatten verarbeiten die Vorkompensation intern ohne einen Eingriff der CPU. Laut ATA-Standard wird es mit Hilfe des Befehls Set Features für die Einstellung bestimmter Eigenschaften des Interface gesetzt, jedoch nicht von allen Laufwerken verwendet. Das Sektorzahlregister (1f2h) kann von der CPU gelesen und geschrieben werden, um die Zahl der zu lesenden, zu schreibenden oder zu verifizierenden Sektoren festzulegen. Wenn dem Register der Wert 0 übergeben wird, führt die Festplatte den betreffenden Befehl für 256 Sektoren und nicht für 0 Sektoren aus. Nach jeder Übertragung eines Sektors vom oder zum Hauptspeicher wird der Wert des Registers um eins heruntergezählt. Der Registerinhalt, der über einen INBefehl ausgelesen werden kann, gibt also die Zahl der noch zu lesenden, zu schreibenden oder zu verifizierenden Sektoren an. Auch während einer Formatierung dekrementiert der Controller den Inhalt dieses Registers. Das Sektornummerregister (1f3h) gibt den Startsektor für die Ausführung eines Befehls mit Plattenzugriff an. Nach der Verarbeitung eines jeden Sektors wird der Inhalt des Registers entsprechend dem ausgeführten Befehl aktualisiert. Das Register gibt also stets den zuletzt bearbeiteten Sektor an, und zwar unabhängig davon, ob der Controller den betreffenden Befehl erfolgreich abschließen konnte oder aber nicht. Die beiden Register Zylinder MSB (1f5h) und Zylinder LSB (1f4h) enthalten das höherwertige (MSB) und niederwertige Byte (LSB) der 10-Bit-Zylindernummer. Die zwei höchstwertigen Bits befinden sich im Register Zylinder MSB, die acht niederwertigen im Register Zylinder LSB. Die sechs höherwertigen Bits im Register Zylinder MSB werden ignoriert. Somit können also maxi-
Sandini Bib Festplatten
901
male Zylindernummern zwischen 0 und 1023 dargestellt werden, wie es auch beim Original-AT der Fall ist. Da die IDE-Festplatten üblicherweise eine Translation ausführen, sind die physikalischen Zylinder der Festplatten aber nicht auf diesen Bereich beschränkt – die physikalische Laufwerksgeometrie wird dann in eine logische umgesetzt, die eine maximale Zylindernummer von 1023 aufweist. Nach der Verarbeitung eines jeden Sektors werden die Inhalte der beiden Register aktualisiert. Die Register geben also stets die aktuelle Zylindernummer an. Aktuellere Laufwerke verarbeiten aber auch die sechs höherwertigen Bits des MSB-Zylinderregisters 1f5h. Dadurch sind dann bis zu 65.535 Zylinder zugänglich. Mit Hilfe des Registers Laufwerk/Kopf (1f6h) ist das Laufwerk zu definieren, für das der betreffende Befehl ausgeführt werden soll. Außerdem wird der Startkopf definiert, mit dem ein Plattenzugriff beginnt. In Abbildung 26.11 ist das Format dieses Registers gezeigt. 6
5
1 L 1
4
3
2
1 0
DRV HD3 HD2 HD1 HD0
7
DRV: Laufwerk 1=Slave
0=Master
HD3–HD0: Kopfnummer (Binärzahl) 0000=Kopf 0 0001=Kopf 1 0010=Kopf 2 nur Enhanced-IDE: L: 1=LBA-Modus
...
1111=Kopf 15
0=CHS-Modus
Abb. 26.11: Register Laufwerk/Kopf (1f6h)
Die drei höchstwertigen Bit besitzen stets den Wert 101b. Das Bit DRV definiert das adressierte Laufwerk, und die vier Bits HD3–HD0 geben die Nummer des Kopfes an, mit dem der betreffende Befehl beginnt. Maximal können also 16 Köpfe angesprochen werden. IDE-Laufwerke, die auch eine logische Blockadressierung (LBA) ausführen können, implementieren zusätzlich das L-Bit. Ist sein Wert gleich 1, dann wird LBA für den aktuellen Zugriff aktiviert. Das Statusregister (1f7h) kann von der CPU nur gelesen werden und enthält Statusinformationen zum letzten aktiven Befehl. Der Controller aktualisiert das Statusregister nach jedem Befehl oder beim Auftreten eines Fehlers. Auch bei einer Datenübertragung zwischen Hauptspeicher und Controller wird das Register aktualisiert, um ein Handshaking auszuführen. Wenn die CPU das Statusregister liest, wird automatisch eine eventuell anhängige Interrupt-Anforderung – im PC über IRQ14 – storniert. Das BSY-Bit wird vom Laufwerk gesetzt, um anzuzeigen, dass es gerade einen Befehl ausführt. Ist BSY gesetzt, dürfen mit Ausnahme des digitalen Ausgaberegisters keine Register angesprochen werden. Im günstigsten Fall enthalten sie unnütze Informationen, im ungünstigsten stören sie die Abarbeitung des aktiven Befehls. Ein gesetztes Bit RDY zeigt an, dass das Laufwerk die Nenndrehzahl erreicht hat und Befehle annehmen kann. Sind die Drehzahlabweichungen des Spindelmotors z.B. durch eine zu geringe Versorgungsspannung außerhalb der zulässigen Toleranz, setzt der Controller das RDY-Bit auf 0. Ein gesetztes WFT-Bit zeigt an, dass der Controller einen Schreibfehler erfasst hat. Ist das SKC-Bit gleich 1, so hat das Laufwerk die explizite oder implizite Kopfpositionierung abgeschlossen. Unmittelbar vor dem Beginn einer Kopfpositionierung löscht das Laufwerk das SKC-Bit. Ein gesetztes DRQ-Bit zeigt an, dass das Datenregister zur Ausgabe oder Annahme von Daten bereit ist. Ist DRQ gleich 0, so dürfen Sie Daten vom Datenregister weder lesen noch an dieses übergeben. Der Controller setzt das CORR-Bit, um der CPU anzuzeigen, dass er Daten mit Hilfe der ECC-Bytes korrigiert hat.
Sandini Bib 902
6
5
4
3
2
1 0
BSY RDY WFT SKC DRQ COR IDX ERR
7
Kapitel 26
BSY:
Belegt (Busy) 1=Laufwerk ist belegt
RDY:
Bereit (Ready) 1=Laufwerk bereit
0=nicht bereit
WFT:
Schreibfehler (Write Fault) 1=aufgetreten
0=keine Schreibfehler
SKC:
Positionierung 1=abgeschlossen
DRQ:
Daten 1=können übertragen werden
CORR: korrigierbarer Datenfehler 1=aufgetreten
0=kein Datenzugriff möglich 0=kein Datenfehler
IDX:
Plattenindex 1=Plattenindex wurde durchlaufen
ERR:
Fehler 1=Fehlerregister enthält Fehlerinformation
Abb. 26.12: Statusregister (1f7h)
Das Befehlsregister (1f7h) dient zur Übergabe von Befehlscodes und kann von der CPU lediglich geschrieben werden. Das Befehlsregister befindet sich an derselben Port-Adresse wie das nurlesbare Statusregister. Der IDE-Standard kennt insgesamt nur acht Befehle mit mehreren Abwandlungen. Der offizielle ATA-Standard definiert zahlreiche weitere Befehle, wovon einige auch optional sind, was zudem von der jeweiligen Revision des ATA-Standards (ATA 1-4) abhängig ist. Mit dem letzten Stand der Spezifikation (ATA-4) sind es mittlerweile über 70 Kommandos, sodass ich mich hier nur kurz auf die grundlegenden beschränken möchte. Die Ausführung eines Befehls beginnt unmittelbar nachdem das Befehlsbyte in das Befehlsregister geschrieben wurde. Zunächst sind daher also alle anderen notwendigen Daten an die entsprechenden Register zu übergeben, bevor durch Schreiben des Befehlscodes die Befehlsausführung gestartet wird. In Tabelle 26.4 sind die grundlegenden IDE-Befehle und die Parameterregister für Festplatten aufgeführt, die für die entsprechenden Befehle vorbereitet werden müssen. Befehl Laufwerk kalibrieren Sektor lesen Sektor schreiben Sektor verifizieren Spur formatieren Kopf positionieren Diagnose Laufwerksparameter einstellen SZ: Sektorenzahl SN: Sektornummer ZY: Zylinder MSB und LSB DR: Laufwerk (im Register Laufwerk/Kopf) HD: Kopf (im Register Laufwerk/Kopf) xx: Parameter für den Befehl erforderlich
Tab. 26.4: Parameterregister für die Befehle
SZ
SN
ZY
DR
HD
xx xx xx
xx xx xx
xx xx xx xx xx
xx xx xx xx xx xx
xx xx xx xx xx
xx
xx
Sandini Bib Festplatten
903
Neben dem Statusregister unter der Port-Adresse 1f7h existiert noch ein alternatives Statusregister unter der Adresse 3f6h. Es besitzt denselben Aufbau wie das »normale« Statusregister und enthält die gleichen Informationen. Der einzige Unterschied zwischen beiden Registern ist, dass ein Auslesen des alternativen Statusregisters eine aktive Interrupt-Anforderung über IRQ14 hier nicht storniert.
3
2
1 0
x x x x x
SRST
IEN
Unter derselben Port-Adresse 3f6h ist auch das digitale Ausgaberegister DOR lokalisiert, das von der CPU nur geschrieben werden kann. Das DOR (vgl. Abbildung 26.13) dient zur Definition des Controllerverhaltens. 7
x
SRST: Software-Reset IEN: Interrupt-Aktivierung X: nicht belegt
1=Reset 1=IRQ14 gesperrt
0=kein Reset 0=IRQ14 möglich
Abb. 26.13: Digitales Ausgaberegister (3f6h)
Wenn das SRST-Bit gesetzt ist, wird für alle angeschlossenen Laufwerke ein Reset durchgeführt. Der Reset-Zustand ist so lange aktiv, bis das Bit gleich 1 wird. Erst wenn das SRST-Bit wieder gelöscht wird, können die zurückgesetzten Laufwerke Befehle annehmen. Über das Bit IEN wird die Interrupt-Anforderung der Laufwerke an die CPU gesteuert. Ist IEN gelöscht, d.h. gleich 0, wird nach jedem für einen Sektor ausgeführten Befehl oder vor dem Eintritt in die Ergebnisphase über IRQ14 ein Interrupt ausgelöst. Ist IEN hingegen auf 1 gesetzt, ist IRQ14 ständig gesperrt, die Laufwerke können keine Interrupts auslösen. In diesem Fall kann die CPU den Controller nur noch durch Polling überwachen.
7
6
5
x
WTGT
HS3 HS2 HS1 HS0 DS1 DS0
Über das nur-lesbare Laufwerksadressregister (3f7h) ist zu ermitteln, welches Laufwerk und welcher Kopf gegenwärtig aktiv und ausgewählt ist. In der Abbildung 26.14 ist der Aufbau dieses Registers angegeben. 4
3
2
1 0
x: nicht belegt 0=aktiv WGTG: Write-Gate 1=inaktiv HS3–HS0: aktiver Kopf als ein Komplement 0001=Kopf 15 0010=Kopf 14 ... 1111=Kopf 0 0=Laufwerk aktiv 1=Laufwerk inaktiv DS1: Laufwerk 1 0=Laufwerk aktiv 1=Laufwerk inaktiv DS0: Laufwerk 2 Abb. 26.14: Laufwerksadressregister (3f7h)
Ist das WTGT-Bit gelöscht, d.h. gleich 0, ist das Schreibgatter des Controllers geöffnet und der Schreib-/Lesekopf schreibt gerade Daten auf die Platte. Die vier Bits HS3–HS0 geben den gegenwärtig aktiven Kopf als Einer-Komplement an. In ähnlicher Weise bezeichnen die beiden Bits DS1 und DS0 das gegenwärtig ausgewählte Laufwerk.
26.4.3 Befehlsphasen und Programmierung Die Programmierung und Abarbeitung der Befehle für eine IDE-Schnittstelle läuft ähnlich wie beim Diskettencontroller oder den anderen Festplattenschnittstellen in drei Phasen ab:
Sandini Bib 904
: : :
Kapitel 26
Befehlsphase: Die CPU bereitet die Parameterregister vor und übergibt den Befehlscode, um die Ausführung zu starten. Datenphase: Bei Befehlen mit einem Plattenzugriff positioniert das Laufwerk die Schreib-/ Leseköpfe und überträgt gegebenenfalls die Daten zwischen Hauptspeicher und Festplatte. Ergebnisphase: Der Controller stellt in den entsprechenden Registern Statusinformationen zum ausgeführten Befehl bereit und löst über IRQ14 einen Hardware-Interrupt entsprechend INT 76h aus.
Die Befehls- und Datenregister des Controllers werden von der CPU, wie oben erläutert, über Ports geschrieben und gelesen.
:
:
:
Sektor lesen: Der Controller aktiviert immer dann IRQ14, wenn die CPU einen Sektor – gegebenenfalls zuzüglich der ECC-Bytes – aus dem Sektorpuffer lesen kann. Im Gegensatz zu allen anderen Befehlen löst dieser Befehl zu Beginn der Ergebnisphase aber keinen Hardware-Interrupt aus. Die Zahl der Hardware-Interrupts stimmt also mit der Zahl der gelesenen Sektoren überein. Sektor schreiben: Der Controller aktiviert immer dann IRQ14, wenn er Sektordaten von der CPU erwartet. Zu beachten ist, dass der erste Sektor unmittelbar nach der Aktivierung des Befehls übergeben wird und der Controller dazu keinen Interrupt auslöst. Außerdem aktiviert der Controller zu Beginn der Ergebnisphase über IRQ14 einen Hardware-Interrupt. Die Zahl der Hardware-Interrupts stimmt also auch hier mit der Zahl der geschriebenen Sektoren überein. Alle anderen Befehle: Der Controller löst zu Beginn der Ergebnisphase über IRQ14 einen Hardware-Interrupt aus.
Der Interrupt-Handler für INT 76h entsprechend IRQ14 muss also unterscheiden können, ob der Controller Daten ausgeben möchte, auf sie wartet, oder ob es sich um einen Interrupt handelt, der den Beginn der Ergebnisphase anzeigt. Der Controller IRQ14 wird deaktiviert, sobald die CPU das Statusregister (1f7h) liest. Soll IRQ14 weiter aktiv bleiben, müssen die Statusinformationen über das alternative Statusregister (3f6h) gelesen werden. Bei einer Programmierung ist aber zu beachten, dass der Controller des adressierten Laufwerks sofort mit der Befehlsausführung beginnt, nachdem die CPU den Befehlscode in das Befehlsregister geschrieben hat. Daher sind also zuerst alle Parameterregister mit den notwendigen Werten zu laden, bevor durch die Übergabe des Befehlscodes an den Controller die Befehlsausführung gestartet wird. Exemplarisch möchte ich an dieser Stelle einen Befehl genauer erläutern: vier Sektoren ab Zylinder 167, Kopf 3, Sektor 7 mit ECC-Byte schreiben. Das Format für diesen Befehl ist in Abbildung 26.15 gezeigt. Bit AT-Task-FileRegister 7 6 5 4 3 2 1 0 1 0 Befehl (1f7h) 0 0 1 0 L R Sektorenzahl (1f2h) Zahl der zu schreibenden Sektoren Sektornummer (1f3h) S7 S6 S5 S4 S3 S2 S1 S0 Zylinder LSB (1f4h) Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 0 0 0 0 0 Z9 Z8 Zylinder MSB (1f5h) 0 Laufwerk/Kopf (1f6h) 1 0 1 DRV HD3 HD2 HD1 HD0
Abb. 26.15: Sektor schreiben
Sandini Bib Festplatten
905
Ist das Bit L gesetzt, werden auch die vier ECC-Bytes von der CPU geliefert und nicht intern vom Controller erzeugt. Die ECC-Logik führt dann keine ECC-Prüfung aus. Für einen Sektor sind also 516 Bytes zu übergeben. Ist L gleich 0, so bedeutet das einen normalen Schreibbefehl, die CPU übergibt nur die 512 Datenbytes an den Controller, der intern die vier ECC-Byte erzeugt und sie zusammen mit den Datenbytes auf die Platte schreibt. Das Bit R steuert die interne Wiederholungslogik des Controllers. Ist R gesetzt, so führt der Controller eine eingebaute Wiederholungsprozedur aus, wenn er bei der Befehlsausführung auf einen Daten- oder Adressfehler stößt. Nur wenn diese Wiederholungsversuche erfolglos sind, bricht der Controller den Befehl ab und kehrt mit einem Fehlercode zurück. Ist R gelöscht, so bricht der Controller ohne Wiederholungsversuch den Befehl sofort ab, wenn ein Fehler auftritt. Mit Zahl der zu schreibenden Sektoren kann die Anzahl der Sektoren angegeben werden, die auf Platte geschrieben werden sollen. Gültig sind Werte zwischen 0 und 255, wobei der Wert 0 zum Schreiben von 256 Sektoren führt. Die Sektornummer S7–S0 gibt die Nummer des Startsektors an, der zuerst geschrieben werden soll. Ist die Zahl der zu schreibenden Sektoren größer als 1, zählt der Controller intern automatisch die Sektornummer hoch, bis er ans Spurende kommt. Anschließend macht er mit dem nächsten Kopf und unter Umständen sogar mit dem nächsten Zylinder weiter, bis alle Sektoren geschrieben worden sind oder ein Fehler auftritt. Die Werte Z9–Z0 der Zylindernummer geben den Startzylinder für den Schreibvorgang an. Die beiden Bits Z9 und Z8 stellen die zwei höchstwertigen Bits der 10-Bit-Zylindernummer dar. Mit DRV wählen Sie eines der beiden Laufwerke aus und mit HD3–HD0 den Kopf des Laufwerks, für den der Befehl ausgeführt werden soll. Unmittelbar, nachdem das Befehlsbyte geschrieben worden ist, beginnt der Controller mit der Befehlsausführung – der Datenphase. Er setzt das BSY-Bit im Statusregister, um anzuzeigen, dass er den Befehl dekodiert und den Sektorpuffer zur Aufnahme der 512 Datenbytes und vier ECCBytes vorbereitet. Ist das geschehen, löscht der Controller das BSY-Bit und setzt das DRQ-Bit im Statusregister, um der CPU mitzuteilen, dass er auf die Sektordaten wartet. Die CPU übergibt zunächst wortweise die 512 Datenbytes und anschließend byteweise die vier ECC-Bytes. Sind alle 516 Sektorbytes übertragen worden, setzt der Controller erneut das BSY-Bit, löscht das DRQBit und beginnt damit, die Daten auf Platte zu schreiben. Ist der erste Sektor geschrieben worden, löst der Controller über IRQ14 einen Interrupt 76h aus. Der betreffende Handler übergibt nun die 516 Bytes der nächsten Sektordaten in gleicher Weise über das Datenregister an den Controller. Dieser Vorgang wiederholt sich insgesamt viermal, bis alle vier Sektoren mit den ECC-Bytes geschrieben worden sind. Beispiel: Vier Sektoren ab Zylinder 167, Kopf 3, Sektor 7 mit ECC-Bytes auf das Master-Laufwerk schreiben unsigned int word_buffer[1024]; unsigned char byte_buffer[16]; unsigned int *word_pointer; unsigned char *byte_pointer; int int_count; main() { int word_count, byte_count; void far *old_irq14; word_pointer = &word_buffer; byte_pointer = &byte_buffer; init_buffers(); old_irq14=_dos_getvect(0x76); _dos_setvect(0x76, new_irq14());
/* /* /* /* /*
Zeiger */ initialisieren */ Puffer initialisieren */ neuen Interrupt */ für IRQ14 setzen */
Sandini Bib 906
Kapitel 26
while((inp(0x1f7) & 0x80) == 0x80); /* warten, bis BSY im Statusregister gelöscht ist*/ outp(0x1f2, 0x04); /* Register Sektorenzahl: vier Sektoren */ outp(0x1f3, 0x07); /* Register Sektornummer: 7 */ outp(0x1f4, 0xa7); /* Register Zylinder LSB: 167 */ outp(0x1f5, 0x00); /* Register Zylinder MSB: 0 */ outp(0x1f6, 0xa3); /* Register Laufwerk/Kopf: DRV=0, Kopf=3 */ outp(0x1f7, 0x33); /* Register Befehl: Opcode=001100, L=1, R=1 */ /* ersten Sektor (512 Datenbyte + 4 ECC-Byte schreiben */ while((inp(0x1f7) & 0x80) == 0x80 || (inp(0x1f7) & 0x08) != 0x08); /* warten, bis BSY im Statusregister */ /* gelöscht und DRQ gesetzt ist */ word_pointer = word_buffer; /* Zeiger initialisieren */ for (word_count = 0; word_count < 256; word_count++,word_pointer++) {outpw(0x1f0, *word_pointer); /* 256 Worte = 512 Datenbyte übergeben */ } byte_pointer = byte_buffer; /* Zeiger initialisieren */ for (byte_count = 0; byte_count < 4; byte_count++, byte_pointer++) {outp(0x1f0, *byte_pointer); /* 4 ECC-Bytes übergeben */ } int_count=0;
/* Interrupt-Zählung initialisieren */
while (int_count < 4);
/* warten, bis alle vier Sektoren */ /* übertragen worden sind */
_dos_setvect(0x76, old_irq14()); /* alten IRQ14 setzen */ status_check();
/* Statusinformationen prüfen und ggfs.*/ /* Fehlercode ermitteln */
exit(0); } void interrupt far new_irq14() { int word_count, byte_count; int_count++; if (int_count < 4) {
/* Interrupt zu Beginn der Ergebnisphase */ /* ignorieren */ for (word_count = 0; word_count < 256; word_count++, word_pointer++) {outpw(0x1f0, *word_pointer); /* 256 Worte = 512 Datenbytes übergeben */ } for (byte_count = 0; byte_count < 4; byte_count++, byte_pointer++) {outp(0x1f0, *byte_pointer); /* 4 ECC-Bytes übergeben */ }
} return; }
Im Beispiel dient der Handler für IRQ14 nur zur Übergabe der Daten; eine weitergehende Funktion, z.B. zur Untersuchung der Interrupt-Quelle, ist nicht vorhanden. Die 2048 Datenbytes zu 1024 Datenworten und die 16 ECC-Bytes müssen geeignet initialisiert werden, aus Platzgründen für das Listing geschieht das hier nicht. Außerdem ist die zur Prüfung der Statusinformationen vorgesehene Prozedur status_check() nicht näher aufgeführt. Mit dem letzten Interrupt wird die Ergebnisphase eingeleitet. In Abbildung 26.16 sind diejenigen Register angegeben, die nach dem Befehl gültige Statusinformation enthalten. Anhand der Sektorkennung ist der zuletzt geschriebene Sektor oder der Sektor, der zum Befehlsabbruch geführt hat, zu ermitteln. Das Register Sektorenzahl gibt die Anzahl der noch zu schreibenden Sektoren an. Bei einer fehlerfreien Beendigung des Befehls ist dieser Wert also gleich 0.
Sandini Bib Festplatten
AT-Task-FileRegister Fehler (1f1h) Sektorenzahl (1f2h) Sektornummer (1f3h) Zylinder LSB (1f4h) Zylinder MSB (1f5h) Laufwerk/Kopf (1f6h) Status (1f7h)
907
Bit 7 6 5 4 3 2 1 0 NDM NT0 ABT x NID x UNCBBK Zahl der geschriebenen Sektoren S7 S6 S5 S4 S3 S2 S1 S0 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 0 0 0 0 0 0 Z9 Z8 1 0 1 DRV HD3 HD2 HD1 HD0 BSY RDY WFT SKC DRQ COR IDX ERR
NDM:
1=Datenadressmarke nicht gefunden
0=kein Fehler
NT0:
1=Spur 0 nicht gefunden
0=kein Fehler
ABT:
Befehlsabbruch (Abort) 1=Befehl abgebrochen
0=Befehl ausgeführt
NID:
1=ID-Marke nicht gefunden
0=kein Fehler
UNC:
1=nicht korrigierbarer Datenfehler 0=kein oder aber behebbarer Datenfehler
BBK: DRV:
1=Sektor vom Host als schlecht markiert Laufwerk 1=Slave 0=Master
0=kein Fehler
Z9–Z0, S7–S0, HD3–HD0: Sektorkennung des zuletzt geschriebenen Sektors Abb. 26.16: Ergebnisphase Sektor schreiben
26.5 Enhanced IDE Aufgrund der Kompatibilität zum ST412/506-Controller ist die maximale Speicherkapazität einer IDE-Festplatte auf 528 MByte begrenzt. Sie errechnet sich aus der maximalen Anzahl der Zylinder (1024), Köpfe (16), Sektoren (63) und der Kapazität eines Sektors, der unter DOS immer über 512 Byte beträgt. Diese Daten miteinander multipliziert, ergeben eben 528 MByte bzw. richtiger 504 MByte, wenn man mit »echten« Bytes rechnet (1 MByte = 1024 x 1024 Byte). Diese Limitierung ließ die Hersteller, insbesondere die Firma Western Digital, die letztendlich aufgrund ihres Controllers (WD1003) für diese Begrenzung sorgte, nicht ruhen, zumal höhere Kapazitäten bis dahin ausschließlich von SCSI-Festplatten zur Verfügung gestellt werden konnten, die üblicherweise mit einer eigenen Controllerkarte (Hostadapter) und einem auf dem Adapter befindlichen eigenen BIOS arbeiten. Im Jahre 1993 erschien daher die Enhanced-IDE-Spezifikation, die eine maximale Speicherkapazität von 7,8 GByte für IDE-Festplatten ermöglicht, indem nicht 16, sondern 255 Köpfe verwaltet werden können. Dies entspricht der maximalen Anzahl an Köpfen (vgl. Tabelle 26.5), die über den BIOS-Interrupt 13 unter DOS gesteuert werden können. Des Weiteren bietet EIDE die Möglichkeit, insgesamt vier – statt maximal zwei wie bei IDE – Geräte anzuschließen, was durch einen zweiten Port realisiert wird. Pro Port lässt sich jeweils ein Master- und ein Slave-Gerät konfigurieren. Dazu ist ein zweites IDE-Task-File bei 170h–177h und 376h–377h implementiert. Heutzutage spricht man ganz allgemein von IDE-Festplatten oder auch -Controllern, weil das E(nhanced) in den Bezeichnungen weggelassen wird, obwohl genau genommen eben EIDE gemeint ist. Ganz allgemein kann man feststellen, dass jede IDE-Einheit, die seit dem Jahre 1994 hergestellt worden ist, auch dem EIDE-Standard entspricht.
Sandini Bib 908
Kapitel 26
26.5.1 Logical Block Addressing Die Erhöhung der Speicherkapazität wird durch das Logical Block Addressing (LBA) erreicht. Die Kapazität einer IDE-Festplatte, die LBA unterstützt, wird beim Booten über das Identify-Kommando (ATA-Kommando) vom BIOS ermittelt. Es setzt die Kapazität dann in eine bestimmte Anzahl logischer Blöcke um, die an das Betriebssystem in Form eines CHS-Formats übermittelt werden. CHS steht dabei für Cylinder, Heads und Sectors und kennzeichnet die Standardbetriebsart einer IDE-Festplatte. Das Laufwerk erscheint durch das LBA als kontinuierliches Medium mit aufeinander folgenden Blöcken. Die umständliche Adressierung von Daten über eine Umsetzung in Zylinder, Kopf und Sektor entfällt bzw. der Laufwerkscontroller erledigt dies automatisch. Das bedeutet keinen Mehraufwand, weil der Controller ja ohnehin die logische in die physikalische Geometrie (Translation) umrechnen muss. Um LBA für einen Zugriff zu aktivieren, ist das L-Bit im Laufwerk/Kopf-Register bei 1f6h (siehe Abbildung 26.11) zu setzen. Parameter
BIOS
IDE (ATA)
LBA (EIDE)
CHS (IDE)
Sektorgröße Sektorenanzahl Zylinderanzahl Kopfanzahl Maximale Kapazität
512 Byte 63 1024 255 7,8 GByte
512 Byte 255 65536 16 128 GByte
512 Byte 63 1024 255 7,8 GByte
512 Byte 63 1024 16 504 MByte
Tab. 26.5: Die maximalen Speicherkapazitäten, die durch das PC-BIOS und die IDE-Standards gegeben sind.
Der IDE-Standard selbst (d.h. die Registerauslegung) lässt mit 255 Sektoren und 65.536 Zylindern immerhin 128 GByte zu. Mithilfe der logischen Blockadressierung ist diese Kapazität durchaus nutzbar, jedoch aufgrund der Limitierung, dass das BIOS nur mit maximal 1024 Zylindern umgehen kann, ist dies nur mit speziellen Treibern möglich, die automatisch durch aktuelle Betriebssysteme zur Verfügung gestellt werden. Um Enhanced-IDE nutzen zu können, muss die Festplatte explizit den LBA-Modus unterstützen, und es wird ein Enhanced-IDE-Controller benötigt, der sich heutzutage gleich mit auf dem Mainboard befindet. Falls allerdings kein EIDE-BIOS vorhanden ist, kann man sich mit speziellen Programmen wie etwa dem IDEnhancer oder dem DiskManager der Firma Ontrack behelfen. Ist man im Besitz einer älteren BIOS-Version, tut man aber stets gut daran, auf die Lieferung eines entsprechenden Tools zu bestehen, damit die maximale Kapazität einer EIDE-Festplatte auch ausgenutzt werden kann und man nicht im Nachhinein nach einem entsprechenden Programm suchen muss. Unter DOS ist jedoch bei 7,8 GByte das Ende der Fahnenstange erreicht, d.h. mehr lässt sich hiermit auf keinen Fall adressieren. In der Vergangenheit konnte man beobachten, dass die BIOS-Hersteller die notwendige Parameterumsetzung nicht gleich komplett für maximal 128 GByte implementiert haben, sondern bestimmte Grenzen auftreten (lassen), die sich mitunter aber durch einen BIOS-Update beheben lassen. Beim Übergang von 504 MByte zu LBA war bereits vielfach eine Grenze bei 2 GByte gegeben, und als die Festplattenkapazitäten weiter stiegen, war dann bei 7,8 GByte Schluss, und zuletzt bei 32 GByte. Daher ist es eine übliche Praxis, dass bei jeder Überschreitung einer dieser (künstlichen) Grenzen ein Problem auftritt und u.U. die maximale Kapazität einer neuen Festplatte eben nicht voll ausgenutzt werden kann. BIOS-Updates und zusätzliche Tools sind aus diesem Grunde nach wie vor oftmals vonnöten. Die neueste ATA-Spezifikation sieht eine Unterstützung von Festplatten mit einer Kapazität von größer als 128 GByte vor, so dass bei derartigen Kapazitäten erneut eine Erweiterung notwendig
Sandini Bib Festplatten
909
wird. Hierfür ist eine Sektor-Adressierung mit 48 Bit statt wie bisher mit 28 Bit (228 x 512 = 128 GByte) definiert, womit sich dann theoretisch eine Festplatte mit 128 Petabyte adressieren lassen könnte. Diese 48-Bit-Adressierung wird dadurch realisiert, dass das IDE-Adressregister zweimal hintereinander gelesen wird: erst der höherwertige, dann der niederwertige Teil der Sektornummer, wofür neue ATA-Kommandos implementiert werden, jedoch keinerlei elektrische Veränderungen notwendig sind. Demnach könnte auch hier ein BIOS-Update für die Verwendung von Festplatten mit einer Kapazität von über 128 GByte sorgen. Das Betriebssystem muss diese Adressierungsart allerdings ebenfalls unterstützen, was dann erstmalig Windows XP mit Service Pack 1 leisten kann. Mainboards, die den Ultra DMA 6-Mode mit 133 MByte/s unterstützen, sollten standardmäßig auch mit der 48-Bit-Adressierung umgehen können.
26.5.2 EIDE-Anschlüsse An einem IDE-Adapter können, wie erläutert, maximal zwei Laufwerke angeschlossen werden. Enhanced-IDE stellt eine Erweiterung gegenüber IDE in Form eines zweiten Ports dar, wodurch dann maximal vier Laufwerke zu verwenden sind. Die Ports werden als Primär und als Sekundär bezeichnet, und die Master-Slave-Topologie ist auch hier wieder gegeben. Der zweite Port verwendet standardmäßig den DMA-Kanal 5 und den IRQ 15. Elektrische Änderungen von IDE auf EIDE ergeben sich ansonsten nicht.
Standard-IDE-Adapter Primäre IDE-Schnittstelle
IDE-Schnittstelle
Festplatte Master
EIDE-Adapter
CD-ROM-LW Slave
Festplatte Master
Festplatte Slave
Sekundäre IDE-Schnittstelle
DVD-LW Master
CD-Writer Slave
Abb. 26.17: EIDE besitzt gegenüber IDE zwei Ports, wodurch maximal vier Laufwerke in der Master/SlaveKonstellation möglich sind.
Eine weitere Neuerung von Enhanced-IDE ist die Anschlussmöglichkeit von ATAPI-Devices wie CD-ROM-, Streamer- oder ZIP-Laufwerken, die natürlich hierfür ausgelegt sein müssen. Diese Einheiten müssen den erweiterten IDE-Befehlssatz unterstützen (ATAPI, Attachment Packet Interface), damit sie mit einem entsprechenden Enhanced-IDE-Controller kommunizieren können. Prinzipiell sind ATAPI-Laufwerke auch an einem »normalen« IDE-Controller einsetzbar, gleichwohl gab es hier in der Praxis immer wieder Probleme im Zusammenhang mit der Master/SlaveKonstellation, und es war durchaus keine Ausnahme, dass selbst zwei Festplatten nicht zusammen an einem Port (IDE) funktionieren wollten, was aber inzwischen Vergangenheit sein sollte.
26.5.3 PIO-, DMA- und Ultra-DMA-Modes Mit IDE (um jetzt auch bei der verkürzten Schreibweise zu bleiben) sind verschiedene Übertragungsarten möglich, die vom Laufwerks- und BIOS-Typ abhängig sind. In Tabelle 26.6 sind die üblichen Modes mit ihren typischen Zykluszeiten (ns) und maximalen Datenübertragungsraten (MByte/s) angegeben, die jedoch nichts über die tatsächliche Performance einer EIDE-Festplatte besagen, denn diese Daten beziehen sich allein auf die Datenübertragungsrate auf dem Bus zwischen Adapter und Laufwerkselektronik. Letztendlich bestimmt die Festplatte durch ihre Geschwindigkeit und die Größe des internen Festplatten-Cache-Speichers, wie schnell die Daten verarbeitet werden können.
Sandini Bib 910
Kapitel 26
Die einfachste IDE-Betriebsart ist zunächst ein PIO-Mode, der im Polling-Betrieb ohne jegliches Handshaking zwischen der Festplatten- und der Mainboard-Elektronik ausgeführt wird. Die CPU des PCs ist hier für jede Datenübertragung verantwortlich, während dies bei SCSI im Busmaster-DMA-Betrieb üblicherweise eigenständig vom SCSI-Hostadapter erledigt wird. Zur Beschleunigung der Datenübertragung wurden (mit EIDE) zwei neue PIO-Modi (3, 4) und zwei neue DMA-Modi (Mode 1, 2: Multiwort) eingeführt. Bei den PIO-Modi 3 und 4 wird zur Kennzeichnung, dass neue Daten verfügbar sind, die IORDY-Leitung des ISA-Bus als Meldeleitung (Handshake) verwendet. Bei den DMA-Betriebsarten erfolgt die Kontrolle der Datenübernahme mit den bei IDE beschriebenen DMA-Leitungen, was nunmehr auch Busmaster-DMA ermöglicht, für deren Funktion zumeist nachträglich ein Treiber für das jeweilige Betriebssystem zu installieren ist, der zum Lieferumfang aktueller Mainboards gehört. Typ
Mode 0
Mode 1
Mode 2
Mode 3
Mode 4
Mode 5
Mode 6
PIO
600 ns 3,33 MByte/s
383 ns 5,22 MByte/s
240 ns 8,33 MByte/s
180 ns 11,11 MByte/s
120 ns 16,6 MByte/s
–
–
EinzelwortDMA
960 ns 2,08 MByte/s
480 ns 4,16 MByte/s
240 ns 8,33 MByte/s
–
–
–
–
MultiwortDMA
480 ns 4,16 MByte
150 ns 13,3 MByte
120 ns 16,6 MByte/s
–
–
–
–
Ultra-DMA
240 ns 16,66 MByte/s
160 ns 25 MByte/s
120 ns 33,33 MByte/s
90 ns 44 MByte/s
60 ns 66 MByte/s
40 ns 100 MByte/s
30 ns 133 MByte/s
Tab. 26.6: Kenndaten der IDE-Übertragungsarten
Der letzte Standard bei den IDE-Betriebsarten ist Ultra-DMA (UDMA) wobei es hier von UltraDMA/33 bis hin zu Ultra-DMA/133 geht, was zu einer maximalen Transferrate von 133 MByte/s führen soll. Diese Datenraten ergeben sich jedoch – wie immer – auf dem Bus und nicht etwa direkt zwischen PC-Elektronik und der Festplatte. Es können also nur solche Laufwerke von Ultra-DMA profitieren, für die sich der PIO-Mode 4 mit 16,6 MByte/s als Bremse darstellt. Mit Ultra-DMA wurde eine Fehlererkennung (CRC) zwingend eingeführt, wodurch Fehler in der Datenübertragung erkannt und die Daten erneut angefordert werden, was fehlerhafte Daten auf der Festplatte verhindern soll, doch bei der Verwendung eines PIO-Modes im Prinzip jederzeit wieder auftreten kann, da die Daten hier von der CPU ohne irgendwelche Kontrollmechanismen auf die Platte »geschaufelt werden«. (E)IDE
DIOR DIOW IORDY
Ultra-DMA, Ultra-ATA
(E)IDE
Lesen
Schreiben
HDMARDY (Daten) Stop (Unterbrechung) DSTROBE (Lesetakt)
HSTROBE (Schreibtakt) Stop (Unterbrechung) DDMARDY (Daten)
Tab. 26.7: Mit Ultra-DMA erhielten drei IDE-Signale eine neue Bedeutung, wobei deren Funktion sich beim Lesen oder Schreiben ändert.
Des Weiteren ist mit Ultra-DMA – oder Ultra-ATA, wie es auch bezeichnet wird – eine Terminierung der Signalleitungen festgelegt worden, was bei SCSI praktisch seit Anbeginn praktiziert
Sandini Bib Festplatten
911
wird. Laut Spezifikation darf das Verbindungskabel dann eine maximale Länge von 46 cm besitzen. Außerdem haben die Signale DIOR, DIOW und IORDY neue Funktionen erhalten, die nun für das Handshaking (die Steuerung der Datenübernahme) zuständig sind. Das Verbindungskabel und die Stecker bleiben für Ultra-DMA (zunächst) unverändert, was somit auch eine Rückwärtskompatibilität ermöglicht. Der IDE-Controller, der im Chipset des Mainboards oder auf einer extra PCI-Einsteckkarte untergebracht ist, und die Festplatte müssen allerdings die entsprechenden Erweiterungen bieten, um Ultra-DMA nutzen zu können. Praktisch alle Chipsets ab dem 430TX für den Sockel 7 und auch alle Pentium II-Chipsets unterstützen zumindest Ultra-ATA-33 (Mode 2). Ab Ultra-ATA mit einer Transferrate größer 33 MByte/s (Mode 3, vgl. Tabelle 26.6) ist allerdings ein spezielles Verbindungskabel vorgeschrieben. Es besitzt zwar ebenfalls 40-polige Stecker, das Kabel ist jedoch 80-polig, und zwischen jeder Signalleitung befindet sich eine Masseleitung. Das BIOS sollte nur dann die höheren Ultra-DMA-Modi zulassen, wenn ein 80-poliges Kabel eingesetzt wird, was anhand des PDIAG-Signals zu erkennen ist; es wird durch das 80-polige Kabel auf Masse gezogen. PDIAG diente ursprünglich zur Signalisierung, dass die Festplatten ihren Selbsttest abgeschlossen haben. Auf die Verarbeitung dieser Information durch den Controller wird schon seit einiger Zeit verzichtet, so dass dieser Pin nunmehr eine neue Aufgabe hat. Ob diese Funktion aber tatsächlich durch das BIOS gegeben ist, lässt sich nicht allgemein feststellen.
26.6 Serial ATA Eine serielle Datenübertragung zwischen IDE-Festplatten sowie anderen ATA(PI)-Einheiten sieht der Serial ATA-Standard vor. Dies bedeutet aufgrund der reduzierten Leitungsanzahl nicht nur eine Verbesserung bei der Kabelverlegung, sondern auch eine höhere Übertragungsleistung (150 MByte/s), als die vorherigen IDE-Implementierungen bieten konnten. Die ersten hierfür passenden Festplatten (Barracuda V) hat die Firma Seagate vorgestellt, und alle anderen bekannten Festplattenfirmen haben zumindest die Unterstützung von Serial ATA bekundet. Auf den Mainboards sind demnach auch neue Controller notwendig, die Bestandteil neuerer Chipsets sind und die Daten dann eben nicht parallel, sondern seriell übertragen. Die ersten Controller, von Herstellern wie Promise oder Silicon Image sind jedoch über den PCI-Bus angeschlossen, über den nur maximal 133 MByte/s zu transportieren sind, so dass sich hiermit keine leistungstechnische Verbesserung gegenüber Ultra-DMA im Mode 6 ergeben kann. PCI-Adapter, die entsprechende Bridge-Chips für die Konvertierung von Serial-ATA auf Parallel-ATA und umgekehrt verwenden, stellen ebenfalls keine Leistungsverbesserung gegenüber den bisherigen parallelen Lösungen dar, weil diese Konvertierung wertvolle Bandbreite kostet. Erst bei den neueren Chipsets, die etwa den ICH 5 von Intel verwenden, soll Serial ATA voll ausgenutzt werden können, da hier keine Signalumsetzung mit Bridges stattfindet. Serial ATA beginnt zunächst mit 1,2 GBit/s, und in der Zukunft sollen es bis zu 4,8 GBit/s sein. Eine niedrigere Versorgungsspannung von typischerweise 3,3 V statt 5 V führt zu einem geringeren Stromverbrauch und geringerer Abwärme der Einheiten, die zudem im laufenden Betrieb an- und abgekoppelt werden können (Hot Plugging). Die Signalpegel betragen außerdem nur noch +/- 250 mV statt wie bisher 5 V. Serial ATA verwendet die 8B/10B-Kodierung, wie sie bereits bei Netzwerken (siehe Kapitel 34, Lokale Netzwerke) oder auch bei PCI-Express zum Einsatz kommt. Die Datenübertragung findet
Sandini Bib 912
Kapitel 26
dabei gleichzeitig (Full Duplex) über zwei differenzielle Datenleitungen statt, und die Einheiten werden stets über Punkt-zu-Punkt-Verbindungen angeschlossen. Ein üblicher Serial-ATA-Adapter unterstützt vier direkte Verbindungen und somit den Anschluss von vier Laufwerken. Ein »Durchschleifen« der Signale von einem Master zu einem Slave gibt es hier demnach nicht, es gibt auch nur einen Host und maximal eben vier Devices, wodurch auch keinerlei Vorkehrungen für manuelle Adressen- oder Terminierungseinstellungen notwendig sind.
Abb. 26.18: Serial ATA kommuniziert stets über 1:1-Verbindungen zwischen einem Host (dem Adapter) und einem Device (IDE-Einheit) über eine 7-polige Kabelverbindung.
Das relativ dünne Verbindungskabel enthält vier einzelne Datenleitungen plus drei Masseleitungen, die als Abschirmung fungieren. Für externe Laufwerke ist Serial ATA nicht vorgesehen, und es ist eine maximale Kabellänge von 1 m sepzifiziert. Das Kabel für die Stromversorgung entspricht auf der einen Seite dem üblichen Anschluss, wie er bisher auch für Laufwerke zum Einsatz kommt, und der Geräteanschluss auf der anderen Kabelseite ist 15-polig, womit der Hot-PluggingFähigkeit Rechnung getragen wird. Es müssen nicht zwangsläufig alle möglichen drei Spannungen (3,3 V, 5 V, 12 V), sondern nur diejenigen geführt werden, die das jeweilige Gerät benötigt.
Abb. 26.19: Die Datenverbindung für Serial ATA
Zur Software-Seite hin ist Serial ATA zum parallelen ATA-Standard völlig kompatibel, d.h. es können die gleichen Befehle und Treiber verwendet werden, weil die entsprechende Umsetzung und Protokollanpassung auf der untersten Chip-Ebene stattfindet. Die Kommandos und Registerinhalte werden in Pakete verpackt, seriell übertragen und vom »Gegenüber« wieder parallelisiert und als übliche ATA-Befehle ausgeführt.
Sandini Bib
27
SCSI
Eine sehr flexible und leistungsfähige Möglichkeit zur Anbindung von Festplatten und anderen Geräten wie CD-ROM-Laufwerken, Wechselplatten, aber auch externen Geräten wie Scannern an einen PC ist SCSI (Small Computer Systems Interface). Dadurch ist bereits ausgedrückt, dass SCSI für den PC und andere »kleine Systeme« vorgesehen ist. SCSI wurde demnach in der Zeit ins Leben gerufen, als noch Großrechnersysteme das Maß der Dinge waren. SCSI ist aus der SASI-Schnittstelle von Shugart Associates hervorgegangen (SASI = Shugart Associates Systems Interface). SCSI gibt es in einem etwas älteren Standard SCSI-I, der in mancherlei Hinsicht nicht streng genug ist, so dass Kompatibilitätsschwierigkeiten bei der Implementierung von SCSI-I auftreten können. Ab dem Standard SCSI-II sind die Eigenschaften eindeutig festgelegt, und es werden darüber hinaus noch zusätzliche Befehle und Betriebsmodi definiert. SCSI verfolgt in vielerlei Hinsicht eine andere Philosophie als die bisher vorgestellten Festplattenschnittstellen – in diesem Kapitel erfahren Sie mehr dazu.
27.1 Funktionsprinzip SCSI definiert in der ursprünglichen 8-Bit-Variante (es gibt verschiedene SCSI-Standards, mehr dazu in Kapitel 27.5) einen Bus zwischen maximal acht Einheiten sowie das Protokoll für einen Datenaustausch zwischen ihnen. Solche SCSI-Einheiten können Festplatten, Bandlaufwerke, optische Laufwerke oder beliebige andere Einheiten sein, die der SCSI-Spezifikation genügen. SCSILaufwerke sind also ähnlich wie IDE-Festplatten intelligent, der Controller der Einheiten ist stets auf dem Laufwerk integriert. Zur Anbindung an den PC benötigen Sie ferner einen SCSI-HostAdapter, der ähnlich wie bei der IDE-Schnittstelle die Verbindung zum Systembus des PC herstellt. Der Host-Adapter ist selbst eine SCSI-Einheit, so dass nur noch sieben »freie« Einheiten übrig bleiben. Im Gegensatz zu einem IDE-Adapter ist der SCSI-Host-Adapter komplexer, da er alle Funktionen des SCSI-Bus zur Signalübertragung kennen und ausführen muss. Einer der Vorteile ist, dass SCSI nicht auf einen bestimmten Systembus (ISA, EISA, PCI) beschränkt ist, denn es gibt nicht nur für den PC entsprechende Host-Adapter, sondern auch für Systeme wie den Nubus (Apple) oder den SBus (Sun) und außerdem für fast jede andere denkbare Schnittstelle (Parallel, USB usw.). Der SCSI-Bus dient also nur zum Datenaustausch zwischen den SCSI-Einheiten, die mit dem Bus verbunden sind. Zum gleichen Zeitpunkt können maximal zwei Einheiten aktiv sein und Daten austauschen. Der Datenaustausch kann zwischen Host-Adapter und einem Laufwerk oder aber – als besonderer Vorteil von SCSI – auch zwischen zwei anderen SCSI-Einheiten wie z.B. einem Bandlaufwerk und einer Festplatte stattfinden. Bemerkenswert dabei ist, dass dieser Datenaustausch ohne das geringste Eingreifen der CPU ausgeführt wird. Die SCSI-Laufwerke sind dafür intelligent genug. In Abbildung 27.1 ist das Schema des SCSI-Bus für die Integration in einen PC gezeigt. Jeder SCSI-Einheit wird eine SCSI-Adresse zugeordnet, die Sie meist über einen Jumper oder DIPSchalter am Laufwerk einstellen. Gültig sind Adressen im Bereich 0 bis 7, wobei der Hostadapter meist die Adresse Nr. 7 verwendet, die im SCSI-BIOS-Setup festzulegen ist. Die Adresse wird von einem Byte gebildet. Das niederwertigste Bit 0 entspricht der Adresse oder SCSI-ID 7, und das
Sandini Bib 914
Kapitel 27
SCSI-Einheit
SCSI-Einheit SCSI-Bus
Systembus
(ISA, EISA, MCA, PCI, VLB)
höchstwertige Bit 7 entspricht der Adresse oder SCSI-ID 0. SCSI-Adressen werden über den Datenbus des SCSI-Bus übertragen (siehe Tabelle 27.1).
SCSIHostAdapter
SCSI-Einheit
Abb. 27.1: Der SCSI-Bus wird über einen SCSI-Host-Adapter an den Systembus des PC angeschlossen.
Die SCSI-Adresse oder SCSI-ID ist aber nicht mit der logischen Einheitennummer LUN zu verwechseln. Jedes Taget kann theoretisch bis zu acht logische Einheiten aufweisen, die in einem SCSI-Befehl über die LUN identifiziert werden. Ein Beispiel dafür wäre ein SCSI-Controller, der mehrere Laufwerke steuert, wie es etwa bei RAID-Systemen der Fall ist. Die Verbindung zum SCSI-Bus stellt der (RAID-)Controller her, außerdem wickelt er alle Steuerungsaufgaben ab. Dieser Controller ist also das Target. Dem Target sind nun mehrere Laufwerke zugeordnet – die logischen Einheiten –, die über die LUN unterschieden werden. Es ist darauf zu achten, dass kein Adressenkonflikt zwischen zwei Laufwerken verursacht wird. Der Controller des Laufwerks liest beim Einschalten die SCSI-Adresse und reagiert dann auf Befehle, die seine SCSI-Adresse betreffen.
27.2 Signale und Datenübertragung Die Verbindung zwischen den SCSI-Einheiten erfolgt über ein 50-poliges Flachbandkabel mit 50poligen Steckern. Möglich sind auch Kabel mit 25 gedrillten Leitungspaaren, bei denen eine Masseleitung stets um die Signalleitung gewickelt ist, wie dies in ähnlicher Weise auch bei den Druckerkabeln möglich ist. In Tabelle 27.1 ist die Belegung der Leitungen und Steckerpins aufgeführt. Signal
Pin
Bedeutung
Signal
Pin
Bedeutung
GND DB(0) GND DB(1) GND DB(2) GND DB(3)
1 2 3 4 5 6 7 8
Masse Datenbit 0 Masse Datenbit 1 Masse Datenbit 2 Masse Datenbit 3
TERMPWR GND GND GND GND GND ATN GND
26 27 28 29 30 31 32 33
Termination Masse Masse Masse Masse Masse Attention Masse
Tab. 27.1: Belegung des SCSI-Schnittstellenkabels (8 Bit)
Sandini Bib SCSI
915
Signal
Pin
Bedeutung
Signal
Pin
Bedeutung
GND DB(4) GND DB(5) GND DB(6) GND DB(7) GND DB(P) GND GND GND GND GND GND NC
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Masse Datenbit 4 Masse Datenbit 5 Masse Datenbit 6 Masse Datenbit 7 Masse Paritätsbit Masse Masse Masse Masse Masse Masse --
GND GND BSY GND ACK GND RST GND MSG GND SEL GND C/D GND REQ GND I/O
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
Masse Masse Busy Masse Acknowledge Masse Reset Masse Message Masse Select Masse Command/Data Masse Request Masse Input/Output
Tab. 27.1: Belegung des SCSI-Schnittstellenkabels (8 Bit) (Forts.)
Wie bei allen anderen Bussystemen muss auch der SCSI-Bus durch Widerstände abgeschlossen werden. Das geschieht, indem bei allen Laufwerken außer dem letzten auf dem Bus der Abschlusswiderstand entfernt oder durch einen Jumper oder Schalter stillgelegt wird. Die SCSIHost-Adapter weisen eine Buchse zum Anschließen externer SCSI-Einheiten auf (typischerweise Scanner, externe SCSI-Festplatten). Normalerweise bildet der Host-Adapter das andere Ende des Bus und ist aus diesem Grund ebenfalls mit einem Abschlusswiderstand versehen. Wenn nun eine oder mehrere externe SCSI-Einheiten an die externe Buchse angeschlossen werden und zudem noch mindestens eine interne Einheit vorhanden ist, muss der Abschlusswiderstand des Host-Adapters entfernt oder stillgelegt werden, weil der Adapter ja nun nicht mehr das Ende des SCSI-Bus markiert. Der SCSI-Bus läuft vielmehr durch den Host-Adapter hindurch. Allgemein gilt, dass die Abschlusswiderstände immer an beiden Enden des Bus vorhanden sein müssen. Je nach Konfiguration wird eines der beiden Enden vom Host-Adapter, der letzten internen SCSI-Einheit oder der letzten externen Einheit gebildet. Bei den anderen Adaptern (ST412/506, ESDI und AT-Bus) sind externe Einheiten nicht zugelassen, der Host-Adapter oder Controller bildet dort also stets eines der zwei Enden des Bus. Wie Sie aus Tabelle 27.1 erkennen können, werden acht Datenbits DB(0) bis DB(7) zusammen mit einem Paritätsbit DB(P) sowie neun Steuersignale übertragen. Alle Signale sind bei niedrigem Pegel aktiv. Die SCSI-Logik erzeugt das Paritätsbit automatisch, wenn die Einheit das unterstützt. Das ist nicht immer der Fall. Häufig können Sie über einen Jumper einstellen, ob das Paritätsbit erzeugt und auch geprüft werden soll. TERMPWR dient zur Ableitung überschüssiger Ladung und zur Dämpfung des SCSI-Bus. Obwohl der Datenbus nur acht Bit umfasst, ist SCSI für eine Datenübertragungsrate von bis zu 3 MByte/s im asynchronen, 5 MByte/s im synchronen, 10 MByte/s im Fast-Modus sowie 20 MByte/s im Ultra-Fast-Modus (Fast-20) ausgelegt. Im asynchronen Modus werden Handshake-Signale zum Datenaustausch benutzt, im synchronen und in den Fast-Modi läuft der Datentransfer mit den Handshake-Signalen als Taktimpuls ab, was zu einer höheren Übertragungsrate führt. Beachten Sie aber, dass nicht alle SCSI-Einheiten den synchronen Modus unterstützen, was eigentlich aber nur auf ältere Geräte zutrifft.
Sandini Bib 916
Kapitel 27
Außerdem bezieht sich die Datenübertragungsrate nur auf den SCSI-Bus. Mit welcher Geschwindigkeit die Daten vom oder zum Hauptspeicher des PC über den PC-Systembus übergeben werden können, ist dadurch noch nicht festgelegt. Diese Geschwindigkeit hängt ganz wesentlich von der Qualität des Host-Adapters und der Firmware im ROM-BIOS des Adapters ab. Entscheidend ist natürlich auch noch, mit welcher Geschwindigkeit die Daten von der Festplatte oder dem Magnetband überhaupt abgenommen werden können. Das Prinzip der Datenübertragung auf einem SCSI-Bus ist in Abbildung 27.2 dargestellt.
Funktionsanforderung
Initiatorsteuerung
SCSI-Bus
Initiator
Targetsteuerung
Funktionsausführung
Target
Abb. 27.2: Datenübertragung auf dem SCSI-Bus
Eine beliebige SCSI-Einheit kann die Funktion eines Initiators übernehmen und über die Steuersignale die Steuerung des SCSI-Bus übernehmen. Der Initiator aktiviert über eine SCSI-Adresse eine entsprechende Zieleinheit, genannt Target, die eine bestimmte Funktion ausführen soll. Von großer Bedeutung ist, dass der Initiator nur zur Befehlsübergabe und Datenübertragung den SCSI-Bus belegt. Ansonsten ist der Bus frei und kann von anderen SCSI-Einheiten verwendet werden. Das gilt auch dann, wenn die Target-Einheit einen Befehl, wie z.B. das Lesen eines Blocks, ausführt und während dieser Zeit keine Verbindung zum Initiator benötigt. Erst nach der Befehlsausführung stellt die Target-Einheit die Verbindung zum Initiator wieder her und überträgt die Daten. Die Steuerung des Bus erfolgt dabei über die folgenden neun Steuersignale:
: : : : : : : : :
BSY (Busy): Das Signal zeigt an, ob der Bus gerade belegt ist. SEL (Select): Das Signal wird vom Initiator dazu benutzt, die Target-Einheit auszuwählen; umgekehrt kann auch das Target SEL benutzen, um die Verbindung zum Initiator nach einer zeitweisen Abgabe der Bussteuerung wieder herzustellen. C/D (Control/Data): Das Signal wird nur vom Target gesteuert und gibt an, ob sich Steuerinformationen oder Daten auf dem SCSI-Bus befinden. Ein aktives Signal (mit Pegel low) zeigt Steuerinformationen an. I/O (Input/Output): Das Signal wird ausschließlich von der Target-Einheit gesteuert und gibt die Richtung des Datenflusses auf dem Datenbus bezüglich des Initiators an. Ein aktives Signal I/O (mit Pegel low) zeigt die Übertragung von Daten zum Initiator an. MSG (Message): Das Signal wird während der Message-Phase des SCSI-Bus vom Target aktiviert. REQ (Request): Das Signal wird von der Target-Einheit aktiviert, um die Handshake-Anforderung bei einer REQ/ACK-Datenübertragung anzuzeigen. ACK (Acknowledge): Das Signal wird vom Initiator aktiviert, um die Handshake-Bestätigung (Acknowledge) bei einer REQ/ACK-Datenübertragung anzuzeigen. ATN (Attention): Ein Initiator aktiviert das Signal, um die Attention-Bedingung anzuzeigen. RST (Reset): Ein aktives Signal setzt alle angeschlossenen SCSI-Einheiten zurück.
Sandini Bib SCSI
917
27.3 Busphasen und Messages Bereits an den Signalen ist zu erkennen, dass eine umfangreiche Aktivierungs- und Deaktivierungsprozedur mit einer Datenübergabe durch Handshake ausgeführt werden kann. Zu beachten ist dabei, dass diese Phasen aber nur bei der Übergabe von Daten über den SCSI-Bus von Bedeutung sind. Der Zugriff der CPU auf eine SCSI-Einheit wird davon nur indirekt beeinflusst, weil die im Host-Adapter eingebaute SCSI-Logik die Busphasen automatisch erkennt und die entsprechenden Steuersignale erzeugt. Insgesamt kennt der SCSI-Bus acht Busphasen:
: : : : : : : :
Bus frei Arbitration Selection Reselection Command Daten Message Status
Die vier letzten Busphasen Command, Daten, Message und Status werden zusammen auch als Informationstransferphase bezeichnet. Bus-frei-Phase Diese Busphase zeigt an, dass gegenwärtig keine SCSI-Einheit den Bus benutzt und steuert. Der SCSI-Bus kann also von einer beliebigen angeschlossenen SCSI-Einheit übernommen werden. Diese Phase ist gegeben, wenn sowohl SEL als auch BSY inaktiv (high) sind. Arbitration-Phase Durch diese Busphase kann eine SCSI-Einheit die Steuerung des Bus übernehmen, so dass die Einheit als Initiator oder Target für eine Busoperation wirkt. Dazu wird folgende Prozedur ausgeführt:
: : :
:
Der SCSI-Bus muss sich in der Bus-frei-Phase befinden, da sonst keine andere als die aktive Einheit die Steuerung des Bus übernehmen kann; BSY und SEL sind also beide inaktiv. Die Einheit aktiviert BSY und legt ihre SCSI-ID auf den Datenbus. Nach einer kurzen Arbitration-Verzögerung untersucht die Einheit den Datenbus. Ist auf diesem außer der eigenen SCSI-ID eine weitere SCSI-ID mit höherer Priorität, d.h. höherer SCSIID-Nummer, aktiv, so kann die Einheit den Bus nicht übernehmen. Ist das nicht der Fall, so darf die Einheit die Steuerung des Bus ausführen, sie hat die Arbitration gewonnen und aktiviert SEL. Nach einer kurzen Bus-Clear-Verzögerung kann die SCSI-Einheit nun den SCSI-Bus steuern und Bussignale ändern.
Selection-Phase Mit dieser Phase kann ein Initiator eine Target-Einheit auswählen, um von der Target-Einheit Funktionen wie z.B. Lesen und Schreiben von Datenblöcken ausführen zu lassen. Während der Selection-Phase ist das I/O-Signal inaktiv, um sie von der Reselection-Phase eines Targets unterscheiden zu können. Der Initiator gibt nun auf dem Datenbus den ODER-Wert seiner SCSI-ID
Sandini Bib 918
Kapitel 27
und der SCSI-ID des Targets aus, es sind also die beiden Datenbits aktiv, die Initiator und Target kennzeichnen. Das so adressierte Target muss nun erfassen, dass es von einem Initiator ausgewählt worden ist, und BSY innerhalb einer festgelegten Zeitspanne aktivieren. Geschieht das nicht, ist die Selection-Phase fehlgeschlagen und der Initiator deaktiviert SEL; der SCSI-Bus tritt dann in die Bus-frei-Phase ein. Weil der Initiator neben der Target-ID auch seine eigene SCSI-ID auf dem Datenbus ausgegeben hat, kann die Target-Einheit den Initiator bestimmen. Das ist wichtig, damit die Target-Einheit nach einer Bus-frei-Phase in der nachfolgenden Reselection-Phase den richtigen ursprünglichen Initiator aktivieren kann. Reselection-Phase Durch die Reselection-Phase kann ein Target die Verbindung mit dem ursprünglichen Initiator wieder herstellen, um die unterbrochene Operation fortzusetzen. Das ist beispielsweise dann der Fall, wenn ein Host-Adapter einen Lesebefehl an ein Target-Laufwerk auslöst und dieses für einige Zeit mit der internen Datenverarbeitung beschäftigt ist. Die Target-Einheit gibt daher den SCSI-Bus frei und führt z.B. die Kopfpositionierung und das Einlesen selbstständig aus, merkt sich dabei aber die SCSI-ID des Initiators. Es tritt also eine Bus-frei-Phase auf, die andere Einheiten zu einem Datenaustausch nutzen können. Hat das Target-Laufwerk die Operation beendet, nimmt es durch eine Reselection-Phase den Kontakt mit dem ursprünglichen Initiator wieder auf und überträgt die gelesenen Daten. Die Reselection-Phase läuft ähnlich wie eine Arbitration- und eine Selection-Phase ab. Die Target-Einheit übernimmt in einer Arbitration-Phase den SCSI-Bus, aktiviert BSY und SEL und dann das I/O-Signal, um die Phase als Reselection-Phase und sich selbst als Target zu identifizieren. Anschließend gibt das Target seine eigene und die SCSI-ID des ursprünglichen Initiators aus. Der Initiator ermittelt, dass er ausgewählt worden ist, und nimmt die Verbindung mit dem Target wieder auf, der Datenaustausch kann beginnen. In den vier Informationstransferphasen Command-, Daten-, Message- und Status-Phase werden Daten und Steuerinformationen über den Datenbus übertragen, wobei die Signale C/D, I/O und MSG benutzt werden, um zwischen den Transferphasen zu unterscheiden. Ist I/O aktiv, so werden Informationen vom Target zum Initiator übertragen, ansonsten läuft der Datenaustausch umgekehrt ab. Jeder Datenaustausch in einer der vier Phasen läuft über ein Handshake ab. Der Sender legt die Daten auf den Datenbus DB(0) bis DB(7) und gegebenenfalls die Paritätsinformation auf DB(P) und aktiviert REQ, um dem Empfänger die Gültigkeit der Daten anzuzeigen. Der Empfänger liest die Daten ein und aktiviert anschließend ACK, um dem Sender mitzuteilen, dass die Daten übernommen worden sind. Der Sender deaktiviert daraufhin REQ. Nun negiert auch der Empfänger das Signal ACK. Beide Handshake-Signale sind also deaktiviert, und die nächste Übertragung eines Datenbytes mittels Handshake kann stattfinden. Wichtig ist, dass die Target-Einheit die drei Steuersignale C/D, I/O und MSG steuert. Der Initiator kann aber durch Aktivierung von ATN eine Message-Out-Phase anfordern. In Tabelle 27.2 ist der Zusammenhang zwischen den Signalen MSG, C/D und I/O, der Phase und der Transferrichtung dargestellt. MSG
C/D
I/O
Phase
Transferrichtung
0 0
0 0
0 1
Daten-Out Daten-In
Initiator -> Target Target -> Initiator
Tab. 27.2: SCSI-Busphasen
Sandini Bib SCSI
919
MSG
C/D
I/O
Phase
Transferrichtung
0 0 1 1 1 1
1 1 0 0 1 1
0 1 0 1 0 1
Command Status ungültig ungültig Message-Out Message-In
Initiator -> Target Target -> Initiator --Initiator -> Target Target -> Initiator
Tab. 27.2: SCSI-Busphasen (Forts.)
Command-Phase Durch die Command-Phase kann das adressierte Target Befehlsdaten vom Initiator anfordern. Die Target-Einheit aktiviert dazu das C/D-Signal und deaktiviert die Signale MSG sowie I/O. Der Initiator übergibt nun die Befehlsdaten. Daten-Phase In der Daten-Phase kann das Target den Initiator anweisen, Daten an das Target zu übermitteln – das ist die so genannte Daten-Out-Phase – oder Daten an den Initiator übergeben – das ist die so genannte Data-In-Phase. Message-Phase In der Message-Phase kann das Target den Initiator anweisen, Messages an das Target zu übermitteln – das ist die so genannte Message-Out-Phase – oder Messages an den Initiator übergeben – das ist die so genannte Message-In-Phase. Status-Phase In der Status-Phase übergibt das Target Statusinformationen an den Initiator. Neben den Steuersignalen zur Einleitung der verschiedenen Phasen gibt es noch die zwei Signale ATN (Attention) und RST (Reset). Über ATN kann der Initiator dem Target mitteilen, dass er eine Message übergeben möchte. Das Target liest die Message durch eine Message-Out-Phase ein. Demgegenüber kann das Target eine Message an den Initiator allein durch Auslösen einer Message-In-Phase übergeben, denn nur der Initiator benutzt das Attention-Signal. Wenn eine SCSI-Einheit das Signal RST aktiviert, werden alle Einheiten vom SCSI-Bus getrennt, alle Operationen abgebrochen und die Einheiten in einen definierten Zustand versetzt. Nach der SCSI-Spezifikation besitzt jeder Initiator zwei Sätze von je drei Zeigern, die aktiven oder gegenwärtigen Zeiger sowie die gesicherten Zeiger. Die aktiven Zeiger weisen auf das nächste Befehls-, Daten- bzw. Statusbyte, die zwischen dem Initiator und dem Target übertragen werden sollen, und werden von dem Target verwendet, das gegenwärtig mit dem Initiator verbunden ist. Da die Verbindung zwischen Initiator und Target auch während eines aktiven Befehls unterbrochen und später wieder hergestellt werden kann (Reselection-Phase), sind ferner noch die gesicherten Zeiger von Bedeutung. Für jeden aktiven Befehl gibt es einen Satz der gesicherten Zeiger, und zwar unabhängig davon, ob die entsprechende Verbindung zwischen Initiator und Target besteht. Der gesicherte Befehlszeiger weist dabei auf den Beginn des Befehlsblocks für den aktiven Befehl und der gesicherte Statuszeiger auf den Beginn des Statusbereichs des aktiven Befehls. Die Zeiger werden üblicherweise durch Register realisiert, die die entsprechenden Zeigerwerte aufnehmen. Am Anfang eines jeden Befehls weist der gesicherte Datenzeiger so lange auf den Beginn des Datenbereichs, bis die Target-Einheit eine Message Datenzeiger sichern an den Initiator übergibt.
Sandini Bib 920
Kapitel 27
Mit dieser Anweisung schiebt der Initiator den gegenwärtigen Datenzeiger in den gesicherten Datenzeiger. Umgekehrt kann das Target die aktiven Zeiger mit den gesicherten Zeigern laden, indem es die Message Zeiger wiederherstellen an den Initiator übergibt. Wird eine SCSI-Einheit vom Bus getrennt, bleiben nur die gesicherten Zeiger erhalten, die aktiven werden bei der Anbindung einer anderen Einheit mit neuen Werten geladen. Wird die abgetrennte SCSI-Einheit durch eine Reselection-Phase wieder mit dem Initiator verbunden, werden die aktiven Zeiger aus den gesicherten Zeigern wiederhergestellt. Die Messages dienen zur Abstimmung der Verbindung der SCSI-Einheiten untereinander und zur Übergabe von Statusinformationen, die den Zustand der aktiven Befehle anzeigen. Das Protokoll des SCSI-Bus besteht also aus den physikalischen Steuersignalen und den logischen Messages. Demgegenüber leiten die Befehle der Command-Phase bestimmte Operationen der SCSITarget-Einheit ein und bestimmen nicht die Verbindung von Initiator und Target. Unbedingt erforderlich für SCSI-Einheiten ist nur die Unterstützung der Message Befehl abgeschlossen (00h). Alle anderen Messages sind optional. Ein Initiator teilt dem Target mit, dass er auch die anderen Messages unterstützt, indem er in der Selection-Phase vor der Aktivierung von SEL und der Deaktivierung von BSY das Signal ATN aktiviert. Die erste Message des Initiators nach der Selection-Phase an das Target ist dann die Identifizierung, genauso wie das Target nach einer Reselection-Phase diese Message an den Initiator übergeben muss. Der SCSI-Standard definiert die folgenden Messages:
:
: : : : : : :
Befehl abgeschlossen (00h): Das Target übergibt diese Message in einer Message-In-Phase an den Initiator, um anzuzeigen, dass ein Befehl oder ein verketteter Befehl erfolgreich oder erfolglos abgeschlossen worden ist und in einer Statusphase die Statusinformationen an den Initiator übergeben worden sind. Nachdem das Target diese Message übertragen hat, tritt es in die Bus-frei-Phase ein. Erweiterte Message (01h, xxh): Die erweiterte Message zeigt an, dass weitere Message-Codes folgen. Das zweite Byte xxh gibt an, wie viele Bytes auf xxh folgen. Üblicherweise gibt das erste auf xxh folgende Byte den Message-Untercode an. Datenzeiger sichern (02h): Das Target überträgt die Message an den Initiator, um diesen zu veranlassen, die aktiven Datenzeiger für die gegenwärtig mit ihm verbundene SCSI-Einheit in den gesicherten Datenzeigern zu sichern. Datenzeiger wiederherstellen (03h): Das Target überträgt die Message an den Initiator, um diesen zu veranlassen, die aktiven Datenzeiger aus den gesicherten Datenzeigern wiederherzustellen. Trennen (04h): Das Target übermittelt die Message an den Initiator, um anzuzeigen, dass das Target die gegenwärtige Verbindung demnächst abbricht, d.h. BSY deaktiviert. Später ist über eine Reselection-Phase eine erneute Verbindung notwendig, um den Befehl erfolgreich abzuschließen. Fehler beim Initiator (05h): Die Message zeigt an, dass der Initiator einen Fehler bei sich entdeckt hat. Abbruch (06h): Der Initiator überträgt die Message an das Target, um dieses zu veranlassen, die gegenwärtige Operation abzubrechen, die aktuellen Daten und Statusinformationen zu löschen und in die Bus-frei-Phase einzutreten. Message zurückgewiesen (07h): Die Message kann vom Initiator oder Target ausgegeben werden, um anzuzeigen, dass die zuletzt empfangene Message ungültig war oder in der SCSI-Einheit nicht implementiert ist.
Sandini Bib SCSI
: : :
921
Keine Operation (08h): Die Message hat keine Auswirkungen. Message-Paritätsfehler (09h): Die zuvor empfangene Message wies einen Paritätsfehler auf. Verketteter Befehl abgeschlossen (0ah): Das Target gibt die Message an den Initiator aus, um anzugeben, dass ein verketteter Befehl abgeschlossen worden ist und in einer Statusphase die Statusinformationen an den Initiator übergeben worden sind.
:
Verketteter Befehl mit Flag abgeschlossen (0bh): Das Target gibt die Message an den Initiator aus, um anzugeben, dass ein verketteter Befehl mit gesetztem Flag abgeschlossen worden ist und in einer Statusphase Statusinformationen an den Initiator übergeben worden sind.
:
Buseinheit zurücksetzen (0ch): Die Message wird vom Initiator an das Target übergeben, um dieses zurückzusetzen.
:
Tag-Prozess abbrechen (0dh): Die Message weist das Target an, den aktiven Tag-Prozess einer Warteschlange abzubrechen. Im Unterschied zu Message 0eh wird nur der laufende Prozess abgebrochen.
:
Warteschlange löschen (0eh): Die Message weist das Target an, alle Tag-Prozesse einer Warteschlange abzubrechen.
:
I/O-Prozess abschließen (11h): Die Message weist das Target an, den laufenden I/O-Prozess so schnell wie möglich abzuschließen (nicht abzubrechen).
:
Einfaches Warteschlangen-Tag (20h): Der zugehörige Prozess kann vom Target an einer beliebigen Stelle in die Warteschlange eingefügt werden. Dadurch hat das Target die Möglichkeit, die Ausführung mehrerer Initiator-Anfragen zu optimieren. Die Reihenfolge solcher Prozesse kann auch nach der Einreihung in die Warteschlange noch verändert werden.
:
Tag als Kopf der Warteschlange (21h): Die Message weist das Target an, den zugehörigen Prozess an den Beginn der Warteschlange zu stellen, d.h., der Prozess hat höchste Priorität und wird gestartet, sobald der laufende Prozess beendet oder unterbrochen ist.
:
Geordnetes Warteschlangen-Tag (22h): Der zugehörige Prozess wird vom Target in die Warteschlange eingefügt und genau an dieser Stelle ausgeführt. Die Reihenfolge solcher Prozesse kann nach der Einreihung in die Warteschlange nicht mehr verändert werden.
:
Wide-Rest ignorieren (23h): Auch wenn der Wide-Modus (siehe Kapitel 27.5.5) aktiv ist, übergibt ein Target oder Initiator manchmal Parameterlisten oder Daten nicht als Vielfache von zwei bzw. vier Bytes. Der Empfänger muss dann einen Teil des Wide-SCSI-Bus ignorieren, wozu diese Message dient.
:
7
6
1
D/R
Identifizierung (80h bis ffh): Die Message wird vom Initiator oder Target zur eigenen Identifizierung ausgegeben. Das Bit 7 der Message ist stets gesetzt, um sie als Identifizierung zu kennzeichnen. Die restlichen sieben Bits enthalten den Identifizierungscode (siehe Abbildung 27.3). 5
4
3
reserviert
2
1 0
LUN
D/R: Disconnect/Reconnect 1=Initiator kann Trennung/Wiederverbindung ausführen 0=Initiator kann Trennung/Wiederverbindung nicht ausführen LUN: Nummer der logischen Einheit 000=0 001=1 ... 111=7 Abb. 27.3: Identifizierungscode
Sandini Bib 922
Kapitel 27
Neben den aufgeführten Messages sind ab SCSI-II noch die folgenden erweiterten Messages vorgesehen:
:
Datenzeiger ändern (01h, 05h, 00h): Auf den Message-Untercode 00h folgen noch zwei Bytes, die zum aktuellen Wert des Datenzeigers addiert werden.
:
Synchronen Modus anfordern (01h, 03h, 01h): Mit dieser Message kann eine SCSI-Einheit anzeigen, dass sie synchronen Datentransfer benutzen möchte. Die auf den Untercode 01h folgenden Bytes legen die Übertragungszeit (in Vielfachen von 4 ns) und die REQ/ACK-Verschiebung fest. Nur wenn der Partner anschließend ebenfalls mit dieser Message reagiert, wird der synchrone Modus auch aktiviert.
:
Wide-Modus anfordern (01h, 02h, 03h): Mit dieser Message (Untercode 03h) kann eine SCSIEinheit anzeigen, dass sie einen 16-Bit- oder 32-Bit-Transfer benutzen möchte (Wert des vierten Message-Bytes gleich 01h bzw. 02h). Der Partner reagiert anschließend ebenfalls mit einer solchen Message und zeigt seine Wide-Fähigkeiten an.
Neben den Messages übergibt das Target nach der Ausführung eines Befehls auch einen Statuscode an den Initiator. In Abbildung 27.4 sehen Sie den Aufbau dieses Statusbytes. 7
6
5
4
3
2
1 0
reserviert Statuscode 0
Statuscode: 0000=alles o.k. 0001=Status überprüfen 0100=Belegt(Busy) 1000=Zwischenstatus/o.k. 1100=Reservierungskonflikt Abb. 27.4: Statuscode
Der Code 0000 zeigt an, dass die SCSI-Einheit den Befehl erfolgreich ausgeführt hat. Bei einem Code Status überprüfen ist ein Fehler, eine Ausnahme oder eine abnorme Bedingung aufgetreten. Dann sollte der Befehl Request-Sense benutzt werden, um die Ursache der Bedingung zu ermitteln. Ist das Target belegt, wird der Statuscode 0100 übergeben. Wenn ein verketteter Befehl aktiv ist, übergibt das Target für jeden abgeschlossenen Einzelbefehl mit Ausnahme des letzten Befehls den Statuscode 1000. Der Statuscode 1000 dient also dazu, die Verkettung zu bestätigen und dafür zu sorgen, dass die Befehlsserie nicht unterbrochen wird. Tritt ein Fehler auf, wird der Statuscode 0001 ausgegeben und der verkettete Befehl abgebrochen. Schließlich bedeutet der Code 1100 einen Reservierungskonflikt, d.h., eine SCSI-Einheit hat versucht, auf eine logische Einheit zuzugreifen, die für eine andere SCSI-Einheit reserviert ist. Diese Messages sind dem Programmierer im Normalfall nicht zugänglich, da sie nur zur Abstimmung der SCSI-Einheiten untereinander dienen. SCSI definiert somit ein High-Level-Protokoll, das nicht nur auf physikalischen Signalen, sondern auch auf logischen Messages basiert.
27.4 Befehle und Programmierung Der SCSI-Standard definiert zehn Geräteklassen, die teilweise sehr unterschiedliche Befehle und Funktionen aufweisen. Weil eine eingehende Erläuterung aller SCSI-Klassen und der zugehörigen Befehle mit allen Optionen den Rahmen des Buches bei weitem sprengen würde, möchte ich mich im Folgenden in erster Linie mit der Klasse der Festplatten beschäftigen. Tabelle 27.3 gibt die zehn SCSI-Klassen an, wie sie der Inquiry-Befehl ausgibt.
Sandini Bib SCSI
923
Klassencode
Gerät
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0ah–1eh 1fh
Festplatte Bandlaufwerk, Streamer Drucker allgemeine Prozessoreinheit WORM CD-ROM Scanner optischer Speicher Medienwechsler Kommunikationseinheit reserviert unbekannter Typ
Tab. 27.3: Die SCSI-II-Klassen
Im Gegensatz zu den anderen Festplattenschnittstellen (ST412/506, IDE) arbeitet SCSI nicht mit Spuren und Sektoren, sondern betrachtet die gesamte Speicherkapazität einer Festplatte als zusammenhängende Liste von Datenblöcken mit fester Größe. Diese Datenblöcke ähneln von der logischen Struktur her also den logischen Sektoren unter DOS. Wie eine SCSI-Einheit diese auf SCSI-Ebene erscheinende Liste intern verwaltet, ist allein Aufgabe des intelligenten Controllers. Bei Festplatten wird die logische Blocknummer unter Verwendung der Zonenaufzeichnung in Spuren und Sektoren umgewandelt. Ein SCSI-Bandlaufwerk kann dagegen die logischen Blocknummern fast unverändert übernehmen, da auf einem Magnetband die Datenblöcke kontinuierlich hintereinander kommen. Bei einem PC unter DOS läuft somit eine enorme Umsetzung von logischen und physikalischen Strukturen ab:
: : :
Die logischen Sektoren von DOS müssen für den INT 13h in Zylinder, Köpfe und Sektoren umgewandelt werden, der INT 13h muss die Angabe Zylinder, Kopf und Sektor in eine logische Blocknummer für den SCSI-Host-Adapter umsetzen und das adressierte Festplattenlaufwerk wandelt die logische Blocknummer in eine Angabe physikalischer Zylinder, Kopf, Sektor des SCSI-Laufwerks um.
Es verwundert nicht, wenn alle SCSI-Host-Adapter ein eigenes BIOS aufweisen, um die Verbindung zwischen System- und SCSI-Bus herstellen und die Umwandlung von physikalischen Sektoren des INT 13h in logische Blocknummern von SCSI ausführen zu können. Das »ZusatzBIOS« identifiziert die Laufwerksgeometrie über die Funktion 09h des INT 13h gegenüber dem System. Die Registerbelegung und Programmierung der Host-Adapter stimmt nicht mit einer bekannten Programmierschnittstelle (IDE-Task-File o.Ä.) überein; es gibt hier prinzipiell zahlreiche Möglichkeiten der Programmierung, also wie der Hostadapter auf SCSI-Geräte zugreifen kann. Mit ASPI und CAM stehen aber zwei übliche Treiber mit standardisierter Programmierschnittstelle zur Verfügung, die ihrerseits dann hardware-abhängig auf die Host-Adapter-Register zugreifen. Bei IDE war das Ganze von vornherein kein Problem, es wurde einfach das von IBM vorgegebene AT-Task-File übernommen. Am Ende eines jeden Befehls übergibt das Target, also das Laufwerk, ein Statusbyte an den Initiator, d.h. den Host-Adapter. Wenn das Byte eine Fehlerbedingung anzeigt, sollte die Ursache über einen Befehl Request Sense ermittelt werden. In einem einzigen Byte lassen sich nämlich die Ursa-
Sandini Bib 924
Kapitel 27
chen nicht genau genug beschreiben, und die SCSI-Hostadapter kennen keine Statusregister mit den Fehlerinformationen, wie das z.B. bei IDE der Fall ist. Die SCSI-Befehle folgen einem klar definierten Schema. Das erste Befehlsbyte enthält stets den Befehlscode, das zweite die Nummer des adressierten Targets und das letzte ein Steuerbyte. SCSI-Befehle sind stets sechs, zehn oder zwölf Byte lang, die 10- und 12-Byte-Befehle werden als erweitert (extended) bezeichnet. Der Befehlscode ist in einen 3-Bit-Gruppencode und einen 5-BitCode mit dem Befehl innerhalb der Gruppe unterteilt (siehe Abbildung 27.5). 7
5
0
4
Befehl
Gruppe
Gruppe: 0=6-Byte-Befehl 5=12-Byte-Befehl
1,2=10-Byte-Befehl 6,7=Hersteller
3,4=reserviert
Befehl: 0 bis 31: Befehlscode Abb. 27.5: Aufbau des Befehlsbytes
Der Aufbau des Befehlsbytes führt zu acht verschiedenen Befehlsgruppen, von denen typischerweise aber nur vier (0, 1, 2 und 5) benutzt werden. Die fünf Befehlsbits erlauben 32 Befehle je Gruppe, insgesamt sind also 256 verschiedene Befehle möglich. Alle reservierten Bits der Befehlscodes werden auf Null gesetzt. Der Aufbau der 6-Byte-, 10-Byte- und 12-Byte-Befehle ist in Abbildung 27.6 zu erkennen. 6-Byte-Befehl Bit Byte 0 1 2 3 4 5
7
6
12-Byte-Befehl 5
4
3
2
1
0
Befehlscode LUN LBA (MSB) logische Blockadresse logische Blockadresse (LSB) Transfer-/Zuweisungslänge/Parameter Steuerbyte
10-Byte-Befehl Bit Byte 0 1 2 3 4 5 6 7 8 9
7
6
5
4
3
2
1
0
Befehlscode LUN reserviert REL logische Blockadresse (MSB) logische Blockadresse logische Blockadresse logische Blockadresse (LSB) reserviert Transfer-/Zuweisungslänge/Parameter Transfer-/Zuweisungslänge/Parameter Steuerbyte
7
Bit Byte 0 1 2 3 4 5 6 7 8 9 10 11
6
5
4
3
2
1
0
Befehlscode REL LUN reserviert logische Blockadresse (MSB) logische Blockadresse logische Blockadresse logische Blockadresse (LSB) Transfer-/Zuweisungslänge/Parameter Transfer-/Zuweisungslänge/Parameter Transfer-/Zuweisungslänge/Parameter Transfer-/Zuweisungslänge/Parameter reserviert Steuerbyte
Abb. 27.6: Aufbau der 6-Byte-, 10-Byte- und 12-Byte-Befehle
Der Befehlscode bildet das erste Byte des Befehlsblocks. Er setzt sich aus der 3-Bit-Gruppe und dem 5-Bit-Befehl zusammen. Die logische Einheitennummer LUN gibt die Adresse der anzusprechenden logischen Einheit innerhalb des Targets an. Für Laufwerke mit integriertem Con-
Sandini Bib SCSI
925
troller ist das immer der Wert 0. Die logische Blockadresse umfasst bei einem 6-Byte-Befehl 21 Bits und bei 10-Byte- sowie 12-Byte-Befehlen 32 Bits. Sie gibt die Nummer des gewünschten Datenblocks an. Mit einem 6-Byte-Befehl können also maximal 2-MByte-Blöcke, mit einem 10-Byte- oder 12-ByteBefehl bis zu 4-GByte-Blöcke angesprochen werden. Für Festplatten, bei denen ein Block einem 512-Byte-Sektor entspricht, genügt also in den meisten Fällen ein 6-Byte-Befehl, über den somit auf 1 GByte Daten zugegriffen werden kann. Wenn das Bit REL für eine relative Adressierung gesetzt wird, ist die Bedeutung der Blockadresse relativ zum vorherigen Block, wobei die Blockadresse dann als Zweierkomplement einer vorzeichenbehafteten Zahl interpretiert wird. Die Transferlänge gibt die Menge der zu übertragenden Daten an. Normalerweise ist das die Zahl der Blöcke. 6-Byte-Befehle mit einem Byte für die Transferlänge ermöglichen die Übertragung von maximal 256 Blöcken. Ein Wert 0 bedeutet dabei 256 Blöcke. Somit können also z.B. bis zu 256 Blöcke auf einmal gelesen oder geschrieben werden. Bei der IDE-Schnittstelle bedeutete das eine Mehrsektorübertragung. Mit einem 10-Byte-Befehl, der zwei Bytes für die Transferlänge reserviert, können maximal 65.535 Blöcke übertragen werden. Ein Wert 0 bedeutet hier die Übertragung von keinem Block. Noch größer ist die Anzahl bei 12-Byte-Befehlen; hier sind vier Bytes für die Transferlänge reserviert, was 4 GByte-Blöcken entspricht. Der Eintrag Parameterliste gibt üblicherweise die Zahl der Bytes an, die in einem Befehl zur Übertragung einer Parameterliste während der Daten-Out-Phase an das Target übergeben werden. Das ist z.B. beim Befehl Modusauswahl der Fall. Wenn ein Befehl ausgelöst wird, der zur Rückgabe von Sense-Daten benutzt wird, wie z.B. Request Sense oder Inquiry, ist im Feld Zuweisungslänge die Zahl der Bytes einzutragen, die der Initiator vom Target empfangen soll. Das Target beendet die Übergabe der Sense-Daten, wenn der im Feld Zuweisungslänge angegebene Wert erreicht ist. Ist der Wert größer als die zu übergebenden Sense-Bytes, bricht das Target die Daten-In-Phase bereits früher ab. Die restlichen Bytes sind nicht definiert. Jeder Befehlsblock wird durch ein Steuerbyte abgeschlossen, das vor allem die Verkettung von Befehlen regelt. In Abbildung 27.7 ist sein Format angegeben. 7
6
5
2
Herstel reserviert
1
0
F L
Herstel: Hersteller F:
Flag 1=Message verketteter Befehl mit Flag abgeschlossen übergeben 0=Message verketteter Befehl abgeschlossen übergeben
L:
Link (Verkettung) 1=Befehlsverkettung
0=keine Befehlsverkettung reserviert
Abb. 27.7: Aufbau des Steuerbytes
Die beiden höchstwertigen Bits Herstel stehen den Herstellern von SCSI-Einheiten frei zur Verfügung, ihr Wert wird vom Target ignoriert. Die vier reservierten Bits werden auf Null gesetzt. Ist das Link-Bit L gesetzt, so verlangt der Initiator eine Befehlsverkettung. Das Target übergibt dann nach dem Abschluss eines Befehls nur einen Zwischenstatus und fordert den nächsten Befehl an. Die Verbindung wird nicht wie bei einem Einzelbefehl unterbrochen und über eine Bus-frei- und eine Selection-Phase neu aufgebaut, sondern bleibt erhalten, so dass der Initiator sofort den nächsten Befehlsblock übergeben kann.
Sandini Bib 926
Kapitel 27
Das Flag-Bit F ist eng mit dem Link-Bit verbunden. Ist L gelöscht, so sollte auch F gleich 0 sein. Bei aktiver Verkettung zeigt ein gelöschtes Flag-Bit F an, dass das Target nach einem erfolgreichen Teilbefehlsabschluss eine Message verketteter Befehl abgeschlossen an den Initiator übergibt. Bei gesetztem Flag-Bit wird stattdessen eine Message verketteter Befehl mit Flag abgeschlossen übertragen. Eine Befehlsausführung wird eingeleitet, indem ein 6-Byte-, 10-Byte- oder 12-Byte-Befehlsblock an das Target übermittelt wird. Manche Befehle benötigen zusätzlich eine Parameterliste, die während einer Daten-Out-Phase übergeben wird. Bei einem einfachen SCSI-Adapter kann dies z.B. folgendermaßen vor sich gehen:
: : : : : : : : : : :
Das Bit SCSI ENAB im Steuerregister löschen und SCSI ENAB setzen, um den SCSI-Bus zu aktivieren, die SCSI-ID des Host-Adapters in den SCSI-Datenport schreiben und über das Bit ARB STRT im Steuerregister eine Arbitration-Phase des Host-Adapters starten. Das Bit ARB CMPL im Statusregister überwachen, um das Ende der Arbitration-Phase zu bestimmen und um zu bestätigen, dass der Host-Adapter die Kontrolle über den SCSI-Bus erlangt hat. Eine Selection-Phase auslösen, um das gewünschte Target anzuwählen, indem Sie über das Bit SCSI SEL des Steuerregisters die SEL-Leitung aktivieren und über den SCSI-Datenport die SCSI-ID des Targets ausgeben. Anschließend das Bit SCSI BSY im Statusregister überwachen, um zu ermitteln, ob das adressierte Target auf die Selection-Phase reagiert und die Bussteuerung übernommen hat. Die Bits SCSI C/D, SCSI MSG und SCSI I/O im Statusregister überwachen, um den Beginn einer Command-Phase zu ermitteln; hierzu müssen SCSI MSG und SCSI I/O gelöscht, SCSI C/D aber gesetzt sein. Die sechs oder zehn Befehlsbytes des Befehlsblocks über den SCSI-Datenport an das Target übergeben, um die Befehlsausführung zu starten. Wenn für den Befehl (z.B. Modusauswahl) noch eine Parameterliste übergeben werden muss, die Bits SCSI MSG, SCSI C/D und SCSI I/O überwachen, um den Beginn einer Daten-OutPhase festzustellen (SCSI MSG, SCSI C/D und SCSI I/O gelöscht) und dann die Parameterliste über den SCSI-Datenport ausgeben. Wenn für den Befehl (z.B. Block schreiben) ein Datenblock übergeben werden muss, die Bits SCSI MSG, SCSI C/D und SCSI I/O überwachen, um den Beginn einer Daten-Out-Phase zu ermitteln (SCSI MSG, SCSI C/D und SCSI I/O gelöscht) und den Datenblock über den SCSIDatenport auszugeben. Wenn ein Befehl (z.B. Block lesen) einen Datenblock an den Initiator, d.h. den Host-Adapter, übergibt, die Bits SCSI MSG, SCSI C/D und SCSI I/O überwachen, um den Beginn einer Daten-In-Phase mit den gelöschten Bits SCSI MSG, SCSI C/D und gesetztem Bit SCSI I/O zu ermitteln und den Datenblock über den SCSI-Datenport einzulesen. Die Bits SCSI MSG, SCSI C/D und SCSI I/O im Statusregister überwachen, um den Beginn einer Status-Phase zu ermitteln, wenn SCSI MSG gelöscht und SCSI C/D und SCSI I/O gesetzt sind; das Statusbyte wird über den SCSI-Datenport eingelesen. Die Bits SCSI MSG, SCSI C/D und SCSI I/O im Statusregister überwachen, um den Beginn einer Message-In-Phase zu ermitteln (SCSI MSG, SCSI C/D und SCSI I/O gesetzt), und die Message über den SCSI-Datenport einlesen.
Bei leistungsfähigeren SCSI-Host-Adaptern ist ein großer Teil der hier explizit zu programmierenden Ansteuerung des SCSI-Bus entweder durch einen Prozessor, der mittels Firmware angesteuert wird, oder allein mittels Hardware durch ein ASIC implementiert, was aber nichts an der prinzipiellen Abfolge ändert.
Sandini Bib SCSI
927
27.4.1 Advanced SCSI Programming Interface – ASPI Wie ich bereits erwähnt habe, ist der Umgang mit den SCSI-Host-Adaptern bei einem fehlenden verbindlichen Standard für eine Programmierschnittstelle ein Problem. Abhilfe schaffen zwei Standards, nämlich die Common Access Method (CAM) der ANSI sowie das Advanced SCSI Programming Interface (ASPI) von Adaptec. Im Folgenden möchte ich die Grundlagen von ASPI kurz vorstellen. Hiermit ist es möglich, auf einfachste Weise SCSI-Befehle, Daten und Parameter an ein SCSI-Target abzusetzen bzw. Daten und Parameter von einem Target zu empfangen. Normalerweise liegt ASPI als Treiber vor, der beim Starten des PC geladen wird, wie es etwa bei DOS der Fall ist. In allen aktuellen Betriebssystemen (z.B. Windows 9x, Windows 2000, OS/2, Linux) ist ein derartiger Treiber bereits vorhanden, der automatisch aktiviert wird, wenn es nötig ist, also ein entsprechender Host-Adapter installiert bzw. detektiert wird. Die ASPI-Funktionen (siehe Tabelle 27.4) werden verwendet, indem Segment und Offset (in dieser Reihenfolge) auf dem Stack eines SCSI-Request-Blocks (SRB) abgelegt werden. Code
Funktion
00h 01h 02h 03h 04h 05h 06h 07h–7fh 80h–ffh
Host-Adapter abfragen Einheitentyp ermitteln SCSI-Befehl ausführen SCSI-Befehl abbrechen SCSI-Einheit zurücksetzen Parameter für Host-Adapter einstellen reserviert für Target-Modus reserviert für Erweiterung reserviert für Hersteller
Tab. 27.4: Die ASPI-Funktionen
Der SRB enthält vor dem Aufruf alle weiteren wichtigen Informationen für die aufzurufende Funktion sowie nach Ausführen der Anforderung die betreffenden Daten vom ASPI oder dem SCSI-Target. Die Struktur der ersten acht SRB-Bytes ist für alle ASPI-Funktionen gleich. Anschließend ist ein Far-Call zum Einsprungpunkt des ASPI-Treibers auszuführen. Unter DOS können Sie diesen Einsprungpunkt über den INT 21h, Funktion 44h (Kommunikation mit Einheitentreibern), Unterfunktion 02h (Steuercode lesen) ermitteln. Dazu ist zuvor der ASPI-Treiber mit Hilfe des ASPI-Treibernamens SCSIMGR$ zu öffnen und der zurückgegebene DOS-Handle als AL-Wert für INT 21h, Funktion 4402h zu verwenden. Als Beispiel möchte ich die Verwendung der ASPI-Funktion SCSI-Befehl ausführen erläutern. In Tabelle 27.5 sehen Sie den Aufbau des SRB für diese Funktion. Byte
Inhalt
00h 01h 02h 03h 04h–07h 08h 09h
02h (SCSI-Befehl ausführen) Status Host-Adapter-Nummer Bit 0: POST, Bit 1:Link, Bit 2...3: Richtung, Bit 3...5: reserviert reserviert ID des Target LUN
Tab. 27.5: Aufbau des SRB für die ASPI-Funktion SCSI-Befehl ausführen
Sandini Bib 928
Kapitel 27
Byte
Inhalt
0ah...0dh 0eh 0fh...12h 13h...16h 17h 18h 19h 1ah...1dh 1eh..3fh 40h...40h+l2–1 40h+l2...40h+l2+l1–1
Größe des Datenpuffers Umfang der Sense-Daten in Byte (l1) Segment:Offset des Datenpuffers Segment:Offset des SRB-Link Umfang des SCSI-Befehls in Byte (l2) Status des Host-Adapters Target-Status Segment:Offset von POST reserviert SCSI-Befehl Sense-Daten
Tab. 27.5: Aufbau des SRB für die ASPI-Funktion SCSI-Befehl ausführen (Forts.)
Vom SRB sind für diese ASPI-Funktion die Bytes 00h, 02h–17h, 1ah–40h+12–1 Eingabewerte an die ASPI-Funktion und die Bytes 01h, 18h–19h, 40h+l2–40h+l2+l1–1 Rückgabewerte der Funktion. Zu erkennen ist der Abschluss des ASPI-Funktionsaufrufs an einem von 00h verschiedenen Statuswert (Byte 01h). In Tabelle 27.6 sind die gültigen Statuswerte der ASPI-Funktionen angegeben. Statuswert
Bedeutung
00h 01h 02h 03h 04h 80h 81h 82h
Funktion wird gerade ausgeführt (ASPI in progress) Funktion erfolgreich abgeschlossen Funktion durch Host-Befehl abgebrochen SCSI-Befehl kann nicht abgebrochen werden allgemeiner Fehler ungültiges SRB-Format ungültiger Host-Adapter angegeben SCSI-Target nicht gefunden
Tab. 27.6: Statuswerte der ASPI-Funktionen
Um die ASPI-Funktion mit dem gewünschten SCSI-Befehl aufzurufen, ist zunächst ein Puffer für den SRB selbst und eventuell ein ausreichend großer Datenpuffer (z.B. wenn ein Block des Laufwerks gelesen oder geschrieben werden soll) bereitzustellen. Anschließend werden die SRBFelder initialisiert. Der Aufruf erfolgt dann einfach folgendermaßen (Adresse des SRB: SRB_seg:SRB_off, Einsprungadresse von ASPI: ASPI_ptr=ASPI_seg:ASPI_off): ASPI_start: mov ax, SRB_seg push ax mov ax, SRB_off push ax call ASP_ptr pop ax pop ax
; ; ; ; ; ; ; ;
ASPI-Funktion aufrufen Segment von SRB in Akkumulator ax laden Segmentwert auf Stack ablegen Offset von SRB in Akkumulator ax laden Offsetwert auf Stack ablegen Far-Call zum ASPI-Einsprungpunkt SRB-Offset vom Stack holen SRB-Segment vom Stack holen
SRB_check: mov bx, SRB_seg mov es, ax mov bx, SRB_off check_start: mov al, [es:][bx+1] or al, 00h JZ check_start
; ; ; ; ; ; ; ;
prüfen, ob ASPI-Funktion abgeschlossen ist Segment von SRB in bx laden Segment von SRB in Extrasegment es laden Offset von SRB in bx laden Beginn der Prüfung Statusbyte im SRB in al laden al mit Wert 00h vergleichen nochmals prüfen, wenn al gleich Null
Sandini Bib SCSI
929
SRB_check dient dazu, das Statusbyte im SRB so lange abzufragen, bis ein Wert ungleich Null auftritt. Das ist das Kennzeichen, dass die angeforderte SCSI-Funktion ausgeführt worden ist. Das Statusbyte im SRB enthält dann einen Beendigungscode, die Sense-Daten im SRB (Byte 40h+l2...40h+l2+l1–1) und den Sense-Code vom SCSI-Adapter.
ASPI unterstützt die SCSI-Befehlsverkettung durch ein Linking mehrerer SRBs. Dazu dient der 4Byte-Eintrag Segment: Offset des SRB-Link (Bytes 13h...16h). Er verweist auf den SRB des nächsten Befehls einer Kette. Um das SRB-Linking auch tatsächlich zu aktivieren, müssen Sie das Link-Bit in Byte 3 setzen. Das gilt für alle mit Ausnahme des letzten SRB einer Kette. Sobald ein adressiertes Target den Statuscode Linked Command Complete zurückgibt, beginnt die Ausführung des nächsten Befehls der Kette, d.h., der folgende SRB wird verarbeitet. Wenn das POST-Bit 0 im SRB gesetzt wird, führt ASPI ein so genanntes Posting aus und springt nach dem Ausführen des SCSI-Befehls die Far-Adresse an, die in den Bytes 1ah–1dh abgelegt ist. Somit kann der Aufruf z.B. neben der Prüfung des Statuscodes im SRB als alternative Möglichkeit verwendet werden, um einen ASPI-Funktionsabschluss zu erkennen. Eine andere Verwendung wäre eine Nachbereitung von SCSI-Ergebnissen, z.B. die Auswertung von Sense-Daten. Unmittelbar nach dem Aufruf der POST-Routine sind auf dem Stack die 4-Byte-Rücksprungadresse (Segment:Offset) zu ASPI und ein 4-Byte-SRB-Zeiger (Segment:Offset) zum SRB, der gerade verarbeitet wurde, abgelegt.
27.4.2 Common Access Method – CAM CAM arbeitet ähnlich wie ASPI mit Hilfe einer Datenstruktur im Speicher, dem CAM Control Block (CCB). Er entspricht dem SRB von ASPI. Der CCB enthält alle wichtigen Informationen für den auszuführenden Befehl und hält (je nach Funktion) einen Puffer für die Rückgabedaten bereit. In Tabelle 27.7 sind die spezifizierten CAM-Befehle angegeben. Code
Funktion
00h 01h 02h 03h 04h 05h 06h 07h...0fh 10h 11h 12h 13h 14h...1fh 20h 21h 22h...2fh 30h 31h 32h...7fh 80h...ffh
kein Vorgang (NOP) SCSI-I/O-Funktion ausführen Einheitentyp ermitteln SCSI-Pfad abfragen SIM-Warteschlange freigeben asynchrone Rückmeldung einstellen Einheitentyp einstellen reserviert SCSI-Befehl abbrechen SCSI-Bus zurücksetzen SCSI-Einheit zurücksetzen I/O-Vorgang abbrechen reserviert Einheit abfragen Einheitenanforderung ausführen reserviert LUN aktivieren Target-I/O ausführen reserviert herstellerabhängig
Tab. 27.7: Die CAM-Befehle
Sandini Bib 930
Kapitel 27
Im Unterschied zu ASPI wird eine CAM-Funktion nicht über einen Far-Call zum Einsprungpunkt des Treibers aktiviert, sondern durch Aufruf des INT 4fh, Funktion 8100h. Das Aufrufformat ist in Tabelle 27.8 dargestellt. Register AH AX BX ES 1)
Aufrufwert
Rückgabewert Fehlercode 1)
8100h CCB-Offset CCB-Segment
00h=o.k., 01h=ungültige CCB-Adresse
Tab. 27.8: Aufrufformat des INT 4fh, Funktion 8100h – CCB an CAM-Treiber übergeben
Ob überhaupt ein CAM-Treiber vorhanden ist, kann durch die Funktion 8200h des INT 4fh ermittelt werden. Das Aufrufformat ist in Tabelle 27.9 angegeben. Register AH AX CX DX ES:DI 1) 2)
Aufrufwert
Rückgabewert Fehlercode 1)
8200h 8765h cba9h
9abch 2) 5678h 2) Far-Zeiger auf SCSI_CAM 2)
00h=CAM-Treiber installiert nur wenn CAM-Treiber installiert ist (AH=00h)
Tab. 27.9: Aufrufformat des INT 4fh, Funktion 8200h – Installationsprüfung für CAM-Treiber
27.5 Die verschiedenen SCSI-Standards Der Vorteil von SCSI gegenüber anderen im PC-Bereich üblichen Lösungen (IDE) ergibt sich jedoch eher nicht bei der alleinigen Verwendung zweier Festplatten, sondern beim Einsatz von Peripherie wie mehrerer Festplatten, CD-Writer, Scanner sowie Tape-Streamer und für den einfachen Datenaustausch beispielsweise mittels SCSI-Wechselplatten. SCSI ist durch eine ständige Fortentwicklung gekennzeichnet, so dass es nicht verwundert, dass es mehrere SCSI-Standards gibt, wobei es durchaus vorkommt, dass das Standardisierungsgremium (ANSI) mit dem Ideenreichtum der Hersteller nicht immer Schritt halten kann. Es tauchen daher hin und wieder Geräte auf, die einer neuen SCSI-Technologie folgen, die eben noch nicht offiziell abgesegnet worden ist. Auf der anderen Seite sind SCSI-Auslegungen von der ANSI spezifiziert worden (z.B. 32-Bit-Wide SCSI), die sich kaum in Geräten auf dem Markt niedergeschlagen haben. In diesem Unterkapitel möchte ich daher die SCSI-Standards vorstellen und erläutern, durch welche Besonderheiten sie sich jeweils auszeichnen.
27.5.1 SCSI-I und der CCS Mit der (nachträglich so benannten) SCSI-I-Spezifikation wurde SCSI als Standard geboren, zunächst aber nur als Schnittstelle zu Plattenlaufwerken. Viele Dinge blieben hier etwas vage, so dass Kompatibilitätsprobleme an der Tagesordnung waren. SCSI-I sieht nur einen 8-Bit-SCSI-Bus vor, und die Übertragungsrate beträgt im asynchronen Modus maximal etwa 3 Byte/s, im optionalen synchronen Modus 5 Byte/s. Weil zunächst auch die Befehle dem jeweiligen Gerätehersteller sehr viele (eigentlich zu viele) Freiheiten für die konkrete Implementierung gaben, wurde
Sandini Bib SCSI
931
mit dem Common Command Set (CCS) eine erste Vereinheitlichung erreicht. CCS ist eine Ergänzung zu SCSI-I und kein eigener SCSI-Standard. In Tabelle 27.10 finden Sie das vorgeschriebene Kommando-Set. Code
Befehl
Funktion
00h 01h 03h 04h 07h 08h 0Ah 0Bh 11h 12h 15h 16h 17h 1Ah 1Bh 1Ch 1Dh 25h 28h 2Ah 2Bh 2Eh 2Fh 37h 3Bh 3Ch 3Eh 3Fh
Test Unit Ready Rezero Unit Request Sense Format Unit Reassign Blocks Read Write Seek Read Usage Counter Inquiry Mode Select Reserve Unit Release Unit Mode Sense Start/Stop Unit Receive Diagnostic Results Send Diagnostics Read Capacity Read Extended Write Extended Seek Extended Write and Verify Verify Read Defect Data Write Buffer Read Buffer Read Long Write Long
Feststellen, ob das Gerät bereit ist Köpfe zum Zylinder 0/Kopf 0 bewegen Sense-Daten (Fehlerstatus) senden Platte formatieren Inhalt defekter Blöcke verschieben Daten lesen Daten schreiben Suchen eines logischen Blocks Nutzungszähler lesen Identifikationsparameter abfragen Betriebsart einstellen LUN für andere Initiatoren sperren LUN für andere Initiatoren freigeben Geräte-Parameter zum Initiator senden Gerät für weitere Kommandos sperren oder freigeben Selbsttest-Ergebnisse empfangen Selbsttest durchführen Plattenkapazität ermitteln Daten lesen (erweiterte Adresse) Daten schreiben (erweiterte Adresse) Suchen eines logischen Blocks (erweiterte Adresse) Daten schreiben und prüfen Gesendete Daten prüfen Defect-Liste lesen Überprüfen des Datenzwischenspeichers, Daten schreiben Überprüfen des Datenzwischenspeichers, Daten lesen Block von 512 Bytes lesen Block von 512 Bytes schreiben
Tab. 27.10: Der standardisierte SCSI-Befehlssatz für Festplatten (CCS)
27.5.2 SCSI-II SCSI-II stellt einen ganz wesentlichen Fortschritt hin zu einer geräteunabhängigen und daher sehr flexiblen Busschnittstelle dar. Die Befehle und Parameterlisten wurden klar definiert und der synchrone Modus als verbindlich festgelegt. Darüber hinaus wurden die zehn Geräteklassen mit entsprechenden geforderten und optionalen Befehlen definiert. Dadurch können nun so unterschiedliche Geräte wie Festplatten, CD-ROM, magneto-optische Laufwerke, Scanner, Bandlaufwerke, Medienwechsler, Drucker, Kommunikationsgeräte und allgemeine SCSI-Prozessorsysteme an einen Host-Adapter angeschlossen und gesteuert werden. SCSI-II ist also das erste »richtige« SCSI (wenn man die ursprüngliche Intention als Richtschnur nimmt).
27.5.3 SCSI-III Zuweilen werden Sie auf die Bezeichnung SCSI-III stoßen, was für sich allein aber überhaupt nicht aussagekräftig ist. In dieser seitenstarken Spezifikation sind beispielsweise Protokolle zur
Sandini Bib 932
Kapitel 27
Unterstützung von seriellen Schnittstellen, Multi-Host-Systemen, Glasfaserleitungen und verschiedene Schnittstellen definiert. Basis von SCSI-III ist eine Schichtenarchitektur namens SAM, was für SCSI Architecture Modell steht. Der SCSI-III-Standard erlaubt prinzipiell eine Vielzahl von Realisierungen wie etwa auch den Fibre Channel und Firewire (IEEE-1394). Bei Ultra 160 SCSI und auch bereits bei Ultra 2 SCSI (siehe Kapitel 27.5.7 und 27.5.8) haben die Hersteller auf einige in SCSI-III definierte Funktionen zurückgegriffen. Streng genommen sind dies herstellerspezifische Auslegungen aus der Gesamtheit von SCSI-III, was somit noch weitere Varianten erwarten lässt. Es bleibt zu hoffen, das die ANSI-Standardisierung hier den Wildwuchs herstellereigener Vorstellungen verhindert oder zumindest eindämmt, damit die bisher gegebene SCSI-Abwärtskompatibilität in großen Breichen erhalten bleibt.
27.5.4 Fast SCSI Mit Fast SCSI wird die maximale Taktfrequenz im synchronen Modus auf 10 MHz angehoben. Hier wird also kein Handshaking ausgeführt, so dass die Handshake-Signale dann quasi als Taktsignale zu verstehen sind und sich die Zykluszeiten verkürzen. Das entspricht bei einem 8-Bit-SCSI-Bus einer Datentransferrate von 10 MByte/s. Zu beachten ist, dass sowohl die SCSIBefehle als auch die Messages nach wie vor asynchron übergeben werden, was ganz allgemein auch auf die folgenden SCSI-Realisierungen zutrifft, und erst mit Ultra 320-SCSI ist in dieser Hinsicht ein Fortschritt zu verzeichnen. Im SCSI-Fast-20-Modus, der auch unter Ultra SCSI firmiert, wird demgegenüber noch einmal die Taktfrequenz erhöht, was wiederum zu ungefähr doppelt so hohen Übertragungsraten wie beim Fast-SCSI-Mode führt.
27.5.5 Wide SCSI In Zeiten von 32-Bit- und 64-Bit-Bussystemen erscheinen die acht Bits des SCSI-Datenbus doch recht bescheiden. Daher überrascht es nicht, dass auch die Breite des SCSI-Bus auf 16 oder sogar 32 Bits erweitert worden ist. Die relativ langen SCSI-Kabel setzen der Frequenz natürlich Grenzen, nicht aber der Anzahl von parallelen Leitungen (einmal abgesehen von dem zusätzlichen Elektronikaufwand). Mit dem 8 Bit breiten SCSI-Bus lassen sich maximal 8 Geräte (inklusive Hostadapter) und mit Wide SCSI dementsprechend 16 bzw. 32 Geräte verwenden. 16-Bit-Wide SCSI verwendet ein 68-poliges Kabel, das alle nötigen Signalleitungen führt, und über entsprechende Adapter (P-A) lassen sich hiermit auch 8-Bit-Geräte einsetzen.
Abb. 27.8: Der 68-polige High-Density-Stecker (P-Kabel)
Wide und »normale« SCSI-Geräte können demnach am selben SCSI-Bus betrieben werden. Initiator und Target handeln in einer (asynchronen 8-Bit-) Message-Phase nämlich aus, ob der asynchrone oder synchrone, normale oder Fast-Modus und ein 8-Bit-, 16-Bit- oder 32-Bit-Transfer ausgeführt werden soll. Je nach Leistungsfähigkeit und Implementierungsstand der beteiligten SCSI-Einheiten wird ein schneller oder langsamer Modus gewählt. Fast-, Wide- und folgende Ultra-Modi können gleichzeitig aktiv sein, die maximale Übertragungsrate steigt dann bei 10
Sandini Bib SCSI
933
MHz und der 16-Bit-Breite auf 40 MByte/s an. Bei einem 32-Bit-SCSI-Bus wären somit 80 MByte/s möglich. Das ist für einen externen Bus eine ganz ansehnliche Rate. Beachten Sie aber, dass diese Übertragungsraten nur für die Datenphasen gelten, so dass der Overhead durch die anderen (langsamen) Busphasen immer mehr ins Gewicht fällt. Das Datenübertragungsprotokoll funktioniert bei Wide SCSI analog zu dem in Kapitel 27.1 erläuterten Verfahren, wie es eben auch bei 8-Bit-SCSI – das auch als narrow SCSI bezeichnet wird – absolviert wird.
27.5.6 Differential SCSI Die bisher üblichen erläuterten SCSI-Bus-Signale beziehen sich immer auf die Masse und führen einen TTL-Pegel. Diese Auslegung wird auch als asymmetrisch oder Single-Ended bezeichnet. Es existiert aber auch eine SCSI-Bus-Variante, die als Differential SCSI oder auch symmetrisch ausgewiesen wird. Für diese Lösung werden die Signale nach der RS485-Spezifikation eingesetzt, was damit zu einem störungssichereren System führt. Jedes Bus-Signal verwendet jeweils zwei Leitungen (+ und -), und es sind hiermit Leitungslängen von bis zu 25 m realisierbar. Aufgrund der unterschiedlichen Treiberelektronik ist es aber nicht zulässig, wenn diese beiden Ausführungen (asymmetrisch, symmetrisch) innerhalb eines SCSI-Bus-Systems gemeinsam verwendet werden, denn das führt zur Zerstörung der Interfaces. Im PC-Bereich ist Differential SCSI jedoch kaum verbreitet, und Sie finden entsprechende Geräte meist in Workstations wie etwa von IBM oder auch Sun.
27.5.7 Ultra SCSI Die immer störungsfreier arbeitenden elektronischen Schaltungen ermöglichen es auch für einen externen Bus wie SCSI (eben kein Systembus), die Taktfrequenz weiter anzuheben. Genau das ist der Hintergrund von Ultra SCSI, das auch als Fast 20 bezeichnet wird. Hier wird der Übertragungstakt auf 20 MHz verdoppelt. Leider dürfen dann aber die Kabel nicht mehr so lang sein. Über den Daumen gepeilt, bedeutet eine Verdopplung der Frequenz eine Halbierung der zulässigen Kabellänge. Wenn Ihr Ultra-Laufwerk partout keinen 20-MHz-Modus ausführen will, kann das (einen Ultra SCSI Controller vorausgesetzt) an zu großen Kabellängen liegen. Tabelle 27.11 zeigt die zulässigen Kabellängen der verschiedenen SCSI-Implementierungen in Abhängigkeit von der Anzahl der verwendeten Geräte. SCSI-Typ Standard Fast Fast-20 (Ultra) Fast-20 (Ultra) Wide (16 Bit) Wide Ultra (16 Bit) Wide Ultra (16 Bit) Wide Ultra differential Ultra 2 (LVDS) Wide Ultra 2 (LVDS)
Geräteanzahl 8 8 4 8 16 4 8 16 8 16
Kabellänge 6m 3m 3m 1,5 m 3m 3m 1,5 m 25 m 12 m 12 m
Transferraten < 5 MByte/s 10 MByte/s 20 MByte/s 20 MByte/s 20 MByte/s 40 MByte/s 40 MByte/s 40 MByte/s 40 MByte/s 80 MByte/s
Tab. 27.11: Beispiele für zulässige Kabellängen bei unterschiedlicher Geräteanzahl
Sandini Bib 934
Kapitel 27
27.5.8 Ultra 2 SCSI Neben den beiden klassischen Differential-Auslegungen (8 und 16 Bit) existiert seit Ende 1997 der Ultra 2-Standard, der auch als Low Voltage Differential SCSI (LVDS) bezeichnet wird. Die Kontaktbelegung ist zwar mit dem klassischen Differential-SCSI identisch, allerdings gibt es hierzu zwei wichtige Unterschiede: Der Signalpegel ist niedriger (typischerweise +/- 350 mV statt +/- 1,5 V), was die Treiberelektronik preiswerter macht, und die Verwendung des DIFF SENS-Signals (Pin 16) ist vorgeschrieben, was erstmalig auch den Betrieb eines »masse-bezogenen« SCSI-Gerätes (Single Ended) an einem Differential-Adapter erlaubt. DIFF SENS wird von einem angeschlossenen Single-Ended-Gerät auf Low-Pegel gezogen, was die Treiberbausteine automatisch in den Single-Ended-Modus schaltet, ohne dass es dabei zu elektrischen Beschädigungen kommen kann. Demnach ist ein Mischbetrieb von Differential- und Single-Ended-Geräten möglich, was allerdings dazu führt, dass bei Vorhandensein eines einzigen Single-Ended-Gerätes der gesamte SCSI-Bus in dieser Art und Weise arbeiten muss. Signal
Pin
Signal
Pin
+ Data Bus 12 + Data Bus 13 + Data Bus 14 + Data Bus 15 + Data Bus Parity 2 + Data Bus 0 + Data Bus 1 + Data Bus 2 + Data Bus 3 + Data Bus 4 + Data Bus 5 + Data Bus 6 + Data Bus 7 + Data Bus Parity 1 GND DIFF SENS Terminator Power Terminator Power Reserviert GND + Attention GND + Busy + Acknowledge + Reset + Message + Select + Control-Data + Request + Input-Output + Data Bus 8 + Data Bus 9 + Data Bus 10 + Data Bus 11
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
- Data Bus 12 - Data Bus 13 - Data Bus 14 - Data Bus 15 - Data Bus Parity 2 - Data Bus 0 - Data Bus 1 - Data Bus 2 - Data Bus 3 - Data Bus 4 - Data Bus 5 - Data Bus 6 - Data Bus 7 - Data Bus Parity 1 GND GND Terminator Power Terminator Power Reserviert GND - Attention GND - Busy - Acknowledge - Reset - Message - Select - Control-Data - Request - Input-Output - Data Bus 8 - Data Bus 9 - Data Bus 10 - Data Bus 11
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
Tab. 27.12: Die Signal-Belegung für den 16-Bit-SCSI-Bus
Sandini Bib SCSI
935
Ultra 2 SCSI ist für zwei Ausführungen definiert: 8-Bit- und 16-Bit-SCSI (Wide Ultra 2), wobei letztere aber die üblichere ist. Dieser 16-Bit-Bus wird mit den in Tabelle 27.12 angegebenen Signalen und dem 68-poligen Anschluss (vgl. Abbildung 27.8) verwendet, was ebenfalls für Ultra 160- und Ultra 320 SCSI gültig ist. Stand der Dinge ist somit ein 16 Bit breiter SCSI-Bus, und die »32-Bit-Schiene« wird technologisch nicht mehr weiterverfolgt. Die 16-Bit-Signale entsprechen funktionell denen, die mit Wide SCSI ursprünglich definiert worden sind. Für die »oberen« Data-Bus-Signale (Data Bus 8–15) kommen demnach noch ein weiteres Parity-Signal (Data Parity 2) und zusätzliche Terminator-Power-Signale zum Einsatz, und die Signale sind eben differenziell ausgeführt. Die Datenübertragungsraten betragen bei Ultra 2 SCSI 40 MByte/s bzw. 80 MByte/s in der üblicheren Wide-Ausführung, und es kommt ein 50-poliger bzw. ein 68-poliger Anschluss zum Einsatz. Als maximale Kabellänge wird 12 m angegeben. Ultra 2 SCSI-Geräte sind aber nicht mit den klassischen Differential-SCSI-Geräten identisch. Für Ultra 2 werden daher ein Ultra 2-Hostadapter und Ultra 2-Geräte benötigt, um diesen schnellen Modus nutzen zu können.
27.5.9 Ultra 160 SCSI Ultra 160 ist eine recht neue SCSI-Variante und verdoppelt, wie es die Bezeichnung impliziert, noch einmal die Datentransferrate auf 160 MByte/s. In Anbetracht der Tatsache, dass der PCIBus im Idealfall maximal 133 MByte/s transferieren kann, wird deutlich, dass ein Ultra 160Hostadapter in der 64 Bit breiten PCI- oder PCI-X-Bus-Version ausgeführt sein sollte, damit sich nicht durch das PC-Bussystem Einschränkungen in der Datenübertragungsrate ergeben. Wie erwähnt, gelten die jeweils zur Leistungsbeschreibung herangezogenen maximal möglichen Datenübertragungsraten generell für den »reinen« (synchronen) Datentransfer, während sämtliche Command-, Status- und Message-Phasen im asynchronen Modus mit ca. 3 MByte absolviert werden. Das Request-Signal fungiert in der synchronen Betriebsart als Taktsignal, das bei Ultra 2 SCSI 40 MHz beträgt. Was bei der ursprünglichen synchronen SCSI-Betriebsart mit 5 MByte/s begann, wurde im Laufe der Zeit durch die kontinuierliche Erhöhung der Taktfrequenz sowie der Verbreiterung von 8 Bit auf 16-Bit-Wide SCSI letztendlich zu Ultra 2 SCSI mit 80 MByte bei der Wide-Ausführung (LVDS). Jede Erhöhung der Taktfrequenz zog dabei eine notwendige Reduzierung der maximalen Kabellänge nach sich (vgl. Tabelle 27.11), und nur durch den Übergang von Single-Ended- auf Differential-SCSI wurden erst wieder Kabellängen realisierbar, um auch tatsächlich die maximal mögliche Anzahl an Geräten »verkabeln« zu können. Diesem Umstand ist auch bei Ultra 160 Rechnung zu tragen, das sowohl anschluss- als auch kabelkompatibel zu Ultra2 ist. Die Verdoppelung der Datenübertragungsrate wird bei Ultra 160 dadurch erreicht, dass die Datenübertragung auf beiden Flanken des Taktsignals (Req) ausgelöst – getriggert – wird und nicht nur auf der ansteigenden Flanke wie bisher. Die Taktfrequenz beträgt auch hier maximal 40 MHz. Dieses Verfahren wird prinzipiell schon seit einiger Zeit bei RAM-Speichern (DDR, Double Data RAM) sowie auch beim Systembus der Athlon-CPUs von AMD eingesetzt und wird bei SCSI als Double Transition Clock (DTC) bezeichnet.
Sandini Bib 936
Kapitel 27
Abb. 27.9: Bei Ultra 160 SCSI wird die Datenübertragung auf beiden Flanken des Request-Signals initiiert, was somit zu einer Verdoppelung gegenüber Ultra 2 SCSI führt.
Ultra 160 SCSI enthält eine Fülle an optionalen Funktionen, so dass sich aktuelle Ultra 160 SCSIRealisierungen nur als eine von mehreren möglichen Implementierungen darstellen. Kennzeichnend sind aber drei wesentliche Dinge: Double Transition Clock, der Einsatz des Cyclic Redundancy Checks (CRC) sowie die so genannte Domain Validation. Letzteres ist ein wichtiger Schritt für die automatische und optimale Konfigurierung der möglicherweise vorhandenen unterschiedlichen SCSI-Bus-Geräte. Der Hostadapter prüft vor dem eigentlichen Verbindungsaufbau durch Abfrage (Inquiry), welchem Standard die einzelnen Geräte entsprechen. Falls ein Gerät dann jedoch nicht mit der vereinbarten Geschwindigkeit arbeiten kann, funktioniert es eben einfach nicht. Trotz Identifizierung per SCSI-BIOS können sich in der Praxis daher durchaus derartige Problemfälle ergeben, was sich nunmehr mit Domain-Validation ändern soll. Dieser neue Identifizierungsmechanismus sorgt dafür, dass zum Test 128 Bytes an Daten nach der BIOS-Initialisierung mit der detektierten Rate gesendet und auch wieder zum Adapter zurückgeschickt werden. Der Host-Adapter kann somit die Korrektheit der Daten überprüfen, und falls diese nicht gegeben sein sollte, werden die Parameter erneut ausgehandelt, bis sich eine Übereinstimmung ergibt, was die Reduzierung der Taktrate oder auch die Umschaltung der Betriebsart (z.B. auf Ultra 2) bedeuten kann.
27.5.10 Ultra 320 SCSI Ultra 320 SCSI nutzt wie der Vorgänger beide Taktflanken zur Datenübertragung. Jetzt wird jedoch mit einem Takt von 80 MHz gearbeitet, was eine Bandbreite von maximal 320 MByte/s erlaubt. Die typische Kabellänge ist aber ebenfalls auf maximal 12 m festgelegt, was eher für mehr Verwunderung sorgen kann, wenn man bedenkt, dass sich dabei Effekte wie Reflexionen, Rauschen, Übersprechen und ganz allgemein Störungen nicht störend auf die Übertragung auf dem parallelen Kabel auswirken dürfen. Daher werden von einigen Herstellern, wie beispielsweise Adaptec, zum einen spezielle rundgebündelte Kabel empfohlen. Zum anderen sind in der Interface-Elektronik so genannte Adjustable Active Filter (AAF-Technologie) eingebaut, die für die Filterung hochfrequenter Oberwellen notwendig sind.
Sandini Bib SCSI
937
Abb. 27.10: Ultra 320 SCSI bildet mit den Kommandos, den Statusinformationen und den Nutzdaten Datenpakete, die als eine Folge von mehreren Blöcken transportiert werden.
Die andere wesentliche Neuerung von Ultra 320 SCSI nennt sich Packetized SCSI. Dies ist ein paketorientiertes Protokoll, bei dem die bisher im (langsamen) asynchronen Modus absolvierten Command-, Status- und Message-Phasen nun wie die Daten mit 320 MByte/s transferiert werden können. Ein CRC wird dabei über das gesamte Paket und nicht wie bisher nur über die Datenpakete gebildet, was somit zu einer erhöhten Datenintegrität führt. Das Packen und Entpacken der Nutz- und Steuerdaten erfolgt dabei automatisch durch den Hostadapter und die Laufwerke, so dass sich damit wiederum eine Software-Kompatibilität zu den vorherigen SCSIStandards ergibt, wie es prinzipiell bereits ab SCSI-II der Fall ist. Außerdem gibt es nunmehr einen Streaming-Modus, mit dem es möglich ist, mehrere Datenblöcke direkt hintereinander zu übertragen, d.h., es wird nicht wie bisher nach jedem Block ein Acknowledge-Zyklus eingelegt, der nunmehr erst am Ende eines kompletten Datenpakets absolviert wird. Ein Ultra 320 SCSI-Hostadapter (z.B. von Adaptec, LSI Logic, ICP Vortex) ist zumeist als PCI-XAdapter ausgeführt, denn mit einem anderen PC-Bussystem sind derartige Datenraten nicht mehr zu bewältigen. Ein typisches Einsatzgebiet für Ultra 320 SCSI sinddie RAID-Systeme.
Sandini Bib
Sandini Bib
28
Optische Laufwerke
Bei Laufwerken unterscheidet man prinzipiell zwischen zwei verschiedenen Speicher- und damit auch Lesemethoden: magnetisch wie bei einer Diskette oder Festplatte und optisch wie bei einer CD-R. Daneben gibt es auch ein Verfahren, das eine Kombination beider Methoden verwendet und dementsprechend als magnetooptisch (MO) bezeichnet wird. Speicher auf optischer und magnetooptischer Basis sind Gegenstand dieses Kapitels. Im Übrigen lässt sich das jeweilige Speichermedium (magnetisch oder optisch) auch anhand der Bezeichnung identifizieren. Ein »k« steht eigentlich immer für magnetisch und ein »c« für optisch, beispielsweise Floppy Disk (Diskette), eben magnetisch, und Compact Disc (CD-ROM) für optisch. Optische Laufwerke weisen heute in der Regel entweder eine IDE- oder eine SCSI-Schnittstelle auf. Außerdem gibt es auch noch die Möglichkeit, den USB oder Firewire für externe Laufwerke und andere Einheiten verwenden zu können, was somit jeweils unter die Gepflogenheiten dieser Bussysteme fällt und für optische Laufwerke keine Besonderheiten nach sich zieht. Daher werden in diesem Kapitel im Wesentlichen der Aufbau und die Funktionsweise der wichtigsten optischen Laufwerke vorgestellt.
28.1 CD-ROM Auf einer üblichen Standard-CD-ROM, wobei ROM für Read Only Memory – nur Lese-Speicher – steht, lassen sich üblicherweise maximal 74 Minuten Audio oder 650 MByte (genauer 680 MByte, wenn 1 KByte als 1024 Byte angesehen wird) an Dateninformationen unterbringen. Die »normale« CD eignet sich somit als Festwertspeicher für größere Datenmengen, schließlich ist ja auch in digitalisierter Form vorliegende Musik nichts anderes als eine Art der Information. Der technische Unterschied zwischen einem »CD-Spieler« einer Stereoanlage und einem CD-ROM-Laufwerk ist daher auch nicht besonders groß. Die ersten CD-ROM-Laufwerke waren nicht nur in ihrem prinzipiellen Aufbau, sondern auch von ihren technischen Daten her mit dem Audio-CD-Player verwandt und arbeiteten mit einer Umdrehungsgeschwindigkeit von 530 U/Min. Da hier jeder Sektor 2 KByte an Daten enthält und es 75 davon gibt, führt dies zu einer Datenübertragungsrate von 150 KByte/s. Dieser Laufwerkstyp wird als Single Speed bezeichnet, verfügt typischerweise über eine Zugriffszeit von 600 ms und bildet gewissermaßen die Grundlage aller darauf folgenden Weiterentwicklungen. Im Vergleich zur Geschwindigkeit von damaligen Festplatten (IDE: 2 MByte/s, 25 ms) schnitten die Daten eines Single-Speed-Laufwerks jedoch erheblich schlechter ab, so dass in schneller Reihenfolge Modelle mit der Bezeichnung Double- oder Quad-Speed folgten. Mittlerweile sind wir bei CD-ROM-Laufwerken angekommen, die als 52X (und möglicherweise noch höher) bezeichnet werden. Die Umdrehungsgeschwindigkeit ist bei einem CD-ROM-Laufwerk – im Gegensatz zum AudioCD-Player – nicht konstant, sondern schwankt je nachdem, wo sich die Leseoptik gerade über der CD befindet (innen oder außen). Lediglich im Audio-Betrieb wird der Betriebsmodus umgeschaltet, erst dann arbeitet des Laufwerk mit der definierten konstanten Umdrehungsgeschwindigkeit von 530 U/Min. Ein gewöhnliches CD-ROM-Laufwerk realisiert also eine konstante Datenübertragungsrate bei variierender Umdrehungsgeschwindigkeit. Als Kennzeichnung für die Rate wird dabei oftmals der X-Faktor angeführt, der besagt, dass beispielsweise ein 50x-Laufwerk eine um
Sandini Bib 940
Kapitel 28
den Faktor 50 höhere Transferrate als ein Single-Speed-Laufwerk der ersten Generation aufweist. Es ist also keineswegs der Fall, dass ein 50x-Laufwerk mit der 50-fachen Geschwindigkeit eines Single-Speed-Laufwerks arbeitet. Das Leseverfahren mit konstanter Übertragungsrate wird als Constant Linear Velocity (CLV) bezeichnet. Da die Daten auf einer CD in einer Spirale und mit gleich bleibender Dichte angeordnet sind, ist die Drehzahl beim Lesen im Innenbereich der CD am höchsten. Ein anderes Verfahren nennt sich Constant Angular Velocity (CAV), d.h., dass hier die Umdrehungsgeschwindigkeit konstant ist und die Übertragungsrate variiert, wie es auch bei den üblichen Disketten- und Festplattenlaufwerken der Fall ist. CD-ROM-Laufwerke, die mit dieser Methode arbeiten, tragen in ihrer Bezeichnung meist eine entsprechende Angabe wie 12-24x. Im Innenbereich der CD ist die Datenübertragungsrate am geringsten, was bedeutet, dass ein CD-ROM-Laufwerk nach CAV erst zur Außenseite der CD hin seine höchste Datenübertragungsrate erreicht. Da die Daten auf einer CD aber von innen nach außen geschrieben und dementsprechend auch gelesen werden, hängt es von der Kapazität der CD-ROM ab, ob ein 12-24x-Laufwerk tatsächlich schneller ist als ein 12x-Laufwerk. Bei halbvollen CDs wird dies wohl aber nicht der Fall sein. Einige CD-ROM-Laufwerke, wie etwa von der Firma Plextor, kombinieren CLV und CAV. Der Innenbereich der CD wird mit CAV (z.B. 12-24x) gelesen, und der Außenbereich mit CLV, was beim jeweiligen Laufwerk die maximale Übertragungsrate (z.B. 24x) zur Folge hat. Wann diese Umschaltung in Kraft tritt, ist allerdings von Hersteller zu Hersteller unterschiedlich realisiert, so dass es in der Praxis kaum relevant erscheint, nach welcher dieser drei Methoden das CDROM-Laufwerk letztlich arbeitet. Bitsignal Sensor bewegbarer Spiegel
reflektierter Strahl
Laserdiode
Abtaststrah l
reflektiert er Strah l
Abtaststrahl
Strahlteiler
optische Platte Abb. 28.1: CD-ROM: Ein fein gebündelter Laserstrahl von einer Laserdiode wird über eine Optik mit einem kippbaren Spiegel auf die Oberfläche der optischen Platte fokussiert. Die Intensität des zurückgestreuten Strahls wird in einem Sensor erfasst und liefert ein Bitsignal.
Im Laufwerk erzeugt ein kleiner Halbleiterlaser einen sehr feinen Laserstrahl mit einer Wellenlänge von etwa 850 nm. Der Strahl ist nicht sichtbar, weil die Wellenlänge im nahen Infrarotbereich liegt. Über eine durch Stellglieder sehr präzise bewegbare Spiegeloptik wird der Laserstrahl auf die Oberfläche der CD-ROM-Platte fokussiert.
Sandini Bib Optische Laufwerke
941
Die CD trägt die Information in Form kleiner Vertiefungen und Erhebungen, die als Pits und Lands bezeichnet werden. Jeder Übergang vom Pit zum Land und umgekehrt wird dabei als Eins interpretiert, und eine bestimmte Strecke (300 nm) ohne Zustandsänderung wird als Null betrachtet. Trifft der Laserstrahl auf eine solche Delle, wird der Strahl nicht gerichtet zurückreflektiert, wie das zwischen den Vertiefungen der Fall ist, sondern zerstreut. Die Rückstreuintensität ist also wesentlich geringer, wenn der Strahl auf eine solche Vertiefung trifft, wie es in Abbildung 28.1 dargestellt ist. Denselben Effekt sehen Sie bei einem Spiegel und einer rauen Wand: Obwohl das Reflexionsvermögen des Spiegels nicht wesentlich höher als das einer frisch gekalkten Hauswand ist, werden Sie von der Sonne, die im Spiegel reflektiert wird, stark geblendet, von der weißen Wand aber nicht. Im Laufwerk nimmt ein Sensor die Intensität des zurückreflektierten Strahls auf, die im Takt der Vertiefungen – also der Informationsbits – schwankt, und setzt diese Schwankungen in ein Bitmuster um. Bei diesem Verfahren ist es aber generell nicht möglich, dass beispielsweise mehrfach der Wert 1 hintereinander folgen kann, so dass die Pit/Land-Information nicht direkt der digitalen Information entsprechen kann. Aus diesem Grunde ist eine Bitumsetzung nötig, die als Eight to Fourteen Modulation (EFM) bezeichnet wird. Die 8-Bit-Daten werden in 14-Bit-Daten (Channel Bits) umgesetzt. Wie man sich dies vorstellen kann, ist in Tabelle 28.1 an fünf Beispielen gezeigt. Wert
8-Bit-Darstellung
14-Bit-Darstellung
0 1 2 3 4
00000000 00000001 00000010 00000011 00000100
01001000100000 10000100000000 10010000100000 10001000100000 01000100000000
Tab. 28.1: Da das einer CD zugrunde liegende Aufzeichnungsformat keine hintereinander folgenden Einsen realisieren kann, wird eine 8-zu-14-Bit-Umsetzung verwendet.
Im Gegensatz zu Disketten und Festplatten ist die Information nicht in konzentrischen Kreisen, den Spuren, sondern in einer einzigen Spirale vom CD-Beginn bis zum CD-Ende angeordnet. Diese Spirale ist weiter in Datenportionen unterteilt, denen aber statt einer festen Anzahl von Datenbytes eine bestimmte (Spiel-)Zeitspanne zugeordnet ist. Die CD-ROM kann also ihre Abstammung vom CD-Spieler nicht verleugnen, schließlich wird Musik im Allgemeinen vom Anfang bis zum Ende als zusammenhängender Tonstrom abgegeben; eine Organisation in Spuren und Sektoren ist dadurch überflüssig. Bei der industriellen Herstellung einer CD-ROM wird zunächst eine Master-CD aus Kupfer oder einem anderen stabilen Material verwendet. Die »Scheibe« wird dann mit einem Fotolack beschichtet, und mit einem Laserstrahl wird die Information auf die Scheibe geschrieben, wodurch bestimmte Stellen belichtet werden. Die belichteten Stellen des Fotolacks werden entfernt, und die Platte wird anschließend geätzt, so dass an den belichteten Stellen Material des Trägers entfernt wird. Man erhält dadurch eine Scheibe, die bereits Vertiefungen an den richtigen Stellen aufweist. Anschließend wird ein Negativabdruck genommen, d.h., die Negativplatte weist die Information in Form von Höckern statt Vertiefungen auf. Nun kann durch Pressen wieder ein Positivabdruck hergestellt werden. Dazu legt man einfach eine Roh-CD auf die Negativplatte und presst beide unter hohem Druck zusammen, die Höcker der Negativplatte erzeugen »Dellen« in der CD – fertig ist eine CD für CD-ROM. Zum Schutz wird die Platte dann noch mit einer transparenten Schicht überzogen.
Sandini Bib 942
Kapitel 28
Im Prinzip sind aber nicht unbedingt Vertiefungen zur Datenkodierung notwendig – es genügen zwei unterschiedliche Reflexionsarten, egal auf welche Weise man diese erzielt. Das können z.B. zwei verschiedene Phasen – kristallin oder amorph – oder zwei verschiedene Magnetisierungen der Oberflächenschicht des Trägers sein. Ersteres findet Anwendung bei der CD-R (CDRecordable), Zweiteres bei den magnetooptischen Laufwerken – Näheres dazu in den folgenden Unterkapiteln.
28.1.1 ATAPI Es sind verschiedene Bauformen von CD-Laufwerken möglich. Die gebräuchlichsten lassen sich in einen 5,25-Zoll-Ausschnitt im PC-Gehäuse einbauen. Externe Geräte werden für den USB, den SCSI-Bus, den PCMCIA-Anschluss – der bei Notebooks zu finden ist – und für den Druckerport angeboten, für den allerdings meist ein spezielles Interface nötig ist, damit die Datenübertragungsrate hiermit nicht zu schlecht ausfällt. Interne CD-ROM-Laufwerke gibt es in vier gebräuchlichen Anschlussvarianten: SCSI, IDE, herstellerspezifisch und ATAPI. ATAPI (AT Attachment Packet Interface) ist der Befehlssatz für CD-ROM-Laufwerke am (E)IDE-Port und gilt als Ergänzung zu ATA (dem Befehlssatz für EIDE-Festplatten). ATAPI stellt keine hardwaretechnische Änderung gegenüber dem IDE-Anschluss (ATA) dar, sondern lediglich eine softwaretechnische. Beide Kommandogruppen besitzen aber Gemeinsamkeiten, wie Tabelle 28.2 zeigt. Kommando
Code
Typ
ATAPI soft reset Check Power Mode Door Lock Door Unlock Execute Drive Diagnostic Format Track Idle Mode-Auto Power Down Idle Mode NOP Packet Command Packet Identify Device Recalibrate Seek Set Feature Sleep Mode Standby Mode-Auto Power Down Standby Mode
08h E5h DEh DFh 90h 50h E3h E1h 00h A0h A1h 1xh 7xh EFh E6h E2h E0h
Spezielles ATAPI-Kommando Herkömmliches ATA/IDE-Kommando Herkömmliches ATA/IDE-Kommando (optional) Herkömmliches ATA/IDE-Kommando (optional) Herkömmliches ATA/IDE-Kommando Herkömmliches ATA/IDE-Kommando (optional) Herkömmliches ATA/IDE-Kommando Herkömmliches ATA/IDE-Kommando Herkömmliches ATA/IDE-Kommando (optional) Spezielles ATAPI-Kommando Spezielles ATAPI-Kommando Herkömmliches ATA/IDE-Kommando (optional) Herkömmliches ATA/IDE-Kommando (optional) Herkömmliches ATA/IDE-Kommando Herkömmliches ATA/IDE-Kommando Herkömmliches ATA/IDE-Kommando (optional) Herkömmliches ATA/IDE-Kommando
Tab. 28.2: Der ATA/ATAPI-Befehlssatz
Der wichtigste Befehl ist in diesem Zusammenhang Packet Command, denn in den meisten Fällen werden die Daten für ATAPI-Geräte als Pakete mit Hilfe dieses Kommandos übertragen, und es werden nicht die eigentlichen »neuen« ATAPI-Befehle verwendet. Die Ähnlichkeit zu SCSI ist dabei nicht zu übersehen, auch wenn es hier keine Busphasen gibt und alle Packet-Commands 12 Byte lang sind. Die Datenübertragung erfolgt dabei standardmäßig in einem PIO-Mode. Die ATAPI-Befehle werden quasi in einem Packet Command gekapselt und von der Seite des Betriebssystems her wie SCSI-Kommandos behandelt. Dies ist auch der Grund dafür, warum Sie unter Umständen bei Ihrer Windows-Version auf einen ASPI-Treiber stoßen, obwohl sich definitiv keine SCSI-, sondern ausschließlich IDE-Einheiten im PC befinden. Entsprechendes gilt im Übri-
Sandini Bib Optische Laufwerke
943
gen auch für ein ZIP-Laufwerk am Parallel-Port oder einen IDE-RAID-Controller, deren Interfaces sich als SCSI-Adapter unter Windows darstellen und dementsprechend (unbemerkt) mit ASPI arbeiten. Die in Tabelle 28.2 und Tabelle 28.3 unter Typ angegebenen Eigenschaften stellen aus heutiger Sicht den kleinsten gemeinsamen Nenner dar, denn mit dem Standard ATA-4 werden die ATAPI-Befehle nicht mehr separat geführt. Sie sind stattdessen Bestandteil von ATA-4. Befehl
Code
Typ
Audio Scan Inquiry Mode Select Mode Sense Pause/Resume Play Audio Play Audio MSF Play Audio Track/Index Play Track Relative Play CD-ROM XA Send CD-ROM XA ADPCM Data Prevent/Allow Medium Removal Read Read CD-ROM Capacity Read CD-ROM Read CD-ROM MFS Read Header Read Sub-Channel Read TOC Request Sense Rezero Unit Seek Set CD-ROM Speed Stop Play/Scan Start/Stop Unit Test Unit Ready
D8h 12h 55h 5Ah 4Bh 45h, A5h 47h 48h 49h, A9h AEh 4Fh 1Eh 28h 25h D4h D5h 44h 42h 43h 03h 01h 2Bh DAh 4Eh 1Bh 00h
optional zwingend zwingend zwingend optional optional optional optional optional optional optional zwingend zwingend zwingend zwingend zwingend zwingend zwingend zwingend zwingend optional zwingend optional optional zwingend zwingend
Tab. 28.3: ATAPI-Kommandos (Packet Commands)
Daneben gibt es allerdings auch CD-ROM-Laufwerke (meist ältere), die als IDE-CD-ROM-Laufwerke spezifiziert sind. Zum Betrieb wird hier immer ein herstellerspezifischer Treiber benötigt, was ebenfalls für CD-ROM-Laufwerke gilt, die an einer eigenen speziellen Controllerkarte betrieben werden müssen. Insbesondere die Firmen Mitsumi, Sony und Panasonic haben in der Vergangenheit einige derartige Lösungen im Programm gehabt, die nicht zu IDE und auch nicht untereinander kompatibel sind. Auf einigen Soundkarten finden sich ebenfalls Anschlüsse für diese drei verschiedenen CD-ROM-Laufwerksinterfaces, die im Grunde genommen nur ein leicht abgewandeltes IDE-Interface darstellen. Ein richtiges IDE-Interface für den Anschluss eines CD-ROM-Laufwerks ist auch noch auf einigen älteren Soundkarten zu finden, wobei sich dieses leider nicht immer abschalten lässt und Windows 9x immer wieder veranlasst, einen Treiber anzufordern. Nach Möglichkeit sollte von der Verwendung dieser herstellerspezifischen Schnittstellen und auch der IDE-Laufwerksschnittstellen auf Soundkarten kein Gebrauch gemacht werden, denn sie funktionieren nicht mit jedem als geeignet erscheinenden CD-ROM-Laufwerk, und aktuelle Treiber gibt es hierfür meist auch nicht.
Sandini Bib 944
Kapitel 28
28.2 CD-R und CD-R/W CD-Brenner sind wahre »Renner« auf dem Markt, da Sie mit der geeigneten (Brenner-) Software Ihre eigenen Daten- und Audio-CDs erstellen können. Der Aufbau eines »Rohlings« (CD-R, Compact Disc Recordable) ähnelt dem einer industriell gefertigten CD-ROM, denn beide bestehen aus Polykarbonat und besitzen eine Schutzschicht. Allerdings sind bei der CD-R noch keine Pits und Lands eingepresst, denn die Dateninformation soll bei einer CD-R ja erst noch geschrieben werden, was durch einen Schreiblaser erfolgt, der mit einer wesentlich höheren Energie als solch 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 (CLV, siehe Kapitel 28.1) beeinflussen kann, die abhängig von der Position des Lese- oder Schreiblasers auf der CD 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. Zur Reflexion befinden sich über der Farbschicht eine dünne Goldschicht und darüber der Schutzlack. Eine CD-R ist aufgrund der Farbschicht empfindlicher als eine gepresste CD, so dass man mit diesen CDs besonders vorsichtig umgehen sollte 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 haben soll, allerdings sollte man nichts herausfordern. Zumindest sind die CD-R empfindlicher gegen Kratzer als die industriell gefertigten CDs.
28.2.1 CD-RW und die Phase-Change-Technologie Alle neueren CD-Writer können sowohl die »normalen« Rohlinge, die als CD-Rs (Compact Disc Recordables) bezeichnet werden, verwenden, als auch die etwas teureren CD-RWs. Diese Abkürzung steht für Compact Disc Read and Writeable oder CD ReWritable. Diese Medien sind wiederbeschreibbar, und laut Herstellerangaben soll dies bis zu 100.000-mal möglich sein, wobei die Daten auf diesem Medium genauso sicher sein sollen wie auf den anderen CD-Medien auch. CD-ROM-Laufwerke eines Baujahrs vor Mitte 1997 können meist keine CD-RWs lesen, denn dazu müssen sie über die Multiread-Funktion verfügen. Da diese Funktion aber leicht durch die Veränderung der Empfindlichkeit der Photodiode zu erreichen ist, was laut Herstellerangaben lediglich eine Änderung in der Firmware und noch nicht einmal in der Elektronik bedeutet, sind alle aktuellen CD-ROM-Laufwerke auch in der Lage, CD-RWs zu lesen. Eine CD-RW arbeitet nach der Phase-Change-Technologie, die auch bei den so genannten PhaseChange-Laufwerken zum Einsatz kommt, wobei es allerdings nicht sonderlich viele Hersteller gibt, die PD-Laufwerke anbieten. Die Phasenwechseltechnologie ist bereits seit den sechziger Jahren bekannt und funktioniert auf rein optischer Basis. Der Träger des Mediums besteht aus Polykarbonat, es gibt eine Reflexionsschicht aus Aluminium und darüber eine Schutzschicht wie bei einer CD-ROM. Das »Geheimnis« der Wiederbeschreibbarkeit sind die zwischen dem Polykarbonat und dem Aluminium liegenden Schichten. Die Struktur der Aufzeichnungsschicht wird beim Schreiben mit einem Laser, der zwei verschiedene Intensitätsstufen kennt, verändert. Das Material der Aufzeichnungsschicht besteht aus einem Gemisch verschiedener Komponenten wie beispielsweise Tellur, Selen und Germanium,
Sandini Bib Optische Laufwerke
945
wobei wichtig ist, dass es durch Erhitzung zwischen einem kristallinen (stabile, regelmäßige Struktur) und einem amorphen (metastabil, unregelmäßige Struktur) Zustand wechseln kann. Der Schreiblaser erhitzt die Aufzeichnungsschicht punktuell mit zwei unterschiedlichen Temperaturen, wobei die daraufhin stattfindende Abkühlung, in Abhängigkeit von der jeweils angelegten Temperatur, kristalline und amorphe (höhere Temperatur) Bereiche entstehen lässt. Die kristallinen Bereiche sind danach aufgrund der dahinter liegenden Aluminiumschicht stark und die amorphen weniger stark reflektierend. Beim Lesevorgang – der Abtastung mit einem Laser –, der prinzipiell genauso funktioniert wie bei der CD-ROM oder CR-R (Detektierung der Pits und Lands), wird durch die Auswertung mit einer Photodiode wieder die digitale 1-0-Information gewonnen. Allerdings ist der Informationsgehalt der kristallinen und amorphen Bereiche nicht so stark ausgeprägt wie bei den CD-ROMs oder auch CD-Rs, und daher muss die Leseoptik demgegenüber empfindlicher ausgelegt sein. Die Wiederbeschreibbarkeit ergibt sich einfach dadurch, dass die Wandlung vom amorphen in den kristallinen Zustand wieder umkehrbar ist. Dies wird dadurch erreicht, dass die amorphen Bereiche auf die niedrigere Temperatur erhitzt werden, wodurch erneut die Umwandlung in eine kristalline Struktur stattfindet. Es wird kein extra Löschvorgang oder ein anderer Mechanismus benötigt, das Medium kann einfach überschrieben werden. Wesentlich für die Wiederbeschreibbarkeit und den sicheren Datenerhalt sind nicht nur die Materialeigenschaften der Aufzeichnungsschicht, sondern auch die beiden Schutzschichten, die dafür verantwortlich sind, wie schnell die Abkühlung erfolgt, und die sich außerdem auch als optisch verstärkend beim Lesevorgang bemerkbar machen. So verwundert es nicht, dass die Hersteller eine relativ lange Zeit mit verschiedenen Schichtmaterialien experimentieren mussten, um das Phase-Change-Verfahren einerseits sicher und andererseits auch nicht zu teuer werden zu lassen.
28.3 Magnetooptische Laufwerke Magnetooptische Laufwerke (MO) benutzen den Einfluss eines Magnetfeldes auf die Polarisation einer elektromagnetischen Welle. Licht und infrarote Strahlen sind wie Radio- oder Radarwellen eine Form elektromagnetischer Strahlung. Gewöhnliches Licht ist unpolarisiert, das elektrische und das magnetische Feld der Welle kann dadurch jede beliebige Richtung senkrecht zur Strahlrichtung annehmen. Bei polarisiertem – oder genauer gesagt: linear polarisiertem Licht – zeigt das elektrische Feld der Welle dagegen stets nur in eine Richtung senkrecht zur Ausbreitung (siehe Abbildung 28.2). In gleicher Weise zeigt auch das magnetische Feld der Welle stets nur in eine Richtung, die Polarisationsrichtung, die senkrecht zur Richtung des elektrischen Feldes ist. Das Licht eines Lasers z.B. ist stets in eine Richtung polarisiert. Ein Polarisationsfilter lässt nur eine polarisierte Welle mit bestimmter Polarisationsrichtung durch, senkrecht dazu polarisiertes Licht dagegen nicht. Polarisationsfilter können also zur Bestimmung der Polarisationsrichtung benutzt werden: Erfasst der Detektor hinter dem Polarisationsfilter noch Licht, so ist es entsprechend der Richtung des Filters polarisiert; lässt der Polarisationsfilter kein Licht durch, so ist es senkrecht zur Richtung des Filters polarisiert. Beim Durchgang durch einen Körper, der sich in einem magnetischen Feld befindet, beeinflusst das äußere Magnetfeld das elektromagnetische Feld der Welle und dreht das elektrische und magnetische Feld der Welle, also die Polarisationsrichtung des Lichts. Man bezeichnet diese Erscheinung als Faraday-Effekt. Dasselbe gilt auch bei einer Reflexion an der Oberfläche einer magnetisierten Substanz. Das von der Substanz durch ihre Magnetisierung erzeugte Magnetfeld dreht
Sandini Bib 946
Kapitel 28
auch hier die Polarisationsrichtung der reflektierten Welle gegenüber dem eingestrahlten Licht. Die Richtung der Polarisationsdrehung hängt dabei von der Magnetisierungsrichtung der Substanz ab. Polarisationsfilter
Polarisationsfilter
E B
stion risa g Polaichtun r
Polarisationsrichtung
elektromagnetische Welle
Abb. 28.2: Polarisation und Polarisationsfilter: Eine elektromagnetische Welle, wie z.B. Licht, besteht aus einem sich periodisch ändernden elektrischen Feld E und einem sich periodisch ändernden magnetischen Feld B. Die Richtung von B wird als Polarisationsrichtung bezeichnet. Polarisationsfilter lassen nur Wellen durch, deren Polarisation mit der Polarisationsrichtung des Filters übereinstimmt.
Magnetooptische Laufwerke nutzen den Farady-Effekt aus, um Daten zu speichern. Das geschieht folgendermaßen: Eine magnetooptische Platte besitzt zunächst eine einheitlich magnetisierte Beschichtung aus einer ferromagnetischen Lanthanoidlegierung. Wenn der polarisierte Laserstrahl auf die Oberfläche trifft, wird die Polarisationsrichtung des reflektierten Strahls entsprechend der Magnetisierung der Oberfläche gedreht. Ein Polarisationsfilter dient als Analysator für die Polarisationsrichtung des zurückreflektierten Strahls, und der Sensor hinter dem Filter erfasst die vom Polarisationsfilter durchgelassene Intensität (siehe Abbildung 28.3). Wenn ein Bit auf die Platte geschrieben werden soll, so erwärmt ein kurzer, aber kräftiger Schreibimpuls vom Laser die Oberfläche an der entsprechenden Stelle über den Curie-Punkt TC wodurch die Magnetisierung der ferromagnetischen Plattenbeschichtung vollständig verschwindet. Gleichzeitig erzeugt ein Elektromagnet ein Magnetfeld, dessen Richtung vom Wert des einzuschreibenden Bits abhängt; für eine »1« ist das Magnetfeld entgegengesetzt wie für eine »0«. Die Richtung dieses Magnetfelds legt nun die Richtung, in der sich die Elementarmagnete der erhitzten Stelle beim Abkühlen unter den Curie-Punkt ausrichten, und dadurch den Wert des geschriebenen Bits fest. Die Beschichtung »friert« die Magnetfeldrichtung zum Zeitpunkt des Schreibens quasi ein, das Schreiben eines Bits ist damit abgeschlossen. Beim Lesen des Bits tastet der Laserstrahl die Oberfläche der Platte ab, und das Polarisationssystem erfasst die Drehrichtung des reflektierten Strahls. Trifft der Laserstrahl auf das oben geschriebene Bit, so ist die Drehrichtung des reflektierten Strahls von der Magnetisierungsrichtung der Oberflächenschicht abhängig: Zum Beispiel wird die Polarisationsrichtung für eine »0« nach links und für eine »1« nach rechts gedreht. Im ersten Fall lässt der Polarisationsfilter z.B. kein Licht durch, und der Sensor erfasst ein Bit mit dem Wert »0«. Im zweiten Fall erreicht den Sensor dagegen die volle Intensität des reflektierten Strahls, und der Sensor ermittelt ein Bit mit dem Wert »1«. Die Information wird also auch hier in Form von Magnetisierungen abgelegt, nur erfolgt die Lokalisierung eines Bits auf der Platte im Gegensatz zu Festplatten durch einen Laserstrahl, also optisch.
Sandini Bib Optische Laufwerke
947
Sensor
Polarisationsfilter
Polarisation Bitwert "0"
Polarisation Bitwert "1"
S Polarisation vom Laser
Magnetfeld
Schreibstrahl
reflektierter Strahl Strahlteiler
magnetooptische Platte
Spiegel
Abtaststrahl
magnetooptische Platte
N Schreiben
Lesen
Abb. 28.3: Magnetooptische Platte: Beim Schreiben erhitzt ein kräftiger Schreibstrahl die Oberfläche der Platte. Unter dem Einfluss eines externen Magnetfelds kühlt sich dieser Spot ab, und die Platte wird an dieser Stelle entsprechend dem externen Magnetfeld magnetisiert. Beim Lesen tastet ein Abtaststrahl bei abgeschaltetem Magnetfeld die Platte ab, und ein Sensor ermittelt über einen Polarisationsfilter die Ausrichtung der Magnetisierungen auf der Platte.
Durch eine erneute Erwärmung der betreffenden Stelle und eine entsprechende Richtung des Magnetfeldes vom Elektromagneten kann das geschriebene Bit problemlos wieder gelöscht werden. Dadurch ist eine mehrfache Beschreibbarkeit möglich. Die Speicherkapazität von MO-Laufwerken beträgt typischerweise von 230 MByte bis zu 2,6 GByte, je nach Modell, wobei die Speichermedien hier nicht immer kompatibel sind. Üblich sind Medien im 5,25- und 3,5-Zoll-Format, und für den Datenerhalt werden typischerweise mindestens 30 Jahre angegeben. MO-Laufwerke sind in der Praxis die stör-unempfindlichsten überhaupt, denn um die Daten auf einem Medium zu beschädigen, bedarf es gleichzeitig einer hohen Temperatur und eines Magnetfelds. Für MO-Laufwerke kommt überwiegend der SCSI-Bus zum Einsatz und neuerdings auch Firewire.
28.4 Digital Versatile Disc Ursprünglich als Digital Video Disc angetreten, wird die DVD als Digital Versatile Disc bezeichnet und als nahezu universelles Speichermedium propagiert. Die DVD-ROM-Laufwerke sollen die heute üblichen CD-ROM-Laufwerke ablösen, und sie sind gerade auf dem besten Weg dazu. Die DVD-Materie stellt sich als etwas unübersichtlich dar, insbesondere weil die Hersteller bei den wiederbeschreibbaren DVDs (DVD-RW, DVD+RW, DVD-RAM) unterschiedliche Wege beschreiten und nicht immer zweifelsfrei ersichtlich ist, wie es mit der Kompatibilität untereinander und zu den herkömmlichen CD-Medien (ROM, R, R/W) bestellt ist. Eine »DVD-Scheibe« hat zwar die gleichen Maße wie eine CD-ROM (12 cm Durchmesser), kann demgegenüber jedoch mindestens 4,7 GByte enthalten und fasst somit die siebenfache Daten-
Sandini Bib 948
Kapitel 28
menge wie eine CD-ROM. Zur Erreichung dieser Kapazitäten sind gegenüber der CD-ROM einige grundlegende Änderungen nötig gewesen:
: : : :
Die Pits und Lands sowie die Abstände sind verkleinert worden. Der Laser arbeitet hier zur feineren Fokussierung im roten Bereich (635, 650 nm) statt im infraroten (780 nm) wie bei der CD-ROM. Die Adressierungs- und Fehlerkorrekturmechanismen wurden geändert. Verwendung von maximal zwei Informationsschichten auf einer Seite, und es gibt auch zweiseitige DVDs, was zu einer maximalen Kapazität von 17 GByte führt (zweiseitig und zweilagig).
Wegen dieser Veränderungen ist eine DVD nicht kompatibel zu einer CD-ROM, und es werden neue Laufwerke benötigt, die natürlich auch die üblichen CD-Medien lesen können sollen. Die gegenüber einer CD-ROM erhöhte Datendichte hat zwangsläufig zur Folge, dass Verschmutzungen (Fingerabdrücke) oder leichte Beschädigungen (Kratzer) sich hier stärker bemerkbar machen können, was erhöhte Anforderungen an die interne Fehlerkorrektur der DVD-Laufwerke stellt. Den Aufbau einer DVD kann man sich vereinfacht genauso vorstellen wie den einer CD-ROM. Ein besonderes Feature einer DVD ist allerdings, dass sie aus zwei Informationsschichten (Dual Layer) aufgebaut sein kann, die aus unterschiedlichen Materialien bestehen.
Abb. 28.4: Die Abmessungen und Abstände der Pits bei CD-ROM und DVD in Mikrometer
Die Pit/Land-Struktur wird zunächst auf eine Disc gepresst, die dann mit einer semireflektierenden Schicht (Gold) überzogen wird. Danach folgen eine Kunststoffschicht, in die die zweite Informationsschicht eingepresst wird, und darüber eine Reflexionsschicht aus Aluminium. Besonders schwierig erscheint dabei die Realisierung der semireflektierenden Schicht (halb durchlässig), denn deren Stärke muss exakt so bemessen sein, dass die Leseoptik das zurückkommende Licht beider Informationsschichten registrieren und auch unterscheiden kann. Der Laser arbeitet daher beim Auslesen der DVD auch mit unterschiedlichen Intensitäten. Eine Dual Layer DVD weist nicht genau die doppelte Speicherkapazität einer »einfachen« DVD (4,7 GByte) auf, da die Pits und Lands zur leichteren Detektierung auf der zweiten Informationsschicht etwas größer ausgeführt sind. Dies gilt auch für zweiseitige DVDs (Big Mac), die maximal 17 GByte an Daten enthalten können.
Sandini Bib Optische Laufwerke
949
Generell werden die folgenden vier DVD-Varianten unterschieden:
: : : :
DVD-5: Einseitig und einschichtig mit einer maximalen Kapazität von 4,7 GByte DVD-9: Einseitig und zweischichtig mit einer maximalen Kapazität von 9,4 GByte DVD-10: Zweiseitig und einschichtig mit einer maximalen Kapazität von 8,5 GByte DVD-18: Zweiseitig und zweischichtig mit einer maximalen Kapazität von 17 GByte
Abb. 28.5: Die verschiedenen DVD-Typen
28.4.1 Realisierungen Ein DVD-Laufwerk kann – muss aber nicht zwangsläufig – mit zwei Lasern unterschiedlicher Wellenlänge ausgestattet sein, um somit die Rückwärtskompatibilität zur CD-ROM und CD-RW herstellen zu können. Ein derartiges DVD-Laufwerk sollte daher auch die bisher üblichen standardisierten CD-Formate lesen können. Allgemein kann man davon nur bei den aktuellen DVDLaufwerken ausgehen. Gleichwohl gibt es auch hier die von CD-ROM-Laufwerken her bekannten Unverträglichkeiten – eine CD ist lesbar, eine andere hingegen nicht – , bei DVD-Laufwerken treten sie jedoch im verstärkten Ausmaß aus, was oftmals an einer eher mangelhaften Fehlerkorrektur liegt. DVD-ROM-Laufwerke der zweiten Generation sind mit 2x gekennzeichnet, was einer ungefähren Datenübertragungsrate von 2700 KByte/s entspricht und somit 20x-24x im CD-Modus gleichkommt. Die dritte DVD-ROM-Laufwerksgeneration wird als 6x spezifiziert, und mittlerweile sind hier sogar 16x Standard, was dann von der Leserate her ungefähr mit einem 40-48xCD-ROM-Laufwerk vergleichbar ist. Für (wieder-)beschreibbare DVDs gibt es unterschiedliche Realisierungen, und die Hersteller haben sich auch hier immer noch nicht endgültig auf einen gemeinsamen Standard geeinigt. Gemeinsam ist den verschiedenen Varianten allerdings, dass sie alle auf dem Phase-Change-Verfahren wie bei der CD-RW beruhen.
Sandini Bib 950
Kapitel 28
Die einmal beschreibbare DVD – DVD-Recordable – hat eine Kapazität von 3,95 GByte und stellt im Grunde genommen die erste verfügbare, vom Anwender beschreibbare DVD-Version dar. Über die gleiche Speicherkapazität sollte zunächst auch die Weiterentwicklung – die DVD-RW (ReWriteable) – verfügen, die sich jedoch nicht durchgesetzt hat, da eine übliche DVD-ROM nun einmal für mindestens 4,7 GByte (DVD-5, s.o.) ausgelegt ist. Insbesondere die Firma Pioneer hat schon seit einiger Zeit DVD-R(W)-Writer in ihrem Programm, die in Japan den höchsten Marktanteil haben, während insbesondere in Europa ein anderes System favorisiert wird, und zwar DVD+R oder auch DVD+RW, wie sich die wiederbeschreibbare Variante nennt. Dieses System ist eine Entwicklung von Philips und Sony, gemäß einer eigenen Spezifikation, die von vornherein eine Kapazität von 4,7 GByte vorsieht. Dabei ist das »+« in der Bezeichnung zur Abgrenzung gegenüber dem Konkurrenzprodukt mit »-« wichtig. Vom technischen Standpunkt aus betrachtet, ist der Unterschied zwischen einer Minus- und einer Plus-DVD äußerst gering, denn schließlich sollen ja beide nach dem Schreibvorgang in üblichen DVD-Laufwerken lesbar sein. Lediglich das verwendete Schichtmaterial ist unterschiedlich sowie das Format für die Schreibsynchronisierung von Medium und Laufwerk. Im Grunde genommen sprechen technische Gründe weder gegen das eine noch gegen das andere Verfahren, die aktuell mit vierfacher Brenngeschwindigkeit arbeiten. Das dritte wiederbeschreibbare DVD-System ist DVD-RAM der Hersteller Hitachi, Panasonic und Toshiba. Die DVD-RAM-Discs befinden sich in einer Schutzhülle – ähnlich einem Caddy, wie er bei älteren CD-ROM-Laufwerken eingesetzt wird –, und wenn man sie in einem üblichen DVD-ROM-Laufwerk lesen möchte, müsste man sie aus der Hülle entfernen können, was nur mit einigen einseitigen Medien und generell nicht bei zweiseitigen Medien möglich ist. Diese bieten üblicherweise 2,6 GByte pro Seite, was bedeutet, dass man hiermit keine 1:1-Kopie einer DVD-ROM anfertigen kann. Bei der DVD-ROM wird das Universal Disc Format (UDF) eingesetzt, das mit der CD-RW eingeführt worden und ebenfalls bei der DVD-RAM zu verwenden ist. Da die DVD-RAM als Wechselplattensystem anzusehen ist, können hier auch die üblichen Formate wie FAT16, FAT32 oder NTFS zum Einsatz kommen. DVD-RAM hat seine Bestimmung in erster Linie als Backup-Lösung gefunden und spielt beim Rennen um die universell zu beschreibende DVD eigentlich keine Rolle mehr. DVD-RAM verwendet ein zur DVD-ROM inkompatibles Format und lässt sich schon dadurch nicht auf den üblichen DVD-Playern abspielen. Entsprechende Kombi-Laufwerke, die sowohl mit üblichen DVDs als auch mit DVD-RAM umgehen können, werden nur von relativ wenigen Herstellern wie Panasonic als treibende Kraft dieser DVD-Variante sowie Toshiba und LG Electronics angeboten. Der Vorteil von DVD-RAM ist die hohe Wiederbeschreibbarkeit von mindestens 100.000mal gegenüber ca. 1.000 Schreibzyklen bei den beiden anderen Formaten, so dass sich DVDRAM eigentlich auch als ideale Lösung für digital aufzeichnende Videorekorder empfiehlt. Während DVD-RW (Minus) und DVD-RAM vom DVD-Forum als standardisierte wiederbeschreibbare Formate abgesegnet worden sind, gehen Firmen wie Hewlett-Packard, Ricoh und Philips mit DVD+RW einen eigenen Weg, dem sich laufend weitere Firmen anschließen. Mittlerweile gibt es aber DVD-Writer – beispielsweise von Sony, NEC und Philips –, die sowohl das DVD-Minus- als auch das DVD-Plus-Format schreiben können, und einige wenige Modelle (z.B. von LG) beherrschen außerdem auch noch das Schreiben von DVD-RAM. Demnach kann man vermuten, dass es zunächst bei dieser Vielfalt an wiederbeschreibbaren DVD-Lösungen bleiben wird. Die DVD-Brenner können natürlich auch die üblichen CD-R(W)s schreiben.
Sandini Bib Optische Laufwerke
951
Abb. 28.6: Einer der wenigen DVD-Brenner, der sowohl DVD+RW und DVD-RW sowie auch DVD-RAM schreiben kann, stammt von der Firma LG.
Ein Problem haben aber sowohl DVD-Plus als auch DVD-Minus: Es hapert noch mit der Kompatibilität zu den üblichen DVD-Laufwerken und auch den -Playern der Stereoanlage. Ähnliches war zwar schon bei den ersten CD-RW-Brennern aufgetreten und hat sich dann im Laufe der Zeit gebessert, gleichwohl sind die Fälle, in denen sich eine »gebrannte« DVD in einem üblichen DVD-Laufwerk nicht lesen lässt, weitaus häufiger, so dass die Hersteller der DVD-Brenner im Internet sogar Listen darüber führen, welche Laufwerke die selbst erstellten DVDs dann lesen können (sollen). Firmware-Updates bei den DVD-Laufwerken und -Brennern können möglicherweise derartige Leseprobleme beheben. Interessanterweise liegt die eigentliche Ursache vielfach aber nicht an den Brennern selbst, sondern an der Brennsoftware. Daher ist diesem Punkt eine ganz besondere Aufmerksamkeit zu schenken, denn wie es auch bei den CD-Writern der Fall ist, zeichnet die Brennsoftware und nicht das Betriebssystem für die Schreibfunktionalität verantwortlich. Ohne die hierfür passende Software treten DVD-Brenner lediglich als übliche DVD- oder CD-ROMLaufwerke unter Windows in Erscheinung. Die Brenner sind ganz allgemein genauso zu konfigurieren (Master oder Slave) und anzuschließen wie alle anderen IDE-Laufwerke auch, denn in den meisten Fällen sind die Writer eben für diese Schnittstelle ausgelegt.
Sandini Bib
Sandini Bib
Teil 6: Schnittstellen, LANs und Programmierung In diesem Teil erfahren Sie etwas über Schnittstellen und was man mit ihnen anfangen kann. Allgemein bezeichnet der Ausdruck Schnittstelle eine Hardware- oder auch Software-Einheit, die eine Verbindung zwischen zwei meist unterschiedlichen Einheiten herstellt. Klassische Schnittstellen in einem PC sind der Parallel-Port sowie die RS232-Schnittstelle, die in zunehmendem Maße vom USB und Firewire verdrängt werden. Aus diesem Grunde werden diese beiden Systeme hier ebenfalls erläutert, obwohl es sich dabei eigentlich nicht um einfache Schnittstellen, sondern vielmehr um leistungsfähige Bussysteme handelt. Eine Sonderstellung nimmt die PCMCIA-Schnittstelle bzw. der Nachfolger, der Card-Bus ein, denn diese »Schnittstellen« werden hauptsächlich in Notebooks verwendet. Für die Verbindung von Notebooks und üblichen PCs spielen die lokalen Netzwerke eine bedeutende Rolle, die daher ebenfalls Gegenstand der weiteren Kapitel sind.
29
Die parallele Schnittstelle
Fast jeder PC wird mit einer parallelen und einer seriellen Schnittstelle ausgeliefert. BIOS und DOS können in einem PC üblicherweise bis zu vier parallele Schnittstellen bedienen, die als LPT1, LPT2, LPT3 und LPT4 (für Line Printer, also Zeilendrucker) bezeichnet werden. Das Kürzel PRN (für Printer) ist synonym – ein Alias – für LPT1, ein Befehl mit dem Ziel PRN ist äquivalent mit einem Befehl mit dem Ziel LPT1. Die Schnittstellenbezeichnung verweist bereits auf die primäre Aufgabe der parallelen Schnittstelle, nämlich einen Drucker anzusprechen. Die Verbindung zwischen der Schnittstelle und dem Paralleldrucker wird durch ein so genanntes Centronics-Kabel hergestellt. Centronics hatte es in den siebziger Jahren als erster Druckerhersteller geschafft, einen definierten Schnittstellenstandard für Drucker zu etablieren. Normalerweise besitzt ein Centronics-Kabel 36 Adern und damit ebenso viele Stifte oder Kontakte. 18 Adern dienen als Masseleitungen und sind jeweils mit dem entsprechenden Signaldraht verdrillt, um ein Minimum an Abschirmung und einen einfachen Schutz vor einem Signalübersprechen zu schaffen. Das gilt für den druckerseitigen Kabelstecker auch nach wie vor, er weist eine zweiseitige Kontaktleiste mit insgesamt 36 Kontakten auf. In Abbildung 29.1 sehen Sie den druckerseitigen und den PC-seitigen Stecker. Für die Übergabe von Daten und Steuersignalen an den Drucker werden also nur die Hälfte, nämlich 18 Kontakte benötigt. Das hat IBM dazu bewogen, PC-seitig statt der 36 Kontakte nur 25 vorzusehen. Die restlichen benötigten Masseleitungen können ja innerhalb des Kabels durch Splitten einer Masseleitung leicht erzeugt werden, nur benötigt man weniger Kontakte und die Stecker werden einfacher (und natürlich preiswerter). Der Anschluss eines Druckers ist dabei ganz einfach: Sie müssen nur die entsprechenden Stecker an den Kabelenden mit den Buchsen von Drucker und PC verbinden. Eine Verwechslung ist durch
Sandini Bib 954
Kapitel 29
die unterschiedliche Form ausgeschlossen. Achten Sie auch darauf, dass die Länge des Kabels 5 m nicht überschreitet, da sonst Datenübertragungsfehler auftreten und das Kabel manchmal Daten verschluckt. Die Spezifikation der parallelen Schnittstelle und die Ausgestaltung des Centronics-Kabels lässt im Gegensatz zur seriellen Schnittstelle und der seriellen Datenübertragung keine größeren Entfernungen zu. Wenn Sie partout einen Drucker im Keller betreiben wollen, der 20 m von Ihrem Arbeitsplatz entfernt ist, bleibt Ihnen nur der Gang über die serielle Schnittstelle. Dort sind Entfernungen bis zu 200 m möglich. Die Übertragungsgeschwindigkeit bei serieller Datenübertragung ist allerdings mindestens neunmal langsamer.
1
19
18
1
36
14
Drucker
13
25
PC
Abb. 29.1: Centronics-Stecker
29.1 Aufbau und Funktionsweise Die parallele Schnittstelle besitzt prinzipiell einen einfachen Aufbau, weil sie im PC normalerweise nur für die Datenübergabe an einen Drucker benutzt wird. In Abbildung 29.2 ist ein Blockdiagramm hierfür gezeigt. Bitte beachten Sie, dass alle modernen Parallel-Interfaces (IEEE-1284) auch bidirektional arbeiten können, wie es in Kapitel 29.3 näher erläutert ist. Die Anbindung an den PC-Systembus erfolgt wie üblich über eine PC-Schnittstelle, die nur einen 8-Bit-Datenbus aufweisen muss, weil Daten ja immer in Portionen zu je acht Bit an den Drucker übergeben werden, und die internen Register der Schnittstelle auch nur acht Bit breit sind. Der Adressdekoder dekodiert bei einem aktiven Signal IOR oder IOW die Adressbits A0 bis A9, um zu ermitteln, ob die Schnittstelle aktiviert werden soll und gegebenenfalls welches Register. Die Steuerung überwacht alle Ein- und Ausgabeoperationen der Register und somit der Schnittstelle. Zentraler Bestandteil der parallelen Schnittstelle ist das 8-Bit-Datenregister, das von der CPU beschrieben und gelesen werden kann, es ist also bidirektional. Die CPU übergibt dem Datenregister die Datenbytes für den Drucker. Wenn der Prozessor das Datenregister ausliest, erhält er den ODER-Wert des zuletzt eingeschriebenen Bytes und der Signale, die extern an die Pins 2 bis 9 der Schnittstelle angelegt werden. Normalerweise treibt ein Drucker die Leitungen 2 bis 9 nicht auf einen hohen Pegel, so dass ein IN-Befehl bezüglich des Datenregisters nur die zuletzt geschriebenen Werte liefert. Anders sieht das aus, wenn eine externe Einheit die betreffenden Leitungen auf einen hohen Pegel treibt. Ein hoher Pegel überschreibt dann ein Bit 0 im Datenregister, womit man also den ODER-Wert erhält. Wenn vor einem IN-Befehl das Datenregister mit einem 0-Byte überschrieben wird, liefert ein IN-Befehl stets die Signalpegel an den Pins 2 bis 9. Dadurch kann man z.B. einen Datenaustausch mit einer anderen parallelen Schnittstelle, d.h. einem anderen PC, realisieren (siehe unten). Wenn lediglich ein Drucker oder eine andere hier angeschlossene Einheit angesteuert werden soll, ist nur das Datenregister mit dem zu übergebenden Wert zu laden. Das Statusregister spiegelt den logischen Status des Druckers wider, der über verschiedene Leitungen (siehe Tabelle 29.1) Statuswerte an die Schnittstelle zurückliefert. Das Statusregister kann
Sandini Bib Die parallele Schnittstelle
955
von der CPU nur gelesen werden, es ist unidirektional. Über das Steuerregister kann sowohl das Verhalten der Schnittstelle als auch über mehrere Steuersignale der Drucker gesteuert werden. Das Steuerregister kann beschrieben und gelesen werden und dient insbesondere zur Steuerung der Datenübergabe an die Peripherie. Sie können die Schnittstelle so konfigurieren, dass die IRQLogik eine Hardware-Interrupt-Anforderung auslöst, sobald der Drucker beispielsweise bereit ist, ein neues Zeichen anzunehmen. Näheres zur Programmierung erfahren Sie in Kapitel 29.2. FEH IRQ5/7
IRQ-Logik
DSL
Steuerregister
INI ALF STB
1 14
Datenregister
D0...D7
PC-Schnittstelle
D0...D7
20
ACK
Statusregister
10
BSY PAP ONOF
25 13
A0...A9 IOR
Adressdekodersteuerung
IOW Masse
Abb. 29.2: Blockdiagramm der parallelen Schnittstelle
Die Verbindung zum Drucker wird über ein Centronics-Kabel hergestellt. In Tabelle 29.1 sind die Belegung und die Signale der Pins und Steckerkontakte angegeben. 25-Pin
36-Pin
Signal
Beschreibung
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
STR D0 D1 D2 D3 D4 D5 D6 D7 ACK
11
11
BSY
Ein niedriger Pegel überträgt Daten zum Drucker. Datenbit 0 Datenbit 1 Datenbit 2 Datenbit 3 Datenbit 4 Datenbit 5 Datenbit 6 Datenbit 7 Ein niedriger Pegel zeigt an, dass der Drucker ein Zeichen empfangen hat und weitere annehmen kann. Ein hoher Pegel zeigt an: Empfang eines Zeichens, Druckerpuffer voll, Druckerinitialisierung, Drucker offline, Druckerfehler.
Tab. 29.1: Belegung und Signale der 25- und 36-Pin-Stecker
Sandini Bib 956
Kapitel 29
25-Pin
36-Pin
Signal
Beschreibung
12 13 14
12 13 14
PAP OFON ALF
15
32
FEH
16 17 18–25 -----
31 36 19–30,33 16 17 18 34,35
INI DSL Masse 0V Gehäuse +5 V --
Ein hoher Pegel zeigt Papierende an. Ein hoher Pegel zeigt an, dass der Drucker online ist. Auto-Line-Feed; ein niedriger Pegel zeigt an, dass der Drucker einen automatischen Zeilenvorschub ausführt. Ein niedriger Pegel zeigt an: Papierende, Drucker offline, Druckerfehler. Ein niedriger Pegel initialisiert den Drucker. Ein niedriger Pegel wählt den Drucker aus. Masse 0 V -Gehäusemasse -unbenutzt
Tab. 29.1: Belegung und Signale der 25- und 36-Pin-Stecker (Forts.)
Bei den meisten Druckern wird das Signal DSL intern stets auf Masse festgeklemmt, d.h., der Drucker ist stets ausgewählt. Bei älteren Systemen konnte die CPU über dieses Signal den Drucker explizit aktivieren oder deaktivieren. Die acht Datenpins D0 bis D7 übertragen ein Datenbyte zum Drucker, sie können aber auch Daten empfangen, wenn die Eingangsschaltungen der Schnittstelle bidirektional ausgelegt sind. Über die Leitungen STR, ALF und INI wird der Drucker von der CPU und der Schnittstelle gesteuert. Ein Übergang des Signals STR (engl. Strobe, dt. Abtastung) vom hohen zum niedrigen Pegel weist den Drucker an, dass er das Datenbyte auf den Leitungen D0 bis D7 als zu übertragendes Datenbyte annehmen soll. Bei einem niedrigen Pegel des Anschlusses ALF führt der Drucker nach jeder Zeile einen automatischen Zeilenvorschub aus. Schließlich führt ein Übergang des Signals INI vom hohen zum niedrigen Pegel zu einer Initialisierung des angeschlossenen Druckers, wenn dieser das INI-Signal unterstützt. Die anderen Steuersignale werden im Allgemeinen vom Drucker an die Schnittstelle übergeben und signalisieren den aktuellen Zustand des Druckers. Wenn die CPU durch Aktivierung von STR einen Wert an den Drucker übergeben möchte, reagiert der Drucker mit der Aktivierung des Signals ACK, um den Empfang zu bestätigen. Er legt das Signal ACK auf einen niedrigen Pegel, um anzuzeigen, dass die Schnittstelle weitere Daten übergeben kann. Ein aktiviertes Signal BSY zeigt an, dass der Drucker gerade belegt ist und keine Zeichen empfangen kann. Bei erschöpftem Papiervorrat hebt der Drucker das Signal PAP auf einen hohen Pegel an. Wenn Sie den Drucker online schalten, aktiviert der Drucker das Signal OFON. Schließlich zeigt das Signal FEH bei niedrigem Pegel an, dass ein Fehler aufgetreten ist, z.B. hat sich der Druckkopf verklemmt. Zu beachten ist noch, dass nicht alle angegebenen Signale auch von allen Druckern unterstützt werden. Vor allem die Signale INI und DSL werden häufig nicht verwendet. Außerdem invertiert die parallele Schnittstelle intern manche Signale, die Bedeutung eines Signals und des zugehörigen Registerbits ist dann genau entgegengesetzt.
29.2 Direkte Programmierung Die traditionelle parallele Schnittstelle (unidirektional) weist drei Register auf, mit deren Hilfe Sie Daten übertragen und den Drucker oder auch andere Peripherie an der Schnittstelle steuern können. Die Basisadresse der Register ist für jede Schnittstelle LPT1 bis LPT4 im BIOS-Datenbereich abgelegt. Das Datenregister (vgl. Abbildung 29.3) befindet sich dann bei Offset 00h, das
Sandini Bib Die parallele Schnittstelle
957
Statusregister (vgl. Abbildung 29.4) bei Offset 01h und das Steuerregister (vgl. Abbildung 29.5) bei Offset 02h.
29.2.1 Druckeransteuerung Im Allgemeinen lautet die Basisadresse von LPT1 378h und von LPT2 278h. Das BIOS prüft beim Booten in der I/O-Adressreihenfolge 3bch, 378h, 278h und 2bch, ob bei den entsprechenden I/OAdressen eine parallele Schnittstelle physikalisch vorhanden ist, und ordnet den tatsächlich gefundenen Schnittstellen nacheinander die Bezeichnungen LPT1, LPT2 etc. zu. Manche BIOSVersionen unterstützen aber nur zwei parallele Schnittstellen und erkennen alle weiteren beim Booten nicht. 7
6
5
4
3
2
1
0
Druckersignal D7 D6 D5 D4 D3 D2 D1 D0 Pin-Nummer
D7–D0:
9
8
7
Datenbit
6
5
4
3
2
7
Abb. 29.3: Datenregister (Offset 00h)
7
6
5
4
3
2
1
0
BSY
ACK
PAP
OFON
FEH
Das Datenregister ist acht Bit breit und nimmt die zu übertragenden Datenbits auf. Es kann auf einfache Weise durch einen IN- oder OUT-Befehl gelesen bzw. beschrieben werden.
x
x
x
Pin-Nummer 11 10 12 13 15 -
-
-
Druckersignal
BSY: ACK: PAP:
belegt (busy) 1=Drucker nicht belegt
0=Drucker belegt, offline oder Fehler
Acknowledge 1=Daten werden gerade übertragen
0=Datenübergabe an Drucker beendet
Papier 1=kein Papier mehr
0=Papier vorhanden
OFON: offline oder online 1=Drucker online FEH: x:
Druckerfehler 1=alles o.k.
0=Drucker offline 0=Druckerfehler
nicht benutzt (üblicherweise gleich 1)
Abb. 29.4: Statusregister (Offset 01h)
Das Statusregister kann hingegen nur gelesen werden. Es übermittelt Steuerungsinformationen vom Drucker. Bei einem gelöschten Bit BSY ist der Drucker belegt. Das heißt, der Druckerpuffer ist voll, ein Zeichen wird gerade übergeben, oder der Drucker führt eine Initialisierung aus. Die Schnittstelle kann dann kein weiteres Zeichen übergeben und muss so lange warten, bis das BSYBit gesetzt ist. Das ACK-Bit ist zusammen mit dem STR-Bit des Steuerregisters (siehe Abbildung 29.5) für eine korrekte Datenübertragung von großer Bedeutung.
Sandini Bib 958
Kapitel 29
Wenn die Schnittstelle ein Datenbyte an den Drucker übergeben hat, aktiviert der Drucker die Leitung ACK, um den Empfang des Zeichens zu bestätigen. Entsprechend wird im Statusregister das ACK-Bit gelöscht. Ist ACK gesetzt, so zeigt das an, dass der Drucker entweder noch mit dem Empfang beschäftigt ist (wenn gleichzeitig BSY gelöscht ist) oder dass die letzte Zeichenübertragung schon längere Zeit zurückliegt (bei gesetztem BSY-Bit). Für die Feststellung der Empfangsbereitschaft des Druckers wird also BSY verwendet und für die korrekte Zeichenübertragung das ACK-Bit.
1
0
INI
STR
6
5
4
3
x
x
DSL
2
ALF
7
Druckersignal x
IRQ
Ist der Papiervorrat des Druckers erschöpft, wird das Bit PAP auf 1 gesetzt. Gleichzeitig wird das Bit OFON gelöscht und das Bit FEH gelöscht, um diese Fehlerbedingung anzuzeigen und um mitzuteilen, dass der Drucker nun offline ist. Durch Untersuchung des Bits OFON können Sie also z.B. bei einem Zeitüberschreitungsfehler ermitteln, ob der Drucker überhaupt online ist.
Pin-Nummer -
-
-
- 17 16 14
1
x:
nicht benutzt (üblicherweise gleich 1)
IRQ:
Hardware-Interrupt-Anforderung 1=aktiv
0=deaktiviert
DSL:
Drucker-Select 1=Drucker ausgewählt
0=Drucker nicht ausgewählt
INI:
Druckerinitialisierung 1=Drucker arbeitet normal
0=Initialisierung ausführen
automatischer Zeilenvorschub 1=automatischer Zeilenvorschub vom Drucker
0=Zeilenvorschub vom Host
Strobe 1=Daten zum Drucker übertragen
0=keine Übergabe
ALF: STR:
Abb. 29.5: Steuerregister (Offset 02h)
Das Steuerregister kontrolliert das Druckerverhalten und die Erzeugung von Hardware-Interrupts durch die parallele Schnittstelle. Wenn das IRQ-Bit gesetzt ist, löst die Schnittstelle bei einem Übergang des Signals ACK vom hohen zum niedrigen Pegel über IRQ5 (LPT2) oder IRQ7 (LPT1) einen Hardware-Interrupt entsprechend INT 0dh bzw. INT 0fh aus. Ein Interrupt tritt also genau dann auf, wenn der Drucker den Empfang des Zeichens bestätigt. Der zugehörige Handler kann dann das nächste Zeichen an den nun bereiten Drucker übergeben. Das PC-BIOS benutzt diese Möglichkeit der interrupt-getriebenen Datenübergabe aber im Allgemeinen nicht, sondern fragt einfach das ACK-Bit ab, um die Bestätigung des Druckers zu erfassen. Mit dem IRQ-Bit ist es auch möglich, einen interrupt-getriebenen und bidirektionalen Datenaustausch über die parallele Schnittstelle zu realisieren (s.u.). Drucker, die sich streng an den Centronics-Standard halten, sind über ein gesetztes DSL-Bit explizit zu aktivieren. Bei den IBM-kompatiblen Paralleldruckern ist die entsprechende Leitung nicht belegt, und der Drucker ist stets aktiviert, wenn er eingeschaltet oder wenn die OnlineTaste gedrückt wird. Ein gelöschtes INI-Bit führt zu einer Druckerinitialisierung. Denselben Effekt erzielt man bei den meisten Druckern auch durch die Übergabe eines Reset-Befehls, nur wird hier ein elektrisches Signal der Schnittstelle und kein Befehlscode verwendet. Bei gesetztem Bit ALF führt der Drucker nach jeder Zeile einen automatischen Zeilenvorschub aus.
Sandini Bib Die parallele Schnittstelle
959
Für die Datenübergabe an den Drucker ist neben ACK auch STR von großer Bedeutung. Ein gesetztes STR-Bit erzeugt einen kurzen Strobe-Impuls oder Abtastimpuls, der den Drucker anweist, die Signale auf den Datenleitungen entsprechend dem Datenregister als zu übertragende Daten entgegenzunehmen. STR taktet also die Datenübertragung von der Schnittstelle zum Drucker. Ein Setzen des STR-Bits führt aber nur zu einem einzigen Abtastimpuls. Wenn ein neues Datenbyte übergeben werden soll, genügt es also nicht, nur das Datenregister zu laden: Das STR-Bit muss gelöscht und daraufhin erneut gesetzt werden, um den Abtastimpuls zu erzeugen. Das folgende Beispiel illustriert die Strategie für die Zeichenausgabe an einen Drucker über eine direkte Programmierung der Schnittstellenregister. Beispiel: Routine zum Ausgeben eines Zeichens an den Drucker LPT1; die Routine kehrt mit einem Fehlercode zurück. int parall_output(char zeichen) { int i, code; for (i = 0; i < TIMEOUT_COUNT; i++) { code = inp(0x379); if ((code & 0x80) == 0x80) break; } if (i == TIMEOUT_COUNT) return (1);
/* warten, bis Drucker nicht mehr busy */ /* Statusregister lesen */ /* prüfen, ob BSY*-Bit gesetzt ist */
outp(0x378, (int) zeichen);
/* Datenregister laden */
code = inp(0x37a); code = code | 0x01; outp(0x37a, code);
/* Steuerregister lesen */ /* STB-Bit setzen */ /* Strobe high */
for (i = 0; i < STROBE_WAIT) ;
/* etwas warten */
code = inp(0x37a); code = code & 0xfe; outp(0x37a, code);
/* Steuerregister lesen */ /* STB-Bit löschen */ /* Strobe low, Daten werden übergeben */
for (i = 0; i < TIMEOUT_COUNT; i++) { code = inp(0x379); if ((code & 0x40) == 0x00) break; } if (i == TIMEOUT_COUNT) return (2);
/* warten, bis ACK vom Drucker kommt */ /* Statusregister lesen */ /* prüfen, ob ACK-Bit gelöscht ist */
return(0); }
/* BSY-Zeitüberschreitungsfehler, */ /* Fehlercode 1 */
/* /* /* /*
ACK-Zeitüberschreitungsfehler, */ Fehlercode 2 */ Zeichen korrekt übergeben, */ Fehlercode 0 */
Wenn Sie die Bedeutung der Bits im Status- und Steuerregister mit der Belegung der entsprechenden Leitungen vergleichen, erkennen Sie, dass die Bits BSY, DSL, ALF und STR gegenüber den elektrischen Signalen invertiert sind. Die parallele Schnittstelle invertiert also die Signale an den Pins 11, 17, 14 und 1.
29.2.2 Allgemeine Verwendung Alle oben angeführten Beschreibungen beziehen sich nur auf die Verwendung der parallelen Schnittstelle zur Ansteuerung eines Paralleldruckers. Die empfangende Schnittstelle im Drucker ist dafür verantwortlich, dass das Signal ACK auf low gesenkt wird, wenn der Drucker das Zeichen korrekt empfangen hat. Sie können aber auch ein anderes Gerät an die parallele Schnittstelle anschließen, z.B. einen kleinen Roboter. Dieser muss in keiner Weise ein aktiv niedriges Signal ACK erzeugen, wenn Daten übergeben worden sind. Vielmehr stehen Ihnen die zwölf Pins 1 bis 9, 14, 16 und 17 in uneingeschränkter und nicht vordefinierter Weise für die Ausgabe
Sandini Bib 960
Kapitel 29
und die 17 Pins 1 bis 17 für das Einlesen von Signalen zur Verfügung. Die parallele Schnittstelle ist also sehr flexibel, und Sie haben die Möglichkeit, sie auch auf eine Art und Weise zu verwenden, die sich von der sehr eingeschränkten Benutzung als Druckerschnittstelle stark unterscheidet. Um ein externes Gerät, das mit der parallelen Schnittstelle verbunden ist, ansprechen zu können, müssen Sie nur wissen, welche Auswirkung ein gesetztes oder gelöschtes Bit im Daten- oder Steuerregister auf die Signale an den entsprechenden Pins hat und welcher Signalpegel hinter einem gesetzten oder gelöschten Bit in einem der drei Register steht. Etwas Vorsicht ist geboten, weil die parallele Schnittstelle ja einige Signale invertiert, bevor sie am entsprechenden Pin ausgegeben werden. Das gilt, wie bereits erwähnt, für die Pins 1, 11, 14 und 17. 7
6
5
4
3
2
1
0
Pinsignal P9 P8 P7 P6 P5 P4 P3 P2 P9-P2: Signalpegel an den Pins 9 bis 2 (0=low, 1=high) Abb. 29.6: Datenregister (Offset 00h)
Die acht Bits des bidirektionalen Datenregisters entsprechen den Pins mit den Nummern 9 bis 2. Die Zuordnung von Bitwert und Signalpegel ist nicht invertiert, d.h., ein gesetztes Bit entspricht auch einem Signal mit hohem Pegel von ca. +5 V. Beachten Sie beim Einlesen des Registerwerts, dass der Wert eines Bits durch den ODER-Wert des zuletzt geschriebenen Bits und den Pegel des anliegenden Signals gegeben ist. Wenn das »reine« Pinsignal ermittelt werden soll, ist das betreffende Registerbit zuerst auf 0 zu setzen, und erst dann kann der korrekte Signalpegel am zugehörigen Pin ermittelt werden. Das gilt im Übrigen für alle bidirektionalen Register. 7
6
5
2
1
0
Pinsignal P11 P10 P12 P13 P15 x
x
x
4
3
P10-P15: Signalpegel an den Pins 10 bis 15 (0=low, 1=high) Abb. 29.7: Statusregister (Offset 01h)
7
6
5
4
Pinsignal x
x
x
IRQ
Das Statusregister ist bei einer allgemeinen Verwendung (unidirektional) der parallelen Schnittstelle nur lesbar. Die drei niederwertigen Registerbits der Schnittstelle werden nicht benutzt und liefern im Allgemeinen den Wert 1 zurück. Die vier höherwertigeren Bits 3 bis 6 geben die Signalpegel an den Pins 15, 13, 12 und 10 in nicht invertierter Form an. Dagegen kehrt die Schnittstelle den Pegel am Pin 11 um, d.h., ein gesetztes Bit P11 entspricht einem niedrigen, ein gelöschtes Bit einem hohen Signalpegel.
IRQ:
3
2
1
0
P17 P16 P14 P1
Hardware-Interrupt-Anforderung 1=aktiv 0=deaktiviert
P17, P14, P1: invertierte Signalpegel an den Pins P17, P14, P1 (0=high, 1=low)Signalpegel am Pin P16 (0=low, 1=high) Bit 5: Meist Umschaltung der Datenrichtung möglich (high: senden, low: empfangen) Abb. 29.8: Steuerregister (Offset 02h)
Sandini Bib Die parallele Schnittstelle
961
Das Steuerregister ist teilweise bidirektional. Das Bit IRQ hat nur beim Schreiben einen Sinn, Sie können mit ihm einstellen, ob die Schnittstelle über IRQ5 oder IRQ7 einen Hardware-Interrupt auslöst, wenn das Signal am Pin 10 (siehe Statusregister) vom hohen zum niedrigen Pegel übergeht. Ein Lesen des IRQ-Bits liefert stets den zuletzt eingeschriebenen Wert. Die drei höchstwertigen Bits sind bei der traditionellen Auslegung der Schnittstelle nicht belegt und geben beim Lesen stets einen Wert 1 zurück. Üblicherweise ist mit dem Bit 5 des Steuerregisters aber die Richtung des Datentransfers umkehrbar. Das heißt: Wenn Sie hier eine 0 hineinschreiben, können auch Daten von der Schnittstelle gelesen werden. Die vier niederwertigen Bits des Registers sind immer bidirektional. Zu beachten ist aber, dass nur das Bit P16 entsprechend dem Pin 16 nicht invertiert ist. Die anderen drei Bits geben beim Lesen die invertierten Signale an den Pins 17, 14 und 1 an. Beim Schreiben legt die Schnittstelle die Signalpegel an diesen Pins also auf Werte, die gegenüber den Bitwerten im Steuerregister invertiert sind. Eine mögliche Anwendung der parallelen Schnittstelle ist die Steuerung eines externen Geräts. Entsprechende Signalpegel an den programmierbaren Ausgabepins steuern das Gerät an. Über die Eingabepins kann das Gerät auch Informationen an den PC zurückgeben. Mit einem Lötkolben und etwas Geschick können Sie z.B. eine computergesteuerte Bewässerungsanlage für Ihren Garten konstruieren, bei der über die parallele Schnittstelle Magnetventile und Pumpen gesteuert werden, um den Garten in Abhängigkeit von den Signalen, die Feuchte- und Sonnenscheinsensoren an die Eingabepins anlegen, zu bewässern. 13 25
ONOF
ONOF
13 25
BSY ACK
BSY ACK D7 D6 D5 D4
DSL INI
D3 D2 D1
DSL INI
D0
14 1
STB
STB
14 1
Abb. 29.9: Datenaustausch über die parallele Schnittstelle: Für einen Datenaustausch müssen verschiedene Steuerund Statusleitungen vertauscht werden, um einen Handshake ausführen zu können.
Eine andere mögliche Anwendung ist der Austausch von Daten zwischen zwei Computern über die parallele Schnittstelle. Das geht wesentlich schneller als mit der seriellen Schnittstelle, weil die Daten ja in Portionen zu einem Byte und nicht nur einem Bit übergeben werden (wenn Sie nur eine der Ausgabeleitungen für die Übergabe von Steuerungsinformationen verwenden, können Sie theoretisch sogar elf Bits auf einmal übertragen). In Abbildung 29.9 ist ein Schema für einen möglichen Datenaustausch über die parallele Schnittstelle angegeben. Dabei sind die Datenpins 2 bis 9 der beiden Schnittstellen miteinander verbunden und die Pins 1 (STB), 17 (DSL) und 16 (INI) über Kreuz mit den Pins 10 (ACK), 13 (ONOFF) und 11 (BSY). Der Datenaustausch läuft folgendermaßen ab: 1. Der Sender legt die Leitung 17 (DSL) auf einen hohen Pegel, indem das Bit P17 im Steuerregister gelöscht wird, um anzuzeigen, dass er Daten an den Empfänger übertragen möchte. 2. Der Empfänger erfasst die Anwahl durch das gesetzte Bit P13 im Statusregister und aktiviert die Leitung INI durch ein gesetztes Bit P16 im Steuerregister.
Sandini Bib 962
Kapitel 29
3. Der Sender erfasst die Anwahlbestätigung durch den Empfänger über das gelöschte Bit P11 im Statusregister; die Verbindung ist hergestellt, die Rollen als Sender und Empfänger sind eindeutig verteilt, und der Sender kann nun Daten an den Empfänger übergeben. 4. Der Sender lädt das zu übertragende Zeichen in das Datenregister, senkt das Potenzial der Leitung STB durch ein gesetztes Bit P1 im Steuerregister auf einen niedrigen Pegel und löscht das Bit P1 wieder, um das Potenzial der Leitung STB erneut auf einen hohen Pegel anzuheben. Durch den kurzen Impuls wird die Datenübertragung eingeleitet und im Empfänger ein IRQ ausgelöst. 5. Der aufgerufene IRQ-Handler des Empfängers liest das Datenregister und damit die übergebenen Daten und überträgt sie in einen Puffer. 6. Anschließend senkt der Empfänger das Potenzial der Leitung STB durch ein gesetztes Bit P1 im Steuerregister auf einen niedrigen Pegel und löscht das Bit P1 wieder, um das Potenzial der Leitung STB erneut auf einen hohen Pegel anzuheben. Durch den kurzen Impuls wird der Empfang der Daten bestätigt und im Sender ein IRQ ausgelöst. 7. Der aufgerufene IRQ-Handler des Senders gibt die Steuerung an das Übertragungsprogramm zurück, das die Schritte 4 bis 6 so lange wiederholt, bis alle Daten übergeben worden sind. 8. Der Sender trennt die Verbindung durch Setzen des Bits P17 im Steuerregister. 9. Der Empfänger reagiert auf die Trennung seinerseits mit einem Löschen des Bits P16 im Steuerregister; nun können die Rollen als Sender und Empfänger neu verteilt werden. Die Schritte skizzieren die Datenübertragung natürlich nur im groben Rahmen. Für die Reaktion des Empfängers auf die Anwahl des Senders oder die Empfangsbestätigung durch den Empfänger müssen eigentlich noch Prüfschritte zur Erfassung von Zeitüberschreitungsfehlern eingebaut werden. Durch die restlichen Pins 12, 14 und 15 können beispielsweise zusätzlich ein Fehlersignal, ein Attention-Signal (wenn der Empfänger wichtige Daten für den Sender hat) oder andere Statusinformationen übertragen werden. Die speziellen Kabel, die als LapLink bezeichnet werden, im Übrigen genau für diese Anwendung entsprechend verdrahtet, und eine PC-PC-Datenübertragung lässt sich dann beispielsweise mit InterLink/InterServer (DOS) oder auch mit der PC-Direktverbindung unter Windows ausführen.
29.3 Der bessere Parallel-Port: IEEE-1284 Eine in ihren Funktionen erweiterte parallele Schnittstelle, die unter der Bezeichnung IEEE-1284 vom Institute of Electrical and Electronic Engineers standardisiert worden ist, ist bei allen aktuellen PCs bereits auf dem Mainboard implementiert. Es werden mit IEEE-1284 fünf verschiedene Betriebsarten definiert, die Sie im BIOS-Setup festlegen können, wobei jedoch nicht immer alle davon einzustellen sind.
: : : : :
Compatible Mode: Definiert zur Rückwärtskompatibilität den (alten) unidirektionalen Modus (Centronics), wird auch als SPP (Standard Parallel Port) bezeichnet Byte Mode: bidirektionaler Centronics-Mode in 8 Bit Breite Nibble Mode: definiert die Mindestanforderung für eine parallele Schnittstelle. Die Datenübertragung erfolgt Nibble-weise (in 4 Bit Breite) Extended Parallel Port: Bidirektionale Übertragung von Daten und auch Adressen für maximal 256 Einheiten Enhanced Capability Mode: Im Prinzip wie EPP, aber mit Datenkomprimierung, FIFO und Kommandozyklen
Sandini Bib Die parallele Schnittstelle
963
In den verschiedenen IEEE-1284-Betriebsarten werden grundsätzlich dieselben Leitungen wie bei der »alten« Centronics-Schnittstelle verwendet. Diese haben, je nach Betriebsart, unterschiedliche Signalbezeichnungen und Funktionen, wie in Tabelle 29.2 zusammenfassend angegeben ist. Pin
Richtung
Compatible
Nibble
Byte
ECP
EPP
1 PC→Gerät Strobe – HostClk HostClk Write 2 PC↔Gerät Data 1 – Data 1 Data 1 AD1 3 PC↔Gerät Data 2 – Data 2 Data 2 AD2 4 PC↔Gerät Data 3 – Data 3 Data 3 AD3 5 PC↔Gerät Data 4 – Data 4 Data 4 AD4 6 PC↔Gerät Data 5 – Data 5 Data 5 AD5 7 PC↔Gerät Data 6 – Data 6 Data 6 AD6 8 PC↔Gerät Data 7 – Data 7 Data 7 AD7 9 PC↔Gerät Data 8 – Data 8 Data 8 AD8 PtrClk PtrClk PeriphClk Interrupt 10 Gerät→PC Acknowledge 11 Gerät→PC Busy Data 3, 7 PtrBusy PeriphAck Wait 12 Gerät→PC Paper Error Data 2, 6 AckDataReq AckRevers UserDefin1 13 Gerät→PC Select Data 1, 5 – Xflag UserDefin3 HostBusy HostBusy HostAck DataStrb 14 PC→Gerät AutoFeed 15 nicht definiert 16 Logic GND 17 Chassis GND 18 Peripheral Logic High 19 GND Strobe 20 GND Data 1 21 GND Data 2 22 GND Data 3 23 GND Data 4 24 GND Data 5 25 GND Data 6 26 GND Data 7 27 GND Data 8 28 GND Paper Error, Select, Acknowledge 29 GND Busy, Fault 30 GND Auto Feed, Select In, Init – – RevRequest Reset 31 PC→Gerät Init 32 Gerät→PC Fault Data (0, 4) DataAvail PeriRequest UserDefin 2 33 nicht definiert 34 nicht definiert 35 nicht definiert 1284Active 1284Active 1284Active AddressStrb 36 PC→Gerät SelectIn Tab. 29.2: Die Leitungen der parallelen Schnittstelle haben in den verschiedenen IEEE-1284-Modi unterschiedliche Bedeutungen und Funktionen.
Für IEEE-1284 sind – wie für Centronics ebenfalls – sowohl der 25-polige als auch der 36-polige Stecker vorgesehen. Des Weiteren wird eine mechanisch verkleinerte 36-polige Steckerversion (IEEE-1284-C) empfohlen, die immer häufiger bei Druckern zu finden ist. Der Compatible Mode stellt sicher, dass im Prinzip auch ältere Drucker an einer IEEE-1284-konformen Schnittstelle verwendet werden können, und entspricht somit einer standardisierten Centronics-Schnittstelle. Eine Datenübertragungsrate vom maximal 150 KByte pro Sekunde sind in diesem Modus zu erreichen.
Sandini Bib 964
Kapitel 29
Der Nibble Mode arbeitet in einer Breite von lediglich vier Bit. Vier Leitungen müssen dabei als Rückkanal vom Gerät zum Computer vorgesehen sein. Hierfür werden die Leitungen PtrBusy (Data 3,7), AckDataReq (Data 2,6), Xflag (Data 1,5) und DataAvail (Data 0,4) verwendet, die in diesem Modus als Datenleitungen zu verstehen sind und abwechselnd jeweils ein halbes Datenbyte (Nibble= 4 Bit) übertragen. Der Handshake wird mit den Signalen HostBusy und PtrClk ausgeführt. Der Computer signalisiert die Bereitschaft zur Datenaufnahme mit einem Low auf der HostBusy-Leitung, woraufhin das untere Nibble auf die Schnittstelle gelegt wird. Die Gültigkeit der Daten wird dem Computer daraufhin mit einem Low auf der PtrClk-Leitung mitgeteilt, die hier im Prinzip als Strobe fungiert. Der PC sendet zur Kennzeichnung, dass die Daten verarbeitet werden und zurzeit keine weiteren Daten angenommen werden können. Anschließend wird auch PtrClk wieder auf High gesetzt, und sobald der Computer zur Aufnahme des zweiten Nibble bereit ist, erfolgt dessen Übertragung. Das Signal 1284Active wird generell zur Kennzeichnung (High) dafür verwendet, dass momentan eine IEEE-1284-Betriebsart eingeschaltet ist. Während das Datenregister im Nibble Mode nicht verwendet wird, haben sowohl das Status- als auch das Steuerregister eine neue Belegung erhalten, was in Abbildung 29.10 zu erkennen ist.
Abb. 29.10: Die Register im Nibble Mode
Der Byte Mode entspricht dem bidirektionalen Centronics Mode, wie er bereits bei den PCs mit MicroChannel-Architektur (PS/2) standardmäßig verwendet wurde. Die Daten werden hier im Gegensatz zum Nibble Mode byte-weise über das Datenregister (Basisadresse) ausgetauscht. Bei der Datenübertragung vom PC zur Peripherie wird der Handshake mit Hilfe der Signale HostClk (ehemals Strobe), PtrBusy (ehemals Busy) und PtrClk (ehemals Acknowledge) analog zum SPP-Mode ausgeführt. Bei der Datenübertragung in der anderen Richtung signalisiert der PC zunächst mit einem Low über HostBusy seine Bereitschaft, woraufhin die Peripherie ein Byte ausgibt und dessen Gültigkeit mit PtrClk (Low) bekannt gibt. Sind die Daten verarbeitet, sendet der PC ein Low auf HostClk, und der nächste Zyklus kann nun beginnen. Das Datenregister ist sowohl für die Sende- als auch für die Empfangsdaten zuständig, wobei die hierfür notwendige Umschaltung der Übertragungsrichtung mit dem Bit 5 Data Direction im Steuerregister vorgenommen wird, was vor jedem Zyklus entsprechend festzulegen ist. Bei einem High ist auf Lesen und bei einem Low auf Schreiben (zur Peripherie) geschaltet. Die Belegung des veränderten Status- und Steuerregisters sehen Sie in Abbildung 29.11. Der Extended Parallel Port – kurz EPP – wurde gemeinsam von den Firmen Intel, Xircom und Zenith entwickelt und stellt die gebräuchlichste IEEE-1284-Implementierung dar, die gegenüber den vorher erläuterten auch tatsächlich neue Möglichkeiten zur Gerätekopplung und Daten-
Sandini Bib Die parallele Schnittstelle
965
übertragung bietet. Es können bidirektional sowohl Daten als auch Adressen übertragen werden, und es sind theoretisch (8 Bit) bis zu 256 Einheiten einzeln selektierbar.
Abb. 29.11: Die Register im Byte Mode
Ohne zusätzliche Hardware (Sternverteiler, Hub) ist eine EPP-Verbindung jedoch lediglich als Verbindung zwischen zwei Geräten ausgelegt. Gleichwohl kann die Peripherie selbst natürlich bis zu 256 Schaltungseinheiten enthalten, was beispielsweise für ein multifunktionales Gerät wie eine Printer-Modem-Fax-Kombination ausgenutzt werden kann. In der Praxis trifft man allerdings eher selten auf derartige Lösungen. Die Datenübertragungsrate beträgt maximal 2 MByte/s bei einer typischen Kabellänge von 5 m. Bei einem Daten-Schreibzugriff vom PC zur Peripherie wird das Signal Write aktiviert – auf Low gesetzt – und nachfolgend das Wait-Signal auf ein Low hin überprüft, das besagt, dass die Peripherie zur Datenaufnahme bereit ist und die Datenübertragung ausgeführt werden kann. Daraufhin wird DataStrobe auf Low gelegt, wodurch die Daten nun übergeben werden können. Die Peripherie signalisiert ihrerseits mit einem High auf Wait, dass sie die Daten komplett übernommen hat, woraufhin DataStrobe vom PC wieder deaktiviert (High) wird und die Übertragung somit abgeschlossen ist. Ein Datenlesezyklus vom PC erfolgt prinzipiell auf die gleiche Art und Weise wie ein Schreibzyklus, mit dem Unterschied allerdings, dass sich das Write-Signal dabei auf High-Pegel befindet. Ein spezieller »Umschaltzyklus« wie bei ECP (siehe unten) ist nicht vorgesehen. Zur Adressierung eines EPP-Geräts wird dementsprechend eine Adresse über die acht AD-Leitungen (Address Data) gesendet und statt DataStrobe das Signal AddressStrobe verwendet. Der Vorgang ist ansonsten mit einem Daten-Schreibzugriff identisch, was analog auch für einen AdressenleseZyklus gilt, der in der Praxis jedoch keine Relevanz besitzt, da üblicherweise der PC und nicht die Peripherie die Adressen ausgibt. Es ist durchaus möglich, dass im EPP-Mode mehr als 8 Bits verarbeitet werden können, was beispielsweise für spezielle Anwendungen wie Messwerterfassungsschaltungen (A/D-Umsetzer) ausgenutzt werden kann, denn es gibt drei zusätzliche Leitungen, die als UserDefin(ed) 1–3 bezeichnet werden und nicht in der Spezifikation definiert sind. Die drei Standard-Register werden in der üblichen Art und Weise verwendet (SPP-Mode), wie es bereits erläutert wurde. Die Ausführung des Handshakes wird im EPP-Mode aber nicht von der (Anwender-)Software, sondern bei einem entsprechenden I/O-Zugriff automatisch – vom BIOS mit EPP-Unterstützung – gesteuert, was die Programmierung erheblich vereinfacht und keine Manipulation einzelner Bits erfordert. Neben den drei SPP-Registern sind für den EPP-Mode fünf weitere hinzugekommen, die sich an den Adressen mit dem Offset 03h–07h von der jeweils festgelegten Basisadresse aus gesehen befinden. Die Tabelle 29.3 zeigt alle auf einen Blick.
Sandini Bib 966
Kapitel 29
Offset
Bezeichnung
Zugriff
Funktion
00h 01h 02h 03h 04h 05h 06h 07h
SPP Data SPP Status SPP Control EPP Address EPP Data 0 EPP Data 1 EPP Data 2 EPP Data 3
Schreiben Lesen Schreiben Lesen/Schreiben Lesen/Schreiben Lesen/Schreiben Lesen/Schreiben Lesen/Schreiben
Standard-Datenregister Standard-Statusregister Standard-Steuerregister EPP-Adressregister EPP-Datenregister (8-, 16-, 32-Bit) EPP-Datenregister (16-, 32-Bit) EPP-Datenregister (32-Bit) EPP-Datenregister (32-Bit)
Tab. 29.3: Die Register für den EPP-Mode, wobei die Register unter den Offset-Adressen 5–7 je nach Hersteller unterschiedlich verwendet werden.
Der Enhanced Capability Mode (ECP) wurde durch eine Microsoft- und Hewlett-Packard-Initiative im IEEE-1284-Standard implementiert und verfügt über ähnliche Eigenschaften wie der EPPMode, denn auch er kann mehrere Einheiten (max. 128) adressieren, wobei hier im Prinzip die gleichen Einschränkungen wie beim EPP gelten. Der ECP unterstützt jedoch eine einfache Datenkomprimierung nach RLE (Run Length Encodes), die nacheinander auftretende gleich lautende Zeichen nur einmal überträgt und danach die Anzahl der Zeichen sendet. Beim Schreiben muss die Software für die Komprimierung Sorge tragen, während die Dekomprimierung automatisch erfolgt. Das Kernstück bei ECP bildet ein 16 KByte großer FIFO mit DMA- und Interrupt-Fähigkeiten, der Datenübertragungsraten von bis zu 2 MByte (wie bei EPP) erlaubt. Das ECP-Protokoll kennt sowohl Daten- als auch Kommandozyklen in beiden Richtungen (forward, reverse). Es existieren zwei Kommandozyklen: Channel Address und Run Length Count, also eine Kanaladressierung für die einzelnen Einheiten und ein Zähler für die RLE-Komprimierung/Dekomprimierung. Das Signal HostAck ist für die Unterscheidung der zwei verschiedenen Zyklen zuständig. Ist es high, findet ein Datenzyklus und bei einem Low entsprechend ein Kommandozyklus statt, wobei hier das Bit 8 zur Unterscheidung zwischen einer Channel Address und dem RLE-Zähler dient. Ist es low, repräsentieren die Bits 1–7 den Run-Length-Count (0–128), ist es high, wird eine Channel-Adresse (0–127) übertragen. Der PC signalisiert über HostClk (low) die Gültigkeit der ausgegebenen Daten, die Peripherie bestätigt dies mit PeriphAck=High, und der PC setzt daraufhin HostClk wieder zurück, was hier aber als Datenübernahmesignal für die Peripherie gilt. Diese meldet daraufhin ihre erneute Bereitschaft zum Datenempfang mit PeriphAck=low, und es folgt nun ein Kommandozyklus (HostAck=low). Für eine Übertragung von der Peripherie zum PC (reverse) muss zunächst – im Gegensatz zum EPP-Mode – die Richtung umgeschaltet werden. Der PC aktiviert hierfür RevRequest (low) und wartet darauf, dass die Peripherie ihrerseits das Signal PeriRequest auf low setzt. Danach erfolgt die Übertragung identisch zur gezeigten Forward-Übertragung. Die ECP-Microsoft-Spezifikation legt verschiedene Betriebsarten fest, wie sie auch als Bestandteil von IEEE-1284 üblich sind. Dies bedeutet, dass ein Mainboard mit ECP-Unterstützung beispielsweise auch automatisch den SPP- und den EPP-Mode beherrschen muss. Das ECP-Registermodell orientiert sich an dem des Standard-Centronics-Ports. Ältere PCs dekodieren lediglich 10 Bits (A0–A9) des I/O-Adressraums (000h–3FFh), was dazu führt, dass z.B. das Centronics-Datenregister sowohl unter 378h als auch unter 778h und f78h angesprochen werden kann. Alle neueren PCs, die dementsprechend auch eine ECP- bzw. IEEE-1284-Unterstützung
Sandini Bib Die parallele Schnittstelle
967
bieten, dekodieren jedoch den gesamten I/O-Adressraum (bis FFFFh), wodurch tatsächlich 378h als auch 778h als verschiedene Register interpretiert werden. Mode
Funktion/Modus
0 1 2 3 4 5 6 7
SPP-Mode Byte-Mode Fast Centronics ECP-Mode spezieller ECP-Mode Reserviert Test-Mode Configuration-Mode
Tab. 29.4: Die verschiedenen ECP-Modes. Der Mode 4 ist nicht in der Spezifikation definiert und eine Besonderheit für Super-I/O-Controller der Firma SMSC.
ECP belegt im allgemein gültigen I/O-Adressbereich lediglich drei Register (wie Standard-Centronics) und sechs weitere, die über einen Offset von 400h–402 selektiert werden und daher keine Kollision mit dem (alten) standardisierten I/O-Modell verursachen können. Das wichtigste Register ist dabei ECR (Offset 402h), das die aktuelle Betriebsart festlegt und auch feststellen kann, ob der PC eine ECP-Unterstützung bietet. Offset
Bezeichnung
Zugriff
ECP-Mode
Funktion
000h 000h 001h 002h 400h 400h 400h 400h 401h 402h
Data ECP-A-FIFO DSR DCR C-FIFO ECP-D-FIFO T-FIFO CNFG-A CNFG-B ECR
Schreiben/Lesen Schreiben/Lesen Schreiben/Lesen Schreiben/Lesen Schreiben/Lesen Schreiben/Lesen Schreiben/Lesen Lesen Schreiben/Lesen Schreiben/Lesen
0–1 3 alle alle 2 3 6 7 7 alle
Datenregister ECP Address FIFO Statusregister Steuerregister Parallel Port Data FIFO ECP Data FIFO Test FIFO Configuration Register A Configuration Register B Extended Control Register
Tab. 29.5: Die Register des ECP-Mode
Die Verwendung des ECP-Mode erfolgt ähnlich wie die des EPP-Mode. Die gewünschte Betriebsart wird zunächst in das ECR-Register geschrieben, und dann kann ein Lese- oder ein Schreibzugriff auf den gewünschten I/O-Port stattfinden, wobei das Handshaking auch hier automatisch ausgeführt wird, was keine Manipulation einzelner Bits erfordert. Der Vorteil von ECP gegenüber EPP ist die Tatsache, dass eine DMA-Unterstützung für die Übertragung relativ großer Datenmengen gegeben ist, was jedoch mit einem erhöhten Programmierungsaufwand zur Steuerung des DMA-Transfers einhergeht. In den meisten Fällen wird man daher auf den EPP-Mode zurückgreifen.
Sandini Bib
Sandini Bib
30
Die serielle Schnittstelle
Neben der parallelen Schnittstelle ist im PC nach wie vor die serielle Schnittstelle aufgrund ihrer Vielseitigkeit von großer Bedeutung. Hier können Sie so unterschiedliche Geräte wie z.B. eine Maus, ein Modem, einen Plotter und natürlich auch einen geeigneten Drucker anschließen. Aufbau, Funktionsweise und Programmierung der seriellen Schnittstelle sind Gegenstand dieses Kapitels.
30.1 Serielle Datenübertragung Die parallele Datenübertragung haben Sie bereits in Kapitel 29 kennen gelernt. Kennzeichen der parallelen Datenübertragung ist, dass die Bits eines Datenbyte und gegebenenfalls ein Paritätsbit parallel, d.h. gleichzeitig über eine Mehrzahl von Datenleitungen übergeben werden. Für ein Datenbyte und ein Paritätsbit sind also neun Datenleitungen notwendig. Bei einer seriellen Übertragung werden die einzelnen Datenbits und das möglicherweise vorhandene Paritätsbit dagegen über eine einzige Datenleitung in zeitlicher Folge, d.h. seriell, übergeben. Man könnte nun einwenden, dass die parallele Schnittstelle beim Ausdruck eines größeren Dokuments die Datenbytes ja auch zeitlich nacheinander, also seriell, übergibt. Der Unterschied besteht jedoch darin, dass bei der parallelen Übertragung die einzelnen Dateneinheiten – das sind die Datenbytes – als Ganzes übergeben werden, während bei der seriellen Übertragung auch die Dateneinheiten in einzelne Bits unterteilt und bitweise übergeben werden.
30.1.1 Synchrone und asynchrone Übertragung Bei der seriellen Datenübertragung unterscheidet man noch zwischen synchronem und asynchronem Datenaustausch. Bei einer synchronen Übertragung werden über eine getrennte Leitung noch ein oder mehrere Signale übertragen, die angeben, wann das nächste Bit auf der Datenleitung gültig ist. Diese Signale können durch Taktsignale einer Taktquelle oder durch Handshake-Signale der Art Request und Acknowledge gebildet werden. Der große Vorteil der synchronen Übertragung ist, dass der Empfänger auf unterschiedliche Taktraten reagieren kann, solange seine Maximalfrequenz nicht überschritten wird, indem er einfach z.B. den Übergang low-high des Taktsignals erfasst. Im Gegensatz dazu ist bei asynchroner Übertragung ein Minimum an Synchronisationsinformation in die Datenbits selbst eingebettet, wobei Sender und Empfänger mit derselben Taktfrequenz arbeiten müssen. Die eingebettete Synchronisationsinformation besteht aus einem so genannten Startbit, das den Beginn einer Dateneinheit anzeigt, und mindestens einem Stoppbit, das das Ende der Dateneinheit angibt. Nimmt man die Paritätsinformation hinzu, die ja häufig auch bei paralleler Datenübertragung verwendet wird, besteht eine serielle Dateneinheit oder SDU (Serial Data Unit) aus einem Startbit, den Datenbits, gegebenenfalls einem Paritätsbit und mindestens einem Stoppbit. Gegenüber der synchronen seriellen Datenübertragung ergibt sich hier also ein Overhead durch Start- und Stoppbits.
30.1.2 Parität und Baudrate Die Parität ist ein einfacher und leider auch wenig leistungsfähiger Schutz gegen Übertragungsfehler. Durch die Parität können nur einfache Bitfehler zuverlässig erkannt werden, Bündelfehler mit mehreren gestörten Bits werden mit 50-prozentiger Wahrscheinlichkeit nicht erfasst. Die Pari-
Sandini Bib 970
Kapitel 30
tät eignet sich also nur für kurze und wenig störanfällige Übertragungswege. Für andere Anwendungen sind CRC-Codes wesentlich zuverlässiger, aber auch komplizierter zu berechnen. Der Vorteil der Parität ist aber, dass nahezu alle seriellen Schnittstellenbausteine die Erzeugung und Prüfung von Paritätsbits hardware-mäßig unterstützen. Insgesamt unterscheidet man fünf verschiedene Paritäten:
: : : : :
keine Parität: Es wird kein Paritätsbit eingefügt. gerade Parität: Das Paritätsbit wird so gesetzt, dass in den Datenbits und dem Paritätsbit zusammen eine gerade Anzahl von Einsen vorkommt. ungerade Parität: Das Paritätsbit wird so gesetzt, dass in den Datenbits und dem Paritätsbit zusammen eine ungerade Anzahl von Einsen vorkommt. Mark: Das Paritätsbit wird stets auf den Wert »1« gesetzt. Space: Das Paritätsbit wird stets auf den Wert »0« gesetzt.
An dieser Stelle ein paar Bemerkungen zu den reichlich wertlosen Paritäten Mark und Space. Mark und Space eignen sich tatsächlich nur dazu, Fehler im Paritätsbit selbst zu erfassen; wenn eine SDU mit gelöschtem oder gesetztem Paritätsbit einläuft und eigentlich Mark- bzw. SpaceParität vorhanden sein sollte, liegt ein Fehler im Paritätsbit vor. Über die Richtigkeit der Datenbits sagt das natürlich überhaupt nichts aus. Umgekehrt können die Datenbits zerstört sein, der Empfänger merkt aber nichts davon, wenn das Paritätsbit unbeschädigt ist. Mark und Space sind also nur von sehr geringem bis umständlichem Wert. Eine weitere Größe im Zusammenhang mit der seriellen Datenübertragung, die häufig Anlass zu Missverständnissen gibt, ist die Baudrate. Benannt nach dem französischen Mathematiker J.M.E. Baudot, gibt sie lediglich die Anzahl der Signaländerungen eines Übertragungskanals je Sekunde an. Da bei den üblichen seriellen Schnittstellen die Signaländerungen zeitlich äquidistant sind und eine sehr einfache binäre Datenkodierung ausgeführt wird – ein logisch hoher Pegel gleich Mark entspricht einer »1«, ein logisch niedriger Pegel gleich Space entspricht einer »0« –, ist die Baudrate hier gleich der Anzahl der übertragenen Bit pro Sekunde (bps), wenn man auch Start-, Paritäts- und Stoppbits einschließt. Bei leistungsfähigen Kodierungen mit Datenkompressionsverfahren, wie sie etwa bei Modems zum Einsatz kommen, werden Datenraten (in bps) erzielt, die deutlich über der Baudrate liegen.
30.1.3 Serialisierung und SDU Bevor eine asynchrone serielle Datenübertragung zwischen zwei Einheiten stattfinden kann, müssen der Sender und der Empfänger auf dieselben Formate eingestellt werden. Dazu gehört die Angabe der Zahl von Datenbits, die Angabe, ob und gegebenenfalls welche Parität vorhanden sein soll, und die Zahl der Stoppbits. Gültige Werte für die Anzahl der Datenbits sind fünf, sechs, sieben und acht. Wenn fünf Datenbits gewählt wurden, fügt der serielle Schnittstellenchip automatisch eineinhalb Stoppbits ein. Damit ist gemeint, dass die zeitliche Dauer des Stoppbits eineinhalb normale Bits beträgt. Ansonsten können Sie meist zwischen einem und zwei Stoppbits wählen. Außerdem ist noch die Baudrate für Sender und Empfänger gleich einzustellen. Als Beispiel ist in Abbildung 30.1 eine SDU mit einem Startbit, sieben Datenbits, ungerader Parität und einem Stoppbit dargestellt. Zu beachten ist, dass das Startbit stets den Wert »0« (das entspricht Space) und dass das oder die Stoppbits stets den Wert »1« (das entspricht Mark) haben.
Sandini Bib Die serielle Schnittstelle
971
1 SDU = 4,17ms
0
1
1
0
1
1
7 Datenbits
0
1
1 Stopbit
1
1 Startbit
0
1 Paritätsbit
417µs 417µs 417µs 417µs 417µs 417µs 417µs 417µs 417µs 417µs
Abb. 30.1: Die dargestellte serielle Dateneinheit besteht aus einem Startbit, sieben Datenbits, einem Paritätsbit und einem Stoppbit. Bei der gewählten Baudrate von 2400 wird jedes Bit in 417µs übertragen.
In Abbildung 30.2 sehen Sie ein Schema für die Erzeugung einer seriellen Datenfolge. Der Schnittstellenchip weist zum Senden von Daten ein Senderhalteregister auf, das zunächst das Datenbyte von der CPU aufnimmt. Die SDU-Logik fügt entsprechend dem gewählten Datenformat das Startbit vor der eingestellten Zahl von Datenbits ein, berechnet gegebenenfalls das Paritätsbit und fügt es zusammen mit den eingestellten Stoppbits an die Datenbits an. Die so gebildete Datenfolge wird in das Senderschieberegister übertragen. Das Senderschieberegister wird nun im Takt der Baudrate von einem Taktgeber angesteuert und gibt beginnend mit dem Startbit und dem niederwertigsten Datenbit die einzelnen Bits am seriellen Ausgang ab. Dazu wird einfach der UND-Wert vom Taktsignal und dem aktuellen niederwertigsten SDU-Bit am Ausgang des Senderschieberegisters gebildet. Die Arbeitsweise des Senders führt dazu, dass zuerst die niederwertigen und dann die höherwertigen Datenbits ausgegeben werden. Sollen keine weiteren Daten abgegeben werden, gibt der Chip ein Mark-Signal aus, d.h. einen Pegel, der logisch 1 entspricht, und treibt die Sendeleitung auf einen logisch hohen Pegel. Taktsignal (intern)
Startbit
Datenbit
Datenbit
Datenbit
Datenbit
Datenbit
Datenbit
Datenbit
Parität
Stopbit
Senderschieberegister
SDU-Logik
Senderhalteregister
Busschnittstelle
Schnittstellensteuerung Baudratengenerator
serielle Daten
Abb. 30.2: Umsetzung und Senden serieller Daten
Der Empfang läuft genau umgekehrt ab. Das Startbit mit einem Wert von logisch 1, was Space entsprichtist ein eindeutiges Signal für eine einlaufende Datenfolge, weil die Empfangsleitung vom Sender normalerweise auf Mark gehalten wird. Das Startbit wirkt also als Triggerimpuls
Sandini Bib 972
Kapitel 30
und startet den Empfänger im seriellen Schnittstellenchip. Die seriellen Bits werden im Takt der eingestellten Baudrate in das Empfängerschieberegister geladen. Das bedeutet, dass im Empfängerschieberegister zuerst die niederwertigen und dann die höherwertigen Datenbits einlaufen. Die Empfängerlogik trennt von den empfangenen Bits das Startbit, Paritätsbit (falls vorhanden) und das oder die Stoppbits ab, berechnet gegebenenfalls die Parität der empfangenen Bits und vergleicht sie mit der eingestellten Parität. Anschließend werden die extrahierten Datenbits in das Empfängerpufferregister übertragen, wo sie von der CPU als Datenbyte gelesen werden können. Das Empfangsschema ist in Abbildung 30.3 gezeigt. Taktsignal (intern)
Parität
Stopbit
Datenbit
Datenbit
Datenbit
Datenbit
Datenbit
Datenbit
Startbit
Datenbit
Empfängerschieberegister
SDU-Logik
Empfängerhalteregister
Busschnittstelle
Schnittstellensteuerung Baudratengenerator
serielle Daten
Abb. 30.3: Empfangen und Umsetzen serieller Daten
Aus der Beschreibung des Sende- und Empfangsvorgangs ist unmittelbar ersichtlich, dass bei Sender und Empfänger dieselbe Baudrate eingestellt sein muss. Außerdem müssen auch die eingestellten Datenformate, d.h. die Zahl der Datenbits, die Parität und die Zahl der Stoppbits, gleich sein, da der Empfänger sonst womöglich ein anderes Byte zusammensetzt, als dem Sender zur Ausgabe übergeben worden ist.
30.2 Die RS-232C-Schnittstelle Die üblichen PC-Schnittstellen für den seriellen Datenaustausch genügen dem RS-232C-Standard der EIA (Electronic Industries Association, der Herausgeber der RS-232C-Spezifikation). In Europa findet man häufig auch die Bezeichnung V.24, die RS-232C vollkommen gleichwertig ist. Im Weiteren werde ich die Bezeichnung RS-232C verwenden. Der Standard definiert die mechanische, elektrische und logische Schnittstelle zwischen einer Datenendeinrichtung DTE (Data Terminal Equipment) und einer Datenübertragungseinrichtung DCE (Data Carrier Equipment). Die Datenendeinrichtung DTE wird üblicherweise von einem Computer – in unserem Fall also dem PC – und die Datenübertragungseinrichtung DCE von einem Modem gebildet. Der RS-232C-Standard sieht 25 Leitungen zwischen DTE und DCE und somit einen 25-Pin-Stecker vor. Ein Großteil der Pins ist aber für eine synchrone Datenübertragung reserviert. Allein der serielle asynchrone Datenaustausch ist jedoch bei PCs als Standard zu betrachten, und somit stellt die serielle Schnittstelle in einem PC nur eine Untermenge der in der RS232- bzw. V.24-Spezifikation festgelegten Möglichkeiten dar, auf die ich mich auch nur beschränken möchte.
Sandini Bib Die serielle Schnittstelle
973
Im PC sind daher nur elf der RS-232C-Signale notwendig. Darüber hinaus hat IBM einen 9-PinAnschluss definiert, bei dem zwei der normalerweise vorhandenen RS-232C-Leitungen fehlen. In Tabelle 30.1 finden Sie die entsprechenden Belegungen und Signale für 25- und 9-Pin-Stecker, wobei der 9-Pin-Stecker heutzutage bei PCs üblich ist. 25-Pin
9-Pin
Signal
Richtung
Beschreibung
1 2 3 4 5 6 7 8 20 22 23
– 3 2 7 8 6 5 1 4 9 –
– TD RD RTS CTS DSR – DCD DTR RI DSRD
– DTE→DCE DCE→DTE DTE→DCE DCE→DTE DCE→DTE – DCE→DTE DTE→DCE DCE→DTE DCE↔DTE
Schutzerde Sendedaten Empfangsdaten Request to Send Clear to Send Data Set Ready Signalmasse (Common) Data Carrier Detect Data Terminal Ready Ring Indicator Data Signal Rate Detector
Tab. 30.1: Belegung und Signale der 25- und 9-Pin-Stecker
Beim 9-Pin-Anschluss fehlen die Schutzerde und das Signal für die Datensignalrate. Die verbleibenden neun Signale reichen aber für einen seriellen, asynchronen Datenaustausch zwischen einem DTE und einem DCE entsprechend dem RS-232C-Standard aus. Die beiden Pins 3/2 und 2/3 übertragen dabei die Datensignale, die restlichen Anschlüsse die Steuersignale. Für eine Steuerung der Datenübertragung zwischen DTE und DCE sind die fünf Steuersignale RTS (Request to Send, Pin 4/7), CTS (Clear to Send, Pin 5/8), DCD (Data Carrier Detect, Pin 8/1), DSR (Data Set Ready, Pin 6/6) und DTR (Data Terminal Ready, Pin 20/4) maßgeblich. RTS (Request to Send) Dieses Signal vom DTE weist das DCE an, sich auf eine Übertragung von Daten vom DTE zum DCE einzustellen. Das DTE signalisiert also dem DCE auf diese Weise, dass es Daten ausgeben möchte, die vom DCE entgegengenommen werden sollen. Das DCE aktiviert seine Trägerfrequenz, um Daten zum Ziel zu übertragen. CTS (Clear to Send) Das Signal vom DCE zeigt dem DTE an, dass das DCE bereit ist, Daten vom DTE entgegenzunehmen. Das DCE aktiviert das Signal CTS üblicherweise als Reaktion auf eine Aktivierung des Signals RTS vom DTE. Hat das DCE das Signal CTS aktiviert, kann das DTE beginnen, die Daten auszugeben. RTS und CTS dienen bei einer Halbduplex-Verbindung dazu, die Rollen der beiden Kommunikationspartner als Sender und Empfänger zu verteilen und die beiden Partner zwischen Senden und Empfangen umzuschalten. RTS und CTS bilden damit quasi Handshake-Signale. DCD (Data Carrier Detect) Das DCE aktiviert das Signal DCD, wenn es vom Ziel ein Trägersignal erfasst hat und die Verbindung aufgebaut wird. DCD bleibt während der gesamten Verbindung aktiv. Bei HalbduplexModems gibt nur das empfangende DCE ein aktives DCD-Signal aus.
Sandini Bib 974
Kapitel 30
DSR (Data Set Ready) Das DCE (üblicherweise ein Modem) zeigt dem DTE durch ein aktives Signal DSR an, dass es eingeschaltet ist, die Vorbereitungen für eine Verbindung mit dem Ziel beendet hat und mit dem DTE kommunizieren kann. Data Set Ready kennzeichnet dabei allgemein eine externe Datenendeinrichtung. DTR (Data Terminal Ready) Das Signal vom DTE zeigt die allgemeine Bereitschaft des DTE an und wird im Allgemeinen beim Einschalten des DTE aktiviert. Das DCE kann anschließend mit der Leitung verbunden werden, wobei DTR diese Verbindung aber nicht explizit anweist – das geschieht vielmehr durch RTS. Wenn die Verbindung zwischen DTE und DCE einmal hergestellt ist, muss DTR während der ganzen Verbindungszeit aktiv bleiben. DTR und DSR sind also für den Aufbau der Verbindung verantwortlich, RTS und CTS dagegen für die Übertragung der Daten – und die Übertragungsrichtung im Falle einer Halbduplex-Verbindung. Ohne ein aktives Signal DTR haben RTS und CTS keinerlei Auswirkungen, das DCE reagiert in keiner Weise auf die Steuersignale und gibt weder Daten aus, noch nimmt es Daten entgegen. DTR stellt somit praktisch den Hauptschalter dar. Eine Deaktivierung von DTR oder auch DSR bricht die Verbindung ab. RI (Ring Indicator) Das Signal RI (Ring Indicator) zeigt dem DTE an, dass beim DCE ein Läutsignal eingeht. Das ist z.B. dann der Fall, wenn ein externes Computersystem das Modem über die Telefonleitung anwählt. Ein Modem kann das Signal RI aktivieren, auch wenn DTR inaktiv ist, d.h., dass RI unabhängig von DTR arbeitet. DSRD (Data Signal Rate Detector) Der 25-Pin-Anschluss kann zusätzlich noch ein Signal DSRD (Data Signal Rate Detector, Pin 23) übertragen, das ein Umschalten zwischen zwei verschiedenen Baudraten ermöglicht. Das Signal kann zwischen DTE und DCE in beiden Richtungen übergeben werden. Damit ist es z.B. möglich, dass das DTE das DCE anweist, eine hohe Baudrate zu wählen oder dass das DCE dem DTE die Baudrate des Übertragungskanals mitteilt. Die Verwendung der angegebenen fünf Steuersignale ist je nach Verbindungstyp unterschiedlich. In den folgenden Abschnitten möchte ich Ihnen die Bedeutung und Verwendung der Steuersignale für eine Simplex-, Halbduplex- und Vollduplex-Verbindung erläutern.
30.2.1 Simplex-Verbindung Prinzipiell sind hier zwei Möglichkeiten denkbar: Datenübertragung vom DTE zum DCE oder umgekehrt. Im ersten Fall überträgt ausschließlich das DTE über die Leitung TD Daten an ein DCE. Die Leitung RD ist nicht belegt. Das DCE verwendet RTS entweder nicht, oder das DTE hält das Signal RTS ständig aktiv. In gleicher Weise benutzt das DTE das Rückmeldesignal CTS vom DCE entweder nicht, oder das DCE hält CTS ständig auf einem aktiven Pegel. Das DCE gibt stets ein inaktives DCD-Signal aus, weil es Daten ausschließlich vom DTE empfangen und an das Ziel weitergeben, aber kein Datenträgersignal vom Ziel empfangen kann. DSR ist entweder stets aktiv oder wird aktiv, wenn das Ziel angewählt wird. Über DTR kann das DTE dem DCE seine Betriebsbereitschaft in der üblichen Weise anzeigen und das DCE aktivieren oder stilllegen. Das Signal RI hat bei dieser Simplexverbindung kaum eine Bedeutung, weil normalerweise ja der Sender den Empfänger anwählt. Trotzdem wäre es denkbar, dass das Ziel über das DCE durch das Signal RI das DTE auffordert, Daten zu übergeben. Ein Beispiel für eine solche Simplexverbindung ist die Ansteuerung eines Druckers über die
Sandini Bib Die serielle Schnittstelle
975
serielle Schnittstelle. Der Drucker reagiert dann nur mit Rückmeldesignalen (z.B. über DSR), um die Datenübertragung so zu steuern, dass sein interner Puffer nicht überläuft. Im zweiten Fall überträgt dagegen ausschließlich das DCE über die Leitung RD Daten an das DTE. Die Leitung TD ist nicht belegt. Das DCE verwendet RTS entweder nicht, oder das DTE hält das Signal RTS ständig aktiv. In gleicher Weise benutzt das DTE das Rückmeldesignal CTS vom DCE entweder nicht, oder das DCE hält CTS ständig auf einem aktiven Pegel. Das DCE kann ein aktives DCD-Signal ausgeben, weil es von einer externen Einheit ein Trägersignal erfassen und Daten an das DTE weitergeben kann. DSR ist entweder stets aktiv oder wird aktiv, wenn die externe Einheit bereit ist. Über DTR kann das DTE seine Bereitschaft anzeigen und das DCE in der üblichen Weise aktivieren oder stilllegen. Das Signal RI hat bei dieser Simplexverbindung wieder eine Bedeutung, weil die externe Einheit das DTE über das DCE anwählen kann.
30.2.2 Halbduplex-Verbindung Bei der Halbduplex-Verbindung können sowohl DTE als auch DCE als Sender und Empfänger fungieren, wobei aber nur eine einzige Datenleitung zur Verfügung steht, die abwechselnd von DTE und DCE benutzt werden kann. Die Leitungen TD und RD geben also abwechselnd in geordneter Weise Daten aus bzw. empfangen sie. Zur Verteilung der Rollen als Sender und Empfänger zwischen dem DTE und dem DCE dienen die Handshake-Steuersignale RTS und CTS.
Datenübertragung
Verbindungstrennung
Verbindungsaufbau
DTE und DCE einschalten
Wenn die Einheit DTE als Sender arbeiten möchte, aktiviert sie das Signal RTS und wartet auf die Bestätigung der anderen Einheit DCE über das CTS-Signal. Nun können Daten ausgetauscht werden, wobei das DTE als Sender und das DCE als Empfänger wirkt. Ansonsten kann das DCE als Sender und das DTE als Empfänger arbeiten. Das DCE kann ein aktives DCD-Signal ausgeben, weil die Datenübertragung zum DTE erfolgen kann. DSR ist entweder aktiv oder wird aktiv, wenn das Ziel angewählt wird.
DTR DSR RTS CTS TD
Abb. 30.4: Zeitlicher Verlauf der Signalpegel für eine Verbindung von DTE und DCE
Sandini Bib 976
Kapitel 30
Das Signal DTR zeigt in bekannter Weise die Betriebsbereitschaft des DTE an und aktiviert das DCE oder legt es still. Da bei einer Halbduplex-Verbindung die Übertragungsrichtung mit Hilfe der Signale RTS und CTS umgeschaltet werden kann, ist hier auch das Signal RI wieder von Bedeutung, um dem DTE anzuzeigen, dass eine externe Einheit über das DCE eine Verbindung zum DTE aufbauen möchte. Die Ausgabe und Annahme von Daten wird dann – in etwas umständlicher Weise – über RTS und CTS gesteuert. In Abbildung 30.4 sehen Sie den zeitlichen Verlauf der Signalpegel für eine Verbindung von DTE und DCE.
30.2.3 Vollduplex-Verbindung Modems sind in der Regel vollduplex-fähig und können Daten gleichzeitig in beiden Richtungen übertragen, DTE und DCE fungieren also simultan als Sender und Empfänger. Ob physikalisch auch tatsächlich zwei Datenleitungen vorhanden sind oder nur zwei getrennte logische Kanäle existieren, ist dabei unerheblich. Wichtig ist, dass keiner der beiden Sender (und gleichzeitig Empfänger) auf die Sendefreigabe durch den Partner warten muss. Die Signale RTS und CTS sind also ohne Bedeutung; RTS wird im Allgemeinen also entweder nicht benutzt oder ist wie CTS stets aktiv. Ferner ist auch das DSR-Signal bei den meisten Modems stets aktiv. Bei anderen DCEs ist DSR aber möglicherweise nur dann aktiv, wenn die Vorbereitungen zum Anwählen der Zieleinheit beendet sind. Das Signal DCD wird im Normalfall vom DCE nur dann aktiviert, wenn es ein Trägersignal von der Zieleinheit erfasst hat. Auch hier wirkt das Signal DTR als Hauptschalter, und RI zeigt an, dass eine externe Einheit über das DCE eine Verbindung mit dem DTE aufnehmen möchte. Eine Vollduplex-Verbindung ist recht praktisch, weil auf die Verteilung der Rollen als Sender und Empfänger keine Rücksicht zu nehmen ist. Das heißt, einerseits kann das Signal RTS stets aktiviert sein, und andererseits können die Signale CTS und DSR ignoriert werden. In den Abbildungen 30.5a bis 30.5f sehen Sie ein Beispiel für die verschiedenen Aktivierungen der Steuersignale, wenn über ein Vollduplex-Modem eine Anfrage an den PC eingeht. PC (DTE)
Modem (DCE) 13
13 25
25
inaktiv oder aktiv
RI
inaktiv
DCD DTR
inaktiv
DSR
inaktiv oder aktiv inaktiv oder aktiv
CTS
inaktiv oder aktiv
RTS RD TD 14 1
a: Ruhezustand von PC (DTE) und Modem (DCE) Abb. 30.5 (a): Anfrage über ein Vollduplex-Modem
14 1
Sandini Bib Die serielle Schnittstelle
977
PC (DTE)
Modem (DCE)
13
13 25
25
RI
RI
inaktiv oder aktiv
DCD DTR
inaktiv
DSR
inaktiv oder aktiv inaktiv oder aktiv
CTS
inaktiv oder aktiv
RTS RD TD 14
14 1
1
b: Eine externe Einheit möchte den PC über ein Modem anwählen. Das Modem aktiviert bei jedem Läuten das RI-Signal. PC (DTE)
Modem (DCE) 13
13 25
25
aktivieren
RI
inaktiv
DCD DTR
inaktiv
DSR
inaktiv oder aktiv inaktiv oder aktiv
CTS
inaktiv oder aktiv
RTS RD TD
14
14
1
1
c: Der PC erfasst RI und aktiviert DTR, um seine Bereitschaft anzuzeigen und das Modem für einen Datenaustausch zu aktivieren. Es wird angewiesen, den Anruf entgegenzunehmen und eine Verbindung zur anwählenden Einheit aufzunehmen. PC (DTE)
Modem (DCE)
13
13 25
25
aktiv
RI
inaktiv
DCD DTR
inaktiv
DSR
aktivieren inaktiv oder aktiv
CTS
inaktiv oder aktiv
RTS RD TD 14 1
14 1
d: Nachdem das Modem alle Vorbereitungen beendet hat, aktiviert es das Signal DSR und beginnt mit dem Aufbau der Verbindung zur anwählenden Einheit. Abb. 30.5 (b)-(d): Anfrage über ein Vollduplex-Modem (Forts.)
Sandini Bib 978
Kapitel 30
PC (DTE)
Modem (DCE) 13
13 25
25
inaktiv
RI
aktivieren
DCD DTR
aktiv
aktiv
DSR CTS
aktivieren
aktivieren
RTS RD TD
14
14 1
1
e: Ist die Verbindung zwischen Modem und anwählender Einheit aufgebaut, aktiviert das Modem das Signal DCD, um dem PC anzuzeigen, dass die Verbindung steht und der PC nun Daten entgegennehmen kann. Der PC aktiviert RTS, um Daten auszugeben, also einen bidirektionalen Datenaustausch ausführen zu können. Das Modem reagiert darauf mit einem CTS, um anzuzeigen, dass es zur Entgegennahme der Sendedaten vom PC bereit ist. PC (DTE)
Modem (DCE)
13
13 25
25
inaktiv
RI
aktiv
DCD DTR
aktiv
DSR
aktiv aktiv
CTS
aktiv
RTS RD
bidirektionaler Datenaustausch
TD 14
14
1
1
f: Der PC gibt über das Modem Daten an die angewählte Einheit aus oder nimmt Daten von ihr entgegen, bis durch eine Deaktivierung von DCD, DSR oder DTR die Verbindung abgebrochen wird. Abb. 30.5 (e)-(f): Anfrage über ein Vollduplex-Modem (Forts.)
30.2.4 RS-232C-Logikpegel und Übertragungsraten Im Gegensatz zu den normalerweise im PC-Bereich verwendeten Logiksignalen sind die RS232C-Signale bipolar. Das bedeutet, dass nicht ein Pegel von 0 V, der der Masse GND entspricht, den logisch niedrigen Pegel angibt, sondern ein negativer Spannungswert. Eine »1« wird also gegenüber der Masse als positive Spannung, eine »0« als negative Spannung dargestellt. Für Ausgangssignale liegt der Spannungswert für eine »1« zwischen +5 V und +15 V, für eine »0« zwischen -5 V und -15 V. Bei Eingangssignalen wird eine »1« durch eine Spannung zwischen +3 V und +15 V und eine »0« durch eine Spannung zwischen -3 V und -15 V dargestellt. Diese Werte werden als EIA-Signalpe-
Sandini Bib Die serielle Schnittstelle
979
gel bezeichnet. Das recht große Spannungsspektrum für die Logikwerte und die mit maximal ±15 V relativ große Spannung erlauben eine störungsfreie Signalübertragung auch über große Entfernungen. Bei der parallelen Schnittstelle wurde eine »1« durch eine Spannung von ca. +5 V und eine »0« durch eine Spannung von 0 V dargestellt. Der Unterschied zwischen »0« und »1« ist bei einer RS-232C-Schnittstelle also bis zu sechsmal größer als bei einer parallelen Schnittstelle. Weil die Netzteile in Personal Computern nur Spannungspegel von ±5 V und ±12 V liefern, gibt die hier installierte serielle Schnittstelle aber nur Spannungen von maximal ±12 V ab.
30.3 Typische Verbindungen – Nullmodem Aus der oben angeführten Beschreibung der seriellen Schnittstelle ist zu erkennen, dass RS-232C zunächst auf ein Modem als DCE zielt. Wenn Sie einen seriellen Drucker oder ein anderes PCPeripheriegerät mit serieller Schnittstelle, wie z.B. einen Plotter, mit Ihrer RS-232C verbinden, stellen die Peripheriegeräte ein DTE und nicht ein DCE dar. Dieses DTE wird also von einer Druckersteuerung gebildet. Die Signale DCD und RI sind auf der PC-Seite völlig und auch für die meisten anderen Signale gelten andere Interpretationen. In Abbildung 30.6 sehen Sie eine typische Verbindung zwischen der seriellen Schnittstelle eines PC und einem Drucker. Statt eines Druckers können Sie sich auch eine andere serielle Einheit, wie eben einen Plotter oder ein Messgerät mit serieller Schnittstelle, vorstellen. Eine übliche RS232-Maus verwendet die serielle Schnittstelle im Übrigen auf eine abweichende Art und Weise und firmiert daher auch nicht unter einer typischen DTE. 13
13 25
25
Signalmasse DSR
DCD DTR DSR
CTS
CTS
RTS
RTS RD
TD 14 1
14 1
Abb. 30.6: Verbindung serielle Schnittstelle – Drucker: Weil ein Drucker kein DCE darstellt, müssen verschiedene Steuer- und Statusleitungen miteinander verbunden oder vertauscht werden, um das Verhalten eines DCE zu emulieren.
Die Sendedaten des PC werden zu Empfangsdaten des Druckers. Bei seriellen Druckerkabeln ist daher die Leitung TD vom PC mit dem Pin RD des Druckersteckers verbunden. Auf der PCSeite werden RTS und CTS miteinander verbunden, so dass eine Sendeforderung des PC sofort zu einer Sendefreigabe führt. Drucker können schließlich keine Daten ausgeben; es handelt sich um das Paradebeispiel einer Simplex-Verbindung vom PC zum Drucker. Der Drucker weigert sich als DTE aus Gründen der RS-232C-Kompatibilität, etwas auszudrucken, solange an den Eingängen CTS, DSR und DCD nicht ein aktives Signal anliegt. Das wird auf einfache Weise durch eine Verbindung von RTS mit CTS und eine Verbindung von DTR mit DCD und DSR gelöst. Eine Aktivierung von RTS führt also unmittelbar zu einer Aktivierung von CTS und eine Aktivierung von DTR zu einer Aktivierung von DCD und DSR.
Sandini Bib 980
Kapitel 30
Das Hauptproblem ist aber, dass der PC Daten viel schneller übergeben kann, als der Drucker sie ausdruckt, der interne Druckerpuffer ist also irgendwann voll. Bei der parallelen Schnittstelle wird das Problem einfach gelöst, indem der Drucker das Signal BUSY aktiviert und dem PC auf diese Weise anzeigt, dass er vorläufig keine weiteren Daten übernehmen kann. Im Gegensatz dazu ist die serielle Schnittstelle aber nicht auf die Bedienung eines Druckers ausgerichtet. Hier hilft also nur ein kleiner Trick: Der Drucker verwendet z.B. den für einen asynchronen Datenaustausch nicht benutzten Anschluss 19 zur Ausgabe eines »Puffer-voll-Signals«. Auf der PC-Seite bietet sich als Eingang der Anschluss DSR an, weil nach der RS-232C-Norm das Signal DSR vom DCE dem DTE mitteilt, ob das Ziel bereit ist, Daten zu übernehmen. Wenn der Druckerpuffer voll ist, deaktiviert der Drucker einfach das Handshake-Signal am Pin 19, und das DTE weiß, dass es vorläufig keine weiteren Daten übergeben kann. Ist im Puffer wieder genügend Platz frei, aktiviert der Drucker das Signal wieder, und der PC kann weitere Daten an den Drucker übergeben. Die meisten, aber leider nicht alle Drucker mit serieller Schnittstelle geben über den Pin 19 ein solches »Puffer-voll-Signal« aus. Sollte sich ein Drucker oder eine andere Peripherie stur weigern, etwas auszudrucken, obwohl sie an der richtigen Schnittstelle angeschlossen ist und die Verbindung auch sonst in Ordnung ist, liegt die Ursache wahrscheinlich in einer anderen Verwendung der RS-232C-Anschlüsse. Konsultieren Sie in diesem Fall Ihr Druckerhandbuch, oder benutzen Sie ein Druckerkabel, das der Druckerhersteller zum entsprechenden Drucker liefert. Kabel für den Anschluss eines Druckers mit serieller Schnittstelle sind also in keinem Fall RS232C-Schnittstellenkabel. Wenn Sie an Ihren PC ein »richtiges« RS-232C-DCE anschließen möchten, dürfen Sie kein Druckerkabel verwenden, sondern müssen ein genormtes RS-232C-Kabel benutzen. 13
13 25
25
RI
RI
DCD
DTR Common
DCD
DTR Common
DSR CTS
DSR CTS
RTS RD
RTS RD
TD
TD
14
5 9
6 1
14 1
1
RI CTS DSR
Common DTR TD RD
Common DTR
RTS
DCD
TD RTS RD DCD
5
RI CTS DSR
9
6 1
Abb. 30.7: Ein Nullmodem dient zum Datenaustausch zwischen zwei DTE. Entsprechend kompliziert wird die Verdrahtung.
Eine weitere nicht standardmäßige, aber dennoch interessante Einsatzmöglichkeit für die serielle Schnittstelle ist die Verbindung zwischen zwei Computern, um Daten zwischen ihnen austauschen zu können. Eine direkte Verwendung von normalen seriellen Schnittstellenkabeln scheidet aber von vornherein aus, weil beide Schnittstellen als DTE konfiguriert sind, so dass am zweiten PC nicht einmal der Stecker passt. Ein weiteres Problem ist außerdem, dass z.B. TD auf TD, RD auf RD, DTR auf DTR etc. trifft; es sind also Ausgänge mit Ausgängen und Eingänge mit Eingän-
Sandini Bib Die serielle Schnittstelle
981
gen verbunden. Damit ist natürlich keine Datenübertragung möglich. Weil beide Computer gleichberechtigt sein sollen, hilft nur ein Trick bei der Verkabelung. In Abbildung 30.7 ist das Prinzip für ein Nullmodem dargestellt. Nullmodem bedeutet gewissermaßen, dass eben kein Modem angeschlossen wird. Die Sendedaten des einen PC sollen natürlich die Empfangsdaten des anderen Computers darstellen. Es ist also notwendig, die TD- und RD-Leitungen zu kreuzen. Auf diese Weise werden die Sendedaten des einen PC zu Empfangsdaten des anderen PC und umgekehrt. Auch bei einer normalen RS-232C-Verbindung zwischen einem DTE und einem DCE sind die Sendedaten des DTE Empfangsdaten für das DCE und umgekehrt. Nur ist dort keine Kreuzung der Leitungen notwendig, weil die DCE-Schnittstelle intern die über TD einlaufenden Daten als Empfangsdaten verarbeitet und Sendedaten auf die Leitung RD ausgibt. Hier haben wird es aber mit zwei DTEs zu tun, nicht mit der Kombination DTE/DCE (PC und Modem). Die anderen Verbindungen erfüllen die RS-232C-Vorgaben für die Steuersignale einer Datenübertragung. Aus der Abbildung 30.7 ist zu erkennen, dass die Aktivierung von RTS, um eine Datenübergabe zu starten, zu einer Aktivierung von CTS beim selben DTE und zur Aktivierung von DCD beim anderen DTE führt. Dadurch wird eine Datenverbindung simuliert, wie sie normalerweise z.B. zwischen einem DCE und einer externen Einheit stattfindet. Außerdem ergibt eine Aktivierung von DTR die Anhebung von DSR und RI beim anderen DTE, so dass dort ein »Anruf« registriert wird. Durch die in Abbildung 30.7 angegebene Verdrahtung wird für jedes DTE simuliert, dass sich am Ende der Leitung ein DCE befindet, obwohl es sich in Wirklichkeit um eine Verbindung zwischen zwei DTEs handelt. Im Prinzip würde es genügen, einen Steuerausgang des einen DTE, z.B. RTS, mit einem Steuereingang des anderen DTE, z.B. CTS, zu verbinden und die Datenleitungen zu kreuzen. Die beiden Programme, die die DTEs auf beiden Seiten bedienen, müssen nur geeignet konstruiert sein, um zu erkennen, wann das Ziel-DTE empfangsbereit ist. Der Vorteil der in Abbildung 30.7 angegebenen Verdrahtung besteht darin, dass sich die Steuersignale streng an die RS-232C-Vorgabe halten. Das Nullmodem kann also mit PC-üblichen Funktionen und Programmen betrieben werden, während sonst ein gesondertes Programm notwendig ist. Ein Paradebeispiel hierfür sind Mäuse, die an eine serielle Schnittstelle angeschlossen werden. Für ihre Einbindung in das PC-System benötigen Sie einen gesonderten Maustreiber, weil sich die Mauselektronik in keiner Weise um die RS-232C-Spezifikation kümmert. Die Maus benutzt zur Signalübergabe nur die Leitung RD. Alle anderen Leitungen sind deaktiviert, d.h., sie liegen auf einem niedrigen Pegel. Der entspricht aber für die DTR- und RTS-Leitung vom PC einer Spannung von -12 V, die die Maus für ihre Stromversorgung verwendet. Hier werden also RS-232C-Steuerleitungen zur Stromversorgung eines Peripheriegeräts benutzt. Mit einem Nullmodem ist es z.B. möglich, von Ihrem Arbeitsplatz aus einen zweiten PC zu steuern. Dies kann bereits mit dem DOS-Befehl CTTY praktiziert werden. Wenn Sie auf dem zweiten PC den Befehl CTTY COM1 eingeben, liest er alle Befehle von der ersten seriellen Schnittstelle ein und gibt alle Ausgaben statt an den Bildschirm an COM1 aus. Mit anderen Worten: Wird COM1 zur Standardein- und Standardausgabeeinheit. Programme, die DOS umgehen und z.B. direkt auf den Tastaturpuffer oder den Bildschirmspeicher zugreifen, arbeiten dann aber nicht mehr korrekt. Sie können mit einem Nullmodem und CTTY auf diese Weise aber immerhin von Ihrem Arbeitsplatz aus mit den gewöhnlichen DOS-Befehlen wie DIR oder COPY auf einem zweiten PC arbeiten. Eine Rückmeldung erhalten Sie aber nur, wenn Ihr Arbeitsplatzrechner Daten von der seriellen Schnittstelle empfangen und auch (z.B. in einem Fenster) darstellen kann. Ansonsten verschluckt die serielle Schnittstelle ganz einfach die vom zweiten PC einlaufenden Meldungen. Spezielle Programme, wie z.B. PC Anywhere oder der Remote-Access-
Sandini Bib 982
Kapitel 30
Dienst von Windows NT, lösen dieses Problem, indem sie alle Bildschirmzugriffe auf die serielle Schnittstelle umleiten und alle Eingaben statt von der Tastatur oder Maus von der seriellen Schnittstelle erwarten.
30.4 Universal Asynchronous Receiver and Transmitter – UART Im PC ist für die vielschichtigen Funktionen der seriellen Schnittstelle (wie z.B. die Umwandlung paralleler Daten vom Systembus in serielle Daten mit einer bestimmten Baudrate, die Rückgewinnung der parallelen Daten aus den seriellen Daten etc.) ein spezieller Chip vorgesehen: ein Chip vom Typ UART 8250, UART 16450 oder auch ein hierzu kompatibler Chip, der im Chipset auf dem Mainboard integriert ist. UART ist die Abkürzung für Universal Asynchronous Receiver and Transmitter. Der Name umreißt bereits die Aufgabe und Funktion des Bausteins. Er dient als programmierbarer und somit universeller Empfänger und Sender für eine asynchrone Datenübertragung. Die Version 8250 wurde im ursprünglichen PC/XT verwendet, und bereits ab dem AT findet man nur noch den verbesserten 16450 oder den 82450. Die Urversion 8250 weist einen Fehler auf, der dazu führt, dass nach einer Abfrage der Schnittstelle ein Interrupt ausgelöst wird, obwohl kein Anlass dazu besteht. Bekannte Bugs sind ungefährlich, und diese grundlosen Interrupts werden daher vom PC/XT-BIOS ignoriert. Bei der ersten Nachfolgeversion 8250A wurde dieser Fehler bereinigt, wobei aber leider das PC/XT-BIOS, das einen grundlosen Interrupt erwartet, nicht mehr korrekt mit dem 8250A zusammenarbeitet. Beim zweiten Nachfolger 8250B wurde zwar der Fehler behoben, der 8250B löst aber in analoger Weise wie der 8250 einen grundlosen Interrupt aus, um eine Kompatibilität zu wahren. Welche seltsamen Blüten der unbedingte Drang zur Kompatibilität treibt, können Sie hier in eindrucksvoller Weise sehen: Aus Kompatibilitätsgründen wird ein fehlerbereinigter Chip nachträglich mit dem behobenen Fehler ausgestattet. Der 8250 erlaubte eine maximale Übertragungsrate von 9600 Baud. Der verbesserte Nachfolger 16450 kann dagegen bis zu 115.200 Baud verkraften. Für eine schnellere serielle Kommunikation wird ein 16550-UART-Chip verwendet. Er stimmt bis auf seinen integrierten FIFO-Puffer, der einlaufende und ausgehende Daten puffert, vollständig mit dem 16450 überein. Das ermöglicht eine bessere Entkopplung der seriellen Schnittstelle von der Bedienung durch das Betriebssystem. Laufen manche Zeichen schneller ein, als sie vom Interrupt Handler für die betreffende Schnittstelle abgeholt werden können (weil beispielsweise das Betriebssystem mit anderen zeitkritischen Aufgaben beschäftigt ist und die IRQs maskiert hat), speichert der FIFO die Zeichen einfach zwischen und übergibt sie dem System später. Damit treten Zeichenüberläufe seltener auf. Die Programmierung des 16550 stimmt aber mit der für einen 8250/16450 völlig überein.
30.4.1 Anschlüsse und Signale Der UART 8250/16450/16550 wird in einem DIP-Gehäuse mit 40 Pins ausgeliefert. In Abbildung 30.8 ist seine Anschlussbelegung gezeigt. A2–A0 (I) Anschlüsse 26–28 Die drei Adress- oder Registerauswahlsignale bestimmen das Register, auf das die CPU lesend oder schreibend zugreift. Beachten Sie, dass für einen Zugriff auf das Teiler-Latch-Register auch das DLAB-Bit gesetzt sein muss (siehe auch Tabelle 30.3).
Sandini Bib Die serielle Schnittstelle
D0
983
40
1
Vcc
D1
RI
D2
DCD
D3
DSR
D4
CTS
D5
MR
D6
OUT1
D7
DTR
RCLK
RTS
8250/ 16450 UART
SIN SOUT CS0
OUT2 INTR
CS1
A0
CS2
A1
BAUDOUT
A2
XTAL1
AS
XTAL2
CSOUT
DOUTS
DDIS
DOUTS GND
IRQ
frei
DINS 20
21
DINS
Abb. 30.8: Anschlussbelegung des UART 8250/16450/16550: Der UART ist das Herz der seriellen Schnittstelle im PC. Üblicherweise sind BAUDOUT und RCLK miteinander verbunden, Sender und Empfänger arbeiten also mit derselben Baudrate. Der INTR-Ausgang wird durch ein Gatter mit OUT2 verknüpft.
AS (I) Anschluss 25 Ein aktives Address-Strobe-Signal AS mit niedrigem Pegel zeigt die Gültigkeit der Adresssignale A0 bis A2 und der Chip-Auswahlsignale CS0 bis CS2 an. BAUDOUT (O) Anschluss 15 Der Pin gibt ein Signal mit der 16-fachen Frequenz der Sendebaudrate ab. Wenn BAUDOUT mit RCLK verbunden wird, arbeiten Sender und Empfänger mit derselben Baudrate. CS0, CS1, CS2 (I, I, I) Anschlüsse 12 bis 14 Wenn CS0 und CS1 auf hohem Pegel und CS2 auf niedrigem Pegel liegen, ist der UART von der CPU ausgewählt worden, um Daten von oder zur CPU zu übertragen. CSOUT (O) Anschluss 24 Ist das Signal an diesem Chip-Select-Out-Anschluss auf einem hohen Pegel, hat die CPU den UART durch CS0, CS1 und CS2 ausgewählt. CTS (I) Anschluss 36 Dem Clear-to-Send-Anschluss wird ein aktiv niedriges Signal entsprechend dem Zustand der CTS-Leitung zugeführt. D0–D7 (I/O) Anschlüsse 1 bis 8 Die acht Pins stellen den bidirektionalen Datenbus zwischen CPU und 8250/16450/16550 dar, über den Daten, Steuerworte und Statusinformationen übergeben werden.
Sandini Bib 984
Kapitel 30
DCD (I) Anschluss 38 Dem Data-Carrier-Detect-Anschluss wird ein aktiv niedriges Signal entsprechend dem Zustand der DCD-Leitung zugeführt. DDIS (O) Anschluss 23 Wenn die CPU Daten aus dem UART liest, wird der Pegel an diesem Pin niedrig. Dadurch kann z.B. ein Endverstärker zwischen UART und Datenbus abgeschaltet werden, wenn die CPU keine Daten liest. DINS, DINS (I, I) Anschlüsse 21, 22 Wenn DINS auf einem niedrigen oder DINS auf einem hohen Pegel liegt, kann die CPU Daten oder Statusworte aus den internen Registern des UART lesen. DOUTS, DOUTS (O, O) Anschlüsse 18, 19 Wenn DOUTS ein niedriger oder DOUTS ein hoher Pegel zugeführt wird, kann die CPU Daten oder Steuerworte in interne Register des UART schreiben. DSR (I) Anschluss 37 Dem Data-Set-Ready-Anschluss wird ein aktiv niedriges Signal entsprechend dem Zustand der DSR-Leitung zugeführt. DTR (O) Anschluss 33 Der Data-Terminal-Ready-Anschluss gibt ein aktiv niedriges Signal entsprechend dem DTR-Bit im Modemsteuerregister ab. INTR (O) Anschluss 30 Der UART hebt dieses Signal auf einen hohen Pegel an, wenn er eine Interrupt-Bedingung erkannt hat und das betreffende Bit im Interrupt-Aktivierungsregister gesetzt ist. MR (I) Anschluss 35 Wird an diesen Master-Reset-Pin ein Signal mit hohem Pegel angelegt, so führt der UART eine Rückstellung aller Register mit Ausnahme des Empfangspuffers, des Senderhalteregisters und des Teiler-Latch-Registers aus. OUT1 (O) Anschluss 34 Der Pin kann prinzipiell frei programmiert werden. OUT2 (O) Anschluss 31 Der Anschluss kann frei programmiert werden. Im PC wird OUT2 über ein Logikgatter als Master-Interrupt-Aktivierung verwendet.
Sandini Bib Die serielle Schnittstelle
985
RCLK (I) Anschluss 9 Dem Receiver-Clock-Anschluss wird das 16-fache der Empfängerbaudrate zugeführt. RI (I) Anschluss 39 Dem Ring-Indicator-Anschluss wird ein aktiv niedriges Signal entsprechend dem Zustand der RI-Leitung zugeführt. RTS (O) Anschluss 32 Der Request-to-Send-Anschluss gibt ein aktiv niedriges Signal entsprechend dem RTS-Bit im Modemsteuerregister ab. SIN (I) Anschluss 10 Dem Serial-In-Pin werden die seriellen Empfangsdaten zugeführt. SOUT (O) Anschluss 11 Der Serial-Out-Anschluss gibt die seriellen Sendedaten ab. XTAL1, XTAL2 Anschlüsse 16, 17 An die beiden Pins wird entweder ein externer Schwingkristall oder ein externer Oszillator angeschlossen, der die Hauptbezugsfrequenz des UART bestimmt. Vcc (I) Anschluss 40 Dem Pin wird die Versorgungsspannung (üblicherweise +5 V) zugeführt. GND Anschluss 20 Dem Anschluss wird das Massepotenzial (üblicherweise 0 V) zugeführt. Die RS-232C-Steuersignale werden vom UART 8250/16450/16550 in invertierter, die seriellen Datensignale SIN und SOUT dagegen in »normaler« Form ausgegeben bzw. verarbeitet. Der Chip wird außerdem nur mit einer Spannung Vcc von +5 V versorgt, so dass ein EIA-Pegel von ±12 V mit dem UART allein nicht möglich ist. Aufgrund beider Tatsachen sind dem UART noch so genannte EIA-Leitungsverstärker nachgeschaltet, die zum einen die Signale vom oder zum UART so verstärken, dass ausgangsseitig die EIA-Pegel von ±12 V zur Verfügung stehen und die einlaufenden Signale auf 0 V oder +5 V gelegt werden. Zum anderen sind die Verstärker als Inverter ausgelegt, so dass am 9- oder 25-Pin-Stecker des Adapters auch tatsächlich Signale vorhanden sind, die den Bitwerten in den Steuer- und Statusregistern entsprechen. Wenn Sie mit einem Spannungsmessgerät die Potenziale an den RS-232C-Pins einer seriellen Schnittstelle untersuchen, werden Sie feststellen, dass ein logisch niedriger Pegel der Steuer- und Statussignale durch eine Spannung von ca. -12 V und ein logisch hoher Pegel durch eine Spannung von ca. +12 V dargestellt wird. Dagegen gibt eine Spannung von -12 V der Leitungen TD und RD einen Mark-Zustand der seriellen Daten und eine Spannung von +12 V einen Space-
Sandini Bib 986
Kapitel 30
Zustand an. Auch SIN und SOUT werden also über Inverterschaltkreise geführt, nur werden die Signale vom UART nicht in komplementierter Form ausgegeben bzw. angenommen, so dass die beschriebenen Unterschiede zwischen Steuer- und Statussignalen auf der einen und den seriellen Daten auf der anderen Seite auftreten. Eine Besonderheit beim Einsatz des UART im PC ist, dass das Ausgangssignal OUT2 über ein Logikgatter mit dem INTR-Ausgangssignal verknüpft wird (siehe Abbildung 30.8). Auf diese Weise haben die IBM-Konstrukteure eine Art Master-Interrupt-Aktivierungsbit OUT2 im Modemsteuerregister geschaffen: Ist OUT2 gelöscht, werden global alle Interrupts des UART gesperrt; ist OUT2 gesetzt, werden die individuellen Interrupt-Quellen freigegeben. Damit können bei kritischen Programmsequenzen die Interrupt-Anforderungen des UART gesperrt werden, ohne die Interrupt-Maske zu zerstören.
30.4.2 Aufbau und Funktionsweise Der UART 8250/16450/16550 hat eine ganze Reihe von Funktionen auszuführen und ist daher auch ein recht komplexer Baustein. In Abbildung 30.9 ist ein Blockschaltbild seines Aufbaus angegeben. Wie zu erkennen ist, unterscheiden sich diese drei UARTs in ihrem inneren Aufbau kaum voneinander; einen FIFO für das Empfängerpuffer- und das Senderhalteregister weist jedoch nur der 16550-Typ auf. Adressdekoder/ Steuerlogik
Steuerlogik
Empfängerpufferregister (+FIFO)
Empfängerschieberegister
Datenformatregister
Empfängersteuerung
Teiler-LatchRegister (LSB) Teiler-LatchRegister (MSB)
Baudratengenerator
interner Bus
Datenbuspuffer
PC-Schnittstelle
Interrupt-Aktiv.Register
RCLK
BAUDOUT
Modemsteuerregister Modemsteuerlogik
Modemstatusregister
SIN
IRQSteuerlogik
RTS CTS DTR DSR DCD RI OUT1 OUT2 INTRPT
Interrupt-IDRegister Scratch-PadRegister
Abb. 30.9: UART-Blockschaltbild
Serialisierungsstatusregister
Sendersteuerung
Senderhalteregister (+FIFO)
Senderschieberegister
SOUT
Sandini Bib Die serielle Schnittstelle
987
Eine Besonderheit des 8250/16450/16550 ist, dass Sender und Empfänger auf dem Chip mit unterschiedlichen Baudraten betrieben werden können. Der UART erzeugt im Baudgenerator aus der Hauptbezugsfrequenz, die entweder extern zugeführt oder intern mit Hilfe des Quarzes an den Eingängen XTAL1 und XTAL2 gebildet wird, durch Teilung mit dem Divisior, der als 16Bit-Wert im Teiler-Latch-Register abgelegt ist, zunächst die Bezugsfrequenz für die Baudrate. Diese Bezugsfrequenz wird als komplementiertes Signal am Pin BAUDOUT abgegeben. Über eine weitere Teilung der Bezugsfrequenz durch 16 ermittelt der UART schließlich die Sendebaudrate. Im PC wird die Hauptbezugsfrequenz von einem externen Schwingkreis erzeugt und beträgt 1,8432 MHz. Sinn und Zweck des Faktors 16 erfahren Sie weiter unten. Im Gegensatz dazu wird die Empfangsbaudrate extern erzeugt und dem Anschluss RCLK als 16-facher Wert zugeführt. Wenn man den Ausgang BAUDOUT mit dem Eingang RCLK verbindet, wie das im PC auch tatsächlich der Fall ist, arbeiten Sender und Empfänger im UART mit derselben Baudrate. Die Trennung von Sende- und Empfangsbaudrate ist z.B. dort nützlich, wo die Datenübertragung mit hoher Geschwindigkeit erfolgen soll, der Rückkanal für Steuersignale vom Empfänger aber mit wesentlich niedrigerer Rate betrieben wird. Es ist dann möglich, das Signal BAUDOUT weiterzuverarbeiten und z.B. durch einen Faktor 100 zu teilen, bevor man es dem Eingang RCLK zuführt. Alternativ kann RCLK auch von einem externen Schwingkreis gespeist werden. Im PC ist BAUDOUT aber wie gesagt unmittelbar mit RCLK verbunden, wie es in Abbildung 30.8 auf der linken Seite angedeutet ist. Die Empfängersteuerung erfasst und trennt das Startbit, das Paritätsbit (falls eines existiert) und das oder die Stoppbits von den Datenbits ab, die über den Eingang SIN in das Empfängerschieberegister einlaufen, und regelt außerdem die Zusammensetzung eines Datenbytes aus den extrahierten seriellen Datenbits. Hat das Empfängerschieberegister alle Datenbits aufgenommen, wird das gesamte Datenbyte an das Empfängerpufferregister (8250/16450) oder ein FIFO-Register im Empfängerpufferregister (16550) weitergegeben. Beträgt die Datenlänge acht Bit, so gibt es keine Probleme. Komplizierter wird die Sache, wenn die Daten sieben, sechs oder sogar nur fünf Bit lang sind. Die entsprechenden höherwertigen ein, zwei oder drei Datenbits sind dann nicht definiert und können vollkommen zufällige Werte annehmen. Wenn Daten mit einer Übertragungslänge von weniger als acht Bit aus dem Empfängerpufferregister gelesen werden sollen, sind daher die entsprechenden höherwertigen Datenbits zu maskieren. Auf der Senderseite gibt das Senderschieberegister unter der Kontrolle der Sendersteuerung die einzelnen Datenbits mit der programmierten Sendebaudrate am Ausgang SOUT ab. Die Sendersteuerung fügt dabei automatisch das Startbit, gegebenenfalls das Paritätsbit und das oder die Stoppbits in den seriellen Datenstrom mit ein. Ist das Senderschieberegister leer, lädt die Steuerung das nächste zu übertragende Datenbyte aus dem Senderhalteregister – wenn dort noch eines vorhanden ist – in das Senderschieberegister und gibt es über SOUT aus. Sind im Senderschieberegister keine Sendedaten vorhanden, hält die Sendersteuerung den Ausgang SOUT auf dem Mark-Zustand. Die Modemsteuerlogik gibt RS-232C-Steuersignale aus und nimmt sie entgegen. Die IRQ-Steuerlogik erfasst Änderungen der RS-232C-Steuerleitungen, den Status von Empfängerpuffer- und Senderhalteregister, den Zustand der Verbindungsleitung zum Übertragungspartner und mögliche Übertragungsfehler. Je nach programmierter Interrupt-Aktivierungsmaske hebt die IRQ-Logik dann den INTRPT-Ausgang an, um einen Hardware-Interrupt zu erzeugen, und trägt die Interrupt-Ursache in das Interrupt-ID-Register ein. COM1 ist üblicherweise auf IRQ4 und COM2 auf IRQ3 geschaltet. Baudgenerator, Modemsteuerlogik, IRQ-Steuerlogik und die Empfängersteuerung können über die beiden Teiler-Latch-Register mit dem höherwertigen (MSB) und niederwertigen (LSB) Teilerbyte, das Modemsteuerregister, das Interrupt-Aktivierungsregister und das Datenformatregister konfiguriert und gesteuert werden. Umgekehrt ist über das Modemstatusregister, das InterruptID-Register und das Datenformatregister der Zustand dieser Baugruppen abzurufen.
Sandini Bib 988
Kapitel 30
Die empfangenen Daten lassen sich durch einen einfachen IN-Befehl aus dem Empfängerpufferregister entnehmen, so dass Platz für das nächste Datenbyte ist. In ähnlicher Weise kann man durch einen OUT-Befehl ein zu übertragendes Datenbyte in das Senderhalteregister schreiben, das dann automatisch zum Senderschieberegister übertragen und über SOUT als serieller Datenstrom ausgegeben wird. Der 16450/16550 besitzt zusätzlich ein Scratch-Pad-Register, das im UART keine Bedeutung hat und von einem Programmierer als Zwischenspeicher für ein Datenbyte benutzt werden kann. Der Wert im Scratch-Pad-Register hat keinerlei Auswirkungen auf das Verhalten des 16450/16550. Alle Register sind über einen internen Datenbus miteinander und über einen Datenbuspuffer mit dem PC-Systembus verbunden. Diese können durch die Port-Befehle IN und OUT gelesen oder geschrieben werden. Insgesamt verfügt der UART über elf Register. Zur Adressierung stehen die drei Adressbits A2 bis A0 zur Verfügung, mit deren Hilfe aber nur acht verschiedene Register adressiert werden können. Die Lösung dieses Problems ist einfach: Das höchstwertige Bit DLAB im Datenformatregister (siehe Abbildung 30.14) gibt an, ob die Adressen 000b und 001b die beiden Teiler-LatchRegister oder das Empfängerpufferregister bzw. das Interrupt-Aktivierungsregister bedeuten. Außerdem greifen ein IN-Befehl für die Adresse 000b automatisch auf das Empfängerpufferregister und ein OUT-Befehl für diese Adresse auf das Senderhalteregister zu. Damit können alle elf Register adressiert werden. Startbit-Erfassung
Mitte des Startbit
Erhebliche Schwierigkeiten bei der asynchronen Datenübertragung bereitet die zuverlässige Erfassung des Startbits, das jede SDU einleitet. Der Wert des Startbit beträgt stets 0, eine SDU wird also durch einen Abfall des Logikpegels von »1« auf »0« eingeleitet. Anhand von Abbildung 30.10, die eine SDU mit einem Startbit, sieben Datenbits, einem Paritätsbit für ungerade Parität und einem Stoppbit zeigt, möchte ich hier noch die Erfassung des Startbits und den damit zusammenhängenden Faktor 16 etwas näher erläutern.
8 Takte
8 Takte
1
0
1
1
0
7 Datenbits
1
1
0
1
1 Stopbit
1 Startbit
0
1 Paritätsbit
16 Takte
Abb. 30.10: Die Erfassung des Startbits: Die Bits werden mit dem 16-fachen der Baudrate abgetastet, um die Datenerfassung sicherer zu machen.
Sandini Bib Die serielle Schnittstelle
989
Wie ich bereits erwähnt habe, wird ein Startbit durch einen Abfall des Logikpegels auf Null eingeleitet, also durch einen Übergang von Mark zu Space. Dieser Abfall dient als Triggerimpuls für eine interne Schaltung, die den Empfänger des UART startet. Man könnte nun erwarten, dass die so gestartete Schaltung in gleichmäßigen Zeitabständen, die der programmierten Baudrate entsprechen, den einlaufenden Signalstrom abtastet, um die Bitwerte zurückzugewinnen. Aus der Abbildung geht hervor, dass die Abtastung der einzelnen Bits am besten in der Mitte eines jeden Bitimpulses stattfinden sollte. Anders ausgedrückt, soll der Empfänger nach der Erfassung der abfallenden Flanke des Startbits eineinhalb Bits warten, bis er das erste Datenbit abtastet. Die Signalform in Abbildung 30.10 ist idealisiert dargestellt, d.h., dass vor allem die Signalflanken häufig stark »verschmiert« sind, und gerade die erste Signalflanke ist für die Erfassung des Startbits wesentlich. Eine stark verschmierte Flanke, die möglicherweise bis an die Mitte des Startbits heranreicht – und das ist vor allem bei hohen Baudraten durchaus möglich – kann also zu erheblichen Schwierigkeiten bei der nachfolgenden Erkennung der Datenbits führen. Ein weiteres Problem sind kurzzeitige Störungen auf der Übertragungsleitung, die sich in kurzen Impulsen äußern und dem UART auf diese Weise ein Startbit vorgaukeln, wo gar keines vorhanden ist. Das Problem lässt sich einfach, aber genial lösen: Der serielle Datenstrom am Anschluss SIN wird nicht mit einer Frequenz entsprechend der Baudrate abgetastet, sondern mit dem 16-fachen dieser Rate. Anders ausgedrückt: Jedes einzelne SDU-Bit wird nicht nur einmal, sondern gleich 16-mal abgetastet, und der Mittelwert aller 16 Abtastungen ergibt den Wert des betreffenden Bits. Dadurch können sogar aus stark gestörten Signalen die einzelnen Bits fehlerfrei wiedergewonnen werden. Das gilt natürlich auch für das Startbit. In Abbildung 30.10 ist das Startbit vergrößert dargestellt. Wenn das Signal auf einen Pegel »0« abfällt, wird durch diesen Triggerimpuls im UART eine Synchronisationsschaltung gestartet. Diese Schaltung wartet nun aber zunächst acht Abtastzyklen ab; wir befinden uns also nun theoretisch genau in der Mitte des Startbits. Selbst wenn die Flanke des Startbits nicht besonders gut ausgeprägt ist, kann auf diese Weise die Mitte des Startbits viel genauer ermittelt werden, als wenn die Schaltung nur eine Zeitspanne wartet, die einem halben SDU-Bit entspricht. Nach acht Abtastzyklen, also in der Mitte des Startbits, wo das Signal am eindeutigsten sein sollte, erfasst die Synchronisationsschaltung den Signalpegel erneut. Liegt er immer noch auf Null, so handelt es sich um ein richtiges Startbit: Die Synchronisationsschaltung startet den Empfänger, der den seriellen Datenstrom nun mit dem 16-fachen der Baudrate abtastet und die einzelnen SDU-Bits ermittelt. Ist der Signalpegel bei der zweiten Abtastung in der Mitte des Startbits dagegen bereits wieder auf »1« angestiegen, lag nur ein kurzer Störimpuls vor: Die Synchronisationsschaltung wird zurückgesetzt und der Empfänger nicht aktiviert. Die 16-fach größere Bezugsfrequenz dient somit zur Verbesserung der Übertragungssicherheit. Natürlich sind im Prinzip auch andere Werte wie z.B. 8 oder 32 möglich, der UART 8250/16450/16550 verwendet aber stets den Faktor 16.
30.4.3 Register und Programmierung Der UART 8250 weist zehn Steuer- und Statusregister, der 16450/16550 zusätzlich noch das Scratch-Pad-Register auf. Alle Register haben aufeinander folgende Adressen und können über drei Adressbits angesprochen werden, die Offsets liegen also zwischen 0 und 7. Die Basisadressen der UARTs und somit auch der Register sind im BIOS-Datenbereich eingetragen. Üblich sind die Basisadressen und IRQ-Belegungen, die in Tabelle 30.2 angegeben sind.
Sandini Bib 990
Kapitel 30
Schnittstelle
Basisadresse
IRQ
COM1 COM2 COM3 COM4
3f8h 2f8h 3e8h 2e8h
IRQ4 IRQ3 IRQ4*) IRQ3*)
*) oder nur Polling-Betrieb
Tab. 30.2: Basisadressen und IRQ-Belegungen der COM-Schnittstellen
Üblicherweise ist es bei den älteren Schnittstellenkarten mithilfe eines Jumpers oder eines DIPSchalters möglich, die Basisadresse und die IRQ-Leitung einzustellen, was hingegen bei aktuellen Mainboards im BIOS-Setup praktiziert werden kann. Demnach ist es also durchaus möglich, dass Sie COM1 mit IRQ4 konfigurieren. Solange der Handler für COM1 keinen Interrupt benutzt, ist dies kein Problem. Schwierigkeiten können aber auftreten, wenn an COM1 eine Maus angeschlossen und für COM1 der IRQ3 eingestellt worden ist. Der Maustreiber weiß, an welcher COM-Schnittstelle er angeschlossen ist, und versucht daher, IRQ4 entsprechend INT 0ch zu bedienen. Dort wird aber niemals ein Signal von COM1 ankommen, weil die Schnittstelle falsch konfiguriert ist, die Maus ist scheinbar tot. Manche BIOS-Versionen haben außerdem Schwierigkeiten, mehr als zwei serielle Schnittstellen zu bedienen. Es kann dann vorkommen, dass COM3 und COM4 nicht ansprechbar sind oder nur mit Polling betrieben werden können. Polling ist aber z.B. für einen Einsatz als Mausschnittstelle ungeeignet. Ausgehend von der Basisadresse der betreffenden Schnittstelle werden zur Adressierung der einzelnen Register noch die Register-Offsets benötigt, was in Tabelle 30.3 angegeben ist. Register
Offset
DLAB
A2
A1
A0
Empfängerpufferregister Senderhalteregister Interrupt-Aktivierungsregister Interrupt-Identifizierungsregister Datenformatregister (Leitungssteuerregister) Modemsteuerregister (RS-232-Ausgabe) Serialisierungsstatusregister (Leitungsstatusregister) Modemstatusregister (RS-232-Eingabe) Scratch-Pad-Register Teiler-Latch-Register (LSB) Teiler-Latch-Register (MSB)
00h
0
0
0
0
01h 02h 03h 04h 05h 06h 07h 00h 01h
0 – – – – – – 1 1
0 0 0 1 1 1 1 0 0
0 1 1 0 0 1 1 0 0
1 0 1 0 1 0 1 0 1
DLAB = Teiler-Latch-Zugriffsbit (Divisor Latch Access Bit)
Tab. 30.3: UART-Registeradressen
Empfänger- und Senderegister Über den Offset 00h ist sowohl das Empfängerpuffer- als auch das Senderhalteregister anzusprechen (vgl. Abbildung 30.11). Bedingung dafür ist aber, dass das höchstwertige Bit DLAB im Datenformatregister (siehe Abbildung 30.14) gelöscht ist. Nachdem ein serieller Datenstrom am SIN-Eingang des UART intern in ein Byte umgewandelt worden ist, wird das aufgebaute Byte in das Empfängerpufferregister übertragen. Das Bit E0 entspricht dem zuerst empfangenen Datenbit. Durch einen IN-Befehl ist das Datenbyte dann zu entnehmen. Dabei ist zu beachten, dass möglicherweise ein oder mehrere höherwertige Bits bei einer Daten-
Sandini Bib Die serielle Schnittstelle
991
länge von weniger als acht Bits nicht definiert sind. Ein IN-Befehl liest aber stets ein Byte aus. Bei kleinerer Datenlänge sollten also die entsprechenden höherwertigen Bits stets maskiert, d.h. auf Null gesetzt werden. Durch das Lesen des Empfängerpufferregisters mit IN wird das Register automatisch geleert, und es kann das nächste Byte aufgenommen werden. Empfängerpufferregister 7
0
E7 E6 E5 E4 E3 E2 E1 E0
E7..E0: Empfangsbit 7 bis 0
Senderhalteregister 7
0
S7 S6 S5 S4 S3 S2 S1 S0
S7..S0: Sendebit 7 bis 0
Abb. 30.11: Empfängerpuffer- und Senderhalteregister (Offset 00h)
Beispiel: Empfängerpufferregister von COM1 lesen. MOV dx, 3f8h IN al, dx
; Adresse vom Empfängerpufferregister in dx laden ; Empfängerpufferregister in al einlesen
Wenn Sie mit einem OUT-Befehl ein Byte in das Senderhalteregister schreiben, wird es automatisch zum Senderschieberegister übertragen und als serieller Datenstrom am Ausgang SOUT abgegeben, wobei das Bit S0 zuerst ausgegeben wird. Die Sendersteuerung des UART fügt dabei automatisch Start-, Paritäts- und Stoppbits ein. Beispiel: Senderhalteregister von COM1 schreiben, Byte 'a' ausgeben. MOV dx, 3f8h MOV al, 'a' OUT dx, al
; ; ; ;
Adresse vom Senderhalteregister in dx laden Byte 'a' zur Ausgabe in al laden 'a' in das Senderhalteregister schreiben und über SOUT ausgeben
Interrupt-Aktivierungsregister Wie ich bereits erwähnt habe, kann der UART 8250/16450/16550 unter bestimmten Umständen eine Hardware-Interrupt-Anforderung auslösen. Mit Hilfe des Interrupt-Aktivierungsregisters (vgl. Abbildung 30.12) ist die Interrupt-Anforderung dann zu steuern. Das höherwertige Register-Nibble ist dabei stets gleich Null und kann nicht verändert werden. Wenn das Bit SINP gesetzt wird, aktiviert der UART seine INTRPT-Leitung, wenn sich der Zustand von einem der RS-232C-Eingangssignale ändert, das sind CTS, DSR, DCD und RI. Dadurch kann sich z.B. ein Klingelsignal über RI durch einen Hardware-Interrupt bemerkbar machen. Wenn das Bit ERBK gesetzt wird, löst der UART einen Interrupt aus, wenn die Empfängersteuerung bei einem einlaufenden Byte einen Paritäts-, Überlauf- oder Framing-Fehler oder eine Unterbrechung der Übertragungsleitung (Break) erfasst. Die beiden anderen Bits TBE und RxRD des Interrupt-Aktivierungsregisters dienen zur Kommunikation zwischen CPU und UART bei der normalen Datenübertragung. Bei gesetztem Bit TBE löst der UART einen Interrupt aus, sobald das zu sendende Datenbyte vom Senderhalteregister zum Senderschieberegister übertragen worden ist, und das Senderhalteregister somit das nächste zu sendende Zeichen aufnehmen kann. Eine ähnliche Funktion hat das RxRD-Bit: Wenn RxRD gesetzt ist, löst der UART einen Hardware-Interrupt aus, sobald ein vollständiges Datenbyte im Empfängerpufferregister bereitsteht, die Empfängersteuerung also ein Datenbyte aus den Signalen an SIN im Empfängerschieberegister zusammengesetzt und in das Empfängerpufferregister übertragen hat. Bevor das nächste Byte vollständig eingelaufen ist, muss auf jeden Fall das Datenbyte aus dem Empfängerpufferregister gelesen werden, weil andernfalls ein Überlauffehler auftritt.
Sandini Bib 992
6
5
4
0 0 0 0
3
2
1 0
SINP ERBK TBE RxRD
7
Kapitel 30
SINP:
RS-232-Eingabe 1=Interrupt bei Zustandsänderung einer RS-232-Eingangsleitung 0=kein Interrupt
ERBK:
Fehler und Break (Error & Break) 1=Interrupt bei Paritäts-, Überlauf-, Framing-Fehler oder BREAK 0=kein Interrupt
TBE:
Übertragungspuffer leer (Transmitter-Buffer Empty) 1=Interrupt, wenn Übertragungspuffer leer 0=kein Interrupt
RxRD:
Daten empfangen (Received Data Ready) 1=Interrupt, wenn ein Byte im Empfängerpufferregister bereitsteht 0=kein Interrupt
Abb. 30.12: Interrupt-Aktivierungsregister (Offset 01h)
Beispiel: Interrupt bei leerem Senderhalteregister oder bei einem Datenbyte im Empfängerpufferregister für COM1 aktivieren, d.h. Setzen der Bits TBE und RxRD. MOV dx, 3f9h IN al, dx OR al, 03h OUT dx, al
; ; ; ;
Adresse des Interrupt-Aktivierungsregisters in dx laden Register in al einlesen TBE und RxRD setzen Register schreiben
Interrupt-Identifizierungsregister Anhand des Interrupt-Identifizierungsregisters ist durch Abfragen mit einem IN-Befehl zu ermitteln, ob gegenwärtig ein Interrupt anhängig ist. Ein aktiver Interrupt wird durch ein gelöschtes PND-Bit angezeigt. Das ist besonders bei einem Polling-Betrieb der Schnittstelle von Bedeutung, weil anhand des PND-Bits schnell zu ermitteln ist, ob eine Unterbrechung notwendig ist, und die beiden Bits ID1 und ID0 die Ursache des Interrupts angeben. Im InterruptStatusregister sind natürlich nur diejenigen Interrupts zu identifizieren, die vorher über das Interrupt-Aktivierungsregister aktiviert worden sind.
0 0 0 0 0
2
1 0
PND
3
ID1 ID0
7
ID1, ID0: Identifizierungsbits 00=Änderung eines RS-232-Eingangssignals (Priorität 3) 01=Übertragungspuffer leer (Priorität 2) 10=Daten empfangen (Priorität 1) 11=Serialisierungsfehler oder BREAK (Priorität 0) 0=höchste Priorität 3=niedrigste Priorität PND:
Pending-Bit 1=kein Interrupt anhängig 0=Interrupt anhängig, ID1, ID0 identifizieren die Ursache
Abb. 30.13: Interrupt-Identifizierungsregister (Offset 02h)
Den Interrupt-Quellen sind verschiedene Prioritäten zugeordnet, wobei die Stufe 0 der höchsten Priorität und die Stufe 3 der niedrigsten Priorität entspricht. Alle Interrupts niedrigerer Priorität sind gesperrt, solange ein Interrupt höherer Priorität anhängig ist. Solange z.B. ein Paritätsfehler (Priorität 0) nicht bedient worden ist, können sich die RS-232C-Steuersignale ändern, wie sie wollen; ein weiterer Interrupt wird aufgrund dieser Änderung nicht ausgelöst.
Sandini Bib Die serielle Schnittstelle
993
Interrupt-Quelle
ID1 ID0
Interrupt löschen durch
Änderung eines RS-232C-Eingangssignals Senderhalteregister leer
0 0
0 1
Datenbyte im Empfängerpufferregister Empfangsfehler oder Break
1 1
0 1
RS-232C-Statusregister lesen Datenbyte in Senderhalteregister schreiben oder Interrupt-Identifizierungsregister lesen Datenbyte aus Empfängerpufferregister lesen Lesen des Serialisierungsstatusregisters
Tab. 30.4: Anhängige Interrupts löschen
Der Handler muss einen anhängigen Interrupt auch löschen können. Welche Aktionen dazu notwendig sind, ist in Tabelle 30.4 angegeben. Sie sehen, dass die Interrupts durch das Lesen des zugeordneten Statusregisters oder des Empfängerpufferregisters oder durch das Schreiben des Senderhalteregisters gelöscht werden. Bei einem Interrupt durch ein leeres Senderhalteregister hat man die Wahl zwischen dem Schreiben eines neuen Datenbytes in das Senderhalteregister oder dem Lesen des Interrupt-Identifizierungsregisters. Der Grund dafür ist: Wenn der Interrupt ausschließlich durch Schreiben des Senderhalteregisters zu löschen wäre, würde eine endlose Datenübertragung die Folge sein. Da nach dem Auftreten eines Interrupts wohl zunächst stets das Interrupt-Identifizierungsregister gelesen wird, um die Quelle des Interrupts zu ermitteln, ist eine Interrupt-Anforderung durch ein leeres Senderhalteregister dadurch bereits quittiert worden. Beispiel: Ermitteln, ob für COM1 ein Interrupt anhängig ist und Sprung zum Handler entsprechend den Adressen in der Sprungtabelle sp_Tabelle. MOV dx, 3fah IN al, dx TEST al, 01h JNZ weiter
; ; ; ;
Adresse des Interrupt-Identifizierungsregisters in dx laden Register in al einlesen PND-Bit testen Sprung zu weiter, wenn PND gesetzt
MOV bx, sp_tab[al] ; D1,D0 als Index in Sprungtabelle sp_tab nach bx laden JMP bx ; Sprung zur entsprechenden Handler-Adresse weiter: .....................................
Datenformatregister
6
5
DLAB BRK
7
4
3
Parität
2
1 0
STOP
Über das Datenformatregister ist das Format der SDU zu bestimmen und außerdem, ob ein Zugriff mit den Offsetadressen 00h und 01h das Empfängerpuffer- bzw. Senderhalteregister und das Interrupt-Aktivierungsregister oder die beiden Bytes des Teiler-Latch-Registers anspricht.
D-Bit
DLAB: Divisor-Latch Access-Bit 1=Zugriff auf Teiler-Latch 0=Zugriff auf Empfangs-/Senderegister und Interrupt-Aktivierungsregister BRK:
BREAK 1=ein
0=aus
Parität: 000=keine STOP:
001=ungerade
011=gerade
101=mark
111=space
Anzahl der Stoppbits 1=2 Stoppbit 0=1 Stoppbit
D-Bit: Anzahl der Datenbits 00=5 Datenbit 01=6 Datenbit Abb. 30.14: Datenformatregister (Offset 03h)
10=7 Datenbit
11=8 Datenbit
Sandini Bib 994
Kapitel 30
Wenn das Teiler-Latch-Zugriffsbit DLAB gelöscht ist, führt ein Zugriff mit Offset 00h zu einem Lesen des Empfängerpufferregisters oder zum Schreiben des Senderhalteregisters. Außerdem adressiert der Offset 01h das Interrupt-Aktivierungsregister. Ist das Bit BRK gesetzt, wird das Signal am Ausgang SOUT des UARTs stets auf den BreakZustand, also logisch 0, was Space entspricht, eingestellt. Das gilt auch dann, wenn Sie ein Datenbyte in das Senderhalteregister schreiben, um es über SOUT auszugeben. Erst wenn Sie BRK wieder löschen, können Daten über SOUT ausgegeben werden. Beachten Sie, dass SOUT normalerweise ein Signal ausgibt, das einer logischen 1 oder Mark entspricht, wenn das Senderschieberegister leer ist, und der UART keinen seriellen Datenstrom abgeben soll. Ein gesetztes BRK-Bit simuliert für den Empfänger also eine Unterbrechung der Verbindung. Über die drei Paritätsbits Parität ist einzustellen, ob und gegebenenfalls welche Parität die Sendersteuerung für die Datenbytes erzeugen soll. Parität0 wird manchmal auch als Paritätsaktivierungsbit, Parität1 als Paritätsauswahlbit und Parität2 als Zwangsparitätsbit bezeichnet. Mit STOP wird die Anzahl der Stoppbits und mit D-Bit die Anzahl der Datenbits angegeben. Gültige Datenlängen sind fünf, sechs, sieben und acht Datenbits. Zu beachten ist dabei, dass der UART bei einer Datenlänge von fünf Bits unabhängig von STOP automatisch eineinhalb Stoppbits wählt. Damit ist gemeint, dass die Aktivphase des Stoppbits eineinhalb »normale« Bits dauert. Ein halbes Bit an sich wäre ja sinnlos. Bei gesetztem DLAB-Bit erhält man Zugang zum niederwertigen (Offset 00h) und höherwertigen (Offset 01h) Byte des Teiler-Latch-Registers. Das Teiler-Latch-Register ist ein 16-Bit-Zählerregister und enthält den Divisor, den der Baudgenerator im UART zur Erzeugung der Bezugsfrequenz verwendet. Die Baudrate ergibt sich durch nochmalige Teilung der Bezugsfrequenz mit dem Divisor 16. Allgemein gilt für die Baudrate also: Hauptbezugsfrequenz Bezugsfrequenz Baudrate = ------------------- = -------------16*Teiler Teiler
Im PC wird im Allgemeinen eine Hauptbezugsfrequenz von 1,8432 MHz benutzt, die ein externer Oszillator erzeugt und den beiden Anschlüssen XTAL1 und XTAL2 des UART zugeführt, so dass gilt (Hauptbezugsfrequenz = 1,8432 MHz, Bezugsfrequenz = 115200 Hz): 115.200 Baudrate = ------Teiler
Maximal ist der UART im PC dann also mit einer Rate von 115.200 Baud zu betreiben, wenn im Teiler-Latch-Register der Wert »1« eingetragen wird. Bei einem Startbit, acht Datenbits und einem Stoppbit entspricht das einer Übertragungsrate von 11.520 Byte pro Sekunde. Die CPU hat also maximal etwa 86 µs Zeit, um das Empfängerpufferregister auszulesen, wenn kein Überlauffehler auftreten soll. Beispiel: COM1 auf 300 Baud einstellen; Teiler = 384. MOV dx, 3fbh IN al, dx OR al, 80h OUT dx, al
; ; ; ;
Adresse des Datenformatregisters in dx laden Datenformatregister in al einlesen DLAB setzen Datenformatregister schreiben
MOV dx, 3f8h MOV al, 80h OUT dx, al
; Adresse des Teiler-Latch-Registers (LSB) in dx laden ; niederwertiges Teilerbyte (128) in al laden ; Teiler-Latch-Register (LSB) schreiben
INC dx MOV al, 01h
; Adresse des Teiler-Latch-Registers (MSB) einstellen ; höherwertiges Teilerbyte (Wert=256) in al laden
Sandini Bib Die serielle Schnittstelle
OUT dx, al MOV dx, 3fbh IN al, dx AND al, 7fh OUT dx, al
; ; ; ; ;
995
Teiler-Latch-Register (MSB) schreiben Adresse des Datenformatregisters in dx laden Datenformatregister in al einlesen DLAB löschen Datenformatregister schreiben
Modemsteuerregister Die Pegel der Ausgangssignale der Modemsteuerlogik des UART und die Werte der entsprechenden Bits im Modemsteuerregister sowie im Modemstatusregister sind komplementär zueinander. Die RS-232C-Ausgangssignale werden aber noch von den EIA-Leitungsverstärkern verstärkt, bevor sie am RS-232C-Anschluss abgegeben werden, bzw. die RS-232C-Eingangssignale vom RS-232C-Anschluss des PC sind von diesen Leitungsverstärkern verstärkt worden, bevor sie den Anschlüssen des UART zugeführt worden sind. Wie ich bereits erwähnt habe, arbeiten die EIA-Leitungsverstärker im PC als Inverter, so dass die Signalpegel am RS-232C-Anschluss den Bitwerten im Modemsteuer- oder Modemstatusregister entsprechen: Ein gesetztes Bit bedeutet einen hohen Signalpegel, ein gelöschtes einen niedrigen Signalpegel. Das Modemsteuerregister kontrolliert die Modemsteuerlogik des UART. Die drei höchstwertigen Bits sind nicht belegt, ein lesender Zugriff liefert stets den Wert Null zurück. Durch Setzen des Bits LOOP wird die Rückkopplungsprüfung des UART aktiviert. Dies ist ein besonderer Test- und Diagnosemodus, bei dem die vier Ausgänge der Modemsteuerlogik intern im UART folgendermaßen mit den RS-232C-Eingängen der Modemsteuerlogik verbunden werden: RTS mit CTS, DTR mit DSR, OUT1 mit RI und OUT2 mit DCD. Ferner wird der Senderausgang SOUT auf logisch »1« gesetzt, was Mark entspricht, der Empfängereingang SIN vom Rest des UART abgetrennt und das Senderschieberegister direkt mit dem Empfängerschieberegister verbunden. Bei gesetztem LOOP-Bit sind also die Modemsteuerfunktionen, die Erzeugung von Interrupts im UART sowie die Serialisierung im Senderschieberegister und die Wiedergewinnung der Daten im Empfängerschieberegister zu testen. 6
5
0 0 0
4
3
2
1 0
LOOP OUT2 OUT1 RTS DTR
7
LOOP:
Rückkopplungsprüfung (Loopback-Prüfung) 1=aktiv 0=Normalbetrieb
OUT2:
Vielzweckausgang 2 (General-Purpose-Output 2) 1=aktiv 0=deaktiviert
OUT1:
Vielzweckausgang 1 (General-Purpose-Output 1) 1=aktiv 0=deaktiviert
RTS:
Request-To-Send 1=aktiv 0=deaktiviert
DTR:
Data-Terminal-Ready 1=aktiv 0=deaktiviert
Abb. 30.15: Modemsteuerregister (Offset 04h)
Beim Schreiben eines Datenbytes in das Senderhalteregister wird es zum Senderschieberegister übertragen, und bei aktiviertem Interrupt wird ein Interrupt »TBE« erzeugt. Der serielle Datenstrom wird entsprechend dem Format, das im Datenformatregister angegeben ist, ohne Umweg zum Empfängerschieberegister übertragen und dort in ein Datenbyte umgewandelt. Das Datenbyte wird dann in das Empfängerpufferregister übertragen, und schließlich wird ein Interrupt
Sandini Bib 996
Kapitel 30
»RxRD« ausgelöst, wenn dieser durch das Interrupt-Aktivierungsregister erlaubt worden ist. Ein Vergleich des Datenbytes, das zuvor in das Senderhalteregister geschrieben wurde, mit dem Byte, das im Empfängerpufferregister vorliegt, zeigt dann an, ob die Sende- und Empfangslogik korrekt arbeitet. Bei gelöschtem LOOP-Bit arbeitet der UART normal als serieller, asynchroner Empfänger und Sender. Die beiden Bits OUT2 und OUT1 steuern dann die Logikpegel, die die entsprechenden UART-Ausgänge abgeben: Ein gesetztes Bit führt zu einem niedrigen, ein gelöschtes Bit zu einem hohen Pegel. Bitwert und Signalpegel am Ausgang des UART sind also komplementär. Die beiden Bits RTS und DTR steuern unmittelbar die Pegel der RS-232C-Ausgangsignale RTS und DTR des UARTs. Ein gesetzes Bit führt zu einem niedrigen Pegel am Ausgang RTS bzw. DTR des UARTs und über die invertierenden Leitungsverstärker zu einem hohen Pegel von +12 V am RTS- oder DTR-Ausgang des RS-232C-Anschlusses des PC. Beispiel: Master-Interrupt-Bit setzen, um individuelle Interrupts zuzulassen. MOV dx, 3fch IN al, dx OR al, 08h OUT dx, al
; ; ; ;
Adresse des Modemsteuerregisters in dx laden Modemsteuerregister in al einlesen OUT2 setzen Modemsteuerregister schreiben
Serialisierungsstatusregister
7
6
0
TXE TBE BREK FRMF PARF ÜBLF RxRD
Das Serialisierungsstatusregister enthält Informationen über den Status des Empfänger- und des Senderteils im UART. Das höchstwertige Bit ist nicht definiert und liefert stets den Wert 0 zurück. Ein gesetztes Bit TXE zeigt an, dass das Senderhalteregister und das Senderschieberegister leer sind. Ist TXE gleich 0, so befinden sich entweder im Senderhalteregister oder im Senderschieberegister noch Daten. Ist das Bit TBE gesetzt, dann ist das Senderhalteregister leer, sonst befindet sich ein Datenbyte im Senderhalteregister. 5
4
3
2
1 0
TXE:
Sender leer (Transmitter-Empty) 1=kein Byte im Senderhalteregister und Senderschieberegister 0=ein Byte im Senderhalteregister oder Senderschieberegister
TBE:
Senderhalteregister leer (Transmitter-Buffer-Empty) 1=kein Byte im Senderhalteregister 0=ein Byte im Senderhalteregister
BREK: Break 1=erfasst
0=kein Break
FRMF: Framing-Fehler 1=Fehler aufgetreten
0=kein Framing-Fehler
PARF: Paritätsfehler 1=Fehler aufgetreten
0=kein Paritätsfehler
ÜBLF: Überlauffehler 1=Fehler aufgetreten
0=kein Überlauffehler
RxRD: Empfangsdaten bereit 1=Empfangsdaten im Empfängerpufferregister
Abb. 30.16: Serialisierungsstatusregister (Offset 05h)
0=keine Empfangsdaten
Sandini Bib Die serielle Schnittstelle
997
Die nächsten vier Bits betreffen den Zustand der Verbindung und etwaige Empfangsfehler. Wenn BREK gesetzt ist, hat die Empfangslogik eine Unterbrechung der Verbindung erfasst. Das ist dann der Fall, wenn SIN mehr als eine SDU lang auf Space liegt. Ein gesetztes FRMF-Bit zeigt einen Framing-Fehler, ein gesetztes PARF-Bit einen Paritätsfehler und ein gesetztes ÜBLF-Bit einen Überlauffehler des Empfängerpufferregisters an. Wenn das Bit RxRD gesetzt ist, steht im Empfängerpufferregister ein Datenbyte bereit. Das Serialisierungsstatusregister kann also z.B. zusammen mit dem Interrupt-Identifizierungsregister verwendet werden, um die Ursache eines Fehler-Interrupts genauer zu ermitteln oder bei maskierten Interrupt-Bits im Polling-Modus dennoch den Status des UART zu erfassen. Beispiel: Ermitteln, ob ein Datenbyte im Empfängerpufferregister bereitsteht und Datenbyte ggfs. einlesen. MOV dx, 3fdh IN al, dx TEST al, 01h JZ weiter MOV dx, 3f8h IN al, dx
; ; ; ; ; ;
Adresse des Serialisierungsstatusregisters in dx laden Serialisierungsstatusregister in al einlesen RxRD testen Sprung zu weiter, wenn RxRD gelöscht Adresse des Empfängerpufferregisters in dx laden Datenbyte im Empfängerpufferregister in al einlesen
weiter: ...................................................
Modemstatusregister Über das Modemstatusregister ist der Zustand der RS-232C-Eingangssignale zu ermitteln. Das höherwertige Nibble gibt den aktuellen Signalpegel an, das niederwertige Nibble enthält Informationen über die Änderung der Pegel seit dem letzten Auslesen des Registers. Ein IN-Befehl für das Modemstatusregister löscht also das niederwertige Register-Nibble. 6
5
4
3
2
1 0
DCD RI DSR CTS DDCD DRI DDSR DCTS
7
DCD: RI: DSR: CTS:
Data-Carrier-Detect 1=DCD aktiv
0=DCD inaktiv
Ring-Indicator 1=RI aktiv
0=RI inaktiv
Data-Set-Ready 1=DSR aktiv
0=DSR inaktiv
Clear-To-Send 1=CTS aktiv
0=CTS inaktiv
DDCD: Delta-Data-Carrier-Detect 1=DCD seit letztem Lesevorgang verändert DRI:
Delta-Ring-Indicator 1=RI seit letztem Lesevorgang verändert
0=DCD gleich geblieben 0=RI gleich geblieben
DDSR: Delta-Data-Set-Ready 1=DSR seit letztem Lesevorgang verändert
0=DSR gleich geblieben
DCTS: Delta-Clear-To-Send 1=CTS seit letztem Lesevorgang verändert
0=CTS gleich geblieben
Abb. 30.17: Modemstatusregister (Offset 06h)
Sandini Bib 998
Kapitel 30
Die vier Bits DCD, RI, DSR und CTS geben unmittelbar die Signalpegel an den UART-Eingängen DCD, RI, DSR und CTS an. Ein gesetztes Bit entspricht einem niedrigen Signalpegel, ein gelöschtes einem hohen Signalpegel. Beachten Sie auch hier, dass die Pegel von den EIA-Leitungsverstärkern invertiert werden. Am RS-232C-Anschluss des PC entspricht ein gesetztes Bit daher wieder einem hohen Signalpegel von +12 V und ein gelöschtes Bit einem niedrigen Signalpegel von -12 V. Wenn das Bit DCD gesetzt ist, hat das Modem ein Trägersignal erfasst (oder das Signal DCD einfach auf einen hohen Pegel gesetzt). Läuft ein Anruf beim Modem ein, hebt es die Leitung RI auf einen hohen Pegel an, und der UART setzt das Bit RI. In ähnlicher Weise signalisiert ein gesetztes Bit DSR, dass das Modem bereit ist, und ein gesetztes CTS-Bit, daß der UART Daten an das Modem ausgeben kann. Die vier Bits DDCD, DRI, DDSR und DCTS zeigen schließlich an, ob sich die Signale DCD, RI, DSR und CTS am RS-232C-Anschluss oder entsprechend die Bits DCD, RI, DSR und CTS im Modemstatusregister seit dem letzten Auslesen des Registers verändert haben. Ein gesetztes D-Bit bedeutet dabei ein geändertes Bit. Beispiel: Ermitteln, ob sich das Bit DCD geändert hat, und ggfs. neues DCD in das niederwertigste Bit des Registers al übertragen. MOV dx, 3feh IN al, dx TEST al, 08h JZ weiter AND al, 80h CLC RCL al RCL al
; ; ; ; ; ; ; ;
Adresse des Modemstatusregisters in dx laden Modemstatusregister in al einlesen DeltaDCD testen Sprung zu weiter, wenn DeltaDCD gelöscht alle Bits außer DCD löschen Carry löschen DCD aus höchstwertigem al-Bit in Carry übertragen DCD von Carry in niederwertigstes al-Bit übertragen
weiter: ...................................................
Scratch-Pad-Register Das Scratch-Pad-Register ist nur beim 16450/16550 vorhanden und kann als Zwischenspeicher für temporäre Daten dienen, wenn z.B. in einem IRQ-Handler der Hauptspeicher nicht benutzt werden soll. Auswirkungen auf die Funktion des UARTs 16450/16550 haben die Werte der Bits SPR7–SPR0 nicht. 6
5
4
3
2
1 0
SPR7 SPR6 SPR5 SPR4 SPR3 SPR2 SPR1 SPR0
7
SPR7...SPR0: Bit 7 bis Bit 0 im Register Abb. 30.18: Scratch-Pad-Register (Offset 07h)
Sandini Bib
31
PCMCIA und Card-Bus
Ursprünglich waren die scheckkartengroßen PCMCIA-Karten nur als Speichererweiterung für Notebooks vorgesehen (Spezifikation 1.0). Die dazugehörige Spezifikation wurde von der Personal Computer Memory Card International Association verabschiedet. Speicherkarten sind zwar immer noch eine typische PCMCIA-Anwendung, die auch in Digitalkameras oder PDAs realisiert wird, gleichwohl gibt es mittlerweile aber auch Fax/Modem-, Netzwerk-, Sound- und ISDN-Karten sowie Festplatten gemäß des PCMCIA-Standards. Während Notebooks in der Regel standardmäßig über ein PCMCIA-Interface verfügen, sind für Standard-PCs entsprechende Interfaces als Einsteckkarten oder als externe Box für die Parallel-Schnittstelle erhältlich, was den Datenaustausch zwischen einem mobilen und einem Arbeitsplatz-PC ermöglicht. Im Standard wurden u.a. ein 68-poliger Anschlussstecker und eine einheitliche Größe für PCMCIA-Karten definiert. Es gibt sie in drei unterschiedlichen Dicken, was somit indirekt auch ihre Anwendungsmöglichkeiten bestimmt. PCMCIA-Typ
Dicke
Anwendung
Beispiele
1 2 3
3,3 mm 5 mm 10,5 mm
Speicherkarten I/O-Karten Laufwerke
RAM, SRAM, Flash, EEPROM Modem-, Sound-, ISDN-, Netzwerkkarte Festplatte, Wechselplatte
Tab. 31.1: Die verschiedenen PCMCIA-Kartentypen und ihre Anwendungen
PCMCIA sieht einen Kartenspeicher von maximal 64 MByte für den so genannten Haupt- oder Common-Speicher und zusätzlich bis zu 64 MByte an Attributspeicher vor, d.h., der auf einer einzigen PCMCIA-Karte vorhandene Speicher darf bis zu 128 MByte betragen. Zum Vergleich: Der gesamte 24-Bit-ISA-Adressraum beträgt lediglich 16 MByte. Mithilfe einer PCMCIA-Speicherkarte kann also der Hauptspeicher eines Notebooks vergrößert werden. Mit den I/O-Karten ab der Spezifikation 2.0 steht auf den Karten ein I/O-Adressbereich von 64k 8-Bit-Ports zur Verfügung (oder eine äquivalente Menge von 16-Bit und/oder 32-Bit-Ports). Der Card-Bus ist die Weiterentwicklung der PCMCIA-Schnittstelle und hierzu abwärtskompatibel, obwohl sich die einzelnen Signale und deren Funktionen stark voneinander unterscheiden. Alle neueren Notebooks besitzen mindestens einen Card-Bus-Steckplatz, wobei aber weder dem Steckplatz noch den jeweiligen Einsteckkarten unmittelbar anzusehen ist, ob es sich dabei um PCMCIA oder um den Card-Bus handelt. Vereinfacht gesagt, kann man feststellen, dass PCMCIA mit ISA und der Card-Bus mit PCI vergleichbar ist. Ein Nachfolger der PC-Card-Standards wurde bereits von Intel unter der Bezeichnung PC New Card vorgestellt, der prinzipiell wie PCI-X funktionieren soll.
31.1 Grundsätzliche Funktionsweise und Aufbau Die PCMCIA-Schnittstelle stellt eine Verbindung zwischen einer scheckkartengroßen PCMCIAKarte und einem Host her. Der Host-PC kann dazu einen Adapter aufweisen, der den PC-Systembus (ISA, PCI) mit dem PCMCIA-Sockel verbindet und die notwendige Steuerelektronik – einen PCMCIA-Controller – enthält. Die Sockel oder Slots nehmen dabei die PCMCIA-Karten auf und besitzen Kontakte für den Austausch von Signalen und für das Bereitstellen von Versorgungsspannungen. Üblicherweise versorgt ein PCMCIA-Controller zwei Slots, und bei der Verwendung einer Typ-3-Karte (vgl. Tabelle 31.1) ist
Sandini Bib 1000
Kapitel 31
der zweite oftmals nicht nutzbar. Die Sockel führen im Allgemeinen auch ein Power Management aus, um den Stromverbrauch der PCMCIA-Schnittstelle niedrig zu halten. Die prinzipielle Funktionsweise der PCMCIA-Schnittstelle und der eingesetzten Karten ist recht einfach: Im Hauptspeicher oder I/O-Adressraum des Host-Systems wird ein Adressbereich definiert (ein so genanntes Fenster), in den ein Speicher- oder I/O-Abschnitt der eingesetzten Karte eingeblendet wird. Ein Zugriff auf das Host-System-Fenster betrifft dann nicht unmittelbar das Host-System, sondern wird zum betreffenden PCMCIA-Slot und damit zur eingesetzten Karte umgeleitet, wie es in Abbildung 31.1 dargestellt ist. PCMCIAController
PCMCIA-Speicher
Sys_Adresse_1 +Offset_1
LAST_1+Offset_1 FIRST_1+Offset_1
LAST_1
LAST_0 FIRST_0
SystemI/O-Adressraum
Sys_Adresse_1
PCMCIAI/O-Adressraum
Sys_Adresse_0
Offset_0
FIRST_1
PCMCIAController
Offset_1
Systemhauptspeicher
Sys_Adresse_0 +Offset_0
LAST_0+Offset_0 FIRST_0+Offset_0
(a) Speicheradressraum
LAST FIRST
Sys_Adresse
Sys_Adresse
LAST FIRST
(b) I/O-Adressraum
Abb. 31.1: Funktionsweise der PCMCIA-Schnittstelle
Ein Fenster wird im Systemhauptspeicher durch zwei Größen definiert: durch den Beginn des Fensters oder die Adresse das ersten Bytes des Fensters (als FIRST bezeichnet) und durch das Ende oder die Adresse das letzten Bytes des Fensters (als LAST bezeichnet). FIRST und LAST werden in einem Steuerregister des PCMCIA-Controllers abgelegt. Liegt die Systemadresse Sys_Adresse (also die vom Prozessor, Cache-Controller, etc. ausgegebene Adresse) zwischen FIRST und LAST, wird der PCMCIA-Controller aktiv und leitet den betreffenden Speicherzugriff zum PCMCIA-Sockel um, für den das Fenster definiert ist. Außerdem ist der Kartenoffset für die Adressierung von Bedeutung. Von ihm hängt ab, welche Speicherstelle auf der Karte durch die Systemadresse nun tatsächlich physikalisch angesprochen wird. Dieser Offset wird stets als 2er-Komplement angegeben und vom PCMCIA-Controller zur Systemadresse addiert. Dadurch findet eine Abbildung des Adressbereichs auf der PC-Karte im Bereich zwischen den physikalischen Kartenadressen [FIRST+Kartenoffset, LAST+Kartenoffset] auf den Systemadressbereich [FIRST, LAST] statt. Weil der Kartenoffset als 2er-Komplement vorliegt, kann der Offset immer addiert werden, auch wenn ein Kartenspeicherbereich »unterhalb« des Fensters im Systemspeicher angesprochen werden soll; der Kartenoffset ist dann einfach eine negative Zahl in 2er-Komplementdarstellung. Eine Systemadresse spricht also in diesem Bereich physikalisch einen Speicherabschnitt auf der eingesetzten PCMCIA-Karte an. In der Spezifikation ist definiert, dass pro Sockel oder Slot mehrere solche Fenster vorgesehen sind, die völlig unabhängig voneinander konfiguriert werden können (z.B. hinsichtlich des Zugriffs auf den Common- oder Attributspeicher der PCMCIA-Karte, Anzahl der Wartezyklen
Sandini Bib PCMCIA und Card-Bus
1001
etc.). Zugriffe auf den Systemspeicher mit einer Systemadresse, die nicht in das Fenster fällt, betreffen natürlich den Systemhauptspeicher und werden nicht zum PCMCIA-Slot umgeleitet. Ferner kann jedes Fenster in ein oder mehrere Pages unterteilt werden, sofern es der PCMCIAController erlaubt. Ist nur eine Page vorhanden, dann umfasst sie das komplette Fenster. Wenn mehrere Pages gebildet sind, ist jede Page 16 KByte groß. Jede Page kann einen anderen Kartenoffset aufweisen, und dadurch können mehrere »Teilfenster« im Adressraum der PCMCIA-Karte gebildet werden. Ein etwas umständliches, aber ein dennoch definiertes Verfahren, um auf den Kartenspeicher zuzugreifen, nutzt I/O-Ports bzw. die Kartenregister. Mit der Spezifikation 2.0 wurde eingeführt, dass auch ein I/O-Adressbereich auf den eingesetzten PC-Karten in den I/O-Systemadressbereich eingeblendet werden kann. Dadurch sind die Steuer- und Statusregister auf einer PCMCIAKarte zugänglich, die beispielsweise für ein Faxmodem vorgesehen sind. Im Prinzip könnte man dies auch über Memory-Mapped Register praktizieren. In diesem Fall werden aber stets spezielle Treiber benötigt, andernfalls geht der Zugriff eines Standard-Terminal-Programms, das einen UART 16450 an den für die COM-Ports üblichen I/O-Adressen erwartet, ins Leere. Mit den I/O-Karten ist dies nach der Konfiguration des PCMCIA-Slots allerdings kein Problem mehr: Die Kartenregister werden beispielsweise an die für COM1 typischen I/O-Adressen in den I/O-Systemadressbereich eingeblendet. Solche I/O-Fenster haben keine Pages und weisen stets eine Breite von 8 Bit auf (Speicherfenster: 4 KByte). Ferner gibt es hier keinen Kartenoffset: Jede Port-Adresse im Fenster des System-I/O-Adressraums weist auf denselben Port im KartenI/O-Adressraum. Die PCMCIA-Schnittstelle kann darüber hinaus viele Kartenstatusänderungen erkennen, wie z.B. Batteriewarnungen, das Einsetzen und Entfernen von Karten etc. I/O-Karten können auch eine Hardware-Interrupt-Anforderung auslösen, um z.B. am PCMCIA-Modem einlaufende Faxe zu melden.
31.2 Card- und Socket-Services Der programmtechnische Zugriff auf die PCMCIA-Schnittstelle kann durch einen direkten Zugriff auf die Steuer- und Statusregister des installierten PCMCIA-Controllers erfolgen, wobei sich die Registerbelegung der Controller von Typ und Hersteller jedoch unterscheidet, so dass diese Möglichkeit eher nicht empfehlenswert, sondern eine allgemein standardisierte Methode vorzuziehen ist. Dies wird beispielsweise durch die Socket- und Card-Service-Funktionen ermöglicht. Die Socket-Services bilden die der Hardware am nächsten liegende Software-Schnittstelle für PCMCIA-Karten. In Abbildung 31.2 sind die verschiedenen Schichten dargestellt. Während die Socket-Services zumeist im BIOS lokalisiert sind, stellen die Card-Services quasi die Verbindung zwischen den BIOS-Routinen und dem Treiber her, wobei hier die Card Information Structure – kurz CIS – von Bedeutung ist, die noch erläutert wird. Die oberste Ebene der Software-Schnittstellen zu den PCMCIA-Slots bilden die Card-Services. Sie sind hinsichtlich ihres Aufrufs betriebssystemspezifisch und verarbeiten Anforderungen von mehreren Prozessen in einem Multitasking-Betriebssystem. Insbesondere dienen sie auch zum Verwalten (Teilen) der Socket-Services für diese konkurrierenden Prozesse, um Zugriffskonflikte zu vermeiden.
Sandini Bib 1002
Kapitel 31
Anwendungsprogramm Betriebssystem Einheitentreiber
Card-Services
Memory Technology Layer
Socket-Services
Sockel 1
Adapter
PCMCIAKarte
Sockel 2
PCMCIAKarte
Abb. 31.2: Die verschiedenen Software-Schichten der PCMCIA-Schnittstelle
Die Card-Services greifen auf die Socket-Services zurück, um einen PCMCIA-Slot tatsächlich anzusprechen. Im Gegensatz zu den Socket-Services (von denen mehrere gleichzeitig im System vorhanden sein können) gibt es stets nur eine Card-Service-Implementierung pro System. Auch die Socket-Services sind von der zugrunde liegenden Systemarchitektur unabhängig, insbesondere also von den vorhandenen Prozessorregistern und den Aufrufkonventionen des Systems. Das wird über so genannte Processor Bindings implementiert. Für die 80x86-Architektur dienen in bekannter Weise die Vielzweck- und Segmentregister zur Parameterübergabe und ein Software-Interrupt (hier INT 1ah) zum Aufruf der Funktionen. Es ist leicht festzustellen, ob überhaupt ein Socket-Service vorhanden ist. Hierfür ist lediglich die Funktion 80h – GetAdapterCount – aufzurufen. Wenn der Code SUCCESS zurückgegeben wird und im CX-Register die Signatur »SS« vorhanden ist, kann man davon ausgehen, dass mindestens ein Socket-Service installiert ist. Beispiel: Ermitteln, ob ein Socket-Service vorhanden ist. MOV ah, 80h INT 1ah JC no_service CMP ah, 00h JNE no_service CMP CX, 'SS' JNE no_service
; ; ; ; ; ; ;
Funktionsnummer für GetAdapterCount laden Funktion aufrufen Carry gesetzt -> Fehler -> kein Service ermitteln, ob SUCCESS ah enthält Fehlercode -> kein SUCCESS -> kein Service ermitteln, ob Signatur 'SS' in CX cx enthält kein 'SS' -> kein Service
service_installed: ; Rückmeldung, dass Socket-Service installiert ist no_service:
; Rückmeldung, dass kein Socket-Service installiert ist
Sandini Bib PCMCIA und Card-Bus
1003
Standardmäßig setzen die Card-Services ein Zugriffsverhalten der PCMCIA-Kartenspeicher voraus, das dem von SRAM-Speichern entspricht. Beispielsweise können Daten individuell gelesen, geschrieben und gelöscht werden. Das ist aber bei Flash-Speichern nicht der Fall, weil hier keine individuellen Zellen überschrieben werden können, sondern nur Zeilen (Pages), Blöcke oder auch der komplette Chip. Dagegen ist ein Lesen wie bei den SRAM-Speichern möglich. Um solche von der zugrunde liegenden Speichertechnologie abhängenden Prozeduren zum Schreiben und Löschen von Daten für die Card-Services transparent zu gestalten, ist bedarfsabhängig eine weitere Software-Schicht zwischen den Card- und den Socket-Services vorgesehen: die Speichertechnologieschicht oder Memory Technology Layer (MTL). Sie benutzt Socket-Services für alle konfigurationsrelevanten Zugriffe. Lediglich der Zugriff zum Löschen und Schreiben von Daten erfolgt direkt, aber mit einem der zugrunde liegenden Speichertechnologie angepassten Programmieralgorithmus. Zur Wahrung der Datenintegrität sind für Speicherkarten so genannte Error-Detecting-Code-Generatoren (EDCs) vorgesehen, die jedoch nur bei den PCMCIAKarten der ersten Generation anzutreffen sind, mit denen es in der Praxis oftmals Probleme gibt, was nicht zuletzt auch daran liegt, dass es verschiedene Dateiformate für PCMCIA-Speicherkarten gibt. Drei unterschiedliche Systeme sind hier anzutreffen: SCM-FFS von der Firma SMC, Non Block Devices von Microsoft und ATA von der Firma Sun Disk, deren Format recht verbreitet ist. Da die verschiedenen I/O-Karten anders als die Speicherkarten arbeiten, ist das Zusammenspiel der Socket-Services mit den Card-Services und die damit verbundene softwaretechnische PCAnbindung nicht unkritisch. Erst bei den neueren PCMCIA- und den Card-Bus-Einheiten hat sich die PCMCIA-Unterstützung zum Besseren gewandelt, was nicht zuletzt auch an Windows 95 liegt, das PCMCIA standardmäßig und auch einheitlich unterstützt. PCMCIA zeigt sich ab Windows 9x als funktionierendes Plug&Play-System, und die Karten können auch problemlos im laufenden Betrieb gewechselt werden; ein Neuboot zur Erkennung ist nicht notwendig. Die PCMCIA-Speicherkarten werden unter Windows 9x wie ein gewöhnliches Laufwerk behandelt, was insbesondere zum Datenaustausch mit Digitalkameras vorteilhaft genutzt werden kann. Lediglich bei einigen I/O-Karten tauchen mitunter noch Probleme auf, so dass man dann auf die (alten) Real-Mode-Treiber ausweichen muss, die auch unter Windows 9x funktionieren. Eine Erläuterung aller Socket- und Card-Services würde den Rahmen dieses Buches wohl endgültig sprengen, so dass ich in Tabelle 31.2 nur die bekannten Funktionen angebe, die mithilfe des BIOS-Interupts INT 1ah zugänglich sind. Funktion
Befehl
Bedeutung
80h 83h 84h 85h 86h 87h 88h 89h 8ah 8bh 8ch 8dh 8eh
GetAdapterCount GetSSInfo InquireAdapter GetAdapter SetAdapter InquireWindow GetWindow SetWindow GetPage SetPage InquireSocket GetSocket SetSocket
Adapteranzahl ermitteln Liefert Informationen über Socket-Service-Handler Anzeige von Informationen über einen bestimmten PCMCIA-Adapter Augenblicklicher Zustand eines Adapters Einstellen eines Adapterzustandes Abfrage eines Speicherfensters Liefert die Einstellungen des Speicherfensters Speicherfenster einstellen Page-Einstellung ermitteln Page-Zustand festlegen Sockel abfragen Zustand des Sockels ermitteln Einstellen des Sockelzustandes
Tab. 31.2: BIOS-Funktionen für PCMCIA
Sandini Bib 1004
Kapitel 31
Funktion
Befehl
Bedeutung
8fh 90h 95h 96h 97h 98h 99h 9ah 9bh 9ch 9dh 9eh 9fh a0h a1h aeh
GetStatus ResetSocket InquireEDC GetEDC SetEDC StartEDC PauseEDC ResumeEDC StopEDC ReadEDC GetVendorInfo AcknowledgeInterrupt GetSetPriorHandler GetSetSSAddr GetAccessOffsets VendorSpecific
Liefert den aktuellen Status verschiedener Sockeleinheiten Sockel zurücksetzen Informationen über den EDC-Generator abfragen Liefert die aktuelle EDC-Generator-Konfiguration EDC-Generator konfigurieren Starten eines EDC-Generators Temporäre Deaktivierung eines EDC-Generators Reaktivieren eines temporär stillgelegten EDC-Generators Anhalten eines EDC-Generators Lesen eines EDC-Generator-Wertes Ermitteln der Herstellerinformationen Zeigt die Bestätigung eines Interrupts an Einsprungspunkt des vorherigen Handlers ermitteln Ermitteln der Socket-Service-Adresse Übergabe von Offsets adapterspezifischer Routinen Herstellerspezifische Funktion
Tab. 31.2: BIOS-Funktionen für PCMCIA (Forts.)
Wie erwähnt wurde, bilden die Card-Services eine betriebssystemnahe Schnittstelle, so dass der Aufruf dieser Services vom jeweiligen Betriebssystem abhängig ist. Für alle aktuellen Systeme gibt es eine entsprechende Unterstützung. Die Card-Services steuern die Ressourcenvergabe der PCMCIA-Karten. Daneben überwachen sie den Betriebszustand und starten bei Bedarf Behandlungsroutinen des Treibers oder des Betriebssystems. In MS-DOS- und anderen X86-Real-Mode basierten Systemen werden die Card- und Socket-Services als separate Gerätetreiber geladen. Die Kommunikation einer Applikation mit den Card-Services erfolgt dann (wie oben erläutert) mithilfe eines Dienstaufrufs durch den INT 1Ah. Protected-Mode-Betriebssysteme wie Windows 98/2000/XP oder auch Linux implementieren die Card- und Socket-Services als Ring-0-Gerätetreiber. Treiberentwickler können in einer derartigen Architektur die Card-Services nicht mehr direkt aufrufen, jeder Zugriff erfolgt dabei über die API des jeweiligen Betriebssystems. Die wichtigsten Funktionen der Card-Services sind:
: :
:
Ressourcenverwaltung: Hiermit werden die Systemressourcen den aktiven PCMCIA-Karten zugewiesen und verwaltet. Client-Services: Sie bilden eine Gruppe von Funktionen, bei denen Treiber sich anmelden können. Möchte ein Treiber zum Beispiel über bestimmte Statusänderungen benachrichtigt werden, meldet er sich über die API des Betriebssystems bei dem entsprechenden Dienst an und übergibt einen Pointer auf seine Nachrichtenbehandlungsroutine. Tritt das entsprechende Ereignis dann ein, ruft der Card-Dienst die Behandlungsroutine des Treibers auf. Client-Utilities: Sie bieten eine rudimentäre Möglichkeit, die Tupel der PCMCIA-CIS-Konfiguration (s.u.) einer bestimmten PCMCIA-Karte abzufragen.
In einer Plug&Play-Architektur werden die Funktionen der Card-Services nur noch selten direkt durch den Treiber angesprochen, prinzipiell ist dies jedoch auch weiterhin möglich. Dies hat seinen Grund darin, dass dem Treiber in einem modernen Plug&Play-fähigen Betriebssystem kein aktiver Anteil an der Ressourcenvergabe mehr zukommt. Dieser Aufgabenbereich wird vollständig durch den Configuration-Manager des Systemkernels abgedeckt. In Kapitel 35 erfahren Sie hierzu mehr.
Sandini Bib PCMCIA und Card-Bus
1005
Die einzige Ausnahme bilden die Client-Dienste, mit deren Hilfe es dem Treiber möglich ist, schnell und unkompliziert auf eine Statusänderung der PCMCIA-Karte zu reagieren. Derartige Funktionsaufrufe verletzten allerdings die Plug&Play-Philosophie von Microsoft, da diese davon ausgeht, dass Gerätetreiber bussystem-unabhängig konzipiert werden. In der Praxis hat eine solche Abweichung vom Standard jedoch keinerlei Auswirkungen auf die Funktionsfähigkeit des Treibers.
Abb. 31.3: Grundsätzliche PCMCIA-Systemarchitektur
Die Socket-Services bilden die hardware-nahe unterste Softwareschicht. Sie sind direkt mit den Card-Services verbunden und für den eigentlichen Treiber unsichtbar. Ihre Aufgabe ist die Konfiguration des Host-Bus-Adapters (HBA, vgl. Abbildung 31.3). Der HBA bildet die physikalische Schnittstelle zwischen dem Host-Bus und den PCMCIA-Sockets. Seine wichtigsten Aufgaben sind:
: : : : :
Bereitstellen der erforderlichen Versorgungsspannungen Selektive Abbildung der Speicher- bzw. I/O-Zugriffe auf den entsprechenden PCMCIASocket PCMCIA Interrupt Steering Socket-Statusbenachrichtigung, Status-Eventhandling Power Management
Die meisten HBAs implementieren zwei physikalisch getrennte PCMCIA-Sockets. Seit Revision 2.1 unterscheidet die PCMCIA-Spezifikation dabei zwei verschiedene Betriebsarten. Es handelt es sich um den Memory Only Mode und um den I/O or Memory Mode 3. Beide verwenden dieselbe physikalische Schnittstelle; sie unterscheiden sich jedoch in der Belegung und der Funktion einzelner Steuer- und Statusleitungen. Während der Initialisierung einer PCMCIA-Karte betreibt der HBA die PCMCIA-Karte zunächst im Memory-Only-Mode. Gibt sich die Karte gemäß ihrer CIS-Konguration (siehe Kapitel 31.3) als I/O-Karte zu erkennen, wechselt der HBA anschließend in den I/O-Modus. Ein späterer Wechsel der Betriebsart ist nicht vorgesehen. Zugriffstyp
IORD
IOWR
OE
WE
REG
I/O Read I/O Write
0 1
1 0
1 1
1 1
1 1
Tab. 31.3: PCMCIA-Zugriffsarten
Sandini Bib 1006
Kapitel 31
Zugriffstyp
IORD
IOWR
OE
WE
REG
Attribute Memory Read Attribute Memory Write Common Memory Read Common Memory Write
1 1 1 1
1 1 1 1
0 1 0 1
1 0 1 0
1 1 0 0
CE1
CE2
Funktion
1 0 1 1
1 1 0 1
Karte ist nicht aktiviert Gerades Byte wird selektiert Ungerades Byte wird selektiert 16-Bit-Zugriff
Tab. 31.4: PCMCIA-Zugriffsarten (Forts.)
Im I/O-Mode unterscheidet die Karte zwischen drei verschiedenen Speicherarten. Dabei handelt es sich zum einen um den so genannten Attributspeicher, in dem die CIS (siehe Kapitel 31.3) abgelegt wird, und zum anderen um den Memory- und den I/O-Speicherbereich. Der jeweils aktive Speicherbereich wird durch die in Tabelle 31.3 angeführten Signalleitungen festgelegt. Die Implementierung der Card-Enable-Signale CE1 und CE2 ist dabei historisch bedingt. Eine praktische Bedeutung hat lediglich der 16-Bit-Zugriffsmodus. Eine ausführliche Beschreibung der einzelnen Signale ist in Kapitel 31.5 zu finden.
31.3 Card Information Structure – CIS Die Card Information Structure (CIS) einer PCMCIA-Karte ist in einem nichtflüchtigen Speicher, meist in einem EEPROM, abgelegt. Mithilfe dieser Informationen ist es dem Betriebssystem möglich, die Karte zu identifizieren. Wenn eine Karte in einen Slot geschoben wird, wird sie zunächst als Speicherkarte initialisiert, und nach Abschluss des Vorgangs wird das RDY/BSYSignal aktiviert, woraufhin das System die CIS der Karte liest und sie weiterhin entsprechend verwendet. Des Weiteren liefert die CIS wichtige Informationen über die Ressourcenanforderungen und den Stromverbrauch einer PCMCIA-Karte. Während der Initialisierungsphase der Karte liest das Betriebssystem die CIS mithilfe der Card- und Socket-Services aus. Die CIS besteht aus Datenblöcken unterschiedlicher Länge, die als Tupels bezeichnet werden und jeweils maximal 255 Bytes an Informationen enthalten können. Jedes dieser Tupel besitzt einen in der PCMCIA-Metaformatspezifikation festgelegten Aufbau. Mit PCMCIA Version 2.0 werden 21 Tupel-Codes, beispielsweise für Byteanordnungen, Prüfsummen, Spannungsbedarf (5 V oder 3,3 V) und Gerätetypen (I/O, SRAM usw.) definiert. Die CIS wird als verkettete Liste von Tupeln innerhalb des Attributspeichers der PCMCIA-Karte gespeichert. Ihre grundsätzliche Struktur ist in Abbildung 31.4 gezeigt. Das erste Byte des Tupels enthält eine eindeutige ID, den so genannten TPL-CODE, der die Funktion des jeweiligen Tupels bestimmt. Der nächste Eintrag, TPL-LINK, bestimmt die Länge der nachfolgenden Daten und erlaubt dem CIS-Parser des Betriebssystems eine eindeutige Abgrenzung der einzelnen Tupel. I/O-Karten müssen im Gegensatz zu Memory-Karten eine so genannte Configuration-Table enthalten. Diese besteht aus einem oder mehreren Einträgen mit Informationen über die möglichen Betriebsparameter der PCMCIA-Karte. Jeder einzelne dieser Einträge ist durch eine fortlaufende ID gekennzeichnet und repräsentiert eine mögliche Ressourcenkombination der Karte, vergleichbar in etwa mit den Jumper-Einstellungen bei einer ISA-Karte.
Sandini Bib PCMCIA und Card-Bus
1007
Abb. 31.4: Die Card Information Structure
In der Abbildung 31.4 (links) ist die Struktur der Configuration Table gezeigt. Die innerhalb eines solchen Abschnitts gespeicherten Informationen sind im rechten Teil der Abbildung zu erkennen. Viele Einträge sind dabei jedoch als optional anzusehen. Unverzichtbar ist jedoch die Beschreibung der I/O- bzw. Memory-Ressourcen und der Interruptanforderungen. Der ConfigurationTupel ist den Einträgen der Configuration-Tables vorgelagert. Hiermit wird die absolute Adresse und die Anzahl der Configuration-Register im Attributspeicherbereich festgelegt; außerdem gibt der Configuration-Tupel die Indexnummer des letzten Configuration-Table-Eintrags an. Bei der Auswertung der CIS durch das Betriebssystem werden die Configuration-Table-Einträge nacheinander geprüft. Erkennt das System dabei eine gültige Ressourcenkombination, gibt es die entsprechenden Ressourcen frei. Die ID des gewählten Eintrags wird der Karte über das Configuration-Option-Register mitgeteilt. Die wichtigsten Tupel, die zudem für die PnP-Einbindung von I/O-Geräten in Windows notwendig sind, sind in Tabelle 31.4 erläutert. Diese bilden die minimale Tupel-Konfiguration einer I/O-PCMCIA-Karte, wie sie auch für Windows benötigt wird.
Sandini Bib 1008
Kapitel 31
CIS-Tupel
Funktion/Bedeutung
CISTPL_DEVICE, 01h CISTPL_NOLINK, 14h CISTPL_VERS1, 15h
Legt fest, ob es sich um eine allgemeine Speicherkarte handelt. Zeigt dem CIS-Parser das Ende der Tupelkonfiguration an. Hier werden die Manufacturer- und Product-Einträge der Device-ID abgelegt. Festlegung der Konfigurationsregister. Beschreibt die verwendeten Ressourcen der Karte. Funktions-ID der Karte. Spezielle, nicht von Windows kategorisierte Funktionen werden durch den Eintrag 0xFE gekennzeichnet.
CISTPL_CNF, 1Ah CISTPL_CFTABLE_ENTRY , 1Bh CISTPL_FUNCID, 21h
Tab. 31.5: Minimale CIS-Tupelkonfiguration
31.4 Configuration-Register Jede PCMCIA-I/O-Karte muss mehrere Configuration-Register zur Verfügung stellen. Ihre Speicheradresse innerhalb des Attributspeichers und ihre Anzahl wird im Configuration-Tupel der CIS festgelegt. Eine besondere Bedeutung kommt dabei dem Configuration-Option-Register zu. Es ist das einzige nicht optionale Register und speichert in den unteren sechs Bits den Configuration-Index. Das Betriebssystem initialisiert diesen Wert mit der Index-Nummer desjenigen ConfigurationTable-Eintrags, der während der Initialisierungsphase durch das Betriebssystem akzeptiert wurde. Durch diese Rückmeldung kann beispielsweise ein programmierbarer Adresskonverter an verschiedene Adressbereiche angepasst werden. Die Implementierung der restlichen optionalen Configuration-Register obliegt dem jeweiligen Interface-Baustein der Karte. Nachfolgend ist eine Auswahl der in der PCMCIA-Spezifikation (Revision 2.1) definierten, wichtigsten Register angegeben:
: : : :
COR: Das Configuration Option Register speichert den Configuration-Table-Index. PRR: Das Pin Replacement Register enthält Informationen über den Zustand derjenigen Statusleitungen, die während eines Betriebs der Karte im I/O-Mode nicht aktiv sind. SCR: Das Socket and Copy Register ermöglicht den gleichzeitigen Betrieb zweier identischer Karten mit überlappenden oder gleichen Adressbereichen. ESR: Das Extended Status Register dient der Übermittlung von Statusinformationen zum Host.
31.5 Anschlussbelegung Im Folgenden finden Sie alle Kontakte und Signale der PCMCIA-Schnittstelle entsprechend dem Standard 2.0. Der Standard 1.0 hat nur Speicherkarten vorgesehen, und daher wird die Schnittstelle beim Einschalten standardmäßig als reine Speicherschnittstelle konfiguriert. Außerdem waren die Signale WAIT und RESET bei der Spezifikation 1.0 als frei markiert, also nicht implementiert. PCMCIA arbeitet mit einer asynchronen 16-Bit-Schnittstelle, und zwar ausschließlich im SlaveModus. Der Datenbus ist 16 Bit breit, und mit den 26 Adressleitungen lässt sich damit ein Bereich von maximal 64 MByte direkt adressieren. Für den Input/Output-Modus ist die 8-BitDatenübertragung der Standard. Bei Speicherkarten werden die Signale für Ein-/AusgabeFunktionen (IOR, IOW, INPACK, IO16) nicht verwendet.
Sandini Bib
PCMCIA 2.0
1009
GND D3 D4 D5 D6 D7 CE1 A10 OE A11 A9 A8 A13 A14 WE/PGM RDY/BSY IREQ Vcc Vpp1 A16 A15 A12 A7 A6 A5 A4 A3 A2 A1 A0 D0 D1 D2 IOIS16 WP GND
PCMCIA und Card-Bus
Speicher- und I/O-Karten
20 50
30 60
34 68
SPKR STSCHG
Speicher- und I/O-Karten
INPACK
Nur-Speicher-Karten
10 40
GND CD1 D11 D12 D13 D14 D15 CE2 RFSH res res A17 A18 A19 A20 A21 Vcc Vpp2 A22 A23 A24 A25 res RESET WAIT res REG BVD2 BVD1 D8 D9 D10 CD2 GND
1 35
IORD IORD
Nur-Speicher-Karten
Abb. 31.5: Belegung des PCMCIA-Slots
A25–A0 (O) Anschlüsse 8, 10–14,19–29, 46–50,53–56 Diese 26 Adressanschlüsse dienen zur Adressierung von insgesamt 64 MByte Speicher oder 64k I/O-Ports (A15–A0; nur I/O-Karten) auf der eingesetzten PCMCIA-Karte. BVD2, BVD1 (I) Anschlüsse 62–63 Die beiden Battery-Voltage-Detect-Kontakte geben den Ladezustand der Batterie auf einer PCMCIA-Speicherkarte an. Die Signalkombinationen (BVD2, BVD1) haben folgende Bedeutungen: (11) Batterie o.k. (10) Batterie leer, Daten verloren (01) Warnzustand, Batterie muss ersetzt werden, aber noch kein Datenverlust (00) Batterie leer, Daten verloren CD1, CD2 (I) Anschlüsse 36, 67 Die Card-Detect-Kontakte erfassen, ob eine PCMCIA-Karte eingesetzt ist oder nicht. Die Adapterlogik treibt CD1 und CD2 bei leerem Slot auf einen hohen Pegel. Wird nun eine Karte eingesetzt, dann verbindet die eingesetzte Karte die Card-Detect-Kontakte mit Masse und zieht sie daher auf einen niedrigen Pegel. Diese Pegeländerung zeigt eine eingesetzte Karte an. CE2, CE1 (O) Anschlüsse 7, 42 Die beiden Card-Enable-Anschlüsse dienen zur Aktivierung des höherwertigen (CE2) und niederwertigen (CE1) Teils des Datenbus D15–D0. D15–D0 (I/O) Anschlüsse 2–6, 30–32, 37–41, 64–66 Diese Kontakte bilden den 16-Bit-Datenbus der PCMCIA-Schnittstelle. GND Anschlüsse 1, 34, 35, 68 Diese Anschlüsse liegen auf Masse.
Sandini Bib 1010
Kapitel 31
INPACK (I) Anschluss 60 Die eingesetzte Karte bestätigt die Übergabe eines Signals mit einem Input-Acknowledge-Signal INPACK mit niedrigem Pegel. IOIS16 (I) Anschluss 33 Das Signal an diesem Anschluss (IO Port is 16-Bit) liegt auf einem niedrigen Pegel, wenn der gegenwärtige I/O-Zugriff einen 16-Bit-Port adressiert. IORD (O) Anschluss 44 Zusammen mit einem niedrigen REG-Signal weist ein I/O-Read-Signal mit niedrigem Pegel die eingesetzte I/O-Karte an, einen I/O-Zugriff auszuführen und Daten an den Sockel zu übergeben. IOWR (O) Anschluss 45 Zusammen mit einem niedrigen REG-Signal weist ein I/O-Write-Signal mit niedrigem Pegel die eingesetzte I/O-Karte an, einen I/O-Zugriff auszuführen und Daten vom Sockel zu übernehmen. IREQ (I) Anschluss 16 Dieses Interrupt-Request-Signal wird von einer eingesetzten I/O-Karte aktiviert, also auf einen niedrigen Pegel gezogen, um einen Hardware-Interrupt auszulösen. Ein Beispiel für eine I/OKarte, die eine solche Anforderung auslöst, wäre ein PCMCIA-Modem, das einen Anruf empfängt (RI aktiv) und den Host auffordert, den Anruf zu bedienen. OE (O) Anschluss 9 Wenn Daten von einer PCMCIA-Speicherkarte gelesen werden sollen, treibt der PCMCIA-Controller das Output-Enable-Signal OE auf einen niedrigen Pegel. RDY/BSY (I) Anschluss 16 Das Ready/Busy-Signal zeigt an, ob die eingesetzte Karte den zuvor ausgelösten Schreibzugriff bereits abgeschlossen (RDY/BSY=1) hat oder noch mit diesem Zugriff beschäftigt ist (RDY/ BSY=0). REG (O) Anschluss 61 Dieses Attribute-Memory-Select- oder Register-Signal liegt für alle Zugriffe auf den Hauptspeicher der PCMCIA-Karte über aktive WE- oder OE-Signale auf einem hohen Pegel. Soll der Attributspeicher der PCMCIA-Karte angesprochen werden, muss REG auf einem niedrigen Pegel sein. I/O-Karten reagieren nur dann auf IORD und IOWR, wenn REG auf einem niedrigen Pegel ist, führen also nur für ein niedriges REG einen I/O-Zugriff auch wirklich aus. Res Anschluss 57 Dieser Anschluss ist reserviert. Bei reinen Speicherslots (Revision 1.0) sind außerdem noch die Anschlüsse 44–45 und 60 als reserviert anzusehen.
Sandini Bib PCMCIA und Card-Bus
1011
RESET (O) Anschluss 58 Ein Signal mit hohem Pegel an diesem Kontakt setzt die eingesetzte PCMCIA-Karte zurück. RESET ist ab PCMCIA-Spezifikation 2.0 vorgesehen. RFSH (O) Anschluss 43 Ein hoher Refresh-Signalpegel weist eine Auffrischung des Speichers einer PCMCIA-Speicherkarte an. SPKR (I) Anschluss 62 Der Speaker- oder Digital-Audio-Anschluss empfängt Audiodaten von der eingesetzten Karte und leitet sie an den Systemlautsprecher weiter. STSCHG (I) Anschluss 63 Das Status-Changed-Signal wird aktiviert, wenn sich der PCMCIA-Kartenstatus geändert hat. Vcc (O) Anschlüsse 17, 51 Die beiden Kontakte versorgen die eingesetzte PCMCIA-Karte mit der Betriebsspannung. Vpp1, Vpp2 (O) Anschlüsse 18, 52 Die beiden Kontakte geben Programmierspannungen ab. Sie sind üblicherweise höher als Vcc und versorgen beispielsweise Flash-Speicher. WAIT (I) Anschluss 59 Kann eine eingesetzte Karte einen Speicher- oder I/O-Zugriff nicht schnell genug abschließen, senkt sie das Signal an diesem Kontakt auf einen niedrigen Pegel ab. WAIT dient also praktisch zum Einlegen von Wartezyklen. WAIT ist erst ab der PCMCIA-Spezifikation 2.0 vorgesehen. WE/PRGM (O) Anschluss 15 Ein niedriger Signalpegel an diesem Write-Enable/Program-Anschluss zeigt die Übergabe von Schreibdaten vom Slot an die eingesetzte Karte an. WP (I) Anschluss 33 Das Write-Protect-Signal an diesem Kontakt gibt den Zustand des Schreibschutzschalters von PCMCIA-Karten an. Ein hoher WP-Pegel zeigt eine schreibgeschützte Karte an.
31.6 Card-Bus Im Jahre 1994 wurde der PC Card-Bus-Standard vorgestellt, der die PCMCIA-Version 2.0 und JEIDA 4.2 ersetzt. Entgegen der Bezeichnung handelt es sich jedoch nicht um ein Bussystem auf elektrischer, sondern auf logischer Ebene. Das heißt, auch hier gibt es nur Punkt-zu-Punkt-Verbindungen zwischen dem Adapter und einer Karte.
Sandini Bib 1012
Kapitel 31
Als Spannungsversorgung sind für die Karten sind 3,3 V vorgeschrieben, und auch das Busmastering (DMA) ist implementiert. Obwohl es sich bei dem Card-Bus um eine völlig neue Architektur im Vergleich zu PCMCIA handelt, wird hier der gleiche 68-polige Anschluss verwendet, und die üblichen PCMCIA-Karten können auch in einem Card- Bus-Hostadapter eingesetzt werden. Tabelle 31.5 zeigt die wichtigsten Unterschiede zwischen PCMCIA und dem Card-Bus. Parameter
PCMCIA
Card-Bus
Schnittstelle Schnittstellentyp Takt (max.) Bandbreite Datenbusbreite Adressierung Spannung Interruptkanäle Konfiguration Karteninformation
68 Pins Punkt-zu-Punkt, asynchron nur Slave asynchron 8–20 MByte/s 16 Bit 26 Bit 5 V, 3,3 V einer über Attributspeicherbereich in der CIS (Card Information Structure)
68 Pins Punkt-zu-Punkt, synchron Master/Slave 33 MHz 132 MByte/s 32 Bit 32 Bit 3,3 V einer über Configuration Space im Configuration Space
Tab. 31.6: Unterschiede zwischen PCMCIA und Card-Bus
Die Architektur des Card-Bus ist sehr stark an den PCI-Bus (siehe Kapitel 22) angelehnt und realisiert einen 32-Bit-Bus mit einem maximalen Takt von 33 MHz. Einige Teile der Spezifikation wurden direkt aus der PCI-Spezifikation übernommen, wie die Definition des Configuration Space oder auch die Bezeichnung und Verwendung einzelner Bussignale (CFRAME, CCBE[3:0] , CTRDY). Jeder übliche Card-Bus-Zyklus wird wie bei PCI als Burst ausgeführt. Zur Veranschaulichung der Analogie zu PCI ist in Abbildung 31.6 das Timing eines Card-Bus-Lesevorgangs gezeigt. PCI und der Card-Bus absolvieren diese Busoperation – wie im Prinzip auch alle anderen – auf die gleiche Art und Weise, so dass ich auf eine nähere Beschreibung des Card-Bus verzichten möchte. In den Tabellen 31.7 und 31.8 sind die Card-Bus-Signale angegeben, und Sie werden dabei die unmittelbare PCI-Verwandschaft feststellen können.
Abb. 31.6: Der Card-Bus arbeitet im Prinzip wie der PCI-Bus. Hier ist ein Lesevorgang dargestellt.
Sandini Bib PCMCIA und Card-Bus
1013
Entsprechend dem eingesetzten Kartentyp werden die Signalleitungen entweder in den PCMCIA- oder in den Card-Bus-Modus umgeschaltet. Zur Erkennung dienen dabei die Signale CCD2, CCD1 und CV1 sowie CV2, die als Karten- und Spannungserkennungspins definiert sind. Die folgenden Tabellen zeigen die einzelnen Card-Bus-Signale mit einer kurzen Beschreibung ihrer jeweiligen Funktion. Kontakt Nr.
Bezeichnung
Signal/Funktion
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
GND CAD0 CAD1 CAD3 CAD5 CAD7 CCBE0 CAD9 CAD11 CAD12 CAD14 CCBE1 CPAR CPERR CGNT CINT Vcc Vp1 CCLK CIRDY CCBE2 CAD18 CAD20 CAD21 CAD22 CAD23 CAD24 CAD25 CAD26 CAD27 CAD29 RFU CCLKRUN GND
Masse Adressen/Daten 0 Adressen/Daten 1 Adressen/Daten 3 Adressen/Daten 5 Adressen/Daten 7 Befehl/Byte 0 Adressen/Daten 9 Adressen/Daten 11 Adressen/Daten 12 Adressen/Daten 14 Befehl/Byte 1 Card Bus Parity Card Bus Parity Error Card Bus Grant Card Bus IRQ Versorgungsspannung Programmierspannung 1 Card Bus-Takt Card Bus Initiator bereit Befehl/Byte 2 Adressen/Daten 18 Adressen/Daten 20 Adressen/Daten 21 Adressen/Daten 22 Adressen/Daten 23 Adressen/Daten 24 Adressen/Daten 25 Adressen/Daten 26 Adressen/Daten 27 Adressen/Daten 29 Reserviert Card Bus starten Masse
Tab. 31.7: Signale des Card-Bus (Seite A, Oberseite)
In der Handhabung und Konfigurierung unterscheiden sich aus Anwendersicht eine PCMCIAKarte und eine Karte gemäß dem Card-Bus-Standard nicht, obwohl hier doch recht unterschiedliche Systeme zugrunde liegen. Die enge Verwandtschaft des Card-Bus zu PCI erleichtert dem Hard- und Software-Entwickler seine Arbeit aber ganz erheblich, weil diese beiden Systeme im Prinzip auf die gleiche Art und Weise funktionieren. Die spezielleren Dinge, die bei PCMCIA zu beachten sind, wie die Card Information Structure (CIS) und der Attributspeicherbereich, sind für
Sandini Bib 1014
Kapitel 31
den Card-Bus nicht mehr relevant. Dies ist auch nicht weiter verwunderlich, denn PCMCIA ist ja zeitlich vor PCI entwickelt worden. Kontakt Nr.
Bezeichnung
Signal/Funktion
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
GND CCD1 CAD2 CAD4 CAD6 RFU CAD8 CAD10 CVS1 CAD13 CAD15 CAD16 RFU CBLOCK CSTOP CDEVSEL Vcc Vpp CTRDY CFRAME CAD17 CAD19 CVS2 CRST CSERR CREQ CCBE3 CAUDIO CSTSCHG CAD28 CAD30 CAD31 CCD2 GND
Masse Kartenkennung 1 Adressen/Daten 2 Adressen/Daten 4 Adressen/Daten 6 Reserviert Adressen/Daten 8 Adressen/Daten 10 Spannungskennung 1 Adressen/Daten 13 Adressen/Daten 15 Adressen/Daten 16 Reserviert Card-Bus gesperrt Card-Bus Stop Card-Bus-Gerätewahl Versorgungsspannung Programmierspannung 2 Card-Bus-Ziel bereit Card-Bus Cycle Frame Adressen/Daten 17 Adressen/Daten 19 Spannungskennung 2 Card-Bus Reset Card-Bus Error Card-Bus-Anfrage Befehl/Byte 3 Card-Bus Audio Card-Bus-Statusänderung Adressen/Daten 28 Adressen/Daten 30 Adressen/Daten 31 Kartenkennung 2 Masse
Tab. 31.8: Signale des Card-Bus (Seite B, Unterseite)
Sandini Bib
32
Universal Serial Bus
Wie Sie aus den vorherigen Kapiteln erfahren haben, gibt es eine ganze Reihe unterschiedlicher Bussysteme und Schnittstellen, was dementsprechend verschiedene Interfaces und Anschlüsse bedeutet. Zur Reduzierung und Vereinheitlichung der zahlreichen verschiedenen Steckverbinder bei einem PC wurde der Universal Serial Bus (USB) von einigen Firmen, unter maßgeblicher Federführung von Intel, ins Leben gerufen. Seit Ende des Jahres 1995 besitzen bereits viele Mainboards einen entsprechenden Connector. Nach anfänglichen Startschwierigkeiten gibt es mittlerweile auch eine Vielzahl von USB-Geräten wie Tastaturen, Mäuse, Scanner, Drucker, Fax/Modem, Lautsprecher und verschiedene Laufwerke (z.B. CD-ROM, ZIP, LS-120). Der USB stellt sich in seiner Topologie als kombinierte Strang-Sternstruktur dar. Er ist im elektrischen Sinne somit gar kein Bus, sondern lediglich auf logischer Ebene. Da physikalisch immer eine Punkt-zu-Punkt-Verbindung realisiert wird, sind keine Terminatorwiderstände festzulegen. Sie sind jeweils fest in den Geräten eingebaut.
Abb. 32.1: Der USB ist als kombinierte Strang-Sternstruktur ausgelegt.
Gesteuert wird der USB von einem Host, der sich direkt auf dem Mainboard oder auch auf einer PCI-Einsteckkarte befindet. Alle Aktivitäten gehen generell vom Host (Root Hub) aus, der sich gegenüber der CPU des PCs als Interrupt-fähig darstellt und typischerweise den IRQ 11 verwendet. Es findet ein Polling-Betrieb statt, und kein USB-Gerät kann von sich aus einen Transfer initiieren. Aus diesem Grunde und damit die Daten nicht verloren gehen können, wenn der Bus gerade mit der Abfrage eines Gerätes beschäftigt ist und die anderen warten müssen, sind in den Geräten eigene Datenpuffer (FIFOs) notwendig.
Sandini Bib 1016
Kapitel 32
Der USB-Host bildet üblicherweise auch gleich einen Verteiler (Hub) für den Anschluss mehrerer USB-Geräte, die hier als Nodes bezeichnet werden. Ein USB-Hub – Sternverteiler – kann zum einen im Chipset des Mainboards integriert oder auch als eigenständiges Gerät ausgeführt sein. Des Weiteren kann eine geeignete Tastatur oder ein Monitor ebenfalls als USB-Hub fungieren. Diese Hubs erweitern das USB-Bussystem durch die Bereitstellung zusätzlicher Ports, wobei jeder Hub einen Upstream- und mehrere Downstream-Ports zur Verfügung stellt und wie jedes andere USB-Gerät zu konfigurieren ist, denn er erhält ebenfalls (automatisch) eine eigene Adresse im System. Ein USB-Hub ist daher nicht einfach nur ein Verteiler, der die Daten lediglich durchreicht, sondern beinhaltet eine gewisse Eigenintelligenz, wofür im Hub üblicherweise ein eigener Mikrocontroller verwendet wird, der den Datenverkehr in Abhängigkeit von den hieran angeschlossenen USB-Geräten entsprechend regelt. Es ist sicher sinnvoll die Peripherie-Einheiten mit einen einzigen Controller zu steuern, was nicht nur die notwendige Anzahl an unterschiedlichen Anschlüssen reduziert, sondern auch weniger PC-Ressourcen (E/A-, Speicher-Adressen, Interrupt- und DMA-Kanäle) beansprucht, die in einem PC generell etwas knapp bemessen sind, wenn zahlreiche verschiedene PC-Einheiten zum Einsatz kommen. Aus diesem Grunde hat der USB bereits eine ganze Reihe von Schnittstellen wie RS232, den Parallel-Port oder auch den Joystickanschluss ersetzt, da aktuelle Modems, Drucker oder Joysticks mit einem USB-Anschluss versehen sind. Neuere PCs – und insbesondere Notebooks – verfügen daher in vielen Fällen gar nicht mehr über diese Legacy-Schnittstellen. Einige der genannten Peripherie-Einheiten besitzen neben dem USB-Anschluss jedoch auch noch einen der konventionellen Connectoren, die jedoch ganz allgemein immer seltener eingebaut werden. Für die Verbindung von Geräten mit Legacy-Schnittstellen mit dem USB gibt es eine Vielzahl passender »Adapterkabel«, die jedoch nicht besonders preisgünstig erscheinen. Dies liegt aber daran, dass beispielsweise für die Umsetzung zwischen einem Parallel-Port und dem USB ein Microcontroller mit USB-Funktionalität zum Einsatz kommt, der die beiden völlig unterschiedlichen Protokolle umsetzen muss. Demnach handelt es sich bei diesen Lösungen keineswegs um simple Adapter, sondern um recht komplexe USB-Einheiten. Der USB-Controller (Host) belegt nur einen Interrupt-Kanal und wenige E/A-Adressen, unabhängig davon, was hier im Einzelnen angeschlossen wird. In der Praxis stellt sich jedoch bei der Verwendung unterschiedlicher USB-Geräte (Tastatur, Maus, Lautsprecher, Scanner, Web-Kamera) oftmals heraus, dass die Datenübertragungsrate von 12 MBit/s (1,5 MByte/s) nicht immer ausreicht, was sich durch unterbrochene Audio- und Video-Sequenzen bemerkbar machen kann. Der USB soll zwar auch für die Übertragung von Audio- und (komprimierten) MPEG-Daten eingesetzt werden, was ohne merkliche Einbußen jedoch erst mit der neueren High Speed Version (480 MBit/s) möglich ist, die im USB-Standard 2.0 definiert und abwärtskompatibel zu USB 1.1 ist. Der USB unterstützt drei Geschwindigkeitsklassen:
: : :
Low-Speed: maximal 1,5 MBit/s Medium-Speed/Full-Speed: maximal 12 MBit/s High-Speed: maximal 480 MBit/s
Für den Modus mit 12 MBit/s findet man mitunter zwei unterschiedliche Bezeichnungen, und zwar Medium-Speed und Full-Speed. Da High-Speed erst mit dem USB 2.0-Standard eingeführt wurde, ist die vorherige Zuordnung (Low und Medium) von einigen Herstellern »aufgeweicht« worden, und Full-Speed kennzeichnet somit die »volle Geschwindigkeit«, die die erste USB-Version zu leisten vermag.
Sandini Bib Universal Serial Bus
1017
Das erste Betriebssystem, das den USB korrekt unterstützt, ist Windows 98, während die Vorgängerversion nur eine fehlerträchtige USB-Implementierung bietet. Die Tastatur ist meist das einzige USB-Gerät, das sich auch unter DOS verwenden lässt, denn die eigentliche USB-Funktionalität ist im Betriebssystem (z.B. in Windows 98) integriert, und das BIOS bietet nur eine marginale USB-Unterstützung, die sich nicht für die Programmierung von USB-Devices eignet.
32.1 Anschlüsse und Signale Der USB setzt sich aus vier Leitungen zusammen. Für die Datenübertragung werden lediglich zwei differenzielle Signalleitungen (D+, D-) verwendet. Das Differenzsignal beträgt maximal 4 V (typisch 3,3 V). Eine logische Eins liegt dann vor, wenn D+ ... D- > 200 mV ist, und eine Null bei D- ... D+ > 200 mV, was praktisch 2,8 V bis 3,6 V für ein High und für ein Low einen Pegel von weniger als 0,3 V bedeutet. Ein Taktsignal gibt es hier nicht, sondern es wird aus dem Datenstrom selbst mittels der NRZIKodierung (Non Return to Zero Inverted) generiert. Die Kodierung der Daten erfolgt derart, dass sie zunächst durch ein Schieberegister in eine serielle Form gebracht werden. Daraufhin durchlaufen sie einen so genannten Bitstuffer und werden dem NRZI-Encoder zugeführt, der die Daten dann auf die differenziell arbeitenden Treiber führt.
Abb. 32.2: Die seriellen Daten durchlaufen vor der NRZI-Kodierung einen Bitstuffer, der nach jeder sechsten Eins eine Null einfügt, damit ein Polaritätswechsel stattfindet.
Bei jeder Null im Datenstrom generiert NRZI einen Polaritätswechsel, während die Polarität bei einer Eins unverändert bleibt, was zu einem Synchronisationsverlust zwischen Sender und Empfänger führen kann. Aus diesem Grund gibt es den Bitstuffer, der nach sechs aufeinander folgenden Einsen automatisch eine Null einfügt, was somit zu einem forcierten Polaritätswechsel führt. Auf der Empfängerseite findet nun der umgekehrte Vorgang statt (Empfang der Daten, NRZIDekodierung), und ein Bitdestuffer entfernt wieder die eingefügte Null, wodurch das Schieberegister wieder die reinen Nutzdaten erhält. Die erwähnten Einheiten wie NRZI-Kodierer oder Bitstuffer sind komplett in Hardware realisiert und können daher nicht durch Software ersetzt oder manipuliert werden. Die beiden anderen USB-Leitungen führen das Massesignal und die Spannungsversorgung (VBus) von typischerweise 5 V, die für die Versorgung von USB-Geräten über den Bus verwendet werden können. Je nach Leistungsaufnahme machen die einzelnen Geräte davon Gebrauch oder nicht, denn für die maximale Stromaufnahme über den Bus sind 500 mA definiert. Einige
Sandini Bib 1018
Kapitel 32
Geräte, wie etwa Scanner oder auch Modems, benötigen daher eine eigene Stromversorgung. Dies betrifft jedoch nicht eine USB-Tastatur oder eine USB-Maus, da diese auch bei den konventionellen Anschlüssen von dem PC selbst mit der nötigen Betriebsspannung versorgt werden können. Der USB ermöglicht das Hot Plugging, also das Anschließen oder Abziehen eines USBGeräts während des laufenden Betriebs, wofür die Kontakte der Spannungsversorgung etwas länger ausgeführt sind als die beiden Kontakte für das Datensignal. Als USB-Einheiten können laut der USB-Spezifikation 1.1 Low-Speed-Geräte (1,5 MBit/s) oder auch Full-Speed-Geräte (ehemals als Medium-Speed bezeichnet) mit 12 MBit/s verwendet werden. Einheiten wie Maus, Tastatur oder Joystick gehören zur ersten Kategorie, während Scanner, ISDN- und Audio-Einheiten der zweiten zuzurechnen sind. Mit der Version USB 2.0 (480 MBit/s) sind außerdem Video- und Speichereinheiten ohne merkliche Verzögerungen einsetzbar. Diese High-Speed-Version ist abwärtskompatibel zu USB 1.1, und für langsamere Geräte (Low, Full) wird hier automatisch eine entsprechende Umschaltung durchgeführt. Die Verbindung zwischen einem Hub und einem Node findet stets mit derjenigen Bandbreite statt, die beide Einheiten unterstützen.
Abb. 32.3: Das Kabel für den Universal Serial Bus führt vier Leitungen.
Die Stecker sind für alle drei Versionen gleich, allerdings unterscheidet sich das zu verwendende Kabel. Es verfügt für Full- und High-Speed-Geräte über eine Abschirmung, und die einzelnen Leitungen sind miteinander verdrillt, was eine maximale Kabellänge zwischen den Geräten von 5 m erlaubt, im Gegensatz zum Kabel für Low-Speed-Geräte, das eine maximale Länge von 3 m nicht überschreiten darf, da hier weder eine Abschirmung noch eine Verdrillung vorgesehen sind. Bei Low-Speed-Geräten ist das USB-Kabel meist fest angeschlossen, d.h., sie besitzen keine Buchse. Für die USB-Verbindungen wird ein vierpoliger Anschluss verwendet, der jedoch mechanisch unterschiedlich ausgeführt ist. Der Connector der A-Serie weist einen rechteckigen Querschnitt und der Connector der B-Serie einen quadratischen Querschnitt auf. Der Grund für die unterschiedlichen Steckverbinder liegt darin, dass es mechanisch verhindert werden soll, unzulässige Verbindungen innerhalb der USB-Struktur (vgl. Abbildung 32.1) herstellen zu können. Ein übliches USB-Kabel besitzt auf der einen Seite einen A- und auf der anderen Seite einen B-Connector. Die A-Verbindung zeigt stets in die Upstream-Richtung (zum Host, Hub), während die B-Verbindung (downstream) an das jeweilige Gerät angeschlossen wird.
Abb. 32.4: Die beiden unterschiedlichen USB-Verbindungsanschlüsse
Sandini Bib Universal Serial Bus
1019
Dem guten Vorsatz, dass die Upstream- und Downstream-Richtung mithilfe der unterschiedlichen Connectoren eingehalten wird, laufen allerdings die erhältlichen Adapter zuwider, mit denen die unsinnigsten Verbindungen und Verlängerungen hergestellt werden können, was dementsprechend das gesamte USB-System aus dem Tritt bringen kann. Soll eine USB-Verbindung länger als 3 m bzw. 5 m ausfallen, sind aktive USB-Kabel vonnöten (falls hier kein USBHub dazwischengeschaltet werden soll), die eine Signalverstärkung vornehmen. Gleichwohl kann es durchaus gelingen, mit einem üblichen (passiven) Adapterstück 5 m auf bis zu 8 m zu verlängern, ohne dass etwa eine Web-Camera aussteigt. Allgemein funktioniert dies aber nicht, so dass man sicherheitshalber die vorgeschriebenen Längen einhalten sollte.
32.2 Identifizierung und Kommunikation Zunächst ist die Unterscheidung zwischen einem Low-Speed- und einem High-Speed-Gerät von Bedeutung. Jedes USB-Gerät verfügt über einen Widerstand von 1,5 kΩ, der an die Betriebsspannung (3,3 V) einerseits und an die D–-Signalleitung oder an die D+-Signalleitung andererseits angeschlossen ist. Ein Low-Speed legt diesen Widerstand an die Leitung D-, ein High-SpeedGerät demnach an die Leitung D+. Dieses »Hochziehen« einer Signalleitung stellt quasi die erste Kontaktaufnahme eines Gerätes mit dem USB dar. Der USB-Hub erkennt dies und leitet die weiteren Maßnahmen für die Konfigurierung ein. Das einfachste USB-Gerät ist also ein Widerstand, und falls Sie einmal ausprobieren wollen, wie der USB bzw. Windows reagiert und ob ein neues Gerät detektiert wird, können Sie einen 1,5-kΩ-Widerstand kurzzeitig zwischen den Kontakt 1 und 2 (vgl. Abbildung 32.4) halten. Daraufhin wird Windows feststellen, dass ein neues Gerät angeschlossen wurde und nunmehr der passende Treiber zu installieren ist. Ein Widerstand ist natürlich kein USB-Gerät, und einen Treiber gibt es hierfür auch nicht, gleichwohl ist hiermit durchaus die grundsätzliche Funktion zu testen. Der Microcontroller im USB-Gerät schaltet den Widerstand nur für einige Millisekunden durch, damit der Hub den Host informiert und daraufhin den betreffenden USB-Port freischaltet sowie einen Bus-Reset durchführt. Das USB-Device muss daraufhin auf einer Default-Adresse antworten (über Endpoint 0) und seine Fähigkeiten über einen Device-Deskriptor dem Host bekannt geben, der der USB-Einheit daraufhin eine Busadresse zuordnet, woraufhin alle weiteren Konfigurationsinformationen aus der Einheit gelesen werden können. Für jedes Gerät wird nach dem Anschluss an den USB ein so genannter Enumeration-Prozess vom Betriebssystem ausgeführt, was gewissermaßen einem USB-Plug&Play-Mechanismus inklusive der Treiberinstallation für das jeweilige Gerät entspricht. Die Identifizierung einer USB-Einheit und ihre logische Integration im System erfolgt dabei anhand von Deskriptoren über den Endpoint 0 eines jeden Gerätes. Während der Enumeration wird vom Host festgestellt, welche Datentypen jeweils unterstützt und welche Bandbreiten von den einzelnen USB-Einheiten benötigt werden. Jede USB-Einheit erhält eine eigene Adresse (maximal 127 sind möglich), die vom USB-Host nach dem Einschalten des Systems automatisch zugewiesen wird. Zur grundsätzlichen Geräteidentifizierung dient dabei eine Herstellerkennung (Vendor ID, zwei Bytes), eine Gerätekennung (Device ID, zwei Bytes), eine Versionsnummer (zwei Bytes) und ein Class-Code von drei Bytes. Diese Daten werden üblicherweise in einem EEPROM der USB-Einheit abgelegt. Neben dem Device-Deskriptor gibt es noch weitere Deskriptoren, die generell die physikalischen und logischen Eigenschaften einer USB-Einheit beschreiben. Im ersten USB-Standard sind es fünf grundlegende Typen (Device, Configuration, Interface, String, Endpoint), und mit dem USB 2.0-Standard kommen noch zwei neue hinzu, die insbesondere für die isochrone Datenübertragung von Bedeutung sind. Je nach Funktionsumfang einer USB-Einheit sind unter-
Sandini Bib 1020
Kapitel 32
schiedlich viele dieser Deskriptoren vorgesehen, die hier aber nicht im Detail erläutert werden sollen. Neben dem Device-Deskriptor ist der Endpoint-Deskriptor im Grunde genommen der wichtigste. Wie bereits erwähnt wurde, verwendet der USB lediglich die beiden differenziellen Signalleitungen (D-, D+) für die gesamte Kommunikation. Für die quasi parallele Datenübertragung werden mehrere (virtuelle) logische Datenkanäle verwendet, die als Pipes bezeichnet werden. Jede Pipe beansprucht einen Teil der verfügbaren USB-Bandbreite, wird vom USB-Host gebildet und endet stets in einem Endpoint, wobei jedes USB-Gerät mehrere Endpoints und somit mehrere Pipes unterstützt. Der oder die Endpoint-Deskriptoren kennzeichnen dabei die Eigenschaften dieser Endpoints, die in der Regel für einen bestimmten Transfermode (Control, Interrupt, Bulk, Isochronous, s.u.) und eine bestimmte Übertragungsrichtung (IN oder OUT) ausgelegt sind.
Abb. 32.5: Der Digital/Analog-Converter PCM2702 mit integriertem USB-Interface
Um die Sache etwas verständlicher zu machen, sei als Beispiel der PCM2702-Chip der Firma BurrBrown herangezogen. Dabei handelt es sich um einen Digital-Analog-Converter mit integriertem USB-Interface (vgl. Abbildung 32.5), wie er in USB-Lautsprechersystemen verwendet wird. Dies ist im Übrigen ein interessanter Chip, weil er ab Windows 98 automatisch unterstützt wird, sodass keinerlei spezielle Treiber benötigt werden. Nach dem Anstecken des USB-Kabels erscheint nach kurzer Zeit in der Systemsteuerung ein USB-Audiogerät, und mit dem Mediaplayer lässt sich dann sofort eine Audio-Datei (Wave, MP3, WMA, AAC usw.) wiedergeben. Der PCM2702 verfügt beispielsweise über drei Endpoints. Der Endpoint 0 stellt den Default-Endpoint dar, den jedes USB-Gerät unterstützen muss und der auch für die Übermittlung des DeviceDeskriptors verwendet wird. Dieser Endpoint wird daher auch allgemein als Control Endpoint bezeichnet und kann sowohl Daten aufnehmen (IN) als auch abgeben (OUT). Der Endpoint 1 beschreibt hier ein Standard-Audio-Control-Interface (IN und OUT) mit den Terminals Input (Zweikanal-Audio), Output (Speaker) und Feature (Lautstärkeregelung in 1-dB-Schritten, Stummschaltung). Der Endpoint 2 bildet den »Endpunkt« für den Isochronous-Audio-Stream (OUT), wo also die Audio-Daten (PCM: Pulse Code Modulation) verarbeitet werden.
Sandini Bib Universal Serial Bus
1021
Abb. 32.6: Die Daten des Device-Deskriptors für den Digital/Analog-Converter PCM2702
Der Aufbau der Endpoints, deren jeweilige Anzahl und welche Transfertypen hiermit über die Pipes absolviert werden können, ist durch den im jeweiligen Chip im USB-Gerät festgelegt. Üblicherweise entspricht dieser USB-Chip einem Microcontroller, der quasi in Hardware um die USB-Funktionalität erweitert wurde. Als Standard-Controller für universelle Full-Speed-Einheiten hat sich hier der (altbekannte) 8051-Controller etabliert. Wer vorhat, ein eigenes USB-Gerät zu entwickeln, muss sich einerseits nicht nur um die softwaretechnische Integration (WindowsTreiber, Applikation) kümmern, sondern muss andererseits auch den Controller mit einem geeigneten 8051-Code (Assembler, C) programmieren. Neben diesen universell einsetzbaren USB-Controllern gibt es jedoch eine ganze Reihe spezieller USB-Controller, die einzig und allein für einen ganz bestimmten Zweck vorgesehen sind, wie der erwähnte USB-D/A-Wandler oder auch ein USB-ATA- oder ein USB-Parallel-Port-Umsetzer, so dass dann keinerlei Controller-Programmierungen anfallen. Falls diese Geräte einer bestimmten Klasse – per EEPROM und/oder Device-Deskriptor – zugeordnet werden können, wie beispielsweise Audio, HID, Printer oder Mass Storage, ist zudem die Wahrscheinlichkeit sehr groß, dass Windows hierfür automatisch einen Treiber parat hat, so dass dann auch hierfür keine spezielle Software zu entwickeln ist. Näheres zu Windows-Treibern ist in Kapitel 35 zu finden.
32.3 Pakete und Transfers Für die Datenübertragung werden drei verschiedene Pakete verwendet: Token, Data und Handshake. Anhand der Packet Identifier (PID) werden sie jeweils identifiziert und voneinander unterschieden, wie es in Tabelle 32.1 angegeben ist. PID
Bedeutung
PID (Hex)
Typ
SETUP IN OUT SOF DATA1 DATA0 ACK NACK STALL PRE
Initialisierung Empfangen Senden Start of Frame Daten-Paket 1 Daten-Paket 0 Acknowledge Not Acknowledge Fehler Präambel
0x2d 0x69 0xe1 0xa5 0x4b 0xc3 0xd2 0x5a 0x1e 0x39
Token-Paket Token-Paket Token-Paket Token-Paket Daten-Paket Daten-Paket Handshake-Paket Handshake-Paket Handshake-Paket Special-Paket, nur für Low-Speed-Geräte
Tab. 32.1: Die wichtigsten Packet Identifiers
Sandini Bib 1022
Kapitel 32
Jedes Paket beginnt mit einem SYNC-Feld von 8 Bit, bestehend aus sieben Nullen und einer folgenden Eins. Die Nullen bewirken durch die NRZI-Kodierung der Daten den Polaritätswechsel, worauf sich die USB-Geräte synchronisieren und daraufhin den PID lesen, der Auskunft über die Art der Daten gibt.
Abb. 32.7: Paketvarianten
Für Audio- und erst recht Video-Daten ist es nötig, dass einer Datenübertragung eine gleich bleibende Zeitdauer oder ein Intervall eingeräumt wird, wodurch eine garantierte Bandbreite zur Verfügung steht, die auch als Isochronous Mode bezeichnet wird. Firewire (IEEE-1394, vgl. Kapitel 33) sieht ebenfalls einen derartigen Modus vor. Isochronous-Transfers haben dabei generell Vorrang vor asynchronen. Damit der USB aber nicht durch die Isochronous-Transfers blockiert wird und dann keine Daten einer (asynchronen) Tastatur oder Maus mehr übertragen kann, reserviert der USB-Host stets 20 Prozent der zur Verfügung stehenden Bandbreite für die asynchrone Datenübertragung. Die Daten (Data 1,0) selbst werden als unstrukturierte Folge von Bytes (Stream Pipe) mit einer maximalen Paketgröße von 1500 Bytes übertragen. Hier kommt ein Fehlerkorrekturverfahren nach dem Cyclic Redundancy Check (CRC16) zum Einsatz. Die Messages, die den Host beispielsweise darüber informieren, ob Daten verfügbar sind oder nicht und in dem Token-Paket übertragen werden, besitzen demgegenüber einen fest definierten Aufbau und werden als Message Pipes verarbeitet. Auch hier können Einzel- und Doppelbitfehler mit dem CRC-Verfahren (CRC5) erkannt und korrigiert werden. Für den USB-Datentransfer sind auf der Basis der Pakete vier Typen definiert, die bei unterschiedlichen Einheiten ihre Anwendung finden:
: : : :
Interrupt-Transfer: Maus, Tastatur Bulk-Transfer: Drucker, Scanner Isochronous-Transfer: Sound, Video Control-Transfer: System-Kontrolle
Der jeweils verwendete Übertragungsmodus wird beim Design des USB-Geräts festgelegt und ist nicht veränderbar. Der im Gerät eingesetzte USB-Controller bestimmt durch seine Endpoints, welche Transfer-Modi genutzt werden können. Low-Speed-Geräte unterstützen lediglich Control- und Interrupt-Transfers, während Full- und High-Speed-Geräte auch den Bulk- und den Isochronous-Transfer verwenden können. Ein typischer Full-Speed-Controller verfügt beispielsweise über den zwingend notwendigen Control-Endpoint mit EP0-IN und EP0-Out sowie über sieben Endpoints (jeweils IN und Out) für Bulk- und Interrupt-Transfers. Die Buffergröße beträgt dabei für jeden Endpoint 64 Bytes. Des Weiteren gibt es acht Isochronous-Endpoints, deren Buffer für jeden EP-IN und EP-Out eine Größe von maximal 1024 Bytes aufweisen.
Sandini Bib Universal Serial Bus
1023
Einheiten wie Maus und Tastatur benutzen den so genannten Interrupt-Transfer, wobei hier aber gar kein Interrupt ausgelöst wird, sondern diese Einheiten werden vom Host nur zyklisch (alle 10 ms) nach dem Vorhandensein neuer Daten abgefragt. Falls die Einheiten (noch) keine neuen Daten verfügbar haben, senden sie als Antwort auf das gesendete IN-Token ein NACK-Paket (vgl. Tabelle 32.1). Interrupt-Transfers belasten den USB nicht im besonderen Maße, da Maus und Tastatur generell nur geringe Datenmengen liefern. Der Bulk-Transfer ist allgemein für größere Datenmengen vorgesehen, wie sie bei Druckern oder Scannern anfallen. Diese Daten sind zwar nicht zeitkritisch, allerdings benötigen sie eine Fehlererkennung, damit die Datenkonsistenz gewahrt bleibt. Der Isochronous-Transfer ist bereits oben erläutert worden. Er wird für große Datenmengen verwendet, die zeitkritisch sind und eine konstante Bandbreite erfordern. Eine Fehlerkorrektur wird dabei nicht ausgeführt, weil sich einzelne Übertragungsfehler in der Praxis als weniger bedeutend gegenüber den zeitlichen Verzögerungen darstellen, die in Audio- oder Video-Streams als störend empfunden werden. Die Control-Transfers waren ursprünglich allein für die Konfiguration und die Steuerung von USB-Geräten vorgesehen und werden dann mit dem Endpoint 0 ausgeführt. Dabei greifen die Fehlerkorrektur und auch der Handshake-Mechanismus (ACK-NACK), was diese Übertragungsart sehr sicher macht. Da die Control-Transfers außerdem mit hoher Priorität arbeiten, fällt die Übertragungsrate mit 64 Bytes pro Request (Bulk: 512 Bytes, Isochronous: 1024 Bytes) unter den hier sichereren Gesichtspunkten vergleichsweise hoch aus. Aus diesem Grunde finden die Control-Transfers auch mit anderen Endpoints (Data Endpoints) überall dort ihre Anwendung, wo es um allgemeine I/O-Aufgaben geht, wofür in der Regel Low-Speed-Einheiten ausreichen.
32.4 USB 2.0 Der mit dem USB 2.0-Standard verfügbare High-Speed-Modus mit 480 MBit/s hat einige hardware-technische Veränderungen zur Folge, wobei aber auch eine Abwärtskompatibilität zu älteren USB-Einheiten gewahrt bleiben muss. Zunächst arbeiten Einheiten, die dem USB 2.0-Standard entsprechen, mit einem anderen Signalpegel von 400mV (Differenzspannung), der entweder als positiv gegenüber den Leitungen D+ und D- betrachtet wird oder als negativ, was als ein High bzw. als ein Low zu interpretieren ist. Ein High-Speed-Gerät wird zunächst wie ein Full-Speed-Gerät behandelt, d.h., es identifiziert sich als solches am USB, indem es die Leitung D+ über einen Pull-Up-Widerstand gegen 3,3 V zieht. Dadurch erkennt der Host den Anschluss einer neuen Full-Speed-USB-Einheit und legt beide Datenleitungen auf Low-Pegel (Single-Ended-Zero-Zustand), was das zu initialisierende HighSpeed-Gerät erkennt und seinerseits einen Strom in die Leitung D- treibt. Der High-Speed-Hub erkennt dies wiederum und speist abwechselnd die beiden Leitungen mit seinem High-SpeedTreiber, woraufhin das High-Speed-Gerät den Pull-Up-Widerstand abschaltet (Rpu_Enable, siehe Abbildung 32.8) und zunächst in einem Ruhezustand verweilt. Es ist somit als eine High-SpeedEinheit detektiert worden, woraufhin der oben erläuterte Enumeration-Prozess prinzipiell wie bisher auch absolviert wird. Der Schlüssel für die Unterscheidung zwischen USB-1- und USB-2-Einheiten liegt im Hub, der beide Varianten unterstützen können muss. Die Entwicklung von Hostadaptern und auch Geräten für den schnelleren Modus mit 480 MBit/s scheint daher auch nicht das eigentliche Problem zu sein, denn diese Einheiten müssen sich nicht um unterschiedliche Pegel und Erkennungsmechanismen kümmern, sondern sie verwenden eben hierfür die speziellen USB-2-Transceiver und
Sandini Bib 1024
Kapitel 32
kennen »von Hause aus« auch nur den High-Speed-Mode. Der Betrieb eines Gerätes, das HighSpeed unterstützt, ist an einem USB-1-Adapter natürlich nicht mit 480 MBit/s möglich, und das Gerät wird nur als Full-Speed-Gerät erkannt und daraufhin auch verwendet. Die High-SpeedSignalantwort (s.o.) bleibt vom USB-1-Adapter gewissermaßen einfach aus. Die eigentlichen Probleme treten also erst bei einem Mischbetrieb von »alten« und »neuen« USBEinheiten auf, was der Hub entsprechend zu regeln hat. Dieser verwendet daher auch zwei unterschiedliche Transceiver bzw. einen Chip, der zwei parallele Tranceiver-Einheiten für USB-1und USB-2-Einheiten enthält, was ihn und die ansteuernde Elektronik recht komplex werden lässt. Außerdem muss ein USB-2-Hub in der Lage sein, zwischen schnellen und langsamen Übertragungen zu vermitteln, diese also entsprechend umzusetzen, damit der USB nicht blockiert werden kann. Hierfür sind Start Split- und Complete Split-Transaktionen definiert worden, damit beispielsweise eine High-Speed-Übertragung in mehrere Full-Speed-Transfers aufzuteilen ist. Denkbar wäre ein High-Speed-Scanner, der mit einem Full-Speed-Drucker (und dem PC) über einen High-Speed-Hub verbunden ist. Diese »Vermittlungsfunktionalität« eines USB-2Hubs wird als Transaction Translator bezeichnet und macht einen Großteil der Eigenintelligenz eines High-Speed-Hubs aus.
Abb. 32.8: Ein USB-2-Hub verfügt über spezielle Transceiver für den High-Speed-Modus (HS) und über eine Umschaltung für den Pull-Up-Widerstand (Rpu).
Wie bei der ersten USB-Implementierung wird zwischen den beteiligten Einheiten, abhängig vom Transfer-Mode, ein Handshake mithilfe der ACK- und NACK-Pakete (siehe Tabelle 32.1) ausgeführt. Bei der Übertragung großer Datenpakete, die im High-Speed-Modus bei den Control- und Bulk-Transfers auftreten, ist eine Neuerung notwendig, damit der Bus nicht über Gebühr mit Datenpaketen belegt wird, die vom »Gegenüber« noch gar nicht verarbeitet werden können. Für High-Speed-Einheiten wurde daher eine Flusskontrolle mithilfe eines PING-Paketes definiert. Bevor der Host also unmittelbar ein großes, komplettes Datenpaket an einen Endpoint schickt, setzt er ein PING-Paket dorthin ab, und wenn das Gerät noch nicht empfangsbereit sein sollte, sendet es ein NACK zurück, andernfalls ein ACK, woraufhin erst die Datenübertragung stattfindet.
Sandini Bib
33
Firewire
Firewire wird oftmals mit dem IEEE-1394-Standard gleichgesetzt. Genau genommen ist Firewire jedoch lediglich eine mögliche Implementierung, die diesem Standard gehorcht. Allerdings ist Firewire zurzeit die einzig interessante IEEE-1394-Realisierung, die mit entsprechenden Produkten auf dem Markt präsent ist. Der Standard IEEE-1394 stammt ursprünglich aus dem Jahre 1987 und wurde von der Firma Apple initiiert. Bereits die Spezifikation des Nubus90, der in den Macintosh Quadra-Modellen und in leicht abgewandelter Form auch in den NeXT-Computern eingebaut war, sah einen derartigen seriellen Hilfsbus vor. Mit dem Ende dieser Modelle schien zunächst auch IEEE-1394 in Vergessenheit zu geraten. Dieser Standard wurde erst wieder interessant, als die Diskussion um die seriellen Bussysteme einsetzte. Im Jahre 1994 bildete sich die 1394 Trade Organization, deren Mitglieder sich aus Firmen wie Adaptec, AMD, Intel und Microsoft, aber auch Sony, JVC, Yamaha und Creative Labs rekrutieren, was bereits darauf hindeutet, dass Firewire für Videound Audio-Applikationen geeignet ist. Außerdem wird Firewire von (Messtechnik-)Firmen wie Hewlett-Packard (Agilent Technologies) oder National Instruments als möglicher Nachfolger des über 30 Jahren alten IEC-Bus (IEEE-488) für die computer-gestützte Messtechnik angesehen.
33.1 Architektur und Topologie Der Standard umfasst sowohl Definitionen für eine Backplane- als auch für eine Kabelverbindung von IEEE-1394-Einheiten, wobei für den PC-Markt die kabelorientierte Verbindung eher von Bedeutung ist, während die Backplane-Version in Industriesystemen (Compact PCI, PC-104) ihre Anwendung findet. Zurzeit sind drei Datenübertragungsraten üblich: 100, 200 oder 400 MBit/s, die in den Standards IEEE-1394 aus dem Jahre 1995 und in der fehlerbereinigten Version IEEE-1394a definiert sind. Die neueste Spezifikation IEEE-1394b aus dem Jahre 1999 ist abwärtskompatibel zu den vorherigen Standards und spezifiziert noch höhere Datenübertragungsraten von 800 MBit/s, 1,6 GB/s sowie 3,2 GBit/s. Prinzipiell bestimmt das langsamste aktive Gerät am Bus die jeweils maximal mögliche Datenrate. Die 1394 Trade Association hat aber mit IEEE-1394a eine automatische Setup-Funktion festgelegt, damit der Busmaster (PCI-Firewire-Hostadapter) Geräte unterschiedlicher Auslegung erkennen und mit den passenden Datenraten betreiben kann. Im Gegensatz zum USB, der funktionell bereits standardmäßig im Chipset des PC untergebracht ist, wird für Firewire oftmals eine separate PCI-Einsteckkarte benötigt. Einige neuere Chipsets, wie etwa von SiS (siehe Kapitel 17.6.2), integrieren jedoch auch gleich die Firewire-Elektronik mit in die Southbridge, und bei Notebooks der Firma Sony ist Firewire schon seit Jahren die Standardschnittstelle für die Verbindung mit digitalen Kameras und Rekordern. Bei Sony wird Firewire auch als i.Link bezeichnet. Vielfach wird hier eine Kamera für digitales Video angeschlossen, denn die Sony-Notebooks verfügen von Haus aus über die entsprechende Software, um hiermit Videos von der Kamera in den PC zu lesen und auch weiterverarbeiten zu können. Mittlerweile gibt es eine ganze Reihe von Produkten für Firewire, wie verschiedene Laufwerke, Scanner und auch Drucker. Firewire verwendet eine 64 Bit breite Adressierung und hält sich an das Control- und Status-Register-Management (CSR) für Mikrocomputer-Busse (IEEE-1291). Die oberen 16 Bits werden für die Geräteadressierung (Nodes) und die übrigen 48 Bits für die Register- und Speicherimplementierung
Sandini Bib 1026
Kapitel 33
verwendet. Im IEEE-1394-Standard werden zwei verschiedene Adressierungsarten (Node IDs) unterschieden, die entweder die Selektierung von 63 (6-Bit-Node) oder 1023 (10-Bit-Node) Knoten innerhalb des Gesamtsystems ermöglichen, wobei die Knoten generell als Memory-MappedDevices angesprochen werden. Die Verkabelung zwischen den Geräten darf nicht in einer Schleife ausgeführt werden, sondern es sind mehrere Stränge (Ports) möglich, wobei pro Port 16 Knoten in »Hintereinanderschaltung« (Daisy Chained) angeschlossen werden können. Es handelt sich somit um jeweils serielle Punkt-zuPunkt-Verbindungen zwischen jeweils zwei Geräten. Die gesamte Kabellänge eines Stranges darf mit dem spezifizierten Kabel 72 m nicht überschreiten, und zwischen den einzelnen Knoten (mit Repeater-Funktion) sind 4,5 m als Maximum spezifiziert. Spezielle Hubs sind für die Geräteverkabelung nicht notwendig, denn die Firewire-Adapter und -Geräte verfügen meist über mehrere Ports, die geräte-intern an einen Physical-Layer-Chip (siehe Kapitel 33.3) angeschlossen sind, der automatisch als Repeater arbeitet, wodurch die Portsignale entsprechend durchgeleitet werden.
Abb. 33.1: Aufbau eines Firewire-Systems. Ein PC mit einem Firewire-Hostadapter dient als Busmaster und verfügt über mehrere Ports für die Realisierung verschiedener Gerätestränge.
Firewire ist selbstkonfigurierend und weist den Geräten (Knoten) nach einem Bus-Reset physikalische Adressen zu. Die Geräte dürfen während des laufenden Betriebs angeschlossen oder entfernt werden, eine Neuorganisierung der Adressen findet jedoch nicht bei jeder FirewireImplementierung automatisch statt, sondern das System muss u.U. hierfür neu gestartet werden. Üblicherweise stellt der Firewire-Adapter den Host eines Firewire-Systems dar. Im Unterschied zum USB muss dieser aber nicht zwangsläufig jede Datenübertragung initiieren, und es können auch zwei Firewire-Einheiten direkt Daten untereinander austauschen, so dass hier nicht jeglicher Datentransfer über den Host zu absolvieren ist. Das Verbindungskabel für IEEE-1394-Geräte ist etwas dünner als das von Ethernet her bekannte Koaxialkabel und auch wesentlich flexibler. Sowohl die Steckverbindung als auch das leicht verdreh- und schlingbare Kabel der Firma Nintendo (Spielkonsolen, GameBoy) sollen hierfür Pate gestanden haben.
Abb. 33.2: Firewire-Steckverbindung mit Spannungsversorgung
Sandini Bib Firewire
1027
Die Voraussetzung für die höhere Datenrate bei Verwendung eines dünneren Kabels beruht auf dem besonderen Design und der Abschirmung. Im 1394-Kabel finden sich zwei als Twisted-Pair realisierte Verbindungen, wobei eine Twisted-Pair-Anordnung jeweils von einer gemeinsamen Abschirmung umschlossen ist, wodurch eine geringe Störanfälligkeit erreicht wird. Wie beim USB wird auch mit Firewire ein Halbduplex-Betrieb absolviert. Firewire verfügt jedoch nicht nur über ein Adernpaar, auf dem die Daten und die Taktinformation (NRZI-Kodierung) gemeinsam übertragen werden, sondern über jeweils zwei differenziell ausführte Signalwege. Auf dem einen Leitungspaar werden die Nutzdaten und auf dem anderen der Takt übertragen. Die beiden Leitungen für die Spannungsversorgung, die 8 V bis 40 V bei maximal 1,5 A betragen kann, sind in das IEEE-1394-Kabel mit eingebettet, und die gesamte Kabelanordnung ist mit einer weiteren (gemeinsamen) Abschirmung versehen. Die Spannungsversorgung kann, muss aber nicht, von einem Firewire-Gerät verwendet werden und ist bei stationären Geräten im Gerät selbst eingebaut. In diesem Fall wird nur eine vierpolige Verbindung verwendet, bei der miniaturisierte Steckverbinder zum Einsatz kommen, wie es beispielsweise bei Camcordern üblich ist.
Abb. 33.3: Der spezielle Aufbau eines IEEE-1394-Kabels ermöglicht relativ hohe Datenübertragungsraten bei einem kleineren Durchmesser als das übliche Ethernet-Kabel.
33.2 Protokoll Das IEEE-1394-Protokoll umfasst drei Schichten: den Transaction-, den Link- und den PhysicalLayer, die in Abbildung 33.4 gezeigt sind. Der Transaction-Layer bildet mit seinen StandardControl- und Status-Registern die Verbindung zu einem parallelen Bus – üblicherweise PCI. Der Link-Layer setzt die Registerinformationen des Transaction-Layers um und handhabt die Paketbildung und die Steuerung (Cycle Control) des Isochronous-Betriebs. Für die Initialisierung der Knoten und die Durchführung des Arbitrationsprozesses ist der Physical-Layer zuständig, der auch die serielle Datenumsetzung für den Link-Layer übernimmt.
Sandini Bib 1028
Kapitel 33
Abb. 33.4: Das IEEE-1394-Protokoll besteht aus den Schichten Transaction, Link und Physical.
Für Audio- und insbesondere für Videoanwendungen ist es wichtig, dass eine garantierte Datenbandbreite und somit ein kontinuierlicher Datenfluss möglich ist, wie es generell für Echtzeitanwendungen Voraussetzung ist. Ein übliches Netzwerk wie Ethernet oder Token-Ring (siehe Kapitel 34) arbeitet asynchron, was bedeutet, dass Datenpakete, die zuerst auf das Netzwerk gelangen, auch zuerst transportiert werden und nachfolgende Pakete eine Verzögerung erfahren (müssen), die vom Anwender im Prinzip ignoriert werden kann, da sie für den Informationsgehalt unerheblich ist. Die Verzögerung eines Video-Frames ist hingegen in unerwünschter Weise – vom Bildflackern bis zur Bildunterbrechung – wahrnehmbar. Ein Bussystem für Videoanwendungen muss daher über einen Mechanismus verfügen, der dies verhindert. Firewire sieht hierfür den IsochronousMode vor. Der Begriff »isochron« stammt aus dem Griechischen und bedeutet, dass einer Datenübertragung eine gleich bleibende Zeitdauer oder ein Intervall eingeräumt wird, wodurch eine garantierte Bandbreite zur Verfügung steht. Dies ist eines der wesentlichen Merkmale von Firewire, das zwar auch für den Universal Serial Bus definiert ist, dort jedoch erst ab der USB-Version 2.0 leistungstechnisch überzeugen kann.
Abb. 33.5: Aufbau eines asynchronen IEEE-1394-Datenpakets
In Abbildung 33.5 ist als Beispiel der Aufbau eines asynchronen IEEE-1394-Datenpakets gezeigt, wobei der Header typischerweise aus 4–5 Quads (32 Bits) besteht. Die erreichbare Datenblockgröße wird durch die maximale Paketzeit von 62 µs, bestimmt, was bei einer 200-MBit/s-Reali-
Sandini Bib Firewire
1029
sierung zu einer Größe von höchstens 256 Quads führt, also 1 KByte. Im Isochronous-Betrieb beträgt die maximale Paketzeit demgegenüber 125 µs was bei einer 200 MBit/s-Firewire-Auslegung eben in einer verdoppleten Paketgröße für die Nutzdaten (Payload) resultiert. Diese Pakete besitzen einen Header von zwei Quadlets und können einen von 64 Kanälen adressieren. Für alle Pakete gibt es vom Empfänger eine Bestätigung (Handshake) in Form eines Acknowledge Cycles, und es wird stets ein CRC ausgeführt.
33.3 Controller und PHY Ein Firewire-Chipset besteht – fast protokoll-konform – üblicherweise aus zwei Bausteinen, die als Link-Layer-Controller und als Physical-Interface (PHY) bezeichnet werden, wie es auf vergleichbare Weise auch mit vielen LAN-Controllern (siehe folgendes Kapitel) praktiziert wird. Firewire unterstützt wie erwähnt sowohl asynchrone als auch isochrone Transfers. Für Video ist eine garantierte Datenbandbreite nötig, die – wie erläutert – im isochronen Modus zu erreichen ist. Jeder Knoten, der diese Übertragungsart unterstützt, verfügt hierfür über einen speziellen Cycle Timer, mit dessen Hilfe ein derartiger Zyklus detektiert und dementsprechend weiterverarbeitet wird. Der Controller TSB12C01A von Texas Instruments enthält beispielsweise einen solchen Timer und zwei Sende-FIFOs, wobei einer für die asynchrone (ATF) und einer für die isochrone Datenübertragung (ITF) verwendet wird. Des Weiteren ist ein FIFO für die Verarbeitung der empfangenen Daten (GRF) zuständig. Ein interessantes Feature ist dabei, dass die jeweilige Speichertiefe der einzelnen FIFOs im Verhältnis zueinander (insgesamt max. 512 x 33 Bits) per Software festgelegt werden kann und somit – je nach Anwendung und Gerätetyp – eine möglichst optimale Datenzwischenspeicherung gegeben ist. Der Controller (Link Layer) ist einerseits mit dem Systembus (z.B. PCI) und andererseits über ein Link-Interface mit einem Transceiver wie dem TSB11C01 verbunden, der das Physical-Interface (PHY) zum IEEE-1394-Bus darstellt. Das Link Interface besteht aus den folgenden Signalen:
: : : : :
D[0:7] stellen die bidirektionalen Datenleitungen dar. Pakete mit 100 MBit/s verwenden die Leitungen D[0:1], Pakete mit 200 MBit/s verwenden D[0:3] und Pakete mit 400 MBit/s D[0:7]. CTL[0:1] spezifizieren die jeweilige Busfunktion (Idle, Status, Receive, Transmit). LREQ signalisiert den Transfertyp (Request Type) wie Isochronous, Priorty, Fair, Read und Write sowie die Adresse des PHY-Registers und die hier hineinzuschreibenden Daten. Ein Start- und ein Stopp-Bit kennzeichnen dabei den Beginn und das Ende des Request-Zyklus. SCLK ist der Systemtakt von beispielsweise 49,152 MHz. ISO schaltet den Link Controller und/oder das Physical-Interface in den Isolation-Status.
Neben der Signalumsetzung zwischen dem Controller und einem oder mehreren Firewire-Ports, die jeweils aus vier Leitungen (Twisted Pair Differential) bestehen, übernimmt der PHY-Baustein die Businitialisierung und die Durchführung des Arbitrationsvorgangs – das Aushandeln des aktuellen Busmasters. Die Zuteilung erfolgt dabei nach dem Fairness-Schema, wie es auch beim NuBus praktiziert wird. Es gibt hier keine feste Prioritätszuordnung, wodurch alle Geräte die gleichen Rechte besitzen, um auf den Bus zugreifen zu können. In der Praxis bedeutet das, dass vor fast jedem Buszugriff eine Arbitrierung stattfinden muss, was letztendlich einen Anteil von der zur Verfügung stehenden Bandbreite fordert.
Sandini Bib 1030
Kapitel 33
Abb. 33.6: Der Aufbau eines Firewire-Adapters mit einem Chipsatz der Firma Texas Instruments. Bei Firewire wird generell eine schaltungstechnische Trennung von Controller und Transceiver vorgenommen, wobei beide Bausteine über ein Link-Interface miteinander verbunden werden.
Die heutzutage als Standard anzusehende Transferrate beträgt 400 MBit/s, und 800 MBit/s sind der nächste Schritt. Andere Transferraten sind eher unüblich, gleichwohl kann natürlich auch ein Firewire-Gerät, das nur 100 MBit/s zu transferieren vermag, mit schnelleren Einheiten zusammengeschlossen werden. Da zwischen den einzelnen Geräten stets 1:1-Verbindungen bestehen, wird jeweils mit der höchsten Transferrate gearbeitet, die von beiden Einheiten unterstützt wird. Demnach wäre es ungünstig, ein langsameres Gerät in der Mitte eines Stranges zu positionieren, da in diesem Fall alle hier angeschlossenen Einheiten in der Geschwindigkeit des langsamsten Gerätes arbeiten würden. Wie es auch beim USB der Fall ist, obliegt es dem Plug&Play-fähigen Betriebssystem, die Firewire-Einheiten automatisch zu konfigurieren. Standardadapter, die zumeist mit einem Chipset der Firma Texas Instruments arbeiten, werden ab Windows 98 automatisch erkannt und daraufhin mit dem passenden Treiber angesprochen. Für den Aufbau eigener Firewire-Schaltungen wird auf der Peripherie-Seite ebenfalls (wie beim USB) ein eigener Microcontroller benötigt, der das Firewire-Protokoll über den Link-Controller entsprechend absolviert. Im Gegensatz zu den USB-Controllern ist der Microcontroller zumeist aber nicht Bestandteil des Firewire-Chips, sondern wird über ein eigenes Interface mit dem Link-Controller elektrisch verbunden. Bei einem Adapter für den PC ist dieses Interface in der Regel für PCI (siehe Abbildung 33.6) vorgesehen; für Firewire-Peripherie, etwa ein Messsystem, ist dies ein 16 oder 32 Bit breiter Bus, wie er für unterschiedliche Microcontroller und -Prozessoren verwendet werden kann, die allerdings recht leistungsfähig sein müssen, damit das Protokoll entsprechend abzuarbeiten ist. Neben den universell einsetzbaren Firewire-Chips gibt es aber auch spezielle Lösungen, die für einen ganz bestimmten Zweck vorgesehen sind, etwa IEEE-1394-Imaging-Chips für Scanner, IEEE-1394-MPEG-Chips für Video- und Audio-Einheiten oder IEEE-1394-IDE/ATAPI-Bridges für den externen Anschluss von Festplatten oder CD-Laufwerken über Firewire. Dann ist der intern vorhandene Prozessor entsprechend seiner Aufgabe bereits programmiert (wie es auch bei den
Sandini Bib Firewire
1031
speziellen USB-Chips der Fall ist), wodurch man sich keine Gedanken über die korrekte Absolvierung des Firewire-Protokolls machen muss. Außerdem erfahren Firewire-Bridge-Funktionen bereits in einigen Betriebssystemen automatisch eine passende Treiberunterstützung, wie der in der Abbildung gezeigte Chip OXFW900 beispielsweise ab Windows 98SE und Apple Mac OS 8.5.
Abb. 33.7: Die IEEE-1394-IDE/ATAPI-Bridge OXFW900 der Firma Oxford Semiconductor verwendet intern einen ARM-Prozessor. Über das External ROM-Interface kann der Chip auch für andere Zwecke »umfunktioniert« werden.
Sandini Bib
Sandini Bib
34
Lokale Netzwerke
Die PC-Anbindung an ein Netzwerk erfolgt über einen Netzwerkadapter, der meist als Einsteckkarte, vorzugsweise für den PCI-Bus, ausgeführt ist. Bei vielen neueren PCs befindet sich ein Netzwerkadapter bereits auf dem Mainboard, so dass dann im einfachsten Fall nur noch ein geeignetes Verbindungskabel zu beschaffen ist, um den PC netzwerkfähig zu machen, denn alle aktuellen Betriebssysteme bringen die benötigte Netzwerkunterstützung gleich mit. Man unterscheidet je nach Entfernungsmaßstab zwischen lokalen Netzwerken (LAN; Local Area Network) und so genannten Weitbereichsnetzen (WAN; Wide Area Network). Typische Vertreter der ersten Gattung sind Ethernet und Token-Ring, wobei heutzutage allein Ethernet in seinen unterschiedlichen Auslegungen eine gewichtige Rolle spielt. Die WANs haben vor allem mit dem Internet einen erheblichen Aufschwung erfahren. Sie ermöglichen eine weltweite Kommunikation und Datenübertragung in Sekundenschnelle, wofür auf Anwenderseite insbesondere Modems, ISDN- und xDSL-Adapter zum Einsatz kommen. Bei Komplett-PCs ist in der Regel ein Modem eingebaut, um hiermit eine Internet-Verbindung realisieren zu können. Der Zugang zum WAN wird dabei über die Telefon-Anschlussdose (z.B. der Telekom) hergestellt. Was gewissermaßen hinter der Anschlussdose vor sich geht, ist für den typischen PCAnwender nicht weiter von Belang, zumal dann das Internet mit einem WAN gleichgesetzt wird. Es gibt unterschiedliche Transportmechanismen (PDH, SDH, SONET) und Dienste (X.25, Frame Relay, ATM) für den WAN-Pakettransport der Daten in einem sogenannten Breitbandübertragungssystem, wo die Datenströme der Millionen Anwender weltumspannend mit Hilfe verschiedener Multiplexverfahren übertragen werden. Für Firmen sind neben einem typischen Internetzugang (per Modem etc.) eine ganze Reihe spezieller WAN-Zugangsformen und Dienste möglich, die bestimmte Bandbreiten garantieren und auch ausgeprägte Sicherheitsaspekte berücksichtigen. In der Regel sind derartige WAN-Zugänge lediglich von großen, weltweit arbeitenden Firmen zu nutzen und zu bezahlen und demnach für die meisten Anwender auch nicht weiter von Bedeutung. Aus diesem Grunde belasse ich es dabei und werde in diesem Kapitel allein die lokalen Netzwerke (LANs) behandeln.
34.1 Netztopologien Für LANs haben sich im Laufe der Zeit verschiedene Topologien herausgebildet: die Bus-, die Ring- und die Sterntopologie, wobei es auch Mischformen davon gibt, was dann zu den Baumtopologien führt. Die drei grundlegenden Netztopologien sehen Sie in Abbildung 34.1. Die Daten werden bei allen drei Topologien im Allgemeinen in Form von mehr oder weniger großen Paketen übergeben. Sie enthalten neben den eigentlichen Nutzdaten auch Frame-Daten zur Kennzeichnung von Paketbeginn und Paketende, Prüf- oder Fehlerkorrekturcodes sowie zumindest die Adresse des Übertragungsziels. LANs (und auch alle Hochleistungs-WANs) verwenden also eine Paketvermittlung. Beachten Sie, dass die einzelnen Stationen des LANs nicht notwendigerweise dieselbe Aufgabe oder denselben Aufbau aufweisen müssen. Es ist möglich (und auch üblich), dass eine Station z.B. einen leistungsfähigen Drucker darstellt, der die anfallenden Druckaufgaben aller Stationen ausführt. Die Station wäre dann ein Drucker-Server, weil sie den Rest des Netzes mit Druckdiensten bedient. Der bekannteste aller Server ist wohl der File-Server. Er spei-
Sandini Bib 1034
Kapitel 34
chert in der Regel große Datenbestände (Datenbanken) und stellt diese Informationen den anfragenden Stationen zur Verfügung bzw. speichert neue, von diesen Stationen übergebene Daten ab. Tatsächlich ergab sich die Entwicklung der LANs aus der Notwendigkeit, mehreren bis dato unabhängigen Stationen (vor allem PCs) dieselben Daten zur Verfügung stellen und Daten zwischen ihnen austauschen zu können. Weitere Server sind z.B. Kommunikationsserver, die ähnlich wie Gateways eine Schnittstelle zu anderen LANs, WANs oder öffentlichen Kommunikationsdiensten (ISDN) vermitteln. Die Aufgabe des Netzes ist es aber auch, eine Verbindung zwischen allen Stationen zu schaffen und nicht nur zwischen Server und Station.
(a) Bustopologie
(b) Ringtopologie
(c) Sterntopologie
Abb. 34.1: Netztopologien für LANs: (a) Bustopologie, (b) Ringtopologie, (c) Sterntopologie
Sandini Bib Lokale Netzwerke
1035
34.1.1 Bustopologie Bei der in Abbildung 34.1 dargestellten Bustopologie sind alle Stationen gleichberechtigt mit einem Bus verbunden. Wenn eine Station Daten übertragen möchte, können also alle angeschlossenen Computer die Pakete empfangen. Nur das Übertragungsziel nimmt die Daten aber auch tatsächlich vom Bus und damit vom Netz ab. Damit ein Datentransfer auch störungsfrei abläuft, muss eine Station, die Daten ausgeben möchte, zunächst prüfen, ob der Bus auch frei ist. Benutzt eine andere Station im Moment das Netz, dann muss die neu anfordernde Station warten. Das begrenzt den Datendurchsatz des Netzes, weil sich eine Station völlig unvorhersehbaren Wartezeiten für einen Netzzugriff gegenübersieht. Außerdem kann der Bus nicht beliebig verlängert werden. Das ursprüngliche Ethernet (siehe auch Kapitel 34.6) als Paradebeispiel eines LANs mit Busstruktur ist dadurch auf eine räumliche Ausdehnung von 500 Metern beschränkt. Ein wesentlicher Vorteil der Bustopologie ist dagegen die einfache Erweiterbarkeit; meistens können Stationen hinzugefügt oder aus dem Netz genommen werden, ohne dass das Netz heruntergefahren werden muss. Wie bei nahezu allen Bussystemen (z.B. SCSI) muss der Bus an beiden Enden durch Widerstände abgeschlossen werden, damit keine Signalreflexionen auftreten und die resultierenden Echos die LAN-Adapter durcheinander bringen.
34.1.2 Ringtopologie Die Ringtopologie unterscheidet sich von der Bustopologie in erster Linie einfach dadurch, dass die beiden Enden des auch hier benutzten Bus miteinander verbunden sind und der Bus somit einen Ring bildet. Manchmal wird der Ring auch von zwei antiparallel geschalteten Bussen gebildet. Ein Bus überträgt dann die Daten im Uhrzeigersinn, der zweite entgegen dem Uhrzeigersinn. Alternativ kann auch eine Übertragung auf einem Bus in beiden Richtungen erlaubt sein. Beides verbessert die Ausfallsicherheit. Eine sendende Station gibt die Daten an die auf dem Ring nachfolgende Station ab. Diese überprüft, ob die Paketadresse auf sie selbst oder auf eine andere Station zeigt. Im ersten Fall nimmt sie die Daten vom Bus ab. Sonst gibt sie sie in unveränderter Weise einfach an die nächste Station weiter. Die CPU der Station wird von diesen Empfangs- und Weitergabevorgängen nicht belastet. Der Netzwerkadapter wickelt die Adressenerkennung und die Weitergabe an die nachfolgende Station parallel zum normalen Rechnerbetrieb ab. Erst wenn die Daten vom Netz abgenommen werden sollen, löst er einen Interrupt an die CPU aus oder spricht den Speicher als Busmaster an. Die Ringtopologie für ein Netzwerk ist nur selten physikalisch realisiert. Stattdessen finden Sie in den meisten Fällen eine logische Ringstruktur, die auf einer physikalischen Bus- oder (nachfolgend beschriebenen) Sternstruktur basiert. Beispielsweise nutzt der Token-Ring von IBM eine logische Ringstruktur, die aber teilweise auch auf einem physikalischen Stern aufsetzt. Dadurch wird die Ausfallsicherheit des Netzes erhöht: Ein Kabelbruch legt im Allgemeinen nur eine Station, nicht aber den kompletten Ring lahm.
34.1.3 Sterntopologie Bei der klassischen Sterntopologie läuft die gesamte Kommunikation über einen zentralen Server ab, der dann natürlich entsprechend leistungsfähig sein muss. Auch alle Verbindungen zwischen den Stationen werden über den zentralen Computer abgewickelt. Dazu empfängt er die Daten von der sendenden Station, speichert sie (oder zumindest einen Teil davon) zwischen und
Sandini Bib 1036
Kapitel 34
gibt sie an den Empfänger weiter. Peer-to-Peer-Verbindungen sind also nicht möglich. Der große Nachteil ist, dass bei einem Ausfall der Zentrale das gesamte Netzwerk außer Betrieb ist. Die Sterntopologie ist für eine Kommunikation zwischen leistungsmäßig mehr oder weniger gleichwertigen Stationen ungeeignet. Sie stammt aus der Zeit, als der zentrale Rechner von einem Mainframe und die Stationen von mehreren Terminals mit geringer Rechenleistung oder I/OStationen gebildet wurden. Der Zentralrechner war daher nicht nur für die Netzverwaltung, sondern auch für die eigentliche Datenverarbeitung zuständig. Bei heutigen LANs wird eine Verkabelung nach der Sterntopologie für Punkt-zu-Punkt-Verbindungen zwischen Netzwerkknoten, beispielsweise zwischen einem Hub (Sternverteiler) und den einzelnen PCs ausgeführt. Der Verkabelungsaufwand ist dabei recht hoch, da für jede Station ein eigenes Kabel notwendig ist, wobei hierfür Twisted-Pair-Kabel oder auch Lichtwellenleiter zum Einsatz kommen. Die Anwendung der Sterntopologie, die die heute gebräuchlichste Topologie (für Ethernet) darstellt, erlaubt durch die konsequente Punkt-zu-Punkt-Kopplung der Einheiten, dass diese unter Verwendung geeigneter Kopplungselemente (Switches, siehe Kapitel 34.3.4) im Full-DuplexModus arbeiten können. Dies bedeutet, dass gleichzeitiges Senden und Empfangen möglich ist und dass das CSMA/CD-Zugriffsverfahren, das das ursprüngliche Ethernet stark ausbremsen kann, gar nicht mehr verwendet wird.
34.2 Zugriffsverfahren Die einzelnen Stationen eines Netzwerks können natürlich nicht uneingeschränkt auf das Netz zugreifen; eine gewisse Ordnung tut Not. In den folgenden Abschnitten möchte ich Ihnen die wesentlichsten Zugriffsverfahren vorstellen, die im Bereich der LANs angewendet werden.
34.2.1 CSMA/CD Durch Ethernet hat das so genannte CSMA/CD-Verfahren (Carrier Sense Multiple Access/Collision Detection) für die Steuerung des Netzzugriffs weite Verbreitung gewonnen. Der Name kennzeichnet bereits die Strategie des Verfahrens. Weil nur eine Leitung vorhanden ist, kann zu einem Zeitpunkt auch nur eine Station Daten ausgeben (senden). Bevor eine Station A aber das Netz benutzen kann, muss sie feststellen, ob eine andere Station B im Moment Daten auf dem Netz überträgt. Dazu ermittelt (Sense) Station A, ob ein Trägersignal (Carrier) aktiv ist. Ist das der Fall, so muss Station A warten, sonst kann sie sofort mit der Datenausgabe beginnen. In einigen Fällen kann es aber vorkommen, dass eine weitere Station C ebenfalls Vorbereitungen zur Datenausgabe trifft und den Bus abhört, jedoch kein Trägersignal erfasst, weil gegenwärtig keine Station Daten ausgibt oder das Datenpaket die untersuchende Station noch nicht erreicht hat. Nun werden also Station A und Station C gleichzeitig mit der Ausgabe ihrer Übertragungswerte beginnen. Wir haben also einen Mehrfachzugriff (Multiple Access). Die Folgen wären ohne weitere Vorkehrungen katastrophal: Die Datenpakete beider Stationen würden sich stören und sich gegenseitig vernichten. Eine Kollision muss also vom Netz erkannt werden (Collision Detection). Beim CSMA/CD-Verfahren hört die sendende Station zu diesem Zweck den Netzbus auch während der Datenausgabe weiter ab, erfasst also die eigenen Ausgabewerte auf dem Netz. Erkennt die Logik, dass die auf dem Netz befindlichen Daten nicht mit den ausgegebenen Daten übereinstimmen, interpretiert sie das als eine Kollision und unterbricht die Ausgabe. Gleichzeitig gibt
Sandini Bib Lokale Netzwerke
1037
sie ein JAM-Signal auf den Bus, um auch den anderen Stationen die Kollision anzuzeigen. Das veranlasst alle Netzknoten, die Sendetätigkeit einzustellen, der Bus ist nun also tatsächlich frei. In jeder Station, die senden möchte, wird ein Zeitzähler mit zufällig gewählten Anfangswerten gestartet. Nachdem der Zähler einer Station seinen Endwert erreicht hat, versucht diese Station erneut, auf das Netz zuzugreifen. Es erfolgt also ein weiterer Versuch, Daten über das Ethernet zu übertragen. Weil es durch die zufälligen Anfangswerte unwahrscheinlich ist, dass zwei Zähler zum gleichen Zeitpunkt den Endstand erreichen und damit gleichzeitig einen Zugriffsversuch unternehmen, ist der neue Netzzugriff einer Station meist erfolgreich.
Abb. 34.2: CSMA/CD-Verfahren
Man sieht, dass die Hauptursache, weshalb es überhaupt zu einer Kollision kommen kann, darin besteht, dass die einzelnen Stationen einander ihre Zugriffsversuche nicht mitteilen. Stattdessen erfolgt eine mehr oder weniger passive Überwachung des Netzzustandes. Das ist ein relativ langwieriger Vorgang und senkt vor allem bei umfangreichen LANs mit vielen Stationen die effektive
Sandini Bib 1038
Kapitel 34
Übertragungsrate des Netzes stark ab (schließlich bedeutet die Zähleraktivierung nach einer Kollision, dass der Bus für eine dem Anfangswert entsprechende Zeit stillgelegt wird). Die üblicherweise angegebenen Übertragungsraten beziehen sich auf einen Zustand, in dem eine Station ungehindert senden kann, d.h., nachdem die Station bereits eine Zugriffsmöglichkeit untersucht hat. Im Bereich der Grenzauslastung des LANs kann der Datendurchsatz sehr abrupt abfallen. Zu beachten ist, dass das CSMA/CD-Verfahren ab der Fast-Ethernet-Implementierung (100 MBit/s mit TP- oder LWL-Kabel) nicht mehr zwangsläufig zum Einsatz kommen muss, weil hier die Sterntopologie mit einzelnen Punkt-zu-Punkt-Verbindungen realisiert wird, so dass jede Station ohne die Aushandlung des physikalischen Netzwerkzugriffs gleichzeitig Daten senden und empfangen kann. Gleichwohl ist jede Ethernet-Implementierung abwärtskompatibel und kann im entsprechenden Umfeld (koaxialkabel-basiert) auch CSMA/CD zur Anwendung kommen lassen.
34.2.2 Token-Passing Das Kernstück des Token-Passing-Verfahrens ist das Token – eine Datenstruktur zur Steuerung des Netzzugangs. Dieses freie Token durchläuft fortwährend einen Ring, wird also von Station zu Station weitergegeben. Das Token-Passing ist das natürliche Verfahren für eine Ringtopologie und wird daher manchmal auch als Token-Ring-Verfahren bezeichnet. Das Token stellt gewissermaßen einen Erlaubnisschein für den Zugriff auf das Netz dar: Nur diejenige Station A, die gegenwärtig im Besitz des Tokens ist, darf den Ring ansprechen. Dazu kennzeichnet sie das Token als belegt und gibt es zusammen mit den zu übertragenden Daten an die nachfolgende Station B weiter. Diese erkennt, dass das einlaufende Token belegt ist, dass also Datenwerte nachfolgen. Station B überprüft nun die Adresse des Datenpakets, um zu erfassen, ob sie das Ziel der Datenübertragung darstellt. Ist das nicht der Fall, gibt sie sowohl das Token als auch die Daten unverändert an die nächste Station C weiter. Identifiziert sich dagegen Station B als Ziel des Transfers, dann kopiert sie die angekommenen Daten in einen Puffer. Außerdem markiert sie die Daten als empfangen und gibt sie zusammen mit dem Token an die nächste Station weiter (die Sendedaten werden vom Empfänger also nur kopiert, nicht aber vom Netz abgenommen).
Abb. 34.3: Token-Passing
Das Token und das Datenpaket werden so lange von Station zu Station weitergegeben, bis sie wieder beim ursprünglichen Sender, d.h. Station A, angekommen sind. Station A erkennt nun anhand der Markierung im Paket, ob die abgesandten Daten auch wirklich am Ziel angekom-
Sandini Bib Lokale Netzwerke
1039
men sind. Empfängt der Sender das Paket ohne Markierung, dann ist ein Übertragungsfehler aufgetreten, z.B. ist der Zielcomputer ausgeschaltet oder die Verbindung defekt. Die Rückübertragung der Sendedaten an den ursprünglichen Sender A erlaubt es auch zu überprüfen, ob die Daten im Verlauf der Übertragung beschädigt worden sind. Die Station A entfernt nun die Daten vom Ring und gibt in jedem Fall (also auch, wenn sie weitere Daten übertragen möchte) ein freies Token an die nachfolgende Station weiter. Das dient zur Gleichbehandlung aller Stationen im Netz, weil der Ring von einer Station höchstens für die Übertragung eines einzigen Datenpakets belegt werden kann. Erst wenn die Station das nächste Mal ein freies Token empfängt, kann sie das Netz erneut belegen und weitere Daten übergeben. Bei CSMA/CD wird die sendende Station hingegen nicht unterbrochen.
34.2.3 Token-Bus Eine gewisse Bedeutung hat auch das Token-Bus-Verfahren erlangt. Die physikalische Topologie des zugrunde liegenden Netzwerks wird von einem Bus gebildet. Darüber wird eine logische Ringstruktur mit einem abgewandelten Token-Passing-Verfahren gestülpt. Zu diesem Zweck ist jeder Station des Netzes eine Nummer in einer Tabelle zugeordnet, die den Ort der betreffenden Station im logischen Ring angibt. Logisch gesehen werden auf Protokollebene nun wie beim Token-Passing-Verfahren ein Token sowie gegebenenfalls ein Datenpaket übergeben. Physikalisch betrachtet, reicht eine Station das Token und das Paket aber nicht an eine nachfolgende Station in einem physikalischen Ring weiter, sondern adressiert mit Hilfe der oben genannten Tabelle die logisch folgende Station. Token und Daten werden dabei über den Bus übergeben. Während das Token-Passing-Verfahren im Allgemeinen nur eine einzige Übertragungsrichtung für Token und Paket kennt, werden Token und Daten hier in beiden Richtungen auf dem Bus übertragen. Logisch aufeinander folgende Stationen können dabei einen sehr großen Abstand voneinander aufweisen, d.h., aufeinander folgende Nummern in der Tabelle zeigen nicht notwendigerweise auf benachbarte Stationen am Bus. Der Vorteil des Token-Bus-Verfahrens ist, dass die Vorteile des Token-Passing, wie z.B. die voraussehbare Zugriffslatenz und das hohe Maß an Gleichberechtigung aller Stationen, mit der sehr einfachen und flexiblen Topologie eines Bus kombiniert werden können. Ein Beispiel für einen logischen Ring mit Busverkabelung ist das ARCNET der Firma Data-Point, das eine Zeit lang (fast) in Vergessenheit geraten war und mit dem Aufkommen der Feldbussysteme (für industrielle Anlagen) gerade eine Renaissance erlebt.
34.2.4 100BaseVG-Any-LAN Eine weitere Entwicklung nennt sich Demand Priority Medium Access (DPMA). Dieses Verfahren ist gewissermaßen eine Kombination aus Ethernet- und Token Ring-Paketen. Es finden dabei generell keine Kollisionen wie bei CSMA/CD statt, sondern es erfolgt eine Demand-PrioritySteuerung. Der Zugriffsmechanismus konzentriert sich dabei auf einen zentralen Hub, was man sich als eine Port-Freischaltung vom Hub zum PC vorstellen kann. Dieses Verfahren wird von 100BaseVG-Any-LAN verwendet, das insbesondere von der Firma Hewlett Packard als Alternative zu Fast-Ethernet propagiert wurde. Es hat sich jedoch nicht wie erwartet auf dem Markt durchgesetzt, da Fast-Ethernet (100Base-Standard) bei vergleichbarer Leistung einen kostengünstigeren Migrationspfad vom Standard-Ethernet (10Base-Standard) aus bietet.
Sandini Bib 1040
Kapitel 34
34.2.5 Asynchronous Transfer Mode Der Asynchronous Transfer Mode (ATM) ist für High-Speed-Netze entwickelt worden und beruht auf dem Prinzip der virtuellen Verbindungen, das generell bei paketvermittelnden Netzen (X.25) eingesetzt wird. Es werden keine festen Kanäle geschaltet, sondern immer Zellen (stets 53 Byte lang) einer zuvor definierten Verbindung, die dann transportiert werden, wenn sie erzeugt werden. ATM bietet den Vorteil, dass hier definierte Bandbreiten zur Verfügung gestellt werden können und demnach auch verschiedene Anwendungen gleichzeitig (z.B. für Nachrichtenaustausch, Videokonferenzen, Datenbankkommunikation) ohne Verzögerungen bedient werden können. Die für die jeweilige Anwendung benötigte Bandbreite lässt sich sehr flexibel anpassen. Einige Anwendungen – wie etwa Videokonferenzen – profitieren eher von einer höheren Bandbreite und damit von möglichst optimalen Datenübertragungsraten als etwa zeitlich relativ unkritische wie einfache Nachrichtenübertragungen. Für ATM ist eine Gesamtbandbreite von 2,4 GBit/s typisch, die beispielsweise in einem LAN auf 16 Ports zu je 155 MBit/s mit einem entsprechenden Switch aufgeteilt werden kann. ATM ist als die erste Netzwerktechnik angetreten, die sich sowohl im WAN als auch im LAN – quasi bis zum Anwender-PC – integrieren lässt. Der Übergang von ATM auf konventionelle LAN-Technologien (Ethernet, FDDI) hat sich allerdings im Laufe der Zeit als ein recht kostspieliges Unterfangen herausgestellt, und die anfangs (ca. 1993) vorhandene Euphorie, mit ATM ein universelles System für WAN und LAN zur Verfügung zu haben, ist mittlerweile verflogen. Das eigentliche Problem besteht dabei in der Übersetzung der MAC-Adressen (siehe Kapitel 34.6, Ethernet) im LAN auf ATM. Da ATM keine derartigen Adresszuordnungen kennt, ist eine zusätzliche Umsetzung (neben IP- auf MAC-Adressen) notwendig, die als LANE (LAN Emulation) bezeichnet wird und von einem LAN Emulation Server durchzuführen ist. Weil ATM aufgrund seiner Zellenorientierung und Skalierbarkeit eben völlig anders als etwa Ethernet oder FDDI arbeitet, ist (zunächst) auch keine Kompatibilität zu diesen Netzrealisierungen gegeben. Dem wurde aber dadurch Rechnung getragen, dass Emulationsverfahren (ATM-emuliertes LAN, ATM-LAN-Emulationsclient) entwickelt worden sind, die ab Windows 98 als eigene Protokolle für die entsprechenden PC-Netzwerkadapter implementiert wurden. Mittlerweile werden sie jedoch nicht mehr standardmäßig von Microsoft mitgeliefert, da sich ATM im LAN eben nicht durchgesetzt hat. ATM wird daher eher selten in LANs bis hin an die Clients realisiert, denn hierfür ist es zu komplex und auch zu teuer. Stattdessen wird es eher als eine Backbone-Technologie verwendet und kann dort WAN-Protokolle auf LAN-Protokolle – und umgekehrt – direkt umsetzen. Demnach ist das ATM-Einsatzgebiet eher bei WAN- als bei LAN-Verbindungen zu sehen, wo Ethernet dominiert und Gigabit-Ethernet gegenüber ATM als »Hochgeschwindigkeitstechnologie« vorteilhafter einzusetzen ist, was in Kapitel 34.6.7 näher erläutert wird. Mit 10-Gigabit-Ethernet (10GE) steht ATM zudem eine weitere Ethernet-Technologie gegenüber, die auch explizit für WAN-Anwendungen gedacht ist.
34.3 Kopplungselemente für Netzwerke Unter dem eher unscheinbaren Begriff Kopplungselemente möchte ich in diesem Abschnitt die für LANs wichtigen Einheiten wie Repeater, Hubs, Switches und Gateways etwas näher erläutern, die als Verbindungsglieder und als Verteiler mit unterschiedlicher Funktionalität zwischen verschiedenen Netzwerksegmenten eingesetzt werden. Für das Verständnis der Arbeitsweise dieser Einheiten ist es nützlich, das OSI-Schichtenmodell zu kennen, das daher zunächst an der Reihe ist.
Sandini Bib Lokale Netzwerke
1041
34.3.1 Das OSI-Schichtenmodell Einen internationalen Standard für Kommunikationssysteme stellt das OSI-Modell (Open System Interconnection) der International Organization for Standardization (ISO) dar. Anhand dieses Basisreferenzmodells werden in einem Protokoll Software-Schnittstellen festgelegt, wodurch die Unabhängigkeit von Hard- und Software und die Kommunikation zwischen unterschiedlichsten Systemen ermöglicht werden soll. Es hängt vom jeweiligen Anwendungsbereich ab, welche der unterschiedlichen Schichten des OSI-Modells zum Einsatz kommen. Je unterschiedlicher die zu koppelnden Netze und Anwendungen arbeiten, desto komplexer müssen auch die LAN-Kopplungselemente werden, damit die gewünschte Übertragung und Datenumsetzung vorgenommen werden kann. Der Sinn und Zweck der Definition von einzelnen Schichten ist der, dass ein recht komplex wirkendes Kommunikationssystem in seiner Funktionalität aufgespaltet werden kann und dass dann zu implementierende Einzelteile leichter bearbeitet werden können. Wie die Schichten im Einzelnen aufgebaut sind, ist dabei gar nicht von Bedeutung, sondern es ist lediglich die jeweilige Übergabeschnittstelle (von einer Schicht zur anderen) von Belang, um ein eindeutiges Verhalten innerhalb des Gesamtsystems realisieren zu können. Notwendige Anpassungen sind dadurch leichter durchführbar, da möglicherweise nur ein bestimmter Aspekt in einer einzigen Schicht von einer Änderung betroffen ist, und auch die Wiederverwendbarkeit bestimmter Schichten in unterschiedlichen Systemen ist dadurch gegeben. Schicht Nr.
Bezeichnung
englische Bezeichnung
Funktion
7 6 5 4 3 2 1
Anwendungsschicht Darstellungsschicht Sitzungsschicht Transportschicht Vermittlungsschicht Sicherungsschicht Physikalische Schicht
Application Layer Presentation Layer Session Layer Transport Layer Network Layer Data Link Layer Physical Layer
Anwendung Darstellung Steuerung Transport Vermittlung Sicherung Bitübertragung
Tab. 34.1:
Die einzelnen Schichten des OSI-Modells
Das OSI-Modell besteht aus sieben Schichten oder auch Ebenen (Layers), die eindeutig festgelegte Aufgaben wahrnehmen. Die Schichten werden während eines Kommunikationsvorgangs der Reihe nach von unten nach oben (Sender) bzw. umgekehrt von oben nach unten (Empfänger) durchlaufen. Die Informationen werden grundsätzlich nur zwischen benachbarten Schichten ausgetauscht. Eine Schicht dient der darüber liegenden als Transportmedium, denn sie stellt ihr bestimmte Dienste zur Verfügung und nimmt wiederum die Dienste der darunter liegenden Schicht in Anspruch. Das OSI-Modell befasst sich lediglich mit dem Datenaustausch zwischen einzelnen Kommunikationspartnern, es sagt nichts über die eigentliche Anwendersoftware aus, denn die befindet sich praktisch über der Schicht 7. In der Minimalausführung besteht ein nach OSI spezifiziertes System lediglich aus den beiden untersten Schichten. Physikalische Schicht – Schicht 1 Dies ist die Ebene der Bitübertragung. Hier werden die elektrischen, mechanischen und funktionalen Eigenschaften der Schnittstelle festgelegt, beispielsweise wie die Daten übertragen werden und wie eine logische »1« definiert ist. Übliche Schnittstellen sind RS232, RS485, V.24 und ISDN. Als Übertragungsmedium sind Koaxialkabel, verdrillte Kupferleitungen (Twisted-Pair), Lichtwellenleiter und Richtfunkstrecken anzutreffen. Da das Übertragungsmedium selbst im Prinzip noch unter der ersten Schicht liegt, sagt das OSI-Modell darüber nichts aus.
Sandini Bib 1042
Kapitel 34
Sicherungsschicht – Schicht 2 Die Sicherungsschicht regelt die Synchronisation zwischen den Teilnehmern, fasst Bits zu Rahmen (Frames, Telegrammen) zusammen und beinhaltet die Fehlererkennung und die Korrekturmechanismen. Als Fehlerabsicherung sind Parity-Check und CRC üblich, als Protokolle, die selbst die Korrekturfunktion beinhalten, BSC, HDLC oder SDLC. Bei Netzwerken sind in dieser Schicht ferner die Zugriffsmechanismen wie Token-Passing und CSMA/CD definiert. Vermittlungsschicht – Schicht 3 Hier erfolgt der Aufbau der Verbindung zwischen den Kommunikationspartnern – es wird der Weg des Datenblocks und gegebenenfalls eine Umleitung bestimmt. Die Adressierung, die Vermittlung und der Verbindungsauf- und -abbau werden in dieser Schicht realisiert. In einem Netzwerk (Packet Switching Network) dient die Schicht 3 der Direktadressierung (Routing). Damit wird die Auswahl eines Datenwegs durch ein Netz von Knoten bezeichnet. Ein Protokoll für diese Schicht ist beispielsweise X.25 (Datex-P, ISO 8473), das für die Datenpaketvermittlung bei der Telekom verwendet wird. Transportschicht – Schicht 4 Der Datentransport zwischen den angewählten Endteilnehmern (Schicht 1-3) erfolgt über die Transportschicht. In dieser Schicht werden Fehlerkontrollen zwischen den Endteilnehmern vorgenommen und die Nachrichten – wenn nötig – in kleinere Einzelpakete zerlegt. Sind Daten verfälscht worden oder verloren gegangen, reagiert diese Schicht auf Wiederholungsanforderungen einer Station und bringt durcheinander geratene Pakete wieder in die richtige Reihenfolge. Die Schichten 1 bis 4 werden auch als netzorientierte Protokolle bezeichnet und übernehmen die Transportfunktionen. Die Schichten 5 bis 7 werden demgegenüber als anwendungsorientierte Schichten bezeichnet und gehen von einem fehlerfrei funktionierenden Transportsystem aus. Sitzungsschicht – Schicht 5 Die Schicht 5 – die auch als Kommunikationssteuerschicht bezeichnet wird – ist für die Synchronisation und Organisation von Daten- und Steuerinformationen für die sich im Dialog befindenden Stationen zuständig. So stellen beispielsweise X.215/ISO 8326 und X.225/ISO 8327 geeignete Protokolle zur Verfügung. Zu den Aufgaben der Sitzungsschicht gehören die Datenflusssteuerung, die Dialogkontrolle und -koordination und die Datenzwischenspeicherung. Die Zeitspanne zwischen dem Aufbau und dem Abbau einer Verbindung wird als Session oder Sitzung bezeichnet und von der Sitzungsschicht gesteuert, die in der Regel eng mit dem Host-Betriebssystem zusammenarbeitet. Darstellungsschicht – Schicht 6 In der Darstellungsschicht werden die Daten für die Anwendungsschicht aufbereitet und nach Bedarf umgeformt. Dies umfasst die Kontrolle der Datenein- und -ausgabe, die Durchführung von Datenkonvertierungen wie auch Datenverschlüsselungen, Konvertierungen und die Formatanpassung für Drucker und Bildschirme. Als Grundlage für PC-Anwendungen dient beispielsweise der ASCII-Zeichensatz. Anwendungsschicht – Schicht 7 Die Anwendungs- oder auch Verarbeitungsschicht regelt den Zugriff auf die Anwenderprogramme (File Transfer) und stellt im Prinzip keine eigenen Dienste zur Verfügung. Ihre Aufgabe ist vielmehr die Bereitstellung von anwenderspezifischen Protokollen (X.400), z.B. zur Identifizierung der Teilnehmer und zur Überprüfung der Zugriffsberechtigung.
Sandini Bib Lokale Netzwerke
1043
In der Praxis werden jedoch nicht immer alle Schichten in der beschriebenen Art und Weise implementiert. Dann übernimmt die Schicht 7 Aufgaben der darunter liegenden Schichten, wie es beispielsweise bei Feldbussystemen (Interbus, PROFIBUS) der Fall ist.
34.3.2 Repeater Ein Repeater kann sehr verschiedene Ausführungen aufweisen. Im einfachsten Fall ist es nichts anderes als ein Signalverstärker, der gleichartige Netze (Netzsegmente) miteinander verbindet. Eine Umsetzung auf ein anderes Übertragungsmedium (z.B. Kupfer auf Lichtwellenleiter) ist dabei ebenfalls möglich, was dann auch unter Medienkonverter firmiert. Das Betriebssystem und die Anwendungssoftware erhalten keinerlei Informationen über die Verwendung von Repeatern, denn die Kopplung erfolgt auf der OSI-Schicht 1. Durch den Einsatz von Repeatern wird keine logische Aufteilung des Netzes in Teilsegmente vorgenommen, die Repeater dienen lediglich dazu, die Ausdehnung des Netzes zu vergrößern.
34.3.3 Hubs Ein Hub ist für die Kopplung einzelner Stationen in der Stern-Topologie – Punkt-zu-Punkt-Verbindungen – zuständig und stellt dabei das zentrale Element in Twisted-Pair- oder auch lichtwellenleiter-basierten Systemen dar. Prinzipiell gibt es passive, aktive und intelligente Hubs. Passive Hubs sind reine Verbindungspunkte zwischen den Geräten, wobei keinerlei elektrische Funktionen ausgeführt werden, so dass man diese Realisierung auch als Anschlussboxen ansehen kann, die dann unter der Bezeichnung Patch-Box oder auch Patch-Feld firmieren. Aktive Hubs regenerieren – verstärken – demgegenüber die Datensignale und verteilen sie entsprechend zwischen den einzelnen Stationen. Meist besitzen sie 8, 12 oder 24 Anschlüsse (Ports). Falls die notwendige Anzahl der Ports nicht mehr ausreicht, ist eine Erhöhung besonders einfach durch stackable Hubs zu realisieren, die einfach übereinander gestapelt und untereinander mit einer speziellen (Backbone-)Verbindung gekoppelt werden, wodurch die einzelnen Hubs quasi zu einem einzigen zusammengefasst werden. Außerdem können auch Hubs, die keine Stackable-Verbindung besitzen, zusammengeschlossen werden, wofür die vorhandenen Ports zum Einsatz kommen und die Verbindung Hub-zu-Hub mit einem Kabel herzustellen ist, das gekreuzte Signalleitungen (siehe auch Kapitel 34.6.5, Ethernet mit Twisted-Pair-Kabel) verwendet. Außerdem ist oftmals ein bestimmter Port (meist der erste) als Uplink-Port markiert, und daneben oder auf der Geräterückseite befindet sich ein Schalter, der die Leitungskreuzung im Bedarfsfall herstellt, wobei dann eben kein Cross-Cable für diese Verbindung verwendet werden darf. Die intelligenten Hubs werden auch als Managed Hubs bezeichnet, denn sie besitzen die Funktion eines aktiven Hubs plus unterschiedlicher Diagnose-, Konfigurations- und Management-Mechanismen, was es bei den preiswerteren Unmanaged Hubs in dieser Form eben nicht gibt.
34.3.4 Switches Ein Hub (der auch als Konzentrator oder Sternverteiler bezeichnet wird) kann vereinfacht gesehen auch als Signalverstärker (Repeater) verstanden werden, der ein Eingangssignal (z.B. vom Backbone) auf mehrere Ports aufteilt, an die die Computer einzeln (sternförmig zwischen PC und Hub) angeschlossen werden. Die gesamte zur Verfügung stehende Bandbreite teilt sich bei einem Hub entsprechend der Anzahl der angeschlossenen Stationen auf. Daher werden statt Hubs auch Switches eingesetzt, die den einzelnen Ports jeweils die maximale Geschwindigkeit ermöglichen, was die Gesamtbandbreite maßgeblich erhöhen kann.
Sandini Bib 1044
Kapitel 34
Abb. 34.4: Bei einem Hub teilt sich die zur Verfügung stehende Bandbreite entsprechend der Anzahl der angeschlossenen Stationen auf. Ein Switch schaltet quasi eine »direkte« Verbindung zwischen zwei Kommunikationspartnern, wodurch die gesamte Bandbreite für die Datenübertragung zur Verfügung steht.
Switches eigenen sich zur Aufteilung eines LANs in einzelne Netzwerksegmente oder Subnetze, wobei üblicherweise eine Aufteilung in Anwendergruppen nach organisatorischen und logischen Aspekten erfolgt. Ein Switch ermöglicht im Gegensatz zu einem Hub oder einer Bridge einen parallelen Datenaustausch zwischen Subnetzen oder Computern. Ein Switch (der auch als MultiportBridge bezeichnet wird) schaltet quasi eine direkte Punkt-zu-Punkt-Verbindung zwischen zwei Geräten, wodurch die gesamte Bandbreite des Übertragungskanals zur Verfügung steht. Die Geschwindigkeit des Switchs muss dabei der Bandbreite des Gesamtnetzes, multipliziert mit der Anzahl der Ports, entsprechen. Ein Fast-Ethernet-Switch (100 MBit/s) mit 10 Ports hat demnach eine Switching-Leistung von 1 GBit/s zur Verfügung zu stellen. Bei den besonders preiswert erscheinenden Switches sollte man anhand der Gerätedaten ermitteln, ob das betreffende Modell tatsächlich die notwendige Switching-Leistung bieten kann, denn andernfalls werden zusätzliche Verzögerungen auftreten, die ein Switch ja eigentlich gerade beseitigen soll. Heutzutage wird bei Einheiten wie Bridges, Routern oder Broutern vielfach stets von Switches gesprochen und der Layer (die OSI-Schicht), auf dem sie jeweils arbeiten, dabei mit angegeben.
34.3.5 Bridges Wie Repeater geben »Brücken« Signale weiter. Dies geschieht mit Bridges jedoch selektiv, d.h., es gibt hier eine Filterfunktion. Es werden nur diejenigen Signale übertragen, die für einzelne Stationen bestimmt sind. Da die Bridges Daten über die 2. Schicht (MAC-Ebene) des OSI-Modells austauschen, kann sich die physikalische Schicht der zu koppelnden Netze voneinander unterscheiden. Die Datenselektion wird durch die Auswertung der gesendeten Adressen aus dem Datenpaket vorgenommen. Die Brücken sind in der Regel selbstlernend. Wenn eine bestimmte Station im Netzwerk angewählt wird, »merkt« sich die Bridge, an welchem Segment sich diese Station befindet, und trägt deren Adresse in einer Routing-Tabelle ein. Ist in der Tabelle noch kein entsprechender Eintrag vorhanden, leitet die Bridge das Datenpaket an alle Segmente weiter, außer an das eigene, und kann nachfolgend anhand der Reaktion erkennen, welches Segment bzw. welche Station die Daten akzeptiert hat, was einen Eintrag in der Routing-Tabelle zur Folge hat. Mit Bridges ist es möglich, die Grenzen eines Netzwerks hinsichtlich der Anzahl der maximal erlaubten Computer und der Verkabelungslängen zu erweitern, indem Subnetze realisiert werden. Innerhalb eines jeden Subnetzes ist es dann erlaubt, dass die maximalen Verkabelungslängen und Stationsanzahlen gemäß dem jeweiligen Standard (z.B. Ethernet, Token Ring) zum Einsatz kommen können.
Sandini Bib Lokale Netzwerke
1045
34.3.6 Router Die Router arbeiten auf der Schicht 3 des OSI-Modells, und demnach dürfen sich die 1. und die 2. Schicht der zu koppelnden Netze voneinander unterscheiden. Router haben die Fähigkeit, sowohl unterschiedliche Netztypen als auch unterschiedliche Protokolle verarbeiten zu können. Router gibt es prinzipiell als Hardware- oder auch als Softwarelösung, wie sie beispielsweise in Windows NT implementiert ist. Ein Router ist oftmals für ein bestimmtes Netzwerkprotokoll (z.B. TCP/IP, IPX/SPX, ISDN) ausgelegt, wobei jedoch auch Router existieren, die multiprotokollfähig sind, d.h. verschiedene Protokolle unterstützen. Windows NT kann sowohl mit TCP/IP als auch mit IPX/SPX umgehen, was bei Microsoft zu der Bezeichnung Multiprotokoll-Router führt. Für andere Protokoll-Umsetzungen, beispielsweise von Ethernet auf Token-Ring oder ISDN (WAN-Anbindung), wird üblicherweise ein eigener Computer abgestellt, der sich allein mit dieser Aufgabe beschäftigt, wobei eine leistungsfähige CPU und relativ viel Speicher notwendig sind, da die Paketlängen und Geschwindigkeiten entsprechend zu verändern und anzupassen sind. Für kleinere Netze sind jedoch auch Stand-Alone-Geräte verfügbar, die explizit für ISDN und Ethernet vorgesehen sind, um beispielsweise in einem Büro allen vernetzten PCs einen Zugang zum Internet zu verschaffen. Entsprechende Router sind auch für xDSL und Ethernet erhältlich.
34.3.7 Brouter Eine Kombination aus einer Bridge und einem Router ist ein Brouter. Dies ist im Prinzip eine Bridge, der zusätzlich ein eigenes Routing-Protokoll hinzugefügt worden ist. Ein Brouter übernimmt die Filterung und Übertragung von Daten und verwendet eine direkte Adressierung. Die verschieden LANs dürfen daher unterschiedliche Protokolle verwenden. Für die Brouter werden Netzwerk- und Routing-Tabellen geführt, die sowohl eine alternative als auch eine redundante Wegwahl im Netz ermöglichen.
34.3.8 Gateways Mit einem Gateway können völlig unterschiedliche Netze miteinander verbunden werden, die im Prinzip nichts miteinander gemein haben, so dass dann alle OSI-Schichten abgedeckt werden. Ein Gateway erfüllt die Aufgaben eines Routers und führt darüber hinaus die Umwandlung von Protokollen und Codes durch. Ein Gateway, für das in der Regel ein eigener Computer verwendet wird, fungiert quasi als Dolmetscher zwischen Netzwerken, die unterschiedliche Sprachen verwenden. So kann ein Gateway z.B. PCs mit IBM-AS/400 koppeln u.Ä.). Ein IBM-Großrechnernetz arbeitet beispielsweise mit dem EBCDIC-Zeichencode und PCs in einem anderen Netz mit dem ASCII-Code. Die Aufgaben eines Gateways müssen sich daher auf alle sieben Schichten des OSI-Modells erstrecken, was nicht einfach zu realisieren ist. Ein Gateway übernimmt zunächst die Daten des anderen Netzes, entfernt dann den Protokoll-Stack, woraufhin die Daten mit einem neuen Protokoll-Stack in das Protokoll des Zielnetzwerks »implantiert« werden, was eine relativ zeitaufwändige Angelegenheit ist, so dass sich die meisten Anwendungen eines Gateways auf bestimmte Funktionen wie File-Transfers und Terminalemulationen beschränken. Der mit dem Begriff Gateway ursprünglich gemeinte Funktionsumfang ist im Laufe der Zeit etwas »aufgeweicht« worden, d.h., es wird nicht immer deutlich, welche Schichten hiermit tatsächlich bearbeitet und abgedeckt werden. Ein Gateway, das beispielsweise unter Windows für TCP/IP festgelegt werden kann, ist daher vielfach nur als ein Router zu verstehen, wenn hier eben keine Protokolle und Codes umzusetzen sind.
Sandini Bib 1046
Kapitel 34
34.4 Token-Ring Auch wenn Ethernet der verschiedenen Auslegungen die vorherrschende Netzwerkimplementierung darstellt, soll noch kurz auf den Token-Ring und FDDI eingegangen werden. Der Bedeutung des Ethernet wird dann in Kapitel 34.6 ausführlich Rechnung getragen. Wie ich bereits oben erwähnt habe, benutzt der IBM-Token-Ring eine logische Ringstruktur, die aber zumindest teilweise eine physikalische Sterntopologie verwendet. Dazu sind so genannte Ringleitungsverteiler oder Konzentratoren (manchmal begegnet Ihnen auch die Bezeichnung Multi-Station Access Unit, kurz MSAU) in einem physikalischen Ring miteinander verbunden. Die Stationen selbst werden dann in einer physikalischen Sterntopologie an diese Verteiler angeschlossen, wobei aber die logische Ringstruktur weiter erhalten bleibt. Dieses auf den ersten Blick zunächst etwas verwirrend erscheinende Konzept ist in Abbildung 34.5 dargestellt.
RI
RO
RI
Ringleitungsverteiler
RO
RO Ringleitungsverteiler
Ringleitungsverteiler
RI
Station abgeschaltet oder Verbindung unterbrochen
Abb. 34.5: Die Struktur des Token-Ring
Wie zu erkennen ist, sind zunächst lediglich die Ringleitungsverteiler (Konzentratoren) in der Form eines Rings miteinander verbunden: der Ausgang RO (Ring Output) eines Verteilers ist mit dem Eingang RI (Ring Input) des jeweils folgenden Konzentrators verbunden. Von jedem dieser Ringleitungsverteiler gehen die Leitungen zu den Stationen ab. Das entspricht nun physikalisch einer Sterntopologie, weil jede Station ausschließlich mit dem Konzentrator, nicht aber mit einer anderen Station verbunden ist. Dennoch wird durch ein einfaches, aber intelligentes Verhalten der Ringleitungsverteiler eine Ringstruktur erreicht. Jeder Verteiler weist typischerweise acht Anschlüsse für Stationen auf, die aber nicht alle benutzt werden müssen. Vielmehr befindet sich im Konzentrator für jeden Anschluss ein Schalter (mechanisches Relais), der anhand eines Signals erkennt, ob eine Station an der entsprechenden Buchse angeschlossen und eingeschaltet ist. Bei einer reinen Ringstruktur würde eine ausgeschaltete Station den Ring unterbrechen. Dieses Problem wird von den Token-Ring-Konzentratoren auf intelligente Weise gelöst: Eine Buchse, die nicht mit einer eingeschalteten Station verbun-
Sandini Bib Lokale Netzwerke
1047
den ist, wird einfach überbrückt. Sie sehen das in Abbildung 34.5. Auch wenn die Leitung zwischen Konzentrator und Station beschädigt ist und keine Daten übertragen werden können, interpretiert der Ringleitungsverteiler dieses als fehlende Station und überbrückt den entsprechenden Kontakt. Zu diesem Zweck prüft die betreffende Station die Verbindung zum Konzentrator. Nur wenn diese in Ordnung ist, gibt sie eine so genannte Phantomspannung ab, die dazu führt, dass im Konzentrator ein Relais angezogen und eine Schleife zur Station geschaltet wird. Dadurch ist die Station in den Ring integriert. Die Ringleitungsverteiler brechen also die starre Ringtopologie auf und erlauben es, neue Stationen flexibel in den Ring einzubinden oder inaktive Stationen aus dem Ring zu entfernen. Obwohl die Verbindung vom Konzentrator zu den Stationen nach Art eines Sterns aufgebaut ist, werden Token und Daten dennoch in einem Ring transportiert. Als Nebeneffekt können durch die Ringleitungsverteiler Stationen auch während des Betriebs eingesteckt oder abgezogen werden, ohne dass das Netz herunter- und anschließend wieder hochgefahren werden muss. Das unmittelbar an den Token-Ring-Adapter eines PC angeschlossene Lobe-Kabel darf dabei höchstens 2,5 m lang sein. Die Entfernung zwischen PC und Konzentrator ist dagegen auf höchstens 100 m begrenzt. Für die 97,5 m Unterschied muss ein optimaleres abgeschirmtes Kabel verwendet werden, das z.B. vom Ringleitungsverteiler zu einer Netzwerkdose führt. Das Lobe-Kabel stellt dann nur noch die Verbindung zwischen Anschlussdose und PC her. Ohne weitere Verstärker darf der Abstand zwischen zwei Ringleitungsverteilern 200 m nicht überschreiten. Durch Leitungsverstärker kann der Abstand auf maximal 750 m gesteigert werden. Ein Token-Ring kann höchstens 33 Ringleitungsverteiler integrieren, insgesamt können mit einem Ring maximal 264 Stationen vernetzt werden. Die Weiterentwicklung des Token-Rings nennt sich High Speed Token-Ring (HSTR), der eine Datenübertragungsrate von 100 MBit/s definiert und abwärtskompatibel zum altbekannten Token-Ring ist. Die Kabelspezifikation beruht auf 100BaseTX und somit auf Verbindungskabeln der Kategorie 5. Des Weiteren sind auch Lichtwellenleiter auf Standard-Multimode-Verbindungen (62,5/125 Mikrometer) vorgesehen, womit sich Entfernungen von bis zu 2 km überbrücken lassen.
34.5 FDDI und CDDI FDDI ist die Abkürzung von Fiber Distributed Data Interface, womit schon ausgedrückt wird, welches Übertragungsmedium hier benutzt wird: Lichtwellenleiter (LWL), auch allgemein als Glasfaser bezeichnet. FDDI stellt eine leistungsfähige Weiterentwicklung des Token-Ring dar, und der markanteste Unterschied besteht darin, dass das Token beim FDDI-Protokoll nach der Markierung »frei« nicht erst von derjenigen Station, die die Kommunikation initiiert hat, empfangen worden sein muss, bevor ein neues Datenpaket gesendet werden kann. Demnach sind auch mehrere Datenpakete auf dem Ring möglich und nicht nur eines wie beim Token-Passing-Protokoll. Die Überprüfung, ob ein Datenpaket angekommen ist, überlässt das FDDI-Protokoll der OSI-Schicht 3. Eine Erweiterung des FDDI-Standards stellt FDDI-II dar, bei dem zusätzlich 16 dynamische Kanäle mit 6 MBit/s Datenübertragungsrate vorgesehen sind, womit Erweiterungen für Video- und Sprachanwendungen definiert werden. Das ursprüngliche FDDI definiert eine Übertragungsrate von 100 MBit/s bei einer maximalen Länge von 100 bis 200 km zur Vernetzung von etwa 500 bis 1000 Stationen. Die Stationen können dabei jeweils bis zu 2 km voneinander entfernt sein. Der Ring wird von einer zweiadrigen Gradienten- (Entfernung kleiner als 2 km) oder Monomode-Glasfaser (Entfernung bis 20 km) gebildet. Der zweiadrige LWL soll zwei Ringe, nämlich einen Primärring und einen Sekundärring, bereitstellen. Der Sekundärring kann zum Zweck der Ausfallsicherheit eines Netzes (so genannter
Sandini Bib 1048
Kapitel 34
Backup-Ring) verwendet werden oder auch Daten im Normalbetrieb übertragen; die FDDIBandbreite würde dann verdoppelt. Für FDDI sind mehrere Klassen von Stationen definiert:
: : :
A-Klasse: Stationen mit vier Anschlüssen für LWL, d.h. jeweils ein Ein- und Ausgangsanschluss für Primär- und Sekundärring. A-Stationen, die auch als Dual Attach Stations bezeichnet werden, können dadurch unmittelbar in den Ring geschaltet werden. B-Klasse: Stationen mit nur zwei Anschlüssen für LWL, d.h. nur jeweils einem Ein- und Ausgangsanschluss. B-Stationen können daher nicht unmittelbar in den Ring geschaltet, sondern müssen über einen Konzentrator (Ringleitungsverteiler) in den Ring integriert werden. C-Klasse: Diese Stationen entsprechen den gewöhnlichen Token-Ring-Konzentratoren und stellen eine (einadrige) Verbindung zu den B-Stationen her. Sie besitzen wie die A-Stationen vier LWL-Anschlüsse und werden unmittelbar in den Ring geschaltet.
A- und C-Stationen weisen einen Station Manager STM auf. Das ist eine kombinierte Hardware/ Software-Komponente, die Leitungsfehler zwischen den Stationen erkennen und entsprechende Maßnahmen ergreifen kann. Erfasst der STM einen Verbindungsfehler zwischen A- und C-Stationen (die sich unmittelbar im Ring befinden), dann schaltet er automatisch auf den Sekundärring um. Beim Token-Ring hat ein solcher Verbindungsschaden fatale Auswirkungen: Der Ring wird unterbrochen und das Netz lahm gelegt. Leitungsfehler zu und von B-Stationen erkennt FDDI ebenfalls. Sie können aber nicht behoben werden, weil zwischen dem C-Konzentrator und der B-Station der Sekundärstrang fehlt. Der STM überbrückt dann wie die Ringleitungsverteiler des normalen Token-Ring einfach die Verbindung zur betreffenden B-Station im C-Konzentrator.
Abb. 34.6: Ein FDDI-Netzwerk kennt verschiedene Stationstypen.
Es ist ebenfalls möglich, FDDI-Netze mit Twisted-Pair-Kabeln (z.B. der Kategorie 5) zu realisieren, was zu einer Reduzierung der Verkabelungskosten führt, falls bereits verlegte Leitungen verwendet werden können. Dieser Standard nennt sich dann Copper Distributed Data Interface (CDDI) und erlaubt die Überbrückung von 150 m mit STP-Kabel an einen FDDI-Knoten, der sich als Konzentrator darstellt. Für die Verbindung von Dual Attached Stations ist CDDI hingegen nicht vorgesehen.
Sandini Bib Lokale Netzwerke
1049
34.6 Ethernet Das wohl bekannteste und am meisten installierte LAN ist Ethernet. Es wurde 1976 von XEROX entwickelt, verwendet ursprünglich eine Bustopologie, das CSMA/CD-Zugriffsverfahren und Koaxialkabel. Die anfängliche Übertragungsrate betrug ca. 3 MBit/s, heute ist man bei 10 GigaBit/s angelangt, wobei unterschiedliche Medien, Netzwerkkarten, Kopplungselemente sowie Übertragungs- und Zugriffsverfahren zum Einsatz kommen. Es fällt nicht immer leicht, den Überblick über die verschiedenen Ethernet-Varianten zu behalten, doch gibt es hierfür verbindliche Standards, die für Ethernet als Base-Standards bezeichnet werden und für eine durchgängige Kompatibilität zwischen den verschiedenen Ethernet-Varianten sorgen. Der Base-Bezeichnung wird zur Kennzeichnung der Datenrate meist eine Zahl vorangestellt, und für das jeweilige Übertragungsmedium (z.B. Kabeltyp, Lichtwellenleiter) wird Base noch eine Zahl und/oder eine Buchstabenkombination nachgestellt (vgl. Tabelle 34.2). Standard
Bedeutung/Verwendung
10Base2
Cheapernet oder Thin-Wire (Koaxialkabel, RG58) mit einer maximalen Kabelsegmentlänge von 185 m und 30 Stationen.
10Base3
Breitband-Ethernet mit 3600 m maximaler Kabelsegmentlänge.
10Base5
Thick-Ethernet mit Koaxialkabel (Yellow Cable) und 500 m Kabelsegmentlänge für maximal 100 Stationen.
10BaseF
Ethernet mit Lichtwellenleitern – Fiber-Optic-Verbindungen. 10BaseFB: Verwendung von LWL im Backbone, maximal 2 km Segmentlänge. 10BaseFL: Entspricht dem FORIL-Standard (Fiber Optic Repeater Inter Link), maximal 2 km Segmentlänge. 10BaseFP: Enthält Richtlinien für passive LWL-Hubs, maximal 1 km Segmentlänge.
10BaseT
Ethernet auf Twisted-Pair-Kabel mit maximal 100 m Kabelsegmentlänge.
100BaseFX
Fiber-Optic-Verbindungen mit 100 MBit/s (Fast-Ethernet), maximal 410 m Segmentlänge mit einem Multimode-Kabel.
100BaseT
Fast-Ethernet auf verschiedenen Twisted-Pair-Kabeln. 100BaseT2: Kann bereits mit Kabeln der Kategorie 3 zum Einsatz kommen, wofür dann drei Datenleitungen und eine Leitung für die Kollisionserkennung verwendet werden, so dass hiermit kein Vollduplex-Betrieb möglich ist. Alternativ kann ein 8-adriges Twisted-Pair-Kabel eingesetzt werden, wodurch diese Einschränkung dann nicht mehr gegeben ist. Diese Möglichkeit firmiert unter 100BaseT4. 100BaseTX: Verwendet UTP/STP-Kabel der Kategorie 5 und ist vollduplex-fähig, gilt als Standard für Fast-Ethernet.
100Base VGAnyLAN
Fast-Ethernet mit DPMA-Verfahren (Demand Priority Medium Access) auf Twisted-Pair(8-adrig) oder LWL-Kabel, sternförmige Topologie. Zusammenführung von Ethernet mit Token-Ring.
1000Base
1000BaseCX: Gigabit-Ethernet mit Twinax-Kabel für maximal 25 m. 1000BaseLX: Gigabit-Ethernet mit Lichtwellenleiter für maximal 316 m (Halbduplex) oder maximal 5 km (Vollduplex, 10 µm) bei Verwendung von Multimode-LWL. Es sind dabei unterschiedliche Fasern (10 oder 50 oder 62,5 µm) möglich. 1000BaseTX: Gigabit-Ethernet (IEEE 802.3), 1000 MBit/s auf Twisted-Pair-Kabel ab der Kabel-Kategorie 5 für maximal 100 m. 1000BaseSX: Gigabit-Ethernet mit Lichtwellenleiter (Multimode) für maximal 275 m.
10GBase
10GBaseSR: 10-Gigabit-Ethernet mit Lichtwellenleiter (Multimode) für maximal 82 m. 10GBaseLR: 10-Gigabit-Ethernet mit Lichtwellenleiter (Monomode) für maximal 10 km. 10GBaseER: 10-Gigabit-Ethernet mit Lichtwellenleiter (Monomode) für maximal 40 km. 10GBaseLX4: 10-Gigabit-Ethernet mit Lichtwellenleiter (Multimode) auf vier Kanälen für maximal 300 m.
Tab. 34.2:
Die Ethernet-Standards
Sandini Bib 1050
Kapitel 34
34.6.1 Kollisionsdomänen und maximale Ausdehnungen Die jeweils möglichen Kabellängen und die Gesamttopologie eines LANs wird in erster Linie von den physikalischen Eigenschaften des Mediums bestimmt; genauer gesagt, von den elektrischen oder auch optischen (bei LWL) Dämpfungseigenschaften. Die Stationen müssen stets zweifelsfrei erkennen können, ob das Medium momentan von einer anderen Station belegt wird oder nicht, damit die Kollisionserkennung und damit der Zugriff auf das Übertragungsmedium einwandfrei funktionieren können. Das Ethernet der ursprünglichen Auslegung (mit Koaxialkabel) verwendet ein so genanntes Shared Medium. Dies bedeutet, dass sich alle Stationen ein Netzwerk(-Segment) beim Zugriff teilen müssen, was durch das CSMA/CD-Verfahren entsprechend geregelt wird. Ein LAN besteht vielfach aber nicht nur aus einem Strang (Segment), sondern aus mehreren Segmenten, die über entsprechende Kopplungselemente (z.B. mittels Hubs und Switches) miteinander verbunden werden. Ein Netzwerksegment, dem ein Shared Medium zugrunde liegt, wird auch als eine Kollisionsdomäne bezeichnet, da hier die im CSMA/CD-Verfahren begründeten Kollisionen auftreten können, was umso häufiger vorkommt, je mehr Stationen jeweils angeschlossen sind. Das Vorhandensein einer Kollision kann von einer gerade sendenden Station lediglich während der von ihr durchgeführten Datenübertragung detektiert werden, also dann, wenn sie selbst der »momentane Eigentümer« des Shared Mediums ist. Die Kollisionserkennung der sendenden Station ist erst dann abgeschlossen, wenn sie das letzte Bit des Datenpaketes verschickt hat und dieses zudem bei der entferntesten Station innerhalb der Kollisionsdomäne angekommen ist. Die entfernteste Station muss das Medium als belegt erkennen können, was nicht funktioniert, wenn die Strecke zu lang ausfallen sollte. Die entfernteste Station erkennt das Medium dann fälschlicherweise als frei und sendet ihrerseits Daten. Somit kommt es zwangsläufig zu einer Kollision, die jedoch wiederum von der anderen Station nicht als solche erkannt werden kann, was weitere unerkannte Kollisionen zur Folge hat und bis zu einem Nichtfunktionieren des LANs führen kann. Das Signal muss also von einer Station ausgesendet und wieder komplett empfangen werden können, wodurch sichergestellt wird, dass während des Sendevorgangs auch vom entferntesten Punkt des Segments eine Kollisionserkennung möglich ist. Der dafür notwendige Zeitraum wird als Round Trip Delay (RTD) bezeichnet und ist für die Ethernet-Standards genau definiert. RTD entspricht bei Standard- und auch Fast-Ethernet immer 512 Bitzeiten. Innerhalb dieser 512 Bitzeiten muss das Signal also einmal komplett in der Kollisionsdomäne hin- und wieder zurückgelaufen sein. Des Weiteren wird bei Ethernet eine zusätzliche Sperrzeit von 64 Bit festgelegt, damit Überschwingungen auf dem Kabel vermieden werden. Somit kommt es zu einer Gesamt-RTD von 576 Bitzeiten, was bei einer Überschreitung ein Versagen der Kollisionserkennung zur Folge hat. In diesem Zusammenhang wird oftmals auch die so genannte Slot-Time angeführt, die diejenige Zeitspanne angibt, nach der das Medium durch ein Datenpaket minimal zulässiger Größe eindeutig als belegt gekennzeichnet ist. Die Slot-Time beträgt bei Standard- und Fast-Ethernet 512 Bitzeiten und die minimale Paketgröße 64 Bytes. Die maximale Paketgröße beträgt stets 1518 Bytes, was sich jedoch für die Kollisionserkennung nicht als Problem darstellt. Vielmehr ist die minimale Größe hierfür relevant. Die Bitzeiten sind von der jeweiligen Übertragungsrate abhängig, was bei Standard-Ethernet (10 MBit/s) zu einer Bitzeit von 0,1 µs und bei Fast-Ethernet (100 MBit/s) zu 0,01 µs führt. Demnach beträgt der Round Trip Delay bei Standard-Ethernet 51,2 µs (512 Bitzeiten). Damit das Gleiche aus Kompatibilitätsgründen auch für Fast-Ethernet zutrifft, müsste die minimale Paketgröße erhöht werden (was aus Kompatibilitätsgründen nicht sinnvoll erscheint), oder man reduziert die maximal zulässige Kabellänge.
Sandini Bib Lokale Netzwerke
1051
Parameter
Ethernet
Fast-Ethernet
Gigabit-Ethernet
Datenrate Bit-Dauer Slot-Time Länge der Kollisionsdomäne Minimale Frame-Größe Maximale Frame-Größe Interframe Gap Carrier Extension Burst Limit
10 MBit/s 0,1 µs 512 Bit 2000 m (theoretisch)
100 MBit/s 0,01 µs 512 Bit 200 m
64 Bytes 1518 Bytes 9,6 µs – –
64 Bytes 1518 Bytes 0,96 µs – –
1000 MBit/s 0,001 µs 4096 Bit 20 m (ohne Gegenmaßnahmen) 64 Bytes 1518 Bytes 0,096 µs 448 Bits 65.536 Bits
Tab. 34.3: Kenndaten der drei wichtigsten Ethernet-Implementierungen
Es ist zu beachten, dass es sich bei der Verwendung von Koaxialkabel stets um ein Shared Medium handelt und die maximale (theoretische) Übertragungsrate auf 10 MBit/s begrenzt ist. Beim Einsatz von Twisted-Pair-Kabel kann es sich ebenfalls um ein Shared Medium handeln, wenn hier Hubs als Kopplungselemente verwendet werden. Falls stattdessen jedoch Switches verwendet werden, lässt sich die Kollisionsdomäne entsprechend »aufbrechen«, und jeder Switch-Port bildet dann eine eigene Kollisionsdomäne. Ist an jedem Switch-Port lediglich ein einziger Computer angeschlossen, kommt das CSMA/CD-Verfahren dann nicht mehr zum Einsatz (da ja keine Zugriffsrechte ausgehandelt werden müssen), und es lässt sich Full-Duplex mit der maximalen Datenrate nutzen, was beispielsweise 200 MBit/s bei Fast-Ethernet bedeutet.
34.6.2 Kupferbasierte Netzwerkverbindungen Für Netzwerke spielen die verschiedenen Twisted-Pair-Kabel die bedeutende Rolle, zumal hiermit 10 MBit/s bis hin zu 1 GBit/s bewältigt werden können – entsprechende Netzwerkkarten und Kopplungselemente sowie die maximal erlaubten Strecken einmal vorausgesetzt. Koaxialkabel werden heutzutage vorwiegend im privaten Bereich und bei kleineren Installationen verwendet, wobei dann die Cheapernet-Version zum Einsatz kommt. Der Vorteil gegenüber TP-Kabel ist zweifellos der, dass sich an diesem Bus bei Bedarf problemlos weitere Computer anschließen lassen und die Kabelinstallation weitaus einfacher ist, weil hier prinzipiell nur eine einzige Leitung zu verlegen ist und keine sternförmige Topologie (1:1-Verbindungen) zu realisieren ist. Außerdem werden in der Regel auch keinerlei Kopplungselemente benötigt. Lichtwellenleiter, die ebenfalls in der Sterntopologie zu verlegen sind, empfehlen sich von allem bei längeren Strecken im Backbone, also etwa bei Gebäudeinstallationen. In den einzelnen Büros wird man dann meist mit Hilfe eines Switchs von LWL auf TP-Kabel übergehen. Koaxialkabel Koaxialkabel für LANs sind lediglich mit einer Impedanz von 50 Ohm (+/- 2 Ohm) von Bedeutung und existieren in unterschiedlichen Ausführungen für 10Base5 und für 10Base2. Das ursprüngliche LAN-Koaxialkabel laut 10Base5 hat eine ungefähre Dicke von 10 mm und wird in gelber Farbe geliefert, woher auch seine übliche Bezeichnung (Yellow Cable) stammt. Mit einer Signalfrequenz von 10 MHz über eine Länge von 500 m betrieben, darf es eine Dämpfung von maximal 8,5 dB aufweisen. Das Gleiche gilt auch für das dünnere Koaxialkabel (RG58, ca. 5 mm Dicke), allerdings sind dann als maximale Länge nur noch 185 m zulässig. Hieraus resultiert also letztendlich auch die maximale Länge eines Ethernet-Segments. Ein Koaxialkabel besteht aus einem Innen-
Sandini Bib 1052
Kapitel 34
leiter, der das Datensignal führt, und dem Außenleiter, einer Abschirmung, die sich auf Massepotenzial befindet. Aufgrund der Tatsache, dass die Abschirmung als Geflecht das Datensignal nach außen hin schützt (abschirmt), ist die Störanfälligkeit dieser Verbindung relativ gering.
Abb. 34.7: Der Aufbau des Koaxialkabels
Twisted-Pair-Kabel Das Twisted-Pair-Kabel wurde ursprünglich im Fernmeldebereich eingesetzt, und es hat in den 80er Jahren auch Einzug in die LAN-Verkabelung gehalten. Für die Klassifizierung von verdrillten Leitungen (Twisted-Pair) sind insgesamt sieben maßgebliche Kategorien definiert worden. Kategorie
Bedeutung/Daten
1 2
Leistung eines konventionellen Telefonkabels mit einer maximalen Datenrate von 1 MBit/s. Kabel zum Ersatz (Nachfolger) des Kategorie-1-Kabels. Datenraten von bis zu 4 MBit/s sind über mittlere Entfernungen möglich. Wird auch für ISDN eingesetzt. UTP- oder STP-Kabel, Unshielded Twisted Pair (ohne Schirmung) oder Shielded Twisted Pair (mit Schirmung). Datenraten von bis zu 10 MBit/s bei einer Kabellänge von bis zu 100 m sind mit diesem für 16 MHz spezifizierten Kabel möglich. Wird z.B. für Ethernet (10BaseT) und auch Token-Ring verwendet. UTP/STP-Kabel (20 MHz) für größere Entfernungen als mit Kategorie-3-Kabel bei einer Datenrate von maximal 20 MBit/s. Wird allerdings kaum eingesetzt. Kabel für einen erweiterten Frequenzbereich (100 MHz). Gilt als Standardkabel und wird beispielsweise auch für FDDI und Fast-Ethernet verwendet. Frequenzbereich bis 200 MHz, wird für ATM empfohlen. ATM (155 MBit/s) ist aber auch auf Kabeln der Kategorie 5 möglich. Frequenzbereich bis 600 MHz. Geringeres Nebensprechen und geringere Dämpfung als Kategorie-6-Kabel. Wird bisher aber kaum eingesetzt.
3
4 5 6 7
Tab. 34.4: Die verschiedenen Kategorien für Twisted-Pair-Kabel
Diese TP-Kabel sind für Ethernet standardisiert (siehe Tabelle 34.4) und werden teilweise auch für andere Implementierungen (Token-Ring, 100VGAnyLAN) verwendet, wobei insbesondere das Twisted-Pair-Kabel der Kategorie 5 (CAT 5) sehr universell einzusetzen und demnach auch recht verbreitet ist. Hierfür ist ein Western-Stecker gemäß RJ45 als Standard anzusehen. Je nach LAN-Typ werden nur vier (z.B. Fast-Ethernet) oder aber auch alle acht Adern eines CAT-5Kabels (z.B. 100VGAnyLAN Gigabit-Ethernet) verwendet. Üblicherweise sind jedoch alle acht Adern beim TP-Kabel der Kategorie 5 entsprechend verdrahtet. Auf Twisted-Pair-Kabeln findet eine differenzielle Datenübertragung (symmetrisch) statt. Es gibt demnach mindestens zwei Sende-Leitungen (TXD+, TXD-) und auch zwei Empfangsleitungen (RXD+, RXD-), was somit gleichzeitiges Senden und Empfangen (Full-Duplex) ermöglicht. Die Datensignale werden hier also nicht wie bei einer Koaxialleitung auf die Masse bezogen, sondern
Sandini Bib Lokale Netzwerke
1053
das Nutzsignal liegt zwischen TXD- und TXD+, was dementsprechend auch für das Empfangssignal auf den RXD-Leitungen gilt. Dadurch werden Störsignale weitgehend unterdrückt, da sich ein äußeres Störsignal auf die beiden komplementären Signaladern auswirkt und das hieraus resultierende Differenzsignal idealerweise wieder zu Null wird. Voraussetzung ist hierfür, dass die Leitungen eines Adernpaares exakt gleich lang und zudem absolut homogen miteinander verdrillt sind.
Abb. 34.8: Der RJ45-Stecker ist die LAN-Standardverbindung für Twisted-Pair-Kabel.
Selbst wenn ein TP-Kabel diese Bedingungen prinzipiell erfüllt, kann es bei der Verlegung des Kabels und den Anschlüssen zu Inhomogenitäten kommen, weil das Kabel zu stark gequetscht wird oder die Anschlussdosen nicht optimal konfektioniert sind. Dies kann zur Verschlechterung der elektrischen Eigenschaften führen, was dann insbesondere bei Gigabit-Ethernet gravierende Auswirkungen haben kann, so dass sich deshalb keine Verbindung herstellen lässt. Pin Nr.
4-adrige Belegung
8-adrige Belegung
1 2 3 4 5 6 7 8
TXD+ TXD– RXD+ – – RXD– – –
TX_D1+ TX_D1– RX_D2+ BI_D3+ BI_D3– RX_D2– BI_D4+ BI_D4–
Tab. 34.5: Twisted-Pair-Kabel gibt es in 4- und in 8-adriger Ausführung, wobei Letztere für Gigabit-Ethernet und 100BaseVG-Any-LAN zwingend notwendig ist.
TP-Kabel gibt es in nicht abgeschirmter (UTP, Unshielded Twisted Pair) und abgeschirmter (STP, Shielded Twisted Pair) Ausführung, wobei STP unempfindlicher gegen äußere Störungen ist. Das STP-Kabel gibt es nun auch noch mit einer gemeinsamen Abschirmung (S-UTP), die als Mantel (Geflecht, Metallfolie) um alle Leitungen geführt ist, und in einer anderen Auslegung, bei der jedes Aderpaar (einzeln) abgeschirmt ist. Das übliche Kabel ist jedoch das S-UTP-Kabel (Kategorie 5), da es mit ihm in der Praxis die wenigsten Probleme gibt. Eine Mischung von verschiedenen TP-Kabeln innerhalb eines Stranges führt prinzipiell zu »ungeordneten« Masseverhältnissen und somit wieder zu einer erhöhten Störanfälligkeit.
Abb. 34.9: Typen von Twisted-Pair-Kabeln
Sandini Bib 1054
Kapitel 34
34.6.3 Thick-Ethernet Thick-Ethernet (10Base5) benutzt ein (dickes) Koaxialkabel mit gelber Farbe, das auch als Yellow Cable bezeichnet wird. Die maximale Länge dieses Kabels darf 500 m nicht überschreiten. Der Anschluss der Stationen erfolgt hier über so genannte Transceiver (Transmitter-Receiver), wobei die Länge des Drop-Kabels zwischen Transceiver und Station auf maximal 50 m begrenzt ist. In einem Personal Computer wird die Netzeinbindung üblicherweise durch einen Netzwerkadapter realisiert. Er weist für Thick-Ethernet auf der Rückseite eine 15-polige D-Sub-Buchse (AUI, Attachment Unit Interface) auf, an die der externe Transceiver per Drop-Kabel angeschlossen wird. Die Stationen bzw. Transceiver müssen aus Gründen des Signalverlaufs über einen Abstand von mindestens 2,5 m auf dem Yellow-Kabel verfügen. Insgesamt sind höchstens 100 Transceiver (und somit maximal 100 Stationen) an einem Ethernet-Strang, d.h. mit Yellow-Kabel, erlaubt. Thick-Ethernet wird für Neuinstallationen schon seit einiger Zeit nicht mehr verwendet, obwohl es gegenüber Cheapernet mit dem Vorteil aufwarten kann, dass hier (aufgrund der Verwendung externer Transceiver) Stationen während des laufenden Betriebs an das Netzwerksegment angeschlossen oder auch davon getrennt werden können.
Abb. 34.10: Der AUI-Anschluss für externe Transceiver
Der AUI-Connector, der mitunter auch als DIX-Connector bezeichnet wird, kann generell für den Anschluss von externen Transceivern und auch Medienkonvertern (z.B. Umsetzung auf LWL) zum Einsatz kommen. Laut Standard ist er für maximal 10 MBit/s vorgesehen, wobei es aber durchaus Einheiten (z.B. Hubs) gibt, mit denen auch 100 MBit/s möglich sein sollen. In den meisten Fällen funktioniert dies jedoch nicht. Die AUI-Signale bestehen aus drei Leitungspaaren für das Senden, das Empfangen sowie für die Kollisionserkennung und haben die in Tabelle 34.6 angegebene Signalbelegung. Pin Nr. Signal
Bedeutung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Abschirmung der Signalleitungen oder nicht belegt Steuerinformation zur Kollisionserkennung Datenübertragung, senden Abschirmung der Empfangsleitungen Datenübertragung, empfangen Ground, Masseleitung Signalisierung des Betriebszustands oder nicht belegt Abschirmung der Signalleitungen oder auch nicht belegt Steuerinformation zur Kollisionserkennung Datenübertragung, senden Abschirmung der Sendeleitungen oder auch nicht belegt Datenübertragung, empfangen Spannung von typisch 5 V nicht belegt Signalisierung des Betriebszustands oder auch nicht belegt
Control In Shield, CI-S oder NC Control In, CI-A Data Out A, DO-A Data In Shield, DI-S Data In A, DI-A GND Control Out, CO-A oder NC Control Out Shield, CO-S oder NC Control In B, CI-B Data Out B, DO-B Data Out Shield, DO-S oder NC Data In B, DI-B VCC NC Control Out, CO-B oder NC
Tab. 34.6: AUI-Anschlussbelegung
Sandini Bib Lokale Netzwerke
1055
34.6.4 Cheapernet oder Thin-Ethernet Ein Thin-Ethernet-LAN verwendet ein dünneres (Thin) und dadurch preiswerteres (Cheaper) BNC-Kabel. Die im PC-Bereich gebräuchlichen so genannten Kombi-Netzwerkkarten verfügen in der Regel über den für Thick-Ethernet notwendigen AUI-Anschluss, über einen TP-Anschluss (für RJ45-Stecker) und enthalten außerdem noch einen Transceiver onboard, der mit einem BNCAnschluss versehen ist. Die Netzwerkverbindung wird hier mit dem dünneren Koaxialkabel hergestellt, das mit Hilfe eines BNC-T-Stücks am Adapter anzuschließen ist. Das Koaxialkabel wird einfach von PC zu PC geführt, mittels den T-Stücken zu einem Bus verbunden und an den beiden Enden jeweils mit einem Terminierungswiderstand (50 Ω) abgeschlossen. Das dünnere Kabel erlaubt für einen Ethernet-Strang nur 185 m (im Gegensatz zu 500 m bei Thick-Ethernet), an das höchstens 30 Stationen (statt 100) angeschlossen werden können. Zwischen zwei T-Abzweigungen muss mindestens 0,5 m Abstand liegen. Ansonsten stimmt Cheapernet (10Base2) hinsichtlich Übertragungsleistung und Funktion völlig mit Thick-Ethernet (10Base5) überein. Es ist auf maximal 10 MBit/s beschränkt und erlaubt demnach auch keine Migration zu den folgenden Ethernet-Standards.
Abb. 34.11: Der Anschluss von Thin-Ethernet an eine Netzwerkkarte mit T-Stück und Abschlusswiderstand.
34.6.5 Ethernet mit Twisted-Pair-Kabel Twisted-Pair-Kabel werden generell von Gerät zu Gerät verlegt, was bedeutet, dass sich eine sternförmige Verkabelung ergibt und nicht einfach ein Kabel von einem PC zum anderen – wie beim Koaxialkabel – geschleift werden kann. Der Verdrahtungsaufwand ist demnach höher, allerdings kann ein PC problemlos vom laufenden Netzwerk abgehängt werden, und falls ein Kabel oder Anschluss defekt ist, steht nicht gleich das gesamte Netzwerk still. Zur Realisierung einer sternförmigen Verkabelung wird ein Verteiler – ein Hub – benötigt, an den die PCs über einzelne Twisted-Pair-Leitungen anzuschließen sind. Falls nur zwei PCs per TP-Kabel verbunden werden sollen, kann auch ein spezielles TP-Kabel (Cross Cable) verwendet werden, bei dem die Leitungspaare TXD und RXD überkreuz laufen, wodurch die Sendeleitungen des einen PC den Empfangsleitungen des anderen entsprechen und natürlich auch umgekehrt. Die bereits erwähnten Kombi-Netzwerkkarten (AUI, Koax, TP) entsprechen in den meis-
Sandini Bib 1056
Kapitel 34
ten Fällen dem 10 MBit/s-Ethernet, was für TP-Kabel 10BaseT bedeutet. Hierfür reicht prinzipiell bereits ein TP-Kabel der Kategorie 3 (kein Full-Duplex möglich) aus, besser wäre eines der Kategorie 4, das jedoch kaum verbreitet ist, so dass sich generell die Verlegung von CAT-5Kabeln empfiehlt. Mit diesem Kabel können auch Fast- und Gigabit-Ethernet genutzt werden, wenn später durch den Austausch der entsprechenden Einheiten (Netzwerkkarten, Koppelelemente) eine Steigerung der Datenrate notwendig werden sollte, ohne dass gleich eine komplette Neuverlegung der Leitungen notwendig wird.
Abb. 34.12: Topologie eines Netzwerks mit Hubs und Switches unter Verwendung von Twisted-Pair-Kabel
34.6.6 Fast-Ethernet Die erste wesentliche Weiterentwicklung im Ethernet-Bereich ist das so genannte Fast-Ethernet, das auf eine Verzehnfachung der Übertragungsrate von somit 100 MBit/s zielt. Es (100BaseTX) ist abwärtskompatibel zu Ethernet mit 10 MBit/s (10BaseT), d.h. eine Fast-Ethernet-Karte kann auch in einem Netz mit 10 MBit/s arbeiten. Von der Anwenderseite her gesehen, fallen die Anpassungen auf 100BaseTX im Grunde genommen nicht weiter auf, denn fast jede heute erhältliche TP-Netzwerkkarte unterstützt auch FastEthernet, wobei ihr diese Funktionalität weder von den TP-Anschlüssen her noch sonst irgendwie unmittelbar anzusehen ist. Entsprechendes gilt für die »schnelleren« Hubs und Switches, die üblicherweise automatisch in der Lage sind, zwischen beiden Ethernet-Varianten (Standard und Fast) umschalten zu können, wenn die Clients dies erfordern sollten.
Sandini Bib Lokale Netzwerke
1057
Diese Funktion wird als Autonegotiation bezeichnet und erweist sich in der Praxis mitunter als etwas problematisch, weil sie nicht immer automatisch korrekt funktioniert und daher manuelle Einstellungsarbeiten notwendig werden. Wichtig ist dabei, dass es sowohl bei den Netzwerkkarten als auch bei den Kopplungseinheiten üblicherweise Anzeigen in Form einzelner Leuchtdioden gibt, die sowohl den jeweiligen Status des Netzwerkports als auch die momentane Betriebsart signalisieren, was sich insbesondere bei der Fehlersuche in einem LAN als sehr nützlich erweisen kann. Neben der Switching-Funktionalität und damit dem nicht mehr zwingenden Einsatz des leistungshemmenden CSMA/CD-Verfahrens sind weitere Veränderungen (siehe auch Tabelle 34.3) am »alten« Ethernet-Standard notwendig gewesen, um zu den höheren Datenübertragungsraten zu gelangen. Generell gilt: Je höher die Geschwindigkeit ausfällt, desto kürzer wird die maximal zulässige Distanz, wenn man die minimale Paketgröße von 64 Bytes beibehalten will. Der Übergang von Standard-Ethernet auf Fast-Ethernet hat somit eine Distanzreduzierung der Kollisionsdomäne um den Divisor 10 auf maximal ca. 200 m zur Folge, wenn man theoretisch davon ausgeht, dass mit Standard-Ethernet bis zu ca. 2000 m möglich sind. In der Praxis ist dies aufgrund der verwendeten Geräte und physikalischen Eigenschaften des Mediums jedoch nicht gegeben. Kodierungen Für Fast-Ethernet wurde die Kodierung verändert. Die Grundlage bildet zunächst der so genannte Manchester-Code, wie er bei Ethernet mit 10 MBit/s eingesetzt wird. Dabei werden die binären Zustände durch Spannungswechsel innerhalb der Bitzeit (0,1 µs) abgebildet. Jede binäre 1 wird durch eine abfallende Flanke und jede binäre 0 durch eine ansteigende Flanke dargestellt. Die erste Hälfte des Manchester-Bit-Wertes enthält den komplementären Wert des ursprünglichen Bits, während die zweite Hälfte den tatsächlichen Wert darstellt, wodurch sichergestellt wird, dass bei der Übertragung mehrerer gleicher aufeinander folgender Bits dennoch ein Pegelwechsel stattfindet, denn dies ist notwendig, weil daraus das Taktsignal gewonnen wird. Wenn sich ein Taktsignal auf dem Medium befindet, gilt dieses bei CSMA/CD dann als belegt.
Abb. 34.13: Manchester-Kodierung
Fast-Ethernet verwendet hingegen die 4B/5B-Kodierung, die bereits bei FDDI zum Einsatz kam. Ein Datenbyte besteht stets aus zwei Nibbles (4 Bit). Die Daten werden zunächst in Nibbles zerlegt, woraufhin das 4B/5B-Verfahren zur Anwendung kommt. Jede 4B/5B-Code-Gruppe besteht dabei aus fünf Bits, es wird also ein Bit mehr verwendet, als eigentlich notwendig wäre. Dies führt dazu, dass pro Gruppe nicht nur 16, sondern 32 Bit-Kombinationen möglich sind. Die hiermit erzeugten Code-Gruppen dienen zum einen zur Übertragung der Nutzdaten und zum anderen zur Steuerung sowie zur Fehlererkennung, wobei es eine eindeutige Zuordnung gibt, so dass für diese Zwecke ganz bestimmte Code-Gruppen zur Anwendung kommen, die in Tabelle 34.7 angegeben sind.
Sandini Bib 1058
Code-Gruppe Bit: 43210
Kapitel 34
Name
TX/RX Bit: 3210
Bedeutung/Funktion
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Data 0 Data 1 Data 2 Data 3 Data 4 Data 5 Data 6 Data 7 Data 8 Data 9 Data A Data B Data C Data D Data E Data F
I J K T R
undefiniert 0101 0101 undefiniert undefiniert
Idle: Stream Fill Code Start of Stream Delimiter, Teil 1 Start of Stream Delimiter, Teil 2 End of Stream Delimiter, Teil 1 End of Stream Delimiter, Teil 2
H
undefiniert
Transmit Error
V V V V V V V V V V
undefiniert undefiniert undefiniert undefiniert undefiniert undefiniert undefiniert undefiniert undefiniert undefiniert
ungültig ungültig ungültig ungültig ungültig ungültig ungültig ungültig ungültig ungültig
Datengruppe 11110 01001 10100 10101 01010 01011 01110 01111 10010 10011 10110 10111 11010 11011 11100 11101 Control-Gruppe 11111 11000 10001 01101 00111 Fehler-Gruppe 00100 Gruppe ungültiger Codes 00000 00001 00010 00011 00100 00101 00110 01000 10000 11001 Tab. 34.7: Die 4B/5B-Code-Tabelle
Die Idle-Code-Gruppe wird für Füllinformationen zwischen den Frames (Interframe Gap) verwendet, damit bei dem Verbindungsaufbau eine Taktsynchronisierung zwischen Sender und Empfänger gegeben ist. Der Beginn und das Ende eines MAC-Frame (Media Access Control, Medienzugangsverfahren) wird durch die Code-Paare JK (Start of Stream Delimiter) und TR (End of Stream Delimiter) signalisiert und ein Übertragungsfehler durch die H-Code-Gruppe. Die Kodierung wurde so gewählt, dass die Lauflänge der Bitmuster limitiert ist, damit sich die Taktinformation im Datenstrom vom Empfänger wieder rekonstruieren lässt. Der 4B/5B-Code
Sandini Bib Lokale Netzwerke
1059
gehört somit zu den Run Length Limited Codes (RLL), die sicherstellen, dass nie mehr als eine bestimmte Anzahl von Nullen und Einsen hintereinander übertragen werden. Wenn mehr Einsen als Nullen gesendet werden (oder auch umgekehrt), entsteht auf dem Medium ein unerwünschter Gleichspannungsanteil, der im schlimmsten Fall dafür sorgt, dass der Empfänger die Daten dann nicht mehr korrekt interpretieren kann. Generell wird das Verhalten der Übertrager (Transformatoren) auf den Netzwerkkarten durch die Gleichspannung ungünstig beeinflusst. Mit dem 4B/5B-Verfahren erreicht man keine reine Gleichspannungsfreiheit, und es ist hier ein Anteil von maximal 10% Gleichspannung zulässig.
34.6.7 Gigabit-Ethernet Den Nachfolger von Fast-Ethernet stellt Gigabit-Ethernet (1000BaseT) dar, das wiederum eine Verzehnfachung der Datenrate des Vorgängers mit sich bringt und somit 1000 MBit/s bietet. Als Verbindungen sind ebenfalls Twisted-Pair-Kabel (CAT 5) sowie auch Lichtwellenleiter (Fibre Optic) geeignet. Auch wenn im LAN heutzutage 100 MBit/s der Standard sind, ist GigabitEthernet (1000 MBit/s) auf dem Vormarsch, was zunächst etwas übertrieben erscheinen mag. Allerdings gibt es in einem LAN an irgendeiner Stelle eigentlich immer einen Engpass für den Datenfluss, und selbst wenn ein Netzwerk komplett mit Switches und Fast-Ethernet realisiert ist, kommt es dann bei angebundenen Servern zu dem Engpass, wo quasi alle Daten zusammenlaufen und die Anwender somit einen regen Datenverkehr verursachen. Daher leuchtet es ein, an dieser Stelle einen Gigabit-Switch zu installieren, der den Server über 1000 MBit/s anbindet und zur Anwenderseite hin mit Fast-Ethernet arbeitet. In den Servern sind dementsprechend Gigabit-Ethernet-Karten notwendig, wobei hier PCI mit 32 Bit prinzipiell nicht mehr ausreicht, weil dann der PCI-Bus zum Flaschenhals für die Datenübertragung wird. Demnach sind in Servern vorzugsweise 64-Bit-PCI-Netzwerkkarten vorzusehen, während die Clients oftmals (weiterhin) mit den Fast-Ethernet-Karten für den 32-Bit-PCI-Bus arbeiten. Analog zu den obigen Erläuterungen bei Fast-Ethernet und zu den Angaben in Tabelle 34.3 würde sich die maximale Distanz bei Gigabit-Ethernet auf ca. 20 m reduzieren, was aber kaum praktikabel erscheint. Um kompatibel zu bleiben, konnte aber kein neues Frame-Format eingeführt werden. Stattdessen werden die Gigabit-Frames durch spezielle Zeichen, die als Carrier Extension oder auch Padding Bytes bezeichnet werden, auf eine Mindestlänge von 512 Bytes ergänzt, was zu einer Slot-Time von 4096 Bitzeiten (statt 512 Bitzeiten) führt. Dadurch wird sichergestellt, dass die Kollisionserkennung wieder über eine Distanz von 200 m funktioniert. Zu beachten ist, dass bei Punkt-zu-Punkt-Gigabit-Verbindungen im Vollduplex-Betrieb gearbeitet werden kann, dass somit kein CSMA/CD-Verfahren und daher auch keine Frame-Verlängerung notwendig ist. Gleichwohl ist eben aus Kompatibilitätsgründen diese Möglichkeit bei GigabitEthernet mit im Standard definiert. Beim Transport relativ kleiner Pakete kann sich die (künstliche) Frame-Verlängerung leistungstechnisch gesehen negativ bemerkbar machen, und als Gegenmaßnahme können mehrere kleine Pakete zu einem großen mit mehr als 512 Byte zusammengefasst werden, was unter dem Begriff Packet Bursting firmiert. Diese »geschnürten« Pakete dürfen andererseits aber nicht zu groß werden. Damit dann auch andere Stationen mit kleineren Paketen den Zugriff erhalten können, darf eine Station deshalb über einen maximalen Zeitraum von 65.536 Bits (8192 Bytes) Daten übertragen, was als Burst Limit bezeichnet wird. Demnach darf eine Station bei Gigabit-Ethernet einen Burst senden, der etwas mehr als fünf Ethernet-Paketen maximaler Frame-Größe entspricht. Die Lücke, die bei der Verkettung einzelner Pakete entsteht, wird mit Carrier Extensions aufgefüllt, was als Interframe Gap bezeichnet wird.
Sandini Bib 1060
Kapitel 34
Gigabit-Ethernet wurde in der ersten Standardisierungsphase allein für Lichtwellenleiter (1000BaseLX, 1000BaseSX) definiert, und die darauf folgende Variante für Kupfer-basierte Verbindungen (1000BaseCX) verwendet Twinaxial-Kabel, was einem Koaxialkabel mit zwei eingebetteten Signalleitungen entspricht. Mit dieser CX-Kabelverbindung ergibt sich eine maximale Distanz von lediglich 25 m, so dass sich diese Lösung nur für räumlich begrenzte Verbindungen, wie in einem Serverschrank oder -raum, empfiehlt. Eigentlich wird diese Version aber kaum verwendet: Entweder hat man gleich Glasfaser eingesetzt oder 1000BaseT abgewartet, das GigabitEthernet auf CAT-5-Kabel ermöglicht. Im Gegensatz dazu kommt man bei 1000BaseCX jedoch ohne speziellere Kodierungsverfahren aus, was die Elektronik vereinfacht. Gleichwohl haben die beiden anderen Varianten diese Realisierung mittlerweile abgelöst. Das Kabel der Kategorie 5 ist eigentlich nur für Übertragungsraten von bis 100 MBit/s (100 MHz) geeignet, und stattdessen könnte eines der Kategorie 7 (siehe Tabelle 34.2) für kupferkabel-basiertes Gigabit-Ethernet (1000BaseTX) zum Einsatz kommen, was jedoch zahlreiche neue Kabelinstallationen zur Folge gehabt und die Migration zu Gigabit-Ethernet somit erschwert hätte.
Abb. 34.14: Bei Gigabit-Ethernet werden alle acht Leitungen eines CAT-5-Kabels für die Datenübertragung auf vier Kanälen verwendet, wofür spezielle Transceiver in den Netzwerkkomponenten zum Einsatz kommen.
Zum einen begegnet man den negativen physikalischen Effekten bei der Gigabit-Ethernet-Übertragung (Dämpfung, Übersprechen) mit relativ komplexen Kodier- und Übertragungsverfahren (PAM5-Multilevel Codes, Trellis-Kodierung, Scrambling), und zum anderen werden hier alle acht Adern (vier Leitungspaare) des CAT-5-Kabels für die Datenübertragung verwendet und nicht nur zwei Leitungspaare (vgl. Tabelle 34.5). Es findet dabei zunächst eine Vorgehensweise wie bei 100VGAny-LAN statt.
Sandini Bib Lokale Netzwerke
1061
Bei Gigabit-Ethernet werden vier simultane Übertragungskanäle (A-D) zu je 250 MBit/s gebildet. Dies würde ohne zusätzliche Maßnahmen aber dazu führen, dass keine Leitungen mehr für den Vollduplex-Betrieb (gleichzeitiges Senden und Empfangen) zur Verfügung stünden und nur der CSMA/CD-behaftete Halbduplex-Modus möglich wäre. Für die Lösung dieses Problems sorgt ein Verfahren mit der Bezeichnung Echo Cancellation, das auf beiden Seiten gleichzeitig aktive Sender und Empfängerbausteine (Transceiver) voraussetzt. Die Signale werden damit auf dem Medium quasi gemischt, und der Empfänger subtrahiert dabei das ihm bekannte Signal seines Senders vom Gesamtsignal, wodurch er das von der Gegenseite gesendete Signal ermittelt. Mit Hilfe dieser »Tricks« wird auch der VollduplexBetrieb mit 1000 MBit/s auf CAT-5-Kabel möglich. 8B/10B-Kodierung Bei Gigabit-Ethernet (1000BaseCX/LX/SX) wird die 8B/10B-Kodierung verwendet. Diese kommt ebenfalls beim Fibre-Channel zum Einsatz, den es zeitlich gesehen bereits vor GigabitEthernet gab. Das Prinzip ist dabei ähnlich wie beim 4B/5B-Kodierungsverfahren, nur dass hier acht Datenbits auf 10 Übertragungsbits umgesetzt werden. Eine Code-Gruppe besteht immer aus 10 Bits, was eine effizientere Fehlerkorrektur und Datensynchronisation (Takt) ermöglicht; die Effizienz liegt hier bei 80% wie beim 4B/5B-Kodierungsverfahren. Außerdem kann beim 8B/ 10B-Kodierungsverfahren kein Gleichspannungsanteil (DC balanced) auftreten, weil für jedes Byte zwei 10-Bit-Code-Gruppen definiert sind, die sich derart ergänzen, dass immer nach 20 hintereinander übertragenen Bits die gleiche Anzahl von Einsen und Nullen entsteht, was sich als äußerst günstig auf die Übertrager auswirkt. Im seriellen Datenstrom sind durch die 8B/10BKodierung daher eine ausreichende Anzahl von Pegelwechseln vorhanden, was dem Empfänger als Takt dient, auf den er sich synchronisiert. Zur Steuerung der abwechselnden Übertragung wird ein RD-Flag (Running Disparity) verwendet, das auch für die Fehlererkennung zum Einsatz kommt. Bei der 8B/10B-Kodierung bedeutet dies, dass, falls sich in einem Byte mehr Einsen als Nullen befinden, dies als negative Disparity bezeichnet wird. Falls mehr Nullen als Einsen vorhanden sind, führt dies zu einer positive Disparity, und bei gleicher Anzahl spricht man von einer neutralen Disparity. Der 10-Bit-TransmissionCode unterstützt alle möglichen 256 Acht-Bit-Kombinationen (Ordered Sets), wobei einige als Special Characters (Control Characters) definiert sind, die sich von den Data Characters eindeutig unterscheiden und für die Steuerung verwendet werden. Die Umsetzung eines Bytes (Beispiel 45h) in einen 8B/10B-Code funktioniert nach dem in Abbildung 34.15 angegebenen Schema.
Abb. 34.15: Die Umsetzung des Bytes 45h in den 10-Bit-Code, wobei die Stellen »I« und »J« die Running Disparity darstellen.
Sandini Bib 1062
Kapitel 34
Die Notation (im Beispiel 5.2) besteht noch aus einem zusätzlichen Zeichen, das kennzeichnet, ob es sich um einen Data Character (D) oder um einen so genannten Special Character (K) für die Steuerung handelt. Das Zeichen D5.2 ist demnach ein Data Character und K28.5 ein Special Character. Die Bedeutung der K-Code-Gruppen ist in Tabelle 34.8 gezeigt. Code-Gruppe
Octet-Bits HGF EDCBA
Bedeutung/Funktion
K28.0 K28.1 K28.2 K28.3 K28.4 K28.5 K28.6 K23.7 K27.7 K29.7 K30.7
000 11100 001 11100 010 11100 011 11100 100 11100 101 11100 110 11100 111 10111 111 11011 111 11101 111 11110
Reserviert Reserviert Reserviert Reserviert Reserviert Konfigurationsdaten Reserviert Carrier Extend Start of Packet End of Packet Error Propagation
Tab. 34.8: Die Special Characters des 8B/10B-Codes
Für die Kennzeichnung des Begins und des Endes eines Frames dienen K27.7 und K29.7, was analog zu 100Base funktioniert. Carrier Extend (K23.7) wird für die Verlängerung kurzer Frames (im Halbduplex-Betrieb) verwendet, was mit den Füllinformationen (Idle-Code-Gruppe) bei 100Base vergleichbar ist, und Error Propagation für die Signalisierung von Übertragungsfehlern. K28.5 ist für den Austausch von Konfigurationsdaten (Configuration Sets) zwischen zwei Teilnehmern vorgesehen. Die Configuration Sets bestehen aus vier Code-Gruppen. Nach der Übertragung von K28.5 folgt eine Konstante (D21.5 oder D2.2), und danach folgen zwei Datengruppen, die die Konfigurationsdaten darstellen, die für die Autonegotiation (automatische Mode-Einstellung: Datenrate, Duplex-Typ) benötigt werden. Jedes zu übertragende Datenbyte verfügt über zwei korrespondierende 10-Bit-TransmissionCharacters, und der Sender sorgt für die Einhaltung der jeweils vereinbarten Running Disparity, indem Transmission Characters selektiert werden, die die Running Disparity so weit wie möglich zu Null werden lassen. Dadurch werden fehlerhaft übertragene Daten gewissermaßen wieder zu gültigen Daten, die dann mit Hilfe der Running Disparity aber als Fehler detektiert und auch korrigiert werden können. Multilevel-Kodierungen Kodierungsverfahren, die für die Bitübertragung nicht nur zwei Stufen (z.B. +V = High, -V= Low), sondern mehrere (multilevel) verwenden, werden unter der Bezeichnung Multi-Level Transmission (MLT) geführt. Bei dem MLT-3-Verfahren bedeutet dies, dass hier drei Stufen (Ternär-Code) von +V, 0 V und –V vorhanden sind, die die Sender und Empfänger entsprechend im Pegel erkennen müssen. Durch diese »Verteilung« reduziert man die (Basis-)Frequenz, was eine geringere Abstrahlung und bessere Dämpfungswerte sowie auch eine geringere Fehlerrate zur Folge hat. Die Anforderungen an das zu verwendende Netzwerkkabel werden durch MLT geringer. Daher ist es sinnvoll, MLT für die immer höheren Datenraten anzuwenden.
Sandini Bib Lokale Netzwerke
1063
Abb. 34.16: MLT-3-Kodierung
MLT-3 wird beispielsweise bei FDDI auf TP-Kabel (CDDI) eingesetzt, wofür eine Datenübertragungsrate von 100 MBit/s plus 25 MBit/s für Kontrolldaten definiert ist, was ein Kabel mit einer zulässigen Frequenz von 125 MHz erfordern würde. Da sich innerhalb einer Periode mit MLT-3 aber gleich vier Bits übertragen lassen, entsteht nur eine Frequenz von 31,25 MHz (ein Viertel davon). Weil Fast-Ethernet auf TP-Kabel (100BaseTX) ebenfalls MLT-3 verwendet, konnten im Übrigen die bereits für CDDI entwickelten Transceiver-Bausteine und -Übertrager unmittelbar übernommen werden. Eine weiteres Multilevel-Verfahren, das mit fünf Levels statt mit drei wie MLT-3 arbeitet, wird als Pulse Amplitude Modulation (PAM) bezeichnet. Hier gibt es die Stufen von -2, -1, 0, +1, +2, was erstmalig bei 100BaseT2 zur Reduzierung der Bitrate eingesetzt wurde, um 100 MBit/s auf einem Kabel der Kategorie 3 transportieren zu können. Während bei den Gigabit-Ethernet-Implementierungen 1000BaseCX/LX/SX die 8B/10B-Kodierung verwendet wird, kommt bei 1000BaseTX PAM5 plus Trellis-Kodierung zum Einsatz. Hiermit wird die Kodierung und Modulation derart kombiniert, dass sich eine geringere Bitfehlerrate und ein verbesserter Signal/Rauschabstand ergeben. Die Trellis-Kodierung verwendet acht Datenbits plus einem zusätzlichen Parity-Bit und verteilt diese auf die fünf Level (PAM5) der bei 1000BaseTX vorhandenen vier Übertragungskanäle. Dadurch entsteht ein vierdimensionaler Übertragungscode mit acht Zuständen in einem CodeRaum bestehend aus fünfwertigen Symbolen (2, -1, 0, +1, +2), wobei jeder vierdimensionale Code als Quadrupel (An, Bn, Cn, Dn) auf den vier Leitungspaaren übertragen wird. Ein Ausschnitt aus der Trellis-Code-Tabelle (Abbildung 34.17) zeigt, wie man sich die Bit-Umsetzung dabei vorstellen kann. Was die Angelegenheit noch etwas komplizierter macht, ist die Tatsache, dass auf die Daten zusätzlich noch ein Scrambling angewendet wird. Die Daten werden gewissermaßen »zerwürfelt«, weil sie nicht gleichmäßig aus Nullen und Einsen bestehen, was schon dadurch passiert, dass die Lücken zwischen den Frames mit Idle- und Extension-Codes gefüllt werden müssen. Dies führt ohne Scrambling zu bestimmten Frequenzmaxima auf den Kabeln, somit zu einer erhöhten Abstrahlung und damit zu Störungen. Außerdem ergibt sich dadurch auch ein unerwünschter Gleichspannungsanteil auf dem Kabel. Der Einsatz des Scrambling-Algorithmus, der auf Bit-Ebene angewendet wird, führt zu einem gleichmäßigen Frequenzgemisch auf den Leitungen, und zwar unabhängig vom tatsächlichen Informationsinhalt der Datenpakete.
Sandini Bib 1064
Kapitel 34
Abb. 34.17: Trellis-Kodierung mit PAM5 über vier Übertragungskanäle
34.6.8 Lichtwellenleiter An dieser Stelle erscheint es mir sinnvoll, etwas näher auf Lichtwellenleiter (Glasfaser) für Netzwerke einzugehen, denn bereits bei Gigabit-Ethernet ist zu erkennen, dass sich Kupferverbindungen für höhere Datenübertragungsraten nur mit zahlreichen technischen Kniffen anwenden lassen, und spätestens bei 10-Gigabit-Ethernet führt kein Weg mehr an den Lichtwellenleitern (LWL) vorbei. Netzwerke auf der Basis von Lichtwellenleitern (LWL) sind gegenüber Kupferverbindungen störunempfindlich, abhörsicher und weisen eine niedrige Fehlerrate auf. Die LWL-Verbindungen können beispielsweise auch im gleichen Kabelschacht wie etwa die Starkstromleitungen verlegt werden, und die von den Stromkabeln ausgehenden Störungen haben keinerlei Einfluss auf die Netzwerkverbindung. Beschädigungen durch Überspannungen, statische Entladung oder auch durch Blitzschlag sind bei LWL nicht möglich. Außerdem gibt es hier zwangsläufig eine »galvanische« Entkopplung zwischen der Netzwerkhardware (z.B. Netzwerkkarte) und dem Medium, wofür bei den TP- und Koax-Netzwerkkarten spezielle Übertrager (Transformatoren) notwendig sind. Masseprobleme sind bei einer optischen Übertragung daher auch nicht möglich.
Sandini Bib Lokale Netzwerke
1065
Die Lichtwellenleiterverbindungen – gewissermaßen die LWL-Kabel, auch wenn es keine Kabel im elektrischen Sinne sind – sind entgegen den oft angeführten Befürchtungen äußerst robust, dabei relativ dünn und daher sehr flexibel, was sie in der Handhabung sogar unkritischer macht erscheinen lässt als TP-Kabel. Prinzipiell gibt es zwar eine Vielzahl von möglichen LWLAnschlüssen, aber ab Fast-Ethernet auf Glasfaser (100BaseF) hat sich die SC-Verbindung als Standard hierfür erwiesen. Über entsprechende Adapter lassen sich aber auch Verbindungen zwischen den (älteren) ST- und den SC-Steckverbindern problemlos herstellen.
Abb. 34.18: Die Standardverbindungen für Lichtwellenleiter
Bei Lichtwellenleitern wird generell zwischen Monomode-Leitern (auch als Singlemode bezeichnet) und Multimodeleitern unterschieden. Bei Multimode-Fasern findet die Signalübertragung anhand mehrerer »Moden« statt, während eine Monomode-Faser das Licht nur in einer Mode (parallel zur Achse des Mediums, Mode 0) überträgt, was demgegenüber zu geringeren Dämpfungswerten und höheren Bandbreiten führt. Bei 10BaseFX sowie 100BaseFX spielt fast ausschließlich die Dämpfung, die durch Reflexion und Absorption des »Transportlichtes« verursacht wird, eine Rolle. Demnach hat man es bei der Dämpfung auf Glasfaser mit einem völlig anderen Effekt zu tun, als dies bei Kupferverbindungen und den dort zugrunde liegenden elektrischen Eigenschaften der Fall ist. Dämpfungen bei Lichtwellenleitern entstehen bei in erster Linie durch die Übergänge bei einer Glasfaserstrecke (Dosen, Anschlüsse, Adapter usw.) sowie in zweiter Linie durch Verunreinigungen der Faser selbst, was jedoch bei den aktuellen handelsüblichen Glasfasern zu vernachlässigen ist, da sie qualitativ hochwertig genug sind. Je nach Wellenlänge des verwendeten Lichtes stellt sich die Dämpfung über Glasfaser unterschiedlich dar, und da die Dämpfung bei 850 nm, 1300 nm sowie bei 1500 nm minimal ist, werden diese Wellenlängen eben auch für LWL-Netzwerke verwendet. Die Wellenlängen werden von entsprechenden (Laser-)Dioden auf den Netzwerkkarten und den Koppeleinheiten (Hubs, Switches) erzeugt und von den »Gegenstücken«, den dazu passenden Fotodioden, der Einheiten wieder empfangen. Leuchtdioden (Light Emitting Diode, LED) strahlen das Licht gleichförmig in mehrere Richtungen ab. Das grundsätzliche Prinzip des Lichttransports über Lichtwellenleiter beruht dabei auf der Totalreflexion an den Grenzschichten der Materialien unterschiedlicher Dichte. Bei der Verwendung einer LED wird das Licht unterschiedlich oft an der Oberfläche reflektiert, es legt unterschiedliche Wege zurück, was zu den verschiedenen Moden führt. Für das Datensignal bedeutet dies, dass es zu unterschiedlichen Laufzeiten und damit zu Signalverzerrungen kommt, was von der Länge der Lichtwellenleiterstrecke abhängig ist. Diesen Effekt, der zum einen durch den Leiter selbst und zum anderen auch durch die Lichtquelle hervorgerufen wird, bezeichnet man als Dispersion, und er ist insbesondere ab Gigabit-Ethernet ein ausschlaggebendes Kriterium.
Sandini Bib 1066
Kapitel 34
Multimode-Faser mit Stufenindex-Profil
PD
LD
Ausgangsimpuls
Eingangsimpuls
Multimode-Faser mit Gradientenindex-Profil PD
LD
Ausgangsimpuls
Eingangsimpuls
Monomode-Faser
LD Eingangsimpuls
PD Ausgangsimpuls
Abb. 34.19: Die Lichtübertragung differiert bei den verschiedenen Fasern, was in Abhängigkeit von der Übertragungsstrecke zu unterschiedlich »guten« Ausgangsimpulsen führt.
Ab 100BaseFX werden statt LEDs auch Laserdioden (LD) verwendet, die ein stärker gebündeltes Signal aussenden und bei denen der überwiegende Anteil der Lichtintensität über den direkten gradlinigen Weg abgestrahlt wird, so dass auch Entfernungen über mehrere Kilometer überbrückt werden können, wobei aber die Faser selbst eine gewichtige Rolle spielt. Generell werden drei grundsätzliche Typen unterschieden:
: : :
Multimode-Faser mit Stufenindex-Profil (100 MHz x km) Multimode-Faser mit Gradienten-Profil (1 GHz x km) Monomode-Faser (10 GHz x km)
Für die Klassifizierung von Lichtwellenleitern wird ein Produkt von Bandbreite und Länge angegeben, da die Dispersion von der Länge der Glasfaser abhängig ist. Bei einer Angabe wie 100 MHz x km kann daher eine LAN-Verbindung mit 100 MHz über 1 km oder 50 MHz über 2 km oder beispielsweise auch 200 MHz über 500 m realisiert werden. Die typischen Richtwerte sind in Klammern oben bei den drei Fasertypen angegeben. Allen drei Fasertypen ist gemeinsam, dass sie von einem Kunststoffmantel (Buffer Coating) umgeben sind, der dem Glasmantel (Cladding) nach außen als Schutz dient. Ganz im Innern ist der eigentliche Kern der Faser (Core) untergebracht. Core und Cladding bestehen zwar meist beide aus Quarzglas (SiO2), allerdings unterscheiden sich dabei die jeweiligen Brechungsindizes. Der Brechungsindex beschreibt generell das Verhältnis der Lichtgeschwindigkeit im Vakuum (ca. 300.000 km/s) zur Lichtgeschwindigkeit im Medium. Der mehr oder weniger gebündelte Strahl wird an der Grenzfläche der beiden Glasmaterialien reflektiert und somit in der Faser gehalten. Neben Glas werden auch unterschiedliche Kunststofffasern (meist bei 650 nm Wellenlänge) verwendet, die preiswerter und einfacher zu fertigen
Sandini Bib Lokale Netzwerke
1067
sind, allerdings noch nicht die Qualität der Glasfasern erreichen. Sie weisen höhere Dämpfungen auf und können demnach auch nur kürzere Strecken überbrücken. Außerdem werden auch Glas- und Kunststofffasern miteinander kombiniert, was zu einem besonders günstigen Preis/ Leistungsverhältnis führen soll. Wenn man also von Glasfaser redet, kann dies auch eine Kunststofffaser sein, so dass Lichtwellenleiter (LWL) vielleicht die treffendere Bezeichnung ist. Beim Stufenindex-Profil besteht zwischen dem Kern und dem Mantel ein abrupter Übergang vom einen zum anderen Brechungsindex. Der Brechungsindex (n) ist dabei im Cladding geringer als im Core (ncore > ncladding = totale Reflexion). Da die Lichtstrahlen der Quelle (LED) in unterschiedlichen Winkeln auftreffen, ergibt sich ein Zickzackverlauf des Lichtes, was eine Verbreiterung des Ausgangsimpulses gegenüber dem Eingangsimpuls zur Folge hat und für typische Längen bis hin zu 200 m noch durch eine Photodiode als eindeutiger Impuls (High) zu detektieren ist. Bei einer Faser mit Gradientenindex-Profil wird eine abgestufte Veränderung der Brechungsindizes realisiert, so dass sich für die Lichtstrahlen gekrümmte Bahnen ergeben und sich das Licht im Mittel eher auf dem optimalen gradlinigen Weg bewegt. Der Ausgangsimpuls ist dadurch ausgeprägter, und es können somit größere Entfernungen als mit einer Stufenindex-Profil-Faser (bis zu 10 km) überbrückt werden. Multimode-Faser mit Stufenindex-Profil
Kunststoffmantel (Buffer Coating)
Glasmantel (Cladding)
Kern (Core)
100 µm 200 µm 400 µm
200 µm 300 µm 500 µm
Multimode-Faser mit Gradientenindex-Profil
Kunststoffmantel (Buffer Coating)
Glasmantel (Cladding)
Kern (Core)
Glasmantel (Cladding)
Kern (Core)
50 µm 62,5 µm
125 µm
Monomode-Faser
Kunststoffmantel (Buffer Coating)
5 µm 9 µm
100 µm
Abb. 34.20: Der prinzipielle Aufbau und die jeweiligen Durchmesser der verschiedenen Fasertypen
Sandini Bib 1068
Kapitel 34
Monomode-Lichtwellenleiter entsprechen im Prinzip dem Aufbau einer Faser mit Stufenindexprofil, nur ist der Core hier wesentlich dünner als bei den Multimode-Fasern ausgeführt, und der Brechungsindex des Mantels ist genau an eine bestimmte Wellenlänge angepasst. Das Licht wird dabei ohne Brechung und Reflexion achsenparallel transportiert, was zu exakten Ausgangsimpulsen über sehr große Längen (50 km) führt. Bei Monomode-Fasern werden generell Laser-Dioden verwendet. Wie in Abbildung 34.20 zu sehen ist, bestehen in den jeweiligen Durchmessern des Kerns und des Mantels erhebliche Unterschiede. In Deutschland werden heutzutage bei den meisten LANs Multimode-GradientenIndex-Fasern mit 62,5/125 µm verwendet, die sich sowohl für Standard- (850 nm) als auch für Fast-Ethernet (1300 nm) und auch für Gigabit-Ethernet eignen. Demnach kann bei einer entsprechenden Umrüstung das LWL-Medium beibehalten werden, wenn man früher die richtige Entscheidung für die Verlegung des entsprechenden Lichtwellenleitertyps getroffen hat. Monomode-Fasern (9/100 µm) werden vorwiegend für WAN-Verbindungen sowie auch für Gigabitund 10-Gigabit-Ethernet eingesetzt. Standard
Faser
Wellenlänge
Max. Reichweite
Fasertyp
10BaseF 100BaseFX 1000BaseSX 1000BaseSX 1000BaseLX 1000BaseLX 1000BaseLX 10GBaseSX 10GBaseLX 10GBaseLX4 10GBaseLX4 10GBaseEX SDH SDH SDH SDH
62,5/125 µm 62,5/125 µm 62,5/125 µm 50/125 µm 62,5/125 µm 50/125 µm 9/125 µm 62,5/125 µm 9/100 µm 62,5/125 µm 10/125 µm 9/100 µm 9/100 µm 62,5/125 µm Plastic Optical Fiber Hard Polymer Clad Fiber
850 nm 1300 nm 850 nm 850 nm 1300 nm 1300 nm 1300 nm 850 nm 1300 nm 850 nm 850 nm 1500 nm 1500 nm 1300 nm
2 km 2 km 220 m 550 m 440 m 550 m 5000 m 300 m 10 km 300 m 10 km 40 km 40 km 2 km 50 m 100 m
Multimode Multimode Multimode Multimode Multimode Multimode Monomode Multimode Monomode Multimode Monomode Monomode Monomode Multimode Multimode Multimode
Tab. 34.9: Beispiele für die Verwendung der unterschiedlichen Lichtwellenleiter
Lichtwellenleiterverbindungen werden, wie es auch bei dem Twisted-Pair-Kabel üblich ist, sternförmig (d.h. 1:1 zwischen den einzelnen Geräten) ausgeführt. Dabei kommen lediglich zwei Leitungen zum Einsatz, die oftmals mit ST-Steckern (siehe oben) versehen sind und mit RX und TX (Full Duplex) bezeichnet werden. In der Regel verwenden die 10BaseF-Geräte die STAnschlüsse, während bei 100BaseFX die SC- oder auch MIC-Anschlüsse gebräuchlicher sind, die sich lediglich mechanisch gesehen – in der Befestigungsart – voneinander unterscheiden. Eine Kopplung von lediglich zwei PCs (wie sinnvoll dies auch sein mag) ist demnach wie bei Twisted-Pair einfach dadurch möglich, dass hier die eine RX-Leitung an den Anschluss TX der anderen Karte angeschlossen wird und TX entsprechend an RX des anderen PC. Generell ist zu beachten, dass es bei Glasfaserverbindungen keine automatische Umschaltung der Betriebsart (Autonegotiation) gibt, die festlegt ob hier tatsächlich im leistungsfähigen VollDuplex- oder aber nur im Halb-Duplex-Mode gearbeitet werden kann. Hier heißt es, die korrekten Einstellungen manuell vorzunehmen, was bei der Netzwerkkarte üblicherweise bei den
Sandini Bib Lokale Netzwerke
1069
Eigenschaften erfolgt und bei einem Switch beispielsweise per RS232-Port an einem hier angeschlossenen PC mit geladenem Terminalprogramm (z.B. mit Hyperterminal). Generell sollte der Halbduplex-Modus bei Glasfaserverbindungen nur in Ausnahmefällen angewendet werden, wenn hier beispielsweise ein LWL-Hub und kein LWL-Switch vorgesehen ist. Bei einem Switch, der wie bei TP eine Punkt-zu-Punkt-Verbindung (1:1-Verbindung) ermöglicht, kommt kein CSMA/CD zum Einsatz Die Länge der andernfalls einzuhaltenden Kollisionsdomäne von 410 m ist dann nicht mehr von Bedeutung, so dass sich eine Distanz von bis zu 2 km mit dem Lichtwellenleiter überbrücken lässt. Netzwerkkarten mit LWL-Anschluss sind außerdem explizit entweder für 10BaseFX oder für 100BaseFX vorgesehen, denn Karten, die beides unterstützen, wie es bei allen aktuellen Fast-Ethernet-Karten mit Twisted-Pair-Anschluss der Fall ist, gibt es nicht. Eine Migration von Standard- und Fast-Ethernet hat bei einem LWL-basierten LAN also den Austausch der Netzwerkkarten zur Folge, was gleichermaßen für Gigabit-Netzwerkkarten mit Glasfaser gilt. Das bevorzugte Übertragungsmedium hierfür ist Glasfaser verschiedener Auslegungen, was unter 1000BaseLX (Long Wavelength) sowie 1000BaseSX (Short Wavelength) firmiert. Zu den bereits genannten Vorteilen von Glasfaser kommt hinzu, dass es mit Lichtwellenleitern technisch kein Problem ist, auch 1000 Millionen Bits pro Sekunde zu transportieren, zumal die notwendigen Laserdioden recht preisgünstig sind und entsprechende Vorarbeiten hierfür bereits durch FDDI und den Fibre-Channel geleistet worden sind.
34.6.9 10-Gigabit-Ethernet – 10GE Lediglich drei Jahre nach der offiziellen Verabschiedung der Gigabit-Ethernet-Standards ist bereits 10-Gigabit-Ethernet Realität geworden. 10GE – wie es auch kurz bezeichnet wird – ist im Jahre 2002 als IEEE-Standard 802.3ae festgeschrieben worden. Das Einsatzgebiet von 10GE mit der fast gigantischen (theoretischen) Datenrate von 10.000 MBit/s wird im LAN-Backbone und auch im WAN-Bereich gesehen. Je nach Netzwerkauslegung und der Anzahl von Servern und Switches kann sich selbst GigabitEthernet als Leistungsbremse im Backbone darstellen. Bisher konnte man sich dadurch behelfen, dass mehrere Gigabit-Ports zu einer logischen Verbindung zusammengeschaltet werden, um im Bedarfsfall etwa mit drei Gigabit-Leitungen eine 3-Gigabit-Verbindung zwischen zwei Switches realisieren zu können. Diese Funktionalität wird bei Switches, die diese Funktion auch explizit unterstützen müssen, als Port Trunking bezeichnet. In Anbetracht der Tatsache, dass viele GigabitSwitches (z.B. HP 8000M) das Port Trunking bieten, scheint es daher auch keine ungewöhnliche Funktion im LAN zu sein. Das »Bündeln« mehrerer Ports zu einer einzigen Übertragungsstrecke ist im WAN-Bereich zwar ein oft praktiziertes Verfahren, doch es stellt sich aufgrund der (Kabel-) Strecken und der separaten Switch-Module nicht eben als preiswert dar. Für WAN- und auch LAN-Anwendungen, die bisher auf Port Trunking angewiesen waren, ist 10GE daher prädestiniert. Wenn man einmal davon ausgeht, dass für ein Telefongespräch eine Bandbreite von 64 KBit/s (ISDN) ausreicht, kann man mit 10GE gleichzeitig 120.000 Gespräche auf einem einzigen Kabel führen, was deutlich macht, dass 10GE besonders für WAN-Betreiber (Telekom u.a.) interessant ist. Für 10GE ist allein Glasfaser als Verbindungsmedium vorgesehen. Als Verbindungsstecker wird standardmäßig der bereits von Fast-Ethernet auf Lichtwellenleiter her bekannte SC-Anschluss verwendet. Bei 10GE findet stets ein Vollduplex-Betrieb statt, so dass auch keinerlei Vorkehrungen gegen Kollisionen (CSMA/CD) bei 10GE zu treffen sind. Wie bei den vorherigen EthernetRealisierungen mit Glasfaser können sowohl Multimode- (50 oder 62,5 µm Core) als auch Monomodefasern (Single Mode, 9 oder 10 µm Core) als Verbindungsleitungen eingesetzt werden.
Sandini Bib 1070
Kapitel 34
Außerdem ist ein neuer Multimode-Typ (New Fiber Cable) hinzugekommen, der aus einer hochreinen Gradientenfaser besteht, was zu einer überbrückbaren Distanz von 300 m statt 82 m mit einer herkömmlichen Faser führt. Insgesamt sind sieben unterschiedliche 10GE-Realisierungen definiert, die in Tabelle 34.10 zusammengefasst angegeben sind. Für die Bezeichnungen des jeweiligen 10GE-Standards wird stets »10G« dem Base vorangestellt. Des Weiteren sind den einzelnen 10GE-Bezeichnungen die jeweils zur Anwendung kommenden Wellenlängen zu entnehmen: Das L steht für 1310 nm, S für 850 nm und E für 1550 nm. Standard
Wellenlänge
Maximale Distanz/Fasertyp
10GBaseSR 10GBaseSW 10GBaseLR 10GBaseLW 10GBaseER 10GBaseEW 10GBaseLX4
850 nm 850 nm 1310 nm 1310 nm 1550 nm 1550 nm 1269–1355,9 nm (4 Kanäle)
82 m mit Multimode, 300 m mit New Fiber Cable WAN-Verbindung 10 km mit Singlemode (Monomode) WAN-Verbindung 40 km mit Singlemode (Monomode) WAN-Verbindung 300 m mit Multimode, 10 km mit Singlemode
Tab. 34.10: LWL-Standards für 10-Gigabit-Ethernet
Wie schon bei Gigabit-Ethernet stößt man auch bei der Glasfaser ab einer bestimmten Datenrate über eine bestimmte Strecke an physikalische Grenzen (Dispersion), was insbesondere dem Einsatz der preisgünstigeren Multimode-Fasern nicht entgegenkommt, die in einer hohen Anzahl von Netzwerken bereits verwendet wird. Je höher die Bandbreite, desto geringer fällt die zu überbrückende Distanz aus, weil bei einer hohen Datenrate die Pulslängen kürzer ausfallen. Mit steigender Entfernung wird der Dispersionseinfluss immer größer, was dann zu »verwaschenen« Impulsen führt, die nicht mehr erkannt werden können. Dieser Umstand führt bei 10GE gegenüber Gigabit-Ethernet zu einer geringeren Distanz (55 m statt 550 m bei Multimode). Damit dies nicht das Aus für den Einsatz der Multimode-Faser über übliche LAN-Längen bedeutet, greift man zu einem für Ethernet neuen Verfahren. Die zulässige Datenrate wird zunächst reduziert, und für die Übertragungsstrecke werden mehrere Kanäle gebildet. Es kommt also ein ähnliches Verfahren wie bei Gigabit-Ethernet auf TP-Kabel zum Einsatz, nur ist dies hier auf optischem Wege über eine einzige »Ader« zu praktizieren, wofür das Wide Wavelength Diversion Multiplexing (WWDM) gedacht ist. Multiplexer
12,5 GBit/s
L0
Sender
L1
Sender
L2
Sender
L3
Sender
M U X
Demultiplexer
Glasfaser 4 x 3,125 GBit/s
D E M U X
Empfänger
L0
Empfänger
L1
Empfänger
L2
Empfänger
12,5 GBit/s
L3
Abb. 34.21: Die Bruttodatenrate von 12,5 GBit/s wird auf vier optische Kanäle aufgeteilt.
Bei 10GBaseLX4 gibt es vier Kanäle, die dadurch zustande kommen, dass jeder Kanal einer anderen optischen Wellenlänge entspricht, wie es in Tabelle 34.11 angegeben ist.
Sandini Bib Lokale Netzwerke
Kanal
Wellenlänge
L0 L1 L2 L3
1269,0 bis 1282,4 nm 1293,5 bis 1306,9 nm 1318,0 bis 1331,4 nm 1342,5 bis 1355,9 nm
1071
Tab. 34.11: Für 10GBaseLX4 werden vier Übertragungskanäle über unterschiedliche Wellenlängen gebildet.
Mithilfe von WWDM können mit der üblichen Multimodeverbindung bis zu 300 m überbrückt werden und mit Singlemode sogar bis hin zu 10 km. Im WAN-Bereich wird WWDM schon seit längerem eingesetzt: es ist also keine neue, vom Ethernet-Konsortium erdachte Technik. Auf der MAC-Ebene (siehe auch Kapitel 34.7) finden für 10GE ein höherer Takt und eine doppelte Datenbreite Verwendung, so dass die Daten nunmehr in 16-Bit-Breite mit 644,53 Millionen Transfers pro Sekunde zum PHY übertragen werden. Bei Gigabit-Ethernet sind dies demgegenüber »nur« 125 Millionen Transfers pro Sekunde in 8-Bit-Breite. Bei 10GBaseX, der LAN-Implementierung, wird wie bei Gigabit-Ethernet die 8B/10B-Kodierung verwendet, während bei den beiden anderen 10GE-Varianten eine Kodierung mit der Bezeichnung 64B/66B zum Einsatz kommt. Dies ist notwendig, weil sowohl 10GBase-R als auch 10GBase-W mit vier seriellen Kanälen arbeiten, die zu einem einzigen logischen Kanal mit 10 Gigabyte zusammengefasst werden, denn auf andere Art und Weise lässt sich diese hohe Datenrate über angemessene Netzwerkdistanzen nicht realisieren. Das 64B/66B-Verfahren funktioniert nach einem ähnlichen Prinzip wie 8B/10B. Für die Synchronisierung erhält jede Bitgruppe eine Präambel, und es wird eine Unterscheidung zwischen Kontroll- und Datenblöcken vorgenommen, was in einem 2 Bit langen SYNC-Feld gekennzeichnet wird. Es sind hier lediglich »01« für Kontroll- und »10« für Datenblöcke definiert. Die Kontrollblöcke enthalten Steuerinformationen, die bis zu sieben Byte lang sein dürfen, und ein vorangestelltes Byte dient hier als Typfeld, das die jeweilige Steuerinformation als solche kennzeichnet. Die Datenblöcke weisen eine Größe von 64 Bit (8 Bytes) auf und enthalten die Ethernet-Frames, die zuvor mit einem Scrambler »zerhackt« worden sind. Diese 64 Bit plus den zwei Bits des SYNC-Feldes ergeben eben 66 Bit, woher dann auch die Bezeichnung 64B/66B rührt. Für den Einsatz als WAN-Technologie, und somit als Konkurrenz zu ATM, ist bei 10GE eine Anpassung an SDH/SONET notwendig. Mit Hilfe eines WAN Interface Sublayer (WIS) werden die EthernetFrames von SDH/SONET in STM-64-Rahmen verpackt. Weil STM-64 bzw. STS-192 nicht genau 10 GBit/s, sondern 9,953 GBit/s definieren, wird 10 GE durch das Einfügen von zusätzlichen Idle-Symbolen hierfür etwas »abgebremst« (Stretch Function).
34.7 Aufbau und Programmierung von Netzwerkeinheiten In diesem Abschnitt geht es zunächst um den Aufbau von Netzwerkeinheiten, wobei ich mich auf die Ethernet-Standards beziehe, da diese nun einmal die im LAN bestimmende Technologie darstellen. In Kapitel 34.7.4 finden sich darauf aufbauend noch einige praktische Hinweise sowie Erläuterungen zur Programmierung.
34.7.1 Ethernet im OSI-Modell Die Ethernet-Standards können zunächst den beiden unteren Schichten des OSI-Modells zugeordnet werden:
Sandini Bib 1072
: :
Kapitel 34
OSI-Schicht 1: Physikalische Schicht, Physical Layer, PHY OSI-Schicht 2: Sicherungsschicht, Data Link Layer, LLC, MAC
Die physikalische Schicht (PHYsical) repräsentiert die Ebene der Bitübertragung, die sich prinzipiell vom jeweiligen Medienanschluss (MDI, Medium Dependent Interface) ausgehend über die Bit-Kodierung (z.B. MLT-3, PAM) bis hin zum Medium Independent Interface (MII) erstreckt. Ab hier spielen die Eigenheiten des jeweiligen medienabhängigen PHYs (z.B. Signalanpassung, BitKodierung) dann keine Rolle mehr. Der Übergang zur darüber folgenden OSI-Schicht (2) – dem Data Link Layer, der wiederum aus zwei Schichten (MAC, LLC) besteht – erfolgt mithilfe eines so genannten Reconciliation Sublayer (RS). Bei 10Base ist hingegen das Physical Layer Signaling (PLS) definiert, das hier für die Signalumsetzung zuständig ist. Die hier vorhandenen Signale entsprechen denen des AUInterface, an das unterschiedliche Konverter und Transceiver angeschlossen werden können. Der Reconciliation Sublayer ist demgegenüber für die Umsetzung der (G)MII-Signale auf die MAC-Ebene – und natürlich auch umgekehrt – vorgesehen.
Abb. 34.22: Die Ethernet-Standards decken zwei Schichten des OSI-Modells ab und definieren die grundsätzliche Funktionsweise von Netzwerkeinheiten.
Die Schicht Physical Medium Attachment (PMA) führt die Umsetzung der seriellen Daten in parallele (serialize/deserialize, SERDES) durch und entspricht bei 10 MBit/s der Funktion einer MAU (Media Attachment Unit). Ab 100 MBit/s befindet sich zwischen MDI und PMA noch die Schicht Physical Medium Dependent (PMD), also eine Schicht, deren Funktion vom jeweiligen Medium abhängig ist und deren Signale sich auf das MDI beziehen. Die Aufgaben für Autonegotiation sowie CSMA/CD bei Halbduplex-Betrieb werden vom Physical Coding Sublayer (PCS) erledigt, wo auch die entsprechende Codeumsetzung (z.B. 4B/5B, 8B/ 10B, Trellis) stattfindet. Sowohl bei AUI als auch bei (G)MII handelt es sich um digitale Signale, wobei PLS mit der Manchester-Kodierung und RS mit der 4B/5B- bzw. 8B/10B- oder auch Trellis-Kodierung arbeitet, so dass hierfür eben unterschiedlich arbeitende Sublayer für die Anpassung an die Media-Access-Control-Ebene (MAC) notwendig sind. Das AUInterface wird üblicherweise nur von Einheiten für 10 MBit/s zur Verfügung gestellt, Anschlüsse für MII (100 MBit/s) gibt es eher selten, und für das Gigabit Medium Independent Interface (GMII) hat man erst gar keine Steckverbindung definiert, weil dies bei den hohen Takt-
Sandini Bib Lokale Netzwerke
1073
raten mit elektrischen Problemen einhergehen würde. Dies ist auch der Grund dafür, warum man bei Gigabit-Ethernet meist nur einen Chip auf einer Netzwerkkarte verwendet und nicht zwei, die auch die elektrische und nicht nur die logische Trennung von PHY und MAC realisieren würden, damit ein bestimmter MAC-Chip für unterschiedliche PHY-Realisierungen verwendet werden könnte. Das GMII verwendet die in Kapitel 34.6.7 erläuterte PAM5/Trellis-Kodierung, was eine Erweiterung der Signale gegenüber dem MII zur Folge hat. Ethernet-Controller
PCI-Bus
Ethernet MAC Engine
Internes MI-Interface (IEEE 802.3)
PHY
Übertrager (Transformer)
RJ45
Abb. 34.23: Das Prinzip der in einem Chip kombinierten Ethernet-Komponenten
Vereinfacht kann man sich die Pakete, die über (G)MII transportiert werden, so wie die EthernetFrames selbst vorstellen, wobei die Interfaces zum PHY spezielle Steuer- und Statussignale führen und der dazugehörige MAC-Chip entsprechende Register besitzt. Bei den meisten heutigen Designs (zumindest für Netzwerkkarten) ist der PHY-Chip mit der MACEngine zusammen in einem Chip integriert, der an den PCI-Bus angeschlossen wird. Die Register der MAC-Engine sind im jeweiligen Ethernet-Standard (IEEE 802.3x) genau definiert. Für das Verständnis der Funktion ist es jedoch ganz hilfreich, wenn man eine gedankliche Trennung zwischen diesen beiden wesentlichen Einheiten vornimmt, wie es in Abbildung 34.23 dargestellt ist.
Abb. 34.24: Die 10GE-Implementierungen im Schichtenmodell
Sandini Bib 1074
Kapitel 34
Das Schichtenmodell für 10GE ist ähnlich aufgebaut wie das für die vorhergehenden EthernetVarianten und definiert, wie in Kapitel 34.6.9 bereits erwähnt wurde, drei Physical Coding Sublayer (PCSl), die wie folgt zu interpretieren sind:
: : :
10GBase-R: R für serielle Kodierung (Kanalbildung) 10GBase-W: W für WAN-Kodierung 10GBase-X: X für LAN-Kodierung
Für den Übergang von der PHY- auf die MAC-Ebene wurde eine neue Schnittstelle eingeführt, die die Bezeichnung XGMII trägt. Das X steht für die römische Zahl 10 und GMII für Gigabit Medium Independent Interface. XGMII bietet, wie die anderen Ethernet-Implementierungen auch, ein AUInterface, das hier dementsprechend als XAUI (10 Gigabit Attachment Unit Interface) bezeichnet wird. Als (von außen) zugängliche Schnittstelle wird XAUI nicht realisiert, denn dies war bereits bei dem GMII aus elektrischen Gründen nicht möglich, und selbst das MII (FastEthernet) ist nur relativ selten (etwa für HomePNA bei CNR, siehe Kapitel 23.2) als externer Anschluss ausgeführt. XAUI wird daher beispielsweise in den entsprechenden Switches als serielle Schnittstelle zwischen den einzelnen Schaltungselementen implementiert. Auf Netzwerkkarten sind die PHYund die MAC-Einheit ohnehin meist in einem einzigen Chip integriert, so dass XAUI dann gewissermaßen auf Chipebene realisiert wird. Unter dem XAUI ist ein hierfür passender Sublayer XGXS (eXtended Sublayer) vorgesehen, der die Anpassung an das jeweils zur Anwendung kommende Kodierungsverfahren (PCS: 8B/10B oder 64B/66B) vornimmt.
34.7.2 Ethernet-Frames Der Data Link Layer (OSI-Schicht 2) beinhaltet die MAC-Ebene (2A) und darüber die LLC-Ebene (2B), wie es in den Abbildungen 34.22 und 34.24 zu erkennen ist. In der LLC-Schicht findet der Datenaustausch zur darüber liegenden Schicht, dem Network Layer (Higher Layers, OSI-Schicht 3), statt. Der Aufbau des Data Link Layer (LLC, MAC) ist im Standard IEEE 802.2 definiert, während der Network Layer (Vermittlungsschicht) im Standard IEEE 802.1 beschrieben ist. Hier werden – je nach Protokollfamilie (TCP/IP, IPX/SPX) – eine ganze Reihe unterschiedlicher Protokolle abgewickelt, wie etwa IP, ARP, PPP oder RIP bei der TCP/IP-Familie. Der grundlegende Aufbau eines Ethernet-Pakets (MAC-Frame) ist zunächst bei allen Ethernet-Implementierungen identisch, andernfalls wäre auch nur schwerlich die Kompatibilität zwischen den unterschiedlichen Varianten herzustellen.
Abb. 34.25: Der allgemeine Aufbau des Ethernet-Rahmens
Das Präambelfeld besteht aus sieben 10101010-Bit-Kombinationen, die für die Synchronisierung mit den Kommunikationspartnern benötigt werden. Es folgt ein Byte, das als Rahmenbegrenzer (Start Frame Delimiter, SFD) dient und eine eindeutige Bit-Kombination zur Signalisierung des Anfangs des Datenpakets führt.
Sandini Bib Lokale Netzwerke
1075
Die Ziel- und die Quelladresse (MAC-Adresse) von jeweils sechs Bytes sind fest in den EthernetControllern abgelegt. Die Adressen können nicht verändert werden und sind weltweit einmalig für jede Netzwerkkarte gültig. Das Feld Typ/Länge legt entweder die Größe des folgenden Datenfeldes fest, oder es dient als Kennzeichnung für den jeweiligen Protokolltyp (z.B. TCP/IP oder IPX/SPX für Netware). Demnach ist es möglich, gleichzeitig unterschiedliche Protokolle über das Netzwerk zu schicken, ohne dass sie sich gegenseitig beeinflussen. Die Datenfeldlänge kann prinzipiell 0-1518 Bytes betragen, und in diesem Feld werden dann beispielsweise der IP- und der TCP/IP-Header, gefolgt von den eigentlichen Nutzdaten, transportiert. Sollten die Daten so groß sein, dass sie nicht im Datenfeld untergebracht werden können, findet (automatisch) eine Fragmentierung der Daten statt, was sich negativ auf die NetzwerkPerformance auswirken kann. Über den Frame (von der Zieladresse bis zum Ende des Datenfeldes) wird ein Cyclic Redundancy Check (CRC) ausgeführt. Er dient zur Fehlererkennung durch die Anwendung eines speziellen Generatorpolynoms. Der aus den gesendeten Daten ermittelte CRC-Wert wird mit den letzten vier Bytes des Frame übertragen, was auch als Frame Check Sequence (FCS) bezeichnet wird. Der Empfänger errechnet seinerseits aus den empfangenen Daten eine Checksumme und vergleicht diese mit den empfangenen FCS-Bytes. Falls sich dabei keine Übereinstimmung ergeben sollte, liegt ein Übertragungsfehler vor. Logical Link Control (LLC, Schicht 2B) ist für die Adressierung und die Steuerung der Pakete und damit für die Kommunikation zwischen zwei Stationen zuständig. Der Ethernet-Rahmen (vgl. auch Abbildung 34.25) kann prinzipiell drei unterschiedlichen Frame-Implementierungen entsprechen: IEEE 802.3 (mit LLC laut 802.2), Ethernet-Frame mit Typfeld (Ethernet II) und Ethernet 802.3 raw, das eine spezielle Version der Firma Novell ist und hier nicht weiter berücksichtigt wird. Der einzig relevante Unterschied zwischen einem Ethernet-II-Frame und einem Frame laut IEEE 802.3 besteht in der Schicht 2 (LLC), wo beim EthernetII-Frame ein Typ-Feld vorhanden ist statt eines Feldes, das die Länge des darauf folgenden Datenfeldes angibt. Das Typ-Feld kennzeichnet das jeweilige Protokoll der höheren Schicht (3) durch explizit festgelegte Nummern. Beispielsweise steht 0800h für das IP-, 0806h für das ARP-, 8137h für IPX/SPX oder auch 814Ch für das SNM-Protokoll (SNMP). Die entsprechende Protokoll-Information wird bei der IEEE-802.3-Version hingegen mit im Datenfeld untergebracht, und die vorhergehende Längenangabe spezifiziert, wie groß das Datenfeld jeweils ist (64-1518 Bytes). Diese Information enthält der LLC-Header (802.2), der in das Datenfeld des MAC-Frame mit den folgenden Parametern »eingeblendet« wird:
: : :
DSAP: Destination Service Access Point; Zieladresse SSAP: Source Service Access Point; Quelladresse CTRL: Control; Protokolltyp
Es stellte sich bald heraus, dass ein Byte für die Kennzeichnung des Protokoll-Typs nicht ausreicht, so dass eine Erweiterung mit der Bezeichnung SNAP (Sub Net Access Protocol) unter IEEE 802.3 eingeführt wurde. Hiermit werden fünf weitere Bytes für die Identifizierung des darüber liegenden Protokolltyps zur Verfügung gestellt und an den LLC-Header angehängt. Zur Kennzeichnung, dass ein SNAP-Header folgt, werden die Bytes DSAP=AAh, SSAP=AAh und Contol=3h gesetzt. Die Bytes des SNAP-Headers haben die folgenden Bedeutungen:
: :
OUI: Oganizationally Unique Identifier, enthält eine eindeutige Herstellerkennung für den Netztyp (z.B. 0h=Novell) PID: Protocol Identifier, kennzeichnet das höhere Protokoll (z.B. 8137h=IPX/SPX)
Sandini Bib 1076
Kapitel 34
Durch diese Erweiterungen ist die IEEE-Frame-Implementierung äußerst vielseitig, und es können die unterschiedlichsten Protokolle »nebeneinander« transportiert werden. Der LLC-Layer ist als Schnittstelle zwischen den auf der OSI-Schicht 3 (Network Layer) angesiedelten Protokollen und dem MAC-Layer auch dafür verantwortlich, dass diese Protokolle (z.B. TCP/IP) nicht nur mit einem Ethernet-, sondern beispielsweise auch mit einem Token-Ring-Netz (802.5) arbeiten können. Die unterschiedlichen Funktionen der unteren Schichten (Bitkodierung, Zugriffsverfahren, Übertragungsmedium) werden durch den LLC-Layer quasi abgekoppelt. Laut Standard gibt es vier LLC-Varianten (Typ 1: verbindungslos, Typ 2: verbindungsorientiert, Typ 3: verbindungslos mit Bestätigung, Typ 4: schnelle Punkt-zu-Punkt-Verbindung), wobei bei Ethernet in der Regel der Typ 1 zum Einsatz kommt. Cyclic Redundancy Check Präambel 7 Bytes
SFD Zieladresse 1 Byte 6 Bytes
Quelladresse Länge 6 Bytes 2 Bytes
PID 2 Bytes
Nutzdaten
{
OUI 3 Bytes
{
DSAP SSAP CTRL 1 Byte 1 Byte 1 Byte
LLC Header
FCS 4 Bytes
Datenfeld
SNAP Header
Abb. 34.26: Der Aufbau eines Frame (SNAP) laut IEEE-Standard
Der Unterschied im Frame-Aufbau bei 10Base, 100Base und 1000Base besteht eigentlich nur darin, dass für Gigabit-Ethernet (1000BaseT) im Halbduplex-Betrieb der Frame durch ExtensionBits u.U. verlängert werden muss, wie es in Kapitel 34.6.7 erläutert ist. Diese zusätzlichen Bytes ohne Dateninhalt werden einfach hinter die vier Bytes des FCS-Feldes (Frame Check Sequence für CRC) angehängt. Auch für Gigabit-Ethernet gilt im Übrigen, dass hier prinzipiell entweder mit dem IEEE 802.3- oder dem Ethernet-II-Frame gearbeitet werden kann.
34.7.3 LAN-Controller Controller für Netzwerkkarten halten sich üblicherweise an die in Abbildung 34.23 gezeigte (zumindest logische) Aufteilung in MAC-Engine und PHY. Die Verbindung der beiden Einheiten wird über ein serielles Interface hergestellt, wenn es sich denn tatsächlich um zwei separate Einheiten handelt, denn – wie bereits erwähnt – geht der Trend (zumindest ab Gigabit-Ethernet) hin zur Integration dieser beiden Einheiten in einem einzigen Gehäuse, und dann ist dieses Interface meist nicht von außen zugänglich. In den Abbildungen 34.22 und 34.24 können Sie die jeweiligen Interfaces (AUI, MII, GMII, XGMII) zwischen MAC und PHY erkennen. Ihre Signale sind allesamt im Ethernet-Standard (IEEE 802.3) definiert und entsprechen daher keinen herstellerspezifischen Definitionen. Dies erlaubt die Kombination unterschiedlicher MAC- und PHYChips für Netzwerkkarten sowie dementsprechend auch von Hubs und Switches. In der Ethernet-MAC-Engine ist in der Regel auch das Interface für die Busanbindung mit untergebracht, was bei PCs heute in den meisten Fällen »für PCI gedacht« (32 Bit, 64 Bit, PCI-X) bedeutet. Dadurch sind manuelle Einstellungselemente (DIP-Schalter, Jumper) sowie Dekodierungs- und Bufferstufen nicht mehr notwendig, was von dieser Seite her zu hardware-technisch gesehen relativ einfach aufgebauten Netzwerkkarten führt.
Sandini Bib Lokale Netzwerke
1077
Daneben gibt es Netzwerkcontroller mit ISA- oder Card-Bus-Interface (PCMCIA) oder auch mit einem universell einsetzbaren Interface für die direkte Verbindung mit unterschiedlichen Mikroprozessoren und -controllern, wie es für Embedded Systems praktiziert wird, was HardwareDesigns generell sehr vereinfacht. Demgegenüber ist das Innenleben eines aktuellen Netzwerkcontroller-Chips recht komplex, wie Sie noch sehen werden, sodass hierfür eher Software- als Hardware-Aspekte von entwicklungstechnischer Bedeutung sind.
Abb. 34.27: Der prinzipielle Aufbau einer 10BaseT-Netzwerkkarte mit einem Ethernet-Controller der Firma Cirrus Logic
Der PHY-Chip wird auf der anderen Seite der Schaltung mit einem Übertrager oder auch mit einem optischen Transceiver (für LWL) verbunden, dessen Signale an einen RJ45- oder einen AUI- bzw. ST- oder SC-Connector (für LWL) geführt werden. Außerdem stellt der PHY meist auch Signale für den Anschluss von Status-LEDs (Link, Speed, Activity) zur Verfügung, um hier den augenblicklichen Verbindungszustand ablesen zu können, was sich insbesondere im (vermeintlichen) Fehlerfall als sehr nützlich erweisen kann. Wie bereits erläutert wurde, unterscheiden sich die Kodierungsverfahren für die verschiedenen Ethernet-Implementierungen. Der Manchester-Code kommt bei 10BaseT, der 4B/5B-Code bei 100BaseT und der Trellis-Code (PAM5) bei 1000BaseTX zum Einsatz, um hier nur die Varianten für Twisted-Pair-Kabel zu nennen. Dementsprechend muss ein Chip, der diese Ethernet-Implementierungen allesamt unterstützen soll, über eine ganz beachtliche Eigenintelligenz verfügen. Er beinhaltet demnach eine Vielzahl an Funktionseinheiten, die teilweise parallel ausgeführt sein müssen, weil jede dieser Ethernet-Implementierungen ganz bestimmte Anforderungen hat, die nicht ohne weiteres miteinander vereinbar sind. In Abbildung 34.27 ist zu sehen, dass der Ethernet-Controller, der allein 10 MBit/s unterstützt, für 10BaseT und AUI zwei separate Transmitter- und Receiver-Einheiten zur Verfügung stellt, während die Encoder-Stufe (Manchester-Code) und die vorherigen Einheiten für beide Varianten gleichermaßen genutzt werden. Ein Controller, der auch 100BaseT unterstützt, benötigt einen 4B/5B-Decoder sowie auch andere Filter- und Transceiver-Einheiten, was bei älteren Netzwerkkarten dazu führte, dass zwei eigene Signalwege ab dem PHY mit zwei RJ45-Connectoren (10BaseT, 100BaseT) implementiert wurden
Sandini Bib 1078
Kapitel 34
und mitunter auch mehrere Controller zum Einsatz kamen. Dies war jedoch nur eine (kurze) Übergangslösung, und der erste Schritt zur Einsparung von separaten Schaltungseinheiten und Übertragern war die Integration eines so genannten Twister (ein U.S.-Patent der Firma National Semiconductor), der in der Lage ist, den jeweiligen Mode (Speed, Full-, Half-Duplex) zu erkennen und sich daraufhin automatisch einzustellen. Dadurch entfallen separate Übertrager, und es wird lediglich ein einziger RJ45-Connector benötigt. Diese Technologie wird bei National Semiconductor auch als Common Magnetics bezeichnet.
Abb. 34.28: Mithilfe eines Twisters werden 10BaseT und 100BaseT automatisch mit der jeweiligen Betriebsart detektiert und dementsprechend für den Adapter aktiviert.
Autonegotiation Mittlerweile ist die Twister-Einheit Bestandteil aktueller Ethernet-Controller, sodass im Bedarfsfall eine automatische Umschaltung zwischen 10BaseT und 100BaseT und den entsprechenden Modi gegeben ist. Diese Automatik wird als Autonegotiation bezeichnet. Sie ist im Standard 802.3u definiert, und National Semiconductor hat hierfür auch den Begriff NWay geprägt. Die Autonegotiation stellt einen Mechanismus dar, der beim Verbinden eines Netzwerkkabels mit dem Adapter mithilfe von Link-Pulsen den aktiven Ethernet-Datenverkehr auf dem Kabel detektiert und daraufhin die bestmögliche Betriebsart für den Adapter aktiviert. Nach diesem Vorgang wirkt die Autonegotiation transparent und bleibt mit ihren Einstellungen so lange gültig, bis die Netzwerkverbindung unterbrochen wird. Dabei muss es sich nicht unbedingt um eine physikalische Trennung vom LAN handeln, sondern es könnte sich beispielsweise auch die Betriebsart im jeweiligen LAN-Segment (über einen Switch zum Link-Partner) geändert haben, sodass der Adapter die Daten dann nicht mehr korrekt interpretieren kann und die Verbindung daraufhin zunächst einmal (logisch) trennt, woraufhin die Autonegotiation erneut ablaufen sollte. In der Praxis kann diese Funktion in bestimmten Gerätekombinationen durchaus zu Problemen führen, weil sich nicht alle Hersteller konsequent (genug) an die Vorgaben des Standards halten, sodass eine automatische Umschaltung im laufenden Netzwerkbetrieb nicht korrekt funktioniert oder sich auch erst gar keine Verbindung zum LAN herstellen lässt. Dann ist die betreffende Einstellung für den Adapter manuell vorzunehmen (beispielsweise unter den erweiterten Eigenschaften der Netzwerkkarte bei Windows), die der Betriebsart des jeweiligen Netzwerksegments entsprechen muss.
Sandini Bib Lokale Netzwerke
1079
Vielfach funktioniert eine widerwillige Autonegotiation noch am ehesten, wenn tatsächlich das Netzwerkkabel getrennt und wieder angeschlossen wird, weil dies ein eindeutiges Indiz für die Auslösung der Autonegotiation ist. Sie beruht auf der Dekodierung einer Serie von so genannten Link-Pulsen, die laufend auf dem LAN übertragen werden und ein 16-Bit-Wort ergeben. Die Fast-Link-Pulses (FLP, typisch 17–33 Stück), die ein Fast-Ethernet ausweisen, sind dabei identisch mit den Normal-Link-Pulses (NLP) bei 10BaseT, die in einem derartigen Netz für die Signalisierung einer bestehenden Verbindung genutzt werden. Ein FLP-Burst dauert 2 ms und verschachtelt (interleaved) Clock- und Datenpulse für das Entschlüsseln des 16-Bit-Datenworts (Link Code Word, LCW). Die Abwesenheit eines Pulses innerhalb eines Zeitfensters, dem ein Clock-Puls folgt, wird als logische Null, und ein auftauchender Puls, dem ein Clock-Puls folgt, wird als logische Eins interpretiert. Das LCW besteht aus einem Selector-Feld (S4–S0) und einem Technology-Ability-Feld (A7–A0). Letzteres definiert in Bezug auf das Selector-Feld die jeweilige Ethernet-Betriebsart. Mit S4– S0=000001 ist Ethernet (IEEE 802.3) gemeint, A0–A7=00000001 steht für 100BaseTX-Full-Duplex und beispielsweise A0–A7=00001001 für 10BaseT-Half-Duplex.
Abb. 34.29: Ein Link-Code-Word bildet die Grundlage für die Autonegotiation.
Die drei oberen Bits (D13–D15) des LCWs werden als RF (Remote Fault), ACK (Acknowledge) und NP (Next Page) bezeichnet. RF signalisiert einen Fehler, ACK wird für die Synchronisierung (Handshake) der Link-Partner verwendet, und NP erlaubt optional das Versenden und Empfangen von weitergehenden (nicht unbedingt standardisierten) Informationen. Die Autonegotiation-Logik (State Machine) eines LAN-Controllers schaltet die für den detektierten Ethernet-Standard notwendigen Schaltungseinheiten um, wozu in erster Linie die jeweiligen Encoder und Decoder (Manchester, 4B/5B) zu rechnen sind. In Abbildung 34.30 ist der Aufbau des PHY DP83843 der Firma National Semiconductor mit den entsprechenden Funktionseinheiten zu erkennen. Der Baustein bietet zwei physikalische Netzwerk-Schnittstellen: 10 und 100 MBit/s in Kombination für Twisted-Pair und darüber hinaus eine für 100BaseFX (Glasfaser), die auch als AUI-Schnittstelle für die Anbindung externer Transceiver genutzt werden kann. Medium Independent Interface Die Verbindung zur MAC-Engine – oder auch zu einem Repeater-Controller bei Hub- und Switch-Designs – erfolgt dabei über das Medium Independent Interface (MII), welches sich somit als sowohl vom Medium als auch vom Kodierungsverfahren her unabhängige Schnittstelle darstellt. Die MII-Signale haben die im Folgenden angegebenen Bedeutungen und Funktionen: TX_CLK (O, Z) Der Takt vom Transmitter-Ausgang zur MAC-Engine. Er beträgt typischerweise zwischen 2,5 MHz (10BaseT) und 25 MHz (100BaseT). TXD[3:0] (I) Die Daten für den Transmitter (Transmit Data), die als Nibbles (4 Bit) übertragen werden. Als Takt für die Übertragung dient TX_CLK.
Sandini Bib 1080
Kapitel 34
Abb. 34.30: Der interne Aufbau eines PHY-Chips
TX_ER (I) Signalisiert einen Transmit Error (High) bei aktivem Transmit Enable-Signal (High). Das Signal ist nur bei Fast-Ethernet von Bedeutung und wird bei 10BaseT ignoriert. TX_EN (I) Das Transmit-Enable-Signal kennzeichnet mit einem High, dass gültige TXD-Daten anliegen.
Sandini Bib Lokale Netzwerke
1081
MDIO (I, O, Z) Management Data I/O ist ein bidirektionales Signal für Befehle und Daten zwischen PHY und MAC-Engine. MDC (I) Management Data Clock ist das Taktsignal für die Daten und Befehle auf Management Data I/O. COL (I, O, Z) Collision Detect signalisiert mit einem High eine aufgetretene Kollision bei 10BaseT und 100BaseT im Half-Duplex-Mode. Im Full-Duplex-Betrieb ist das Signal stets auf Low-Pegel. CRS (I, O, Z) Carrier Sense kennzeichnet mit einem High, dass das Medium bereits belegt wird. RX_EN (I) Receive Enable aktiviert bei einem High die Empfangssignale RXD[3:0], RX_CLK, RX_DV und RX_ER. Bei einem Low ist dieser Eingang im Tri-State-Mode (hochohmig, Z). RX_ER (O, Z) Receive Error kennzeichnet mit einem High ungültige Daten in einem empfangenen Fast-Ethernet-Paket. RX_DV (O, Z) Receive Data Valid wird auf High gesetzt, wenn Daten verfügbar sind. RXD[3:0] (O, Z) Die vier Receive-Data-Signale (Nibble), die mit einer fallenden Flanke von RX_CLK übertragen werden. RX_CLK (O, Z) Der Empfangstakt Receive Clock. Er beträgt typischerweise 25 MHz im Fast-Ethernet-Mode und 2,5 MHz bei 10BaseT. Der PHY DP83843 (vgl. Abbildung 34.30) der Firma National Semiconductor verwendet die MIISignale entsprechend des Ethernet-Standards (IEEE 802.3), so dass die obige Beschreibung der MII-Signale auch allgemein gültig ist. Im Standard sind konsequenterweise auch einige Register hierfür definiert. Es sind sechs Register und – je nach PHY-Chip bzw. LAN-Controller – hat der jeweilige Hersteller einige weitere implementiert, die demnach chip-spezifisch sind. Auf die internen Status- und Konfigurationsregister kann mithilfe der Management-Signale (MDC, MDIO) zugegriffen werden. Offset
Bezeichnung
Zugriff
Bedeutung/Funktion
0 1 2 3 4
Control Register Status Register PHY Register 1 PHY Register 2 Autonegotiation Advertisement Register Autonegotiation Link Partner Register
Lesen/Schreiben Lesen Lesen Lesen Lesen/Schreiben
Speichert Konfigurations-Bits Enthält Konfigurations- und Status-Bits Enthält den spezifischen Identifikationscode Enthält den spezifischen Identifikationscode Enthält die Bits für die Steuerung der Autonegotiation Enthält diejenigen Bits, die die AutonegotiationFunktion des Link-Partners beschreiben
5
Lesen/Schreiben
Tab. 34.12: Die im Standard IEEE 802.3 vorgeschriebenen Register
Sandini Bib 1082
Kapitel 34
Des Weiteren hat jeder PHY und insbesondere jeder LAN-Controller einige spezielle Pins, die zudem applikationsabhängig verwendet werden, so dass es keinen Sinn macht, auf die speziellen Register oder auf die chip-spezifischen Signale einzugehen. Die universelle Verwend- und Kombinierbarkeit verschiedener PHY-Chips, die auch als Phyter bezeichnet werden, mit unterschiedlichen MAC-Engines eröffnet eine Vielzahl von Möglichkeiten für den Aufbau von Netzwerkeinheiten.
Abb. 34.31: Der Aufbau eines Netzwerkadapters mit einem LAN-Controller, der die MAC-Engine und den Phyter integriert.
Bei aktuellen Fast-Ethernet-Netzwerkkarten, die selbstverständlich auch Autonegotiation und Full-Duplex beherrschen, beschränkt man sich meist auf einen Twisted-Pair-Anschluss, so dass Phyter und MAC-Engine (mit dem Bus-Interface) in einem einzigen Chip als Einheit zusammengefasst anzutreffen sind. In Abbildung 34.31 sehen Sie eine Schaltung für einen Netzwerkadapter (10/100 MBit/s) mit dem LAN-Controller 91C111 der Firma SMSC, der für den Anschluss an verschiedene Bussysteme (z.B. ISA, ARM, Power PC) verwendet werden kann. Außer einem EEPROM für die Ressource-Daten ist im Wesentlichen nur noch ein Übertrager (für TP) notwendig, womit ein Netzwerkadapter bereits hardware-technisch komplett ist.
Sandini Bib Lokale Netzwerke
1083
Bei LAN-Controllern für Gigabit-Ethernet ist zwischen der MAC-Engine und dem Phyter das Gigabit Medium Independent Interface (GMII) implementiert, das prinzipiell wie MII funktioniert und sich hierzu auch als abwärtskompatibel darstellt. Der wesentliche Unterschied besteht darin, dass neben den Takten von 2,5 MHz und 25 MHz nunmehr auch 125 MHz notwendig sind, und für die Receive- und Transmit-Informationen werden nicht mehr vier, sondern acht Signale (RXD[7:0], TXD[3:0]) eingesetzt.
Abb. 34.32: Dieser MAC-Chip ist für Gigabit-Ethernet ausgelegt und verwendet dementsprechend das GMII.
34.7.4 Programmierung Neben den PCI-Bus-typischen Registern (Configuration Space) gibt es bei einem aktuellen LANController eine Vielzahl von speziellen Registern. Für den netzwerktechnischen Teil bei einem Chip für Gigabit-Ethernet, der zudem zu den vorherigen Standards abwärtskompatibel ist, gibt es ungefähr 50 Register. (Fast) jedem einzelnen Bit kommt dabei eine gravierende Bedeutung zu. Es leuchtet sicher ein, dass die chip-interne Komplexität von 10BaseT über 100BaseT bis hin zu 1000BaseT stark zunimmt. Das schlägt sich in einer erhöhten Registeranzahl und somit auch in einer immer komplexeren Programmierung dieser Register nieder, die in diesem Buch nicht erschöpfend behandelt werden kann. Aus diesem Grunde wird als Beispiel ein einfacher LAN-Controller – der bereits eingangs erwähnte CS8900 (Crystal, Cirrus Logic) – verwendet. Er kann direkt am ISA-Bus angeschlossen werden und bietet netzwerkseitig ausschließlich 10MBit/s (10BaseT). In Abbildung 34.27 ist der LAN-Controller in einer Prinzipschaltung gezeigt. Er besitzt außerdem noch einen AUI-Port, so dass hiermit auch Realisierungen für 10Base2, 10Base5 und 10BaseF möglich sind, wie es der Schaltplan in der Abbildung 34.33 für den ISA-Bus verdeutlicht. Für 10BaseT ist ein Übertrager (Isolation Transformer) notwendig, der einerseits an die beiden RXD- und TXD-Leitungen des LAN-Controllers und andererseits an eine RJ45-Buchse angeschlossen wird. Praktisch sind die spezielleren Buchsen, bei denen der Übertrager gleich mit integriert ist, beispielsweise der Typ HFJ11-1043E der Firma Halo Electronics. Solche Buchsen
Sandini Bib 1084
Kapitel 34
vereinfachen das Hardware-Design noch weiter, zumal die Übertragertechnik meist nicht des Digitaltechnikers bevorzugtes Gebiet ist. Die Übertrager für 10BaseT und AUI sind unterschiedlich aufgebaut und setzen auch unterschiedliche Übersetzungsverhältnisse voraus. Das AUInterface (siehe Abbildung 34.27) kann man auch als optional ansehen, was ebenfalls für das BootPROM-Interface gilt, das dazu verwendet werden kann, den PC per Netzwerk zu booten.
Abb. 34.33: Die Schaltung einer ISA-Netzwerkkarte mit CS8900 Offset
Bezeichnung
Zugriff
Bedeutung/Funktion
0000h
Receive/Transmit Data Port 0
Lesen/Schreiben
0002h
Receive/Transmit Data Port 1
Lesen/Schreiben
0004h
Transmit Command
Schreiben
0006h
Transmit Length
Schreiben
Enthält die zu sendenden oder die empfangenen Daten bei 16-Bit-Operationen. Bei 32 Bit ist hier das Lower-Word zu finden. Enthält die zu sendenden oder die empfangenen Daten. Bei 32-Bit-Operationen ist hier das HigherWord lokalisiert. Hat keine Bedeutung bei 16 Bit. Für den Start einer Sendeoperation wird das TxCMD-Kommando (00C0h) hier hineingeschrieben. Die Länge des zu sendenden Pakets wird in dieses Register geschrieben.
Tab. 34.13: Die Register des CS8900 im I/O-Mode-Mapping
Sandini Bib Lokale Netzwerke
1085
Offset
Bezeichnung
Zugriff
Bedeutung/Funktion
0008h
Interrupt Status Queue Port Packet Page Pointer Port Packet Page Data Port 0 Packet Page Data Port 1
Lesen
Enthält den augenblicklichen Interrupt-Status.
Lesen/Schreiben
Wird für den Zugriff auf die internen Register eingesetzt. Wird für den Datentransfer von/zu den internen Registern verwendet. 16-Bit-Operationen. Wird für den Datentransfer von/zu den internen Registern verwendet. 32-Bit-Operationen, unteres Word ist im Port 0-Register.
000Ah 000Ch 000Eh
Lesen/Schreiben Lesen/Schreiben
Tab. 34.13: Die Register des CS8900 im I/O-Mode-Mapping (Forts.)
Der CS8900 wird in einem 100-Pin-TQFP-Gehäuse hergestellt und kennt verschiedene Betriebsarten (z.B. I/O-, Memory-Mode), so dass er auch häufig in Embedded-Applikationen (MSRSchaltungen, Webservern etc.) mit unterschiedlichen Mikroprozessoren zu finden ist. Der bevorzugte Mode ist I/O, bei dem der Zugriff über acht 16-Bit-I/O-Ports erfolgen kann, die in Tabelle 34.13 angegeben sind. Der LAN-Controller hat zwar weit mehr (interne) Register als die hier angegebenen, gleichwohl reichen diese (fast) aus, um Pakete über das Netzwerk zu senden und zu empfangen, wie es weiter unten erläutert ist. Das folgende Listing zeigt zunächst die Definitionsliste, um alle Register des Chips entsprechend festzulegen, womit man eine Basis für die Erstellung eigener Programme hat. /*============================================================= Cirrus Logic CS8900A Ethernet chip dev/cs8900.h =============================================================== */ #ifndef _CS8900_H_ #define _CS8900_H_ /* Assumption - all registers are 16 Bits */ #define
CS8900_BASE 0x300 /* Default IO Port Address */
/* Directly visible registers through IP Port */ #define CS8900_RTDATA (CS8900_BASE+0x00) #define CS8900_TxCMD (CS8900_BASE+0x04) #define CS8900_TxLEN (CS8900_BASE+0x06) #define CS8900_ISQ (CS8900_BASE+0x08) #define CS8900_PPTR (CS8900_BASE+0xa) #define CS8900_PDATA (CS8900_BASE+0xc) /* ISQ Events */ #define ISQ_RxEvent #define ISQ_TxEvent #define ISQ_BufEvent #define ISQ_RxMissEvent #define ISQ_TxColEvent #define ISQ_EventMask
0x04 0x08 0x0C 0x10 0x12 0x3F
/* Registers available via "page pointer" (indirect access)*/ #define PP_ChipID 0x0000 /* Chip identifier - must be 0x630E */ #define PP_ChipRev 0x0002 /* Chip revision, model codes */ #define #define #define #define #define
PP_IntReg PP_IntReg_IRQ0 PP_IntReg_IRQ1 PP_IntReg_IRQ2 PP_IntReg_IRQ3
#define PP_RxCFG #define PP_RxCFG_Skip1 #define PP_RxCFG_Stream
0x0022 0x0000 0x0001 0x0002 0x0003
/* /* /* /* /*
Interrupt Use INTR0 Use INTR1 Use INTR2 Use INTR3
configuration */ pin */ pin */ pin */ pin */
0x0102 0x0040 0x0080
/* Receiver configuration */ /* Skip current frame*/ /* Enable streaming mode */
Sandini Bib 1086
Kapitel 34
#define #define #define #define #define #define #define
PP_RxCFG_RxOK PP_RxCFG_RxDMAonly PP_RxCFG_AutoRxDMA PP_RxCFG_BufferCRC PP_RxCFG_CRC PP_RxCFG_RUNT PP_RxCFG_EXTRA
0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000
/* /* /* /* /* /* /*
#define #define #define #define #define #define #define #define #define #define #define #define #define
PP_RxCTL PP_RxCTL_IAHash PP_RxCTL_Promiscuous PP_RxCTL_RxOK PP_RxCTL_Multicast PP_RxCTL_IA PP_RxCTL_Broadcast PP_RxCTL_CRC PP_RxCTL_RUNT PP_RxCTL_EXTRA PP_TxCFG PP_TxCFG_CRS PP_TxCFG_SQE
0x0104 0x0040 0x0080 0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000 0x0106 0x0040 0x0080
/* /* /* /* /* /* /* /* /* /* /* /* /*
#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define
PP_TxCFG_TxOK PP_TxCFG_Late PP_TxCFG_Jabber PP_TxCFG_Collision PP_TxCFG_16Collisions PP_TxCFG_ALL_IE PP_TxCmd PP_TxCmd_TxStart_5 PP_TxCmd_TxStart_381 PP_TxCmd_TxStart_1021 PP_TxCmd_TxStart_Full PP_TxCmd_Force PP_TxCmd_OneCollision PP_TxCmd_NoCRC PP_TxCmd_NoPad
0x0100 0x0200 0x0400 0x0800 0x8000 0x87C0 0x0108 0x0000 0x0040 0x0080 0x00C0 0x0100 0x0200 0x1000 0x2000
/* /* /* /* /* /* /* /* /* /* /* /* /* /* /*
#define #define #define #define #define #define #define #define
PP_BufCFG PP_BufCFG_SWI PP_BufCFG_RxDMA PP_BufCFG_TxRDY PP_BufCFG_TxUE PP_BufCFG_RxMiss PP_BufCFG_Rx128 PP_BufCFG_TxCol
0x010A 0x0040 0x0080 0x0100 0x0200 0x0400 0x0800 0x1000
/* /* /* /* /* /* /* /*
#define PP_BufCFG_Miss #define PP_BufCFG_RxDest
0x2000 0x8000
Buffer configuration*/ Force interrupt via software*/ Enable interrupt on Rx DMA*/ Enable interrupt when ready for Tx*/ Enable interrupt in Tx underrun*/ Enable interrupt on missed Rx packets*/ Enable Rx interrupt after 128 bytes*/ Enable int on Tx collision ctr overflow*/ /* Enable int on Rx miss ctr overflow*/ /* Enable int on Rx dest addr match*/
#define PP_LineCTL #define PP_LineCTL_Rx #define PP_LineCTL_Tx
0x0112 0x0040 0x0080
/* Line control*/ /* Enable receiver*/ /* Enable transmitter*/
#define PP_TestCTL #define PP_TestCTL_DisableLT #define PP_TestCTL_FDX
0x0118 0x0080 0x4000
/* Test control*/ /* Disable LT */ /* Full Duplex Mode */
#define PP_RER #define PP_RER_IAHash #define PP_RER_Dribble
0x0124 0x0040 0x0080
#define #define #define #define #define #define #define
0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000
/* Receive event*/ /* Frame hash match*/ /* Frame had 1-7 extra bits after last byte*/ /* Frame received with no errors*/ /* Frame address hashed OK*/ /* Frame address matched IA*/ /* Broadcast frame*/ /* Frame had CRC error*/ /* Runt frame*/ /* Frame was too long*/
PP_RER_RxOK PP_RER_Hashed PP_RER_IA PP_RER_Broadcast PP_RER_CRC PP_RER_RUNT PP_RER_EXTRA
RxOK interrupt enable */ Use RxDMA for all frames */ Select RxDMA automatically */ Include CRC characters in frame */ Enable interrupt on CRC error*/ Enable interrupt on RUNT frames*/ Enable interrupt on frames with extra data*/ Receiver control */ Accept frames that match hash*/ Accept any frame*/ Accept well formed frames*/ Accept multicast frames*/ Accept frame that matches IA*/ Accept broadcast frames*/ Accept frames with bad CRC*/ Accept runt frames*/ Accept frames that are too long*/ Transmit configuration*/ Enable interrupt on loss of carrier*/ Enable interrupt on Signal Quality Error*/ Enable interrupt on successful xmits*/ Enable interrupt on "out of window"*/ Enable interrupt on jabber detect*/ Enable interrupt if collision*/ Enable interrupt if > 16 collisions*/ Mask for all Tx events */ Transmit command status*/ Start after 5 bytes in buffer*/ Start after 381 bytes in buffer*/ Start after 1021 bytes in buffer*/ Start after all bytes loaded*/ Discard any pending packets*/ Abort after a single collision*/ Do not add CRC*/ Do not pad short packets*/
Sandini Bib Lokale Netzwerke
#define #define #define #define #define #define #define #define
PP_TER PP_TER_CRS PP_TER_SQE PP_TER_TxOK PP_TER_Late PP_TER_Jabber PP_TER_NumCollisions PP_TER_16Collisions
1087
0x0128 0x0040 0x0080 0x0100 0x0200 0x0400 0x7800 0x8000
/* /* /* /* /* /* /* /*
Transmit event*/ Carrier lost*/ Signal Quality Error*/ Packet sent without error*/ Out of window*/ Stuck transmit?*/ Number of collisions*/ > 16 collisions*/
#define PP_SelfCtl #define PP_SelfCtl_Reset
0x0114 0x0040
/* Chip control*/ /* Self-clearing reset*/
#define #define #define #define #define #define #define #define #define
PP_BusCtl PP_BusCtl_ResetRxDMA PP_BusCtl_DMAextend PP_BusCtl_UseSA PP_BusCtl_MemoryE PP_BusCtl_DMAburst PP_BusCtl_IOCH_RDYE PP_BusCtl_RxDMAsize PP_BusCtl_EnableIRQ
0x0116 0x0040 0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x8000
/* Bus control*/ /* Reset receiver DMA engine*/
#define #define #define #define #define
PP_BufEvent PP_BufEvent_SWInt PP_BufEvent_Rdy4Tx PP_BufEvent_TxUnder PP_BufEvent_RxMiss
0x012C 0x0040 0x0100 0x0200 0x0400
/* Buffer Event*/
#define #define #define #define #define #define #define #define #define #define #define #define
PP_LineStat PP_LineStat_LinkOK PP_LineStat_AUI PP_LineStat_10BT PP_LineStat_Polarity PP_LineStat_CRS PP_SelfStat PP_SelfStat_InitD PP_SelfStat_SIBSY PP_SelfStat_EEPROM PP_SelfStat_EEPROM_OK PP_SelfStat_ELPresent
0x0134 0x0080 0x0100 0x0200 0x1000 0x4000 0x0136 0x0080 0x0100 0x0200 0x0400 0x0800
/* /* /* /* /* /* /* /* /* /* /* /*
/* Enable "memory mode"*/
/* Enable interrupts*/
#define PP_SelfStat_EEsize
0x1000
Line status*/ Line is connected and working*/ Connected via AUI*/ Connected via twisted pair*/ Line polarity OK (10BT only)*/ Frame being received*/ Chip status*/ Chip initialization complete*/ EEPROM is busy*/ EEPROM present*/ EEPROM checks out*/ External address latch logic available*/ /* Size of EEPROM*/
#define PP_BusStat #define PP_BusStat_TxBid #define PP_BusStat_TxRDY
0x0138 0x0080 0x0100
/* Bus status*/ /* Tx error*/ /* Ready for Tx data*/
#define PP_LAF #define PP_IA #define PP_Rx_LENGTH
0x0150 0x0158 0x0402
/* Logical address filter (6 bytes)*/ /* Individual address (MAC)*/ /* Receive length, in bytes*/
int cs8900_poll_init(unsigned short duplexMode); int cs8900_poll_send(unsigned char *dataBuf, int total_len); int cs8900_poll_recv( unsigned char *dataBuf); int cs8900_interrupt_init(unsigned short duplexMode); int cs8900_interrupt_recv( unsigned char *dataBuf, unsigned short RxEventStatus); int cs8900_interrupt_send(unsigned char *dataBuf, int total_len); //void interrupt cs8900_ISR(); void hookint( unsigned irqno, int install_int ); void DelayForAWhile(void); #endif /* _CS8900_H_ */
Der CS8900 kann ein EEPROM (93C46) für die Ressourcen-Daten (ISA Plug&Play) verwenden, oder es wird eine manuelle Adresseneinstellung mit einem DIP-Schalter vorgenommen, wofür dann typischerweise die Adresse 300h zum Einsatz kommt, wie es hier angenommen wird und was auch der automatischen Voreinstellung entspricht, wenn kein EEPROM eingesetzt wird.
Sandini Bib 1088
Kapitel 34
Wie erläutert, verfügt jede Netzwerkkarte über eine ihr eigene MAC-Adresse, die prinzipiell bei der IEEE zu beantragen ist. Allerdings lohnt sich dieser Aufwand für ein Prototypdesign nicht, so dass die vorgegebene MAC-Adresse (siehe IA, Internet Address im Definitions-Listing und gEtherAddr im Programm-Listing) von Cirrus Logic verwendet wird. Es sei noch darauf hingewiesen, dass der LAN-Controller auch den so genannten Promiscuous Mode unterstützt. Dieser ermöglicht die Analyse des gesamten Netzwerkverkehrs und nicht nur derjenigen Daten, die explizit an die jeweilige MAC-Adresse gerichtet sind. Dieser Mode wurde mit der PC99-Spezifikation von Microsoft zur Pflicht ernannt, was sicherheitstechnisch gesehen als bedenklich eingestuft werden muss. Diese Betriebsart bildet nämlich die Voraussetzung für Sniffer-Programme, die somit den Netzwerkverkehr überwachen können. Das kann für Netzwerkadministratoren zum Aufdecken von Fehlern einerseits zwar sehr hilfreich sein, ermöglicht andererseits aber auch das Ausspionieren von Netzen durch Hacker. Die Token-Ring-Netzwerkkarten von IBM beispielsweise kennen keinen derartigen »Schnüffelmodus«, was auch einer der Gründe dafür ist, dass in sicherheitsrelevanten Umgebungen, wie etwa bei Banken und Versicherungen, oftmals IBM-(Token-Ring-)Lösungen anzutreffen sind. Für die Programmierung einer einfachen Paketübertragung wird nach der grundlegenden ChipInitialisierung zunächst das Transmit-Kommando (TxCMD 00C0h) abgesetzt. C0h (Lower Byte) wird hierfür auf Port 304h und 00h (Higher Byte) wird in 305h geschrieben. Danach ist die Länge des Frame festzulegen und in TxLength zu schreiben. Um beispielsweise 81 Bytes (dezimal) zu übertragen, wird 51h auf 306h (Low Byte) und 00h auf 307h (High Byte) geschrieben. Um festzustellen, ob überhaupt Daten gesendet werden dürfen, ist das Bit 8 des Busstatus-Registers (Rdy4TxNow, Ready for TX) zu überprüfen, was mithilfe des Packet Page Pointer-Register und des Packet Page Data Port erfolgt, die den Zugriff auf das interne Busstatus-Register ermöglichen. Hierfür ist 0138h zur Selektierung auf 30Ah (Packet Page Pointer) zu schreiben und daraufhin das Packet Page Data Port-Register auf 30Ch zu lesen. Ist das Bit 8 (Rdy4TxNow) high, können Daten gesendet werden. Optional kann zuvor eine Überprüfung auf eine korrekte Frame-Länge hin vorgenommen werden, wie es auch im folgenden Listing angegeben ist, wo außerdem noch Interrupt-Festlegungen getroffen werden, die jedoch nicht zwingend sind, weil die Frame-Verarbeitung hier im Polling-Mode absolviert wird. Die zu übertragenden Daten werden nunmehr in den Transmit-Buffer geschrieben, was bedeutet, dass das erste Byte auf 300h, das zweite auf 301h, das dritte auf 300h, das vierte auf 301h usw. zu liegen kommen muss, bis das komplette Paket gesendet worden ist. Ob dies der Fall ist, lässt sich durch Polling des TxEvent-Registers (Bit 8, TxOK=High) über Packet Page Pointer mit dem Wert 0128h feststellen. /*============================================================= Cirrus Logic CS8900A Ethernet chip Software Utility program for CS8900A Ethernet chip to demostrate Tx and Rx in 8-Bit mode. History: 3/28/02 Tanya Created the program based on the file CS8900.c =============================================================== #include <stdio.h> #include <dos.h> #include #include "cs8900.h" // Function prototypes: int cs8900_reset(void); unsigned short ReadPPRegister(unsigned short regOffset); void WritePPRegister(unsigned short regOffset, unsigned short val);
Sandini Bib Lokale Netzwerke
// // // // // // //
Global variables: gEtherAddr - Ethernet physical address of chip gPrevTxBidFail - indicates failure of the previous bid for Tx gTxInProgress - Indicates a Tx in progress (Tx not complete) gRxDataBuf - Rx data buffer gTxDataBuf - Tx data buffer gTxLength - Tx frame is always 1513 bytes in length
unsigned char gEtherAddr[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; int gPrevTxBidFail = 0; int gTxInProgress = 0; extern unsigned char gRxDataBuf[]; extern unsigned char gTxDataBuf[]; extern int gTxLength; /*******************************************************************/ /* ReadPPRegister(): Read value from the Packet Pointer register */ /* at regOffset */ /*******************************************************************/ static unsigned short ReadPPRegister(unsigned short regOffset) { // write a 16 bit register offset to IO port CS8900_PPTR outportb(CS8900_PPTR, (unsigned char)(regOffset & 0x00FF)); outportb((CS8900_PPTR + 1), (unsigned char)((regOffset & 0xFF00) >> 8)); // read 16 bits from IO port number CS8900_PPTR return (inportb(CS8900_PDATA) | (unsigned short)(inportb(CS8900_PDATA + 1) > 8)); // write 16 bits to IO port CS8900_PPTR outportb(CS8900_PDATA, (unsigned char)(val & 0x00FF)); outportb((CS8900_PDATA + 1), (unsigned char)((val & 0xFF00) >> 8)); } /*******************************************************************/ /* ReadPPRegisterHiLo(): Read value from the Packet Pointer */ /* register at regOffset. this is a special case where we read the */ /* high order byte first then the low order byte. This special */ /* case is only used to read the RxStatus and RxLength registers */ /*******************************************************************/ static unsigned short ReadRxStatusLengthRegister() { // read 16 bits from IO port number CS8900_PPTR return (inportb(CS8900_RTDATA + 1) | (inportb(CS8900_RTDATA) > 8)); } /*******************************************************************/ /* ReadIORegister(): Read 16 bits of data from the register, reg. */ /*******************************************************************/
1089
Sandini Bib 1090
Kapitel 34
static unsigned short ReadIORegister(unsigned short reg) { return(inportb(reg) | (inportb(reg + 1) '); REPEAT { WIEDERHOLEN .....} FOR KANAL:= 0 TO 3 DO BEGIN { 4 KANAELE MESSEN } CONFIG:=KANAL OR $C; { KONFIGURATION:12 BIT } PORT[CARD_ADR]:=CONFIG; REPEAT UNTIL PORT[CARD_ADR] AND $40 0; { BUSY FLAG ABFRAGEN } HIGH_BYTE:=PORT[CARD_ADR+1]; { DIE OBEREN BITS } LOW_BYTE:=PORT[CARD_ADR+2] DIV 16; { DIE UNTEREN BITS } WERT[KANAL]:=16*HIGH_BYTE+LOW_BYTE; { ERGEBNIS ZUSAMMENSETZEN } WERT[KANAL]:=WERT[KANAL]*610.5E-6; { NORMIERUNG 2.5 V/4095 } END; DELAY(100); { VERZOEGERUNG FÜR BESSERE LESBARKEIT } GOTOXY(21,12); WRITELN(WERT[0]:1:4,' ',WERT[1]:1:4,' ',WERT[2]:1:4,' ', WERT[3]:1:4,' '); { AUSGABE DER MESSWERTE } UNTIL KEYPRESSED; END.
{...BIS TASTE GEDRUECKT }
Sandini Bib Hardware-Programmierung unter Windows
1117
Dieses Programm soll nun in eine DLL umgesetzt werden. Alle Bildschirmausgaben und Bedienfunktionen wie auch das Delay-Kommando, das unter Borland Pascal nicht zulässig ist, da Windows hierauf nicht reagieren kann, werden aus dem Programm entfernt. Des Weiteren werden zwei Prozeduren definiert, die im ursprünglichen Programm zwar nicht vorhanden waren, wohl aber der entsprechende Programmcode. Die Prozedur OUT_CONFIG dient der Übergabe des Messkanals vom Anwenderprogramm zur DLL und realisiert damit den Hardwarezugriff. Die Prozedur IN_MEASURE übergibt den ermittelten Messwert von der DLL an das Anwenderprogramm. Das ursprüngliche Programm wurde so wenig wie nötig verändert, was ein Vergleich des folgenden Listings mit dem oben gezeigten AD_UPD-Programm sicher verdeutlicht. Entsprechend der obigen Erläuterungen zum prinzipiellen Aufbau einer DLL wird PROGRAM durch LIBRARY ersetzt, und die Prozeduren werden als EXPORT mit Ordinalbezeichnern (index 1,2) deklariert. Vergessen Sie nicht, den zurückzugebenden Messwert als »Var Messwert:Real« im Programmkopf zu definieren. Library AD7002;
{ DLL fuer 4-kanaligen 12-BIT-A/D-Wandler }
Const CARD_ADR:WORD=$300;
{ Eingestellte Kartenadresse }
Var Messwert:Real; Procedure Out_Config(Kanal:Integer);Export; { A/D-Wandler einstellen } Begin PORT[CARD_ADR]:=KANAL OR $C; { KONFIGURATION:12 BIT } End; Procedure In_Measure(Var Messwert:Real);Export; { Messwert aufnehmen } Var LOW_BYTE,HIGH_BYTE:INTEGER; Begin REPEAT UNTIL PORT[CARD_ADR] AND $40 0; { BUSY FLAG ABFRAGEN } HIGH_BYTE:=PORT[CARD_ADR+1]; { DIE OBEREN BITS } LOW_BYTE:=PORT[CARD_ADR+2] DIV 16; { DIE UNTEREN BITS } Messwert:=16*HIGH_BYTE+LOW_BYTE; { ERGEBNIS ZUSAMMENSETZEN } Messwert:=Messwert*610.5E-6; { NORMIERUNG 2.5 V/4095 } End; Exports Out_Config index 1, In_Measure index 2;
{Prozeduren werden exportiert}
Begin End.
Das Anwenderprogramm für den A/D-Wandler verwendet die beiden Prozeduren der DLL, die im Programmkopf entsprechend eingebunden werden. Es wird eine Messung mit dem Kanal 0 durchgeführt und das Ergebnis daraufhin auf dem Bildschirm dargestellt. Program UPDTEST;
{Testprogramm zum Aufruf der DLL AD7002}
Uses WinCrt, Strings; Var Ergebnis:Real; {Prozeduren der DLL einbinden} Procedure Out_Config (Kanal:Integer); far; external 'AD7002' index 1; Procedure In_Measure (Var Messwert: Real); far; external 'AD7002' index 2;
Sandini Bib 1118
Kapitel 35
Begin StrCopy(WindowTitle, 'uPD7210 Test'); {Text für Windows-Fenster} InitWinCrt; {Windows-Fenster öffnen} Out_Config(0); {Messen mit Kanal 0 } In_Measure(Ergebnis); {Ergebnis (Messwert) aufnehmen} Writeln ('Kanal 0: ', Ergebnis:1:4); {Ergebnis anzeigen} End.
Für die Verwendung der DLL kann im Prinzip auch jedes andere Windows-Programm eingesetzt werden, das eine DLL-konforme Parameterübergabe wie folgt erlaubt: OUT_CONFIG: Übergabe der Kanalnummer als Integer-Zahl IN_MEASURE: Empfang des Messwertes als Real-Zahl Abbildung 35.4 zeigt die beiden umgesetzten Programme für den Portbaustein und den A/DUmsetzer im Parallelbetrieb unter Windows 3.11.
Abb. 35.4: Die umgesetzten Programme für die PIO- und die A/D-Wandlerschaltung unter Windows
Windows kennt prinzipiell drei verschiedene Arten von DLLs. Am weitesten verbreitet ist mittlerweile die WIN32-DLL. Ihre Schnittstelle wurde für prozedurale Sprachen wie C oder Pascal entworfen. Die Funktionstypen für C und Pascal unterscheiden sich in der Art, wie die Übergabeparameter auf dem Stack abgelegt werden. Soll die DLL von verschiedenen Programmiersprachen aus ansprechbar sein, so wird im Allgemeinen die Pascal-Syntax verwendet. Sie lässt sich auch unter C durch Hinzufügen des Schlüsselwortes _stdcall vor jeder zu exportierenden Funktion erzwingen. Wird die DLL mit einem C++-Compiler erstellt, sind die Schnittstellendefinitionen als extern _C_ zu deklarieren, was verhindert, dass der Compiler die Funktionsnamen entsprechend des Name Manglings verändert. Das Name-Mangling erlaubt es dem Compiler, gleich lautende Funktionsnamen unterschiedlicher DLLs zu unterscheiden. Sie erschwert jedoch die Verwendung der
Sandini Bib Hardware-Programmierung unter Windows
1119
DLLs mit anderen Programmiersprachen, da das Name-Mangling niemals genau spezifiziert wurde und daher in den Compilern unterschiedlich implementiert ist. Die zweite Gruppe der DLLs ist unter der Bezeichnung MFC-DLLs bekannt. Sie unterscheiden sich von den WIN32-DLLs allein dadurch, das sie intern den erweiterten Funktionsumfang der MFC (Microsoft Foundation Classes) nutzen können. Beim Erstellen der DLL werden die MFCKomponenten statisch mit der DLL gelinkt, wodurch sie meist sehr viel größer als »normale« WIN32-DLLs ausfallen. Die MFC ist eine Bibliothek (Framework) mit zahlreichen Funktionen, die in C++ geschrieben worden sind. Hiermit stehen dem Programmierer vorgefertigte Programmcodes zur Verfügung, beispielsweise für die Steuerung von Dialog-Boxen, Toolbars und Menüs, aber auch für das Multithreading sowie für Datenbank- und Internet-Anwendungen. Die MFC-Erweiterungs-DLLs bilden die dritte Gruppe von DLLs. Auch sie können auf die Funktionen des MFC zugreifen, werden aber im Gegensatz zu den normalen MFC-DLLs dynamisch mit den MFC-Komponenten gelinkt. Der größte Nachteil von MFC-Erweiterungs-DLLs ist, dass sie lediglich von MFC-basierten Applikationen, beispielsweise einem Visual C++-Project, ausgeführt werden können, und sich hiermit keine Programmiersprachenunabhängigkeit realisieren lässt.
35.2.1 A/D-Umsetzung Für Anwendungen in der Mess-, Steuer und Regelungstechnik werden A/D-Umsetzer benötigt. In Abbildung 35.5 ist zunächst eine einfache Interface-Schaltung gezeigt, an die sich unterschiedliche Peripherie-Chips wie der erwähnte Portbaustein oder eben auch ein A/D-Umsetzer anschließen lassen.
Abb. 35.5: Interface-Schaltung für den Anschluss unterschiedlicher Peripherie-Chips
Sandini Bib 1120
Kapitel 35
Als externe Beschaltung wird für den A/D-Umsetzer ein Schwingkreis benötigt, der aus zwei Kondensatoren und einem Quarz besteht. Ferner wird ein Integrationskondensator gebraucht, dessen Wert hier 33 nF beträgt. Als Referenzspannung werden 2,5 V verwendet, die aus der 5 V-Versorgung des PC mit Hilfe der Referenzdiode LM336 gewonnen werden. Ein 100nF-Kondensator leitet Störungen auf der Leitung zur Schaltungsmasse ab. Als Schutz vor zu hohen Eingangsspannungen (denn es ist maximal die Referenzspannung von 2,5 V erlaubt) werden 2,7 V-Zenerdioden, die als Schutzbeschaltung ausreichen, vor die Eingänge geschaltet.
Abb. 35.6: Die Analog/Digital-Wandlerschaltung
Der Analog/Digital-Wandler µPD7002 der Firma NEC arbeitet nach dem Dual-Slope-Verfahren. Mit einer Wandlungszeit von 4 ms für eine 8-Bit-Auflösung gehört er zwar nicht zu den schnellen Umsetzern, doch der Schaltungsaufbau ist mit ihm sehr einfach, weil nur wenige zusätzliche Bauelemente benötigt werden. Die maximale Auflösung des Umsetzers beträgt 12 Bit, wobei der Hersteller jedoch nur für eine 10-Bit-Auflösung konkrete Daten angibt. In der Praxis hat sich gezeigt, dass man die 12-Bit-Auflösung dennoch nutzen kann, wenn man über mehrere Messwerte den Mittelwert bildet. An den µPD7002 können vier analoge Signalquellen angeschlossen werden, denn der Baustein besitzt einen vierkanaligen Multiplexer vor der eigentlichen Wandlerschaltung. Die analoge Eingangsspannung wird umgesetzt, nachdem der Baustein über CS aktiviert worden ist. 50 ns später können durch einen Schreibzugriff mit WR = LOW der gewünschte Kanal und die Auflösung eingeschrieben werden. Nach Ablauf der Wandlungszeit (ca. 10 ms) kann mit einem Lesezugriff (RD = LOW) das Ergebnis gelesen werden. 300 ns nach dem RD-Signal steht das Ergebnis dann im Ausgangsregister (Three State Buffer) zum Auslesen bereit. Als Statussignal kann das EOC-Signal (End Of Cycle) ausgewertet werden, das nach Beendigung der Wandlung auf Low geht und einen Interrupt (über Inverter) vom PC über eine der IRQ-Leitungen des Bus anfordern kann. Entsprechend der zuvor programmierten Auflösung und mittels der Adressleitungen A0 und A1, die direkt mit dem Adressbus (LSBs) des PC-Slots verbunden sind, steht das 8-Bit-Ergebnis zur Verfügung. Das endgültige 10-Bit- oder 12-Bit-Ergebnis wird durch einen weiteren Lesezugriff ermittelt. Der Status des Wandlers kann ebenfalls über einen Lesezugriff abgefragt werden, und ein Testmode wird von NEC für Testzwecke benutzt, der für den Anwender nicht von Bedeutung ist. Über die einzelnen Funktionen und Register des A/D-Wandlers informiert Tabelle 35.4.
Sandini Bib Hardware-Programmierung unter Windows
1121
Abb. 35.7: Interner Aufbau des A/D-Umsetzers
Der A/D-Wandler belegt insgesamt vier Adressen. Die gewünschte Konfiguration wird in denjenigen Port geschrieben, der der Basisadresse (z.B. 300h) entspricht. Ein Lesezugriff auf die Basisadresse liefert Informationen über den momentanen internen Zustand des Umsetzers. Das Busy-Bit ist dabei von besonderem Interesse, da es das Ende der Umsetzung kennzeichnet. Das End-Of-Cycle-Bit (EOC) liefert im Prinzip die gleiche Information, jedoch in invertierter Form. CS
RD
WR
A1
A0
Funktion
1 0 0 0 0 0 0 0 0 0
X 1 1 1 1 1 0 0 0 0
X 1 0 0 0 0 1 1 1 1
X X 0 0 1 1 0 0 1 1
X X 0 1 0 1 0 1 0 1
keine (hochohmig) keine (hochohmig) Konfiguration keine (hochohmig) keine (hochohmig) Testmode (NEC) Interner Status 8-Bit-Ergebnis D0–D7 Ergebnis 9–12 Bit (identisch mit vorheriger Zeile)
Tab. 35.4: Die Steuerung des µPD7002
Sandini Bib 1122
Kapitel 35
Abb. 35.8: Die Register des A/D-Umsetzers
Durch einen Lesezugiff auf die Basisadresse +1 wird direkt das Ergebnis einer 8-Bit-Umsetzung ermittelt. Wurde hingegen eine 10- oder 12-Bit-Umsetzung gestartet, ist außerdem noch ein Lesezugriff auf die Basisadresse +2 notwendig, um die LSBs zu ermitteln. In Abbildung 35.8 sind die Register des Chips angegeben, und es ist zu erkennen, wie die LSBs (Least Significant Bits) einer 12-Bit-Umsetzung unter der Basisadresse +2 angeordnet sind. Das Ergebnis der MSBs wird im Programm entsprechend mit 16 multipliziert, und beide Teilergebnisse werden daraufhin addiert, womit die Wertigkeit der einzelnen Bits hergestellt ist.
Sandini Bib Hardware-Programmierung unter Windows
1123
35.2.2 DLLs für 32-Bit-Betriebssysteme Aktuelle Windows-Programmiersprachen wie Visual BASIC, Delphi oder auch Visual C++ sind für 32-Bit-Betriebssysteme vorgesehen, was in der Windows-Welt dementsprechend Programme für die Windows 9x- und die Windows NT-Plattform bedeutet. 16-Bit-DLLs, wie die zuvor erläuterten, können die genannten Programmierumgebungen nicht mehr generieren – Visual BASIC kann dies ohnehin nicht, außer ActiveX-DLLs, die hier jedoch keine Berücksichtigung finden –, wobei die jeweiligen Vorgängerversionen teilweise noch beide Varianten (16- und 32-Bit-DLLs) erstellen können. Es sei der Vollständigkeit halber erwähnt, dass bei den hier angeführten DLLBetrachtungen von einfachen DLLs, ohne irgendwelche API- oder ActiveX-Spezialitäten, zur Kommunikation mit der Hardware ausgegangen wird. Windows 9x-Programme können natürlich 32-Bit-DLLs, aber aus Kompatibilitätsgründen auch noch 16-Bit-DLLs verwenden. Demnach ist es also möglich, mit einer »alten« DLL auf Windows 9x umzuziehen. Zu Problemen kommt es dann in der jeweiligen 32-Bit-Entwicklungssoftware (z.B. Delphi), denn diese kann die alten 16-Bit-DLLs nicht ohne Weiteres übernehmen, wobei die Unterscheidung zwischen Groß- und Kleinschreibung bei den Funktionsnamen (32 Bit = alles groß!) noch das kleinste Übel ist. Für die Kommunikation mit der Hardware sind die direkten Portzugriffe ein einfaches und probates Mittel, um sich nicht im Treiberwirrwarr von Windows zu verstricken, doch diese Möglichkeit gibt es bei den grafisch orientierten Programmiersprachen wie Visual BASIC oder Delphi eben nicht. Optisch ansprechende Oberflächen, wie sie in der Windows-Welt üblich sind, sind die eine Seite, und die Hardware ist eben die ganz andere. Das Application Programming Interface – kurz API – ist die Programmierschnittstelle von Windows, und demnach gibt es ein API für 16-Bit-Windows (Windows 3.x, Windows 9x) und auch eines für 32-Bit-Windows (Windows 9x, Windows NT), die nur bedingt zueinander kompatibel sind. Die APIs stellen eine Vielzahl an Funktionen bereit – es mögen für Win32 mittlerweile an die 2000 Stück sein –, beispielsweise von AbortDoc (Druckauftrag abbrechen) bis zu WriteTapemark (Bandmarker schreiben). Mit den genannten Programmiersprachen lassen sich diese Windowsinternen API-Funktionen, wie etwa das simple Beep im Kapitel 35.2, nutzen, nur leider kommt die Hardware ganz allgemein dabei zu kurz, denn es wird standardmäßig allein die serielle Schnittstelle unterstützt, die dementsprechend auch in den üblichen Windows-Programmiersprachen eine Unterstützung erfährt. Win16-API
Win32-API
Funktion
OpenComm CloseComm ReadComm WriteComm BuildCommDCB SetCommState ClearCommError
CreateFile CloseHandle ReadFile WriteFile BuildCommDCB SetCommState ClearCommError
Öffnen der Schnittstelle Schließen der Schnittstelle Daten lesen Daten schreiben Schnittstellenparameter erzeugen Schnittstellenparameter einstellen Status ermitteln
Tab. 35.5: Beispiele für die Unterschiede zwischen den Win16- und den Win32-Application-Interface-Funktionen für die serielle Schnittstelle, die im Grunde genommen die einzige Hardware ist, die direkt unterstützt wird.
Da die I/O-Ports ganz allgemein bei der Windows-Programmierung außen vor bleiben, wäre eine DLL wünschenswert, die eben genau die Funktionalität der direkten Portzugriffe zur Verfü-
Sandini Bib 1124
Kapitel 35
gung stellt. Dies ist für Windows 9x bei Verwendung der Programmiersprache Visual C++ (hier mit Version 4.0) relativ einfach zu bewerkstelligen:
: : : : : : : :
File – New Project Workspace Dynamic-Link Library Name: Name des Projektes Plattform: Win 32 Location: C:\MSDEV\Projects\Name des Verzeichnisses File – New Text File
Der einzugebende Quelltext besteht nur aus ein paar Zeilen. Mit _outp(PortAdr,PortData) wird ein Byte (PortData) auf die unter PortAdr übergebene Adresse ausgegeben, und mit _inp(PortAdr) wird dementsprechend ein Byte von der Portadresse eingelesen. Diese beiden Funktionen werden als PortOut und PortIn exportiert und können dann unter Beachtung der Parameterübergabe problemlos von Visual BASIC, Visual C++ oder auch Delphi aus aufgerufen werden, womit der direkte Portzugriff dann auch hier möglich ist und sich demnach (fast) beliebige PC-Hardware ansprechen lässt. Grundsätzlich werden alle DLL-Funktionen, die von außen verwendet werden sollen, mit _declspec(dllexport) gekennzeichnet, wobei dieser Ausdruck das bei 16-Bit-DLLs verwendete Schlüsselwort _export ersetzt. Außerdem müssen die Funktionen mit _stdcall versehen werden, was die Reihenfolge der Parameterübergabe regelt und letztlich dafür sorgt, dass die Funktionen anschließend etwa von Visual BASIC verwendet werden können. Bei der Parameterübergabe sind jedoch zusätzliche Informationen mit zu übergeben, wie etwa die Größe des Stackbereichs, der bei Int-Variablen, wie im Beispiel gezeigt, vier Byte für jede Variable beträgt, denn die Parameter werden am Stack grundsätzlich als 32-Bit-Werte übergeben. Außerdem werden die Funktionen nicht unter den angegebenen Namen verarbeitet, sondern der wahre Name der Funktion (_name@ plus Stackbereich) ist mit ALIAS zu kennzeichnen. Um diesem Umstand, der die Parameterübergabe etwas unübersichtlich und auch fehlerträchtig macht, aus dem Weg zu gehen, verwendet man eine Moduldefinitionsdatei (*.DEF), die dem Project einfach mit File - New - Text File und dann Insert/Files into Project hinzugefügt wird. Wie diese Datei für das Beispiel auszusehen hat, ist im folgenden Quelltext der DLL im Kopf als Kommentar mit angegeben und auch in Abbildung 35.9 zu erkennen. // // // // // // // // // // // // // //
PortIO.cpp Klaus Dembowski, 15.3.99 32-Bit-DLL fuer universellen Portzugriff Es wird noch eine DEF-Datei benoetigt: LIBRARY PortIO DESCRIPTION Universelle 32-Bit-PortIO-DLL EXPORTS PortOut PortIn Beide Dateien PortIO.cpp und PortIO.def sind dem Projekt hinzuzufuegen: Insert/Files into Project...
#include #include <windows.h> #include <stdlib.h>
Sandini Bib Hardware-Programmierung unter Windows
1125
// Extended Attribute: _declspec (dllexport) int _declspec(dllexport) _stdcall PortOut(int PortAdr, int PortData) { int Status=0; Status=_outp(PortAdr,PortData); //Port-Byte ausgeben return Status; } int _declspec(dllexport) _stdcall PortIn(int PortAdr) { int Status; Status=_inp(PortAdr); //Port-Byte einlesen return Status; }
Nach der Kompilierung (F7) der DLL befindet sie sich üblicherweise im Debug-Verzeichnis des zuvor angegebenen Projects-Verzeichnisses (z.B. unter C:\Msdev\Projects\PortIO\Debug).
Abb. 35.9: Die Erstellung der DLL für den direkten Portzugriff mit Visual C++
35.2.3 Aufruf der DLL mit Visual BASIC Auf die Besonderheiten der Programmierung mit Visual BASIC oder auch Delphi (siehe Kapitel 35.2.4) soll hier nicht weiter eingegangen werden. Hierfür gibt es eine Menge Literatur, die jedoch eher selten eine Verbindung zur Hardware herstellt, was daher im Folgenden beschrieben wird. Die häufigsten Fehlerquellen beim Einbinden von DLLs sind, dass die Groß- und Kleinschreibung der Funktionsnamen nicht konsequent beachtet wird, dass die Angaben (z.B. EXPORTS) in
Sandini Bib 1126
Kapitel 35
der zur DLL gehörenden DEF-Datei womöglich kleingeschrieben sind und dass die DLL beim Programmaufruf ganz einfach nicht gefunden wird, wobei die auftretenden Fehlermeldungen keineswegs eindeutig auf diese Fehler hinweisen, sondern auch leicht in die Irre führen können. Nach der im jeweiligen Programm angegebenen DLL wird automatisch in den folgenden Verzeichnissen gesucht:
: : :
Im Verzeichnis des Visual BASIC-Projekts Im Windows-Hauptverzeichnis (z.B. c:\windows) Im Windows-Systemverzeichnis (z.B. c:\windows\system)
Wer die DLL einfach in alle drei Verzeichnisse kopiert, wird möglicherweise schnell den Überblick beim Einbinden der DLL verlieren. Wenn z.B. noch Korrekturen an der DLL und/oder dem Visual BASIC-Programm vorzunehmen sind, ist dann nicht zweifelsfrei festzustellen, welche der DLLs nun verwendet wird. Die korrigierte Version im Visual BASIC-Verzeichnis wird dann eben nicht verwendet, sondern die alte aus dem Windows-Verzeichnis, und daher sollte man bei der Programmentwicklung am besten den kompletten Pfad angeben (siehe Abbildung 35.10), wo sich die DLL jeweils befindet. Später, wenn das Programm auf Diskette oder CD weitergegeben werden soll, sollte die DLL dann aber im gleichen Verzeichnis wie das Applikationsprogramm liegen, was einen erneuten Kompilierungsvorgang bedeutet (dann aber ohne Pfadangabe, wie im folgenden Listing).
Abb. 35.10: Das Beispiel mit Visual BASIC zeigt den Einsatz der DLL für den direkten Portzugriff.
Sandini Bib Hardware-Programmierung unter Windows
1127
Als Anwendung der PortIO.dll wird ein einfaches Visual BASIC-Programm (ab Version 5.0) verwendet, das eben die DLL korrekt einbindet und dann die beiden Funktionen PortIn und PortOut aufruft. 'Programm: Testio95 'Deklaration für externe DLL Private Declare Function PortOut Lib "PortIO" (ByVal port As Integer, ByVal daten As Integer) As Integer Private Declare Function PortIn Lib "PortIO" (ByVal port As Integer) As Integer Sub Command1_Click() Dim PortAddress, DataIn, DataOut, Status As Integer DataOut = InputBox("Daten schreiben (dez.): ", DataOut) 'Daten eingeben PortAddress = &H80 'Portadresse Status = PortOut(PortAddress, DataOut) 'auf Datenport schreiben DataIn = PortIn(PortAddress) 'Datenport lesen Print "Gelesene Daten (hex.):", Hex$(DataIn) 'Ausgabe End Sub
Als Portadresse ist hier 80h angegeben, und wer im Besitz einer POST-Code-Karte ist, kann die Funktion dann unmittelbar überprüfen, wenn die in dezimaler Notation eingegebenen Daten als Hex-Daten auf dem Display erscheinen (wenn Sie z.B. 255 eingegeben haben, wird FFh auf dem Port ausgegeben). Im nächsten Schritt werden die geschriebenen Port-Daten dann eingelesen. Es ist also überhaupt kein Problem, mit einem Visual BASIC-Programm unter Windows 9x und der erläuterten PortIO.dll auf IO-Ports und damit auf nahezu beliebige Hardware zuzugreifen, wie es auch so schön einfach in alten DOS-Zeiten möglich war.
35.2.4 Aufruf der DLL mit Delphi Die grundsätzliche Vorgehensweise für den Aufruf der PortIO.dll unterscheidet sich mit Delphi auch nicht wesentlich vom Aufruf mit Visual BASIC, nur die Anbindung der DLL sieht ein wenig anders aus, wie es in Abbildung 35.11 gezeigt ist. Damit die DLL vom Programm gefunden werden kann, ist auch hier der Pfad zu berücksichtigen, und die DLL wird ebenfalls als Funktion und als externer Standard-Call eingebunden. Selbstverständlich könnte man in die DLL für den direkten Hardwarezugriff noch weit mehr Funktionen »hineinpacken« als nur PortIn und PortOut, was schließlich von der einzusetzenden Hardware (Funktionsweise, Anzahl der Register usw.) abhängig ist. Da es hier jedoch in erster Linie um die Verdeutlichung des Prinzips geht, möchte ich es dabei bewenden lassen. Die beiden Port-Funktionen lassen sich jedoch universell einsetzen und können somit die Grundlage für eigene Applikationen bilden, ohne dass man sich mit der demgegenüber weit aufwändigeren Windows-Hardware-Treibererstellung beschäftigen müsste. Dabei kann ein bereits bestehender Programmcode (für DOS) vielfach übernommen werden. Naheliegenderweise werden Anwender, die in Turbo Pascal bewandert sind, eher auf Delphi umschwenken und C-Programmierer sich mit Microsofts Visual C++ oder auch Borlands C++ Builder beschäftigen.
Sandini Bib 1128
Kapitel 35
Abb. 35.11: Die Einbindung der PortIO.dll erfolgt bei Delphi ebenfalls als Funktion und als externer Standard-Call. Die DLL ist hier im aktuellen Delphi-Projekt-Verzeichnis gespeichert.
35.2.5 Ein paar Worte zu Assembler Assembler habe ich in diesem Kapitel bisher noch nicht erwähnt, was ich daher an dieser Stelle noch kurz nachholen möchte. Die bekannten eigenständigen Assembler wie MASM von Microsoft und TASM von Borland sind mittlerweile eingestellt worden, mangels Nachfrage, wie von den Herstellern behauptet wird. Oftmals findet man Assembler als freie Downloads auf den Internetseiten der Hersteller sowie auch eine ganze Reihe von Shareware-Lösungen. Für den Linux-Bereich sind die entsprechenden Programmierwerkzeuge ohnehin Open-Source, so dass man für die (Hardware-)Programmierung in beiden »Welten« im Prinzip kein zusätzliches Geld ausgeben muss. Allerdings ist nicht immer unmittelbar zu erkennen, welchen Funktionsumfang die Assembler eigentlich bieten, ob etwa auch ein Athlon und/oder ein Pentium 4 oder auch SIMD unterstützt wird. Derartige Optionen sind für die reine Hardware-Programmierung, die (wie ich den Begriff hier verstehen möchte) in den meisten Fällen eben aus einfachen I/O-Operationen besteht, jedoch nicht von Bedeutung. Aktuelle Features für die Assembler-Programmierung findet man heutzutage in den so genannten Inline-Assemblern, womit gemeint ist, dass entsprechende Assembler in den HochsprachenEntwicklungsumgebungen (Visual C++ 7, Delphi 6, C++Builder 6) zu finden, also dort quasi integriert sind. Bei den hier genannten Entwicklungsumgebungen sollte man davon ausgehen können, dass aktuelle Prozessor-Features auch nutzbar sind oder zumindest per Update vom Hersteller nachgereicht werden, sobald neue Optionen gefordert sind.
Sandini Bib Hardware-Programmierung unter Windows
1129
35.3 Direkter Hardwarezugriff unter Windows NT Wie Windows NT mit der Hardware umgeht, unterscheidet sich ganz wesentlich von dem Vorgehen, das diejenigen Windows-Versionen praktizieren, bei denen DOS ein fester Bestandteil ist, also Windows 3.x, Windows 9x und Windows Me. Auch wenn es zwischen diesen drei Architekturen einige Unterschiede gibt, sind diese keineswegs so gravierender Art wie der Unterschied zu der »Windows NT-Schiene«, wozu auch die Nachfolger Windows 2000 und Windows XP zu rechnen sind. Windows NT verwendet ausschließlich 32-Bit-Treiber für die Hardware, und daher ist es nicht möglich, etwa einen alten 16-Bit-Treiber für eine Hardware-Komponente einzusetzen. Windows NT setzt nicht auf DOS auf und kennt demnach auch keinerlei DOS-Treiber oder dazugehörige Einträge in den Konfigurationsdateien. Windows NT kann dennoch alle üblichen DOSund Windows-Programme ausführen, solange diese eben nicht direkt auf die Hardware zugreifen.
Abb. 35.12: Die prinzipielle Windows NT-4.0-Architektur
Die Hardware-Treibererstellung für Windows NT erfordert neben den notwendigen Kenntnissen über die Kernel-Programmierung zusätzliche Software wie die entsprechenden SDKs (System
Sandini Bib 1130
Kapitel 35
Development Kit) und DDKs (Device Driver Kit) von Microsoft. Diese glänzen nicht gerade durch Übersichtlichkeit und praxisnahe Beispiele, wie sie für einen eher hardware-orientierten Anwender nötig wären, der nur mal schnell seine Schaltung ausprobieren möchte. Wie man dies dennoch mit Hilfe einer noch einfachen DLL erledigen kann, wurde im vorangegangenen Abschnitt für Windows 9x erläutert. Windows NT stellt sich im Verglich zu Windows 9x weitaus restriktiver an, denn es verbietet den üblichen Applikationen direkte Zugriffe auf Ports, interne Register oder auch auf den Speicher. Diese Möglichkeiten sind, nach einem recht komplexen Regelwerk, allein den Treibern vorbehalten, die die Rechte der Privilegstufe 0 nutzen können, während die Anwenderprogramme üblicherweise auf der Privilegstufe 3 angesiedelt sind. Ein Durchschreiben von entsprechenden Zugriffen ist von der NT-Architektur her nicht vorgesehen, denn dies würde den implementierten Sicherheitsmechanismus verletzen. Bereits mit dem 286-Prozessor wurden vier Privilegstufen (hierarchical Protection Levels, PL) für multitasking-fähige Betriebssysteme definiert, um die einzelnen Prozesse voneinander isolieren und voreinander schützen zu können. Hierfür ist keine zusätzliche Hardware erforderlich, sondern die in der CPU integrierte Memory Management Unit (MMU) übernimmt diese ProtectionFunktion. Man kann sich diese Stufen als Ringe vorstellen, wie es in Abbildung 35.13 gezeigt ist. Dabei gilt grundsätzlich:
: :
Auf Daten kann nur von demjenigen Programmcode aus zugegriffen werden, der sich auf gleichen oder darüber liegenden Privilegstufen befindet. Ein Programmcode kann nur von einen Programm (Task) ausgeführt werden, das sich auf der gleichen oder auf der darunter liegenden Privilegstufe befindet.
Abb. 35.13: Das Prinzip der Privilegstufen zur Abwicklung des Multitaskings
Die höchste Privilegstufe und somit den Zugriff auf alle weiteren Programme der darüber liegenden Ringe hat der innerste Ring (PL=0), wo sich das eigentliche Betriebssystem und auch die virtuellen Gerätetreiber (VxDs) befinden. Hier auftretende Fehler können daher das gesamte System zum Absturz bringen. Im Ring 1 können sich Softwareinterfaces zur Verbindung des Betriebssystems mit dem Ring 2 befinden, in dem beispielsweise Betriebssystemerweiterungen oder auch Service-Routinen lokalisiert sind, und im Ring 3 liegen dann die eigentlichen (Anwender-)Progamme. Im Ring 3 sind beispielsweise auch die wesentlichen Teile der grafischen
Sandini Bib Hardware-Programmierung unter Windows
1131
Windows-Umgebung (GDI, USER, KERNEL) abgelegt, und hier laufen auch die Windows- und DOS-Programme ab, was durchaus zu Problemen führen kann. Microsoft nutzt aber weder bei der Windows 9x- noch bei der Windows NT-Architektur konsequent diese vier Stufen, sondern beschränkt sich auf die Nutzung der Ringe 3 und 0. Hierfür werden verschiedene Gründe angeführt. Bei Windows 9x wird mit der höheren Geschwindigkeit argumentiert, wenn eben nicht alle Stufen genutzt werden, und bei Windows NT mit dem Argument, dass Windows NT nicht nur auf der x86-Plattform lauffähig sein soll, sondern auch auf Alpha- oder Power-PCs, die andere Privilegstufen kennen. Diese Argumente sollten mittlerweile zwar als überholt angesehen werden können, gleichwohl ist dies bei Microsoft nach wie vor der Stand der Dinge.
35.3.1 Windows-NT-I/O-Treiber Es gibt aber einen (relativ) einfachen Weg, um ebenfalls unter Windows NT direkt auf Ports zugreifen zu können, der in einem Artikel von Dale Roberts (Direct Port I/O and Windows NT) in Dr. Dobbs Journal vom Mai 1996 beschrieben ist. Hierfür werden zwei undokumentierte KernelFunktionen von Windows-NT verwendet, mit deren Hilfe alle Ports im Bereich von 0h–FFFFh für den direkten Zugriff freigegeben werden. Der Nachteil bei dieser Vorgehensweise ist, dass bei derart offenen Ports die weitere Hardware, wie IRQ- und DMA-Controller oder auch die Grafikkarte, nicht bedient werden kann, was somit zu einem ernsthaften Windows-NT-Problem (Verletzung des Schutzmechanismus) führen kann. Die Zeitschrift c’t hat sich, basierend auf dem genannten Artikel, dieser Thematik in der Ausgabe vom Januar 1997 angenommen und einen Treiber directNT.sys vorgestellt, der einen sicheren Zugriff auf die Ports erlaubt, denn er verwendet das von Microsoft vorgesehene Kernel-API für die Kommunikation. Der Treiber wird mit Hilfe eines Setup-Programms automatisch in das Systemverzeichnis kopiert und in die WindowsNT-Registrierung eingetragen. Nach der Installation ist er unter SYSTEMSTEUERUNG – GERÄTE zu finden. Wer sich für alle Eintragungen der Registrierung interessiert, die etwas mit dem directNT-Treiber zu tun haben, kann mit Regedit32 die entsprechenden Schlüssel suchen lassen (ANSICHT – SCHLÜSSEL SUCHEN – SUCHEN NACH directNT). Er ist unter HKEY_LOCAL_MACHINE eingetragen und findet sich nach der Installation auch im Verzeichnis WINNT\system32\drivers wieder. Die Anwendung in der c’t ist die Manipulierung der Cyrix-6x86-CPU-Register unter Windows-NT, wie etwa das Einschalten des Write-Back-Cache, denn Windows NT schaltet diesen für die Cyrix-CPUs bis zur Prozessorversion 2.6 generell einfach ab. Diese Anwendung soll an dieser Stelle jedoch nicht von Belang sein. Vielmehr soll mit Hilfe von directNT – dem Tor zum NT-Kernel gewissermaßen – eine DLL erstellt werden, die letztlich genauso arbeitet, wie die im vorherigen Kapitel beschriebene für Windows 9.x. Sie bietet idealerweise die Funktionen PortIn und PortOut, und die jeweiligen Anwenderprogramme (z.B. in Visual BASIC oder Delphi) können dann im Prinzip sowohl für Windows 9.x als auch für Windows NT unverändert bleiben. Gewissermaßen als Zwischenstufe zwischen directnt und der zu verwendenden NT-DLL, die die beiden Funktionen in bekannter Syntax (siehe vorherigen Abschnitt) zur Verfügung stellen soll, wurde zur Vereinfachung die Datei KDdirectnt erstellt, die im Grunde genommen auf directnt aufsetzt. Diese zusätzliche Stufe sorgt dafür, dass directnt nicht angepasst werden muss. Außerdem kann das bereits vorhandene Setup-Programm zur Installation des Treibers (directNT.sys) verwendet werden, und die ganze Angelegenheit bleibt zur Anwenderseite hin noch übersichtlich. Alles, was unterhalb von directnt.h liegt (siehe Abbildung 35.14) bleibt somit unverändert und muss den Anwender auch nicht weiter interessieren.
Sandini Bib 1132
Kapitel 35
Abb. 35.14: Der softwaretechnische Aufbau für den direkten Hardware-Zugriff unter Windows NT
Es soll nicht unerwähnt bleiben, dass der Treiber directnt weit mehr Funktionen als nur die beiden unterstützt, die für das Beispiel verwendet werden. So unterstützt er beispielsweise auch das Schreiben und Lesen von DWORDs, PCI-Registern usw. Es wurde jedoch darauf verzichtet, weitere Funktionen in KDdirectnt vorzusehen, weil man in den meisten Fällen allein mit diesen beiden auskommt, zumindest wenn es darum geht, (eigene) Hardware unter Windows NT anzusprechen. Für die Erstellung der Dateien wurde, wie beim DLL-Beispiel des vorherigen Abschnitts, auch wieder Visual C++ verwendet. Die nach der Kompilierung vorhandene Datei KDdirectnt.obj wird später einfach dem Projekt hinzugefügt, die dazugehörige Quelldatei sieht dabei aus wie folgt: // Source fuer KDdirectnt.obj Version 1.0 #include #include #include #include #include #include
<windows.h> <winioctl.h> <stdio.h> <stdlib.h> "directnt.h" "KDdirectnt.h"
Sandini Bib Hardware-Programmierung unter Windows
1133
const char *DirectNTDrvName = "\\\\.\\Dev_DirectNT"; HANDLE Drv; BOOL DrvExec(HANDLE Drv,ULONG OpCode,ULONG Param1,ULONG Param2,ULONG Param3, void *Result,ULONG ResultSize) { TDirectNTInfo I = {OpCode,Param1,Param2,Param3}; ULONG ResultLen; if (DeviceIoControl(Drv,DWORD(IOCTL_DIRECTNT_CONTROL),&I,sizeof(I), Result,ResultSize,&ResultLen,NULL)) return TRUE; printf("Fehler von DirectNT.sys, Code = %d\n",GetLastError()); return FALSE; } int __cdecl directout(ULONG port, BYTE out) { ULONG dummy; Drv = CreateFile(DirectNTDrvName, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); if (Drv == INVALID_HANDLE_VALUE) printf("Fehler: DirectNT.sys kann nicht geöffnet werden!\n"); DrvExec(Drv,OP_WritePortByte,port,out,0,&dummy,0); if (!CloseHandle(Drv)) printf("Fehler: DirectNT.sys kann nicht geschlossen werden!\n"); return 0; } BYTE __cdecl directin(ULONG port) { BYTE backvalue; Drv = CreateFile(DirectNTDrvName, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); if (Drv == INVALID_HANDLE_VALUE) printf("Fehler: DirectNT.sys kann nicht geöffnet werden!\n"); DrvExec(Drv,OP_ReadPortByte,port,0,0,&backvalue,sizeof(backvalue)); if (!CloseHandle(Drv)) printf("Fehler: DirectNT.sys kann nicht geschlossen werden!\n"); return backvalue; }
Wie im obigen Listing zu erkennen ist, werden die beiden Funktionen directout und directin implementiert, und es finden einige Überprüfungen des installierten Treibers (DirectNT.sys) statt. Neben den Standardbibliotheken wird noch die Datei KDdirectnt.h mit eingebunden, die wie folgt aufgebaut ist: /*************************************************************/ /* KDdirectnt.h */ /* Version 1.0 */ /* Zusaetzlich noch KDdirectnt.obj zum Projekt hinzufuegen. */ /*************************************************************/ #ifndef KD_DIRECTNT_H #define KD_DIRECTNT_H #include <windows.h> int __cdecl directout(ULONG port, BYTE out);
Sandini Bib 1134
Kapitel 35
BYTE __cdecl directin(ULONG port); #endif
Abb. 35.15: Die Erstellung der NTPortIO.dll mit den verwendeten Dateien
Somit ist für die universell einzusetzende DLL die software-technische Schnittstelle für den direkten Portzugriff geschaffen, die nun sehr einfach aufgebaut ist und sich nicht wesentlich von der für Windows 9x unterscheidet. Wie bei der DLL für Windows 9x erläutert, wird noch eine Moduldefinitionsdatei (*.DEF) benötigt. Außerdem ist KDdirect.obj dem Projekt hinzuzufügen, und KDdirectnt.h wird mit einer Include-Anweisung mit eingebunden, wie es auch in Abbildung 35.15 zu sehen ist. /*******************************************************/ /* NTPortIO.dll */ /* Version 1.0, K.D. */ /* */ /******************* KDdirect.h ************************/ /* */ /* KDdirectnt.obj zum Projekt noch hinzufuegen! */ /*******************************************************/ #ifndef KD_DIRECTNT_H #define KD_DIRECTNT_H #include <windows.h> int __cdecl directout(ULONG port, BYTE out); BYTE __cdecl directin(ULONG port); #endif
Sandini Bib Hardware-Programmierung unter Windows
1135
/*******************************************************/ #include "KDdirectnt.h" #include #include #include <windows.h> int _declspec(dllexport) _stdcall PortOut (int PortAdr, int PortData) {int Status=0; Status=directout(PortAdr, PortData); return Status; } int _declspec(dllexport) _stdcall PortIn (int PortAdr) {int Status; Status=directin(PortAdr); return Status; }
Der Vergleich dieser DLL mit der für Windows 9x zeigt, dass der eigentliche Quellcode identisch ist, nur dass hier mittels directout und directin per KDdirectnt.h (bzw. KDdirectnt.obj usw.) mehrere »Softwareschichten« durchlaufen werden (vgl. Abbildung 35.15), was der DLL und erst recht dem Anwenderprogramm völlig egal ist. Dementsprechend kann auch das im vorherigen Abschnitt gezeigte, einfache Visual BASIC-Programm nur durch die Veränderung der beiden Private Declare Function.. -Zeilen für Windows NT verwendet werden.
Abb. 35.16: Diese Version für Windows NT unterscheidet sichvon dem Programm für Visual BASIC unter Windows 9x nur dadurch, dass eine andere DLL (NTPortIO statt PortIO) angegeben wurde.
Im Prinzip hätte die NTPortIO.dll ebenfalls, wie beim Programm für Visual BASIC, mit PortIO.dll bezeichnet und dementsprechend kompiliert werden können, was somit überhaupt keine Veränderung (!) des Visual BASIC- oder auch des Delphi-Programms (hiermit funktioniert es genauso)
Sandini Bib 1136
Kapitel 35
zur Folge gehabt hätte. Aus Gründen der Übersichtlichkeit wurden jedoch unterschiedliche Bezeichnungen für die DLLs verwendet. Sonst kann einem bei der Programmentwicklung aufgrund der zahlreichen einzelnen Dateien nämlich manchmal der Überblick abhanden kommen. Der unbeabsichtigte Fall, dass eine Windows 9x-Programmversion (mit direktem Hardwarezugriff, versteht sich) unter Windows NT ausgeführt wird, hat einen Programmabsturz (Windows NT selbst stürzt natürlich nicht ab) mit einer anschließenden Fehlermeldung wie Die Ausnahme »unknown software exception ...« zur Folge, während eine NT-Programmversion unter Windows 9x scheinbar funktioniert, doch leider völlig unsinnige Daten liefert. Die unterschiedlichen DLLBezeichnungen erleichtern also die notwendige Unterscheidung deutlich und verhindern, dass man nicht doch einmal die falsche DLL erwischt. Ob die Hardware unter Windows 9x oder unter Windows NT angesprochen werden soll und ob mit Visual BASIC oder mit Delphi oder mit einer x-beliebigen anderen Programmiersprache, die DLLs einbinden kann (auch als Makros mit Winword oder Excel denkbar), programmiert werden soll, spielt keine Rolle, wenn man die erläuterten DLLs verwendet.
35.4 Windows-Plug&Play Der erste Betriebssystem von Microsoft, das Plug&Play unterstützt, ist Windows 95 sowie seine Weiterentwicklungen Windows 98 und Windows Millenium. Windows NT 4.0 ist demgegenüber nicht Plug&Play-fähig, kann also neu hinzugefügte Plug&Play-fähige Einheiten nicht automatisch erkennen und konfliktfrei im System einbinden. Den USB, Firewire und AGP-Grafik kennt Windows NT außerdem nicht, was erst – nebst Plug&Play – von den Nachfolgern Windows 2000 und Windows XP geboten wird. An dieser Stelle soll nicht im Detail auf die verschiedenen Windows-internen Plug&Play-Mechanismen eingegangen werden (was ein weiteres Buch füllen würde), sondern es soll lediglich das grundlegende Prinzip verdeutlich werden, also was sich gewissermaßen hinter den Kulissen von Windows abspielt, wenn es um die Kommunikation mit der Hardware geht. In Abbildung 35.17 sind zunächst die einzelnen Bestandteile der HardwareErkennung unter Windows zu sehen. Der Configuration Manager kann als das eigentliche »Herzstück« des Plug&Play-Systems betrachtet werden. Er steuert alle Phasen des Konfigurationsprozesses, überwacht sämtliche Systemnachrichten und leitet diese gegebenenfalls an die entsprechenden Instanzen, beispielsweise einen Treiber, weiter. Ein Hardware Tree bezeichnet dabei grundsätzlich eine organisierte Informationsstruktur innerhalb der Registry. Diese »Registrierungsdatenbank« enthält u.a. Informationen über die zurzeit im System integrierten bzw. angeschlossenen Geräte. Die Registry wird bei jedem Neustart neu initialisiert und im Falle von Hot-Plugging-Geräten (USB, Firewire, Card-Bus) auch zur Laufzeit entsprechend angepasst. Der Hardware-Tree wird vom Configuration-Manager mithilfe von Bus-Enumeratoren aufgebaut. Ein Bus Enumerator stellt in Windows eine spezielle Art von Treiber dar. Seine Funktionsweise und Bedeutung soll hier an einem kleinen Beispiel verdeutlicht werden: Erkennt der Configuration-Manager beim Neustart des PC einen PCI-Bus, so wird er zunächst den PCI-Bus-Enumerator starten. Dieser wird, neben den direkt an den PCI-Bus angeschlossenen Geräten auch eine PCIUSB-Bridge erkennen können und diese Informationen dann an den Configuration-Manager zurückgeben. Dieser startet daraufhin den USB-Bus-Enumerator. Dieser ist erst in der Lage, die USB-Devices detektieren zu können. Denkbar ist natürlich auch eine weitere Verzweigung der Buskette, und für jedes unterstützte Bussystem gibt es im System einen eigenen Bus-Enumerator, die der Reihe nach »abgeklappert« werden.
Sandini Bib Hardware-Programmierung unter Windows
1137
Abb. 35.17: Grundsätzliche Windows-Plug&Play-Architektur
Mit Hilfe des Ressourcen-Arbitrators ist das Betriebssystem in der Lage, die benötigten Ressourcen der einzelnen Geräte zu erkennen und auch selbstständig etwaige Konflikte zu beheben. Damit eine Einheit als Plug&Play-fähig eingestuft werden kann, muss sie mindestens die folgenden Bedingungen erfüllen:
: : :
Sie verfügt über einen Plug&Play-fähigen Treiber. Die Ressourcen dürfen nicht fest verdrahtet oder über DIP-Schalter konfigurierbar sein. Sie kann sich am System anmelden und die jeweils benötigten Ressourcen bekannt geben.
35.5 Programmieren mit dem Windows Driver Model Die Versionen ab Windows 98 einerseits und ab Windows 2000 andererseits können das Windows Driver Model (WDM) verwenden. Die Grundlage dieser Entwicklung stellt das von Windows NT her bekannte Device Driver Model dar, das um Plug&Play- sowie Power-Management-Funktionen erweitert wurde. Zunächst wurden nur Treiber für neuere Einheiten, etwa für Firewire und USB, auf der Basis des WDM in Windows integriert, wobei jedoch nichts dagegen spricht, auch Treiber für andere Hardware-Einheiten WDM-konform zu entwickeln. Eine Treiberentwicklungssoftware mit der Bezeichnung WDM-DDK kann für die Betriebssysteme Windows 98/ ME/2000/XP kostenlos von Microsoft bezogen werden. Mit Hilfe der WDM-DDKs (Device Driver Development Kits) ist es nun erstmals möglich, plattformübergreifende Treiberentwicklungen durchzuführen, so dass beispielsweise ein Gerätetreiber, der für Windows XP entwickelt wurde, auch unter Windows 98 funktioniert. Die DDKs werden zusammen mit Visual Studio (Visual C++) eingesetzt, und es hat sich gezeigt, dass in den meisten Fällen auch tatsächlich eine Quellcode-Kompatibilität der WDM-Treiber gegeben ist. Die für die DDKs notwendigen Systemeinstellungen unterscheiden sich aber zwischen den verschiedenen Betriebssystemen, was daher meist längere (unterschiedliche) Konfigu-
Sandini Bib 1138
Kapitel 35
rationsarbeiten zur Folge hat. In der Praxis fällt auf, dass ein Treiber, der unter Windows 98 mit dem entsprechenden DDK erstellt wurde, erst nach einer Neukompilierung unter XP auch mit Windows XP funktioniert. Am Quellcode ist zwar nichts zu ändern, jedoch steckt der »Teufel« dabei in den Details der unterschiedlichen Systemeinstellungen. Erst wenn diese passend eingestellt wurden, funktioniert auch das Kompilieren und Linken. Ein unter Windows XP mit dem Windows XP-DDK kompilierter Treiber funktioniert jedoch unmittelbar auch unter Windows 98. Zumindest ist dies meine Erfahrung, was darauf schließen lässt, dass man wohl am besten stets das neueste DDK (unter dem passenden Betriebssystem) verwendet, in der Hoffung, dass Microsoft auch eine Abwärtskompatibilität berücksichtigt. WDM-Treiber werden nicht von Windows 95 unterstützt, da hier eine gänzlich andere Treiberstruktur (im Ring 0) zugrunde liegt, die aus den Virtual Device Drivers (VXDs) besteht, so dass diese Technologie für Neuentwicklungen auch nicht mehr zur Anwendung kommen sollte.
Abb. 35.18: Das Zusammenwirken der wichtigsten Komponenten bei der WDM-Architektur
Wie bereits in Kapitel 35.3 erläutert wurde, unterscheidet Windows zwischen zwei Ausführungsebenen. Im User-Mode (Ring 3) werden die Applikationen ausgeführt, während die eigentlichen Systemkomponenten im Kernel-Mode (im Ring 0) ausgeführt werden. Diese beiden Ebenen unterscheiden sich in der Nutzung des Systemspeichers. Die User-Mode-Programme werden in der Protected-Mode-Umgebung gestartet, und das Betriebssystem übernimmt dabei die Speicherverwaltung. Versucht eine Applikation, auf nicht zugewiesene oder von anderen Programmen verwendete Speicherbereiche zuzugreifen, wird dies durch das Betriebssystem unterbunden. Die Bestandteile des Kernels inklusive der Gerätetreiber sind dieser Einschränkung nicht unterworfen. Sie dürfen auf den gesamten Speicherbereich zugreifen. Treiberentwickler müssen sich dessen bewusst sein, denn ein schlecht programmierter Treiber kann im schlimmsten Fall das gesamte Betriebssystem zerstören. Das Betriebssystem Windows teilt zudem den gesamten Systemspeicher in zwei Bereiche auf. Der Nonpaged-Speicher beschreibt einen relativ kleinen Speicherbereich, der vom System nicht auf die Festplatte ausgelagert werden kann und somit ständig zur Verfügung steht. Üblicherweise dürfen die Funktionen des Treibers ausschließlich auf Nonpaged-Speicher zugreifen. Die Win32-Applikationen verwenden hingegen den Paged-
Sandini Bib Hardware-Programmierung unter Windows
1139
Speicher. Dieser vom Betriebssystem verwaltete Speicherbereich kann zu jeder Zeit auf die Festplatte ausgelagert werden (Swapping). Die Treiber werden dynamisch vom Configuration-Manager geladen und in den Systemkern integriert. Ein direkter Zugriff auf die Hardware ist nicht oder nur noch eingeschränkt möglich. Wer sich mit einem Inline-Assembler (siehe Kapitel 35.2.5) näher beschäftigt, wird zwar möglicherweise feststellen, dass es auch unter Windows NT gelingt, direkt auf Ports zuzugreifen. Dies ist aus den genannten Gründen jedoch keineswegs empfehlenswert. Die Interaktion mit der Hardware sollte bei allen neueren Windows-Versionen explizit über die WDM-Treiber stattfinden.
35.5.1 IO Request Packets Die Grundlage jeglicher Kommunikation zwischen einer Anwendung auf der Benutzerebene und dem Treiber bilden die IO Request Packets (IRPs). Dabei handelt es sich, vereinfacht gesagt, um eine interne Datenstruktur, die sämtliche Informationen für den Treiber bereithält, um eine I/O- bzw. Systemanfrage bearbeiten zu können. Ein IRP besteht aus zwei Bereichen (vgl. Abbildung 35.19), einem feststehenden Kopf (IRP Header) und einem Bereich variabler Länge, der eine oder mehrere IO Stack Locations enthält. Der Kopf enthält u.a. die folgenden Parameter:
: : :
Zeiger auf einen Kommunikationsbuffer Informationen über die Art des I/O-Zugriffs Statusinformationen
Jede Stack Location zeigt auf einen Informationstupel, in dem die so genannten Major- und MinorFunctions des IRPs festgelegt sind. Anhand dieser Informationen bestimmt der Treiber, welche Routine er für die Verarbeitung des IRPs aufrufen muss. Führt eine User-Mode-Applikation eine I/O-Abfrage durch, so wird der I/O-Manager zunächst ein IRP im Nonpaged-Speicherbereich zuweisen, und dieses dann an eine Dispatch-Funktion (siehe Kapitel 35.5.4) des Treibers weiterleiten. Die Major/Minor-Functions-Codes im IRP-Header entscheiden anschließend über die weitere Verarbeitung des IRPs.
Abb. 35.19: IRP-Aufbau
Sandini Bib 1140
Kapitel 35
Nach erfolgreicher Bearbeitung des IRPs schreibt der Treiber den aktuellen Status (STATUS SUCCESS) in die Statusvariable des IRP-Stacks. In dem Informationsfeld (Information, vgl. Abbildung 35.19) legt der Treiber fest, wie viele Datenbytes an die Benutzerapplikation des UserMode zurückgegeben werden. Der Treiber ist jedoch auch in der Lage, das IRP für eine weitere Bearbeitung an andere Treiber weiterzuleiten. Dazu bedient er sich des so genannten Driver Stacks. Alle nicht von einem Treiber bearbeiteten IRPs werden auf diese Weise weitergeleitet.
35.5.2 Driver Stack Abbildung 35.20 zeigt den Aufbau eines generischen Driver-Stacks. Der oberste Treiber (highest) ist dabei stets der Gerätetreiber. Ihm folgt der Treiber des Bussystems, an den die Einheit angeschlossen ist. In den meisten PCs wird der unterste Treiber durch den PCI-Bustreiber gebildet. Alle Treiber greifen dabei auf die gleichen Informationen des IRP-Headers zu. Sie verfügen jedoch über individuelle I/O-Stack-Locations, was es dem System ermöglicht, den Informationsgehalt des IRPs dem jeweiligen Treiber anzupassen.
Abb. 35.20: Aufbau des Driver Stack
Eine besondere Bedeutung kommt dem Verfahren der IRP-Verarbeitung durch die Treiberschichten im Power-Management zu. Ändert beispielsweise das Betriebssystem den Systemzustand, um etwa das Herunterfahren des PCs anzuzeigen, wird zunächst eine Power-IRP an den obersten Treiber des Stacks gesendet. Dieser kann daraufhin das entsprechende Gerät auf diesen neuen Zustand vorbereiten. Anschließend wird der Treiber den IRP an die unteren Bereiche des Stacks weiterleiten, um somit die Bustreiber vom neuen Zustand des Gerätes zu unterrichten. Möchte der Treiber in Erfahrung bringen, ob die Verarbeitung des IRPs durch die unteren Schichten des Driver-Stacks erfolgreich war, kann er eine Completion Routine festlegen. Diese wird aufgerufen, sobald das IRP die unteren Treiberschichten durchlaufen hat. Der Treiber ver-
Sandini Bib Hardware-Programmierung unter Windows
1141
fügt hiermit über die Möglichkeit einer Rückmeldung vom Bus-Treiber, um den abschließenden Status der IRP-Verarbeitung feststellen zu können.
35.5.3 Installation Information File Alle WDM-Gerätetreiber werden mit Hilfe von INF-Dateien installiert. Ein Installation Information File enthält Verweise auf die Treiberdateien sowie Angaben über die notwendigen RegistryEinträge und die einmaligen IDs (Vendor ID, Device ID) der jeweiligen Einheit. Eine INF-Datei ist eine ANSI-Textdatei und kann daher im Prinzip mit jedem üblichen Editor bearbeitet werden. Frühere Versionen der DDKs enthielten einen INF-Editor (InfEdit), der menügesteuert die passenden Einträge generieren konnte. Diese Entwicklung wurde von Microsoft jedoch mittlerweile eingestellt. Der Grund hierfür mag darin liegen, dass es mittlerweile zahllose Optionen gibt, die für INF-Dateien zur Anwendung kommen könnten. Außerdem gibt es im Aufbau einer INF-Datei – und bei der Frage, welche Optionen hier gültig sind – auch Unterschiede zwischen den verschiedenen Windows-Betriebssystemen. Deshalb greift man häufig auf die Beispiel-INF-Dateien der DDKs zurück. Der Funktionsumfang von INF-Dateien ist zudem über die Jahre stark erweitert worden. Die realisierten Erweiterungen gestatten die gezielte Anpassung des Installationsvorganges an das jeweilige Windows-Betriebssystem. Demnach wird nur eine einzige INF-Datei für die Installation des Treibers für verschiedene Windows-Versionen benötigt. Leider gibt es jedoch standardmäßig keine Möglichkeit, eine INF-Datei auf Fehler hin zu prüfen oder ein gezieltes Debugging durchzuführen. Ob eine INF-Datei den Erfordernissen des jeweiligen Betriebssystems genügt, zeigt sich somit häufig erst nach praktischen Versuchen. Wer sich einmal eine funktionierende INF-Datei »zusammengebastelt« hat, wird diese in der Regel für neue Einheiten einfach kopieren und die notwendigen Anpassungen eben mit einem Editor vornehmen, denn im Prinzip sind nur einige (relativ) wenige Dinge zu beachten. Im Folgenden ist als Beispiel eine INF-Datei für den erstellten I/O-Treiber angegeben, die sowohl für Windows XP/2000 als auch für Windows 98/Me gültig ist. ; Mst1.Inf - Install Information File fuer I/O-Treiber [Version] Signature="$Chicago$" Class=Unknown Provider=%Provider% DriverVer=03/26/2002,1.0 [Manufacturer] %MFG% = DeviceList [DestinationDirs] DefaultDestDir=10,System32\Drivers [SourceDisksFiles] mst1.sys=1 [SourceDiskNames] 1=%Instdsk% [DeviceList] %mst1%=mst1.install, ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Windows 98, Windows Me [mst1.Install] CopyFiles=mst1.Files.Driver
Sandini Bib 1142
Kapitel 35
AddReg=mst1.AddReg [mst.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,mst1.sys [mst1.Files.Driver] mst1.sys ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Windows 2000, Windows XP [mst1.Install.NT] CopyFiles=mst1.Files.Driver.NT [mst1.Files.Driver.NT] mst1.sys,,,%COPYFLG_NOSKIP% [mst1.Install.NT.Services] AddService = mst1, %SPSVCINST_ASSOCSERVICE%, mst1.Service ; Der Windows 2000 Devive Driver ist als Service zu installieren [mst1.Service] ServiceType StartType ErrorControl ServiceBinary
= = = =
%SERVICE_KERNEL_DRIVER% %SERVICE_DEMAND_START% %SERVICE_ERROR_NORMAL% %10%\System32\Drivers\mst1.sys
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Strings [Strings] Provider="MST" MFG="MST" Instdsk="Datentraeger?" mst1="I/O-Port-Treiber" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Service-Definitionen SPSVCINST_ASSOCSERVICE=0x00000002 COPYFLG_NOSKIP=2 SERVICE_KERNEL_DRIVER=1 SERVICE_AUTO_START=2 SERVICE_DEMAND_START=3 SERVICE_ERROR_NORMAL=1
; ; ; ; ; ; ; ;
Driver Service ist auf die zu installierende Einheit bezogen kein Ueberspringen bei der Installation erlaubt Kernel Mode Driver Start, wenn W2000 bereits arbeitet Manueller Start der Installation Log Error- aber keine Fehleranzeige
Der Aufruf der INF-Datei (I/O-Port-Treiber) und die damit verbundene Installation des Treibers (mst1.sys) erfolgt Windows-konform, d.h., dass die Hardware über den Hardware-Assistenten von Windows zu installieren ist. Genau genommen ist der I/O-Port-Treiber natürlich keine Hardware, gleichwohl soll der Treiber als Einheit in Windows integriert werden, was man sich nach erfolgreicher Installation mithilfe des Geräte-Managers ansehen kann. Nach dem Start des Hardware-Managers ist die Installation über TREIBER ÜBER HARDWARE MANUELL AUS EINER LISTE WÄHLEN einzuleiten und über ANDERE KOMPONENTEN (Windows 98) fortzufahren, woraufhin man im letzten Schritt auf den jeweiligen Datenträger wechselt, wo sich der SYS-Treiber befindet, was üblicherweise der gleiche Ort sein wird, von wo auch die INF-Datei aufgerufen worden ist. Damit ist die Treiberinstallation abgeschlossen, und im Geräte-Manager ist der I/O-Port-Treiber unter ANDERE GERÄTE zu finden.
Sandini Bib Hardware-Programmierung unter Windows
1143
Abb. 35.21: Installation des Treibers bei Windows XP. Der Treiber ist nicht digital signiert.
35.5.4 WDM-Beispieltreiber Die grundsätzlichen WDM-Zusammenhänge sind in den vorherigen Kapiteln erläutert worden. Damit wird man allerdings noch nicht in der Lage sein, einen Gerätetreiber mit einem DDK erstellen zu können. Der Umgang mit Visual C++ und den DDKs kann hier natürlich nicht ausführlich erläutert werden, allerdings wird im Folgenden der Aufbau des bereits erwähnten I/OPort-Treibers gezeigt, der WDM-konform ausgelegt ist und demnach Portzugriffe unter Windows 98/Me sowie Windows 2000/XP ermöglicht. Für das Verständnis sind zunächst noch einige wichtige Dinge zu klären, wobei die Erläuterungen in den folgenden Unterkapiteln aber recht knapp gehalten sind, weil die speziellen WDM-Optionen und Windows-Funktionen ohnehin nicht ausführlich »beleuchtet« werden können. Die Erläuterungen sollten jedoch ausreichen, um zu verstehen, wie ein einfacher Gerätetreiber funktioniert und wie man software-technisch auf ihn zugreifen kann. Da einfach zu viele spezielle Windows-Programmiereigenschaften von Belang sind, nimmt man in der Praxis daher am besten den Quellcode eines funktionierenden Treibers und passt diesen an die jeweilige Hardware an. Man muss sich als (traditioneller) Hardware-Programmierer, der Windows-Treiber zu schreiben hat, offensichtlich daran gewöhnen, bestimmte Funktionen und Codes einfach so zu übernehmen, wie Microsoft dies vorgibt, ohne genau zu wissen, was diese eigentlich bewirken oder ob es vielleicht nicht auch anders (und einfacher?) geht. Die Zeiten, wo man quasi von der Anwendung bis auf das letzte Bit eines Hardware-Registers blicken und auch genau nachvollziehen konnte, was dabei im Einzelnen abläuft, sind spätestens bei der Windows-Hardware-Programmierung vorbei. Device Objects Wichtig sind zunächst logische Treiber, die als Physical Device Objects (PDOs) und Functional Device Objects (FDOs) bezeichnet werden. Ein PDO stellt einen Bustreiber dar, während ein FDO die Steuerung der jeweiligen Einheit definiert. Ein Physical Device Object repräsentiert eine Einheit in Verbindung mit einem bestimmten Bus (z.B. PCI). Dieses Objekt wird während der Enumeration vom jeweiligen Bustreiber (Root Bus Driver) angelegt, und es existiert so lange, wie es mit diesem Bus verbunden ist. Die Plug&Play-
Sandini Bib 1144
Kapitel 35
sowie auch die Power-Management-Funktionalität ist Bestandteil des Physical Device Object und somit bussystem-abhängig. Ein Functional Device Object (FDO) bildet die Steuerungsfunktionalität der Einheit und wird vom Function Driver erzeugt. FDOs sind logisch stets oberhalb der PDOs angesiedelt und betreffen unmittelbar die Einheit selbst. Treiberfunktionen Ein einfacher Treiber muss die folgenden Eigenschaften aufweisen bzw. Funktionen implementieren:
: : :
Einsprung in DriverEntry: Treiberinitialisierung, Definition der DriverObjects für die Behandlung der IRPs Erstellen des FDOs: Pointer auf DriverObject, Pointer auf das PDO Dispatcher-Routinen: Behandlung der IRPs, Pointer auf FDO, Pointer auf IRP
Der DriverEntry-Code bildet den Einsprungspunkt vom Betriebssystem her in den Treiber. Hier wird ein Zeiger (PDRIVER_Object) auf das DriverObject übergeben. Optional kann über den Registry Path die Speicherung spezieller Treiber-Parameter initiiert werden, was hier aber nicht von Belang sein soll. Wichtig sind hingegen die Definitionen der I/O Request Packets (IRPs), die – wie bereits erläutert – die Grundlage der Kommunikation des Betriebssystems (User-Mode, Win32) mit den KernelMode-Treibern bilden. Das DriverObject-Array realisiert verschiedene Funktionszeiger mit der Bezeichnung MajorFunction und unterschiedlichen IRP-Konstanten, die im DDK definiert sind. DriverExtension und DriverUnload verweisen dabei auf das Hinzufügen (AddDevice) und das Entladen des Treibers (DriverUnload). Win32-Funktion
IRP
CreateFile CloseHandle ReadFile WriteFile DeviceIoControl
Create IRP Close IRP Read IRP Write IRP IOCTL IRP
Tab. 35.6: Die Verbindung zwischen Win32- und Kernel-Routinen
Was sich jeweils hinter den DriverObject-Pointern befindet, also die Behandlungsroutinen, firmiert unter Dispatcher-Funktionen, die dann den jeweiligen Programmcode für die einzelnen Funktionen bilden. Im folgenden Listing sind unter DriverEntry die DriverObjects für die Behandlung der IRPs angegeben, die dann weiter unten bei den Dispatch-Routinen entsprechend ausgeführt werden. Die IRPs für Plug&Play (IRP_MJ_PNP) und das Power-Management (IRP_MJ_POWER) werden hier allerdings nicht implementiert, weil sie für den I/O-Port-Treiber nicht benötigt werden. Sie zählen jedoch zu den Standard-IRPs, die in Abhängigkeit von der zu verwendeten Einheit ebenfalls zu implementieren sind. Globally Unique Identifier Mithilfe des Configuration-Managers oder auch durch den manuellen Anstoß der DriverEntryFunktion wird eine Einheit dem System bekannt gemacht, was dann meist durch die Ausführung des AddDevice-Codes erfolgt. Eine Applikation, die später auf diese Einheit zugreifen soll, kennt dadurch jedoch noch nicht deren Existenz. Diese logische Verbindung wird erst durch
Sandini Bib Hardware-Programmierung unter Windows
1145
einen so genannten symbolischen Link (symbolic link) hergestellt. Das heißt, dass jede für Win32 »sichtbare« Einheit über einen derartigen einmaligen Link verfügt. Üblicherweise wird dieser Link mithilfe eines Globally Unique Identifier (GUID) realisiert. Alternativ sind auch symbolic names anwendbar, was hier jedoch nicht praktiziert wird, zumal diese Methode laut Microsoft für Neuentwicklungen nach Möglichkeit nicht verwendet werden soll. Für einen Gerätetreiber bedeutet dies, dass Win32-Anwendungen über GUIDs gewissermaßen den DeviceObject-Typ »kennen lernen« und dass erst daraufhin eine Kommunikation zwischen dem User- und dem Kernel-Mode (dem Treiber) stattfinden kann. Der GUID ist eine mehrstellige Nummer (128 Bits), die man sich von einem speziellen Tool (guidgen) erzeugen lassen kann. Diese Nummer taucht im Treiber als SymLinkName (z.B. im IORegisterDeviceInterface) auf und wird in der Applikation direkt oder auch über eine Header-Datei (Guid.h) implementiert. Dieser Symbolic-Link ist somit für eine Einheit einzigartig. Listing des Treibers Es wurde bereits erwähnt, dass die Funktionen eines Treibers ausschließlich auf Nonpaged-Speicher zugreifen können und nur die Win32-Applikationen den Paged-Speicher verwenden, der unter der Verwaltung des Betriebssystems steht. Demnach sind im Treiber entsprechende Buffer zu reservieren, deren Speicherraum keinesfalls von anderen Funktionen genutzt werden darf. Diese Art der Reservierung von Speicherraum wird als Spin Lock bezeichnet und im Treiber entsprechend angewendet. Die Device-Extensions dienen ganz allgemein der Speicherung von Variablen, die quasi innerhalb des DeviceObject angelegt und daraufhin verwendet werden können. Prinzipiell ist es möglich, beliebige Daten in diesem Bereich abzulegen. ///////////////////////////////////////////////////////////////////////// // mst1.cpp: Treiber-Code ///////////////////////////////////////////////////////////////////////// #define INITGUID #include "mst1.h" #include "Ioctl.h"
//GUID initialisieren
// Buffer im Nonpaged-Speicherbereich KSPIN_LOCK BufferLock; PUCHAR Buffer = NULL; ULONG BufferSize = 0; ///////////////////////////////////////////////////////////////////////// // DriverEntry: // // Treiber initialisieren und Objekte fuer IRPs festlegen // Pointer auf DriverObject extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { NTSTATUS status = STATUS_SUCCESS; DriverObject->DriverExtension->AddDevice = Mst1AddDevice; DriverObject->DriverUnload = Mst1Unload; DriverObject->MajorFunction[IRP_MJ_CREATE] = Mst1Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Mst1Close; DriverObject->MajorFunction[IRP_MJ_READ] = Mst1Read; DriverObject->MajorFunction[IRP_MJ_WRITE] = Mst1Write; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Mst1DeviceControl;
Sandini Bib 1146
Kapitel 35
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = Mst1SystemControl; // Speicherbereich schuetzen (Spin Lock) KeInitializeSpinLock(&BufferLock); return status; } ///////////////////////////////////////////////////////////////////////// // Mst1AddDevice: // // Einheit hinzufuegen // Pointer auf Driver Object und Pointer auf PDO NTSTATUS Mst1AddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { NTSTATUS status; PDEVICE_OBJECT fdo; // FDO erstellen status = IoCreateDevice (DriverObject, sizeof(MST1_DEVICE_EXTENSION), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo); if( !NT_SUCCESS(status)) return status; // FDO fuer Device Extension PMST1_DEVICE_EXTENSION dx = (PMST1_DEVICE_EXTENSION) fdo->DeviceExtension; dx->fdo = fdo; // Device registrieren und aktivieren status = IoRegisterDeviceInterface(pdo, &MST1_GUID, NULL, &dx->ifSymLinkName); if( !NT_SUCCESS(status)) { IoDeleteDevice(fdo); return status; } IoSetDeviceInterfaceState(&dx->ifSymLinkName, TRUE); // Auf Driver Stack dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo,pdo); // Setzen der FDO-Flags fdo->Flags |= DO_BUFFERED_IO|DO_POWER_PAGABLE; fdo->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; } ///////////////////////////////////////////////////////////////////////// // Dispatch-Routinen ///////////////////////////////////////////////////////////////////////// // Mst1Unload // // Entladen des Treibers // Pointer auf Driver Object VOID Mst1Unload(IN PDRIVER_OBJECT DriverObject) { if( Buffer!=NULL) ExFreePool(Buffer); } ///////////////////////////////////////////////////////////////////////// // Mst1Create:
Sandini Bib Hardware-Programmierung unter Windows
// // //
Handle fuer IRP_MJ_CREATE Pointer zum FDO und Pointer zum IRP
NTSTATUS Mst1Create( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); return CompleteIrp(Irp,STATUS_SUCCESS,0); } ///////////////////////////////////////////////////////////////////////// // Mst1Close: // // Handle fuer IRP_MJ_CLOSE NTSTATUS Mst1Close( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { return CompleteIrp(Irp,STATUS_SUCCESS,0); } ///////////////////////////////////////////////////////////////////////// // Mst1Read: // // Handle fuer IRP_MJ_READ // Pointer zum FDO und Pointer zum IRP // Verwendete Buffer: // AssociatedIrp.SystemBuffer (buffered I/O) // MdlAddress (direct I/O) NTSTATUS Mst1Read( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); NTSTATUS status = STATUS_SUCCESS; LONG BytesTxd = 0; PVOID oBuffer; // Communication-Buffer LONGLONG IOSize = 0x3FF; // oberes I/O-Limit // Parameter-Aufruf LONGLONG FilePointer = IrpStack ->Parameters.Read.ByteOffset.QuadPart; LONG FilePointer_LOW = IrpStack ->Parameters.Read.ByteOffset.LowPart; ULONG ReadLen = IrpStack->Parameters.Read.Length; oBuffer
= Irp->AssociatedIrp.SystemBuffer;
// File-Pointer pruefen if( FilePointer_LOW + ReadLen > IOSize) status = STATUS_END_OF_FILE; // IO-Block lesen if( status==STATUS_SUCCESS) { ((PUSHORT) oBuffer)[0] = 1; BytesTxd = ReadLen; }
1147
Sandini Bib 1148
Kapitel 35
return CompleteIrp(Irp,status,BytesTxd); } ///////////////////////////////////////////////////////////////////////////// // Mst1Write: // // Handle fuer IRP_MJ_WRITE // Pointer zum FDO und Pointer zum IRP // Verwendete Buffer: // AssociatedIrp.SystemBuffer (buffered I/O) // MdlAddress (direct I/O) NTSTATUS Mst1Write( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); NTSTATUS status = STATUS_SUCCESS; LONG BytesTxd = 0; PVOID iBuffer; // Communication-Buffer LONGLONG IOSize = 0x3FF; // Oberes I/O-Limit // Parameter-Aufruf LONGLONG FilePointer = IrpStack ->Parameters.Write.ByteOffset.QuadPart; ULONG WriteLen = IrpStack->Parameters.Write.Length; LONG FilePointer_LOW = IrpStack ->Parameters.Read.ByteOffset.LowPart; iBuffer = Irp->AssociatedIrp.SystemBuffer; // File-Pointer pruefen if( FilePointer_LOW + WriteLen > IOSize) status = STATUS_END_OF_FILE; // IO-Block schreiben if( status==STATUS_SUCCESS) { BytesTxd = WriteLen; } return CompleteIrp(Irp,status,BytesTxd); } ///////////////////////////////////////////////////////////////////////// // Mst1DeviceControl: // // Handle fuer IRP_MJ_DEVICE_CONTROL // Pointer zum FDO und Pointer zum IRP // Verwendete Buffer: // AssociatedIrp.SystemBuffer (buffered I/O) // MdlAddress (direct I/O) // iBuffer und oBuffer fuer ISR NTSTATUS Mst1DeviceControl( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); NTSTATUS status = STATUS_SUCCESS; ULONG BytesTxd = 0; PVOID iBuffer, oBuffer; PHYSICAL_ADDRESS PortBase; USHORT usdata; UCHAR ucdata;
Sandini Bib Hardware-Programmierung unter Windows
1149
ULONG ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; ULONG InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; iBuffer = Irp->AssociatedIrp.SystemBuffer; oBuffer = iBuffer; // Zur IOCTL-Handling-Routine schalten switch( ControlCode) { // 16 Bit lesen case IOCTL_READ16: PortBase.LowPart = (ULONG) ((PUSHORT) iBuffer)[0]; // untere Adresse setzen PortBase.HighPart = 0; // obere Adresse setzen ((PUSHORT)oBuffer)[0] = READ_PORT_USHORT((PUSHORT)PortBase.LowPart); // Wert lesen BytesTxd = 2; break; // 16 Bit schreiben case IOCTL_WRITE16: PortBase.LowPart = (ULONG) ((PUSHORT) iBuffer)[0]; // untere Adresse setzen PortBase.HighPart = 0; // obere Adresse setzen usdata = ((PUSHORT) iBuffer)[1]; WRITE_PORT_USHORT((PUSHORT)PortBase.LowPart, usdata ); // Wert schreiben BytesTxd = 0; break; // 8 Bit lesen case IOCTL_READ8: PortBase.LowPart = (ULONG) ((PUSHORT) iBuffer)[0]; // untere Adresse setzen PortBase.HighPart = 0; // obere Adresse setzen ((PUCHAR)oBuffer)[0] =READ_PORT_UCHAR((PUCHAR)PortBase.LowPart); // Wert schreiben BytesTxd = 1; break; // 8 Bit schreiben case IOCTL_WRITE8: PortBase.LowPart = (ULONG) ((PUSHORT) iBuffer)[0]; // untere Adresse setzen PortBase.HighPart = 0; // obere Adresse setzen ucdata = ((PUCHAR) iBuffer)[2]; WRITE_PORT_UCHAR((PUCHAR)PortBase.LowPart, ucdata ); // Wert schreiben BytesTxd = 0; break; // Ungueltiger Request default: status = STATUS_INVALID_DEVICE_REQUEST; } return CompleteIrp(Irp,status,BytesTxd); } /////////////////////////////////////////////////////////////////////////
Sandini Bib 1150
// // // //
Kapitel 35
Mst1SystemControl: Handle fuer IRP_MJ_SYSTEM_CONTROL Pointer zum FDO und Pointer zum IRP
NTSTATUS Mst1SystemControl( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { // Uebergabe auf untere Stack-Location IoSkipCurrentIrpStackLocation(Irp); PMST1_DEVICE_EXTENSION dx = (PMST1_DEVICE_EXTENSION)fdo->DeviceExtension; return IoCallDriver( dx->NextStackDevice, Irp); } ///////////////////////////////////////////////////////////////////////// // CompleteIrp // Setzt den IO-Status und beendet das IRP NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info) { Irp->IoStatus.Status = status; Irp->IoStatus.Information = info; IoCompleteRequest(Irp,IO_NO_INCREMENT); return status; }
In der Routine Mst1DeviceControl sind die beiden I/O-Port-Funktionen implementiert, um 8- oder 16-Bit-Werte über Ports schreiben und lesen zu können. Diese Funktionen werden demnach über Device-I/O-Controls abgewickelt, wie es auch im folgenden Beispielprogramm als Anwendung des mst1.sys-Treibers zu erkennen ist. Als alternative Methode könnten auch WriteFile und ReadFile (vgl. Tabelle 35.6) für den Zugriff auf Devices und/oder Ports verwendet werden. Die Anwendung der Device-I/O-Controls erscheint demgegenüber jedoch flexibler, da hiermit stets zwei bidirektionale Kommunikationskanäle gebildet werden und verschiedenste Funktionen (in einer Befehlszeile) anwendbar sind. Das WDM-DDK beinhaltet keinen Compiler. Entsprechend der Installationsanleitung von Microsoft muss deshalb mindestens Visual C++ in der Version 6.0 installiert sein, am besten plus aktuellem Service-Pack. Erst danach ist das DDK zu installieren. Übersetzt wird der Treiber durch einen Aufruf des im DDK enthaltenen Programms build.exe. Dieses Tool ist im Prinzip mit dem nmake-Befehl vergleichbar, der für die Erstellung herkömmlicher Programme (*.exe) verwendet wird, wohingegen build eben bei der Erstellung von Treibern (*.sys) zum Einsatz kommt. build ähnelt in seiner Funktionsweise auch dem make-Befehl unter Unix/Linux. Entsprechende Parameter vorausgesetzt, sucht build den aktuellen Verzeichnisbaum nach Treiberdateien ab und kompiliert und linkt diese bei Bedarf. Bevor der Treiber übersetzt werden kann, müssen einige Systemparameter eingestellt werden. Es hat sich dabei als praktikabel erwiesen, diese Einstellungen und den Aufruf von build.exe in einer Batchdatei zusammenzufassen, die im Projekt als Ressourcendatei angelegt wird. Nach einer entsprechenden Anpassung kann die einmal erstellte Batchdatei auch für spätere Arbeiten verwendet werden. Das Build-Tool kann ausschließlich Sys-Files erzeugen, wobei der Quellcode aber wie üblich unter Visual C++ zu erstellen ist. Wenn man ein neues Projekt für eine Treiberentwicklung anlegt, sollte man daran denken, dass hier keine Exe-, sondern eine Sys-Datei »herauskommen« soll, so dass als Projekt-Typ daher Makefile zu selektieren ist.
Sandini Bib Hardware-Programmierung unter Windows
1151
In der Header-Datei mst1.h finden sich die grundlegenden WDM-Festlegungen (Device Extension, Spin Lock, Forward Declarations, GUID und WDM-Header einbinden), die standardmäßig für das Linken eines C-Treiber-Codes notwendig sind. ///////////////////////////////////////////////////////////////////////// // mst1.h WDM-Standard-Header #ifdef __cplusplus extern "C" { #endif #include "wdm.h" #ifdef __cplusplus } #endif ///////////////////////////////////////////////////////////////////////// // Einbinden der GUID #include "GUIDs.h" ///////////////////////////////////////////////////////////////////////// // Spin lock, Speicher-Zugriffsschutz extern KSPIN_LOCK BufferLock; extern PUCHAR Buffer; ///////////////////////////////////////////////////////////////////////// // Device Extension typedef struct _MST1_DEVICE_EXTENSION { PDEVICE_OBJECT fdo; PDEVICE_OBJECT NextStackDevice; UNICODE_STRING ifSymLinkName; } MST1_DEVICE_EXTENSION, *PMST1_DEVICE_EXTENSION; ///////////////////////////////////////////////////////////////////////// // Forward-Deklarationen der globalen Funktionen VOID Mst1Unload(IN PDRIVER_OBJECT DriverObject); NTSTATUS Mst1AddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo); NTSTATUS Mst1Create( IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS Mst1Close( IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS Mst1Write( IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS Mst1Read( IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS Mst1DeviceControl( IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS Mst1SystemControl( IN PDEVICE_OBJECT fdo, IN PIRP Irp); ///////////////////////////////////////////////////////////////////////// NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info);
Sandini Bib 1152
Kapitel 35
Die Header-Datei Ioctl.h enthält ausschließlich die Definitionen der I/O-Controls für den Portzugriff in 8-Bit- und 16-Bit-Breite. Die 0x801–0x804-Werte stellen dabei Funktionsnummern dar (es sind also keine Adressen), die Microsoft standardmäßig für die Identifizierung von WDM-I/OControls vorgesehen hat. Diese Nummern könnten prinzipiell auch für andere Funktionen von I/O-Controls eingesetzt werden. // IOCTL-Codes #define IOCTL_READ16 CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ 0x801, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_WRITE16 CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ 0x802, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_READ8 CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ 0x803, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_WRITE8 CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ 0x804, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS)
Debugging und Anwendung Ein Treiber muss natürlich getestet werden, bevor man ihn für eine Applikation einsetzen kann. Bereits bei der Erstellung eines Treibers werden Debug-Informationen benötigt, um auftretende Fehler feststellen und beheben zu können. Dies ist bei einem Treiber, der schließlich im Ring 0 arbeitet, längst nicht so einfach, wie bei einem üblichen Programm, weil auftretende Fehler im Kernel-Mode unmittelbar die Stabilität des Systems gefährden. Für das – mehr oder weniger sichere – Debugging gibt es sowohl von Microsoft (WinDbg) als auch von anderen Herstellern verschiedene Lösungen, wofür oftmals zwei PCs über eine serielle Schnittstelle miteinander verbunden werden. Ein PC fungiert dabei als Client, hier wird zu testende Code abgearbeitet, und der andere als Host. Mithilfe der Debugger-Software, die dementsprechend in einen DebugHost- und einen Debug-Client-Teil separiert wird, arbeitet der Client mit dem »neuen« Treiber unter der Kontrolle (Single-Step, Breakpoints etc.) des Host-Systems. Der Umgang mit einem derartigen System erfordert doch einiges an Erfahrung und am TreiberCode sind auch einige Anpassungen für den jeweiligen Debugger vorzunehmen. Schneller kommt man wahrscheinlich mit dem Programm DebugView zurecht, welches zudem Freeware ist und beispielsweise von der Sysinternals-Internet-Seite bezogen werden kann. DebugView ist in der Lage die Debug-Ausgaben des Treibers zu visualisieren. Dazu ist innerhalb des Treibers die Kernel-Funktion DbgPrint() auszuführen. Ihre Funktionsweise ist vergleichbar mit dem print()-Befehl. Die Ausgabe wird durch DebugView abgefangen und in einem Fenster sichtbar gemacht. DebugView ist auch in der Lage die entsprechenden Treiberausgaben zu filtern, so dass damit sogar eine gezielte Suche nach bestimmten Systemereignissen möglich ist. Die DebugAusgaben können zudem über die serielle Schnittstelle, oder ein Netzwerk mit TCP/IP an einen zweiten PC weitergeleitet werden. Der vorgestellte Treiber (mst1.sys) ist mit Unterstützung von
Sandini Bib Hardware-Programmierung unter Windows
1153
DebugView entsprechend analysiert und getestet worden, die DbgPrint-Kommandos sind allerdings nicht mehr im Listing enthalten, damit es nicht zu unübersichtlich wird. Im Folgenden ist ein Testprogramm (mstapp1.cpp) angegeben, welches den Treiber für einfache 8- und 16-Bit I/O-Operationen verwendet. Der erste Schritt ist es die Einheit mit der definierten GUID (in GUIDs.h) zu suchen, die jeweiligen Interface-Daten sowie die Link-Informationen zu ermitteln und das Interface zu öffnen, was über GetDeviceViaInterface erfolgt. Die einzelnen Schritte werden dabei über entsprechende Meldungen angezeigt. Dies ist eine Standard-Prozedur, wie sie im Grunde genommen für jede Applikation benötigt wird, die auf den Treiber (die Einheit) zugreifen soll. ///////////////////////////////////////////////////////////////////////// // mstapp1.cpp Testprogramm fuer Treiber mst1.sys ///////////////////////////////////////////////////////////////////////// #include "windows.h" typedef unsigned long *ULONG_PTR; typedef DWORD *DWORD_PTR; #define MAX_BUFF_SIZE 0x0008 #include #include #include #include #include #include
"d:\winddk\2505\inc\win_me\setupapi.h" "stdio.h" "initguid.h" "..\sys\GUIDs.h" "winioctl.h" "..\sys\Ioctl.h"
///////////////////////////////////////////////////////////////////////// // Einheit suchen und initialisieren HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance) { // Handle auf das Device HDEVINFO info = SetupDiGetClassDevs( pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if ( info == INVALID_HANDLE_VALUE) { printf(" Einheit nicht gefunden"); return NULL; } // Interface-Daten lesen SP_INTERFACE_DEVICE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); if(!SetupDiEnumDeviceInterfaces( info, NULL, pGuid, instance, &ifdata)) { printf("Keine Interface-Daten gefunden\n");+ SetupDiDestroyDeviceInfoList(info); return NULL; } // Groesse des Symbolic-Links ermitteln DWORD ReqLen; SetupDiGetDeviceInterfaceDetail( info, &ifdata, NULL, 0, &ReqLen, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) (new char[ReqLen]); if(ifDetail == NULL) { SetupDiDestroyDeviceInfoList(info); return NULL; }
Sandini Bib 1154
Kapitel 35
// Name des Symbolic-Links ermitteln und oeffnen ifDetail->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL)) { SetupDiDestroyDeviceInfoList(info); delete ifDetail; return NULL; } printf(" Symbolic Link ist: %s", ->DevicePath); HANDLE rv = CreateFile(ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Loeschen bei Fehler delete(ifDetail); SetupDiDestroyDeviceInfoList(info); return rv; } ///////////////////////////////////////////////////////////////////////// // Testfunktionen int main(int argc, char* argv[]) { printf("\nMST-APP1\n"); // Einheit oeffnen, Open Device printf("\nInit Handler:"); HANDLE hMst1 = GetDeviceViaInterface((LPGUID)&MST1_GUID,0); if( hMst1==NULL) { printf("MST1 kann nicht geoffnet werden\n"); return 1; } printf(" OK geoeffnet\n"); // IOCTL TEST: lesen und schreiben ueber IO-Controls GLOBALHANDLE hBuff_in, hBuff_out; PUCHAR ucBuff_in, ucBuff_out; PUSHORT usBuff_in, usBuff_out;
//Buffer-Definitionen
hBuff_in = GlobalAlloc(GHND, MAX_BUFF_SIZE); ucBuff_in = (PUCHAR)GlobalLock(hBuff_in); usBuff_in = (PUSHORT)GlobalLock(hBuff_in); hBuff_out = GlobalAlloc(GHND, MAX_BUFF_SIZE); ucBuff_out= (PUCHAR)GlobalLock(hBuff_out); usBuff_out= (PUSHORT)GlobalLock(hBuff_out); ULONG BytesReturned; // IOCTL_WRITE8 usBuff_in[0] = 0x080; // Adresse ucBuff_in[2] = 0x12; // Daten printf("\nIOCTL_WRITE_8:\n"); if( !DeviceIoControl( hMst1, IOCTL_WRITE8, usBuff_in, 4, usBuff_out, sizeof(USHORT), &BytesReturned, NULL)) printf("Fehler: 8 Bit schreiben\n");
Sandini Bib Hardware-Programmierung unter Windows
1155
else printf("12h auf Adresse 80h geschrieben\n"); // IOCTL_READ8 usBuff_in[0] = 0x080; // Adresse printf("\nIOCTL_READ_8:"); if( !DeviceIoControl( hMst1, IOCTL_READ8,usBuff_in, sizeof(USHORT), usBuff_out, sizeof(USHORT), &BytesReturned, NULL)) printf("Fehler: 8 Bit lesen\n"); else printf("Wert: %4X", usBuff_out[0]); // IOCTL_WRITE16 usBuff_in[0] = 0x278; // LPT2 usBuff_in[1] = 0x1234; // Daten printf("\nTest %d: IOCTL_WRITE16 access\n",TestNo++); if( !DeviceIoControl( hMst1, IOCTL_WRITE16, usBuff_in, 4, usBuff_out, sizeof(USHORT), &BytesReturned, NULL)) printf("Fehler: 16 Bit schreiben\n"); else printf("1234h auf Adresse 278h geschrieben\n"); // IOCTL_READ16 usBuff_in[0] = 0x278; printf("\nIOCTL_READ_16:");
// LPT2
if( !DeviceIoControl( hMst1, IOCTL_READ16,usBuff_in, sizeof(USHORT), usBuff_out, sizeof(USHORT), &BytesReturned, NULL)) printf("Fehler: 16 Bit lesen\n"); else printf("Wert: %4X", usBuff_out[0]); }
Als Testfunktionen werden 8- sowie 16-Bit Schreib- und Lesezugriffe über I/O-Controls absolviert, was ebenfalls bei der Programmausführung durch eine entsprechende Anzeige am Monitor zu erkennen ist. Zu beachten ist dabei in welcher Form die definierten Buffer in den DeviceIoControlAufrufen verwendet werden, da hier stets eine bidirektionale Kommunikation (Eingangswert, Ausgangswert) mit jeweils zwei Buffern stattfindet. Während das Lesen von Ports in der Regel keine Gefahr darstellt, muss man beim Schreiben jedoch genau wissen, welche Ports bzw. Register der PC-Hardware angesprochen werden, damit man den PC nicht aus Versehen »abschießt«. Im Treiber ist 3FFh als höchste erlaubte Adresse festgelegt, da die Belegung dieses I/O-Bereiches nun einmal (laut ISA) recht genau definiert ist. Für das Schreiben von 8-Bit-Daten wird hier als Beispiel die Adresse 80h verwendet, die als Standardadresse für den Empfang von POST-Codes gilt. Wer im Besitz einer derartigen Karte ist, kann auf der Anzeige der Karte den Erfolg der Operationen unmittelbar ablesen. Für 16-Bit-Zigriffe wurde die Adresse 278h gewählt, die üblicherweise für den zweiten ParallelPort reserviert ist. Ein 16-Bit-Zugriff auf diese Adresse liefert daher im Prinzip unsinnige Werte, was für einen grundsätzlichen Funktionstest aber nicht von Bedeutung sein sollte, weil man die I/O-Adresssen seiner zu programmierenden Hardware (z.B. einer ISA-Karte) schließlich kennen muss. Statt den hier verwendeten Adressen 278h und 80h sind dann die jeweils gewünschten festzulegen. Sowohl der Treiber als auch eine hierfür passende Applikation kann natürlich auch
Sandini Bib 1156
Kapitel 35
auf 32-Bit-Zugriffe, sowie auf Plug&Play-Devives und Power-Management-Funktionen erweitert werden, was jedoch den in diesem Buch gesteckten Rahmen sprengen würde. Gleichwohl zeigt der Beispieltreiber und die Applikation wie eine WDM-konforme Programmierung unter Windows auszusehen hat, und wer das Prinzip dabei verstanden hat, den werden auch die erwähnten Erweiterungen nicht abschrecken. In diesem Zusammenhang wird immer wieder gern und häufig argumentiert, dass in den DDKs und auf den CDs oder DVDs des Microsoft Developer Networks (MSDN) eine Vielzahl von Beispielen zu finden sind. Dies ist zwar richtig, allerdings macht es Microsoft dem Anwender nicht eben gerade leicht in diese spezielle Technologie – die scheinbar auch viel zu schnell Veränderungen unterworfen ist – einzusteigen. Dieses Kapitel sollte aber zumindest den praktischen Einstieg aufgezeigt haben.
Sandini Bib
Anhang A
ASCII- und Tastencodes
A.1
ASCII-Tabelle
Die folgende Auflistung zeigt die ASCII-Codes von 0 bis 127 sowie die die erweiterten ASCIICodes von 128 bis 255. Den Werten 0 bis 31 sind Steuercodes zugeordnet; sie werden daher gesondert aufgeführt. Jeder Code ist in dezimaler (dez) und hexadezimaler Form (hex) zusammen mit dem standardmäßig zugeordneten Zeichen (chr) aufgeführt. Strg
dez
hex
chr
Code Bezeichnung
^@ ^A ^B
0 1 2
00 01 02
_
NUL SOH
^C
3
03
^D
4
04
^E
5
05
^F
6
06
^G ^H ^I ^J ^K ^L ^M ^N ^O ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b
Null Character Start of Header
Null-Zeichen Kopfbeginn
STX
Start of Text
Textbeginn
♥ ♦ ♣ ♠
ETX
End of Text
Textende
EOT
End of Transmission
Ende der Übertragung
ENQ
Enquiry
Abfrage
ACK
Acknowledge
Rückmeldung
. .
BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC
Bell Backspace Horizontal Tabulation Line Feed Vertical Tabulation Form Feed Carriage Return Shift Out Shift In Data Link Escape Device Control 1 Device Control 2 Device Control 3 Device Control 4 Negative Acknowledgement Synchronous Idle End of Transmission Block Cancel End of Medium Substitute Escape
Glocke Rückschritt Horizontaltabulator Zeilenvorschub Vertikaltabulator Seitenvorschub Wagenrücklauf Breitschrift Engschrift Abbruch der Verbind. Einheitensteuerung 1 Einheitensteuerung 2 Einheitensteuerung 3 Einheitensteuerung 4 negative Rückmeldung synchroner Leerlauf Ende des Übertragungsblocks Stornieren Ende des Mediums Ersetzen
: !! ¶ §
æ
K L J .
Sandini Bib 1158
Anhang A
Strg
dez
hex
chr
Code Bezeichnung
^\ ^] ^^ ^_
28 29 30 31
1c 1d 1e 1f
º
FS GS RS US
dez
hex
chr
dez
hex
chr
dez
hex
chr
dez
hex
chr
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e
! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = >
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e
` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e
| ü é â ä à å ç ê ë è ï î ì Ä Å É Ñ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥
63
3f
?
95
5f
_
127
7f
159
9f
ƒ
5 6
File Separator Group Separator Record Separator Unit Separator
Dateitrenner Gruppentrenner Datensatztrenner Einheitentrenner
°
Sandini Bib ASCII- und Tastencodes
1159
dez
hex
chr
dez
hex
chr
dez
hex
chr
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf
á í ó ú ñ Ñ ª º ¿ _ ¬ ½ ¼ ¡ « »
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df
º ¿ ¾ ¼ ¶ À Ï Ð Ë Å Ú × Ñ Á Ý Ø Ù Õ Ö Ê É Ã Ä Ü Û » ¸ à ß á â Þ
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
ª § ® © ¨ « ¬ ± ² ´ µ ¡ ¦ ¯ £ æ
ã ä å · ½ Ò Ó Ç Æ Ô Â È Î Í Ì ¹
Sandini Bib 1160
A.2 Taste
ESC 1! 2“ 3_ 4$ 5% 6& 7/ 8( 9) 0= ß? '` BKSP TAB Q W E R T Z U I O P Ü +* ENTER ENTER2) Strg li Strg re1) A S D F G H J K L Ö Ä ^° Umsch li
Anhang A
Tastencodes (deutsche Tastaturbelegung) Scancode
ASCII/erweitert ASCII/erweitert mit Umschalt
ASCIIerweitert mit Strg
ASCII/erweitert mit Alt
Dez
Hex
Dez Hex Zeich Dez Hex Zeich Dez Hex Zeich Dez Hex Zeich
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 28 29 29 30 31 32 33 34 35 36 37 38 39 40 41 42
01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1c 1d 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a
27 49 50 51 52 53 54 55 56 57 48 225 39 8 9 113 119 101 114 116 122 117 105 111 112 129 43 13 13
1b 31 32 33 34 35 36 37 38 39 30 e1 27 08 09 71 77 65 72 74 7a 75 69 6f 70 81 2b 0d 0d
97 115 100 102 103 104 106 107 108 148 132 94
61 73 64 66 67 68 6a 6b 6c 94 84 5e
1 2 3 4 5 6 7 8 9 0
æ '
q w e r t z u i o p
¯ +
a s d f g h j k l +
^
27 33 34 21 36 37 38 47 40 41 61 63 96 8 15 81 87 69 82 84 90 85 73 79 80 154 42 13 13
1b 21 22 15 24 25 26 2f 28 29 3d 3f 60 08 0f 51 57 45 52 54 5a 55 49 4f 50 9a 2a 0d 0d
65 83 68 70 71 72 74 75 76 153 142 248
41 53 44 46 47 48 4a 4b 4c 99 8e f8
! “
27
1b
3
03
28
1c
127 148 17 23 5 18 20 26 21 9 15 16 27 29 10 10
7f 94 11 17 05 12 14 1a 15 09 0f 10 1b 1d 0a 0a
1 19 4 6 7 8 10 11 12
01 13 04 06 07 08 0a 0b 0c
NUL
¡ $ % & / ( ) = ? `
Q W E R T Z U
æ O P Ü *
A S D F G H J K L –
ã °
NUL ^Q ^W ^E ^R ^T ^Z ^U ^I ^O ^P
^A ^S ^D ^F ^G ^H ^J ^K ^L
1 120 121 122 123 124 125 126 127 128 129 130 131 14 165 16 17 18 19 20 44 22 23 24 25 26 27 28 28
01 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 0e a0 10 11 12 13 14 2c 16 17 18 19 1a 1b 1c 1c
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL ERW
30 31 32 33 34 35 36 37 38 39 40 41
1e 1f 20 21 22 23 24 25 26 27 28 29
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL
Sandini Bib ASCII- und Tastencodes
1161
Taste
Scancode
ASCII/erweitert ASCII/erweitert mit Umschalt
#' Y X C V B N M ,; .: -_ ÷2) Umsch re Druck x2) Alt li Alt re1) leer CAPS-Lock F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 NUM-Lock NUMLock6) Pause7) Scroll6) POS 1 POS 13) Cursor ob Cursor ob3) Bild ob Bild ob3) -8) Cursor li Cursor li3) 58) Cursor re Cursor re3) +8) Ende
43 44 45 46 47 48 49 50 51 52 53 53 54 55 55 56 56 57 58 59 60 61 62 63 64 65 66 67 68 69 69
2b 2c 2d 2e 2f 30 31 32 33 34 35 35 36 37 37 38 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 45
35 121 120 99 118 98 110 109 44 46 45 47
23 79 78 63 76 62 6e 6d 2c 2e 2d 2f
# y x c v b n m , . – /
39 89 88 67 86 66 78 77 59 58 95 47
27 59 58 43 56 42 4e 4d 3b 3a 5f 2f
42 42
2a 2a
* *
INT 42
32
20
SPC
59 60 61 62 63 64 65 66 67 68
3b 3c 3d 3e 3f 40 41 42 43 44
69 70 71 71 72 72 73 73 74 75 75 76 77 77 78 79
45 46 47 47 48 48 49 49 4a 4b 4b 4c 4d 4d 4e 4f
71 71 72 72 73 73 45 75 75 77 77 43 79
' Y X C V B N M ; : _ /
ASCIIerweitert mit Strg
ASCII/erweitert mit Alt
25 24 3 22 2 14 13
19 18
31 149
1f 95
43 2b 21 15 45 2d 46 2e 47 2f 48 30 49 31 50 32 51 33 52 34 53 35 ERW 164 a4
5h4) 2a *
150
96
ERW
SysReq5) 55 37
NUL
32
20
SPC
32
20
SPC
32
20
SPC
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL
84 85 86 87 88 89 90 91 92 93
54 55 56 57 58 59 5a 5b 5c 5d
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL
94 5e 95 5f 96 60 97 61 98 62 99 63 100 64 101 65 102 66 103 67
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL
104 105 106 107 108 109 110 111 112 113
5e 5f 60 61 62 63 64 65 66 67
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL
47 47 48 48 49 49 2d 4b 4b
NUL ERW NUL ERW NUL ERW – NUL ERW
7 ERW 8 ERW 9 ERW – 4 ERW 5 6 ERW + 1
NUL ERW
151 97
ERW
141 8d 132 84 132 84
ERW NUL ERW
152 98
ERW
153 99
ERW
115 115 143 116 116 144 117
NUL ERW NUL NUL ERW NUL NUL
155 9b
ERW
NUL ERW + NUL
37 47 38 48 39 49 2d 34 4b 35 36 4d 2b 31
119 77 119 77
4d 4d 2b 4f
55 71 56 72 57 73 45 52 75 53 54 77 43 49
157 9d 78 4e
ERW NUL
16 0e 0d
73 73 8f 74 74 90 75
^Y ^X 03 ^C ^V 02 ^B ^N ^M
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL ERW
Sandini Bib 1162
Anhang A
Taste
Scancode
ASCII/erweitert ASCII/erweitert mit Umschalt
ASCIIerweitert mit Strg
ASCII/erweitert mit Alt
Ende3) Cursor un Cursor un3) Bild un Bild un3) Einfg3) Einfg Entf3) Entf < >1) F11 F12
79 80 80 81 81 82 82 83 83 86 87 88
79 80 80 81 81 82 82 83 83 60 133 134
117 145 145 118 118 146 146 147 147
75 91 91 76 76 92 92 93 93
ERW NUL ERW NUL ERW NUL ERW NUL ERW
159 9f
ERW
160 a0
ERW
161 a1
ERW
162 a2
ERW
163 a3
ERW
137 138
89 8a
ERW ERW
139 8b 140 8c
ERW ERW
1)
4f 50 50 51 51 52 52 53 53 56 57 58
4f 50 50 51 51 52 52 53 53 3c 85 86
ERW NUL ERW NUL ERW NUL ERW NUL ERW < ERW ERW
79 50 80 51 81 48 82 44 83 62 135 136
alphanumerischer Block; nur MF II mit Vorsatzbyte 0eh numerischer Block; nur MF II mit Vorsatzbyte 0eh 3) im abgesetzten Steuerblock bei MF II 4) Bildschirmausdruck über INT 05h unter DOS 5) SysReq entsprechend INT 15h, Funktion 85h 6) MF II mit Vorsatzbyte e0h 7) nur MF II mit Vorsatzbyte e1h 8) numerischer Block 2)
4f 32 50 33 51 30 52 2c 53 62 87 88
ERW 2 ERW 3 ERW 0 ERW , ERW > ERW ERW
Sandini Bib
Glossar 1" Abk. für 1 Zoll gleich 2,54 cm. 14.318.180 Hz Die Frequenz bildete beim PC/XT den Basistakt. Heute bildet diese Frequenz den Grundtakt für den PLL-Chip auf einem Motherboard, der den Systemtakt erzeugt und aus dem dann alle anderen Takte mit Hilfe des Chipsets gebildet werden. 16450/16550 Der 16450/16550 ist der verbesserte Nachfolger des ersten UARTs für PC – dem 8250. Er ermöglicht eine Baudrate von bis zu 115.200. Der 16550 weist zusätzlich einen FIFO-Puffer für die Datenzwischenspeicherung auf. 38600DX/38600SX Ein i386-kompatibler Prozessor von Chips & Technologies mit einem speziellen Betriebsmodus, dem SuperState V, für die Verminderung des Stromverbrauchs. Der 38605SX besitzt nur einen 16Bit-Datenbus und einen 24-Bit-Adressbus. Im Gegensatz zum 38605DX/38605SX ist kein Cache vorhanden. 38605DX/38605SX Ein i386-kompatibler Prozessor von Chips & Technologies mit internem Befehls-Cache und einem speziellen Betriebsmodus für die Verminderung des Stromverbrauchs, dem SuperState-V-Modus. Der 38605SX besitzt nur einen 16-Bit-Datenbus und einen 24-Bit-Adressbus. 386SL Ein Chipsatz von Intel, der aus dem 386SL und dem I/O-Subsystem 82360SL besteht. Der 386SL integriert auf einem Chip eine i386-CPU, einen Cache-Controller und Tag-RAM, einen ISABuscontroller und einen Speichercontroller. Auf dem 82360SL sind eine Echtzeituhr, zwei Timer mit je drei Kanälen, ein Speicherdecoder, zwei DMA-Controller, eine parallele Schnittstelle, zwei Interrupt-Controller und zwei serielle Schnittstellen integriert. 386SLC Ein i386-kompatibler Prozessor von IBM mit deutlich erhöhter Leistung gegenüber dem Intel-Original. Der 386SLC besitzt einen internen 8-KByte-Cache und ist in stromsparender statischer Bauweise ausgelegt. 3D Die Darstellung von dreidimensionalen Objekten, was eine 3D-Grafikkarte erfordert. 4,77 MHz Die Frequenz bildete den Prozessortakt für den 8088/86 im Ur-PC/XT. 486DLC/486SLC Ein 386-kompatibler und stromsparender CMOS-Prozessor von Cyrix. Im Gegensatz zu den IntelPendants besitzt er einen internen 1KByte-Cache, einen verbesserten Prozessorkern ähnlich dem i486 und eine interne Power-Management-Einheit zur Verminderung des Stromverbrauchs. Der SLC ist die SX-Ausführung des DLC mit einem 16-Bit-Datenbus und einem 24-Bit-Adressbus. 5x86 Ein Prozessor von Cyrix, technologisch zwischen dem i486DX und dem Pentium angesiedelt.
Sandini Bib 1164
Glossar
640-KByte-Grenze Im PC befinden sich am oberen Ende des Real-Mode-Adressraums ab der Adresse a0000h der Video-RAM und verschiedene ROMs. Unter DOS stehen daher maximal die unteren 640 KByte Speicher für das Betriebssystem, Treiber und Programme zur Verfügung. 6502 Ein weit verbreiteter 8-Bit-Mikroprozessor aus CP/M-Zeiten, der vor allem als CPU im legendären C-64 Anwendung fand. 68000er-Familie Eine CISC-Prozessoren-Familie von Motorola, die vor allem in den Apple-Computern verwendet werden. Sie bilden das (nicht kompatible) Pendant zur 80x86-Familie von Intel. 6845 Ein Grafiksteuerchip oder CRTC, der in veränderter Form auf nahezu allen Grafikadaptern zu finden ist. Er erzeugt u.a. die Steuer- und Synchronisationssignale für den Monitor. 6x86 Ein Prozessor von Cyrix, der technologisch zwischen dem Pentium und dem PentiumPro angesiedelt ist. 80186/88 Diese Prozessoren bilden die Nachfolger des 8086/88. Neben verbesserten und erweiterten Befehlen sind ein Interrupt-Controller, ein DMA-Chip und ein Timer-Baustein auf dem 80186/ 88 integriert. In PC wurden diese CPUs kaum verwendet. 80286 Die zweite Generation der 80x86-Familie. Der 80286 ist ein 16-Bit-Prozessor mit 16-Bit-Registern, 16-Bit-Datenbus und 24-Bit-Adressbus. Mit ihm wurde der Protected Mode eingeführt, in dem er einen Adressraum von 16MByte aufweist. 80287/80287XL Der mathematische Coprozessor für den 80286. Der 80287XL ist gegenüber dem normalen 80287 verbessert und weist alle Funktionen des i387 auf. 80386/80386SX Eine andere Bezeichnung für i386DX/i386SX (siehe dort). 80387/80387SX Eine andere Bezeichnung für i387/i387SX (siehe dort). 8042 Ein Mikrocontroller, der im PC als Tastaturcontroller verwendet wird. 8048 Ein Mikrocontroller, der als Controllerchip in Tastaturen benutzt wird. 80486/80486SX Eine andere Bezeichnung für i486DX/i486SX (siehe dort). 80486DX2 Eine andere Bezeichnung für i486DX2 (siehe dort). 80487SX Siehe i487SX. 80586 Eine wenig geläufige Bezeichnung für den Pentium (siehe dort).
Sandini Bib Glossar
1165
8080/85 Ein bekannter 8-Bit-Prozessor aus CP/M-Zeiten; Vorläufer des 8086/88. 8086 Ein 16-Bit-Prozessor mit 16-Bit-Registern, 16-Bit-Datenbus und 20-Bit-Adressbus. Er wird im XT eingesetzt und ist der Urvater der 80x86-Familie. Der 8086 arbeitet ausschließlich im Real Mode, sein Adressraum beträgt 1MByte. 8087 Ein mathematischer Coprozessor für den 8086/88. 8088 Ein 16-Bit-Prozessor mit 16-Bit-Registern, 8-Bit-Datenbus und 20-Bit-Adressbus. Er wird im PC verwendet und ist bis auf die geringere Datenbusbreite mit dem 8086 identisch. 80x86-Familie Die Familie der abwärtskompatiblen 80x86-Chips. Die Familie umfasst den 8086/88, 80186/88, 80286, i386DX/i386SX, i486DX/i486SX, Pentium, Pentium II, Pentium III, Celeron und Celeron II. 82072A Ein Diskettencontrollerchip. 82077A Ein Diskettencontrollerchip. Für die PS/2-Serie mit Mikrokanal entworfen und Nachfolger des 82072A, der bei aktuellen PC mit im Chipset (Southbridge) integriert ist. 82284 Der Taktsignalgenerator für den 80286. 82288 Der Buscontroller für den 80286. 8237A Ein 8-Bit-DMA-Controller mit vier unabhängig programmierbaren DMA-Kanälen. Im PC/XT ist ein solcher Chip vorhanden, ab PC mit einer 286-CPU sind zwei Chips kaskadiert, sodass dort sieben DMA-Kanäle zur Verfügung stehen. Die DMA-Controller sind mittlerweile Bestandteil eines Chipsets. 82450 Ein UART-Chip und verbesserter Nachfolger des 8250. 82489DX Der Advanced Programmable Interrupt Controller (APIC) zur Unterstützung des Pentium und von Multiprozessorsystemen. 82491 Ein 256KBit-SRAM-Modul für einen L2-Cache mit dem 82496 Cache-Controller. 82496 Ein Cache-Controller für einen L2-Cache mit 82491-SRAM-Modulen. Seine externe Schnittstelle ist für eine optimale Zusammenarbeit mit dem Pentium ausgelegt. 8250 Ein UART-Chip, der im PC/XT benutzt wird. Es existieren Versionen mit den Bezeichnungen 8250, 8250A, 8250B und 8250C. 8253 Ein programmierbarer Intervall-Timer (PIT) mit drei unabhängigen Zählern. Der 8253 wird vorwiegend im PC/XT verwendet.
Sandini Bib 1166
Glossar
8254 Ein programmierbarer Intervall-Timer (PIT) mit drei unabhängigen Zählern; verbesserter Nachfolger des 8253. 8255A Ein programmierbares Peripherie-Interface (PPI) mit drei 8-Bit-Ports A, B und C. Port C kann in zwei Nibble aufgeteilt werden, die Port A und Port B um vier Bit erweitern. Der 8255A wurde im PC/XT zum Auslesen der DIP-Schalter und zur Übergabe der Scancodes von der PC/XT-Tastatur verwendet. Ab dem AT wird der 8255A nicht mehr eingesetzt. 8259A Ein programmierbarer Interrupt-Controller (PIC) mit acht Interrupt-Leitungen. Im PC/XT ist ein solcher Chip vorhanden, ab PC mit einer 286-CPU sind zwei 8259A kaskadiert, so dass dort 15 verschiedene Interrupt-Ebenen zu Verfügung stehen. 8284 Der Taktsignalgenerator für den 8086/88 und 80186/88. 8288 Der Buscontroller für den 8086/88 und 80186/88. 8514/A Ein Grafikadapter von IBM mit einem eigenen Grafikprozessor. 8741/8742 Ein Mikrocontroller, der als Tastaturcontroller verwendet wird. Abfragezyklus Auch Inquire-Zyklus oder Snoop-Zyklus. Ein Buszyklus an einen Prozessor mit On-Chip-Cache oder einen Cache-Controller, um zu prüfen, ob eine bestimmte Adresse im betreffenden Cache vorhanden ist. Abort Eine Exception, die zum Abbruch des Tasks führt, weil die Ursache nicht behebbar ist. Ein Abort tritt typischerweise auf, wenn der Aufruf eines Exception Handlers eine weitere Exception verursacht. Accelerated Graphics Port Siehe AGP. ACK Abk. für Acknowledge, dt. Bestätigung. Adapterkarte Auch als Erweiterungskarte oder Steckkarte bezeichnet. Platinen mit elektronischen Schaltkreisen, die in einen Busslot eingesetzt werden und den Funktionsumfang des PC erhöhen. Typische Vertreter sind Schnittstellenkarten, Grafikadapter und Controller. ADC Abk. für Analog-Digital-Converter, dt. Analog-Digital-Wandler. Ein ADC wandelt ein analoges Signal in eine vorbestimmte Zahl von Bit um, die den Wert des analogen Signals angeben. Adresse Eine Größe, die den Ort eines Objekts beschreibt. Im engeren Sinne ist eine Adresse ein Wert oder eine Nummer, die einen Speicherort oder einen Port kennzeichnet. Adressbus Eine Mehrzahl von im Allgemeinen parallelen Leitungen, die eine Adresse übertragen.
Sandini Bib Glossar
1167
Adressraum Die Anzahl der Objekte, die eine CPU oder ein anderer Chip adressieren kann. ADSL Asymmetrical Digital Subscriber Line, wird bei der Telekom als T-DSL bezeichnet und zusammen mit ISDN optional installiert. Arbeitet im Prinzip mit einem analogen Datenübertragungsverfahren oberhalb des Sprachbandes mit typischerweise 768 KBit/s zum Kunden (downstream) und 128 KBit/s in der Gegenrichtung. AGP Der Accelerated Graphics Port wird auf einem Motherboard in Form eines einzigen Steckplatzes für die Aufnahme einer AGP-Grafikkarte zur Verfügung gestellt. Akkumulator Ein Register der CPU, das im Hinblick auf die Ausführung von Befehlen am besten optimiert ist. Bei älteren Prozessoren ist der Akkumulator das einzige Register, das als Ziel eines Befehls, also für die Bereitstellung des Operationsergebnisses, benutzt werden kann. aktiv high Siehe aktiv hoch. aktiv hoch Ein Signal wird als aktiv high bezeichnet, wenn ein hoher Pegel die Auswirkungen hat oder den Status anzeigt, der durch die Signalbezeichnung angegeben wird. Z.B. ist das Signal READY des 8086 aktiv high, weil ein hoher Pegel die Bereitschaft der adressierten Einheit angibt. Ein niedriger Pegel zeigt an, dass die Einheit nicht bereit ist. aktiv low Siehe aktiv niedrig. aktiv niedrig Ein Signal wird als aktiv niedrig bezeichnet, wenn ein niedriger Pegel die Auswirkungen hat oder den Status anzeigt, der durch die Signalbezeichnung angegeben wird. Z.B. ist das Signal RD des 8086 aktiv niedrig, weil ein niedriger Pegel das Lesen von Daten angibt. Ein hoher Pegel zeigt an, dass ein Schreibvorgang stattfindet. Aktiv niedrige Signale werden üblicherweise durch einen Querstrich (RD), einen vorangestellten Schrägstrich (/RD), einen nachgestellten Stern (RD*) oder seltener auch durch eine nachgestellte Tilde (RD~) gekennzeichnet. Aktuator Von engl. to actuate, dt. betreiben. Umfasst alle Komponenten eines Laufwerks, die zur Positionierung eines Schreib-/Lesekopfes beitragen. Üblicherweise sind das mindestens der Zugriffsarm und der Zugriffsmotor. ALU Abk. für Arithmetical and Logical Unit, dt. arithmetische und logische Einheit. Die ALU ist Teil einer CPU und führt die arithmetischen und logischen Operationen aus. Am386DX/Am386SX Ein i386-kompatibler Prozessor von AMD mit erhöhter Leistung gegenüber dem Intel-Original. Der Am386SX besitzt nur einen 16-Bit-Datenbus und einen 24-Bit-Adressbus. Am386DXL/Am386SXL Ein i386-kompatibler Prozessor von AMD mit erhöhter Leistung gegenüber dem Intel-Original in stromsparender statischer Ausführung. Der Am386SX besitzt nur einen 16-Bit-Datenbus und einen 24-Bit-Adressbus.
Sandini Bib 1168
Glossar
Am386DXLV/Am386SXLV Die Low-Voltage-Ausführung des Am386DX von AMD. Der Am386DXLV arbeitet mit nur 3,3 V und verbraucht so 50% weniger Strom. Der Am386SXLV besitzt nur einen 16-Bit-Datenbus und einen 24-Bit-Adressbus. Am486DX/SX Ein i486DX bzw. i486SX-kompatibler Prozessor von AMD. Am486DXLV/SXLV Die Low-Voltage-Ausführung des Am486DX bzw. Am486SX von AMD. Der Am486DXLV/ SXLV arbeitet mit nur 3,3 V und verbraucht so 50% weniger Strom. Am486DX2 Ein i486DX2-kompatibler Prozessor von AMD mit intern verdoppelter Taktfrequenz. Am5K86 Ein leistungsfähiger Prozessor von AMD, der technologisch fortgeschrittener als Pentium, aber dennoch 100% Pentium-kompatibel ist. AMD Abkürzung für Advanced Micro Devices. Eine US-Firma, die Mikroelektronikkomponenten wie Prozessoren, ASICs, RAM-Chips etc. herstellt. AMD ist vor allem durch seine Intel-kompatiblen Prozessoren bekannt geworden und konnte die erste CPU (Athlon) mit einer Taktfrequenz von 1 GHz am Markt präsentieren. AMD gilt als größter Konkurrent zu Intel im Segment für PC-Mikroprozessoren. analog Ohne Zwischenabstufungen, kontinuierlich. Ein analoges Signal z.B. kann kontinuierliche Werte ohne Zwischenabstufungen annehmen. Analogmonitor Ein Monitor zur Darstellung von Text oder Grafik, der über ein Analogsignal angesteuert wird. Ein VGA-Adapter ist ein Beispiel für eine Grafikkarte, die einen Analogmonitor ansteuert. ANSI Abk. für American National Standards Institute, dt. Nationales Amerikanisches Institut für Normung. Eine Behörde in den USA, die technische Normen erstellt und herausgibt. ANSI ist vergleichbar mit unserem DIN. APIC Siehe 82489DX. Arbitrierung Die Übergabe der Kontrolle über ein Gerät vom gegenwärtigen Inhaber der Kontrollrechte an eine andere Einheit, die die Kontrolle übernehmen möchte. Das geschieht durch Arbitrierungssignale und eine Arbitrierungsstrategie. Architektur Das übergeordnete Gesamtkonzept für den Aufbau und die Struktur eines Computers oder eines Computersystems. ARRL Abk. für Advanced RLL. Ein RLL-Aufzeichnungsverfahren, das mit einer komplexeren Kodierung als RLL 2,7 arbeitet und dadurch höhere Datendichten ermöglicht. ASCII-Code Abk. für American Standard Code for Information Interchange, dt. amerikanischer Standardcode für Informationsaustausch. Ein 7-Bit-Code, der 32 Steuerzeichen für eine Datenübertragung und 96 alphanumerische Zeichen codiert.
Sandini Bib Glossar
1169
ASCIIZ-String Eine Zeichenkette, die mit dem ASCII-Zeichen \0, d.h. mit einer Null, abgeschlossen ist. ASIC Abk. für Application Specific IC, dt. anwendungsspezifischer IC. Ein integrierter Schaltkreis, der auf eine besondere Anwendung zugeschnitten ist. Hergestellt werden ASIC sehr häufig durch Gate-Arrays. ASPI Abk. für Advanced SCSI Programming Interface. Eine standardisierte Software-Schnittstelle zu SCSI-Einheiten. ASPI wurde von Adaptec entworfen. Assembler Ein Programm, das mnemonische Codes und symbolische Adressen in Maschinencode umsetzt. Assembler stellen die maschinennaheste Programmiermöglichkeit dar, die noch symbolische Adressen und Größen ermöglicht. Assoziativspeicher Siehe CAM. asynchron In der Phasen- oder Taktlage nicht übereinstimmend oder ohne Taktsignal. AT 1. Abk. für Advanced Technology. 2. Der Nachfolger des PC/XT mit 80286-CPU und 16-Bit-Busslots. AT-Bus Das Bussystem eines AT (ab 286-CPU) mit den verschiedenen Support-Chips (DMA, PIC, PIT etc.) und einem 16-Bit-Busslot. Der AT-Bus wird durch ISA streng definiert. ATA Abk. für AT Attachment. Ein Standard für den Anschluss insbesondere von Festplatten. ATA ist die Software-technische Standardisierung der IDE-Schnittstelle. ATAPI AT Attachment Packet Interface ist ein definierter Kommandosatz für Laufwerke (CD-ROM, ZIP) am EIDE-Anschluss. AT-Befehle Die Attention-Befehle wurden ursprünglich vom Modem-Hersteller Hayes definiert und werden daher auch unter dieser Bezeichnung geführt. Sie stellen im DFÜ-Bereich einen Standard zur Steuerung von Modems und auch ISDN-Karten dar. Athlon Ein Mikroprozessor der Firma AMD, der mit dieser CPU erstmalig gelungen ist, die Firma Intel technologisch zu überrunden. Er wird in einem Slot-A betrieben. Für die aktuellen Versionen (Duron, Thunderbird) ist ein Sockel-A-Motherboard notwendig. Attribut 1. Eine Größe, die einer anderen Größe beigeordnet ist und die Eigenschaften dieser Größe näher definiert. 2. Das höher wertige Byte des Bildschirmworts, das Informationen zu Helligkeit, Farbe und Hintergrund des darzustellenden Zeichens enthält. Der Zeichencode ist im niederwertigen Byte des Bildschirmworts abgelegt.
Sandini Bib 1170
Glossar
ATX-Standard Definiert mechanische und elektrische Gegebenheiten der Gehäuse, der Motherboards und der Anschlüsse. ATX mit seinen Ablegern wie NLX oder Micro-ATX ist der aktuelle Standard, der den hierzu nicht kompatiblen BAT-Standard abgelöst hat. AUI-Anschluss Attachment Unit Interface, 15-poliger Anschluss einer Netzwerkkarte für einen externen Medienkonverter. Autopark Eine Funktion von Festplatten, die den Aktuator und die Schreib-/Leseköpfe beim Ausschalten des Laufwerks in eine Parkstellung fährt, um den Datenträger nicht zu beschädigen. AUX Abk. für Auxiliary. Unter DOS standardmäßig synonym zu COM1, ansonsten allgemein ein zusätzliches Signal oder eine zusätzliche Leitung. Bad-Sector-Mapping Die logische Ersetzung defekter Sektoren oder Spuren bei der Formatierung durch intakte Ersatzsektoren oder Ersatzspuren. Das geschieht entweder durch eine Verschiebung des Sektors innerhalb der Spur (Sektor-Slipping), oder bei zu umfangreichen Defekten durch die Umleitung der späteren Zugriffe auf eine der defekten Spur zugeordnete Ersatzspur. Dadurch kann die Kapazität der Festplatte trotz defekter Stellen beibehalten werden. Das Bad-Sector-Mapping wird vom Controller ausgeführt und ist daher für BIOS, DOS und alle andere Software transparent. BASIC Abk. für Beginners All-Purpose Symbolic Instruction Code, dt. Symbolischer Allzweck-Programmiercode für Anfänger. Eine sehr einfach strukturierte Programmiersprache mit eingängigen Befehlsbezeichnungen wie z.B. PRINT. BAT-Standard Der Baby-AT-Standard definiert mechanische und elektrische Gegebenheiten der Gehäuse, der Hauptplatinen und der Anschlüsse. Standard ist mittlerweile aber ATX (siehe dort) und die entsprechenden Ableger. Baudrate Die Anzahl der Zustandsänderungen eines Übertragungskanals pro Sekunde. Bei binären Datenkanälen ist die Baudrate im Allgemeinen gleich der Zahl der übertragenen Bit pro Sekunde, bps. BCD Abk. für Binary Coded Decimal, dt. binärkodierte Dezimalzahl. BCD kodiert eine Dezimalziffer als binären Wert eines Byte. Beispiel: BCD=04h entspricht dezimal 4. BCD verschwendet viel Platz, weil durch ein Byte 256 verschiedene Werte dargestellt werden können, BCD aber nur zehn (0 bis 9) davon verwendet. Befehls-Pipelining Befehle weisen im Allgemeinen sehr viele ähnliche Ausführungsstufen auf, so muss jeder Befehl z.B. eingelesen, dekodiert und ausgeführt werden, und die Ergebnisse müssen in die Zielregister zurückgeschrieben werden. Beim Befehls-Pipelining wird die Ausführung eines jeden Befehls in elementare Aufgaben aufgeteilt. Jede Aufgabe wird von einer anderen Stufe einer Befehls-Pipeline (idealerweise in einem Taktzyklus) ausgeführt, so dass sich zu einem gegebenen Zeitpunkt mehrere Befehle in einem jeweils unterschiedlich fortgeschrittenen Zustand in der Pipeline befinden. Damit wird zwar nicht jeder Befehl in nur einem Taktzyklus vollständig ausgeführt, wohl aber abgeschlossen.
Sandini Bib Glossar
1171
Betriebssystem Hardware-nahe Software, die den Betrieb eines Computers steuert und überwacht, eine Schnittstelle zwischen Anwendungsprogrammen und der Hardware und dem Dateisystem vermittelt und die verschiedenen Tasks verwaltet. BF-Jumper Einstellungselement für die Bus Frequency, den Systemtakt. bidirektional Bei einer bidirektionalen Übertragung können Daten zwischen den Kommunikationsteilnehmern in beiden Richtungen übertragen werden, beide Teilnehmer können also als Sender und Empfänger wirken. Big-Blue Spitzname für IBM, da IBM ein sehr großer Konzern (Big) und das Firmenemblem blau (Blue) ist. Big-Endian-Format Beim Big-Endian-Format werden die höher wertigen Bytes einer Mehr-Byte-Größe bei niedrigeren Adressen und die niederwertigen Bytes bei höheren Adressen abgelegt. Die 68000er von Motorola verwenden das Big-Endian-Format. Bildschirmspeicher Siehe Video-RAM. BIOS Abk. für Basic Input/Output System, dt. grundlegendes Ein-/Ausgabesystem. Das BIOS umfasst die Systemprogramme für grundlegende Ein- und Ausgabeoperationen und stellt eine SoftwareSchnittstelle zur Hardware des PC dar. Typische BIOS-Funktionen sind der Zugriff auf Disketten, Festplatten und Schnittstellen. BIOS-Setup Einstellung der jeweiligen PC-Ausstattung (z.B. Laufwerke, On-Board-Peripherie). Wird über eine bestimmte Taste (meist (Entf) oder auch Tastenkombination) nach dem Einschalten des PC aufgerufen. BIST Abk. für Built-In Self-Test, dt. eingebauter Selbsttest. Eine als Hardware oder Mikrocode implementierte Testfunktion von Mikrochips. Der BIST wird typischerweise beim Einschalten des Chips oder gezielt durch den RUNBIST-Befehl des Boundary Scan Test ausgelöst. Er prüft mehr oder weniger alle Chipkomponenten und legt den Prüfcode in einem Register ab. Bit Abk. für Binary Digit, dt. zweiwertige Ziffer oder binärer Wert. Eine Ziffer, eine Stelle oder ein Wert, der nur zwei verschiedene Zustände annehmen kann. Diese werden üblicherweise mit 0 und 1 oder 0 und L bezeichnet. Häufig wird das Bit auch als kleinste Informationseinheit bezeichnet. Bitleitung Die Leitung in Spaltenrichtung in einem Speicherzellenfeld eines RAM oder ROM, auf die der gespeicherte Wert einer ausgewählten Speicherzelle übertragen wird. Die Bitleitung ist üblicherweise mit der Source des Auswahltransistors verbunden. Blue Lightning Ein im Wesentlichen i486SX-kompatibler Prozessor von IBM mit 16-KByte-L1-Cache und interner Taktverdreifachung.
Sandini Bib 1172
Glossar
BNC Eine spezielle Stecker- und Buchsenform zur Übertragung eines Hochfrequenzsignals. Durch die umfangreiche Abschirmung von BNC-Steckern und Buchsen ist eine BNC-Verbindung sehr störsicher. Höchst auflösende Grafikkarten und Monitore werden häufig über BNC-Stecker und Buchsen miteinander verbunden. Booten Hochziehen des Systems in einem Computer. Das Booten ist üblicherweise die Summe der Operationen von BIOS, Bootstrap und Betriebssystemlader. Bootstrap Ein kleines Programm auf einer bootfähigen Diskette oder Partition, die das Laden des Betriebssystems steuert und ausführt. Die englische Bezeichnung Bootstrap, dt. Schnürsenkel, hat einen etwas märchenhaften Hintergrund: So wie sich der Angeber Münchhausen an seinen eigenen Schnürsenkeln aus dem Sumpf gezogen hat, zieht sich der Computer über den Bootstrap praktisch selbst hoch. Boundary Scan Test Eine Prüffunktion nach IEEE 1149.1, die mit Hilfe von Testzellen und einem Testpfad die serielle Ein- und Ausgabe von Testdaten und Testergebnissen ermöglicht. Der Boundary Scan Test sieht einen begrenzten Testbefehlssatz vor, um verschiedene Prüfungen von Platinenverbindungen und Chips vorzunehmen. bpi Abk. für bit per inch, dt. Bit pro Zoll. bps Abk. für bit per second, dt. Bit pro Sekunde. Branch Prediction Eine Innovation des Pentium zur Vorhersage von Verzweigungen und damit zur Beschleunigung der Programmausführung. Die Branch-Prediction-Logik besteht aus einer Steuereinheit und dem Branch-Trace-Puffer BTB. Der BTB stellt einen Cache dar, der als Tag die Adresse des Befehls enthält, der dem Verzweigungsbefehl unmittelbar vorangeht. Weiter enthält er als eigentlichen CacheEintrag die Zieladresse des Sprungs und History-Bits, die statistische Informationen über die Häufigkeit der jeweiligen Verzweigungen liefern. Eine ausgeführte Verzweigung wird in diesem Zusammenhang auch als Taken Branch, eine nicht ausgeführte als Not-Taken Branch bezeichnet. Der dynamische Branch-Prediction- (Verzweigungsvorhersage-) Algorithmus sagt die Branches entsprechend den Befehlen voraus, die der Pentium in der Vergangenheit ausgeführt hat. Stellt sich die Vorhersage als richtig heraus, dann sind alle nach dem Sprungbefehl in die Pipeline geladenen Befehle korrekt 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. Break-Code Siehe Scancode. Built-In Self-Test Siehe BIST. Burst-Modus Auch Bündelmodus. Ein spezieller Hochgeschwindigkeitsmodus zur Übertragung größerer Datenblöcke als ununterbrochenes Bündel kleinerer Dateneinheiten. Beispielsweise kann eine Cache-Line zu 16 Byte als Bündel von vier Dateneinheiten zu 4 Byte übertragen werden.
Sandini Bib Glossar
1173
Bus Eine Mehrzahl von im Allgemeinen parallelen Signalleitungen, über die Steuer-, Daten- und Adresssignale übertragen werden. Busmaster Eine Einheit oder ein Chip, der selbstständig einen Bus steuern kann. Beispiele sind CPU und DMA-Chip. Busslot Eine Kontaktleiste in einem PC, in die eine Adapterkarte eingesteckt werden kann und die Kontakte für alle erforderlichen Steuer-, Daten- und Adresssignale aufweist. Byte Eine Gruppe von acht Bit. C Eine sehr flexible Programmiersprache, die sehr maschinennah ist, aber dennoch alle Elemente einer Hochsprache umfasst. Kennzeichnend für C ist, dass es kaum reservierte Bezeichnungen und Befehle gibt, sondern alle von anderen Sprachen bekannten umfangreicheren Befehle in Form von Funktionsbibliotheken vorliegen. Cache Ein schneller Zwischenspeicher zwischen einer schnellen CPU und einem (relativ) langsamen Speichersubsystem. Cache-Fehltreffer Siehe Cache-Treffer. Cache-Flush Das Schreiben des Cache-Inhalts in den Hauptspeicher oder auf einen Datenträger. Cache-Flushes sind nur bei Cache-Systemen notwendig, die keine Write-Through-Strategie verfolgen. Cache-Hit Siehe Cache-Treffer. Cache-Kohärenz Die Eigenschaft in einem Multi-Cache-System, dass bei einem Zugriff einer beliebigen CPU auf einen Cache stets der korrekte Wert zurückgegeben wird. Das bedeutet, dass bei der Aktualisierung eines Cache-Eintrags in einem Cache auch allen anderen Caches diese Modifizierung mitgeteilt wird. Zur Unterstützung der Cache-Kohärenz ist das MESI-Protokoll implementiert. Cache-Konsistenz Siehe Cache-Kohärenz. Cache-Miss Siehe Cache-Treffer. Cache-Treffer Wenn bei einem Computersystem mit Cache die CPU eine Adresse ausgibt, um Daten zu lesen, und die so adressierten Daten bereits im Cache-SRAM vorliegen und dadurch nicht aus dem langsamen Hauptspeicher, sondern dem schnellen Cache-SRAM gelesen werden, spricht man von einem Cache-Treffer. Ist das nicht der Fall, befinden sich die adressierten Daten also nur im Hauptspeicher, aber nicht im Cache-SRAM, bezeichnet man das als Cache-Fehltreffer oder Cache-Miss.
Sandini Bib 1174
Glossar
CAD Abk. für Computer Aided Design, dt. computerunterstützter Entwurf. CAD betrifft die Erstellung von Plänen und alle sekundäre Aufgaben (Bemaßung, Abrechnung etc.) mit Hilfe eines Computers. CAD findet vor allem im Maschinenbau, der Elektrotechnik und im Architektur- und Bauingenieurwesen Anwendung. Call Gate Eine Datenstruktur des Protected Mode, die durch einen Deskriptor beschrieben wird, und dazu dient, Programmen einen abgesicherten Zugriff auf Code anderer Privilegierungsstufe zu ermöglichen. CAM 1. Abk. für Content Adressable Memory, dt. inhaltsadressierbarer Speicher; auch als Assoziativspeicher bezeichnet. CAM bezeichnet einen Speicher oder Speicherbaustein, bei dem die Information nicht über eine Adresse, sondern einen Abschnitt der Information selbst adressiert wird, also einen Teil des Speicherinhalts. Der CAM assoziiert dadurch weitere Daten mit dieser Teilinformation, so dass u.U. mehrere Informationen adressiert werden, die Adressierung also mehrdeutig sein kann. CAM werden vor allem für Cache-Systeme verwendet. 2. Abk. für Common Access Method; siehe dort. CAPI Common Application Programming Interface, ist eine Windows-Software-Schnittstelle für den Umgang mit ISDN-Adaptern. CAS Abk. für Column Address Strobe, dt. Spaltenadress-Abtastsignal. Ein Steuersignal für einen DRAMSpeicherchip, das den Chip anweist, die zugeführte Adresse als Spaltenadresse entgegenzunehmen und geeignet zu interpretieren. CAS-vor-RAS-Refresh Beim CAS-vor-RAS-Refresh hält die externe Speichersteuerung das Signal CAS für eine bestimmte Zeit auf einem niedrigen Pegel, bevor RAS abfällt – daher die Bezeichnung CAS-vor-RAS. Hierdurch wird die interne Refresh-Logik aktiviert und führt eine automatische interne Auffrischung aus. Die Refresh-Adresse wird intern vom Adresszähler in der Refresh-Logik erzeugt, so dass die Auffrischung von der Speichersteuerung lediglich getriggert wird; die Auffrischung selbst führt der DRAM-Chip selbstständig aus. CCITT Comité Consultatif Internationale de Télégraphique et Téléphonique, dt. Internationales Komitee für den Telegrafie- und Telefonverkehr. Eine Unterunterorganisation der UN, die international verbindliche Standards im Bereich der Telekommunikation erstellt. Dadurch erst ist es möglich, dass Sie nach Australien telefonieren können, ohne an Inkompatibilitäten des deutschen und australischen Telefonnetzes zu scheitern. CCS Abk. für Common Command Set. Siehe dort. CD-I Abk. für CD Interaktiv. Eine Abart von CD-ROM mit einer verbesserten (interaktiven) Schnittstelle. CD-ROM Abk. für Compact-Disc ROM. Ein optischer Massenspeicher, bei dem Information auf einer Compact Disc in unveränderlicher Form vorliegt. Typische Kapazitäten betragen 500 MByte/Plattenseite.
Sandini Bib Glossar
1175
CD-Writer Sieht zwar aus wie ein übliches CD-ROM-Laufwerk, kann aber CDs anfertigen (brennen). Celeron Der preisgünstige Abkömmling des Pentium II, der mit einem maximalen externen Systemtakt von 66 MHz arbeiten kann (statt 100 oder 133 MHz wie der Pentium III). Centronics Ein amerikanischer Druckerhersteller, der als Erstes einen Standard für den Anschluss eines Druckers an eine parallele Schnittstelle erstellte. Seither werden alle Paralleldrucker über ein Centronics-Kabel mit der parallelen Schnittstelle des PC verbunden. CheaperNet Dieses Ethernet-LAN verwendet ein dünneres (Thin) und dadurch billigeres (Cheaper) BNCKabel. Es hat sich wegen der einfacheren und preiswerteren Installation zur Vernetzung innerhalb von Gebäuden durchgesetzt. Der Anschluss einer Station erfolgt hier nicht über einen Transceiver, sondern ein einfaches BNC-T-Stück. Das dünnere Kabel erlaubt für einen EthernetStrang nur 185 m, an das maximal 30 Stationen angeschlossen werden können. Chip Ein fingernagelgroßes Siliziumplättchen mit bis zu mehreren Millionen elektronischen Schaltkreisen und Bauelementen. Chipsatz Eine Gruppe integrierter Schaltkreise, die einer bestimmten Aufgabe dienen, z.B. dem Bau eines PC. Ein Chipsatz integriert in einer kleinen Zahl von Chips die Funktionen vieler diskreter Bauelemente, wie z.B. CPU, PIC, PIT, DMA etc. CISC Abk. für Complex Instruction Set Computer, dt. Computer mit komplexem Befehlssatz. Mikroprozessoren, die einen sehr umfangreichen Befehlssatz mit 100 bis 400 Maschinenbefehlen aufweisen. Kennzeichnend für CISC ist die Mikrokodierung der Maschinenbefehle. CMOS Abk. für Complementary Metall-Oxide-Semiconductor, dt. komplementärer Metall-Oxid-Halbleiter (-Baustein). CMOS bezeichnet eine Technologie für Halbleiterbauelemente mit besonders geringer Leistungsaufnahme. Das wird im Allgemeinen durch die Verschaltung von einem NMOSund einem PMOS-Element erreicht. COBOL Abk. für Common Business Oriented Language. COBOL ist eine Programmiersprache, die vor allem für Anwendungen im Banken- und Geschäftsbereich geeignet ist. COM1, COM2, COM3, COM4 Die DOS-Bezeichnung für die verschiedenen seriellen Schnittstellen in einem PC. COM leitet sich von Communications Port, dt. Kommunikationsschnittstelle ab. Common Access Method Eine standardisierte Software-Schnittstelle zu SCSI-Einheiten. CAM wurde von ANSI entworfen. Common Command Set Eine ANSI-Erweiterung von SCSI-I, die Standardbefehle für SCSI definiert. Das Common Command Set ist ab SCSI-II gültig. Compiler Ein Programm, das die in einer Hochsprache wie z.B. C oder Pascal geschriebenen Anweisungen an einen Computer in eine Folge von Maschinenbefehle umsetzt.
Sandini Bib 1176
Glossar
CON Die DOS-Bezeichnung für Tastatur und Bildschirm. CON leitet sich von Console, dt. Konsole ab. Die Konsole war früher der Bildschirmarbeitsplatz, von dem aus der Operator den Computer gesteuert und überwacht hat. Controller 1. Eine elektronische Einheit, die die Funktion eines Peripheriegeräts überwacht; Beispiele sind Diskettencontroller, Festplattencontroller, LAN-Controller etc. 2. Eine elektronische Einheit, die eine bestimmte Funktion ausführt; z.B. DMA-Controller. Coprozessor Auch Prozessorerweiterung. Ein Mikrochip, der speziell für eine bestimmte CPU entwickelt worden ist, um die Funktion der CPU zu erweitern oder zu unterstützen. Beispiele dafür sind nummerische Coprozessoren, die die Funktion der CPU um die Berechnung numerischer Ausdrücke mit Gleitkommazahlen erweitern. Core-Spannung Die Betriebsspannung für den CPU-Kern, die je nach Typ variiert. Die zweite CPU-Spannung ist die so genannte I/O-Spannung (typisch 3,3 V). CP/M Abk. für Control Program for Microcomputers, dt. Steuerprogramm für Mikrocomputer. Ein einfaches Betriebssystem für 8-Bit-Prozessoren, z.B. 8080/85 oder Z80. CP/M war der Vorläufer von DOS. CPU Abk. für Central Processing Unit, dt. zentrale Verarbeitungseinheit oder kurz Zentraleinheit. Die CPU bildet das Herzstück eines Computers und wird manchmal auch als (Zentral-) Prozessor bezeichnet. Beispiele für CPUs sind die 80x86-Familie von Intel und die 68000er von Motorola. CR Abk. für Carriage Return, dt. Wagenrücklauf. CR ist ein ASCII-Steuerzeichen mit dem Code 0dh, das zu einem Wagenrücklauf eines seriellen Druckers oder zu einer Positionierung des Cursors am Zeilenanfang führt. CRC Abk. für Cyclic Redundancy Check oder Cyclic Redundancy Code, dt. zyklische Redundanzprüfung oder zyklischer Redundanzcode. Eine Familie von redundanten Codes, die Datenfehler sehr effektiv erkennen können, Bündelfehler z.B. mit mehr als 99,99% Wahrscheinlichkeit. CRC findet vor allem bei der Datenaufzeichnung und Datenübertragung Anwendung. CSMA/CD Abk. für Carrier Sense Multiple Access/Collision Detection. Ein Verfahren zur Steuerung des Netzzugriffes in einem LAN. Die Bezeichnung rührt daher, dass eine Station, die senden will, zuerst prüfen (Sense) muss, ob ein Trägersignal (Carrier) aktiv ist. Versuchen mehrere Stationen gleichzeitig Daten auszugeben, führt das zu einem Mehrfachzugriff (Multiple Access). Die Folgen wären ohne weitere Vorkehrungen katastrophal: Die Datenpakete beider Stationen stören und vernichten sich gegenseitig. Eine Kollision muss also vom Netz erkannt (Collision Detection) und in geeigneter Weise (üblicherweise durch Abbrechen der Datenausgabe) behandelt werden. Das bekannteste LAN mit CSMA/CD-Verfahren ist das Ethernet. CTS Abk. für Clear To Send, dt. Sendebereitschaft. Durch CTS zeigt ein DCE seine Sendebereitschaft an, das DTE kann nun die Daten an das DCE übergeben.
Sandini Bib Glossar
1177
CU Abk. für Control Unit, dt. Steuereinheit. Die CU ist Teil eines Prozessors oder einer CPU und steuert die ALU, Register und andere Komponenten. Curie-Punkt/Curie-Temperatur Die scharf definierte Temperatur Tc, bei der der Ferromagnetismus einer Substanz verschwindet. Cyrix Ein amerikanischer Hersteller von Mikroelektronikkomponenten. Cyrix ist vor allem durch seine 80x86- und Pentium-kompatiblen Mikroprozessoren bekannt geworden. Mittlerweile ist Cyrix von der Firma VIA übernommen worden. DAC Abk. für Digital-Analog-Converter, dt. Digital-Analog-Wandler. Ein DAC wandelt ein digitales Signal aus einer vorbestimmten Zahl von Bits in ein analoges Signal um, das dem Wert der Bits entspricht. Datenbus Ein Mehrzahl von Leitungen, die im Allgemeinen parallel Daten übertragen. Datenendeinrichtung Siehe DTE. Datenträger Eine Einheit, auf der Daten dauerhaft abgespeichert werden können. Beispiele sind Disketten, Festplatten, Magnetbänder und optische Platten. Datenübertragungseinrichtung Siehe DCE. DCD Abk. für Data Carrier Detect, dt. Datenträgererfassung. Über DCD teilt ein DCE einem DTE mit, dass es das Datenträgersignal von einem anderen DCE erfasst hat. DCE Abk. für Data Communication Equipment, dt. Datenübertragungseinrichtung. Eine Einheit zur Übertragung von Daten, im Allgemeinen also ein Modem. DD Abk. für Double Density, dt. doppelte (Aufzeichnungs-) Dichte. Defragmentierung Die Daten werden auf dem Datenträger mit Hilfe eines speziellen Programms (z.B. Defrag) in zusammenhängenden Bereichen angeordnet, wodurch die Zugriffszeit wieder optimiert wird. Deskriptor Ein 8-Byte-Datenblock, der im Protected Mode ein Segment oder ein Gate beschreibt. DFÜ Allgemeine Bezeichnung für die DatenFernÜbertragung (über das Telefonnetz). Diamagnetismus Eine Form des Magnetismus, die das externe Magnetfeld geringfügig (typischerweise um 0,000001% bis 0,05%) abschwächt. Reiner Diamagnetismus tritt nur in Substanzen mit ausschließlich gepaarten Elektronen auf. Die Deutsch Gussform: Der »nackte« und daher ungeschützte Prozessor- oder Speicherchip, bevor er gebondet und in ein Gehäuse eingesetzt wird.
Sandini Bib 1178
Glossar
digital Mit Zwischenabstufungen, diskontinuierlich, in diskrete Stufen aufgeteilt. Ein digitales Signal z.B. kann nur bestimmte Werte auf einer Skala annehmen, Zwischenabstufungen sind nicht möglich. Digitalmonitor Ein Monitor zur Darstellung von Text oder Grafik, der über ein Digitalsignal angesteuert wird. DIMM Double In Line Memory Module, ein Speichermodul in 64-Bit-Breite. DIN Abk. für Deutsche Industrie Normenausschuss oder auch Deutsche Industrie-Norm. Eine Organisation, die für Deutschland verbindliche technische Normen erstellt. DIN-Buchse Anschluss laut der Deutschen Industrie-Norm. Beispielsweise fünfpolig wie bei Audiogeräten. DIP Abk. für Dual Inline Package. Ein Gehäuse mit Kontakten auf den zwei einander gegenüberliegenden Längsseiten. DIP-Schalter Ein kleiner Schalterblock mit einem DIP-Gehäuse, der mehrere kleine Schalter aufweist. Scherzhaft auch als Mäuseklavier bezeichnet. DirectX Windows-Software-Schnittstelle für die Ansteuerung von Audio- und Videoeinheiten sowie Eingabegeräten. Wird vorwiegend für Spiele benötigt und bügelt quasi die Windows-Schwäche (zu langsam) beim Zugriff auf die Hardware wieder aus. Diskette Ein Datenträger, der aus einer runden Scheibe aus flexiblem Material besteht. Die Diskette befindet sich üblicherweise in einer Schutzhülle oder einem Gehäuse. Standard sind 3½"-Disketten mit 1,44 MByte Speichervermögen. Diskettenlaufwerk Ein Laufwerk zum Beschreiben und Lesen von Disketten mit einem Laufwerkmotor, einem oder zwei Schreib-/Leseköpfen und einem Zugriffsarm zur Positionierung der Köpfe. DMA Abk. für Direct Memory Access, dt. direkter Speicherzugriff. DMA bildet neben der CPU einen zweiten Datenkanal zwischen Peripherieeinheiten und dem Hauptspeicher, über den eine Peripherieeinheit ohne Mitwirkung der CPU direkt auf den Hauptspeicher zugreifen und Daten aus ihm lesen oder in ihm ablegen kann. Domäne Der elementare Bereich einheitlicher Magnetisierung in einem Ferromagnetikum. Auch als Weißscher Bezirk bezeichnet. Doppelwort Eine 4-Byte-Größe, also 32 Bit. DOS Abk. für Disk Operating System, dt. plattenorientiertes Betriebssystem. Das meistinstallierte Betriebssystem für IBM-kompatible PC. DOS arbeitet ausschließlich im Real Mode des 80x86.
Sandini Bib Glossar
1179
Dotierung Die gezielte Einlagerung von Fremdatomen in ein Halbleitersubstrat, um die elektrischen Eigenschaften des Substrats zu beeinflussen. dpi Abk. für dots per inch, dt. Punkte pro Zoll. Drain Ein Leitungsanschluss eines Feldeffekttransistors. DRAM Abk. für dynamischer RAM. DRAM ist ein Direktzugriffsspeicher (RAM), bei dem die Information üblicherweise in Form von Ladungen in einem Kondensator gespeichert wird. Weil alle Kondensatoren durch Leckströme mit der Zeit entladen werden, muss der Speicherkondensator und somit der DRAM periodisch aufgefrischt werden, daher die Bezeichnung dynamisch. DRDOS Abk. für Digital Research DOS. Ein zu MS-DOS kompatibles Betriebssystem der Firma Digital Research, welches mittlerweile von der Firma Caldera übernommen wurde. Drive Array Eine Gruppe von physikalisch verschiedenen Laufwerken, die logisch zu einem einzigen Laufwerk zusammengefasst sind. Dadurch wächst die Speicherkapazität des Laufwerks, die mittlere Zugriffszeit sinkt, und die Datenübertragungsrate wird größer, weil die Laufwerke des Drive Array parallel arbeiten. DSR Abk. für Data Set Ready, dt. Dateneinheit bereit. Durch DSR zeigt ein DCE einem DTE seine allgemeine Betriebsbereitschaft an. DTE Abk. für Data Terminal Equipment, dt. Datenendeinrichtung. Eine Einheit, die am Ende eines Übertragungsweges sitzt und Daten ausgibt oder entgegennimmt. Beispiele sind ein PC, ein Telefon oder ein Fax. DTR Abk. für Data Terminal Ready, dt. Datenendeinrichtung bereit. Durch DTR zeigt ein DTE einem DCE seine allgemeine Betriebsbereitschaft an. Dual-Port-RAM Ein RAM-Baustein, der zwei voneinander unabhängige Zugänge zu den Speicherzellen des Bausteins aufweist. Dadurch können zwei Einheiten gleichzeitig auf die Informationen im RAM zugreifen, ohne sich zu behindern. Dual-Port-Speicher werden vor allem für den Video-RAM von Grafikadaptern verwendet, wo CPU und Adapterlogik auf den Bildschirmspeicher zugreifen. Eine andere Anwendung ist der Einsatz als Kommunikationsspeicher in Multiprozessorsystemen, über den zwei oder mehr Prozessoren Daten austauschen. duplex Die gleichzeitige Übertragungsmöglichkeit von Daten über einen Kanal in beide Richtungen. DVD Die Digital Versatile Disc ist der als CD-ROM-Nachfolger propagierte Standard mit einer typischen Kapazität von 4,7 GByte. DVD-R DVD-Recordable, die einmal beschreibbare DVD.
Sandini Bib 1180
Glossar
DVD-RAM DVD-Random Access Memory, die wiederbeschreibbare DVD, die zum DVD-Standard aber nur bedingt kompatibel ist. DVD-RW DVD-ReWriteable, die wiederbeschreibbare DVD. DWord Abk. für Doppelwort. Siehe dort. DWort Abk. für Doppelwort. Siehe dort. E/A Abk. für Eingabe/Ausgabe. EBCDIC-Code Abk. für Extended Binary Coded Decimal Interchange Code. Ein 8-Bit-Zeichencode entsprechend dem ASCII-Code, der vorwiegend in IBM-Großrechnern verwendet wird. ECC Abk. für Error Correcting Code, dt. Fehler korrigierender Code oder selbst korrigierender Code. Eine Form der zyklischen Redundanzcodes, wobei die Redundanz aber so groß ist, dass Fehler nicht nur erkannt, sondern sogar behoben werden können. Anwendung finden die ECC-Codes vor allem bei der Datenaufzeichnung auf Festplatten. Echtzeituhr Ein Chip, der fortlaufend ohne Einwirkung der CPU Uhrzeit und Datum aktualisiert. ECL Abk. für Emitter Coupled Logic, dt. emittergekoppelte Logik. Eine Familie integrierter Logikschaltkreise. Edelgas Chemisch nicht oder nur äußerst schwach reagierende, d.h. inerte Gase. Zu den Edelgasen zählen Helium, Neon, Argon, Krypton, Xenon und das radioaktive Radon. EDV Abk. für elektronische Datenverarbeitung. EEPROM Abk. für Electrical Eraseable PROM, dt. elektrisch löschbarer PROM. Ein programmierbarer Festwertspeicher, der durch einen Spannungsimpuls mit hohem Pegel gelöscht werden kann. EGA Abk. für Enhanced Graphics Adapter. Ein IBM-Grafikadapter mit gegenüber CGA verbesserter Auflösung und mehr Farben. Standard-EGA weist 640*400 Bildpunkte auf. EIA Abk. für Electronic Industries Association. Eine Organisation in den USA, die Standards für die Elektronikindustrie erstellt. EIDE Enhanced Integrated Drive Electronic ist eine Spezifikation für Festplatten und andere Laufwerke. Wird auf dem Motherboard in Form zweier Anschlüsse zur Verfügung gestellt. einfache Befehle Ein Klasse von Befehlen des Pentium, die zur gleichzeitigen Ausführung in der u- und v-Pipeline gepaart werden können. Die einfachen Befehle sind vollständig festverdrahtet, es ist keiner-
Sandini Bib Glossar
1181
lei Eingriff von Mikrocode aus dem Mikrocode-ROM notwendig. Dadurch können sie normalerweise in einem einzigen Taktzyklus ausgeführt werden. Zu den einfachen Befehlen zählen MOV, ALU, INC, DEC, PUSH, POP, LEA, JMP/Jcc near, CALL und NOP. ALU bezeichnet hier einen beliebigen arithmetischen oder logischen Befehl. einloggen Sich bei einem Rechnersystem als Benutzer anmelden. Das Einloggen erfolgt meist durch einen Befehl LOGON und die Eingabe einer Benutzerkennung und eines Passworts. EISA Abk. für Extended ISA. EISA definiert eine 32-Bit-Erweiterung für den ISA-Bus, um 32-Bit-Prozessoren (i386/i486) eine entsprechende Slotverbindung bieten zu können. EISA ist abwärtskompatibel zum ISA-Bus. EISA-Systeme werden nicht mehr hergestellt und sind von PCI-Systemen abgelöst worden. EISA-Master Ein Busmaster, der EISA-Buszyklen ausführen kann. EISA-Slave Eine Einheit, die EISA-Buszyklen bedienen kann. EMS-Fenster Ein 64-KByte-Block im Adressraum des PC zwischen 640 KByte und 1 MByte, in den vier EMSPages zu je 16 KByte eingeblendet werden können. Das EMS-Fenster bildet quasi eine Art Fenster in den größeren Adressraum des Expanded Memory. ENIAC Abk. für Electronic Numerical Integrator and Calculator, dt. elektronischer nummerischer Integrator und Rechner. Einer der ersten vollelektronischen Digitalrechner, der noch mit Röhren arbeitete. Er wurde in den Jahren 1943-46 in den USA entwickelt. EPROM Abk. für Eraseable PROM, dt. löschbarer PROM. Ein programmierbarer Festwertspeicher, der durch Bestrahlung mit UV-Licht gelöscht werden kann. Ergebnis-Forwarding Die unmittelbare Weitergabe des Ergebnisses eines Befehls an das Zielregister und gleichzeitig an den nachfolgenden Befehl als Operanden. Ohne Forwarding müsste der nachfolgende Befehl den Operanden erst aus dem Zielregister des vorherigen Befehls lesen; ein Taktzyklus wäre verloren. erweiterter ASCII-Code Ein 8-Bit-Code, dessen Codes von 0 bis 127 mit dem gewöhnlichen ASCII-Code übereinstimmen und bei dem den Codes 128 bis 255 Blockgrafik- und andere Zeichen zugeordnet sind. ESC-Befehle (Coprozessor) Alle Opcodes für den numerischen Coprozessor 80x87 beginnen mit der Bitfolge 11011 entsprechend 27, dem ASCII-Code für das Zeichen ESC. Sie werden daher als ESC-Befehle bezeichnet. ESDI Abk. für Enhanced Small Device Interface. ESDI ist eine Schnittstelle zwischen einem Festplattencontroller und einem Festplattenlaufwerk. ESDI wurde 1983 von Maxtor als leistungsfähiger Nachfolger der ST506/412-Schnittstelle eingeführt. Wesentliches Kennzeichen von ESDI ist, dass der Datenseparator nicht mehr auf dem Controller, sondern bereits auf dem Laufwerk selbst integriert ist. ESDI ist auf Übertragungsraten von maximal 24 MBit/s gleich 3 MByte/s ausgelegt und mittlerweile veraltet.
Sandini Bib 1182
Glossar
Ethernet Ein LAN, das 1976 von XEROX entwickelt wurde und ursprünglich eine Bustopologie mit Koaxialkabeln und das CSMA/CD-Zugriffsverfahren mit 10 MBit/s verwendet. Ethernet hat im Laufe der Jahre zahlreiche Erweiterungen erfahren wie Fast-Ethernet (100 MBit/s) oder Gigabit-Ethernet (1 GBit/s). Twisted-Pair- und Lichtwellenleiter (Glasfaser) sind hierfür das Standardverbindungsmedium. EU Abk. für Execution Unit, dt. Ausführungseinheit. Derjenige Teil einer CPU, der die Befehle unter der Steuerung der Steuereinheit (CU) auch tatsächlich ausführt. Exception Tritt ein interner Prozessorfehler auf, so löst die CPU einen Interrupt aus, der als Exception bezeichnet wird. Ursache für eine Exception kann z.B. ein nicht im Speicher befindliches Segment, eine ausgelagerte Page, eine Division durch 0, ein gesetzter Haltepunkt oder ein Protection-Fehler sein. Expanded Memory Ein Speichersystem, das durch Bank-Switching angesprochen wird. Dadurch stehen dem 80x86 im Real Mode mehr als 1 MByte Speicher zur Verfügung. Vom Expanded Memory kann zu einem bestimmten Zeitpunkt aber nur der Abschnitt angesprochen werden, der im EMS-Fenster liegt. Extended Memory Der Speicher oberhalb von 1 MByte. Extended Memory kann mit Ausnahme von knapp 64 KByte unmittelbar über der 1 MByte-Grenze nur im Protected Mode angesprochen werden. FAMOST Abk. für Floating Gate Avalanche Injection MOS Transistor. Ein FAMOST weist ein schwebendes Gate auf, das durch einen hohen Spannungsimpuls, der einen Lawinendurchbruch verursacht, mit Elektronen beladen werden kann. Dadurch wird die Kennlinie des FAMOST verändert. FAMOST werden in erster Linie für EPROM, EEPROM und Flash-Speicher verwendet. Faraday-Effekt Die Erscheinung, dass sich die Polarisationsrichtung einer elektromagnetischen Welle wie z.B. Licht beim Durchgang durch ein magnetisiertes Medium dreht. Fast SCSI Eine Erhöhung der maximalen Taktfrequenz des SCSI-Bus im synchronen Modus auf 10 MHz. SCSI-Befehle und Messages werden aber nach wie vor asynchron übergeben. Fault Eine Exception, die der Prozessor erkennt, bevor er die fehlerhafte Anweisung ausführt. Die Rückkehradresse für den Exception Handler zeigt also auf den Befehl, der die Exception verursacht hat. Dadurch versucht der Prozessor nach einem Return automatisch, die fehlerhafte Anweisung erneut auszuführen. Typische Faults sind Exceptions aufgrund ausgelagerter Pages. Der Exception Handler liest die fehlende Page ein, und nach einem Return greift der zuvor erfolglose Befehl nochmals auf die nun vorhandenen Daten zu, ohne eine Exception auszulösen. FCB Abk. für File Control Block, dt. Dateisteuerblock. Eine Datenstruktur unter CP/M, die eine geöffnete Datei bezeichnet. Unter DOS ist der FCB durch das Handle-Konzept abgelöst worden. fci Abk. für flux changes per inch, dt. (magnetische) Flussänderungen pro Zoll, d.h. pro 2,54 cm.
Sandini Bib Glossar
1183
FDC Abk. für Floppy Disc Controller, dt. Diskettencontroller. FDDI Abk. für Fiber Distributed Data Interface. Ein LAN mit 100 MBit/s, das als Übertragungsmedium Lichtwellenleiter (LWL) verwendet. FDDI stellt eine leistungsfähige Weiterentwicklung des Token Ring mit einer maximalen Länge von 100 bis 200 km zur Vernetzung von etwa 500 bis 1.000 Stationen dar. Der zweiadrige LWL soll zwei Ringe, einen Primärring und einen Sekundärring bereitstellen, wobei der Sekundärring als Backup-Ring betrieben wird. Fehlerstromschutzschalter Eine elektronische Einrichtung, die den im Haushalt oder Büro über die Phase laufenden Strom mit dem Rückstrom über den Nullleiter vergleicht. Überschreitet die Differenz einen bestimmten Wert, so nimmt der Schalter an, dass ein Mensch in Kontakt mit der Phase steht und den Strom direkt über seinen Körper zur Erde ableitet, der Mensch also einen Stromschlag erleidet. Der Fehlerstromschutzschalter unterbricht dann den Stromfluss. Ferromagnetikum Eine Substanz, die Ferromagnetismus zeigt. Beispiele sind Eisen, Kobalt, Nickel oder Permanentmagnete. Ferromagnetismus Die Erscheinung, dass mikroskopische Bereiche einer Substanz, die so genannten Domänen oder Weißschen Bezirke, vollständig magnetisiert sind. Bringt man einen solchen Körper in ein Magnetfeld, dann richten sich alle Domänen nach dem äußeren Feld aus, der Körper wird magnetisiert. Das Besondere am Ferromagnetismus ist, dass diese Magnetisierung zu einem großen Teil auch nach dem Abschalten des äußeren Feldes erhalten bleibt. Festplatte Ein Laufwerk zur Datenaufzeichnung, das einen steifen Datenträger in Form einer sich schnell drehenden Platte aufweist. Die Schreib-/Leseköpfe des Laufwerks werden von einem gemeinsamen Aktuator bewegt. FET Abk. für Feldeffekttransistor. Beim FET erfolgt die Steuerung der Leitfähigkeit durch ein elektrisches Feld zwischen dem Gate und der Source. FIFO Abk. für First-In, First-Out. FIFO-Speicher werden häufig als Pufferspeicher benutzt. Flip-Flop Auch als bistabiler Multivibrator oder bistabile Kippstufe bezeichnet. Eine elektronische Schaltung mit zwei definierten Zuständen, zwischen denen mit einem starken Schreibimpuls umgeschaltet werden kann. Flip-Flops werden als Latches oder Speicherzellen in einem SRAM verwendet. FM Abk. für Frequenzmodulation. Ein Verfahren zur Aufzeichnung von Daten auf einem magnetischen Datenträger. Full-Stroke-Zeit Die Zeit, die eine Festplatte benötigt, um den Schreib-/Lesekopf vom Zylinder 0 zum Zylinder mit der maximalen Zylindernummer zu verschieben. G Symbol für Giga, d.h. das Milliardenfache einer Größe, wie z.B. in GW = 1.000.000.000 Watt. Beachten Sie, dass bei GByte im Allgemeinen 230 Byte=1.073.741.800 Byte gemeint sind.
Sandini Bib 1184
Glossar
Galliumarsenid Abgekürzt GaAs. Ein Halbleitermaterial für besonders schnelle Schaltkreise. Galvanisierung Die Abscheidung von Metallen auf einem Trägermaterial, indem der Träger in eine Lösung mit Ionen des gewünschten Überzugmetalls getaucht und eine Spannung angelegt wird. Gate Der Steueranschluss eines Feldeffekttransistors. Durch eine Veränderung der Spannung am Gate kann die Leitfähigkeit des Transistors verändert werden. Gate-Array Ein Mikrochip, der eine Vielzahl von Logikgattern aufweist. Um eine bestimmte Funktion auszuführen, wird erst im letzten Herstellungsschritt die Verschaltung der Gatter durch eine Maske festgelegt. Dadurch wird die Anpassung an verschiedene Aufgaben wesentlich vereinfacht, weil die jeweilige Funktion nur in einem einzigen Schritt zum Tragen kommt. Gate-Arrays werden heute häufig für ASIC oder hochintegrierte Steuerbausteine (Chipset) im PC verwendet. GByte 230 Byte=1.073.741.800 Byte; nicht 1.000.000.000 Byte. GDT Abk. für Globale Deskriptortabelle. Eine Tabelle aus 8-Byte-Einträgen, den Deskriptoren, die im Protected Mode Segmente beschreibt. GDTR Abk. für Globales Deskriptortabellenregister. Ein Speicherverwaltungsregister ab dem 80286, das die Basisadresse und die Größe der GDT im Speicher angibt. gepackte BCD Binärkodierte Dezimalzahlen, bei denen jedes Nibble eines Byte eine Dezimalziffer codiert. Beispiel: 72h=dezimal 72. Gepackte BCD gehen erheblich sparsamer mit dem Speicherplatz um als normale BCD. globale Deskriptortabelle Siehe GDT. globale Page Eine Page, die von mehreren unabhängigen Tasks benutzt wird (und z.B. Betriebssystemfunktionen enthält). Dadurch können überflüssige TLB-Invalidierungen vermieden werden. globales Deskriptortabellenregister Siehe GDTR. gradueller Unterlauf Eine Gleitkommazahl, die zwar von null verschieden ist, aber nicht mehr in normalisierter Form dargestellt werden kann. Grafikadapter Ein Adapter für einen PC-Busslot zur Ausgabe von Grafiken und Text auf einem Monitor. Bei einigen Motherboards ist der Grafikadapter auch Bestandteil des Chipsets. Grafikmodus Ein Betriebsmodus eines Grafikadapters, bei dem jedem Punkt auf dem Bildschirm ein oder mehrere Bits zugeordnet sind. Jeder Bildpunkt (Pixel) kann individuell adressiert werden. Die Darstellung ist nicht auf einen bestimmten Zeichensatz beschränkt, sondern es können beliebige Zeichen und Grafiken dargestellt werden. Textzeichen werden unmittelbar in ihrer Bitmap-Form in den Bildschirmspeicher geschrieben und nicht vom Hardware-Zeichengenerator erzeugt.
Sandini Bib Glossar
1185
Grafikprozessor Ein spezialisierter Mikroprozessor, der Grafikbefehle verarbeiten und dadurch selbstständig z.B. Linien und geometrische Figuren allein über die Angabe der Koordinaten der Begrenzungspunkte erstellen kann. Großrechner Ein Computer hoher Leistung, der mehrere Benutzer (1000 und mehr) gleichzeitig bedienen und mehrere Tasks parallel ausführen kann. Halbduplex Die Übertragung von Daten in einer Richtung, wobei die Übertragungsrichtung aber umgeschaltet werden kann. Die beiden Kommunikationsteilnehmer können also abwechselnd als Sender und Empfänger arbeiten. Handle Eine Nummer, die DOS intern einer geöffneten Datei oder einer Einheit wie z.B. der Tastatur zuordnet. Handshake Die Einleitung einer Daten- oder Steuersignalübergabe durch ein Request-Signal und die Bestätigung der Daten- oder Steuersignalübergabe durch ein Acknowledge-Signal. Hauptspeicher Der Speicher eines Computers, der das Programm und die zur Programmausführung notwendigen oder vom Programm verarbeiteten Daten speichert. Der Hauptspeicher wird im Allgemeinen als DRAM ausgeführt. HD 1. Abk. für Hard Disk, dt. Festplatte. 2. Abk. für High Density. HDA Abk. für Head Disk Assembly. Derjenige Teil eines Festplattenlaufwerks, der die Platten, die Köpfe und den Aktuator umfasst. Die HDA ist üblicherweise von einem Gehäuse umgeben, wobei die ein- oder austretende Luft gefiltert wird, damit keine Verunreinigungen in die HDA eindringen können. HDC Abk. für Hard Disc Controller, dt. Festplattencontroller. Herculeskarte Abgekürzt HGC. Eine monochrome, grafikfähige Karte für den PC. Im Textmodus ist sie kompatibel zum MDA, im Grafikmodus bietet sie eine Auflösung von 720*348 Punkten. HEX Abk. für Hexadezimalzahl. HGC Abk. für Hercules Graphic Card, dt. Herculeskarte. Hidden Refresh Hier wird der Refresh-Zyklus hinter einem normalen Lesezugriff »versteckt« – daher auch die Bezeichnung Hidden Refresh. Beim Hidden Refresh hält man das CAS-Signal nach einem Speicherzugriff weiter auf einem niedrigen Pegel und schaltet nur das RAS-Signal um. Die im Lesezyklus gelesenen Daten werden vom DRAM-Chip auch während des Refresh-Zyklus weiter ausgegeben. Ein Adresszähler im DRAM erzeugt die Refresh-Adresse intern.
Sandini Bib 1186
Glossar
High-Level-Formatierung Die Formatierung eines Datenträgers, wenn nur die logische Struktur des Dateisystems angelegt wird, aber keine Spuren und Sektoren physikalisch erzeugt werden. Mit FORMAT können Sie bei einer Festplatte nur eine High-Level-Formatierung ausführen. Host Auch Zentralrechner. Ein Computer oder Computerbestandteil, der den Kern eines Computersystems bildet. Host-Adapter Eine Adapterkarte, die eine Verbindung zwischen einem Host und einem externen Bus herstellt. Beispiele sind SCSI-Host-Adapter für die Anbindung eines SCSI-Bus mit SCSI-Laufwerken. Hub Ein Verteiler im Netzwerk, der einen sternförmigen Anschluss der einzelnen PCs erlaubt. Ein Switch ist ebenfalls ein derartiger Verteiler, wobei dieser den Vorteil hat, dass sich die zur Verfügung stehende Bandbreite hier nicht durch die Anzahl der netzaktiven PCs dividiert. Hz Symbol für Hertz. 1 Hz = 1 Schwingung/s. i386DX/i386SX Die dritte Generation der 80x86-Familie. Der i386DX ist ein 32-Bit-Prozessor mit 32-Bit-Registern, 32-Bit-Datenbus und 32-Bit-Adressbus. Mit ihm wurde der Virtual-8086-Mode eingeführt. Der physikalische Adressraum beträgt 4GByte. Die SX-Variante i386SX stimmt intern mit dem i386DX überein, besitzt aber nur einen 16-Bit-Datenbus und einen 24-Bit-Adressbus. i387/i387SX Der mathematische Coprozessor für den i386DX bzw. den i386SX. i486DX/i486SX Die vierte Generation der 80x86-Familie. Der i486DX ist ein 32-Bit-Prozessor mit 32-Bit-Registern, 32-Bit-Datenbus und 32-Bit-Adressbus. Er weist ferner einen verbesserten i387-Coprozessor, einen Cache-Controller und einen 8-KByte-Cache-SRAM auf. Beim i486SX fehlt nur der Coprozessor. i486DX2 Ein i486DX mit intern verdoppelter Taktfrequenz, d.h., der interne Prozessortakt ist zweimal so hoch wie der zugeführte Takt vom Taktgenerator. Die Busschnittstelle und damit die Buszyklen laufen dagegen nur mit der externen Taktfrequenz. i486DX4 Ein i486DX-Prozessor von Intel. Sein On-Chip-PLL kann den externen Takt wahlweise verdoppeln oder verdreifachen und zusätzlich dazu mit einer 2½-fachen Taktgeschwindigkeit arbeiten. Er erreicht maximal 100 MHz. Gegenüber dem i486DX und i486DX2 ist sein 4-Wege set-assoziativer On-Chip-Cache auf 16 KByte angewachsen. Ein verbesserter Integer-Multiplizierer erhöht die Performance zusätzlich. i486SL Siehe SL Enhanced i486. i487SX Das Upgrade für den i486SX. Der 487SX liefert nicht nur den Coprozessor nach, sondern stellt eine vollständige 486-CPU mit On-Chip-Cache etc. dar. Wenn der 487SX nachgerüstet wird, deaktiviert er die bisherige 486SX-CPU und übernimmt auch deren Aufgaben.
Sandini Bib Glossar
1187
i586 Eine wenig geläufige Bezeichnung für den Pentium (siehe dort). IC Abk. für Integrated Circuit, dt. integrierter Schaltkreis. Ein Schaltkreis, bestehend aus mehreren elektronischen Bauelementen, der auf einem einzigen Träger (Substrat) gebildet ist. DRAMs und Mikroprozessoren gehören zu den höchstintegrierten IC. IDE Abk. für Intelligent Drive Electronic oder auch Integrated Disc Electronic. Ein Standard für die Anbindung von Festplatten oder anderen Laufwerken mit integriertem Controller an den ATBus. Die IDE-Schnittstelle wird auch als AT-Bus- oder ATA-Schnittstelle bezeichnet. IDT 1. Abk. für Interrupt Deskriptortabelle. Eine Tabelle aus 8-Byte-Einträgen, den Deskriptoren, die im Protected Mode Gates zur Behandlung von Interrupts beschreibt. 2. Hersteller verschiedener elektronischer Schaltkreise, der insbesondere durch seine Pentiumkompatiblen CPUs (C6, Winchip) bekannt geworden ist. Die CPU-Abteilung wurde mittlerweile an die Firma VIA verkauft. IDTR Abk. für Interrupt Deskriptortabellenregister. Ein Speicherverwaltungsregister ab dem 80286, das die Basisadresse und die Größe der IDT im Speicher angibt. IEEE Abk. für Institute of Electrical and Electronics Engineers, dt. Institut der Elektro- und Elektronikingenieure; manchmal auch als IE3 bezeichnet. Eine Ingenieurvereinigung in den USA, die Standards und Normen erstellt. IEEE1284-Standard Aktueller Standard für den Druckeranschluss und andere parallel arbeitende Geräte (z.B. Scanner, ZIP-Laufwerk). IIL Abk. für integrierte Injektionslogik; auch als I2L bezeichnet. Eine Familie von Logikelementen. Induktion Die Erscheinung, dass ein sich veränderndes Magnetfeld ein elektrisches Feld und dadurch eine elektrische Spannung erzeugt. Die Stärke der Spannung ist dabei proportional zur Flussänderung des Magnetfelds. Inquire-Zyklus Siehe Abfragezyklus. Intel Eine bedeutende US-Firma, die eine Vielzahl von Mikroelektronikkomponenten und Prozessoren herstellt. Intel gilt als Erfinder des Mikroprozessors (4004). Interlock Wenn in einer Pipeline eine Stufe das Ergebnis oder das Betriebsmittel einer anderen Stufe benötigt wird, ohne dass dieses bereits zur Verfügung steht, so bezeichnet man das als Interlock. Interlocks treten z.B. dann auf, wenn bei der Berechnung eines zusammengesetzten Ausdrucks die Wertermittlung der Teilausdrücke noch nicht beendet ist. Die anfordernde Pipeline-Stufe muss dann warten, bis die andere Pipeline-Stufe die Berechnung abgeschlossen hat.
Sandini Bib 1188
Glossar
Internet Ein weltweites Netz (WAN), das ursprünglich einen Datenaustausch zwischen Universitäten und Forschungseinrichtungen erlaubte. Mittlerweile kann jeder PC-Benutzer, der im Besitz eines Modems und einer Telefonleitung ist, Zugang zum Internet erhalten. Interrupt (Software, Hardware) Auch als Unterbrechung bezeichnet. Ein Software-Interrupt wird durch einen expliziten Interrupt-Befehl INT ausgelöst, ein Hardware-Interrupt dagegen über eine IRQ-Leitung an den Prozessor weitergegeben. In beiden Fällen sichert der Prozessor die Flags, den Befehlszeiger und das Codesegment auf dem Stack und ruft eine Prozedur, den Interrupt-Handler, auf. Interrupt-Deskriptortabelle Siehe IDT. Interrupt-Deskriptortabellenregister Siehe IDTR. Interrupt Gate Ein Gate-Deskriptor für den Aufruf eines Interrupt Handlers. Im Gegensatz zum Trap Gate löscht das Interrupt Gate das Interrupt Flag und deaktiviert dadurch externe Interrupt-Anforderungen. Interrupt-Handler Siehe Interrupt. I/O Abk. für Input/Output, dt. Ein-/Ausgabe. I/O-Mapped I/O Bei I/O-Mapped I/O werden die Register von Peripherieeinheiten über den I/O-Adressraum, also Ports, angesprochen. IRQ Abk. für Interrupt Request, dt. Interrupt-Anforderung. Eine Leitung oder ein Signal, das von einer Peripherieeinheit aktiviert wird, um einen Hardware-Interrupt der CPU auszulösen. ISA Abk. für Industrial Standard Architecture. Ein definierter Standard, der den vage formulierten ATBus abgelöst hat. ISA definiert die Busstruktur, die Architektur von CPU und Support-Chips sowie die Taktfrequenz des ISA-Bus. ISDN Integrated Services Digital Network, digitale Übertragungstechnik (64 KBit/s) mit zusätzlichen Diensten über die Telefonleitung. ITU International Telecommunication Union, internationale Standardisierungs-Organisation für den Bereich der Telekommunikation. IU Abk. für Instruction Unit, dt. Befehlseinheit. Ein Abschnitt der CPU, der die Ausführungseinheit ansteuert. Joystick Ein Knüppel mit Tasten, der für Computerspiele benutzt wird.
Sandini Bib Glossar
1189
Jumper Kleine Steckbrücken für die Einstellungen auf dem Motherboard oder auch bei älteren PC-Einsteckkarten. k Symbol für kilo, d.h. das Tausendfache einer Größe, wie z.B. in kW = 1.000 Watt. Beachten Sie, dass bei KByte im Allgemeinen 210 Byte = 1.024 Byte gemeint sind. KBit 210 Bit = 1.024 Bit. KByte 210 Byte = 1.024 Byte. kHz Hz = 1.000 Schwingungen/s. Koaxialkabel Kabel für einfache Netzwerkverbindungen (10 MBit/s), welches aus einem Innenleiter und einem Abschirmgeflecht besteht. Koerzitivität Dasjenige Magnetfeld, das notwendig ist, um einen magnetisierten ferromagnetischen Körper wieder vollkommen zu entmagnetisieren. Kombicontroller Eine Kombination von Disketten- und Festplattencontroller auf einer ISA-Adapterkarte. Üblicherweise verwaltet ein Kombicontroller zwei Festplatten und zwei Diskettenlaufwerke und bietet mitunter auch die PC-üblichen Schnittstellen (Paralell-Port, RS232). Konsole Siehe CON. Konzentrator Siehe Token Ring. L1-Cache Die erste und der CPU näher liegende Ebene in einem hierarchisch strukturierten Cache-Subsystem. Der L1-Cache ist typischerweise erheblich kleiner als ein eventuell vorhandener L2-Cache und ist üblicherweise auf demselben Chip wie die CPU selbst integriert. L2-Cache Auch als Second-Level Cache bezeichnet. Die zweite und dem Hauptspeicher näher liegende Ebene in einem hierarchisch strukturierten Cache-Subsystem. Zwischen der CPU und dem Hauptspeicher liegt zuerst der L1-Cache und dann diesem nachgeordnet der L2-Cache. Der L2Cache ist typischerweise zehn- bis fünfzigmal so groß wie der L1-Cache und wird von mehreren SRAM-Speicherchips und einem L2-Cache-Controller gebildet. Bei aktuellen CPUs (Pentium III, Athlon) ist er mit auf dem Die integriert. LAN Abk. für Local Area Network, dt. lokales Netzwerk. LAN bezeichnet Datennetze, die räumlich begrenzt sind. Typische Reichweiten betragen weniger als 500 m. Für LANs hat sich in erster Linie Ethernet und daraus entstandenen Weiterentwicklungen (z.B. Fast-Ethernet) durchgesetzt. Lanthanoid Auch als Seltene Erden bezeichnet. Bestimmte metallähnliche chemische Elemente, die sich in ihrem chemischen Verhalten nicht sonderlich unterscheiden. Es gibt 14 verschiedene Lanthanoide, das Element Lanthan hat dieser Elementgruppe den Namen gegeben.
Sandini Bib 1190
Glossar
Laser 1. Abk. für Light Amplification by Stimulated Emission of Radiation, dt. Lichtverstärkung durch induzierte Emission von Strahlung, ein Phänomen der Quantenphysik. 2. Lichtquellen, die einen scharf gebündelten Strahl mit hoher optischer Qualität aussenden. Latch Auch Verriegelungsschaltkreis. Ein Schaltkreis, der meist aus zwei antiparallel geschalteten Invertern besteht und einmal eingeschriebene externe Daten auch dann noch hält (verriegelt), wenn die externen Daten bereits wieder deaktiviert sind. Das Einschreiben der Daten wird durch ein Taktsignal gesteuert. Latenz Die mittlere Zeitspanne zwischen der Positionierung des Schreib-/Lesekopfes und dem Erscheinen des gewünschten Sektors unter dem Kopf. Im Mittel dauert das eine halbe Plattenumdrehung. Festplatten mit 3600 U/min weisen daher eine Latenz von 8,3 ms, Disketten mit 360 U/min eine Latenz von 83 ms auf. LDT Abk. für Lokale Deskriptortabelle. Eine Tabelle aus 8-Byte-Einträgen, den Deskriptoren, die im Protected Mode Segmente beschreibt, die lokal für den jeweiligen Task sind. LDTR Abk. für Lokales Deskriptortabellenregister. Ein Speicherverwaltungsregister ab dem 80286, das einen Selektor enthält, der den Deskriptor für die lokale Deskriptortabelle in der globalen Deskriptortabelle angibt. LF Abk. für Line Feed, dt. Zeilenvorschub. LF ist ein ASCII-Steuerzeichen mit dem Code 0ah, das bei einem seriellen Drucker zu einem Zeilenvorschub oder zu einer Positionierung des Cursors in der nächsten Zeile, aber derselben Spalte führt. Linearmotor Auch Voice-Coil-Actuator. Eine Antriebseinrichtung für den Zugriffsarm einer Festplatte, bei der ein Permanentmagnet auf dem Zugriffsarm in einer Spule läuft, die von einem Treiberschaltkreis mit Strom versorgt wird. Dadurch wird der Zugriffsarm wie die Membran eines Lautsprechers durch die Magnetwirkung von Spule und Permanetmagnet bewegt. Es gibt Linearmotoren in linearer und rotierender Ausführung. Little-Endian-Format Beim Little-Endian-Format werden die höher wertigen Bytes einer Mehr-Byte-Größe bei höheren Adressen und die niederwertigen Bytes bei niedrigeren Adressen abgelegt. Die 80x86-Familie von Intel verwendet das Little-Endian-Format, während die 68000-Familie von Motorola das Big-Endian-Format benutzt. Bei der üblichen Schreibweise von Mehr-Byte-Größen mit dem höchstwertigen Bit links und dem niederwertigsten Bit rechts erscheint die Anordnung im Speicher vertauscht zu sein. Local-Bus Ein Bussystem (auch als VLB: VESA Local Bus bezeichnet) für den PC, das mit einer Breite von 32 Bit und mit bis zu 50 MHz arbeitet und insbesondere für die Aufnahme von Grafikadaptern vorgesehen ist. Der Local-Bus ist kein eigenständiger Bus, sondern erweitert den ISA-Bus mit Hilfe einer Slotverlängerung. Er entspricht im Prinzip einem 486-Prozessorbus und im Allgemeinen bezeichnet man als Local Bus auch die Verbindung einer CPU mit dem Speichersystem (DRAM, Cache).
Sandini Bib Glossar
1191
lokale Deskriptortabelle Siehe LDT. lokales Deskriptortabellenregister Siehe LDTR. lokaler Bus Siehe Local-Bus. lokales Netzwerk Siehe LAN. Low-Level-Formatierung Die Formatierung eines Datenträgers, wenn Spuren und Sektoren physikalisch angelegt werden, nicht aber die logische Struktur des Dateisystems erzeugt wird. Mit FORMAT können Sie bei einer Diskette gleichzeitig eine Low- und eine High-Level-Formatierung ausführen, bei einer Festplatte dagegen nur eine High-Level-Formatierung. LPT1, LPT2, LPT3, LPT4 Die DOS-Bezeichnung für die verschiedenen parallelen Schnittstellen in einem PC. LPT leitet sich von Line Printer, dt. Zeilendrucker, ab. LSB Abk. für Least Significant Bit oder Least Significant Byte, dt. niederwertigstes Bit oder niederwertigstes Byte. LSI Abk. für Large Scale Integration. Damit wird eine Integration von 10.000 bis 100.000 Bauelementen auf einem Chip bezeichnet. µ Symbol für Mikro, d.h. ein Millionstel einer Größe. Beispiel: 1 µm = 0,000 001 m. µm Symbol für Mikrometer, d.h. ein Millionstel Meter oder 0,000 001 m. µP Abkürzendes Symbol für Mikroprozessor. µPD765 Der ursprüngliche Diskettencontrollerchip im PC. µOps (Mikro-Operationen) Einfache RISC-artige Befehle ab dem PentiumPro analog zu den ROPs, aus denen komplexe CISC-Befehle zusammengesetzt werden. M Symbol für Mega, d.h. das Millionenfache einer Größe, wie z.B. in MW = 1.000.000 Watt. Beachten Sie, dass bei MByte im Allgemeinen 220 Byte = 1.048.576 Byte gemeint sind. m Symbol für Milli, d.h. ein Tausendstel einer Größe. Beispiel: 1 mm = 0,001 m. Magnetooptisches Laufwerk Ein beschreib- und löschbarer Massenspeicher, bei dem die Aufzeichnung und Wiedergewinnung von Daten über einen Laserstrahl, also optisch, erfolgt. Die Information selbst wird aber in Form kleiner Magnetisierungen abgelegt; die Datenträger weisen eine ferromagnetische Beschichtung auf. Magnetooptische Laufwerke nutzen den Curie-Punkt zum Schreiben und den Faraday-Effekt zum Lesen der Information.
Sandini Bib 1192
Glossar
Make-Code Siehe Scancode. Mantisse Die Zahl, mit der eine Potenz bei wissenschaftlicher Notation multipliziert wird, um den Wert des Ausdrucks zu erhalten. Beispiel: 1,83*104; 1,83 ist die Mantisse, 10 die Basis und 4 der Exponent der Zahl 18.300 in wissenschaftlicher Notation. Mark Eine Form der Parität, bei der das Paritätsbit unabhängig von den Daten stets gleich 1 ist. Maschinenbefehl Eine Anweisung an einen Mikroprozessor, den dieser ohne weitere Veränderung oder Übersetzung durch Software oder Hardware dekodieren und interpretieren kann. Maschinenbefehle bestehen aus einer mehr oder weniger langen Folge von Bits, die die Art der Operation, die Adressierungsart, die beteiligten Register etc. angeben. Der Maschinenbefehl ist die niedrigste Ebene von Prozessoranweisungen, die einem Programmierer zugänglich ist. Assembler- oder Hochsprachenbefehle werden vom Assembler oder Compiler in Maschinenbefehle umgesetzt. Matrix Eine im Allgemeinen zweidimensionale Anordnung von Objekten, wie z.B. Zahlen oder Speicherzellen. Ein individuelles Objekt innerhalb der Matrix ist durch die Angabe von Zeile und Spalte eindeutig bestimmt. Maus Eine Zeigeeinrichtung in Form eines kleinen Gehäuses mit Tasten, in das eine Kugel eingebettet ist, die sich bei einer Bewegung der Maus durch den Benutzer dreht. Durch eine Erfassung der Kugeldrehung über Sensoren kann eine Logik die Bewegungsrichtung und den Umfang der Bewegung ermitteln. Optische Mäuse besitzen keine Kugel, sondern optische Sensoren. Mauszeiger Ein Objekt in der Form eines Cursors oder Pfeils, das sich mit einer Verschiebung der Maus scheinbar über den Bildschirm bewegt. Der Ort des Mauszeigers auf dem Bildschirm kann durch Software ermittelt werden. MBit 220 Bit = 1.048.576 Bit. MByte 220 Byte = 1.048.576 Byte. MC146818 Der ursprüngliche CMOS-RAM- und Echtzeituhrbaustein von Motorola, von dem es zahlreiche Weiterentwicklungen gibt (z.B. Dallas-Chips). Bei aktuellen PC ist diese Funktionseinheit mit im Chipset integriert. Mega Siehe M. Memory-Mapped I/O Bei Memory-Mapped I/O befinden sich die Register von Peripherieeinheiten im normalen Speicheradressraum und werden dadurch über die normalen Speicherbefehle wie z.B. MOV angesprochen.
Sandini Bib Glossar
1193
MESI-Protokoll Ein Protokoll zur Verwaltung von Cache-Einträgen auf einer Cache-Line-Basis, das vor allem für Multi-Cache-Systeme verwendet wird. Das Protokoll ordnet jeder Cache-Line den Zustand Modified, Exclusive, Shared oder Invalid zu. Übergänge zwischen den einzelnen Zuständen werden durch lesende und schreibende Zugriffe auf die Cache-Lines ausgelöst. MF II-Tastatur Abk. für Multifunktions-II-Tastatur. Eine programmierbare Tastatur, die abgesetzte Blöcke mit Steuertasten und Leuchtdioden zur Anzeige des Umschaltstatus verschiedener Tasten aufweist. MFM Abk. für modifizierte Frequenzmodulation. Ein Verfahren zur Aufzeichnung von Daten auf einem magnetischen Datenträger mit doppelt so großer Datendichte wie FM. MHz 1.000.000 Hz = 1.000.000 Schwingungen/s. Mickey 1/200", d.h. 1/200 Zoll gleich 0,127 mm. MIDI-Port Musical Instrument Digital Interface für den Anschluss von Keyboards, Drummachines u.Ä. Wird meist von der Soundkarte zur Verfügung gestellt. MIDI-Standard Definiert Instrumente für Synthesizer, der auf der Soundkarte sitzt oder auch extern angeschlossen werden kann. Mikro Siehe µ. Mikrochannel Siehe Mikrokanal. Mikrochip Ein hochintegrierter Schaltkreis auf einem einzigen Substratplättchen, dem Chip. Im engeren Sinne sind damit IC mit umfangreicher Logik gemeint, wie z.B. Mikroprozessoren oder DRAMs. Mikrokodierung Die Kodierung von Maschinenbefehlen eines Prozessors durch eine Folge von elementaren Anweisungen an die Befehls- und Ausführungseinheit einer CPU. Der Mikrocode wird im Mikrocode-ROM auf dem Prozessor abgelegt und ist dem Programmierer nicht zugänglich, sondern wird dem Prozessor bei der Herstellung fest eingebrannt. Mikrokanal Auch als Microchannel bezeichnet. Ein Bussystem von IBM für die PS/2-Serie von Personal Computern. Der Mikrokanal ist für 8- bis 32-Bit-Daten- und Adressbusse und die Unterstützung von Multitasking-Betriebssystemen auf Hardware-Ebene ausgelegt. Im Gegensatz zu EISA ist der Mikrokanal vollkommen inkompatibel zum ISA-Bus und wird heutzutage noch in einigen Workstations von IBM (RISC6000), nicht jedoch bei PCs verwendet. Mikroprozessor Ein Mikrochip mit hoher Intelligenz zur Ausführung von Befehlen. Ein Mikroprozessor ist programmierbar, das Programm wird üblicherweise in einem ROM oder Hauptspeicher abgelegt.
Sandini Bib 1194
Glossar
MIPS 1. Abk. für Million Instructions per Second, dt. Millionen Befehle pro Sekunde. MIPS gibt die Anzahl der pro Sekunde von einem Prozessor ausgeführten Befehle an und dient manchmal als (nicht sehr aussagekräftiges) Maß für die Leistungsfähigkeit der CPU. 2. Abk. für Microprocessor without Interlocked Pipeline-Stages, dt. Mikroprozessor ohne verzahnte Pipeline-Stufen. Eine RISC-Architektur, bei der keine Interlocks zwischen den Pipeline-Stufen auftreten können. Bekannte Implementierungen von MIPS sind die Prozessoren R3000/4000/ R6000. Mirroring Die gleichzeitige und identische Aufzeichnung von Daten auf zwei verschiedenen Massenspeichern wie z.B. Festplatten. Dadurch soll verhindert werden, dass bei einer Beschädigung eines Laufwerks Daten verloren gehen. Mittlere Zugriffszeit Der Durchschnittswert für die Zeitspanne zwischen der Ausgabe eines Zugriffsbefehls und dem Anliegen der Daten. Die mittlere Zugriffszeit wird vor allem bei Festplatten oder ähnlichen Massenspeichern benutzt, um die Geschwindigkeit der Positioniermechanik zu kennzeichnen. MMX Die Multi Media Extensions stellen eine Befehlserweiterung ab der Pentium-CPU dar. MMX findet insbesondere für Spiele seine Anwendung, wenn das betreffende Spiel überhaupt Gebrauch davon macht. MMU Abk. für Memory Management Unit, dt. Speicherverwaltungseinheit. Die MMU ist entweder Teil eines Prozessors oder auf einem separaten Chip integriert und führt die Adresstransformationen für Segmentierung und Paging aus. Mnemonics Eingängige Kürzel, die Maschinenbefehle eines Prozessors kennzeichnen und von einem Assembler in Abhängigkeit von der Adressierungsart, dem Operanden etc. in Maschinenbefehle übersetzt werden. Beispiel: MOV. Modem Abk. für Modulator/Demodulator. Modem bezeichnet ein Gerät, das ein Trägersignal mit einem Datensignal moduliert bzw. aus dem modulierten Trägersignal das Datensignal zurückgewinnt. Dadurch können Daten über ein Datennetz oder Funk übertragen werden. Monitor 1. Ein Bildschirm für Computer zur Ausgabe von Text und Grafik. 2. Ein Überwachungsprogramm für eine Hardware- oder Software-Einheit. MOS Abk. für Metal-Oxide-Semiconductor, dt. Metall-Oxid-Halbleiter (Baustein). Eine Technologie zur Herstellung von elektronischen Bauelementen oder integrierten Schaltungen, die eine Schichtenstruktur der genannten Form aufweisen. MOSFET Abk. für Metal-Oxide-Semiconductor FET (Feldeffekttransistor). Ein Feldeffekttransistor, der durch ein Steuergate (Metall), ein Substrat (Halbleiter) und einen Isolierfilm (Oxid), der Gate und Substrat abtrennt, gebildet wird.
Sandini Bib Glossar
1195
Motherboard Auch Hauptplatine oder Mutterplatine. Die Platine in einem PC mit den zentralen Bestandteilen, wie CPU, Hauptspeicher, dem Chipsets und den Busslots. Motorola Ein bedeutender amerikanischer Hersteller von Mikroelektronikkomponenten wie z.B. Speicherchips und Prozessoren. Die bedeutendste Prozessorfamilie von Motorola sind die 68000er. Motorola ist gegenwärtig vor allem im Telekommunikationsbereich stark engagiert. MPEG Die Motion Pictures Experts Group hat verschiedene Video- und Audioformate mit unterschiedlichen Komprimierungsverfahren definiert. MS-DOS Abk. für Microsoft-DOS, die DOS-Implementierung von Microsoft. MSB Abk. für Most Significant Bit oder Most Significant Byte, dt. höchstwertiges Bit oder höchstwertiges Byte. MSI Abk. für Medium Scale Integration. Damit wird eine Integration von 100 bis 10.000 Bauelementen auf einem Chip bezeichnet. MSW Abk. für Maschinenstatuswort. Ein Steuer- und Statusregister für den Protected Mode. MTBF Abk. für Mean Time Between Failures, dt. mittlere Zeitspanne zwischen zwei Ausfällen. MTBF gibt den Durchschnittswert für die Zeitspanne zwischen zwei Totalausfällen des entsprechenden Geräts an. MTBF wird vor allem für die Kennzeichnung der Zuverlässigkeit von Festplatten verwendet. Multiplexer Ein Gerät, das die Daten mehrerer Eingangskanäle in definierter Weise auf eine kleinere Zahl von Ausgangskanälen umlegt. Beispiel: Die 20-Bit-Speicheradresse vom 8086 wird von der DRAM-Steuerung in zwei zeitlich aufeinander folgende 10-Bit-Pakete, nämlich die Zeilen- und die Spaltenadresse aufgeteilt; die Anzahl der Eingangskanäle beträgt also 20, die Zahl der Ausgangskanäle zehn. Die DRAM-Steuerung stellt damit einen Multiplexer dar, die beschriebene Art des Multiplexings wird als zeitliches Multiplexen bezeichnet. Multitasking Der parallele Ablauf mehrerer Tasks in einem Computer. Die Benutzer haben den Eindruck, als würden die Tasks parallel ablaufen; tatsächlich schaltet der Computer aber nur sehr schnell zwischen den Tasks um. Multitasking-Betriebssystem Ein Betriebssystem, das mehrere Tasks gleichzeitig in einem Computersystem verwalten und sie jeweils gezielt für eine kurze Zeitspanne aktivieren und dann wieder unterbrechen kann. Beispiele sind OS/2, Unix, Linux und die aktuellen Windows-Versionen. n Symbol für Nano, d.h. ein Milliardstel einer Größe. Beispiel: 1 nm = 0,000 000 001 m NAN Abk. für Not A Number, dt. keine Zahl. Eine Gleitkommazahl, die zwar von Null verschieden ist, aber die IEEE-Definitionen für die Darstellung von Gleitkommazahlen in einem Computer nicht erfüllt.
Sandini Bib 1196
Glossar
Nano Siehe n. Nanometer Ein Milliardstel Meter, d.h. 0,000 000 001 m. Nanosekunden Eine Milliardstel Sekunde, d.h. 0,000 000 001 s. NEC Ein großer japanischer Hersteller von elektrotechnischen und elektronischen Geräten (Nippon Electric Company). Netzknoten Eine Station in einem Netzwerk. Netzknoten sind z.B. Arbeitsplatzrechner, Hubs und Switches oder auch Drucker. Netzwerk Die Verbindungseinrichtung mit Server, Netzknoten und Übertragungseinrichtungen, die eine Kommunikation zwischen den einzelnen Netzwerkteilnehmern ermöglicht. Netzwerkadapter Eine Adapterkarte, die den Zugang zu einem Netzwerk ermöglicht. Nibble Eine Gruppe von vier Bit, d.h. ein halbes Byte. nm Abk. für Nanometer, d.h. ein Milliardstel Meter oder 0,000 000 001 m. NMI Abk. für nicht-maskierbarer Interrupt. Eine Hardware-Interrupt-Anforderung an eine CPU, die im Prozessor intern nicht durch ein Bit maskiert werden kann, sondern beim Auftreten sofort bedient wird. Sie ist gegenüber den konfigurierbaren Interrupts (IRQs) die höhere Priorität. NMOS Abk. für N-Kanal MOS. Eine Technologie zur Herstellung von MOS-Transistoren, bei denen die Kanalleitfähigkeit auf negativ geladenen Elektronen beruht. normalisierte Darstellung Bei der normalisierten Darstellung einer Gleitkommazahl geht man davon aus, dass die führende Stelle stets gleich 1 ist. Da die führende Stelle dadurch stets implizit eindeutig bekannt ist, wird sie weggelassen und der Exponent entsprechend angeglichen, so dass der Wert der Zahl gleich bleibt. NRZ Abk. für Non return to Zero. Ein Kodierungsverfahren für binäre Daten, bei dem das Signal für zwei aufeinander folgende Einsen nicht auf den Wert Null zurückkehrt. ns Abk. für Nanosekunde, d.h. eine Milliardstel Sekunde oder 0,000 000 001 Sekunden. NVR Abk. für Nonvolatile RAM, dt. nicht-flüchtiger Speicher. Ein Speicher, der auch nach dem Abschalten der Spannungsversorgung seinen Speicherinhalt nicht verliert. Offset Die Adresse innerhalb eines Segments, d.h. die Zahl der Bytes vom Beginn des Segments an.
Sandini Bib Glossar
1197
Operanden-Forwarding Die unmittelbare Weitergabe eines Operanden an eine spätere Pipeline-Stufe. Moderne Prozessoren führen ein Forwarding z.B. aus, wenn ein Befehl ein Register überschreibt und der folgende Befehl einen Operanden aus demselben Register liest. OS/2 Abk. für Operating System/2. Das multitaskingfähige Nachfolgesystem von DOS der Firma IBM für Personal Computer. Out-of-order-Abschluss Der Abschluss von Befehlen in einer Reihenfolge, die nicht der programmierten Reihenfolge entspricht. Overdrive Upgrade-Prozessoren. Siehe Upgrade. P5 Die Kurzform oder Entwicklungsbezeichnung des Pentiums. Page Ein Abschnitt eines Adressraums, der als Ganzes behandelt wird. Page Directory Die Page Table erster Ordnung in einem System mit Paging, die die Adressen der Page Tables zweiter Ordnung enthält. Das Page Directory befindet sich stets im Speicher und wird im Gegensatz zu den Page Tables zweiter Ordnung nicht ausgelagert. Page Mode Ein besonderer Geschwindigkeitsmodus von DRAM-Speicherchips, bei dem nach Zuführen und Dekodieren einer Zeilenadresse nur noch die Spaltenadresse verändert wird. Die Dauer des Page Mode ist begrenzt, typischerweise auf etwa 100 Speicherzyklen. Liegen die gewünschten Daten außerhalb der Page, ist ein langwieriger Page-Wechsel notwendig. Page Table Eine Tabelle, die die Adressen der jeweiligen Pages in einem System mit Paging enthält. Die Page Table erster Ordnung wird als Page Directory bezeichnet. Im Gegensatz zur Page Table erster Ordnung können die Page Tables zweiter Ordnung wie gewöhnliche Pages ausgelagert werden. Paging 1. Allgemein: die Unterteilung eines Adressraums in kleinere Einheiten, die Pages. 2. Demand-Paging: Die Auslagerung der Pages eines Hauptspeichers auf einem externen Massenspeicher, wenn die darin enthaltenen Daten vom Programm gerade nicht benötigt werden. Möchte die CPU auf die ausgelagerten Daten zugreifen, so wird die gesamte Page wieder in den Hauptspeicher eingelesen und dafür eine gerade nicht benötigte Page ausgelagert (Swapping). Dadurch kann ein wesentlich größerer virtueller Adressraum erzeugt werden als physikalisch tatsächlich vorhanden ist. Palette Die Menge aller möglichen Farben, die ein Grafikadapter wie z.B. VGA darstellen kann. Parallele Schnitttstelle Eine PC-Schnittstelle, die Daten in paralleler Form als Bytes oder Worte abgibt oder annimmt. Paramagnetismus Eine Form des Magnetismus, die das externe Magnetfeld geringfügig (typischerweise um 0,00001% bis 0,05%) verstärkt. Paramagnetismus tritt in allen Substanzen mit ungepaarten Elektronen auf.
Sandini Bib 1198
Glossar
Parität Eine einfache Möglichkeit, die Fehler bei der Aufzeichnung oder Übertragung von Daten zu erkennen. Dazu wird einer Datenmenge ein Paritätsbit zugeordnet, dessen Wert aus den Datenbit berechnet wird. Bei gerader Parität ist die Anzahl der Einsen von Daten- und Paritätsbit gerade, die Modulo-2-Summe aller Bit also gleich null. Bei ungerader Parität ist die Anzahl der Einsen dagegen ungerade, die Modulo-2-Summe aller Bit also gleich eins. Außerdem gibt es noch die Paritäten Mark und Space. Partitionieren Aufteilen einer Festplatte in logische Laufwerke (z.B. mit FDISK), die danach gemäß dem zu verwendenden Betriebssystem formatiert werden. PC 1. Abk. für Personal Computer. 2. Der erste Personal Computer von IBM mit 8088-Prozessor und 8-Bit-Datenbus. PC-DOS Abk. für Personal Computer-DOS; meint die DOS-Implementierung von IBM. PCI Abk. für Peripheral Component Interconnect. Ein von Intel initiierter Bus-Standard, der meist mit 32 Bits und bis zu 33 MHz arbeitet. Eine 64-Bit-Version ist mit dem Standard 2.0 vorgesehen. Kennzeichnend für PCI ist die Entkopplung von Prozessor und Erweiterungsbus durch eine Bridge. Die Transferrate beträgt bei 32 Bits maximal 133 MByte/s, bei 64 Bits 266 MByte/s. Bursts werden mit beliebiger Länge ausgeführt. PCMCIA Eine Schnittstelle für scheckkartengroße Adapter (Speichererweiterungen, I/O-Karten, Laufwerke), die in einen PCMCIA-Slot eingesetzt werden. Pentium Ein Mitglied der 80x86-Familie und Nachfolger des i486. Herausragendes Kennzeichen ist die Superskalar-Architektur mit den beiden Integer-Pipelines u und v. Sie können so genannte einfache Befehle parallel ausführen, d.h. zwei Befehle in nur einem Taktzyklus abschließen. Eine verbesserte Gleitkommaeinheit erhöht die Leistung zusätzlich. PentiumPro Die Prozessorgeneration von Intel in kompromissloser 32-Bit-Technologie, auf der alle Nachfolgemodelle basieren (z.B. Pentium III). Der PentiumPro integriert einen L2-Cache zusammen mit dem CPU-Die in einem einzigen Gehäuse. Der Cache läuft über einen dedizierten L2-Cache-Bus mit dem vollen CPU-Prozessortakt. Peripherieeinheit Ein Gerät oder eine Einheit, die außerhalb des Systems CPU-Hauptspeicher liegt. PGA Abk. für Pin-Grid-Array. Eine Gehäuseform, bei der die Anschlüsse als Stifte oder Pins auf der Gehäuseunterseite ausgebildet sind. Physikalischer Adressraum Die Anzahl der physikalisch adressierbaren Bytes. Er ist durch die Zahl der Adressleitungen eines Prozessors oder die Menge des installierten Speichers gegeben. PIC Abk. für programmierbarer Interrupt-Controller. Ein Baustein für die Verwaltung mehrerer Hardware-Interrupts und die geordnete Weiterleitung an eine CPU, die üblicherweise nur einen Eingang für solche Interrupt-Anforderungen aufweist. Der PIC arbeitet also auch als Multiplexer für die Hardware-Interrupts.
Sandini Bib Glossar
1199
PIO Abk. für programmierter I/O. Beim PIO werden Daten zwischen dem Hauptspeicher und einer Peripherieeinheit nicht über DMA, sondern mit Hilfe von IN- und OUT-Befehlen über die CPU ausgetauscht. Pipeline Stage Siehe Pipeline-Stufe. Pipeline-Stufe Eine Einheit oder Stufe einer Pipeline, die eine festgelegte Teilaufgabe einer Gesamtaufgabe erledigt. Eine Pipeline für einen Speicherzugriff z.B. kann die vier Pipeline-Stufen Adressberechnung, Adressausgabe, Einlesen des Werts und Abspeichern in einem Register aufweisen. Eine Befehls-Pipeline umfasst z.B. die Stufen Befehl holen, Befehl dekodieren, Befehl ausführen, Ergebnis zurückschreiben. Pipelining Der Beginn einer Funktionsausführung des nächsten Zyklus, bevor die Funktionen des gegenwärtigen Zyklus abgeschlossen sind. Beispielsweise gibt der 80286 schon die Adresse für den nächsten Lesezyklus aus, bevor die Daten des gegenwärtigen Zyklus von ihm übernommen worden sind. Man bezeichnet dies als Adress-Pipelining oder Pipelined-Adressierung. In ähnlicher Weise kann ein Prozessor in einer frühen Pipeline-Stufe mit der Ausführung von Teilen eines komplexen Befehls beginnen, bevor der vorherige Befehl in der letzten Pipeline-Stufe abgeschlossen ist. PIT Abk. für programmierbarer Intervall-Timer. Ein Baustein, der einen Impuls ausgibt, wenn ein programmiertes Zeitintervall verstrichen ist. In den ursprünglichen PC-Designs ist hierfür der 8253 oder sein Nachfolger, der 8254, vorhanden. Pixel Kurzform für Bildelement (engl. Picture Element). Ein Punkt auf einem Monitor, im Allgemeinen wird die Bezeichnung Pixel nur im Grafikmodus verwendet. Einem Pixel können dann ein oder mehrere Bits zugeordnet sein, die Farbe und Helligkeit des Bildelements bestimmen. PLA Abk. für Programmable Logic Array, dt. programmierbares Logikfeld. Ein hochintegrierter Baustein mit Logikgattern, der auch als ASIC Verwendung findet, und dessen Logik bei der Herstellung oder vom Benutzer frei programmiert werden kann. Ein PLA weist üblicherweise ein Feld von UND-Gattern und ein Feld von ODER-Gattern auf. Durch Kombination von UND und ODER kann jede beliebige logische Verknüpfung realisiert werden, so wie sich aus 0 und 1 alle Zahlen aufbauen lassen. Platine Auch als Board bezeichnet. Eine Karte, die elektronische Bausteine und Leiterbahnen zu deren Verschaltung aufweist. PLCC Abk. für Plastic Leaded Chip Carrier. Eine Gehäuseform, bei der die Kontakte auf allen vier Seiten des Gehäuses umlaufend gebildet sind. Plug&Play Steht für Einstecken und Loslegen, d.h., neue Hardware wird nach dem Anschluss oder Einbau idealerweise automatisch erkannt und konfiguriert.
Sandini Bib 1200
Glossar
PMOS Abk. für P-Kanal MOS. Eine Technologie zur Herstellung von MOS-Transistoren, bei denen die Kanalleitfähigkeit auf positiv geladenen Löchern beruht. Polarisation Schwingt das elektrische oder magnetische Feld einer elektromagnetischen Welle nur in einer Richtung, ist die Welle linear polarisiert. Die Richtung des magnetischen Feldes wird als Polarisationsrichtung bezeichnet. Polarisationsfilter Eine Einrichtung zur Abtrennung des Anteils einer bestimmten Polarisationsrichtung von einer elektromagnetischen Welle. Durchgelassen wird von der Welle nur der Anteil, dessen Polarisationsrichtung mit der des Polarisationsfilters übereinstimmt. Port Eine Adresse im I/O-Adressraum einer CPU. Üblicherweise wird über einen Port ein Register in einer Peripherieeinheit angesprochen. Positionierzeit Die Zeitspanne zwischen einer Anweisung zur Positionierung des Schreib-/Lesekopfes bis zu dem Zeitpunkt, an dem sich der Kopf über der angegebenen Spur befindet. POST Abk. für Power-On Self Test, dt. Selbsttest beim Einschalten. Ein Programm im ROM des PC, das alle installierten Komponenten beim Einschalten ermittelt und auf eine korrekte Funktion prüft. Mit Hilfe einer speziellen Einsteckkarte können diese Codes zur Anzeige gebracht werden, was sich insbesondere für die Fehlerermittlung empfiehlt. PPI Abk. für programmierbares Peripherie-Interface. Ein Baustein (z.B. 8255), der eine Verbindung zu Peripherieeinheiten herstellt. PPP Das Point-to-Point-Protocol von Windows legt ganz allgemein fest, wie zwei Computer über eine wie auch immer geartete Verbindung miteinander kommunizieren können. Ist Bestandteil des DFÜ-Netzwerkes. PQFP Abk. für Plastic Quad Flatpack Package. Eine Gehäuseform, bei der die Kontakte auf allen vier Seiten des Gehäuses umlaufen. Prefetch-Queue Ein kleiner Zwischenspeicher in einer CPU, in der der Prefetcher bereits die nächsten Befehle ablegt, bevor der Prozessor den gegenwärtigen Befehl abgearbeitet hat. Die Prefetch-Queue dient zur Entlastung des Bussystems und zur Vordecodierung der Befehle bei CISC-Prozessoren. Prellen Die Erscheinung, dass sich bei Betätigung einer Taste der dazugehörige Schalter zunächst schließt, dann wieder öffnet und erneut schließt. Ursache dafür ist die federnde Rückstellkraft des Tastenschalters, es handelt sich also nicht um eine gewollte zweifache Tastenbetätigung. PRN Unter DOS die Bezeichnung für den ersten Paralleldrucker. PRN ist synonym zu LPT1. Programm Eine Menge von Befehlen an eine CPU, um Daten zu verarbeiten oder Maschinen zu steuern.
Sandini Bib Glossar
1201
PROM Abk. für programmierbarer ROM. Ein Festwertspeicher, dessen Speicherdaten im letzten Herstellungsschritt oder vom Benutzer vor Ort programmiert werden können. Protected Mode Ein Betriebsmodus ab dem 80286, bei dem der Zugriff eines Task auf Code- und Datensegmente und den I/O-Adressbereich von der Prozessor-Hardware selbstständig geprüft wird. Die Adressbildung im Protected Mode ist vollkommen inkompatibel zum Real Mode; Real-Mode-Anwendungen, wie z.B. DOS, können im Protected Mode nicht ablaufen. Provider Ist ein Anbieter, der die Verbindung zum Internet herstellt. Prozessor Ein intelligenter Mikrochip, der in hohem Maße programmiert werden kann. Häufig als Synonym für CPU gebraucht. Prozessrechner Ein kleiner Computer ohne Bildschirm und Tastatur zur Steuerung von Maschinen, wie. z.B. Automotoren, Robotern oder chemischen Reaktoren. PS/2 Eine PC-Serie von IBM mit Mikrokanal, die als Nachfolger des AT konzipiert wurde. RAM Abk. für Random Access Memory, dt. Speicher mit wahlfreiem Zugriff oder Direktzugriffsspeicher. Bei einem RAM können Daten direkt oder wahlfrei (d.h. mit freier Wahl der Datenadresse) eingegeben bzw. ausgelesen werden. RAS Abk. für Row Address Strobe, dt. Zeilenadress-Abtastsignal. Ein Steuersignal für einen DRAMSpeicherchip, das den Chip anweist, die zugeführte Adresse als Zeilenadresse entgegenzunehmen und geeignet zu interpretieren. RAS-only-Refresh Eine Auffrischungsart für einen DRAM durch Ausführen eines Blindlesezyklus, bei dem zwar das RAS-Signal aktiviert und dem DRAM eine Zeilenadresse (die Refresh-Adresse) zugeführt wird, das CAS-Signal aber inaktiv bleibt. Eine Spaltenadresse ist nicht notwendig. Intern liest der DRAM eine Zeile auf die Bitleitungspaare aus und verstärkt die ausgelesenen Daten. Sie werden aber wegen des inaktiven CAS-Signals nicht zum I/O-Leitungspaar und damit zum Datenausgangspuffer übertragen. Um den gesamten Speicher aufzufrischen, muss eine externe Logik oder die CPU selbst dem DRAM nach und nach alle Zeilenadressen zuführen. Real Mode Ein Betriebsmodus der 80x86-Prozessoren, bei dem der Segmentwert einfach mit 16 multipliziert und der Offset addiert wird, um eine Speicheradresse zu erzeugen. Im Real Mode findet keine Zugriffsprüfung auf Code- und Datensegmente und den I/O-Adressbereich statt. Alle CPUs für PC können aus Kompatibilitätsgründen im Real Mode betrieben werden. Reduced Write Current Auch als verminderter Schreibstrom bezeichnet. Bei Festplatten können auf den inneren Zylindern mit hoher Nummer so genannte Bitverschiebungen auftreten, die die Aufzeichnung und Wiedergewinnung von Daten stören. Durch eine Verminderung des Schreibstroms bei diesen Zylindern wird das verhindert.
Sandini Bib 1202
Glossar
Register 1. Interne Speicher einer CPU, deren Inhalt durch Befehle oder von der CPU selbst geladen oder verändert werden kann. 2. Komponenten oder Zwischenspeicher von Peripherieeinheiten, deren Wert einen bestimmten Vorgang in der Einheit auslöst (Steuerregister) oder deren Wert den Status der Einheit angibt (Statusregister). Die Register werden entweder über Ports, d.h. den I/O-Adressraum (I/O-Mapped I/O), oder auch über den gewöhnlichen Adressraum (Memory-Mapped I/O) angesprochen. Register-Renaming Die dynamische Abbildung von physikalischen Registern eines Registersatzes innerhalb eines Prozessors auf ein bestimmtes Architekturregister dieses Prozessors. Üblicherweise sind erheblich mehr physikalische Register (beim PentiumPro beispielsweise 32) als Architekturregister (beim PentiumPro sieben Register) vorhanden. Reibungselektrizität Beim Reiben zweier unterschiedlicher Stoffe, wie z.B. einem Katzenfell an einem Glasstab, findet eine Trennung von Ladungsträgern statt. Der eine Körper lädt sich positiv, der andere negativ auf. Remanenz Die zurückbleibende Magnetisierung eines ferromagnetischen Körpers, wenn das äußere Magnetfeld abgeschaltet wird. Stoffe mit hoher Remanenz werden als magnetisch hart, solche mit niedriger Remanenz als magnetisch weich bezeichnet. Die Remanenz ist Grundlage aller magnetischen Datenaufzeichnungen. REQ Abk. für Request, dt. Anforderung. RGB Abk. für Rot-Grün-Blau. RI Abk. für Ring Indikator. Über RI teilt ein DCE einem DTE mit, dass eine externe Einheit eine Verbindung zur Datenübertragung aufbauen möchte. RIMM Rambus Inline Memory Module, relativ neues Speichermodul in 64-Bit-Breite, welches noch recht teuer ist. Wird von Intel als neue Speichertechnologie propagiert. Ringleitungsverteiler Siehe Token Ring. RISC Abk. für Reduced Instruction Set Computer, dt. Computer mit reduziertem Befehlssatz. Mikroprozessoren, die einen gegenüber CISC deutlich verminderten Befehlssatz von typischerweise weniger als 100 Maschinenbefehlen aufweisen. Kennzeichnend für RISC ist, dass die Maschinenbefehle nicht mehr mikrokodiert sind, sondern ohne Dekodierung sofort ausgeführt werden können. Bekannte Vertreter von RISC-Prozessoren sind MIPS (Microprocessor without Interlocked Pipeline Stages) und SPARC. RLL Abk. für Run Length Limited, dt. begrenzte Lauflänge. Ein Aufzeichnungsverfahren für Festplatten oder magnetooptische Laufwerke, bei dem die Zahl der aufeinander folgenden Nullen auf einen bestimmten Bereich beschränkt ist. Bei RLL 2,7 z.B. folgen immer mindestens zwei, aber höchstens sieben Nullen aufeinander. Dadurch sind keine Taktbits erforderlich.
Sandini Bib Glossar
1203
ROM Abk. für Read-Only Memory, dt. Nur-Lese- oder Festwertspeicher. ROM bezeichnet einen Speicherbaustein, aus dem nur vorher festgelegte Daten gelesen, aber in den keine Daten geschrieben werden können. Die gespeicherten Daten werden einmal festgelegt und können dann nicht mehr oder nur mit speziellen Geräten verändert werden. In einem ROM abgelegte Daten bleiben auch nach Abschalten der Spannungsversorgung erhalten. ROM-BIOS Die BIOS-Routinen des PC im ROM auf dem Motherboard. ROP (RISC-Operationen) Einfache RISC-artige Befehle analog den µ-Ops, aus denen komplexe CISCBefehle zusammengesetzt werden. RS232C Ein Standard für serielle Schnittstellen, der die Signalpegel, die Signalbedeutung, die Steckerbelegung und die Prozedur für den Aufbau einer Verbindung zwischen einem DCE und einem DTE definiert. RTC Abk. für Real Time Clock, dt. Echtzeituhr. RTS Abk. für Request to Send, dt. Sendeanforderung. Über RTS zeigt ein DTE einem DCE an, dass es Daten ausgeben möchte. Das DCE reagiert dann mit einem CTS. Scancode Ein Code, der die Tasten einer Tastatur eindeutig kennzeichnet. Er wird als Make-Code beim Drücken einer Taste an die Tastaturschnittstelle oder den Tastaturcontroller auf dem Motherboard übergeben. Wird die Taste losgelassen, so übergibt die Taste denselben Scancode mit gesetztem Bit 7 als so genannten Break-Code. Scanmatrix Eine Matrix aus gekreuzten Leitungen. In einer Tastatur befinden sich an den Kreuzungen kleine Schalter, die beim Betätigen der zugehörigen Taste die Matrix an dieser Stelle kurzschließen. Dadurch kann die gedrückte Taste ermittelt werden. Bei einem Tablett aktiviert der Controller die einzelnen Leitungen nacheinander, sodass die Position der Lupe über die Impulse bestimmt werden kann. Scanner Dt. Abtaster. Ein Lesegerät mit Sensorzeilen, das eine Vorlage, wie. z.B. ein Bild, eine Zeichnung oder ein Text, grafisch erfasst und als Bitmuster an einen PC weitergibt. Schreib-/Lesekopf Eine magnetisch aktivierbare Komponente an der Spitze eines Zugriffsarms in einem Diskettenlaufwerk oder einer Festplatte, die Daten als magnetische Bereiche auf den Datenträger schreibt oder von ihm liest. Schreibvorkompensation Siehe Write-Precompensation. Schrittmotor Ein Motor, der sich mit jedem Schrittimpuls um einen festen Winkel dreht, Zwischenstellungen sind nicht möglich.
Sandini Bib 1204
Glossar
SCSI Abk. für Small Computer Systems Interface. SCSI ist eine befehlsorientierte High-Level-Schnittstelle für externe Massenspeicher, wie z.B. Festplatten, Bandlaufwerke oder CD-ROM-Laufwerke. Die Datenübertragung erfolgt mit einer Breite von 8 Bits, bei Wide SCSI mit 16 oder sogar 32 Bits. SCSI-I standardisierte nur einen sehr geringen Befehlssatz. Mit SCSI-II wurde dieser Bus auf eine solide Grundlage gestellt, z.B. wurden zehn SCSI-Geräteklassen mit zugehörigen Befehlen definiert und der synchrone Übertragungsmodus (Fast SCSI) sowie die Erweiterung der Busbreite auf 16 und 32 Bits (Wide SCSI) spezifiziert. Für einen PC wird eine entsprechende SCSIControllerkarte – ein Host-Adapter – benötigt. SCSI-I, SCSI-II, SCSI-III Siehe SCSI. SDLC Abk. für Synchronous Data Link Control, dt. synchrone Datenverbindungssteuerung. Ein von IBM entwickeltes Protokoll für synchronen Datenaustausch. SDU Abk. für Serial Data Unit, dt. serielle Dateneinheit. Die kleinste Datenmenge, die von einer seriellen Schnittstelle oder einem UART abgegeben wird. Sie besteht aus einem Startbit, den Datenbits, ggfs. einem Paritätsbit und einem, eineinhalb oder zwei Stoppbits. Segment Ein Abschnitt des Speichers, der von einem Segmentregister oder einem Segmentdeskriptor beschrieben wird. Innerhalb des Segments werden die Objekte durch einen Offset adressiert. Sector-Slipping Die Verschiebung des Sektorbeginns innerhalb einer Festplattenspur beim Bad-Sector-Mapping, um einen geringfügigen Defekt zu überbrücken. Selektor Ein Index in einer Deskriptortabelle, um das vom Deskriptor beschriebene Segment oder Gate auszuwählen. Serial Mode Ein Modus von DRAM-Speicherchips, bei dem nach Zuführen und Dekodieren einer Zeilenund einer Spaltenadresse nur noch das CAS-Signal als Taktsignal für die Datenausgabe umgeschaltet wird. Im Gegensatz zum Page und Static Column Mode können die Daten innerhalb einer Zeile sehr schnell seriell adressiert werden. Die übergebene Zeilen- und Spaltenadresse definiert quasi den Beginn der Ausgabe. Mit jeder Umschaltung des CAS-Signals wird ein interner Adresszähler weitergeschaltet und der nächste Wert ausgegeben. serielle Schnittstelle Eine PC-Schnittstelle, die Daten in serieller Form als Bits einer SDU abgibt oder annimmt. Server Ein zentraler Rechner in einem Netzwerk, der die gemeinsamen Daten zentral verwaltet und allen Arbeitsplatzrechnern zur Verfügung stellt. Üblicherweise steuert er auch den Zugang der einzelnen Netzknoten zu Peripherieeinheiten, wie z.B. Druckern oder Modems. Shadowing Die Übertragung von ROM-Code in einen RAM, wobei anschließend der ROM aus dem Adressbereich ausgeblendet wird, und der RAM den ehemaligen Adressbereich des ROM einnimmt. Alle ROM-Zugriffe werden dann auf den schnelleren RAM umgeleitet.
Sandini Bib Glossar
1205
Silizium Chemisches Zeichen Si. Ein Halbleiter, der in der Mikroelektronik eine überragende Bedeutung erlangt hat. Durch die gezielte Einlagerung von Fremdatomen (Dotierung), wie z.B. Arsen oder Phosphor, können die elektrischen Eigenschaften von Silizium in einem weiten Bereich verändert werden. Silizium ist der Hauptbestandteil von Quarz, d.h. gewöhnlichem Sand, und steht dadurch in unbeschränktem Maß zur Verfügung. SIMM Abk. für Single In-line Memory Modul. Eine Form von Speichermodulen (8 Bit breit) mit einer Kontaktleiste zum Einstecken in eine Buchse ähnlich wie Adapterkarten. simplex Die Übertragung von Daten in einer Richtung, wobei die Übertragungsrichtung im Gegensatz zu halbduplex nicht umgeschaltet werden kann. Die Rolle der Kommunikationsteilnehmer als Sender oder Empfänger ist also unveränderlich. SIP Abk. für Single In-line Package. Eine Form von Speichermodulen (8 Bit breit) mit einer Pin-Reihe. Slocket Ein CPU-Adapter zur Montage einer gesockelten CPU in einer CPU-Slotverbindung. Slot Siehe Busslot. Snoop-Zyklus Siehe Abfragezyklus. Source Ein Leitungsanschluss eines Feldeffekttransistors. Space Eine Form der Parität, bei der das Paritätsbit unabhängig von den Daten stets gleich 0 ist. SPARC Eine RISC-Architektur, die als Besonderheit eine Vielzahl von Registern vorsieht, den ringförmig organisierten Registersatz. Einem Task oder einer Routine wird von ihnen aber nur ein Registerfenster von 32 Registern zugeordnet. SPARC-Prozessoren können ein Task-Switch sehr schnell ausführen, weil einfach das kleine Registerfenster weitergeschaltet wird und kein Abspeichern der Task-Umgebung im Speicher notwendig ist (zumindest solange der Registersatz nicht erschöpft ist). Speicherbank Eine Gruppe von Speicherchips, die gemeinsam angesprochen werden. spekulative Ausführung von Befehlen Die Ausführung von Befehlen in einem möglichen Zweig nach einem Sprungbefehl, der nur vorhergesagt, aber noch nicht verifiziert worden ist. SQFP Abk. für Surface-Mounted Quad Flatpack Package. Eine Gehäuseform für die Oberflächenmontage von Chips, bei der die Kontakte auf allen vier Seiten des Gehäuses umlaufen. Spur-Spur-Zugriffszeit Die Zeitspanne, die notwendig ist, um einen Schreib-/Lesekopf von der gegenwärtigen zur benachbarten Spur zu verschieben.
Sandini Bib 1206
Glossar
Sputtern Beim Sputtern wird ein Metall, mit dem der Träger überzogen werden soll, im Vakuum durch Ionenbeschuss zu Atomen zerstäubt. Die Atome wandern zum Träger und lagern sich dort als sehr gleichmäßige und harte Schicht ab. SRAM Abk. für statischer RAM. SRAM ist ein Direktzugriffspeicher (RAM), bei dem die Information üblicherweise durch den Zustand eines Flip-Flop gespeichert wird. Weil sich der Schaltungszustand des Flip-Flop ohne Schreibimpuls nicht verändert, muss ein SRAM im Gegensatz zu einem DRAM nicht aufgefrischt werden, daher die Bezeichnung statisch. SSI Abk. für Small Scale Integration. Damit wird eine Integration von weniger als 100 Bauelementen auf einem Chip bezeichnet. ST506/412 Eine physikalische Schnittstelle zwischen einem Festplattencontroller und einem Festplattenlaufwerk. Der Standard fordert eine Übertragungsrate von 5 MBit/s für MFM-Kodierung und eine Übertragungsrate von 7,5 MBit/s für RLL-Kodierung. Startbit Das erste Bit einer SDU, das als Trigger für den Empfänger der SDU wirkt. Static Column Mode Ein Betriebsmodus von DRAM-Speicherchips, bei dem nach Zuführen und Dekodieren einer Zeilenadresse nur noch die Spaltenadresse verändert wird. Wie im Page Mode können dann die Daten innerhalb einer Zeile sehr schnell wahlfrei adressiert werden. Im Gegensatz zum Page Mode muss im Static Column Mode das CAS-Signal jedoch nicht umgeschaltet werden, bevor eine neue Spaltenadresse angelegt wird; der Static Column Chip erkennt eine Spaltenadressänderung automatisch und dekodiert die neue Adresse auch ohne Spaltenadress-Abtastsignal CAS. Steuerbus Ein Mehrzahl von Leitungen, die im Allgemeinen Steuerinformationen oder Steuersignale parallel übertragen. Stoppbit Das letzte Bit einer SDU. Streamer Ein Bandlaufwerk, das in erster Linie zur Archivierung und Sicherung von Festplatten dient. Die Daten von der Festplatte laufen als ununterbrochener Bitstrom zum Streamer, strömen also quasi zum Magnetband. Streaming Data Procedures Ein besonderer Hochgeschwindigkeitsmodus des Mikrokanals. Die 32-Bit SDP stimmt vom Signalverlauf mit dem Burst-Modus des i486 überein (Datenübertragungsrate maximal 40 MByte/s). String Auch als Zeichenkette bezeichnet. Eine Gruppe aufeinander folgender Zeichen, die durch \0 abgeschlossen wird (ASCIIZ) oder deren Länge in einem Stringdeskriptor gespeichert ist. Strobe Dt. Abtastung oder Abtastsignal. Ein Signal, das eine Einheit, wie z.B. einen DRAM oder ein Latch, anweist, ein anderes Signal, wie z.B. eine Adresse, einzulesen.
Sandini Bib Glossar
1207
Strukturgröße Die Größe der elementaren Komponenten eines Mikrochips in ihrer geringsten Ausdehnung, also üblicherweise die Breite dieser Komponenten. Dazu gehören Source, Drain und Gate von MOSFET, Bitleitungen etc. Substrat Der Träger der Mikrochipschaltung. Auf dem Substrat werden üblicherweise die Transistoren und Leitungen der Schaltung gebildet. Meistens verwendet man Silizium als Substratmaterial, das selbst dotiert wird, um die elektrischen Eigenschaften in der gewünschten Weise einzustellen. Superskalar-Architektur Eine RISC-Prozessorarchitektur, die in getrennten Pipelines mehr als einen Befehl starten kann, z.B. einen Vergleichsbefehl in der ALU-Pipeline und eine Gleitkommaberechnung in der GleitkommaPipeline. Dadurch benötigen manche Befehle bei geschickter Programmierung im Durchschnitt weniger als einen Taktzyklus. Der Pentium und der i860 von Intel wenden das Superskalarprinzip an. SVGA Abk. Für SuperVGA. Ein VESA-Standard für Auflösungen und Betriebsmodi von Grafikkarten jenseits der VGA. synchron In der Phasen- oder Taktlage übereinstimmend oder unter Verwendung eines Taktsignals. System Management Mode Ein besonderer Betriebsmodus ab dem Pentium, der insbesondere zur Implementierung eines Stand-by-Zustands dient, in dem der Prozessor weniger Strom benötigt, z.B. durch Abschalten oder zumindest Reduzieren der Prozessortaktfrequenz. Systemtakt Ein Takt von typischerweise 66, 100 oder 133 MHz, mit dem die Motherboardelektronik arbeitet. Systemuhr Eine funktionale Gruppe in einem PC, die einen PIT, einen PIC-Kanal, die CPU und eine Datenstruktur umfasst und periodisch angestoßen vom PIT fortlaufend die Datenstruktur so aktualisiert, dass diese stets die aktuelle Zeit und das aktuelle Datum angibt. Die Systemuhr ist Teil des Betriebssystems. Das Betriebssystem verwendet die Systemuhr, um alle Dateien und Verzeichnisse mit einer Datums- und Zeitmarke zu versehen. T Symbol für Tera, d.h. das Billionenfache einer Größe, wie z.B. in THz = 1.000.000.000.000 Hz. Beachten Sie, dass bei TByte im Allgemeinen 240 Byte und nicht 1012 Byte gemeint sind. Tag Das Tag ist der wesentliche Abschnitt eines Cache-Directory-Eintrags, mit dessen Hilfe der Cache-Controller bestimmt, ob ein Cache-Hit oder ein Cache-Miss vorliegt. Das Tag speichert die Tag-Adresse, nämlich bestimmte Adressbits der zugeordneten Cache-Line. Taken Branch Siehe Branch Prediction. Task Auch als Prozess oder Job bezeichnet. Ein Task ist ein aufgerufenes und in den Hauptspeicher geladenes Programm, das vom Betriebssystem verwaltet wird. Das Betriebssystem aktiviert die einzelnen Tasks periodisch und unterbricht sie. Jeder Task hat seine eigene Umgebung. Die Unterscheidung Task und Programm ist nur bei Multitasking-Betriebssystemen von Bedeutung.
Sandini Bib 1208
Glossar
Taskregister Siehe TR. Task-State-Segment Eine Datenstruktur im Protected Mode, die einen Task beschreibt. Task-Switch Das Umschalten von einem aktiven Task zu einem anderen, gegenwärtig inaktiven Task. Dazu wird der aktive Task unterbrochen, alle wichtigen Parameter werden im TSS gesichert und der neue, bisher inaktive Task wird gezielt vom Betriebssystem aktiviert. Tastatur Ein Eingabegerät für Computer. Eine Tastatur wird üblicherweise über eine serielle Schnittstelle an einen Tastaturcontroller oder eine Tastaturschnittstelle auf dem Motherboard angeschlossen. Die Tastatur selbst besteht aus einer Scanmatrix, einem Tastaturchip und mehreren Tasten. Bei der Betätigung einer Taste übergibt der Tastaturchip einen Scancode an den Computer, der die Taste eindeutig kennzeichnet. TByte 240 Byte; nicht 1.000.000.000.000 Byte. TCP/IP Transmission Control Protocol/Internet Protocol ist das Standard-Protokoll für das Internet und auch lokale Netzwerke. Terminal Eine Einheit zur Datenein- und Datenausgabe, die nur eine einfache lokale Logik aufweist und üblicherweise über eine serielle Schnittstelle mit einem Rechner verbunden ist. Textmodus Ein Betriebsmodus eines Grafikadapters, bei dem nur die Zeichen eines bestimmten Zeichensatzes auf dem Bildschirm dargestellt werden können. Die Bildpunkte (Pixel) können nicht individuell adressiert werden. Stattdessen werden die Bildpunkte von einem Hardware-Zeichengenerator erzeugt. TIGA Abk. für Texas Instruments Graphics Architecture (oder Adapter). Ein Grafikadapter mit einem eigenen Grafikprozessor. Timer-Baustein Siehe PIT. Token-Bus Ein LAN, dessen physikalische Topologie von einem Bus gebildet wird. Darüber stülpt man eine logische Ringstruktur mit einem abgewandelten Token-Passing-Verfahren. Token Passing Ein Verfahren zur Steuerung des Netzzugriffes in einem LAN mit Ringtopologie, bei dem ein Datenpaket (das Token) fortwährend im Ring umläuft. Eine Station darf nur dann Daten senden, wenn es im Besitz dieses Tokens ist. Token Ring Ein LAN von IBM, das eine logische Ringstruktur verwendet, die aber zumindest teilweise auf einer physikalischen Sterntopologie aufbaut. Dazu sind so genannte Ringleitungsverteiler oder Konzentratoren in einem physikalischen Ring miteinander verbunden. Die Stationen selbst werden dann in einer physikalischen Sterntopologie an diese Verteiler angeschlossen, wobei aber die logische Ringstruktur weiter erhalten bleibt.
Sandini Bib Glossar
1209
tpi Abk. für track per inch, dt. Spuren je Zoll. TP-Kabel Twisted-Pair-Kabel für Netzwerkverbindungen, welches aus einzelnen Leitungen besteht, die miteinander verdrillt sind. TR Abk. für Taskregister. Ein Speicherverwaltungsregister ab dem 80286, das einen Selektor enthält, der den Deskriptor für das aktive TSS in der globalen Deskriptortabelle angibt. Trackball Eine Zeigeeinrichtung, die einer auf dem Rücken liegenden Maus ähnelt und zwei oder drei Tasten aufweist. Der Bediener dreht eine eingebettete Kugel. Durch eine Erfassung der Kugeldrehung über Sensoren kann eine Logik die Bewegungsrichtung und den Umfang der Bewegung ermitteln. Trap Eine Exception, die der Prozessor erkennt, nachdem er die Anweisung ausgeführt hat, die die Exception-Bedingung liefert. Die Rückkehradresse für den Exception Handler zeigt also auf den Befehl unmittelbar nach dem Befehl, der die Exception verursacht hat. Ein typischer Trap ist die Debug Breakpoint Exception. Der Exception Handler aktiviert den Debugger, um z.B. die aktuellen Registerinhalte anzuzeigen. Nach einem Return zur Wiederaufnahme der Programmausführung setzt der Prozessor den unterbrochenen Task mit dem nächsten Befehl fort. Trap Gate Ein Gate-Deskriptor für den Aufruf eines Interrupt Handlers. Im Gegensatz zum Interrupt Gate löscht das Trap Gate das Interrupt Flag nicht. Treiber Eine Software- oder Hardware-Einheit zur Ansteuerung einer Software- oder Hardware-Komponente. Der Treiber bietet üblicherweise eine klar definierte Schnittstelle, sodass z.B. ein Programm die Möglichkeit hat, auf ein Gerät zuzugreifen, ohne detaillierte Kenntnisse vom Aufbau und der Funktionsweise des Gerätes haben zu müssen. Triggerung Das Starten oder Anhalten eines Vorgangs durch ein externes Signal. TSOP Abk. für Thin Small Outline Package. Eine sehr flache Gehäuseform mit Kontakten auf den beiden Breitseiten. TSOP-Gehäuse werden z.B. für Flash-Speicher verwendet. TSS Siehe Task-State-Segment. TTL Abk. für Transistor-Transistor-Logik. Eine Familie von Logikelementen. UART Abk. für Universal Asynchronous Receiver and Transmitter, dt. universeller asynchroner Empfänger und Sender. Ein UART ist ein intelligenter Mikrochip für eine serielle Schnittstelle, der die Serialisierung paralleler Daten und das Einfügen der Start-, Paritäts- und Stoppbits sowie die Parallelisierung serieller Daten und die Abtrennung der Start-, Paritäts- und Stoppbits ausführt. Typische Vertreter sind der 16550 und der Z80SIO.
Sandini Bib 1210
Glossar
Überlauf Die Bedingung, dass das Ergebnis einer arithmetischen Operation für den dafür vorgesehenen Speicherplatz zu groß wird. Beispielsweise kann die Multiplikation zweier Ganzzahlen zu einem Überlauf führen, wenn das Zielregister nur eine Ganzzahl aufnehmen kann, das Ergebnis aber länger als 16 Bit ist. ULSI Abk. für Ultra Large Scale Integration. Damit wird eine Integration von mehr als 1.000.000 Bauelementen auf einem Chip bezeichnet. Universal Serial Bus Siehe USB. Unix Ein Multitasking-Betriebssystem zur gleichzeitigen Bedienung von mehreren Arbeitsplätzen. Unix ist zwar herstellerunabhängig, es gibt allerdings eine ganze Reihe spezieller Dialekte verschiedener Firmen (AIX, HP-UX, Solaris). Unterlauf Die Bedingung, dass das Ergebnis einer arithmetischen Operation zu klein für den dafür vorgesehenen Speicherplatz ist. Das ist z.B. möglich, wenn bei der Division zweier Temporary-Real-Zahlen der Divisor so groß ist, dass das Ergebnis nicht mehr als Temporary-Real-Zahl darstellbar, aber dennoch von null verschieden ist. Ist das Ergebnis zwar noch durch eine Temporary-Real-Zahl darstellbar, aber nicht mehr in normalisierter Form, so spricht man von graduellem Unterlauf. Upgrade Im Allgemeinen das Aufrüsten eines PC, etwa mit einer schnelleren CPU oder einer höher auflösenden Grafikkarte. Es existieren auch spezielle Upgrade-CPUs bzw. Upgrade-Module verschiedener Firmen, die neben der CPU auch Einheiten wie Spannungsregler oder Taktgeneratoren aufweisen und somit eine Aufrüstung ermöglichen, für die das Motherboard eigentlich nicht ausgelegt ist. u-Pipe Abk. für u-Pipeline. u-Pipeline Eine der beiden Integer-Pipelines des Pentiums. Die u-Pipeline kann alle Integer-Befehle ausführen und ist also gewissermaßen die »Haupt-Pipeline«. Urlader Siehe Bootstrap. USART Abk. für Universal Synchronous and Asynchronous Receiver and Transmitter, dt. universeller synchroner und asynchroner Empfänger und Sender. Ein USART weist gegenüber einem UART zusätzlich noch eine Logik zur synchronen seriellen Übertragung auf. USB Der Universal Serial Bus erlaubt den Anschluss von bis zu 127 USB-Geräten, wie Tastatur, Maus, Joystick, Drucker, Scanner und andere Geräte mit USB-Connector. V.90-Standard Aktueller Standard für Modems mit einer Datenrate von maximal 56 KBit/s vom Provider zum Anwender. In der Gegenrichtung sind maximal 33,6 KBit/s möglich. Im Jahre 2000 wurde von der ITU der Nachfolger V.92 definiert, der als wesentliche Neuerungen einen schnelleren Verbin-
Sandini Bib Glossar
1211
dungsaufbau ermöglichen soll, das Modem kann die Leitung zum Telefonieren freigeben und vom Anwender zum Provider sind nunmehr 48 KBit/s vorgesehen. Verminderter Schreibstrom Siehe Reduced Write Current. VESA-Local-Bus Siehe VL-Bus. VGA Abk. für Video Graphics Array oder Video Graphics Adapter. VGA wurde von IBM mit der PS/2Serie als Nachfolger für EGA eingeführt. Im Gegensatz zu den vorherigen Grafikadaptern gibt VGA ein analoges Signal ab. Video-RAM Auch als Bildschirmspeicher oder Video-Speicher bezeichnet. Im Video-RAM werden im Textmodus die Bildschirmworte und im Grafikmodus die Pixelwerte abgespeichert. Der Grafiksteuerchip liest den Video-RAM fortlaufend aus, um die eingeschriebene Information als Text oder Grafik auf dem Bildschirm auszugeben. Video-Speicher Siehe Video-RAM. Virtual-8086-Mode Ein Betriebsmodus ab dem i386, bei dem der Zugriff eines Task auf Code- und Datensegmente und den I/O-Adressbereich von der Prozessor-Hardware selbstständig geprüft wird, die Adressbildung aus Segment und Offset aber wie im Real Mode erfolgt. Dadurch können RealMode-Anwendungen in einer geschützten Umgebung ablaufen. Zusammen mit Paging sind dann mehrere Virtual-8086-Tasks parallel möglich. VLB Abk. für VL-Bus; siehe dort. VL-Bus Ein Local-Bus-Standard der VESA, der üblicherweise mit 32 Bits und bis zu 66 MHz (nur onboard) arbeitet. Im Gegensatz zum Nachfolger PCI erfolgt keine Entkopplung von Prozessor und Erweiterungsbus. VLB-Slots werden mit (E)ISA-Slots kombiniert. VLSI Abk. für Very Large Scale Integration. Damit wird eine Integration von 100.000 bis 1.000.000 Bauelementen auf einem Chip bezeichnet. VMS Abk. für Virtual Machine System. Ein Betriebssystem für DEC-Großrechner, das mit dem Konzept einer virtuellen Maschine für jeden Benutzer arbeitet. v-Pipe Abk. für v-Pipeline. v-Pipeline Eine der beiden Integer-Pipelines des Pentiums. Die v-Pipeline kann nur so genannte einfache Befehle ausführen. Die v-Pipeline wird für den zweiten Befehl eines Befehlspaares genutzt, wenn eine Befehlspaarung möglich ist. VRAM Abk. für Video-RAM. Im engeren Sinne sind damit Dual-Port-RAM-Bausteine gemeint, die für den Video-RAM von Grafikadaptern verwendet werden.
Sandini Bib 1212
Glossar
Way Siehe Weg. WE Abk. für Write Enable, dt. Schreibaktivierung. Ein Steuersignal für einen RAM-Chip, das anzeigt, dass es sich beim nächsten Zugriff um einen Schreibzyklus handelt und der RAM-Chip die zugeführten Daten an der angegebenen Adresse abspeichern soll. Weg Der Begriff Weg (oder auch engl. Way) gibt die Assoziativität eines Cache 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. Dadurch kann eine Datengruppe, die einer Cache-Line entspricht, an so vielen verschiedenen Stellen im Cache gespeichert werden, wie Wege vorhanden sind. Wide SCSI Eine Erweiterung der Breite des SCSI-Bus von acht auf 16 oder sogar 32 Bits im Rahmen von SCSI-II. Siehe SCSI. WORM Abk. für Write Once, Read Many (Times), dt. einmal schreiben, mehrfach lesen. WORM bezeichnet ein optisches Laufwerk, dessen Datenträger vom Benutzer frei beschrieben, aber nicht mehr gelöscht werden können. Wort Zwei Byte, also 16 Bit. Wortleitung Die Leitung in Zeilenrichtung in einem Speicherzellenfeld eines RAM oder ROM, die die Zugriffstransistoren einer Speicherzeile oder Page aktiviert. Die Wortleitung ist üblicherweise mit dem Gate der Auswahltransistoren verbunden. Wrap-around Übersteigt die Adresse den maximal möglichen Wert, so findet ein Umklappen oder ein Wraparound statt, weil das höchstwertige Adressbit im Adressregister oder auf dem Adressbus keinen Platz mehr hat. Das ist z.B. beim 8086 der Fall, wenn das Segmentregister den Wert ffffh und das Offsetregister ebenfalls den Wert ffffh aufweist. Ergebnis ist die 20-Bit-Adresse 0ffefh. Die führende 1 fällt als 21stes Adressbit weg, die Adresse springt von einem Wert ganz oben im Speicher zu einem Wert ganz unten. Write Allocation Tritt in einem System mit Cache und Hauptspeicher bei einem Schreibzugriff ein Fehltreffer auf, d.h., ist die zu schreibende Adresse nicht im Cache vorhanden, dann führt der Cache ein CacheLine Fill aus, um die entsprechenden Daten einzulesen. Üblicherweise wird ein Cache-Line Fill nur bei einem Lesefehltreffer ausgeführt. Write-Back Auch Copy-Back; dt. Zurückschreiben. Write-Back bezeichnet eine Cache-Strategie, bei der beim Schreiben von Daten durch die CPU die Daten lediglich in den Cache, nicht aber in den Hauptspeicher eingeschrieben werden. Das Datenschreiben in den Hauptspeicher findet nur auf explizite Anforderung (Cache Flush), oder falls eine Cache-Line ersetzt werden muss, statt. Write Precompensation Auch als Schreibvorkompensation bezeichnet. Bei Festplatten können auf den inneren Zylindern mit hoher Nummer so genannte Bitverschiebungen auftreten, die die Aufzeichnung und Wiedergewin-
Sandini Bib Glossar
1213
nung von Daten stören. Durch eine gewollte Verschiebung der einzelnen Bit beim Schreiben der Daten für diese Zylinder wird das verhindert. Man bezeichnet das als Write-Precompensation. Write-Through Auch Write-Thru; dt. Durchschreiben. Write-Through bezeichnet eine Cache-Strategie, bei der beim Schreiben von Daten durch die CPU die Daten stets in den Hauptspeicher eingeschrieben werden – das Datenschreiben findet also durch das Cache-System hindurch statt. Zusätzlich können die Daten auch im Cache-SRAM abgelegt werden, das ist aber nicht unbedingt erforderlich. X-Bus Der Anteil am Systembus des PC, der die I/O-Ports auf dem Motherboard anspricht, z.B. das BIOS oder die Register des Tastaturcontrollers. XT 1. Abk. für Extended Technology. 2. Der Nachfolger des ursprünglichen PC mit 8086-Prozessor und einem internen 16-Bit-Datenbus. Z4 Der erste frei programmierbare Digitalrechner von Konrad Zuse. Er arbeitete mit elektromechanischen Relais. Z80 Ein weit verbreiteter 8-Bit-Mikroprozessor aus CP/M-Zeiten, der auch heute noch häufig in Embedded Systems eingesetzt wird. Zeichengenerator Eine elektronische Schaltung auf einem Grafikadapter, die im Textmodus ein alphanumerisches Zeichen entsprechend der in einem ROM oder RAM gespeicherten Bitmaske für dieses Zeichen ausgibt. Der Zeichengenerator erzeugt also aus dem Zeichencode im Video-RAM die Pixel zur Darstellung des Zeichens. Im Grafikmodus liegt dagegen jedes Pixel einzeln im Video-RAM vor. Zeichenkette Siehe String. ZIF-Sockel Zero Insertion Force, Nullkraft-Sockel für die einfache CPU-Montage. Er besitzt an der Seite einen Hebel für das Lösen der CPU aus der Halterung. ZIP-Drive Spezielles Laufwerk der Firma Iomega, welches mit Disketten-ähnlichen Medien arbeitet, die es mit Kapazitäten von 100 und 250 MByte gibt. Für fast jede PC-Schnittstelle (Parallel, ATAPI, SCSI, USB) werden entsprechende Laufwerke angeboten. Zugriffszeit Die Zeitspanne zwischen der Ausgabe eines Zugriffssignals und der Ausgabe oder Annahme der Daten durch das adressierte Subsystem. Beispiele sind die Zugriffszeiten für DRAMs, SRAMs oder Festplatten. Zweierkomplement Eine Darstellung negativer Zahlen, bei der die negative Zahl durch Komplementierung aller Bits der betragsmäßig gleichen positiven Zahl und anschließende Addition von 1 erzeugt wird.
Sandini Bib
Sandini Bib
Stichwortverzeichnis Nummern und Symbole 1000Base T 1059 100BaseFX 1066, 1069 100BaseVG-Any-LAN 1039 10GBaseLX4 1071 10GE 1069 10-Gigabit-Ethernet 1069, 1070 12-Bit-, 16-Bit- und 32-Bit-FAT 868 1394 Trade Organization 1025 1394-Datenpaket 1028 16450 1163 16550 1163 16-Bit 125, 259 16-Bit-Dekodierung 726 16-Bit-ISA-Interface 727 16-Bit-Speicher 93 1-Bit-Addierer 81 1-Transistor-1-Kondensator-Zelle 527 1x-Takt 289 1/2x-Takt 290 1:1-Kopplungen 44 2-1-1-1 Burst 345 Burst-Zyklus 248 21h 162 28F010-Flash-Speicher 574 2-MByte-Pages 430 2-Wege 204, 206, 540 Interleaving 346 2x-Takt 289 3-2-2-2-Burst 249 32-Bit 125 36-Bit 430 36-Bit-Adressen 429 386 280 38600DX 1163 38600SX 1163 38605DX 1163 38605SX 1163 386SL 1163 386SLC 1163 3D-Beschleunigerchips 29 3D-Grafikkarte 46 3DNOW! 406, 468, 474 3DNOW! Professionell 495 3-Wege- und 4-Wege-Interleaving 539 4-1-1-1-Burst 348
486 282, 300 486-CPUs Übersicht 283 486-PCI-Chipset 579 4B/5B-Code-Tabelle 1058 4B/5B-Kodierungsverfahren 1061 4-Wege set-assoziativer Cache 203 5 V-Standby-Leitung 12 506 892 5x86 1163 640-KByte-Grenze 1164 64-Bit-Abschnitt bei PCI 768 64-Bit-Erweiterung 773 64B/66B-Verfahren 1071 6502 1164 68000er 1164, 1171 6845 1164 6x86 373, 1164 Konfigurationsregister 383 Registerauszug im SMM-RAM 389 80186/88 96, 1164 80286 97, 102, 104, 172, 1164 Gate-Deskriptor 103 I/O-Adressbereich 97 Register 101 Segmentdeskriptoren 102 Systemsegmenttypen 103 Task-State-Segment 104 80287 262, 1164 80386 1164 80386SX 1164 80387 1164 80387SX 1164 8042 1164 8048 1164 80486 1164 80487SX 1164 80586 1164 8080 85 8080/85 1165 8086 85, 89, 1165 Buszyklus 91 8086 Task 194 8086-Mode 131, 138, 192, 295, 1211 8086-Monitor 192 8086-Tasks 192 8087 262, 1165 8088 1165 80x86 1165 80x87 286 820 (Camino) 595
Sandini Bib 1216
82072A 1165 82077A 1165 82284 1165 82288 1165 8237A 1165 82450 1165 82489DX 1165 82491 1165 82496 1165 8250 1165, 1209 8250A 982, 1165 8250B 1165 8250C 1165 8253 698, 1165 8254 1166 8255 1112 8255A 1166 8259A 1166 8284 1166 8288 1166 8514 1166 8741 1166 8-Bit 85, 125, 259, 1061 8B/10B-Kodierung 1061 8-Wege set-assoziativer Cache 204 8x-Modes 832
A A19-A16/S6-S3 86 A20M 219, 303, 413 A23-A0 98 A31-A2 110, 218 A31-A3 304 A35-A3 413 Abbildung linearer auf physikalische Adressen 185 Abfrage 211, 213, 349, 1166 Abfragefehltreffer 349 Abfragezyklus 251, 304, 308, 309, 330, 418 -Inquire-Treffer 349 Abort 158, 1166 Abschlusswiderstand 915 Abstrahlung elektromagnetischer Wellen 289 Abtastfrequenz 35 Abtastimpuls 959 Abtastsignal 1206 Abtastung (Sampling) 35 Abwärtskompatibilität 132 AC97-Interface 594
Stichwortverzeichnis Accelerated Graphics Port 589, 741, 821, 1167 Access Points 1102 Access-Bus 686 ACK 1166 Acknowledge 158 AD15-AD0 86 Adapter 750, 1166, 1196 ADC 1166 Addiererwahrheitstafel 81 Address-Latch-Enable-Signal ALE 720 Ad-hoc-Mode 1102 Adjustable Active Filter 936 Adress-Abtastsignal 1174 Adressbereichsregister ARR0-ARR7 387 Adressbus 113, 430, 1166 Adresse 82, 134, 148, 167, 169, 184, 189, 193, 202, 753, 1166, 1185, 1201, 1212 Reihenfolge beim Burst-Lesezyklus 346 Reihenfolgen 347 Adressenkomparator 205 Adressenvergleicher 727 Adresserzeugung im Real Mode 154 Adressgrößenpräfix 165 Adressierung 82, 115, 119, 125, 146, 147, 148 Adressleitung A20 153 Adressmultiplexer 114 Adressparitätsfehler 304, 360, 414 Adress-Pipelining 92, 119, 232, 311, 344, 347, 1199 Adresspuffer 114 Adressraum 125, 129, 167, 259, 1167, 1198 Adressregister 903 Adressreihenfolge 390 Adress-Wrap-Around 219 ADS 110, 219, 304, 414 ADSC 304 ADSL 62, 1167 ADSL-Modem 65 ADSL-Router 66 ADSL-Verfahren 59 Advanced Communication Riser 846 Advanced Interrupt Controller 365 Advanced Micro Devices 1168 Advanced Programmable Interrupt Controller 588, 629, 1165 Advanced RLL 890, 1168 Advanced SCSI Programming Interface 927, 1169 Advanced Technology 4, 9, 711, 1169 AERR 414 Affinen 274
Sandini Bib Stichwortverzeichnis
Agents 461 AGP 710, 1167 AGP 2.0 und AGP 3.0 832 AGP 3.0-Standard 830 AGP Aperture Size 822 AGP Digital Display 604 AGP-Datentransfer 826 AGP-Devices 834 AGP-Grafikkarte 17, 604, 821, 825 AGP-Kommando 828, 833 AGP-Master 827 AGP-Pro 823 AGP-Register 834, 835 in der Northbridge 837 AGP-Signale 824 AGP-Slots 822 AGP-Standards 823 AGP-Struktur 821 AGP-Unterstützung 834 AGP-Zugriff 757 AGTL+ 465 AH 133 AHOLD 219, 304 Akkumulator 132, 133, 1167 Aktiv hoch 109, 1167 Aktiv niedrig 109, 1167 Aktivierungsregister 753, 992 Aktualisierungs-Interrupt 662 Aktuator 873, 874, 1167 AL 133 Alarm-Interrupt 662 Aldi-PCs 40 ALE 88 Alert On LAN-Funktion 598 Alignment Exception 243 Fehler 243 Prüfung 243 Allgemeiner Protection-Fehler 159, 183, 276 Allocate 200, 210 Allocate-Strategie 201 Allocation 1212 Alpha 326 Alpha-CPU 479 ALU 82, 1167 Am386DX 1167 Am386DXL 1167 Am386DXLV 1168 Am386DXLV/Am386SXLV 281 Am386DXL/Am386SXL 280 Am386DX/Am386SX 280
1217
Am386SX 1167 Am386SXL 1167 Am386SXLV 1168 Am486DX2 298, 1168 Am486DX4 298 Am486DXLV/Am486SXLV 297 Am486DXLV/SXLV 1168 Am486DX/Am486SX 297 Am486DX/SX 1168 Am5K86 1168 Am5x86 298 AMD 280, 281, 297, 298, 393, 405, 1167, 1168 5K86-Test 402 AMD5K86 394, 402 AMD-750-Chipset 607 AMD-Hammer-CPU 810 AMD-K6 406 American National Standards Institute 1168 American Standard Code for Information Interchange 1168 AMR-Slot 598 AMR-Standard 843 Amtsleitung 65 Analog 1168 Analog-Digital-Wandler 1166 Analoge Schaltkreise 69 Analogmonitor 1168 Analog/Digital-Wandlung Programmierung 1120 Anforderungen 137, 157 Anrufbeantworter 58 Anschluss 220 Anschlüsse und Signale 302, 373 Athlon 479 Athlon-Sockel-Typ 490 Celeron 466 Pentium III 470 USB 1017 Anschlussmöglichkeiten 3 Anschlussschema 110, 291, 293 80286 97 8088 95 i486 219 PentiumPro 413 ANSI 1168 Anwendungsprogramme 162 Anwendungsspezifischer IC 1169 AP 304 AP1, AP0 414 APCHK 304
Sandini Bib 1218 APIC 365, 426, 1165, 1168 Athlon 485 APIC-Bus 632 APIC-Modus 629, 631, 752 Apple Mac OS 8.5 1031 Application Programming Interface 1123 Programmierung 1115 Application Specific IC 1169 Applikationssegmente 102 Arbeitsplatz 53 Arbitration-Phase 917 Arbitrierung 111, 448, 1168 Vorgang 451 Architektur 1168 Arcnet 1039 Arithmetic Logical Unit, ALU 499 Arithmetical and Logical Unit 1167 Arithmetische und logische Einheit 82, 1167 ARLL 890 Array-Access-Register 401 ARRL 1168 ASCII 73, 1157, 1168, 1169 ASCII-Code 72, 73 ASCII-Zeichensatz 1042 ASIC 1169, 1184 ASPI 927, 1169 Assembler 147, 1128, 1169 Assoziativadressierung 205 Assoziativität des Cache-Systems 203 Assoziativität eines Cache 1212 Assoziativspeicher 202, 204, 1169, 1174 Asymmetrical Digital Subscriber Line 64, 1167 Asynchron 705, 1169 Asynchronous Transfer Mode (ATM) 1040 ASZ1, ASZ0 414 AT 4, 895, 1169, 1187 Befehle 1169 AT Attachment Packet Interface 1169 AT eXtended 10 ATA 895, 1169 ATA-Befehlssatz 576 ATAPI (AT Attachment Packet Interface) 23, 909, 942, 1169 AT-Architektur 712 Athlon 83, 477, 1169 für den Sockel A 489 Athlon XP 494, 610 Athlon-Chipsätze 610, 611 Athlon-Chipsets 607 Athlon-CPU-Familie 495 Athlon-CPUs 15
Stichwortverzeichnis Attachment 895, 1169 Attachment Packet Interface 909 Attachment Unit Interface 1074, 1170 Attention-Befehle 1169 ATTR7-ATTR0 414 Attribut 1169 Attributspeicher 999 der PCMCIA-Karte 1010 ATX 10 ATX-Gehäuse 13 ATX-Netzteil 501 ATX-Spannungsanschluss 12, 501 ATX-Spezifikation 2.1 14 ATX-Standard 1170 ATX-Systeme 10 AU 82 Audio Codec 97-Spezifikation (AC97) 840 Audio Modem Riser 839, 840, 841 Audio-Adapterkabel 31 Audio-Anschlüsse 30 Audio-CD-Player 939 Audio-Modem-Riser-Slot (AMR) 594 Aufbau 81, 127, 160 Gleitkomma-Pipeline 323 Integer-Pipeline 317 von parallelen Schnittstellen, Programmierung 1109 Auffrischung 529 Aufruf 144, 171 Interrupt 156 Rückgabewerte von CPUID 296, 299, 343, 391, 404, 454 Aufzeichnung 847 Aufzeichnungsformat 858 AUI 1077 AUI (Attachment Unit Interface) 1054 AUI-Anschluss 1170 AUI-Schnittstelle 1079 Ausführung 82, 152, 227, 228, 230, 1182 Ausgangssignal 995 Auslösen und Durchführen eines Task Switch 178 Ausnahmen 322 Auswahltransistoren 528, 561 Auswirkungen der Verzweigungsvorhersage 327 Autonegotiation 1057, 1062, 1068, 1078, 1079 Autopark 1170 AUX 1170 Aux-Eingang 31 Auxiliary Carry 137
Sandini Bib Stichwortverzeichnis
AUX-Netzteilanschluss 501 AX 133 A/D-Wandler 1117 A/D-Wandler-Steuerung Programmierung 1121
B Baby-AT-Boards 13 Baby-AT-Standard 1170 Back 200, 201, 211, 1212 Back Link 176 Back-Invalidierungszyklus 214 Backoff 220 Backoff-Sequenz 364 Back-to-Back-Zyklen 755 Bad-Sector-Mapping 1170 Bad-Sector-Remapping 898 Bank 539 Bank-Switching 1182 Barker-Code 1100 Barton-Core 496 Baseband 1096 Base-Standards 1049 BASIC 1170 Basic Input Output System 19, 1171 Basic Service Set Identifier, BSS-ID 1104 Basis 133, 134, 148, 164, 167, 169, 263, 666 Bits 102 BAT-Standard 1170 Baudrate 62, 969, 970, 994, 1170 Baustein 96, 1208 BCD 1170 BCD-Format 662 BCD-Zahlen 75 BCLK 415 BE0-BE3 110, 220 BE7-BE0 305, 415 Bedingte Ausführung von MOV-Befehlen 429 Bedingte Verzweigung 326 Bedingter Sprung 380 Befehl 652, 653 Cache 398 Befehlscodes 76 Befehlseinheit 82, 1188 Befehls-Fetching 129, 143, 151 Befehlskodierung 147, 149 Befehls-Line-Cache 382 Befehlspaarung 324 für die ALUs 398 Befehlsphasen der IDE-Schnittstelle 903
1219 Befehls-Pipelining 231, 282, 319, 1170 Befehls-Pool 425, 426, 427 Befehlssatz 1172 für 8086 85 Befehlsstrom 144 Befehlszähler 131, 143 Befehlszyklus 115 Beginners All-Purpose Symbolic Instruction Code 1170 Beladung des Floating-Gate 568 Belegung 51, 896 Belüftung 882 Benutzereigene Festplattentypen Definition 665 Bereichsregister für den Speichertyp 435 Bereichssteuerregister RCR0-RCR7 387 Berkeley-RISC-Konzept 234 BERR 415 Beruhigungszeit 885 Beschleunigerchips für 3D 29 Betriebsmodus 89, 537 der DRAM-Chips 536 Steuerregister der On-Chip-Caches 329 Betriebssystem 160, 1171, 1195 Funktionen 162 Bezugsfrequenz 994 BF0 305 BF1 305 BF-Jumper 1171 BF-Jumper-Stellungen 407 BH 133 BHE 98, 279 BHE/S7 86 BHOLD 374 Biased-Exponent 265 BiCMOS 80, 292 Bidirektional 1171 Bidirektionaler Bus 115 Big-Endian-Format 76, 1171 Bildbearbeitungsprogramme 56 Bildflackern 47 Bildröhrenbreite 47 Bildschirmdiagonale 47 Bildschirmspeicher 1171, 1211 Bildwiederholfrequenz 47 Binär- oder Dualsystem 72 Binärkodierte Dezimalzahl 75, 1170 Binary Coded Decimal 1170 Binary Coded Decimal Interchange Code 1180 Binary Digit 72, 1171
Sandini Bib 1220
Binary Phase Shift Keying, BPSK 1102 BINIT 415 BIOS 168, 573, 574, 579, 1171, 1203 Setup 1171 vorhanden 776 BIOS-Aufgaben 20 BIOS-Funktionen 780 für PCMCIA 1003 BIOS-Funktionsaufrufe für PCI 778 BIOS-Interrupt 668 BIOS-ROM 657 BIOS-Setup 20 BIOS-Unterstützung 458 BIOS-Update 21 Chipset 591 Bipolartransistoren 70, 80 BIST 340, 402, 1171 Bistabile Kippstufe 1183 Bistabiler Multivibrator 562, 1183 BIST-Prüfergebnis 251, 340 Bit 72, 139, 970, 1171 Bitstuffer USB 1017 Bitübertragung 1041 BL 133 BLAST 220, 248 BLE 279 Blindlesezyklus 534, 1201 Blindzugriff 700 Block 204 Bündelmodus 248 Blockdiagramm 5K86 395 Pentium 316 PentiumPro 425 Blockmodus 200, 344 Blue Lightning 291, 300, 1171 Bluetooth 63, 1095, 1100 Bluetooth Radio 1096 Bluetooth-Anwendungen 1096 Bluetooth-Einheiten 1095 Bluetooth-Profile-Spezifikation 1096 Bluetooth-Protokoll-Stack 1096 Bluetooth-Sicherheitsfunktionen 1097 Bluetooth-Standard 1096 BNC 1172 BNC-Kabel 1055 BNR 416 BOFF 220, 305 Booten 1172 Boot-Record 866
Stichwortverzeichnis
Bootsektor 865 Bootstrap 1172 BOUND 159 Boundary-Scan-Pfad 257, 359 Boundary-Scan-Register 256 Boundary-Scan-Test 286, 1172 BP3-BP2 305 BP3, BP2 416 BPI 876 bpi 1172 BPRI 416 bps 970, 1172 BR3-BR0 416 Branch 144, 151, 1172 Delay Slots 237 Prediction-Logik 316, 326 Target Buffer 326, 380 Target-Puffer 317 Trace-Message-Sonderzyklus 349, 403 Trace-Puffer 316, 326 Branch Prediction Unit 499 BRDY 220, 305 BRDYC 306 Break 994, 1172, 1203 Breakpoint 159 Anschlüsse 305, 416 Treffer 305, 416 Breitbandübertragungssystem 1033 BREQ 220, 306 Bridges 1044 Brookdale 501 Brookdale-Chipset 604 Brouter 1045 BS16 111, 220 BS8 220 BTB 316, 317, 326, 426, 1172 BU 82 Buffer Coating 1066 Buffer Empty 996 buffer underrun 880 build 1150 Built-In Self-Test 762, 1171, 1172 Bündelmodus 1172 Burst 200, 209, 248, 282, 1172 Adressreihenfolgen 391 Lesezyklus 345 Modus 248 Schreibzyklus 346 Übertragungsrate 249, 347 Write-Back-Zyklus 349 Zyklus 220, 249
Sandini Bib Stichwortverzeichnis
Burst Cache 215 Burst Limit 1059 Burst-Mode 741 Burst-SRAM-Chips 457 Bus 82, 111, 113, 114, 115, 117, 452, 750, 913, 1165, 1166, 1169, 1173, 1177, 1187, 1191, 1208, 1211 Controller 90 Fehler 415 Frequency 1171 Frequenz-Anschlüsse 305 Initialisierungssignal 415 Parking 451 Pipelining mit Burst-Datentransfer 453 Schnittstelle 426 Zyklus 91 Bus Mastering 751 Busarbitrierung 749 BUSCHK 306 Busmaster 750 Busmaster-DMA 713 Busmaster-DMA-Betrieb 910 Busmastering 750, 1012 Busmaster-Schnittstelle 702 Busprotokoll Athlon 479 Busslots 719 Bussystem 37, 705 BUSY 98, 111 Buszugriffsrechte (Arbitration) 687 Buszyklus für schreibenden Zugriff auf I/O-Adressraum 127 BX 133 BX-Chipset 592 Bypassing 234, 258 Byte 72, 905, 1173 Byte Mode 964 Byte-Granularität 163
C C 1173 C3-Prozessoren 474 C-64 1164 Cache 119, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 211, 214, 306, 1165, 1173, 1207 Abfragezyklus 218 Attribute 414 Caching auf Page-Ebene 331 Datentestregister TR3 253
1221 Flush 241, 255 Inhibit-Bit 336 Invalidation 221 Kohärenz 399 Line Fill 306, 344 Fill-Puffer 225 Fill-Zyklus 222 Größe 328 Puffer-Zugriffe 254 Strategie 245 Testregister TR3 bis TR5 253 Test-Statusregister TR4 254 Unit 224 Cacheable Area 206, 585 Tag-RAM 207 Cache-Controller Athlon 488 Cache-Kohärenzprotokoll 213 Cache-Lines 803 CAD 1173 Caddy 950 Call 170 Call Gates 103, 170, 171, 1174 Call über Gate- und Segmentdeskriptor 173 CAM 204, 895, 927, 929, 1174 CAP 98 Capability List-ID 757 Capability Pointer 764 Capability-Register 757 CAPI 1174 Capture-DR 259 Card Bus-Einheiten 764 Card Control Register ISA Plug&Play 735 Card Information Structure (CIS) 1001, 1006, 1007 Card Select Number (CSN) 731, 733 Card-Bus 1011 Card-Bus-Standard 1013 Card-Service 1001 Carriage Return 1176 Carrier 1036, 1102 Carrier Extension 1059 Carrier Sense Multiple Access 1036, 1176 Carry 136 Cartridge 22, 610 CAS 534, 1174 CAS Latency, CL 547 CAS-Delay 526 Case Modding 5
Sandini Bib 1222
CAS-Erholzeiten 565 CAS-Verzögerung 526 CAS-vor-RAS-Refresh 1174 CCITT 1174 CCS 931, 1174 CD Interaktiv 1174 CD- und DVD-Laufwerke 24 CD-Brenner 26 CDDI 1048 CD-I 1174 CD-ROM 939, 940, 1174 CD-ROM-Laufwerk 31 Datenübertragungsrate 940 Funktionsprinzip 26 Interfaces 943 CD-RW 944 CD-R, Compact Disc Recordable 26, 944, 945 CD-Writer 26, 1174 Celeron 465 für den Sockel 370 466 Celeron III 473 Celeron 1175 Centaur 474 Central Processing Unit 1176 Centronics 953, 1175 Centronics-Anschluss 55 Centronics-Datenregister 966 Centronics-Schnittstelle 54, 963 CESR 355 CFG 704 CH 133 Chain 868 Chasis Intrusion 683 CheaperNet 1055, 1175 Checker 309 Checksummen-Berechnung ISA Plug&Play 733 Chip 96, 302, 698, 1164, 1175, 1208 Spaltenadresse 564 Chipping Sequence 1100 Chipsatz 1175 ETEQ 587 für Pentium 583 für Pentium II/III 590, 591 Natoma 587 Orion 587 Triton 581 Überblick 589, 591, 599, 600, 610, 611, 612 Chip-Select-Signal 724
Stichwortverzeichnis Chipsets 548, 579, 590, 595 für Pentium 4 602 von VIA und SiS 604 Cinch-Anschluss 32 CISC 226, 229, 1175 Prozessor 228 C-Konzentrator 1048 CL 133 Cladding 1066 CLD 137 Clear To Send 973, 1176 Client-Server 42 CLK 86, 98, 111, 292, 307 CLKMUL1 374 CLK2 111 CLKMUL 292 Clock Generator 689 Clock-Modus 296 Clock-Multiply-Anschluss 374 Clock-Zustand 297 Clones 280, 299 Cluster 857, 868 Cluster-Größe 868, 870 CMOS 17, 70, 79, 80, 699, 1175, 1192 CMOS-Prüfsummenfehler 663 CMOS-RAM 17, 657, 658 CMOS-RAM-Fehler 668 CMOS-Setup 657 CNR 843 CNR-Spezifikation 846 COBOL 1175 Code 71, 73, 135, 143, 353, 1168, 1172, 1203 Cache 328 CODEC 33, 840 Coder/Decoder 33 COD/INTA 98 Collision Avoidence 1098 Collision Detection 1036, 1098 Column Address Strobe 524, 526, 535, 541, 1174 COM1 1175 Comité Consultatif Internationale de Télégraphique et Téléphonique 1174 Command 115 Register 190 Common Access Method 895, 927, 929, 1175 Common Application Programming Interface 1174 Common Command Set 931, 1175 Common Magnetics 1078
Sandini Bib Stichwortverzeichnis
Common- oder Attributspeicher 1000 Communication and Network Riser Interface (CNR) 598, 843 Compact Disc 25, 939 Compact Disc Read and Writeable 944 Compact Disc Recordables 944 Compact PCI 741 Compiler 1175 Complex Instruction Set Computer 226, 1175 COM-Port 62 COM-Programme 147 Computer Aided Design 1173 Computer mit reduziertem Befehlssatz 1202 COM-Schnittstellen 990 CON 1176 Condition-Code 273 Configuration File 704 Configuration Space 744, 800 Configuration Space Enable 753 Configuration-Manager 1004 Configuration-Space-Erweiterung 764 Conforming 170, 174 Console 1176 Constant Angular Velocity (CAV) 940 Constant Linear Velocity (CLV) 940 Content Addressable Memory 204, 1174 Control Program for Microcomputers 1176 Control Unit 82, 1177 Controller 96, 114, 157, 199, 634, 1164, 1165, 1166, 1176, 1183, 1185 Controllerchip 1191 Control/Event Select Register 334, 355 Copper Distributed Data Interface 1048 Coppermine 469 Coppermine-Kern Pentium III 471 Coprozessor 159, 182, 273, 275, 276, 280, 286, 1176 Übersicht 263 Copy-Back 200, 1212 Core 1066 Gleitkommaeinheit 247 Core-Spannung 367, 475, 601 Athlon 490 Correcting Code 1180 Count Register 132 Counter Control 357 Coverage Area 1104 CPL 161
1223 CPU 67, 81, 209, 282, 295, 342, 1176 CPUPRES 416 CPUTYP 307 Registerauszug 351 Slotverbindung 1205 Taktfrequenz 199 CPU-Core-Spannungseinstellung 684 CPU-Einstellungsdaten 475 CPUID 295, 342 CPUID-Programm 511 CP/M 1176 CR 1176 CR0 131 CR0-Register 185 CR3-Register 176, 185 CR4 294, 295 CRC 862, 1176 CRIMM-Steckplatinen (Continuity RIMM) 553 Cross-Cable 1043 CS 135 CSMA/CA 1098 CSMA/CA-Verfahren 1099 CSMA/CD 1069, 1176 CSMA/CD-Verfahren 1050 CTS 1176 CTTY 981 CU 82, 1177 Curie-Punkt 850, 946 Curie-Temperatur 850, 1177 Current-Privilege-Level 161 CX 133 Cx486S 299 Cx486S2/50 299 Cx487S 300 Cyclic Redundancy Check, CRC 861, 1022, 1075, 1176 Cyclic Redundancy Code 1176 Cyrix 282, 299, 300, 373, 1177 Cyrix III 474
D D15-D0 99 D31-D0 111, 221 D63-D0 307, 416 DAC 1177 Daisy Chained 1026 Darstellung 266 von Gleitkommazahlen 263 von Zahlen 268
Sandini Bib 1224 Data Bypassing 380, 397 Data Carrier Detect 973, 1177 Data Carrier Equipment 972 Data Communication Equipment 1177 Data Link Layer (DLL) 809, 1074 Data Set Ready 974, 1179 Data Signal Rate Detector 974 Data Terminal Equipment 972, 1179 Data Terminal Ready 974, 1179 Data-In-Phase 919 Dateien 73 Dateizuordnungstabelle 867 Daten 113, 114, 134, 135, 136, 146, 217, 449, 919, 960, 972, 993, 1177, 1179 Cache 399 Fernübertragung 1177 Paritätsfehler 360 Datenfernübertragungsprotokolle 59 Datenregister 190 Datenträger 1177 Datentransfer im 8x-Mode 833 Datenübertragung 886, 972, 1177 Übertragungseinrichtung 1177 Übertragungsrate 344 Datenübertragungsrate DVD 949 DBSY 416 DC balanced 1061 DCD 1177 DCE 972, 1177 DD 1177 DDR-DIM-Moduls 552 DDR-RAM 552, 935 DDR-SDRAM 501, 596, 609 DDR-SDRAM-Module 549 DE 334 Debug 137, 176, 339, 444 Debugging-Extension-Bit 334 Modussteuerregister 356 Register 305, 416 Steuerregister 445 Debug-Port Athlon 492 Dedizierter Cache-Bus 425 DEFER 417 Deferred-Response 417 Defragmentierung 1177 Dekodiereinheit 226 Dekodierphase 232 Dekodierung 723 von MFM-Daten 859
Stichwortverzeichnis Dekodierzeit 226, 230 Delay Slots 237 Delayed Branch 237 Delayed Jump 237 Delayed Transaction 801 Demand Priority Medium Access, DPMA 1039 Demand-Paging 1197 Demodulierung 60 DEN 89, 417 DEP7-DEP0 417 Deskriptor 160, 163, 164, 167, 1177 Deskriptortabelle 163, 165, 174, 1187, 1188, 1190, 1191 Deskriptortabellenregister 156, 1187, 1188, 1190, 1191 Destination-Index 135 Deutsche Industrie Normenausschuss 1178 Device Objects 1143 Device-Deskriptor 1019, 1021 Device-I/O-Controls 1150 Dezimal- und Binärsystem 72 Dezimalbruch 264 Dezimalzahl 72 DFÜ 1177 DH 134 DHOLD 374 Diagnose 663 Diamagnetismus 847, 1177 DID7-DID0 417 Die 301, 1177 Dielektrikum 533 Dienstgüten 1102 Differential SCSI 933, 934 Digital 1178 Digital Analog Converter 46 Digital Flat Panel Grafikkarten 50 Digital Versatile Disc (DVD) 25, 26, 947, 1179 Digital Visual Interface 50 Digital-Analog-Converter 1177 Digital-Analog-Wandler 1177 Digitaler Schaltkreis 69 Digitalmonitor 1178 DIMM 1178 Kontaktbelegung 544 DIM-Module 543 DIMM-Steckplatz 541, 543 DIN 1178 DIN-Buchse 37, 1178 DIP 1178
Sandini Bib Stichwortverzeichnis DIP-Schalter 17, 18, 658, 1178 Direct AGP 593 Direct Draw 821 Direct Mapped Cache 204, 206 Direct Memory Access 1178 Direct RAMBus 552 Direct Sequence 1098 Direct Sequence Spread Spectrum, DSSS 1095, 1099, 1101 Direction 137 Directory 185, 202, 203, 430, 1197 Eintrag 202, 1207 Table-Einträge 388 DirectX 34, 468, 1178 Direkter Speicheroperand 148 Direkter Speicherzugriff 634, 750, 1178 Direktzugriffsspeicher 1179, 1201 Disk Mirroring 16 Disk Operating System 19, 1178 Disk Stripping 16 Disketten 22, 1165, 1178, 1183, 1191 Controller 1165 Diskettencontroller 855 Diskettenfunktionsprinzip 851 Diskettenlaufwerk 2, 853 Reihenfolge festlegen 22 Diskettenspur 861 Dispatch/Ausführungseinheit 427 Dispersion 1065, 1070 Displacement 148, 150 Display Cache 593 Division durch Null 159, 275 DIX-Connector 1054 D-Kanal-Protokoll 64 DL 134 DLAB 988, 994 DLC 282 DLC3 300 DLL (Dynamic Link Library) ActiveX 1114 erstellen 1114 für 32-Bit-Betriebssysteme 1123 mit Delphi 1127 mit Visual BASIC 1125 Programmierung 1114 DMA 96, 634, 635, 700, 750, 967, 1165, 1178 DMA-Adress-Latch 637 DMA-Adressraum 641 DMA-Architektur 716 DMA-Befehle 652 DMA-Controller 645
1225 DMA-Kanäle 635, 717 DMA-Modus 583 DMA-Segmentüberlauf 654 DMA-Verarbeitung ISA Plug&Play 738 Dolby Surround 32 Domain Validation 936 Domäne 848, 1178, 1183 Doppelwort 72, 1178, 1180 Doppelwortgrenze 121 DOS 19, 162, 202, 1178 Dotierung 1179 Double Data Rate 549 Double Data Rate SDRAMs, DDR-SDRAM 548 Double Inline Memory Module 543, 1178 Double Transition Clock 935 Double Word 72 Double-Data-Rate Athlon 490 DP0-DP3 221 DP7-DP0 308 dpi 1179 Drain 68, 532, 1179 DRAM 524, 531, 532, 537, 1179 DRAM-Funktionsweise 525 DRDOS 1179 DRDY 417 Dreidimensionale Bildschirmdarstellung 29 Dreifach-Fehler 139 DREQ 635 Drive Array 898, 1179 Drive Select 894 Driver Stack 1140 Drop-Kabel 1054 Drucker 53 Druckeransteuerung 957 Druckerarten 53 Drucker-Server 1033 DS 135, 146 DSL (Dynamic Describer Line) 846 DSR 1179 DSRD 974 DSSS-Verfahren 1100 DSZ1, DSZ0 417 DTE 972, 1179 DTE-Cache 388 DTR 1179 DT/R 89 Dual Channel DDR 550 Dual Layer 948
Sandini Bib 1226
Dual-Adressierungszyklus 747 Dual-Inline-Package 1178 Dual-Pentium 363 Dual-Port-RAM 1179 Dual-Processing Celeron 466 Dünnfilmköpfe 877 duplex 1179 Duplex-Mode 33 Duplizierung von Schreibdaten 124 Duron 610, 1169 Athlon 477, 489 DVD 25, 27, 1179 Aufbau 947 Pits und Lands 948 R 1179 RAM 1180 Random Access Memory 1180 Recordable 1179 ReWriteable 1180 RW (ReWriteable) 1180 DVD-Formate 27 DVDisc Typen 948 DVD-Laufwerke 949 DVD-Minus 951 DVD-Player-Software 29 DVD-Plus 951 DVD-RAM 950 DVD-Recordable 950 DVD-RW (Minus) 950 DVD-RW (ReWriteable) 950 DVD-R(W)-Writer 950 DVD-Typen 949 DVD+RW 950 DWord, DWort 1180 DX 134, 277, 1186 DX2 289, 1164, 1186 DX4 291, 295, 1186 Dynamic Bus Inversion 832 Dynamic Link Library 1114 Dynamic Random Access Memory 524 Dynamische Befehlsausführung 428 Dynamische Leistungsaufnahme 80 Dynamische Schaltkreisausführung 280 Dynamische Verzweigungsvorhersage 380 Dynamischer BTB-Algorithmus 326 Dynamischer RAM 1179 D/A-Wandler 33 D/C 112, 222, 307, 416 D/P 308
Stichwortverzeichnis
E EADS 221, 308 EAX 32, 133 EBCDIC-Code 1180 Ebene 299 EBP 134 EBX 133 ECC 905, 1180 Code 417 ECC-Prüfung 886 ECC-Speicher 543 Echo Cancelation 1061 Echtzeituhr 18, 667, 699, 1180, 1203 ECL 70, 80, 1180 ECP-Microsoft-Spezifikation 966 ECP-Mode 967 Register 967 ECU, EISA Configuration Utility 704 ECX 133 Edelgas 1180 EDI 135 EDO-Modus 538 EDO-RAM 544, 589 EDV 1180 EDX 134 EEPROM 569, 681, 1180 serielle 570 Effektive 148, 161 EFlag 131 Register des i486 243 EGA 1180 EIA 972, 978, 1180 EIDE-Anschluss 909, 1169 EIDE-BIOS 908 EIDE-Controller 635 EIDE-Einheiten 16 EIDE-Festplatte 23, 583, 908, 942 EIDE-Interface 681 Eigenschaften 268, 301 Eight to Fourteen Modulation (EFM) 941 Einfache Befehle 320, 1180 Einfacher Request 420 Eingeschwungene Pipeline 233 Einheit 82, 199, 228, 1182, 1198 Einheiten-ID 755 Einheitsspeicherzellen 527, 564 Einloggen 1181 Einmal-Schreib-Strategie 214 Einschaltkonfiguration Register 440
Sandini Bib Stichwortverzeichnis
Einsprungpunkt 175 SMM-Handlers 351 Einstieg und Ausstieg aus Virtual 8086 Mode 193 Eintrag 186, 202, 203 Einzelschritt 137, 159 Einzeltransfer 344 Einzyklusmaschinenbefehle 233 Ein-/Ausgabe 125 EISA 702, 703, 1181 Architektur 702 und MCA 701 EISA-CFG-Datei 704 Electrical Eraseable PROM 569, 1180 Electro Magnetic Interference 462 Electronic Industries Association 972, 1180 Electronic Numerical Integrator and Calculator 1181 Elektrisch löschbarer PROM 1180 Elektrisch programmierbar 567 Elektromagnet 847 Elektronische Datenverarbeitung 1180 EM 139 Emitter Coupled Logic 1180 Emittergekoppelte Logik 70 Empfangsdaten bereit 996 Empfangsfehler 997 Empty 996 EMS 1181 Emulate Coprocessor 139 Emu-Synthesizer-Chip 40 EMV-Vorschriften 15 Enable 137 Encryption 1097 Endeinrichtung 972, 1177, 1179 Enhanced 1180, 1181 Enhanced Capability Mode 966 Enhanced Integrated Disc Electronic (IDE) 16, 907 Enhanced-IDE-Controller 908 Enhanced-IDE-Spezifikation 907 ENIAC 1181 ENTER 146 Entkopplung von Prozessor-SpeicherSubsystem und PCI-Bus 744 Enumeration 1019, 1023 Enumerator 1136 Environmental Audio Extension 32 EPL 161 EPP-Mode 965, 966 EPP-Unterstützung 965
1227
EPP-Verbindung 965 EPROM 566, 568, 1181 Eraseable PROM 568, 1181 Ergebnis-Forwarding 379, 397, 1181 Ergebnis-Weiterleitung 379 Erholzeit 528, 530 Error 98, 111, 448, 1180 Error Correction Codes 549 Error Detecting Code 1003 Error Propagation 1062 Ersetzung von Cache-Lines 328 Ersetzungsstrategie 207, 208 Erste Ordnung 1197 Erweiterter ASCII-Code 1157, 1181 Erweiterung 73, 339, 1166 Pentium Virtual 8086 Mode 337 Real Mode 352 Request 420 Erweiterungskarte 1166 ES 136 Escape-Sequenzen 56 ESC-Befehle 271, 1181 ESDI 894, 1181 ESDI-BIOS 895 ESI 134 ET 140 Ethernet 1035, 1045, 1049, 1182 im OSI-Modell 1071 Ethernet-Frames 1073, 1074 Ethernet-LAN 1175 Ethernet-Rahmen 1074 Ethernet-Standards 1049, 1051, 1072 EU 82, 1182 EV6-Protokoll 477, 479 Athlon 490 Event Auswahlregister 443 Select-Felder 357 Zähler 355 zugeordnete Kodierungen 442 EWBE 308 Exception 137, 155, 158, 159, 182, 183, 273, 275, 276, 1182 Exception 1 159 Exception 3 159 Exception 4 159 Exception 5 159, 199, 999 Exception 6 159 Exception 7 159, 275 Exception 8 159, 182 Exception 9 182, 275
Sandini Bib 1228
Exception 10 182 Exception 11 182 Exception 12 159, 182 Exception 13 159, 183, 276 Exception 14 183 Exception 16 159, 276 Exclusive 210 Execution 82, 1182 Tracing-Bit 336 EXF4-EXF0 417 Expanded Memory 1181, 1182 Exponenten 263 Extended 135, 153, 1180, 1181, 1182 Extended Parallel Port 964 Extended Service Set, ESS 1104 eXtended Technology 4 Extension 295 Extension Type 140 EXTEST 258 eXtra Performance 494 Extra Segmente 136 E/A 1180
F Fairness-Schema 1029 Faktor 883 Familie 1165 FAMOST 568, 1182 Far 144, 170, 173 Faraday-Effekt 945, 1182, 1191 Farblaserdrucker 54 Fasertypen 1067 Fast-Ethernet 1049, 1056 Fast-path-kodiert 398 Fast SCSI 932, 1182 FAT 867 FAT-32 871 FAT-Eintrag 867 Fault 158, 1182 Fax-Modem 12 FCB 1182 Fci 1182 FC-PGA-Gehäuse 465 FDC 1183 FDDI 1047, 1183 Feature-Steuerregister 335 Fehler 159, 183, 273, 276 Fehlerstromschutzschalter 1183 Fehltreffer 200, 1173 Feldbussysteme 1043
Stichwortverzeichnis
Feldeffekttransistor 1183 Fenster 231, 1181, 1205 Fernpunkt 274 FERR 221, 308, 418 Ferromagnetikum 1183 Ferromagnetismus 848, 850, 1177, 1183 Festbereichsregister 437 PentiumPro 437 Festplatten 22, 873, 1183, 1185 Festplatten-Cache-Speicher 909 Festplattencontroller 635 Festplattenschnittstellen 892 Festverdrahtete Logik 228 Festwertspeicher 1180, 1201, 1203 FET 1183 Fiber Distributed Data Interface 1047, 1183 Fiber Optic Repeater Inter Link 1049 FIFO 1183 FIFO-Register 987 File Allocation Table 867 File Control Block 1182 Files 231 File-Server 1033 Fill 200, 202 Filter 1200 Firewire 2, 44, 1025 Firewire (IEEE-1394) 1022 Firewire-Adapter 45, 1030 Firewire-Chips 1030 Firewire-Chipset 1029 Firewire-Controller 606, 1029 Firewire-Hostadapter 1026 Firmware Hub 593, 597 First-In, First-Out 1183 Flachbildschirme 49 Flaches Speichermodell 164, 244 Flag 136, 294 i486DX4 294 Register 131 Flankentriggerung 622 Flash 570, 572, 573 Flash-Cards 576 Flash-Disks 575 Flash-Speicherkarten 3 Flip-Flop 561, 562, 563, 1183 löschen 652 Floating Gate Avalanche Injection MOS-Transistor 568 Floating Return from Protected Mode 276 Floating Set Protected Mode 276
Sandini Bib Stichwortverzeichnis
Floating-Gate 567 Floppy Disc 939 Floppy Disc Controller 681, 1183 FLT 281 FLUSH 221, 308, 418 Flush 201, 202, 1173 Flush-Acknowledge-Sonderzyklus 348 Flush-Sonderzyklus 250 FM 1183 FORIL-Standard 1049 Format 266, 1186 Formatierte Diskettenkapazität 862 Formatierte Kapazität 884 Formatregister 993 Formatumwandlung 269 Formen der DRAM-Chips 534 Formfaktor 6 Forwarding 397, 1197 Forwarding-Techniken 234 Forward-Register 753 Fotokopierer 54 FPM-RAM 589 FPU des 6x86 377 FPU-Register 370 Fragmentierung 869 Frame 185, 187 Frame Check Sequence, FCS 1075 Frame-Daten 1033 Frame-Implementierungen 1075 Framing-Fehler 997 FRC 340 FRCERR 418 FRCMC 309 Freier Zustand von Anschlüssen 315 Fremdatome 69 Frequency Hopping 1095, 1098, 1100 Frequency Hopping Spread Spectrum, FHSS 1099 Frequency Identification-Pins Athlon 484 Frequenzbänder 64 Frequenzmodulation 1183 Frequenzspreizverfahren 1099 FRSTPM 276 FS 136 FSETPM 276 Füllen einer Cache-Zeile 249 Full-Stroke-Zeit 886, 1183 Functional Redundancy Check 461 Functional Redundancy Checking 340, 403
1229
Funktion Pentium 339 Verteiler 162 Funktionen 927 Funkzellen 1100 Future I/O 805 FXCHG 324
G G 1183 Galliumarsenid 70, 1184 Galvanisierung 1184 Galvanisierungsverfahren 875 Gameport 30, 36 GAP 3 862 GART-Treiber (Graphics Address Remapping Table) AGP 834 Gate 69, 103, 161, 162, 172, 175, 177, 1184, 1188 Gate-Array 1184 Gate-Deskriptor 103, 171, 172, 177 Gateway 1034, 1045 Gauss Frequency Shift Keying, GFSK 1096 GByte 1184 GDT 101, 1184 GDTR 165, 1184 GeForce4 611 Geforderte Privilegierungsstufe 161 Gegenwärtige Privilegierungsstufe 161 Gehäuse 4, 6 NLX 9 Gelöschte Dateien oder Verzeichnisse 869 Gemultiplexter Daten- und Adressbus 90 Genauigkeit 264, 267, 275 Generator 1213 Generic Access Profile 1096 Gepackte BCD 75, 1184 Gerade Parität 1198 Geräteidentifizierungsregister DIR0 und DIR1 387 Gerätetreiber VxD 1130 Geschachtelter Task 138 Geschwindigkeitsklassen 551 Getaktete Flip-Flops 564 GFKS 1095 Giga 1183 Gigabit Ethernet 804, 1049, 1052, 1053, 1059 Gigabit-Ethernet-Standards 1069 Gigabit-Frames 1059
Sandini Bib 1230 Glasfaser 1047, 1070 Glasmantel 1066 Gleitkommaarithmetik 265 Gleitkommabefehle 268 Gleitkommadarstellung 263, 264 Gleitkommaeinheit 488 AMD5K86 398 Gleitkomma-Pipeline 316 Globale Deskriptortabelle 101, 163, 165, 1184 Globale Pages 399, 400 Funktion 429 Globale und lokale Deskriptortabelle 168 Globales Deskriptortabellenregister 1184 Globally Unique Identifier 1144 GND 87, 100, 113, 223, 315, 424 Grabenkondensator 532 Gradientenindex-Profil 1067 Gradueller Unterlauf 268, 275, 1184 Grafikadapter 28, 1180, 1184, 1211 Grafikchip 822 Grafikmodus 1184 Grafikprozessor 1185 Grant-Sonderzyklus 293 Grant-Zustand 296 Granularität 572 Granularity-Bit 164 Graphics and Memory Controller Hub 598 Graphics-Array 1211 Graphitschicht 876 Größe 1207 Größenpräfix 165 Großrechner 1185 GS 136 GTL+-Protokoll Mikroprozessoren 479 GTL+-Spezifikation 467 GUID 1145 Gunning Transceiver Logic 463
H Halbduplex 1185 Halbduplex-Modus 1061, 1069 Halbduplex-Verbindung 975 Halbleiterlaser 940 Halbleiterspeicher 230 Halt-Auto-Restart 352 Halt-Zustand 123 Halt-Zyklus 105 Handle 1185 Handler 156, 174, 904, 1188
Stichwortverzeichnis Handshake 55, 932, 964, 1024, 1185 Handshake-Signale 918 Hard Disc Controller 1185 Hardware Abstraction Layer (HAL) 362, 453 Hardware-Debugger 361 Hardware-Debug-Tool 404 Hardware-Debug-Unterstützung 361 Hardware-DMA-Anforderung 650 Hardware-Elemente für das Performance Monitoring 355 Hardware-Interrupt 137, 157, 613, 678, 698, 771, 958 Anforderungen 240, 319 Hardware-Konfigurationsregister 401 Hardware-Monitoring 20 Hardware-Multiplizierer 247, 282 Hardware-Multiplizierwerk 231 Hardware-Tree 1136 Hauptplatine 2 Hauptspeicher 15, 1185 Hayes-Befehle 1169 HD 1185 HDA 1185 HDC 1185 Head-Crash 876 Head-Disc-Assembly 873, 1185 Header 754 Headsets 1096 Heat Spreader 497 Hercules-Karte 1185 Hersteller-ID 755 Hexadezimalzahlen 74, 1185 HGC 1185 Hidden Nodes 1098 Hidden-Arbitrierung 749 Hidden-Refresh 533, 534, 1185 High Memory Area 153 High Performance File System 872 High Speed Token-Ring (HSTR) 1047 High Speed Transistor Logic Athlon 479 High-Level-Formatierung 891, 1186 High-Speed-Geräte 1018 High-Speed-Modus 1023 HIMEM.SYS 153 HiperLAN2 1102 History-Bit 326, 1172 HIT 200, 309, 418, 1173 HITM 309, 418 HLDA 89, 99, 111, 221, 309 Hoher Pegel 109
Sandini Bib Stichwortverzeichnis HOLD 89, 99, 111, 221, 309 Home Agent 1105 HomePNA 845 Hopping Pattern 1100, 1101 Hop-Zuordnung 1100 Horizontales Maschinenbefehlsformat 235 Host 1186 Host Controller Interface, HCI 1095 Host-Adapter 913, 1186 Host-Bus-Adapter 1005 Host-Channel-Adapter (HCA) 805 Hot Plugging 912, 1018 HSTL+ Athlon 479 Hub 1016, 1043 Managed 1043 Hub-Architektur 592 Hub 1186 Hyper Threading 501, 604 Hyper-Page-Mode 538 Hyperterminal 58 HyperTransport 611, 810 HyperTransport-Device-Typen 811 HyperTransport-Links 810, 812 HyperTransport-Topologien 812 Hysterese 562 Hystereseschleife 849
I I2C-Bus 686 I2C-Bus-Datenübertragung 688 i386 110, 117, 127, 128, 132, 139, 141, 153, 160, 163, 172, 176, 277, 278, 1186 i386-Bus 123 i386/i486-kompatible Pentium Virtual 8086 Mode 337 i387 268, 269, 272, 274, 275, 278, 1186 i486 246, 247, 259, 284, 286, 289, 295, 1186 Page-Table-Eintrag 244, 245 Registerinhalte nach Prozessor-Reset 246 i486DX2 291 i486DX4 293, 295 i486SX 286 i487SX 284, 286, 1186 i586 1187 i860 320 i960 320 IA-32 497 IC 1187 ID 294, 333, 861
1231
IDCODE 258 ID-Code-Register 257 IDE 1187 IDE-Adressen und Register 899 Identifizierung 294, 295, 299, 342, 359 Ebene 342, 404, 454 Flag 333 Information 257 Identifizierungsregister 992 IDE-Schnittstellenkabel 896 IDE-Statusregister 902 IDT 101, 174, 1187 IDT-Limit zu klein 159 IDTR 156, 165, 1187 IEEE 266, 695, 1172, 1187 IEEE 1149.1 255, 358 IEEE 802.11a 1102 IEEE 802.3-Register 1081 IEEE 802.3-Standard 844 IEEE-1284 13, 14, 962 IEEE-1284-Betriebsarten 963 IEEE-1284-Modi 963 IEEE-1284-Standard 55 IEEE-1284-Unterstützung 966 IEEE-1394 1025 IEEE-1394-Einheiten 1025 IEEE-1394-Kabel 1027 IEEE-1394-Protokoll 1027 IEEE-Wireless LANs 1098 IERR 309, 418 IGNNE 221, 310, 418 IIBEN 281 IIL 70, 1187 Immediate 148 Implementierung 208, 265 Implizite Befehlspaarung durch den CISC-Mikrocode 322 INC 315 Index 134 Indexkopf 881 Indexregister 149 Indexspuren 881 Indicator 974, 1202 Indirekte Speicheroperanden 148 Induktion 851, 1187 Industrial Scientific and Medical 1095 Industrial Standard Architecture 1188 Industry Standard Architecture 695 INF-Dateien 1141 InfiniBand 805 Informationsdichte 859
Sandini Bib 1232
Infrarot-Schnittstelle 681 Inhaltsadressierbarer Speicher 204, 1174 INIT 310, 340, 418 Initialisierung 340, 445 Initiation Key 732, 1097 Initiator 745, 916 Injektionslogik 70 Inklusion 213 Inline-Assembler 1128 In-Order-Queue 449 Input/Output-Interface 722 Inquire-Zyklus 201, 1166, 1187 Installation Information File 1141 Institute of Electrical and Electronic Engineers 962 Instruction 82, 1188 Instruction Pointer 135 Instruction-Break 281 INT 76h 904 INTA 89 INTA-Sequenz 137 INT-Befehl 155, 157 Integer 72, 73, 247, 292, 396 Pipelines u und v 316 Integer-Pipelines 499 Integrated Circuit 1187 Integrated Services Digital Network (ISDN) 63, 1188 Integration 70, 96, 561 Integrierte Injektionslogik 1187 Integrierter Schaltkreis 1187 Intel 1187 Intel-Debug-Ports 313, 420 Intelligent Drive Electronics 895, 1187 Inter Integrated Circuit Bus 686 Interface zum BIOS 778 Interframe Gap 1059 Interleave 539, 883 Interleaved-Speicher 119 Interleaving 540 Interlock 233, 378, 1187 International Telecommunication Union 60, 1188 Interne Auffrischung 1174 Interne Datenübertragungsrate 886 Interne Mikrobefehle 228 Interne Pentium-Buspuffer 350 Interne Puffer 202 Interne Taktverdopplung 289 Interner Aufbau 6x86 376
Stichwortverzeichnis
AMD5K86 395 Athlon 487 i486 224 Interner Selbsttest 245, 251, 258, 279, 340 Internes Register des i387 271 Internes Snooping 349 Internet 1033, 1188 Interpolation 57 Interpretation 72, 185, 264, 885 Interrupt 96, 137, 155, 156, 157, 158, 162, 165, 171, 174, 175, 294, 319, 751, 904, 992, 1187, 1188 Deskriptortabelle 101 im APIC-Modus 633 Latenzzeit 240 Prioritäten 336 Trap- und Task-Gates 103 Vektor, Tabelle im Real Mode 342 Interrupt Flag 294 Interrupt Pending Flag 294 Interrupt Sharing 752 Interrupt-Acknowledge-Sequenz 618, 623 Interrupt-Active 294 Interrupt-Anforderung 614, 620, 663 Interrupt-Anforderungsleitungen 620 Interrupt-Controller 703, 1166, 1198 Interrupt-Handler 175, 617 Interrupt-Kanal ISA Plug&Play 738 Interrupt-Transfer 1023 Interrupt-Vektor 156, 625 Interrupt-Verarbeitung 815 Interrupt-Zuteilung 752 bei PCI 751 Intersegment-Aufruf 144, 170 Intervall-Timer 698, 1165, 1166, 1199 INTR 86, 99, 112, 222 INTR/LINT0 310, 419 INV 310 Invalid 210 Invalidate Data Cache 241 Invalidation 201 Invalidierungen 330 INVD 241 Inverter 79 IO Request Packets 1139 IO Trap Restart 335 IOCH (IO Controller Hub) 841 IOPL-Flag 104, 105, 179 IOPL-sensitive Befehle 105, 180, 338 IPIP-Encapsulation 1105
Sandini Bib Stichwortverzeichnis
IrDa 681 Irongate-Chipset 608 IRP-Verarbeitung 1140 IRQ 157, 1188 IRQ-Leitung 990 IRQ-Steuerlogik 987 ISA 1181, 1188 ISA-Bus 681, 695 im PCI-PC 581 ISA-Bus-Slots 701 ISA-Karten 728 ISA-Plug&Play 728, 751 ISA-Plug&Play-Devices 739 ISDN 62, 1045, 1188 ISDN-Adapter 63 ISDN-Anschlusseinheit 64 ISDN-Geräte 64 ISDN-Verbindungen 63 Isochrone Transfers 1029 Isochronous Transfers 1022 Isochronous-Betrieb 1027 Isochronous-Codes 834 Isochronous-Mode 833, 1028 Isolation-Protokoll 733 ISA Plug&Play 734 ISO-Steckverbindungen 695 ISSE2 495 ITU 60, 1188 IU 82, 1188 i.Link 1025 I/O 125, 126, 134, 138, 176, 179, 180, 197, 259, 281, 753, 1163, 1188 Port 80286 105 Trap-Restart 352 I/O APIC 632 I/O Controller-Hub 840 I/O-Adressbereich 967 I/O-Adressraum 362 I/O-Blende 14 I/O-Channel-Ready 721 I/O-Controller Hub 593, 597, 598 I/O-Permission-Bit-Map 180 I/O-Ports Programmierung 1123
J JAM-Signal 1037 Job 1207 Joshua-CPU 474 Joystick 36, 1188
1233
JTAG 286 Anschlüsse 255 Boundary-Scan-Test 404, 773 Athlon 493 Logik 256 Steuerzelle und Anschlussgruppe 358 i486DX 257 Testbus 256 Jumper 1189
K k 1189 K6 405 Kabelkategorien 1052 Kabelmodem 63 Kanal 635 Kanalbündelung 63 Kanalmaskierungsregister 651 Kapazität 876 Karte 1166 Kaskadierung 619, 643, 654 Kein Coprozessor vorhanden 159, 275 KEN 222, 311 Kennlinie 69, 80 Kennung 295 Kennzeichen auf Hardware-Ebene 230 von CISC-Mikroprozessoren 229 Kernel 161 Kernel-Mode 1138 Kernspeicher 230 Kette 73, 1206, 1213 Keyboardcontroller 657, 681 kHz 1189 kilo 1189 Klassencodes 758, 759, 760, 761, 762 Klassifizierung von Lichtwellenleitern 1066 Knopfzelle 17 Koaxialkabel 1051, 1189 Kodierung 157, 859, 888, 1057 Koerzitivität 849, 1189 Koerzitivkraft 849 Kohärenz 209, 1173 durch Inklusion 214 Kollisionserkennung 1050, 1054 Kombicontroller 1189 Kommunikation 991 Komparatoren 206 Komplett-PCs 3 Komplettsystem und Monitor 46
Sandini Bib 1234
Komprimierte Taktung 647 Komprimierungsverfahren 35 Konfiguration 753 Steuerregister 6x86 385 Konfigurationsraum 753 Konsistenz 1173 Konsole 1176, 1189 Konverter 396 Konzentrator 1043, 1046, 1189 Konzept 750 Kopf 877, 885 Platten 874 Kopplungselemente für Netzwerke 1040 Kunststoffmantel 1066 Kupferverbindungstechnologie 477
L L1-Befehls-Cache 426, 428 L1-Cache 208, 1189 L1-Daten-Cache 426, 428 L2-Cache 208, 425, 428, 457, 586, 1165, 1189 Athlon 477, 488 Celeron 465 L2-Cache-Subsysteme 213 L2CAP 1096 LAN 1033, 1189 LAN Emulation Server 1040 LAN-Adapter 41 LAN-Controller 1076, 1083 Land 26 Lands 945 Lanthanoid 1189 Large Scale Integration 1191 Laser 1190 Laserabtastung 26, 945 Laser-Dioden 1068 Laserdrucker 54 Laserstrahl 940 Latch 1190 Latch-Schaltkreise 564 Latenz 762, 885, 1190 Laufwerk 21, 22, 903, 1178 Layers 1041 Layout 861 LBA 375, 901 LBA-Mode 908 LCD 49 LC-Displays 49 LDT 101, 1190 LDTR 165, 1190
Stichwortverzeichnis
Least Recent Master, LRM 363 Least Significant Bit 1191 Least Significant Byte 1191 LEAVE 146 Leckströme 80 Leerung 201 Legacy Devices 606, 681 Legacy ISA 728 Legacy Modus 632 Legacy-Schnittstellen 1016 Leistungsaufnahme 68, 280 Leitung 1171 Leitungsverteiler 1202 LEN1, LEN0 419 Lesegeräte für Speicherkarten 3 Lesetransfer-Burst 748 LF 1190 LGDT 161 Lichtwellenleiter 1047, 1064 Übersicht 1068 Light Emitting Diode, LED 1065 Light Sleep State 765 Limit 163, 169 Limiteintrag 102 Line 200, 202, 204, 207 Line Feed 1190 Line Printer 953 Linear Feedback Shift Register (LFSR) 732 Lineare Adresse 130, 183, 185 Lineare Tags 398 Linearmotor 875, 880, 1190 Line-Fill-Puffer 253, 350 Link Manager-Protokoll, LMP 1095 Link-Interfaces 593 Linux 632 Little-Endian-Format 76, 1190 LLC-Header 1075 LLC-Schicht 1074 LM78 682 LMSW 139 Load 139, 231, 269 Load/Store-Architektur 231, 234 Lobe-Kabel 1047 Local Area Network 1033, 1189 Local Bus-Systeme 708, 1190 LOCK 88, 99, 112, 222, 311, 419 Log-Datei 871 Logical Block Addressing 908 Logical Link and Control Adaptation Protocol 1096 Logik des Controllers 890
Sandini Bib Stichwortverzeichnis
Logikelemente 77 Logikgatter 76 Logikschaltungen 76 Logisch 109 Logische Adressräume 131, 167 Logische Blockadressierung 901 Logische Struktur des SMM-RAM 351 Lokal 136, 146, 163, 165, 1190, 1191 Deskriptortabelle 101 Interrupt 310, 311, 366 Interrupt 0 419 Interrupt 1 419 Lokales Netzwerk 1033, 1189, 1191 Long 72 Long Integer 72 Long Real 266 Long Wavelength 1069 Long-Real-Format 267 Lookaside Buffer 188, 190, 248 LOOP-Bit 995 Löschbarer PROM 1181 Löschindikator 869 Low Pin Count Interface, LPC 592 Low Profile eXtended 10 Low Voltage Differential SCSI 934 Low-Level-Eigenschaften 888 Low-Level-Formatierung 881, 891, 1191 LPC-Verbindung 606 LPC, Low Pin Count 602 LPT1 1191 LPX 10 LRU 203, 207 Algorithmus 328 LRU-Ersetzungsstrategie 208 LRU-Strategie 207 LSB 1191 LSI 1191 Luftfilterung 882 LVDS 934 LWL 1047 Lichtwellenleiter 1047 LWL-Verbindungen 1064
M m 1191 MAC-Adresse 1040, 1075 MAC-Chip 1073 MAC-Engine 1073 Machine Check Exception 308 Machine System 1211
1235
MAC-Layer 1076 Magnetooptisch 939 Magnetooptische Laufwerke 945, 1191 Magnetooptische Platte 947 Magnetoresistive Materialien 877 Mainboard 13 Mainboard-Peripherieeinheiten 657 Mainboard-Steckplätze 839 Mainboard-Takt 393 Make-Code 1192, 1203 Makroassembler 147 Management 281, 294 Management Mode 350, 1207 Management Unit 82, 1194 Mantisse 263, 1192 Map-Basis 176, 180 Mapped 125 Mapped I/O 125, 1188, 1192 Mark 970, 1192, 1198 Maschinen 192 Maschinenbefehl 147, 1192 Maschinen-Check-Adressregister 334 Maschinen-Check-Typregister 334, 360 Maschinenstatuswort 100, 101, 139, 166, 1195 Maskenprogrammierbare ROMs 566 Masken-ROM 566 Maskierungsregister löschen 653 Masseleitungen (GND, Ground) 9 Master 309, 644, 750, 1173, 1181 Master File Table 871 Master/Slave-Konstellation 25 Master/Slave-Topologie 909 Matched-Memory-Zyklen 705 Math Present 287 Mathematischer Coprozessor 1164 Matrix 1192 Maus 52, 53, 1192 optische 53 Mäuseklavier 658 Maus-Pad 53 Maustreiber 52 Mauszeiger 52, 1192 Maximummodus 86, 87, 89 MBit 1192 MByte 884, 1192 MC146818 1192 von Motorola 658 MCM, Multi Modulation Carrier 1102 Mean Time Between Failures 887, 1195 Mechanismus #1 753 Mechanismus #2 753
Sandini Bib 1236 Media Access Control 1058, 1072 Medienkonverter 1043 Medium Dependent Interface 1072 Medium Scale Integration 1195 Mega 1191, 1192 Mehrfachregisterdateien 235 Mehrfachregister-Files 235 Mehrfachzugriff 1036 Mehrgeräteanschluss 64 Memory 82, 125, 153, 435, 1003, 1182, 1192, 1194 Memory Controller Hub 553, 593, 596, 602, 604 Memory Managemet Unit (MMU) 1130 Memory Translation Hub 597 Memory-Cards 575 Memory-Controller 523 Mengen 206 MESI 209, 211, 213, 1173, 1193 Bits 328 Protokoll 314, 328, 349 Zustände 328 Message Space 809 Message-Passing-Protokoll 819 MF II-Tastatur 1193 MFC-DLLs 1119 MFM 858, 888, 1193 MFM-Dekoder 860 MFM-Format 858 MFM-Verfahren 859 MHz 1193 Mickey 1193 MicroChannel 702, 741 MicroChannel Architecture 704 Microcontroller 1016 Microsoft Diagnostic 728 MIDI Processing Unit 39 MIDI-Eingänge 37 MIDI-Format 33 MIDI-Klänge 41 MIDI-Standard 36 Mikro 1191, 1193 Mikrobefehlszähler 228 Mikrochip 1193 Mikrocode-ROM 226, 1193 Mikrocontroller 96 Mikrofon 31 Mikrofoneingang 35 Mikrokanal 1193 Mikrokodierte Steuereinheit 228 Mikrokodierung 226, 1193
Stichwortverzeichnis
Mikroprogramm 226 Mikroprogrammierung 76 Mikroprogrammspeicher 228 Mikroprozessor 81, 1193 Milli 1191 Minimummodus 86, 88, 89 MioByte 884 MIPS 1194 Mirroring 16, 898, 1194 Misaligned-Zugriffe 344 Miss 200, 1173 Mittlere Positionierzeit 885 Mittlere Zugriffszeit 885, 1194 MMU 82, 1194 MMX 1194 Befehle 371 Pentium 367 Register 370 Unterstützung 199 MMX-Technologie 457 Mnemonics 147, 1194 Mnemonische Codes 147, 1169 MN/MX 86 Mobile Units 1103 MobileIP 1105 Mode 193, 361, 538, 1197 modellspezifische Register 356, 402 AMD5K86 401 PentiumPro 433 Modem 58, 59, 979, 995, 997, 1194 Befehle 59 Modem on Hold 60 Modemsteuerregister 995 Modemübertragung 64 Moden 1065 Modified 210 Modified Exclusive Shared Invalid (MESI) 210 Modifizierte Frequenzmodulation 1193 Modul 541, 1165 Modulator 1194 Modus 281, 282, 1172 MO-Laufwerke Daten von 947 Monitor 45, 1194 Abgleich 48 allgemein 46 Funktionsprinzip 48 für Standardanwendungen 47 Grundlagen 47 Monitor Coprocessor 139 Monomode 1065
Sandini Bib Stichwortverzeichnis
Moores Law 70 MOS 1194 MOS-Feldeffekttransistor 68 MOSFET 68, 79, 1194 Most Recent Master, MRM 363 Most Significant Bit 1195 Most Significant Byte 1195 Motherboard 1195 Motion Pictures Experts Group 1195 Motorola 1195 MP 139, 287 MP3 576 MPEG 1195 MPEG-Daten 1016 MPU-401 39 MR-Köpfe 877 MR-Technologie 878 MSAU 1046 MSB 1195 MS-DOS 1195 MSI 1195 MSW 101, 139, 166, 1195 MTBF 887, 1195 MTRR 435 Basisregister 438 Kapazitätsregister 436 Maskenregister 438 Multi Bus 90 Multi I/O-Controller 657, 658 Multi Level Transmission 1062 Multi Media Extensions 1194 Multi Station Access Unit 1046 Multibus 695 Multi-Cache-System 213, 1173 Multifunktionseinheit 751 Multifunktions-II-Tastatur 1193 Multilevel-Kodierungen 1062 Multilevel-Verfahren 1063 Multimode 1065, 1070 Multimode-Gradienten-Index-Fasern 1068 Multiple Access 1036 Multiplexer 1195 Multiplexing 525 Multiplikationsrate interner PLL-Oszillator 292 Multiplizierer 292 Multiport-Bridge 1044 Multiprozessorbetrieb 453 Multiprozessor-Boards 609 Multiprozessorsysteme 479 Multitasking 104, 160, 175, 1195 Musical Instrument Digital Interface 36
1237
MuTIOL 606 M/IO 89, 98, 112, 222, 307
N n 1195 NA 112, 311 Nachrichtencode PCI-Sonderzyklus 746 Nachteil der Mikrokodierung 229 Name Mangling 1118 NAN 267, 1195 NAND-Flash-Chips 577 Nano 1195, 1196 Nanometer 1196 Nanosekunden 1196 Native-Code-Compiler 1114 Near 144, 170 NEC 1196 Negative Ganzzahlen 73 Nested Task 138, 176 Netburst-Architektur 500, 511 Net-ID 1104 Nettokapazität 884 Network Terminator 63 Netzknoten 1196 Netzteil 714 Abschaltung 11 temperaturgesteuerte Abschaltung 9 Netzteilspannugen 9 Netztopologien 1033, 1034 Netzwerk 41, 1196 Netzwerkprotokoll 1045 Netzwerkverbindungen 1051 NewTechnology 1107 NexGen 586 397 Next Generation I/O 804 NGIO 804 Nibble 72, 1057, 1196 Nibble Mode 539, 964 Nicht beschränkte Größen 274 Nicht maskierbarer Interrupt 157, 1196 Nichtflüchtiger Speicher 1196 Nichtnormalisierter Operand 275 Niederwertigstes Bit 1191 Niederwertigstes Byte 1191 Niedriger Pegel 109 Nintendo 64 552 n-Kanal Anreicherungs-MOSFET 69 n-Kanal MOS 1196 n-Kanal-MOSFET 68 NLX 10
Sandini Bib 1238
NLX-Gehäuse 9 NLX-Standard 10 nm 1196 NMI 87, 112, 157, 222, 627, 714, 1196 NMI/LINT 311, 419 NMOS 70, 1196 Nodes 1016, 1025 Non 179, 658 Nonpaged-Speicher 1138 Nonreturn to Zero 1196 Nonvolatile RAM 1196 Normalisierte Darstellung 266, 1196 Northbridge 549 Chipsets 590 Northwood 498 Not a Number 267, 1195 Not Taken Branch 317, 326, 1172 NRZ 1196 NRZI-Encoder USB 1017 NRZI-Kodierung 1017 ns 1196 NT File System (NTFS) 871 NT-4.0-Architektur 1129 NTFS-Format 872 n-Überschussdarstellung 263, 265 Nubus90 1025 Null 137 Nullmodem 979, 981 Numerikeinheit 270 Nummern der modellspezifischen Register 334 Nummerregister 900 Nvidia-Chipsets 611 NVR 658, 1196
O ODER-Gatter 77 OFDM 1098 Offset 129, 156, 186, 1196 On the Fly 395 Onboard-Grafik 598 Onboard-Sound 30 Once Policy 214 Once Read Many 1212 On-Chip 208 Code und Daten-Cache 328 Gleitkommaeinheit 247 One-Time Programmable Memories 567 Only-Refresh 534, 1201
Stichwortverzeichnis
Opcode 150 Operanden 148, 150, 165, 397, 1197 Forwarding 379 Weiterleitung 379 Operating System/2 1197 Operation 137 Operationscode 150 Ops 1191 Optical Character Recognition 56 Optimierungen 353 Optisch 1192 Optokoppler 37 bei Soundkarten 38 Ordered Sets 1061 Ordinalbezeichner 1115 Organisation 200, 202, 206, 534 Orthogonal Frequency Diversion MultiplexVerfahren, OFDM 1102 OSI-Modell 1041 Oszillator 722 OS/2 1197 OTPs 567 Out-of-Order-Abschluss 381, 397, 1197 Out-of-Order-Ausführung 377 Out-Phase 919 Output-Float-Testmodus 403 Overdrive 1197 Overflow 137, 146 Override 149 Präfix 150
P P 1191 P4-Chipsets 606 P5 1197 P6-Architektur 457 Paarungsregeln 320 Packet Identifier (PID) 1021 Packetized SCSI 937 Page 119, 183, 185, 186, 187, 206, 430, 538, 1197 Directory 242, 332 Size-Extension-Bits 334 Table Eintrag 242, 332 Page-Mode 536 Page-Register 653, 700 Paging 82, 139, 140, 183, 184, 187, 189, 339, 388, 1194, 1197 Paket Bursting 1059 Paketvermittlung 1033
Sandini Bib Stichwortverzeichnis
Palette 1197 Palomino 495 Panel-Link 50 Paralleldrucker 1200 Parallele Schnittstelle 55, 953, 1197 laut IEEE1284 962 Parallel-Port anschließen 54 Parallel-Port-Signale durchschleifen 58 Paramagnetische Substanz 847 Paramagnetismus 848, 1197 Parameterblock der Festplattentypen 665 Parität 137, 157, 969, 994, 997, 1198, 1205 bei Speicherchips 543 Paritätsaktivierungsbit 994 Paritätsauswahlbit 994 Paritätsbit 62, 994 Paritätsfehler 157, 756, 997 Parity 137 Parity Error 627 Parity-Enable-Anschluss 312 Parity-Error-Signal 772 Partition 863, 864, 891 Partitionieren 1198 Partitionsgröße 870 Passing 1208 Passiver Buszyklus 123 Patch Map 38 Patch-Box 1043 Netzwerke 1043 PBGNT 311 PBREQ 311 PC 695, 696, 1198 PC100-DIMMs 591 PC-266-DIMMs 596 PC-Bus 696 PC-Bus-Signale 720 PCD 223, 311 PC-DOS 1198 PC-Gehäuse, BAT 9 PCHK 223, 312 PCI 748, 751, 755, 776, 1198 PCI AGP Controller 589 PCI-Bridge 742, 775 PCI-Bus 741, 840, 844, 845, 1059 PCI-Bus-Arbiter 581 PCI-Bus-Enumerator 1136 PCI-Bus-Kommandos 770 PCI-Bus-Slots 767 PCI-Bus-Struktur 742 PCI-Bus-Takt 633, 765 PCI-Bus-Zyklen 744
1239 PCI-Express 806, 808 PCI-Funktionen 783 PCI-Grafikkarte AGP-Grafikkarte 821 PCI-Interrupts 634, 751 PCI-ISA-Bridge 582 PCI-Klassencodes 758 PC-Innenleben 4 PCI-PC 581 PCI-Plug&Play 840 PCI-Power Management 764 PCI-Unit 783 PCI-X 799 PCI-X-Bridge 803 PCI-X-Capability 776 PCI-X-Datenübertragungen 803 PCI-X-Protokoll 800 PC-Kompatibilität 579 PCMCIA 942, 1198 PCMCIA-Einsteckkarten (Card-Bus) 61 PCMCIA-Schnittstelle 999 PCMCIA-Signale 1009 PCMCIA-Slot 1000 PCMCIA-Speicherkarten 1003 PCMCIA-Zugriffsarten 1005, 1006 PC-Netzteil 8 PC-Peripherie 45 PC-Ressourcen 729 PD765 1191 p-Dotierung 68 PE 139 PEACK 99 Peer-to-Peer-Kommunikation 819 Peer-to-Peer-Prinzip 41 Peer-to-Peer-Verbindung 1036 Pegel 998 Pegel- oder Flankentriggerung 703, 706 PEN 312 Pentium 301, 302, 337, 339, 340, 350, 362, 1198 CPUs in der Übersicht 408 EFlags 332 ID-Code 359 JTAG 358 Pipelines 317, 343 Registerauszug im SMM-RAM 352 Registerinhalte nach Reset 341 Schreibzyklen 344 Signale für MESI-Übergänge 331 Sonderzyklen 348 Steuereinheit 316 Tests 340
Sandini Bib 1240 Pentium 4 12, 494, 497 Pentium 4-Chipsets 602, 604 von SiS und VIA 604 Pentium II 457 Anschlüsse und Signale 458 Pentium II-Bus 463 Pentium II-Chipsets 587 Pentium III 467 für den Sockel 370 469 Pentium-Chipsätze Überblick 589, 591, 599, 600 Pentium-Chipsets 581, 585, 587 PentiumPro 411, 457, 1198 Registerinhalte nach Reset 446 PentiumPro-Chipsatz 82440FX 588 PentiumPro-CPU 588 PEREQ 99, 113 Performance Rating 494 Periodische Interrupt-Anforderung 662 Peripheral Component Interconnect 741, 1198 Peripherie 125, 1198 Interface 1166, 1200 Permission-Bit-Map 179, 180 Personal Computer 1 Personal Computer Memory Card International Association 999 Pfad zwischen Prozessor und Hauptspeicher 114 PG 140 PGA 109, 1198 Phantomspannung 1047 Phase Locked Loop 290 Phase-Change-Technologie 944 Phase-Change-Verfahren 27, 949 Phasenwechseltechnologie 944 PHIT 312 PHITM 312 Phone Networking Alliance 845 PHY-Chip 1077, 1080 PHY-Realisierungen 1073 Physical Address Extension 429 Physical Coding Sublayer 1074 Physical Layer Signaling 1072 Physical Medium Attachment 1072 Physical-Interface (PHY) 1029 Physikalische Tags 398 Physikalische Vielzweckregister 378 PIC 725, 1166, 1198 PICCLK 312, 419
Stichwortverzeichnis
PICD0/DPEN 312 PICD1, PICD0 420 PICD1/APICEN 313 Piconet 1095 PIIX 582, 588 PIIX4 583, 589, 691 PING-Paket für USB 1024 Pin-Grid-Array 97, 1198 Gehäuse 109 Pin-Steuerbits 357 PIO 8255-Anschlüsse Programmierung 1109 PIO- und UDMA-Modi 25 PIO-Anwendung Programmierung 1109 PIO-Betriebsarten Programmierung 1110 PIO-Modi 910 PIO-Programm für Windows 3.x 1113 Pipeline 106, 115, 119, 215, 230, 396, 1199 Adressierung 106, 232 Cache-Line Fills 347 Flush 380 Hemmungen 233 Pipelined-Adressierung 1199 Pipelining 452, 1199 Pipes 1020 PIT 698, 1165, 1166, 1199 Pit 26, 945 Pits und Lands 941 Pit/Land-Struktur 948 Pixel 47, 1199 p-Kanal Anreicherungs-MOSFET 69 MOS 1200 PLA 1199 Plastic Leaded Chip Carrier 97, 1199 Plastic Quad Flatpack Package 1200 Platine 1199 Platte 876 Platten-Cache 885, 886 PLCC 1199 PLL2, PLL1 420 PLL-Oszillator 292 PLL-Schaltung 290, 657 PLOCK 223 Plug&Play 48, 741, 1136, 1199 Plug&Play-Architektur 1137 Plug&Play-BIOS 729, 739 Plug&Play-Mechanismus 729, 730
Sandini Bib Stichwortverzeichnis Plug&Play-Register 730, 735 Plug&Play-System 1003 PM1/BP1-PM0/BP0 305 PMOS 1200 Pointer-Table-Eintrag 430 Pointing Devices 52 Point-to-Point-Protocol 1200 Point-to-Point-Protocol over Ethernet (PPPoE) 66 Polarisation 1200 Polling 990 Polling-Betrieb 910 Port 125, 134, 197, 259, 1200 Port Trunking 1069 Port-Adressen 280, 715 Portbaustein 8255 Programmierung 1109 Portzugriffe unter Windows 1123 POS 706 Positionierzeit 881, 1200 POST 1200 Posting 929 Posting-Puffer 743, 745, 746 POST-RAM 682 POST-Routine des BIOS 663, 706 POTS, Plain Old Telephone System 64 Power Management 764, 837 Power on Self Test 20, 1200 Power-down-Mode 80 PowerPC 326 PPI 1166, 1200 PPP 1200 PQFP 1200 Präambel 1071, 1074 Präfix 150 PRDY 313, 420 Precompensation 1212 Prediction 151, 1172 Preemptives Multitasking 179 Prefetcher 151, 224, 539 Prefetching 395, 763 Prefetch-Puffer 326 Prefetch-Queue 82, 83, 123, 129, 143, 151, 224, 227, 1200 auch beim 80286 107 Prellen 1200 Presence Detect 541 Primärer Pentium 363 Prinzip 199 Prioritätsagenten 449
1241
Prioritätsmodi 640 Private 258 Bus 363 Cache-Kohärenz 364 Hit 312 Hit-Modified-Signale 312 Privilegierungsstufe 160, 161, 164 Privilegstufen 1130 Programmierung 1130 PRN 953, 1200 Pro Sekunde 970 Probe 361 Datenregister 358 Modus 313, 420 Programm 137, 1200 Programmable Logic Array 1199 Programmable Option Select Register 706 Programmausführungsverfolgung 360 Programmierbar 51, 698, 1165, 1166, 1180, 1198, 1199, 1200, 1201 Programmierspannungen für Flash-PROMs 574 Programmierter I/O 1199 Programmierung 563, 903, 956 Programmierung von Netzwerkeinheiten 1071 PROM 566, 1201 Promiscuous Mode 1088 PROM-Programmer 568 Protected Mode 97, 131, 138, 160, 182, 246, 337, 1138, 1201 Virtual-Interrupt-Bit 333 Protected Virtual Address Mode 97, 160 Protection Enable 139, 166 Protection-Exception 154, 193 Protection-Level 138 Protokoll 209, 1173, 1193 Protokoll-Stack 1045 Prozeduraufruf 152 Prozess 1207 Prozessor 67, 85, 229, 280, 1201 Befehle 226 Erweiterung 1176 Transistoren 71 Prozessorbus 589 Prozessrechner 1201 Prüfung 905 PSE 334 Pseudo 154, 193, 207, 208 Pseudo Noise 1100 PS/2 1201 PS/2-Module 541
Sandini Bib 1242
PU 82 Puffer 114, 202 Pulse Amplitude Modulation (PAM) 1063 Punkt-zu-Punkt-Verbindung 1015 Push-Pull-Driver Athlon 490 Push-Pull-Technik 608 PVI 333 PWRGOOD 420 PWT 223, 311 P&P-Konfigurierung 729
Q QAM, Quadratur Amplituden Modulation 64 QDR 500 QDUMP 375 QS1, QS0 88 Quad Pumped 602 Quad Pumped Interface 500, 504 Quadlet 1029 Quadratur Amplitude Modulation, QAM 1102 Quanti Speed 495 Quelle 992 für Interrupts 158 Quick Connect 60
R RAID 16 RAM 15, 17, 699, 1179, 1192, 1201, 1211 BEDO 540 RAMBus 501 Inline Memory Module 1202 RAMBus-Chips 551 RAMBus-Probleme 597 RAMBus-Speicher 552, 596 RAMBus-Speichertechnologie 602 RAMDAC Grafikkarten 49 Random Access Memory 1201 Random Replacement 208 Random-Ersetzung 208 Rapid Execution Engine 497, 499 RAS 526, 530, 534, 539, 565, 1201 RAS Precharge Time (trp) 547 RAS-Refresh 534 RAS-to-CAS-Delay (trcd) 547 Raumklang 32 RAW 378 RD 87
Stichwortverzeichnis
RDMSR 334 RDMSR- und WRMSR-Befehlsformate 334 RDRAM-Chips 554 RDTSC 356 RDY 223 Read After-Write 378 Model-Specific Register 334 Time Stamp Counter 356 Read Only Memory 939, 1203 Read-Back-Befehl 670, 675 READY 87, 100, 113 Ready 745 Real Mode 127, 130, 153, 163, 246, 1201 Real Time Clock 657, 681, 1203 Reconsiliation Sublayer 1072 Redirection Bitmap 338 Reduced Instruction Set Computer 226, 1202 Reduced Write Current 1201 Redundant Array of Independent Discs 16 Reflexion 1068 Refresh 1185, 1201 Regel zur MFM-Aufzeichnung 859 Register 125, 127, 128, 131, 132, 133, 134, 135, 139, 148, 165, 190, 231, 272, 397, 960, 1202, 1205, 1208, 1209 Abhängigkeiten 321 Alias-Tabelle 426 Auszugbasis 352 Bypassing 234 Dateien 235 Files 235 Inhalte nach 8086-Reset 94 Renaming 378, 426 Reibungselektrizität 1202 Reihenfolge von Lese- und Schreibzugriffen 225 Remanenz 849, 1202 Remapping 763 für I/O-Adressen 764 Remapping-Tabelle 834 Renaming 397, 1202 REP 134 Repeater 1026, 1043 REQ 1202 REQ4-REQ0 420 Request 158, 448, 1188 Request to Send 973, 1203 Request-Block 927 Request-Signal 635 res 424
Sandini Bib Stichwortverzeichnis Reselection-Phase 918, 920 Reservierungsstation 426 RESET 87, 100, 113, 223, 313, 421, 445 Reset 340 Response 448 Resume 138 from System Management Mode 350, 353 Retire 397 Einheit 428 Stufe 397 Return Stack 381 RGB 1202 RI 974, 1202 Richtung 137, 1200 RIMM (Rambus Inline Memory Module) 551, 552, 602, 1202 RIMM-Sockel 602 Ring 974, 1202, 1208 Ring-0-Gerätetreiber 1004 RISC 226, 229, 230, 282, 1202 I 231 II 231 Implementierungen 234 Kennzeichen auf Software-Ebene 236 Multiplizierwerk 231 RISC Operations Athlon 488 Riser-Connector 842 Riser-Slot 606, 839 Riser-Standard 846 Riser-Varianten 839 RLE-Zähler 966 RLL 888, 889, 890, 1168, 1202 RLL 2,7 888 Roaming 1104 ROM 168, 566, 567, 1201, 1203 ROP 1203 Rotierende Priorität 640 Round Trip Delay 1050 Router 1045 Routine des Betriebssystems 187 Routing-Protokoll 1045 Routing-Tabelle 1044 Row Address Strobe 525, 526, 535, 543, 1201 RP 421 RPL 161 RQ/GT0, RQ/GT1 88 RS-232C 972, 995, 1203 RS-232C-Eingangssignal 997 RS-232C-Standard 62
1243
RS-232-Schnittstelle für Drucker 54 RS2-RS0 421 RS485-Spezifikation 933 RSM 350, 353 RSP 421 RTC 1203 RTS 1203 Rückgewinnung der Daten aus MFM-Daten 859 Run Length Limited 888, 1202 Run Length Limited Codes 1059 RUNBIST 258 Runbist-Register 258 Running Disparity 1061 RxRD 991, 996, 997 R/S 313
S S0 87, 98 S0-Bus 64 S1 87, 98 S2 87 Safe Instruction Recognition 324 Sample-RAM 40 SAMPLE/PRELOAD 258 Sampling 35 Sampling-Rate 35 SASI-Schnittstelle 913 S-ATA 911 Sättigungsspannung 69 Saturn-Chipsatz 580 Satz 1205 Scan-Code 51, 1160, 1203 Scanmatrix 51, 1203, 1208 Scanner 56, 1203 Schnittstellen 57 Scannertypen im Überblick 56 Scatter Gather Bus Mastering 751 Scatter Gather-Funktion 751 Scheduler 499 Schnittstelle 82, 894, 953, 972 Schreibaktivierung 527 Schreibdatenduplizierung beim i386 124 Schreibpuffer 201, 225, 350 Schreibschutz 852 Schreibtransfer 346 Schreibvorkompensation 1203, 1212
Sandini Bib 1244
Schreibzyklus 117 Schreib-/Lesekopf 854, 876, 1203 Schrittmotor 879, 1203 Schutz I/O-Adressbereich 179, 180 Schutzebene 138, 160 Schutzmechanismen 189 Schwarzweißmonitor 46 Schwellenspannung 69 Scoreboarding 234 Scrambler 1071 Scrambling 1063 Scratch-Pad-Register 998 SCSI 913, 927, 930, 1182, 1186, 1204 SCSI-Befehlsausführung 926 SCSI-Bus Treiberelektronik 933 zulässige Kabellängen 933 SCSI-Controllerkarten für Scanner 57 SCSI-Fast-20-Modus 932 SCSI-Hostadapter 586 SCSI-II 931 SCSI-III 931 SCSI-Messages 917 SCSI-Schnittstellenkabel 914 SCSI-Standards 930 SCSI-Steuerbyte 925 SCSI-Übertragungsrate 932 SCYC 313 SDH/SONET 1071 SDK (System Development Kit) 1130 SDLC 1204 SDP 705 SDRAM 541, 544 Timing 546 SDRAM-Kommandos 545, 547 SDRAM-Memory-Repeater 597 SDRAM-Module 546 SDRAM-Modul-Kennzeichnung 554 SDRAM-Parameter 547 SDRAM-Speichermodul 547 SDU 969, 970, 1204 SEC 589 Second-Level-Cache 199, 208, 1189 Security-Architektur 468 Segment 82, 127, 129, 131, 134, 135, 143, 145, 146, 149, 150, 151, 160, 163, 167, 182, 1204 Segment- und Zugriffstypen 102 Segmentdeskriptor 163 Segmentierung 1194
Stichwortverzeichnis
Segmentselektor 160 Segmentüberlauf 182, 275 Sektor 857, 862, 864, 900, 1170, 1204 Sektorformat 860 Selbstkorrigierender Code 1180 Selbsttest 251, 762, 1171 Selektor 160, 161, 167, 1204 Sequencer-Programm 34 Serial ATA 804, 911 Serial Data Unit 969, 1204 Serial Identifier ISA Plug&Play 733 Serial Mode 539, 1204 Serialisierung 970 der Befehlsausführung 325 Serialisierungsstatusregister 996 Serielle Dateneinheit 969, 1204 Serielle Schnittstelle 58, 61, 969, 1203, 1204 Servokopf 881 Servospuren 881 Set 202, 203, 206, 1212 Set-assoziativer Cache 204 Settle-Time 885 SGRAM 548 Shadowing 1204 Shared 210 Shared Medium 1050 Sharptooth 406 Shielded Twisted Pair 1053 Short Real 266 Shugart Associates Systems Interface 913 Shutdown 105, 123 Status 101 Zustand 106 Sichere Befehle 324 SideBand 829 SideBand-Address 827 SideBand-Address-Port 836 SIG 755 Sign 137 Signal 998 Signalpegel 978 Signaturbyte 279 Signed Integer 73 Silizium 68, 1205 SIMD 369 SIMD Extensions 2, SSE2 497 SIMM 1205 Simplex 1205 Simplexverbindung 974 Single Edge Contact 589
Sandini Bib Stichwortverzeichnis
Single Edge Processor Package (SEPP) 466, 469 Single Ended 934 Single In-line Memory Modul 1205 Single In-line Package 1205 Singlemode 1065 Single-Pipe-Execution-Bit 336 SIP 1205 SIR 324 SiS-Chipsets 587 Skalierungsfaktor 149 SL 1186 Slave 644, 725, 1181 SLC 282 SLC2 300 Slipping 1170, 1204 Slocket 592, 610, 1205 Celeron 466 Slot 1173, 1205 Slot 1 458, 466 Signalbelegung 459 Slot A Athlon 477 Athlon-Sockel-Typ 490 Slot-Time 1050, 1059 Small Computer Systems Interface 913, 1204 Small Device Interface 1181 Small Scale Integration 1206 Smart Media-Card 576 SmartDrive 202 SMB 682 SMB-Befehlsregister 558 SMBus-Funktionsweise 686 SMBus-Spezifikation 689 SMI 281, 294, 313, 422 SMIACT 294, 314 SMIADS 281 SMIRDY 281 SMM 313 Identifizierung 352 Initialisierungswerte 350 SMMEM 422 SMRAM 313 SMSW 139 Snoop-Backoff 773 Snooping 210, 211, 213, 448, 480 Snoop-Zyklus 1166, 1205 Sockel A Athlon 492 Motherboard 1169 Sockel-Typ 589
1245
Socket-Services 1001 Soft-Reset-Pin 293 Software 155, 202 Softwareinterfaces Programmierung 1130 Sonderzyklen 105, 123 80286 105 i486-Bus 250 Sound 30 Soundblaster Audigy 41 Soundblaster AWE 32 37 Soundkarte 35 High-End 34 Source 68, 134, 532, 1205 Southbridge 632, 657, 671, 687, 690 Space 970, 1198, 1205 Spalten 1174 Spaltenadresse 525 Spalten-Dekoder 529 Spannungen (ATX) 11 SPARC 1205 SPD-Daten auslesen 557 SPD-EEPROM (Serial Presence Detect) 554, 690 SPDIF 31, 33 SPD-PROM 554 SPD-Spezifikation 557 Speed Grade 551 Speicher 67, 119, 539, 541, 570, 572, 666, 1211 Speicherabbilder der Befehls- und Datenzeiger 276, 277 Speicheradressbus 698 Speicheradresse 203 im Protected Mode 169, 170 Speicherarray 551 Speicherauffrischung 698, 700, 716 Speicherbank 1205 Speicher-Benchmarks 209 Speicherchips 523 Speichereintrag 202 Speicherelement der Zelle 528 Speicherkapazität 884, 908 von MO-Laufwerken 947 Speicherkarten 576 Speicherkondensatoren 529 Speicherkonfiguration CMOS-RAM 660 Speichermedium magnetisch oder optisch 939 Speichermodule 541, 544 Speicheroperand 148 Speicherpuffer 114
Sandini Bib 1246 Speichersteuerung 114, 527 SRAM-Chips 565 Speichertransistor 561, 567 Speicherverwaltung 139, 165, 166, 167 Speicherverwaltungseinheit 82, 1194 Speicherverwaltungsregister 141 Speicherzelle mit Flachkondensator 531 Speicherzelle mit Grabenkondensator 532 Speicherzellenfeld 525 Speicherzugriffe durch einen Maschinenbefehl 152 Spekulative Ausführung 382 von Befehlen 1205 Spezifische BIOS-Routinen 776 SPGA 302, 412 SPGA-Gehäuse Athlon 491 Spindelsynchronisationssignal 898 Spitfire Athlon 489 SPLCK 422 Split Transactions 801 Split-Cycle 313 Splitter 65 SPP-Mode 964 Spread Spectrum 1099 Spreizinformation 1101 Sprung 152, 170 Spur 856 Spur-Spur Positionierzeit 885 Zugriffszeit 885, 1205 Sputtern 875, 1206 SQFP 1205 SRAM 199, 561, 564, 1165, 1206 SRAM-Speicherzelle 561 SRB 927 SRESET 293 SS 135 SSE 467 SSE2 500 SSI 1206 ST412 892 ST506/412 1206 Stabilität des Flip-Flop 563 Stack 131, 135, 145, 146, 159, 172, 182 Stage 1199 Staggered Pin Grid Array 302 Standard On-Chip Exception-Handler 274 Standard Typregister 439 Standardbusbreite 709
Stichwortverzeichnis
Stanford-Konzept 235 Stapel 272 Stapelüberlauf 146 Startbit 969, 989, 1206 States 92 State-Segment 176, 1208 Static Column Mode 538, 1206 Station Manager 1048 Stationen des LANs 1033 Statische Ausführung 280 Statische Leistungsaufnahme 80 Statischer RAM 1206 Status i387 273 Statusbyte 663 Statusregister 995, 997 Statuswort 272, 273 Statuszyklus 115 STD 137 Steckbrücken 1189 Steckkarte 702, 1166 Stellensystem 72 Sterntopologie 1035 Sternverteiler 1043 Steuerbits für i486-On-Chip-Cache 241 Steuerbus 113, 1206 Steuercode 73 Steuereinheit 82, 226, 270, 1177 Steuergate 567 Steuerlogik 995 Steuerregister 127, 131, 139, 165, 166, 294, 295, 995 CR0 101, 241, 244, 330 CR3 242 CR4 333, 399 Steuerung 126, 170, 179, 572 und Event-Auswahlregister 355, 356 Steuerwort 274 Steuerzelle 257, 359 und Anschlussgruppe 286 STM 1048 STM-64-Rahmen 1071 Stop 293, 296, 297 Stoppbit 969, 1206 Storage Area Networks 805 Store 269 Store MSW 139 STP 1053 STPCLK 293, 314, 422 StrataFlash 571
Sandini Bib Stichwortverzeichnis Strategie 199, 207 gegen Pipeline-Hemmungen 378 Stream Pipes 1022 Streamer 1206 Streaming Data Procedures 705, 1206 Streaming-Modus 937 Stretch Function 1071 String 73, 137, 1206 Strobe 55, 1206 Strobe-Impuls 959 Stromeinsparung 80 Stromsparmöglichkeiten 296 Strong Write Ordering 364, 381 strongly-ordered 397 Struktur 191, 1207 6x86-Pipeline 376 AMD5K86-Pipeline 396 Strukturgrößen 523 Studiotechnik 34 Stufe 1199 Stufenindex-Profil 1066 SU 82 Sub-Carriers 1102 Subklassencode 758 Substrat 68, 1207 Subsystem 82360SL 1163 Summenbildung 81 Super 7 406 Super-I/O-Controller 658, 681, 967 Superpipelined-Architekturen 233 Superpipelined-Superskalar 376, 425 Superskalar 233, 396 Superskalararchitektur 301, 1207 SuperState-V-Modus 1163 SuperVGA 1207 Supervisor 189 Supervisory-Chip 658, 682, 686 Surface-Mounted Quad Flatpack Package 1205 Surround 33 SUSP 374 SUSPA 375 SVGA 1207 Swapping 168 Swap-Vorgang 168 Switch 138, 140, 160, 177, 1043, 1208 Switched Fabric 804 Switch-Module 1069 SX 278, 284, 286, 1164, 1186 Symmetric Multi-Processing 502
1247
Symmetrische Agenten 449 Synchron 1207 Synchronisation 860 Synchronisierungssignal 48 Synchronous Data Link Control 1204 Synchronous DRAM 546 Synchronous Dynamic RAM 546 Synchronous Graphic RAM 548 Synthesizer 33, 39 System 281, 294, 350, 1207 System Management Bus (SMB) 555, 682, 775, 843 System Management Mode 313 System-BIOS 572 Systemcontroller 114 Systemindikator 870 System-Monitoring Chips 658 Systemsegment 103 Systemtakt 586, 591, 720, 1207 Pentium II 462 Systemuhr 1207 S/P-DIF-Standard 842
T Tabellenindikator 162 Table 185, 186, 430, 1197 Tachometer-Eingänge 683 TAE-Dose 61 Tag 202, 205, 1207 Speichereinträge i486-Cache 241 Speichereinträge Pentium-Cache 329 TAG-RAM Limitierung 585 Tag-Wort 274 Taken Branch 317, 326, 360, 1172, 1207 Taktangaben auf Chips 290 Taktbit 857 Taktfenster 860 Taktgatter 860 Taktgenerator 657 Taktsignal 860 Taktsignalgenerator 1165, 1166 Taktverdoppelung durch Flankentriggerung 290 Taktverdreifachung 291 Taktzuordnungen 591 TAP 256 Controller 256 Target 745, 916
Sandini Bib 1248
Target-Ready-Signal 773 Task 138, 140, 160, 162, 165, 175, 176, 177, 194, 1207, 1208, 1209 Gate-Deskriptor 104 Register 101 State-Segment 103, 176 Switches 179, 370 Tastatur 50, 51, 1164, 1166, 1208 Tastaturcontroller 657 Tastaturschnittstelle 51 Tastencodes 1157, 1160 TBE 991, 996 TByte 1208 TCK 255, 286, 314, 422 TCP/IP 1045 TDI 255, 286, 314, 422 TDO 256, 286, 314, 422 T-DSL 64, 1167 Technik, Nachteile 80 Technologien 282, 877 Technology Layer 1003 Teiler-Latch-Register 994 Teiler-Latch-Zugriffsbit 994 Telekommunikationsanlage (TK) 64 Temperatursensor 684 für die CPU 683 Temporary Real 266 Temporary-Real-Format 268 Tera 1207 Terminal 1208 Terminal Count 640, 722 Terminierungswiderstand 1055 Test 87, 190, 1172 Access-Port 256 Befehlssatz 258 Command-Register TR6 252 Datenregister TR7 252 Register 334 Register TR6 und TR7 251 Steuerregister TR5 254 TESTHI 422 TESTLO 422 Testregister TR6 und TR7 191, 252 Texas Instruments Graphics Architecture 1208 Textmodus 1208 Texture-Memory AGP 822 Texturenspeicher AGP 822 TFT-Displays 49 Thermische Kalibrierung 880
Stichwortverzeichnis
Thermodrucker 54 THERMTRIP 423 Thin Small Outline Package 574, 1209 Thin-Ethernet 1055 Thoroughbred 495 Thread 502 Through 200, 211, 1213 Thru 1213 Thunderbird 610, 1169 Athlon 477, 489 TI 162 TIGA (Texas Instruments Graphics Architecture) 1208 Time Stamp Counter 355 Time Stamp Disable 334 Timer 96, 668, 698, 1208 Timer-Interrupt 625 Timer-Programmierung 672 Tintenstrahldrucker 54 T-ISDN 64 T-ISDN dsl 66 TLB 188, 190 Prüfung 190 TMS 256, 286, 314, 423 T-Net 64 Toggle-Inkrementierung 748 Token 1208 Token-Bus 1039 Token-Ring 1038, 1045, 1046, 1088 TOP 272 Top of Stack 272 tpi 1209 TR 101, 165, 1209 Trace-Puffer 1172 Trackball 53, 1209 Transaction Translator 1024 Transaction-Layer 809 Transaktionen 447 Transceiver 724, 727 Transferrate 217 mit HyperTransport-Links 814 Transistor-Transistor-Logik 70, 1209 Transition Minimized Differential SignalingProtokoll, TMDS 50 Translation 188, 190, 248, 890, 898, 908 Lookaside Buffer 329, 495 Lookaside-Puffer 245 Transmitter 996 Trap 137, 158, 1209 Trap Gate 171, 1209 Trap-Bit 176
Sandini Bib Stichwortverzeichnis
TRDY 423 Treffer 200, 1173 Trefferbestimmung 205 Trefferwahrscheinlichkeit 204 Treiber 51, 1209 Trellis-Code-Tabelle 1063 Trellis-Kodierung 1072 Triggerung 1209 Triple-Fault 139 Tristate-Test-Modus 341 TRST 256, 314, 423 Trusted Device 1097 TS 140 TSC 355 TSD 334 TSOP 574, 1209 TSR-Programme 160 TSS 103, 104, 175, 176, 1209 TTL 70, 1209 Tualatin-Core 473 Tunneling 1105 Tunneloxid 571 Tupels 1006 Twisted-Pair-Kabel 43, 1052, 1055 Type Range Registers 435 Typenraddrucker 53
U UART 62, 739, 982, 1209 UART-Adressen 989 UART-Chip 1165 Übergabe 170 Übergänge der MESI-Zustände 211 Überlauf 137, 275, 1210 Überlauferfassung mit INTO 159 Überlauffehler 997 Überschreibung 134, 149, 150 Überschreibungspräfix 151 Übertrag 136 Übertragungseinrichtung 972, 1177 Übertragungsmedium 1041 Übertragungsrate 105, 115, 886, 892, 930, 1049 Uhrzeit- und Datumsangaben 660 Uhr/RAM-Bausteine 658 ULSI 1210 Ultra 160 935 Ultra 320 SCSI 936 Ultra Large Scale Integration 1210 Ultra SCSI 933
1249
Ultra-ATA EIDE 910 Ultra-ATA/100 598 Ultra-ATA/66 598 Ultra-DMA 910 Ultra-DMA 133 911 Ultra-DMA/33 583 Umschalten in den Protected Mode 168 Umschaltung vom Protected in den Real Mode 664 Umsetzung mit Segmentierung und Paging 189 Unformatierte Kapazität 884 Ungerade Parität 1198 Ungültige Operation 275 Ungültiger Opcode 159 Ungültiges Task-State-Segment 182 Unified Cache 382 Unified Memory Architecture, UMA 593, 598 Unit 82, 1182, 1188 Universal Asynchronous Receiver and Transmitter 982, 1209 Universal Asynchronous Receiver Transmitter 39 Universal Disc Format (UDF) DVD 950 Universal Serial Bus (USB) 583, 830, 1015, 1028, 1210 Universal Synchronous and Asynchronous Receiver and Transmitter 1210 Universal-PCI-Karte 774 Universalplatinen 768 Unix 871, 1210 Unmittelbarer Operand 148 Unsigned 72 Unterbrechung 155, 1188 Unterlauf 275, 1210 Unterschiede der SX-Varianten 278 Unterstützung durch modellspezifische Register 444 UP 286, 423 Update-DR 259 Update-Present 286 Upgrade 284, 286, 288, 1210 u-Pipe 1210 u-Pipeline 1210 Upper Memory Area 154 Urlader 1210 USART 1210 USB 1210 mit Scanner 57
Sandini Bib 1250
USB 2.0-Standard 1023 USB Net Cable 44 USB-2-Hub 1024 USB-Anschluss 54 USB-Audiogerät 1020 USB-Bandbreite 1020 USB-Controller 1021, 1022 USB-Datentransfer 1022 USB-Drives 576 USB-Einheiten 1018 USB-Geräte 1015 USB-Geschwindigkeitsklassen 1016 USB-Hubs 1016 USB-Kabel 1018 USB-Pakete 1021 USB-Plug&Play-Mechanismus 1019 USB-Verbindungsanschlüsse 1018 User 189 UTP, Unshielded Twisted Pair 1053 UV-Licht 568 U/S-Bit 189
V Variable 136, 146 VBRUN 1114 Vcc 87, 100, 113, 223, 315 Vcc5 294, 424 VccP 424 VccS 424 Vektor 156 Verbindung 997 Verdrillte Leitungen 1052 Verfahren 55 Verminderter Befehlssatz 231 Verminderter Schreibstrom 1201, 1211 Verriegelungsschaltkreis 1190 Verschaltung von i486SX und i487SX 288 Verschnitt 870 Verstärkerschaltung der Soundkarte 31 Vertikal Maschinenbefehlformat 235 Very Large Scale Integration 1211 Verzeichniseintrag 867 Verzweigung 144, 151 Vorhersagelogik 326 VESA Local Bus 708, 1211 ähnlich wie der AGP 821 VGA 1211 VGA-Farbmonitor 46 VGA-Karte 46
Stichwortverzeichnis VI 294, 333 VIA Apollo KX133-Chipset 608 VIA-Prozessoren 473 Victim-TLB 388 VID3-VID0 423 VID-Eingänge 684 Video 1179, 1211 Video Engineering Standards Association 708 VID-Pins 462, 472 Vielzweckregister 127, 131 80286 100 Datei 235 Vienna 40 VIP 294, 333 Virtual 131, 138, 167, 192, 193, 194, 294, 295, 1211 8086 Mode 193, 194, 247 Extension-Bit 333 Interrupt Flag 333 Interrupt Pending Flag 333 Virtual Channel Mode RAM (VCMRAM) 600 Virtual Device Drivers (VXDs) 1138 Virtual File Allocation Table 871 Visual BASIC 1114 VL 1211 VLB 1211 VLB-Slots 709 V-Link 611 VLSI 1211 VME 333 VMEbus 695 VM-Flag 138 VMS 1211 Voice-Coil-Aktuator 875, 881, 1190 Volatile-RAM 658 VOLDET 293 Volladdierer 81 Vollduplex-Betrieb 1061 Vollduplex-Modem 976, 977, 978 Vollduplex-Verbindung 976 Voltage Identification 462 Athlon 487, 493 Vorhersage 151 Vorladeschaltkreis 527, 528 Vorladezeit 530, 539 Vorschub 1190 Vorspannungsgenerator des 80286 98 Vorteil der Mikroprogrammierung 229 Vorzeichen 137 Vorzeichenbehaftete Ganzzahlen 73 Vorzeichenbehaftete lange Ganzzahlen 74
Sandini Bib Stichwortverzeichnis
Vorzeichenbit 268 Vorzeichenlose Ganzzahlen 72 Vorzeichenlose lange Ganzzahlen 72 v-Pipe 1211 v-Pipeline 1211 VRAM 1211 Vref0-Vref7 424 V.90-Modems 60 V.90-Standard 1210 V.92 60, 1210
W Wagenrücklauf 1176 Wait State 118, 200 WAN 1033 WAN Interface Sublayer, WIS 1071 WAN-Protokolle 1040 WAN-Verbindungen 1068 WAR 378 Wärmedehnungen 879 Warm-Reset-Anschluss 374 Wartezyklen 118, 119 Wasserkühlung 5 Wave-Dateien 33 Wave-RAM 40 Wave-Table 39, 40 WAW 378 Way 203, 1212 WBINVD 241 WB/WT 314 WDM-Architektur 1138 WDM-Treiber 1137, 1143 WE 1212 Wechselbarer Datenträger 22 Wechselplatten 22 Weg 203, 1212 Weißsche Bezirke 848, 1178, 1183 Weitbereichsnetz 1033 WEP128 1105 Western-Stecker 63 Whitney Chipsets 592 Wide Area Network, WAN 1033, 1045 Wide SCSI 932, 1212 Wide Wavelength Diversion Multiplexing, WWDM 1070 WIDE-DRAMs 535 Wiederanlauf 123, 138 Wiedergewinnung von Datenbits 858 WiFi 1103
1251
Willamette 498 Win16 und Win32 Unterschiede 1123 Win32- und Kernel-Routinen 1144 WIN32-DLL 1118 Winchester-Laufwerk 873 WinChip C6 407, 409 WinChip-Prozessoren 474 Windows 95 728, 870 Windows Driver Model (WDM) 1137 Windows NT 871, 1129 Windows XP 1107 Windows-Anwendungen Programmierung 1114 Windows-NT-I/O-Treiber 1131 Windows-NT-Registrierung 1131 Windows-Plug&Play 1136 Windows-Programmierung 1107 Wired Equivalent Privacy, WEP 1105 Wired-AND-Verknüpfung 687 Wireless Ethernet Compatibility 1104 Wireless LANs 1095 Wissenschaftliche Notation 263 WLAN-Adapter 1102 WM_RST 374 Word Count 103 Workgroups 42 WORM 1212 Wort 72, 1212 Wortgrenzen 106 Wortleitung 528, 1212 Wrap-Around 90, 153, 303, 413, 1212 Write 200, 201, 210, 211, 214, 1212, 1213 After-Read 378 After-Write 378 Back 344 Puffer 350 Sonderzyklus 250 Strategie 328 Back and Invalidate Data Cache 241 Combining 436 Combining-Puffer 436 Model-Specific Register 334 Through 328 Strategie 241 Write-Enable-Signal 525 WRMSR 334 W/R 89, 112, 222, 307
Sandini Bib 1252
X x86-Vielzweckregister 378 X-Adressbus 698 XAUI 1074 X-Bus 1213 xDSL-Varianten 65 XEON MP-Typen 501 XEON-CPUs 457 X-Faktor 939 XGXS, eXtended Sublayer 1074 XL 1164 XT 4, 1213 X.400 1042
Y Yellow Cable 1049, 1051, 1054
Z Z4 83, 1213 Z80 1213 Z80SIO 1209 Zahl 72 in Gleitkommadarstellung 264 Zahlenformate 268, 269 Zähler-Latch 676 Zählregister 132, 133 Zählung 868 Zeichen 73, 1206, 1213 Zeigeeinrichtung 52, 1192 Zeiger 131, 134, 145 Zeilen 525, 1190 Zeilenadress-Abtastsignal 1201 Zeilen-Dekoder 530 Zeilenfrequenz 47 Zeitbasis 662 Zeiten 152, 227, 230 Zeitlich gemultiplexter Adress- und Datenbus 86 Zeitmarkenzähler 334, 355, 356 Zelle 561 Zellentypen 530 Zentrale Verarbeitungseinheit 1176 Zentraleinheit 1176 Zentralrechner 1186 Zero 137 Ziffer 72 ZIP-Laufwerk 24, 58, 855, 909 Zirkulationsströmung 882 Zonenaufzeichnung 890
Stichwortverzeichnis
Zone-Recording 890 Z-String 1169 Zugriff auf internen Cache 224 auf I/O-Adressbereich 93 über Test Access Port 358 Zugriffsrechte 42 Zugriffsverfahren 1036 Zugriffszeit 117, 528, 538, 852, 885, 1213 des Prozessor-ROM 230 Zuordnung von Interrupt und Interrupt-Vektor 156 Zusätzlicher Übertrag 137 Zustand 994, 997 Zustandsübergänge 211 Zuverlässigkeit 887 Zuweisungseinheit 867 Zwangsparitätsbit 994 Zweierkomplement 73, 74, 1213 Zweifache Adressenabbildung 185 Zweifacher Fehler 182 Zweite Ebene 186 Zweite Ordnung 1197 Zwischen CPU und UART 991 Zyklische Redundanzprüfung 861, 1176 Zyklischer Redundanzcode 1176, 1180 Zyklus 115, 117, 123, 126, 209, 211, 213, 248, 349, 1166 Zykluszeit 528, 530 Zylinder 856 Zylindernummer 905
Sandini Bib
... aktuelles Fachwissen rund, um die Uhr – zum Probelesen, Downloaden oder auch auf Papier. www.InformIT.de
InformIT.de, Partner von Addison-Wesley, ist unsere Antwort auf alle Fragen der IT-Branche. In Zusammenarbeit mit den Top-Autoren von Addison-Wesley, absoluten Spezialisten ihres Fachgebiets, bieten wir Ihnen ständig hochinteressante, brandaktuelle Informationen und kompetente Lösungen zu nahezu allen IT-Themen.
wenn Sie mehr wissen wollen ...
www.InformIT.de
Sandini Bib
Sandini Bib
Copyright Daten, Texte, Design und Grafiken dieses eBooks, sowie die eventuell angebotenen eBook-Zusatzdaten sind urheberrechtlich geschützt. Dieses eBook stellen wir lediglich als Einzelplatz-Lizenz zur Verfügung! Jede andere Verwendung dieses eBooks oder zugehöriger Materialien und Informationen, einschliesslich der Reproduktion, der Weitergabe, des Weitervertriebs, der Platzierung im Internet, in Intranets, in Extranets anderen Websites, der Veränderung, des Weiterverkaufs und der Veröffentlichung bedarf der schriftlichen Genehmigung des Verlags. Bei Fragen zu diesem Thema wenden Sie sich bitte an: mailto:
[email protected] Zusatzdaten Möglicherweise liegt dem gedruckten Buch eine CD-ROM mit Zusatzdaten bei. Die Zurverfügungstellung dieser Daten auf der Website ist eine freiwillige Leistung des Verlags. Der Rechtsweg ist ausgeschlossen.
Hinweis Dieses und andere eBooks können Sie rund um die Uhr und legal auf unserer Website
(http://www.informit.de) herunterladen