5. Mikroprozessoren für PCs: die X86-Familie. 5.1 Einführung

Ähnliche Dokumente
Die Mikroprogrammebene eines Rechners

Datensicherung. Beschreibung der Datensicherung

Einführung in die technische Informatik

Teil VIII Von Neumann Rechner 1

Betriebssysteme. Dipl.-Ing.(FH) Volker Schepper

Klausur zur Mikroprozessortechnik

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Kap 4. 4 Die Mikroprogrammebene eines Rechners

5 Speicherverwaltung. bs-5.1 1

Lizenzierung von System Center 2012

RS-Flip Flop, D-Flip Flop, J-K-Flip Flop, Zählschaltungen

icloud nicht neu, aber doch irgendwie anders

Virtueller Speicher. SS 2012 Grundlagen der Rechnerarchitektur Speicher 44

OPERATIONEN AUF EINER DATENBANK

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

1 Aufgaben zu Wie funktioniert ein Computer?

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Nutzung von GiS BasePac 8 im Netzwerk

4D Server v12 64-bit Version BETA VERSION

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Primzahlen und RSA-Verschlüsselung

(Prof. Dr. J. Schlichter, WS 2011 / 2012) Übungsleitung: Dr. Wolfgang Wörndl (gbs-ws11@mailschlichter.informatik.tu-muenchen.de)

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Windows 8 Lizenzierung in Szenarien

LPT1 Anschluss mit PCMCIA Karte

S7-Hantierungsbausteine für R355, R6000 und R2700

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Netzwerk einrichten unter Windows

Mikrocomputertechnik. Adressierungsarten

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

FlowFact Alle Versionen

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Verschlüsseln von Dateien mit Hilfe einer TCOS-Smartcard per Truecrypt. T-Systems International GmbH. Version 1.0 Stand

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten

Reporting Services und SharePoint 2010 Teil 1

Mediumwechsel - VR-NetWorld Software

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

Gruppenrichtlinien und Softwareverteilung

DOKUMENTATION VOGELZUCHT 2015 PLUS

Partitionieren in Vista und Windows 7/8

Mikrocontroller Grundlagen. Markus Koch April 2011

Professionelle Seminare im Bereich MS-Office

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

ICS-Addin. Benutzerhandbuch. Version: 1.0

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

1. Software installieren 2. Software starten. Hilfe zum Arbeiten mit der DÖHNERT FOTOBUCH Software

Ein Scan basierter Seitenangriff auf DES

Computerarithmetik ( )

Festplatte defragmentieren Internetspuren und temporäre Dateien löschen

Programme im Griff Was bringt Ihnen dieses Kapitel?

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

Anleitung zur Nutzung des SharePort Utility

Eigene Dokumente, Fotos, Bilder etc. sichern

Überprüfung der digital signierten E-Rechnung

Updatehinweise für die Version forma 5.5.5

Step by Step Webserver unter Windows Server von Christian Bartl

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Berechnungen in Access Teil I

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Codex Newsletter. Allgemeines. Codex Newsletter

Anleitung über den Umgang mit Schildern

Leitfaden zur Installation von Bitbyters.WinShutdown

Registrierung am Elterninformationssysytem: ClaXss Infoline

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

PC-Umzug: So ziehen Sie Ihre Daten von Windows XP nach Windows 8 um

Installation und Inbetriebnahme von SolidWorks

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

-Inhalte an cobra übergeben

3 Windows als Storage-Zentrale

Lineare Gleichungssysteme

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Fax einrichten auf Windows XP-PC

Rechner Architektur. Martin Gülck

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

Guide DynDNS und Portforwarding

15 Optimales Kodieren

Anleitung zum erfassen von Last Minute Angeboten und Stellenangebote

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Workshop: Eigenes Image ohne VMware-Programme erstellen

Erstellen einer PostScript-Datei unter Windows XP

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Stepperfocuser 2.0 mit Bootloader

Windows7 32/64bit Installationsanleitung der ROBO-PRO-Software

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN

Step by Step Remotedesktopfreigabe unter Windows Server von Christian Bartl

IBM Software Demos Tivoli Provisioning Manager for OS Deployment

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

BEO-Sanktionsprüfung Eine Einführung zum Thema Sanktionsprüfung und eine Übersicht zur BEO-Lösung.

Transkript:

5. Mikroprozessoren für PCs: die X86-Familie 5.1 Einführung Die heute in PCs und Workstations sind, aus der Sicht der Rechnerarchitektur, gesehen, Kinder zwei verschiedener Familien. Die ersten Mitglieder der Intel-Mikroprozessor-Familie haben wir kennengelernt. Sie haben den Prozessoren in den heutigen PCs den komplexen Befehlssatz vererbt. Die wesentlichen Eigenschaften kann man wie folgt zusammenfassen: - komplexer Befehlssatz - arithmetisch-logische Befehle mit Speicherzugriff (Speicher-Speicher-Maschine) - Befehlsablauf mit einer hohen Zahl von Mikrobefehlen und Maschinenzyklen - Organisation der Ablaufsteuerung als mikroprogrammierte Steuerung. Ein anderes Merkmal speziell der Intel-Prozessoren, nämlich die Eigenheiten der Speicherverwaltung, werden wir noch kennenlernen. Andererseits sind natürlich auch Ergebnisse aus der Entwicklung von RISC (reduced instruction set)- Prozessoren in die Entwicklung eingeflossen. Deren Eigenschaften kann man zusammenfassen mit: - relativ kleiner Befehlssatz mit Beschränkung auf die wirklich "wichtigen" Befehle - arithmetische und logische Befehle wirken nur auf Registerinhalte - die Befehle werden mit möglichst wenigen Taktzyklen und, wo möglich, mit Zwischenspeicherung nur in Registern abgelegt - meistens fest verdrahtete (und damit schnellere) Steuerung. Die RISC-Architektur, z. B. in Form der DLX-Maschine von Hennessy und Patterson, aber auch Form der SPARC-Architektur von Sun und der Prozessoren von MIPS, hat in den 8er Jahren den Computertyp "Workstation" erst möglich gemacht, also kostengünstige Arbeitsplatzrechner mit den Leistungen der damaligen Super-Mini-Computer und kleiner bis mittlerer Mainframes. Genauer gesagt: Es gab sogar zwei verschiedene Urväter der RISC-Maschinen, nämlich eine MIPS -Maschine in Stanford bei Hennessy und eine RISC -Maschine in Berkeley bei Patterson. Aus ersterer entstanden die kommerziellen MIPS-Prozessoren, aus letzterer die SPARC-Serie von Sun. Ganz im Unterschied zu den CISC-Rechnern ergab sich bei den RISCs schon sehr bald der Effekt, dass die Leistung von der Speicherbandbreite bestimmt wurde. Dies könnte ein Grund dafür sein, dass man aufwendige Adressumrechnungen minimiert hat. Z. B. hat UNIX, das "native" Betriebssystem der meisten Workstations, eine im Vergleich zu den Mikrosoftbetriebssystemen (die für CISC-Prozessoren von Intel ausgelegt waren), eine wesentlich einfachere Speicherverwaltung. Heutige High-End-Mikroprozessoren von Intel (und deren Clones) sind insgesamt seltsame Zwitter. Für einen Teil des Befehlssatzes wirken sie wie schnelle RISC-Prozessoren, unter anderem auch so, dass einfache Arithmetische Befehle möglichst in einem Takt ausgeführt werden. Für den Rest des Befehlssatzes ergibt sich ein langsamer und aufwendiger Ablauf, der die Ressourcen des Prozessors nur unvollkommen nutzt. Für die Zukunft sehen die Architekturen eher RISC-mäßig aus, teilweise auf eine außerordentlich RISCante Weise. Neben den rapide komplizierter und schneller werdenden High-End-Prozessoren (die heute typischerweise schon 64 Bit breit sind) sterben aber 16-Bit- und 32-Bit-Prozessoren keineswegs aus. Man verwendet sie nun in "embedded"-anwendungen, wo neben einem Prozessorkern noch anwendungsspezifische Komponenten auf dem IC integriert sind. Zum Beispiel macht bei Mikrocontrollern eine 16-Bit-Architekturen durchaus noch viel Sinn, 8 Bit Breite selbst sind für viele Anwendungen ausreichend. 1

5.2 Die ersten Mikroprozessoren für allgemeine Anwendungen 5.2.1 Die 886 / 888-Serie: Einführung Der aus dem 88 / 885 entwickelte 886-Mikroprozessor wurde von Intel 1978 auf den Markt gebracht. Er ist in dem Sinne ein 16-Bit-Prozessor, dass alle (allgemeinen) internen Register 16 Bit breit sind, der interne Prozessorbus 16 Leitungen breit ist dass die arithmetischen Einheiten 16 Bit breit sind. Beim 886 ist auch der externe Datenbus 16 Bit breit. Der mit dem 886 ansonsten weitgehend identische,1979 erschienene 888-Mikroprozessor hat dagegen nur einen 8 Bit breiten externen Datenbus. Er wurde 1981 von IBM als Kern des PC / XT ausgewählt und hat damit maßgeblichen Anteil am Aufstieg der Firma Intel zum weltführenden Halbleiterhersteller. Befehls-Ausführungs-Bus-Schnittstelleneinheieinheit E U BIU Universelle Datenregister (8 / 16 Bit) AH BH CH DH AL BL CL DL SP BP SI DI (16 Bit) Befehlszeiger IP CS DS SS ES 16 Bit- Segmentregister ALU Flags Steuerwerk Mikrocode Befehls- Dekoder Interner Bus 6 5 4 3 2 1 Bus-Steuerg. Adress- Addierer 6*8 Bit Befehlswarteschlange externer Multiplexer-Bus 16 Bit Daten, 2 Bit Adressen Steuersignale Abb. 5.1: Blockschaltbild des 886-Mikroprozessors Der 886-Prozessor ist in eine Befehls- Ausführungseinheit (execution unit, EU) und eine Busschnittstelleneinheit (bus interface unit, BIU) gegliedert. Die execution unit entschlüsselt Befehle und führt sie (so die Daten vorhanden sind) aus. Ein direkter Zugang zum externen Speichersystem besteht nicht. Die Bus Interface Unit ist dagegen nur mit der Organisation des Befehls- und Datenflusses zwischen CPU und Memory beschäftigt. Diese beiden Teilprozessoren arbeiten teilweise überlappend und parallel. Der Puffer zwischen Ihnen bildet eine Befehlswarte-schlange. Der Anschluss an die Außenwelt erfolgt über einen gemultiplexten Daten- und Adressbus. Die Umsteuerung zwischen Daten- und Adressbetrieb auf dem Bus wird durch zwei spezielle Steuersignals (ALE-aadress latch enable) und DEN (data enable, low-aktiv) geleistet. Während die Breite des Datenbusses 16 Bit beträgt (bzw. 8 Bit beim 888-Prozessor), ist der Adressbus auf 2 Bit erweitert, um einen (schon im Vergleich zum 885) vergrößerten Adressierungsbereich bereitstellen zu können. Der maximale physikalische Adressraum beträgt 1 MByte. Dazu gibt es einen speziellen Adressraum für Ein-/Ausgabekanäle, der 64 KByte groß ist. 2

Die gemultiplexte Auslegung von Daten- und Adressbus bewirkt, dass der 886 mit einem 4- poligen DIL (Dual in-line) Gehäuse auskommt. Ohne die Multiplexerei wäre ein 64-polige Gehäuse notwendig gewesen. Im Gegensatz zum 88 und zum 885 ist der Befehlssatz erweitert und umfasst auch 8-/16-Bit- Multiplikationsbefehle und Divisionsbefehle sowie Befehle, die auf Zeichenketten (Strings wirken). Das Interrupt-System des 886 umfasst 2 Interrupt-Eingänge: NMI (nicht maskierbar) und INTR (Software-maskierbar). Maximal können bis zu 256 Interrupt-Routinen definiert werden, die an fast jeder Stelle im Adressraum stehen können. Implementiert wurde der Schaltkreis zunächst in nmos-technologie mit einer Komplexität von etwa 3 Transistoren. Später wurden auch CMOS-Versionen verfügbar. Vom 886 / 888 existierten Versionen mit Taktfrequenzen von 5, 8 und 1 MHz.. Damit war als kürzester möglicher Befehlszyklus (2 Takte) eine Zeit von,2 Mikrosekunden möglich. Gegenüber dem 885 ist dieser Prozessor für vergleichbare Aufgaben etwa 3- bis 5-mal schneller gewesen, der 888 war nur 2-3 mal schneller. Für den heutigen PC-Freak fast unvorstellbar ist die Beschränkung auf den 1 MBit-Adressraum und die Notwendigkeit, eine direkte physikalische Adressierung durchzuführen. 5.2.2 Der 886 / 888-Prozessor: Ausgewählte Eigenschaften Es ist an dieser Stelle nicht sinnvoll, den 886 / 888 in allen Details darzustellen. Dazu ist seine praktische Bedeutung heute zu gering. Er hat aber einige Eigenschaften, welche sich im Sinne von "Abwärtskompatibilität" selbst noch bei Pentium-Prozessoren finden, die ja im 16-Bitkompatibilitätsmodus eigentlich wie schnelle 886er Prozessoren arbeiten. Das parallele Arbeiten der Ausführungseinheit und der Bus-Interface-Einheit ist fast schon ein Schritt zum Pipelining. Die nebenläufige Operation der Buseinheit, dann, wenn kein anderer Speicherzugriff notwendig ist, schon mal vorab Befehle zu holen und zwischenzuspeichern, wird in wesentlich verfeinerter Form bei High-End-Prozessoren ebenfalls implementiert. So wird die Befehlswarteschlange ständig aufgefüllt. Im Fall von Programmen mit Sprungbefehlen müssen dann allerdings ein oder mehrere "vorsorglich" geholte Befehle zurückgesetzt werden. In der Busschnittstelleneinheit befinden sich vier 16 Bit breite sogenannte "Segmentregister". Diese werden bei der Bildung physikalischer Speicheradressen benötigt. Einerseits hat der Prozessor 2 Bitadressen verfügbar, er kann sie aber mit den vorhandenen arithmetischen Einheiten nicht in einem Schritt bilden. Der Aufbau der realen 2-Bit-Adresse erfolgt durch die Addition einer Offsetadresse zu einer Segmentadresse. Absolute Adresse (2 Bit) = Segmentadresse + Offsetadresse Die Segmentadresse ist eine 2-Bit-Adresse, welche vom Prozessor aus dem Inhalt eines der vier Register der BIU errechnet wird. Dazu wird dessen Inhalt mit 16 multipliziert, was einem Bit-Shift im drei Stellen nach links (zum höherwertigen Bit hin) entspricht. Die Offsetadresse wird nach dieser Multiplikation addiert, wozu die BIU einen speziellen Addierer enthält. 3

Das Resultat ist die absolute physikalische Adresse. Die Adressberechnung geschieht also beim 886/888-Prozessor stets durch die Addition von 2 16-Bit-Adressen. 15 Offsetadresse 15 Segmentregister (16 Bit) + Addierer 19 Absolute Adresse (2 Bit) Abb. 5.2: Bildung der physikalischen Adresse aus Segmentadresse und Offsetadresse Eine Segmentadresse ist jeweils aus einer Multiplikation einer Basisadresse mit 16 entstanden, die vier niedersten Bits sind jeweils. Innerhalb eines Adressraumes von 1 MByte kann man dann 64 k verschiedene Segmentadressen unterbringen. Anders herum ergeben sich jeweils Speicherbereiche von 64 KByte Größe, die jeweils einer Segmentadresse zugeordnet sind. Einen solchen Speicherbereich von 64 KByte Größe nennt man in der Intel-Technologie ein Segment. Da der 886 über vier Segmentregister verfügt, sind zu jedem Zeitpunkt jeweils 4 Speichersegmente von jeweils 64 KByte Größe definiert. Diese Segmente können auch gleich sein oder sich überlappen. Es ist sogar möglich, ein und dieselbe physikalische Adresse durch unterschiedliche Kombinationen von Segmentadresse plus Offsetadresse darzustellen. Läuft ein Programm immer im selben Segment ab, so kann man die weitere Adressierung auf das Segment beschränken, muss sich also um die Verwaltung der Segmente nicht kümmern. Eine Folge dieser Art der Speicherverwaltung ist, dass ein Programm, das mit expliziter Speicheradressierung geschrieben wurde, auf ein beliebiges Segment umgesetzt werden kann. Eklig wird die Angelegenheit erst, wenn bei größeren Programmen mit mehreren Segmenten hantiert werden muss. Der 886/888-Prozessor enthält 14 interne 16-Bit-Register, die für den Programmierer zugreifbar sind. Davon ist ein Teil den im 88/885 verwendeten Registern äquivalent, andere Register sind völlig neu. 4

AX BX CX DX SP BP SI DI CS DS SS ES 8 Bit 8 Bit 16 Bit Universelle Register AH AL BH BL CH CL DH DL Zeiger- und Index-Register Segment-Register Akkumulator Basisregister Zählerregister Datenregister Stapelzeiger Basiszeiger Quellindex Zielindex Codesegment Datensegment Stacksegment Extrasegment IP FLAGS Befehlszeiger Flagregister Abb. 5.3: Registerstruktur des 886-Prozessors Die allgemeinen Register entsprechen grundsätzlich denen aus der 88-Architektur, um Programmportierungen zu erleichtern (aber 88 /885 und 886 sind nicht Maschinencodekompatibel!) Für diese Register gibt es jetzt einen jeweils 8 Bit langen oberen bzw. unteren Sektor. AX hat als Akkumulator eine bevorzugte Funktion. Einige arithmetische Operationen, z. B. die Multiplikation und die Division, sind nur über den Akku durchführbar. BX wird als Basisregister für indirekte Adressierung benutzt. CX ist das Zählerregister für Schleifen und Wiederholungsoperationen. DX wird zur Multiplikation und Division von 16-Bit-Worten verwendet. Bei indirekten I/O-Befehlen enthält dieses Register die Kanalnummer. Diese Register können sowohl in 8-Bit- als auch in 16-Bit-Breite angesprochen werden. Die speziellen Register sind dagegen aus-schließlich 16- Bit-Register. Zunächst erfordert bereits die segmentierte Speicherverwaltung eine Anzahl neuer "special purpose" Register. Der Programmierer kann für sein Maschinenprogramm den jeweils erwünschten Speicherbereich festlegen, in dem der Code stehen soll, bzw. in das Daten abgelegt und aus dem Daten geholt werden sollen. Entsprechend existiert ein Code-Segment-Register und ein Daten-Segment-Register. Der Offset für die Befehle befindet sich im Befehlsregister (IP), während der Offset für die Daten im Basisregister BX oder in einem der Indexregister SI, DI steht. Wie allgemein üblich hat auch der 886 Stack-Befehle, die allerdings nicht auf einen physikalisch vorhandenen Stack (Stapelspeicher) wirken, sondern über einen Stack-Pointer, der jeweils die Adresse der letzten Eintragung enthält, auf den gewöhnlichen RAM-Speicher. Also müssen auch Stack-Operationen der Segmentierung unterworfen werden. Das Stack-Segment-Register SS enthält die Segmentbasisadresse, die Offsetadresse ist im Stapelzeiger SP oder im Basiszeiger BP. Für spezielle Befehle, insbesondere solche auf String-Operationen, ist ein sogenanntes "Extrasegment" definiert. Dessen Basisadresse enthält das Extra-Segment-Register ES, die Offsetadresse steht im Zielindexregister DI. 5

Der Stapelzeiger SP (stack pointer) und der Basiszeiger SP werden auch zur indirekten Adressierung von Speicherplätzen im Stapelspeichersegment benutzt. Das Quellindexregister SI (source index) und das Zielindexregister DI (destination index) dienen zur indirekten Adressierung von Speicherplätzen für allgemeine Daten oder von Zeichenketten (strings). Der Befehlszeiger (IP, instruction pointer) entspricht dem sonst üblichen Befehlszähler. Er enthält immer die Offsetadresse des nächsten auszuführenden Befehls. Wie in Abb. 5.3 dargestellt, gibt es dedizierte Verbindungen für die Verknüpfung von jeweils 2 Registern zur Adressbildung. Fest verknüpft sind: - Befehlszeiger IP mit Code-Segment-Register CS - Stackpointer SP mit Stack-Segment-Register SS - Zielindexregister DI mit (bei String-Befehlen) Extra-Segment-Register ES. Alle anderen Zuordnungen zwischen Basisregistern und Segmentregistern können per Software modifiziert werden. Das Flag-Register besitzt 9 Zustandsbits in einem 16-Bit-Register. Für die Flags in den Bitstellen bis 7 besteht eine Kompatibilität mit dem 88 / 885. Interessant ist ferner, dass der 886 und der 888 in zwei unterschiedlichen Betriebsmodi arbeiten können: Im Minimummodus erzeugt der 886 wie gewohnt alle für den Betrieb eines "gewöhnlichen" Mikrocomputers benötigten Steuersignal selbst. Im Maximummodus dagegen werden vom Prozessor nur drei Statussignals (s, s1, s2) bereitgestellt, aus denen ein externer Bus-Controller-Baustein, z. B. der Intel 8288, alle notwendigen Steuersignale ableitet. Damit kann man den 886 wahlweise als "normalen" Mikroprozessor (wie 885 / Z8) in einem Minimalsystem betreiben, im zweiten Fall tritt für "high-end"-anwendungen ein Zugewinn an Leistung auf. Auf die Vorstellung des Befehlssatzes im Detail und der Adressierungsmöglichkeiten sowie der Interrupt-Verarbeitung wollen wir hier verzichten. Der 886 war insgesamt noch keine echte Konkurrenz zu Systemen, bei denen mehrere (bis viele) einen Super-Mini-Rechner wie die VAX 75, 78 (später VAX 86, 85, 853, 88) im Time- Sharing-Betrieb lief. Einmal war es ohne einen (wahlweise verfügbaren) Arithmetik-Coprozessor für rechenintensive Aufgaben zu langsam. Andererseits erlaubte der Rechner weder eine virtuelle Speicherverwaltung (auf der VAX Standard) noch einen Schutz verschiedener Segmente gegeneinander. Trotzdem war der 886/888-basierte PC mit MD-DOS Betriebssystem von IBM der Anfangspunkt einer stürmischen Entwicklung, ohne welche der heutige Stand der PC-Technik nicht vorstellbar ist. Ein 886/888-basiertes Mikrorechnersystem sieht durchaus unterschiedlich aus, je nachdem ob es im Minimalmodus oder im Maximalmodus betrieben wird. Wir stellen hier nur die Version vor, die sich am ehesten für den Einsatz in einem PC eignet (Abb. 5.4). 6

5V Standard-Speicher Standard- I / O CLK MN / MX 8284 RES Taktgenerator READYRESET 886 S S1 S2 BHE A16 - A19 AD - AD15 8288 Bus Controller 8282 Adressen Latch WE OE CS A CS INTA Daten BHE * 88 Steuersignale 2 Bit-Adressbus CLK WR RD CS A CS 8286 Transceiver * chip-select-logik 16 Bit-Datenbus Abb. 5.4: 886-Mikroprozessor mit Zusatzkomponenten in Maximalkonfiguration Typische externe Komponenten sind der Taktgenerator (8284) mit nochmals separatem Quarz, der 8288 Buscontroller, das 8288 Adressen-Latch und der 8286 Transceiver-Baustein. Dazu kommen noch Standardspeicherbausteine und Standard-I/-Bausteine. Ganz grob kann man schon sehen, was auch ein High-End-Prozessor an zusätzlichem "Chip-Satz" benötigt. Ein Problem ergibt sich dadurch, dass der Speicher auch hier Byteweise organisiert ist. Deshalb wird der Gesamtspeicher physikalisch in 2 Bereiche von je 512 KByte Größe aufgeteilt. An den einen Block ist die untere Hälfte des Datenbusses (Bits bis 7) angeschlossen. Diesem Block sind alle geradzahligen Adressen zugeordnet. Er wird nur angesprochen, wenn der Wert des Adressbits gleich ist. Die obere Hälfte des Datenbusses (Bits D8 bis D15) wird dagegen an den zweiten Speicherblock angeschlossen. Er wird nur dann aktiviert, wenn das Steuersignal BHE (Bus high enable, invers aktiv) gleich ist. Die Adressleitungen A1 bis A19 führen an beide Blöcke. Der 888-Mikroprozessor hat diese Probleme nicht, da dort die 16-Bit-Datenworte stets nacheinander in 8-Bit-Scheiben übertragen werden. 5.2.3 Grundlagen zum 8286 Mikroprozessor Der Intel 8286 Prozessor wurde 1982 vorgestellt. Er stellt eine vollkommen aufwärtskompatible Weiterentwicklung des 886 dar. Allerdings hat er einen 16-Bit-Datenbus und einen 24-Bit- Adressbus, wodurch ein physikalischer Adressraum von 16 MByte adressierbar wird. Die wesentlichen Fortschritte gegenüber dem 8286-Prozessor betreffen: - eine weit höhere Arbeitsgeschwindigkeit durch Aufteilung der CPU in vier nebenläufig arbeitende Subeinheiten (im Sinne von Phasen-Pipelining) - Auslegung der Prozessorhardware für die Nutzung in einem Multi-User- bzw. Multi-Tasking- Betriebssystem. 7

Bezüglich der Adressierung bietet der 8286 erstmals die Fähigkeiten, die 1982 bei "großen" Rechnern gerade zum Standard geworden waren. Im sogenannten "realen" Adressmodus (real mode) ist der 8286 nichts weiter als ein schnellerer 886-Prozessor. Der Prozessor arbeitet mit realen Adressen und Speichergrößen bis zu 1 MByte. Er ist mit den 886 Objektcode-kompatibel, hat aber eine 3- bis 5-fach höhere Arbeitsgeschwindigkeit im Vergleich zum 886 bzw. zum 888 (bei gleicher CPU-Takt-frequenz). Im virtuellen Adressmodus (protected mode) ist ein physikalischer Adressraum von 16 MByte und ein virtueller (logischer) Speicher von 2 GByte möglich. Damit sollte Multi-User- und Multi-Tasking-Betrieb möglich werden. Dazu ist eine integrierte Memory Management Unit (MMU) vorhanden. Außerdem existieren Konzepte, um für solche Betriebsarten die verschiedenen Tasks und verschiedene Nutzer gegeneinander abzusichern. Für Ein- und Ausgabekanäle ist ein Adressraum von 64 KByte vorhanden. Der Befehlssatz des 8286 umfasst den des 886 vollständig, bietet aber 16 zusätzliche allgemeine Befehle, die in beiden Moden verwendet werden können. Zusätzlich existieren 16 spezielle Befehle, welche sich nur auf den Betrieb im protected mode beziehen. Der Chip besitzt eine Komplexität von ca. 13 Transistoren und wurde in einer nmos- Technologie mit 1,5 Mikrometern minimaler Strukturgröße gefertigt. Statt des 4-poligen Gehäuses wie beim 886 wird ein 68-poliges DIL-Gehäuse verwendet. Damit existieren genügend Anschlusspins, um sowohl den Datenbus (16 Bit) als auch den Adressbus (24 Bit) ohne Multiplexen direkt anzuschließen. Gefertigt werden auch CMOS-Versionen (HCMOS), die maximalen Taktfrequenzen der CPU liegen zwischen 6 MHz und 2 MHz. Adress-Einheit (AU) Steuersystem Offset- Bildung Segment- Segmentgröße Grenzen- Überprüfung Segment- Basis Bus-Eineit (BU) Adressverriegelung und -Treiber 3 decodierte einheit Befehlsdecoder (IU) Befehlswarteschlangen Befehlholen (prefetch) Bussteuerung Datenempfänger Prozessor- Erweiterungsschnittstelle A23-A BHE, M E/A PEAK, PREQ READY, HOLD S1,S, COD/INTA LOCK, HLDA Register ALU Ausführungseinheit (EU) Abb. 5.5: Aufbau des 8286-Prozessors 6 Byte Prefetch- Warteschlangen Befehls- Physische Adressbildung D15 - D Im Blockschaltbild des 8286 fällt die Aufteilung in vier eigenständige Funktionseinheiten auf: - Bus Unit - Instruction Unit - Execution Unit - Adress Unit. 8

Damit ist eine parallele Ausführung von Buszugriff, Befehlsdekodierung, Befehlsausführung (zumindest bei ALU-Befehlen) und Adressberechnung möglich. In anderen Begriffen arbeitet der Prozessor mit einer vierstufigen Pipeline. Es existiert je eine Warteschlange für schon decodierte Befehle vor der Ausführung und für vorsorglich geholte Befehle vor der Dekodierung. (Kleine Zwischenrechnung: 2 Byte pro Befehl nur fürs Programm, im besten Fall ein Zugriff ca. alle 4 Takte (CISC), 2 MHz Takt bedeutet: 2 Bytes mit 5 MHz Taktrate, also 1 MByte/s Speicherbandbreite. Das sind 1 ns pro Byte oder 2 ns pro 2 Byte. Nimmt man noch mal soviel Bandbreite für den Datenverkehr hinzu, so kommen wir auf etwa einen Zugriff alle 1 ns. Das schafften damals die DRAMs noch recht gut. Der 8286 hatte und brauchte keinen Cache!) Die Bus-Unit BU steuert den Datenverkehr über nach außen und insbesondere auch den Speicherzugriff, einschließlich der Erzeugung der Steuersignale. Auch das Zusammenwirken des Prozessors mit einem möglichen (z. B. arithmetischen) Coprozessor wird so gesteuert. Wenn die Buseinheit nicht aktiv "on line" beschäftigt ist, holt sie die nächsten Befehle aus dem Speicher und legt sie in der Warteschlange (6 Bytes lang) ab. Treten Sprungbefehle auf, so wird jeweils die gesamte Warteschlange gelöscht und wieder neu gefüllt. Die Befehlseinheit IU führt die Dekodierung der Befehle durch. Diese entnimmt sie aus der 6-Byte- Befehlswarteschlange. Die dekodierten Befehle werden wiederum in einer Warteschlange mit maximal drei zwischengespeicherten Befehlen abgelegt. Die Ausführungseinheit enthält das Rechenwerk mit Hardwareimplementierung von Multipli-kation und Division. Das Steuerwerk ist mikrocodiert ausgeführt, der Mikrocodespeicher hat eine Größe von 5 KBytes. Die Adresseinheit besorgt die Berechnung von Zieladressen. Die physikalischen Adressen werden aus Basisadresse, Indexanteil und Displacement-Anteil berechnet. Auch die Organisation der virtuellen Speicherverwaltung wird von hier aus durchgeführt (wenn sie nicht das Betriebssystem übernimmt). Für die Zwischenspeicherung von Adressen existieren spezielle schnelle Cache-Register. Festzuhalten ist, dass die in der Adresseinheit eine mehrfache Adressumrechnung, auch unter Berücksichtigung der beim 886 schon gesehenen Segmentierung, zwischen logischer und physikalischer Adresse notwendig ist. Man kann die Segmentierung aber auch und gerade für die Implementierung von Schutzfunktion verwenden. Im Vergleich zum 886 existiert beim 8286 nur noch der beim 886 als Maximummodus bezeichnete Betriebsmodus mit Verwendung einer externen Bus-Controller-Einheit, die von Statussignalen der CPU gesteuert wird. Mit dem Bus-Controller-Baustein 82288 erfolgt eine Übersetzung in die Steuersignale des 88 bzw. des 886. Als zusätzliche externe Komponente wird für den Prozessor der Taktgenerator Intel 82284 benötigt. Er benötigt seinerseits einen externen Quarz zur Stabilisierung der Schwingfrequenz. Er liefert an die CPU ein Taktsignal derselben Frequenz (z. B. 24 MHz), das dann im 8286 geteilt wird, dessen interner Takt beträgt dann z. B. 12 MHz. Zusätzlich erzeugt der 82284 ein für die Synchronisierung peripherer Bausteine vorgesehenes symmetrisches 12 MHz-Taktsignal, das mit dem internen Takt des Prozessors bezüglich Phase und Frequenz synchron läuft. 9

Der 82284 liefert zwei weitere Signale für den Mikroprozessor: Das Rückstellsignal RESET wird durch das Eingangssignal RES (aktiv low) ausgelöst und im Taktgenerator mit dem CLK-Signal synchronisiert. Das low-aktive READY-Signal dient zur Einfügung von Wartezuständen (Wait States) in einen Buszyklus. Es wird entweder durch ein synchrones (aktiv-low) SRDY-Signal oder durch asynchrones ARDY-Signal (aktiv-low) ausgelöst. Auch das READY-Signal wird mit dem Takt synchronisiert. Für den Betrieb im realen Adressmodus benutzt der 8286 dieselben Register wie der 886, jedoch wird für den protected-mode eine ganze Anzahl neuer Register benötigt. V 5 V CLK Taktgenerator 82284 RESET READY InterruptanforderungenINTR NMI HOLD HLDA LOCK BU Bus-Einheit IU Befehls-Einheit EU Ausführungs- Einheit AU Adress-Einheit 8286 BHE A-A23 D - D15 S S1 M / IO COD / INTA PEREQ PEACK BUSY ERROR zum Bus- Controller Kontrolle für Coprozessor Abb. 5.6: Pinbelegung des 8286-Mikroprozessors Die externen Anschlüsse des 8286 sind größtenteils von 886 her bekannt. Die Pins A bis A23 (Ausgänge) sind für den Adressbus vorgesehen. Die Pins D bis D15 sind für bidirektionalen Datenverkehr (16-Bit-Datenbus). Mit dem Signal BHE (aktiv-low) zeigt der Prozessor an, dass die höherwertigen 8 Leitungen des Datenbusses belegt sind. M / IO ist das Unterscheidungssignal zwischen Speicherzugriff und I/O-Zugriff. Mittels S/S1 (aktiv low, nur Ausgang) wird der Status des Prozessors nach außen angezeigt. Mit diesen Bits und M / IO, und meistens mittels des externen Bus-Controller-Bausteins 82288 werden die Steuersignale für die externen Komponenten des Computers erzeugt. M / IO S1 S Interrupt-Acknowledge 1 E / A - Kanal lesen 1 E / A - Kanal schreiben 1 HALT 1 1 Speicher lesen 1 1 Speicher schreiben 1 1 und CODE / INTA Befehl lesen Abb. 5.7a: Steuersignale des 82288 für 8286-Computer 1

clock S S1 M / IO Bus Controller 82288 MEM READ MEM WRITE I / O READ I / O WRITE ALE DEN DT / R INTA 88 - Steuersignale 886 - Steuersignale Abb. 5.7b: Buscontroller 82288 Mit COD / INTA ist von außen prüfbar, ob sich der Prozessor in einem Befehlseinholzyklus befindet. INTR ist der Anschluss zur externen Anforderung eines Interrupts. NMI ist die nicht maskierbare Interrupt-Anforderungsleitung HOLD fordert einen externen Zugang der Kontrolle über den Systembus an. Der Prozessor geht dazu bezüglich dieser Anschlüsse in "high impedance". HLDA ist die Bestätigung, dass der Prozessor den HOLD akzeptiert hat. LOCK (invers aktiv) ist ein Sperrsignal des Prozessors, das einen externen Buszugriff während des folgenden Buszyklus sperrt. CLK ist der Clock-Eingang (wird auf die Hälfte untersetzt). READY (invers aktiv) dient zur Einfügung von Wartezyklen in den Buszyklus durch den Prozessor. RESET bewirkt, mit Hilfe des Taktgenerators 82284 zum rechten Zeitpunkt eingefügt, ein Rücksetzen des Prozessors in den Grundzustand. Für den 8286 gibt es einen arithmetischen Coprozessor (8287), der insbesondere die Abarbeitung von Gleitkommabefehlen wesentlich beschleunigen kann.. Für die Steuerung der Zusammenarbeit zwischen Prozessor und Coprozessor werden folgende Steuersignale benötigt: PREQ Processor extension request. Fordert den 8286 zu einem Datentransfer mit dem Coprozessor auf. PEACK (invers aktiv): Damit teilt der 8286 dem Coprozessor mit, dass er zu einem Datentransfer bereit ist. BUSY (invers aktiv): Damit teilt der Coprozessor mit, dass er beschäftigt ist und keine Daten empfangen kann. ERROR (invers aktiv): Damit wird ein arithmetischer Fehler im Coprozessor angezeigt, der zu einem Interrupt führt. Der 8286-Prozessor besitzt im protected mode alle Fähigkeiten, um in einem Multi-User-/Multi- Tasking-Betriebssystem verwendet zu werden. Das war damals natürlich nicht DOS oder eine der frühen Windowsversionen, sondern das wäre OS/2 oder UNIX gewesen. Deshalb betreibt DOS den 8286 im Real-Modus. 5.2.4 Adressierung und Speicherorganisation Nach jedem RESET befindet sich der Prozessor im Real-Mode. Die Umschaltung in den protected mode erfolgt durch Setzen des ersten Bits PE (Protection Enable) im Maschinenwortstatusregister. Dazu dient ein spezieller Befehl LMSW (Load Machine Status Word). Ein Befehl, der den Prozessor vom virtuellen Modus in den realen Modus zurücksetzt, gibt es jedoch nicht. 11

Der 8286 unterstützt ein virtuelles Speichermodell auf der Basis von Segmenten, wie sie schon beim 886 vorkommen. Die Segmente können aber unterschiedliche Größen haben, wobei die maximale Größe 64 KByte beträgt. Die Angabe der virtuellen Adresse erfolgt durch Angabe von 2 16-Bit-Größen. Die Angabe der virtuellen Adresse eines Speicherplatzes erfolgt (vergleichbar wie beim 886) durch die Angabe von 2 16-Bit-Größen: - einer 16-Bit-Segmentkomponente, auch Segmentselektor genannt, durch die der Inhalt des Segmentregisters wiedergegeben wird - einer 16-Bit-Offsetadressierung, die sich wiederum aus drei Teilen zusammensetzen kann, dem Inhalt des Basisregisters + Inhalt des Indexregisters + einem 8/16-Bit Displacement. Wenn also eine Befehl eine direkte Adressierung durchführt, ist im virtuellen Adressraum eine einmalige Adressumwandlung mittels Offsetadresse und Segmentkomponente möglich. Es gibt aber auch eine Anzahl von Befehlen mit indirekter und indizierter Adressierung (also z. B. für Felder), und dann wird die Errechnung der physikalischen Adresse ein mindestens 2-stufiger Vorgang. Der Unterschied in der Speicherorganisation zwischen Real-Modus und Protected Modus besteht in der Interpretation des Segmentselektors. Im 886-Modus gibt die Segmentkomponente direkt die physikalische Segmentbasisadresse an. Der Segmentselektor im Protected Mode hat dagegen eine völlig andere Bedeutung. virtuelle Adresse 15 Segment-Selektor 3 2 1 15 Offset-Adresse 13-Bit-Index TI RPL 16 Bit requested privilege level Tabellen - Indikator TI = : globaler virtueller Speicherraum TI = 1: lokaler virtueller Speicherraum Abb. 5.8: Virtuelle 16-Bit-Adresse beim 8286-Prozessor Der Segmentselektor gibt nur die Lage eines Segments im virtuellen Speicherraum an. 2 Bits des Segmentselektors, die Bits und 1 im RPL-Feld, werden nur für das Schutzkonzept benötigt und zeigen die Privilegstufe bezüglich der Schutzfunktion an. Die Bits 2-15 werden verwendet, um die Lage des Segments im virtuellen Speicherraum anzugeben. Mit diesen 14 Bit kann man 16 k verschiedene Segmente angeben, wobei jedes Segment maximal 64 KByte groß sein kann. Die maximale Größe des virtuellen Speichers beträgt 1 GByte. Der gesamte virtuelle Adressraum wird wiederum in 2 Hälften zu je 2**13 = 8192 = 8k Segmenten, den globalen und den lokalen Adressraum aufgeteilt. Ein spezielles, als Tabellenindikator bezeichnetes Bit wählt entweder den lokalen oder den globalen Adressraum aus. Mit den restlichen 13 Bit werden dann jeweils 8192 Segmente in dieser jeweiligen Hälfte definiert. Diese Aufteilung macht deshalb Sinn, weil es bei verschiedenen Anwenderprogrammen immer Programmteile gibt, die für alle Tasks gleich sind, während andere Routinen nur für spezielle Tasks und "privat" sind. Es gibt also einen globalen und einen lokalen Adressraum. 12

Virtueller Gesamtadressraum Task2 lokaler Adressraum Task 1 Virtueller Gesamtadressraum Task1 lokaler Adressraum Task 2 globaler Adressraum gemeinsam lokaler Adressraum Task 3 Virtueller Gesamtadressraum Task3 Abb. 5.9: Aufteilung des Adressraumes in globalen und lokalen Teil Für einen Programmierer auf dem 8286 stellt sich also ein virtueller Speicherraum von insgesamt 16 384 numerierte Segmente mit je 64 KByte Länge zur Verfügung. Tatsächlich kann ein Programmierer in diesem 1 GByte-Adressraum wie beim 886 gewohnt Adressen bilden. Die Übersetzung in den 16 MByte großen realen Adressraum geschieht dann mittels der Memory- Management-Unit (MMU). Wir nehmen an, dass ein auf virtuelle Adressen ausgelegtes Programm vom Hintergrundspeicher in den Hauptspeicher geladen werden soll. Dann werden Programme in Einheiten von Segmenten aus dem virtuellen Speicher in den physikalischen Arbeitsspeicher übertragen. Die Zuweisung der physikalischen Adresse erfolgt über die MMU. Die Lage der Segmente im physikalischen Speicher wird durch sogenannte Segmentdeskriptoren beschrieben. Diese beinhalten die Anfangsadresse des Segments (Segmentbasisadresse), aber auch die Segmentlänge und Zugriffsrechte für das Segment. Damit wird das Schutzkonzept für den Protected Mode realisiert. 7 7 reserviert für 8386 (muß sein) Zugriffsrecht- Byte Segmentlänge Anfangsadresse A23 - A16 Anfangsadresse A15 - A 8 6 4 2 8 Byte 15 Abb. 5.1: Format eines Segmentdeskriptors Für jedes Segment im physikalischen Arbeitsspeicher gibt es also einen8-byte-deskriptor, dessen Komponenten folgende Bedeutung haben: - Die 16-Bit-Länge gibt die Größe des jeweiligen Segments an, die bis zu 64 KByte groß sein kann. Durch die Definierbarkeit unterschiedlicher Segmentlänge kann eine recht dichte Packung der Segmente im Speicher erfolgen. - Die 24-Bit-Anfangsadresse gibt die absolute Adresse des Segmentanfangs im physikalischen Adressraum an. Jede beliebige physikalische Adresse kann Anfangsadresse sein. - Es existieren 2 Bytes, die beim 8286 nicht genutzt werde, aber beim 8386 benutzt werden. - Es existiert ein spezielles Zugriffsrechtbyte, das sich für die (aufwendigen) Schutzfunktionen nutzen lässt. 13

Die Deskriptoren sind wiederum in zwei Varianten möglich: Als Codesegmentdeskriptor und als Datensegmentdeskriptor. Darüber hinaus gibt es Systemsegmentdeskriptoren. Codesegment-Deskriptor Datensegment-Deskriptor 7 P DPL S = 1 E = 1 C R A 7 P DPL S = 1 E = ED W A Abb. 5.11: Zugriffsrechtbyte Typ Typ Die Bits im Zugriffsrechtbyte haben folgende Bedeutung: P: Präsenzbit. Es gibt an, ob sich das Segment im physikalischen Arbeitsspeicher befindet DPL: Deskriptorprivilegstufe. Diese beiden Bits geben die Privilegstufe ( bis 3) für das Segment an, wodurch die Zugriffsmöglichkeiten eingeschränkt werden können. S = 1: Kennzeichnung von Code- und Segmentdeskriptoren (im Unterschied zu Systemsegmentdeskriptoren mit S = ). A: Zugriffsbit: A = 1, wenn ein Prozessorzugriff erfolgt ist, ausnutzbar für Zugriffsstatistiken des Betriebssystems. Für die weiteren Bits im Codesegementdeskriptor gilt: E = 1: executable (ausführbar). Dieses Segment enthält ausführbare Befehle R = 1: auch lesbares Segment (execute / read) R = : nur ausführbares Segment C = 1: conforming Codesegment, passt seine Privilegstufe an die augenblickliche Privilegstufe der Task an C = : normales, nicht-conforming Codesegment. Für die weiteren Bits in den Datensegmentdeskriptoren gilt: E = : nicht ausführbar, charakterisiert das Datensegment W = 1: auch beschreibbares Datensegment (read / write) W = : nicht schreibbar (read-only) ED = 1: expansion direction, ist E = 1, so wächst das Datensegment in Richtung auf niedere Adressen (Stack-Segment), bei E = liegt ein normales. in Richtung höherer Adressen wachsendes Segment vor. Die Segmentdeskriptoren werden im Arbeitsspeicher zu zwei speziellen sogenannten Deskriptortabellen zusammengefasst. Die Zweiteilung des virtuellen Speichers in globalen und lokalen Speicher wird auch physikalischen Speicher beibehalten. Für die globalen Speichersegmente existiert eine sogenannte globale Deskriptortabelle (GDT), für die privaten Segmente existiert eine lokale Deskriptortabelle (LDT). In jeder der beiden Deskriptortabellen befinden sich maximal 2**13 = 8 192 Deskriptoren. Mit einer Länge von 8 Byte für jeden Deskriptor kann jede Deskriptortabelle maximal 64 KByte lang sein, was wiederum einer vollen Segmentlänge entspricht. Während einer Programmausführung werden die beiden Deskriptortabellen ständig von der MMU und dem Betriebssystem überwacht und auf dem aktuellen Stand gehalten. Wichtig ist, dass bei einem über Segmente organisierten virtuellen Betriebssystem die CPU bei jeder Adress-bildung in den Deskriptortabellen "nachschlagen" muss, was natürlich einen nicht unerheblichen Aufwand bedeutet. Andererseits bedeutet die Zuordnung spezieller Speichersegmente zu jeweiligen Programmen und Nutzern, dass nun ein Schutz gegen unbefugten oder zerstörenden Datenzugriff möglich ist. 14

Will die CPU ein Datum oder einen Befehl aus dem Hauptspeicher holen, so ist dazu die reale physikalische Adresse zu ermitteln. Den Berechnungsvorgang für die Adresse zeigt Abb. 5.12. 15 virtuelle Adresse Selektor Offset 15 15 Segmentregister Index Idex *8 TI GDT oder LDT Deskriptortabelle Segmentdeskriptor + physikalische Adresse Zielsegment Segmentlänge Segmentanfang gesuchter Sp.-Platz physikalischer Speicher Tabellen- Anfang physikalischer Speicher Bit 7 Bit Abb. 5.12: Bestimmung der physikalischen Adresse Eine vom Programm beschriebene virtuelle Adresse besteht zunächst aus zwei Anteilen, dem 16-Bit-Segmentselektor und der 16-Bit-Offset-Adresse. Mit den vier im Prozessor vorhandenen 16-Bit-Segmentregistern (CS, DS, ES, SS, wie beim 886) sind gleichzeitig vier verschiedene Segmente adressierbar. Der Selektoranteil einer virtuellen Adresse wird in eins der vier Segmentregister geladen und kann damit für die Berechnung einer physikalischen Adresse benutzt werden. Über diesen Selektoranteil wird zunächst der zuständige Segmentdeskriptor in einer der beiden Deskriptortabellen gefunden. Einmal ist damit dann die Anfangsadresse des jeweiligen Segments bekannt, außerdem aber können auch die Zugriffsrechte abgefragt werden. Die endgültige physikalische Adresse erhält man dann dadurch, dass auf die Segmentanfangsadresse die Offsetadresse aufaddiert wird. Dies ist zwar eine eindeutige Methode, an die richtige Speicherstelle korrekt und ohne Verletzung irgendwelcher Schutzvorschriften zu gelangen, aber die Rechnerei dazu ist eher etwas aufwendig, wenn man zwecks Suchens einer Speicherzelle stets den Segmentselektor im Speicher holen muss. Der 8268 hat deshalb ein internes Cache-Register für die Segmentverwaltung. Jedesmal dann, wenn ein Segmentregister mit einem neuen Segmentselektor geladen wird, holt sich der Prozessor den kompletten Inhalt des dazugehörigen Segmentdeskriptors in dieses Cache-Register. Cache-Register dieser Art sind "verborgen" und normalerweise für den Programmierer nicht zugreifbar. Damit spielt sich die komplette Adressberechnung (so lange man in einem Segment bleibt) in der Adresseinheit der CPU ab, die Adressierung geschieht dann nicht wesentlich langsamer als im Real-Modus. Für die Lage der beiden Deskriptortabellen im physikalischen Arbeitsspeicher muss man noch die Anfangsadressen der GDT (global descriptor table) und der LDT (local descriptor table) kennen. Speziell für die Bereitstellung dieser Anfangsadressen existieren 2 Register (GDTR und LDTR), die bei Bedarf vom Betriebssystem geladen werden. Das GDTR ist ein 4-Bit-Register, das direkt die 24-Bit-Anfangsadresse und die 16-Bit-Länge dieser Tabelle enthält. Die LDTR ist dagegen nur 16-Bit-Register, das einen 16-Bit-Selektor enthält. Der LDT-Selektor weist in die globale Deskriptortabelle und wählt dort mit seiner Indexziffer den Deskriptor für die aktuelle lokale Deskriptortabelle aus. 15

Die globale Deskriptortabelle enthält also Deskriptoren, die nicht (wie normal) auf einzelne Segmente hinweisen, sondern auf lokale Deskriptortabellen. Diese heißen LDT-Deskriptoren. Dies ist ein Typ der vorab erwähnten Systemsegmentdeskriptoren, es existieren noch zwei weitere Typen, welche sogenannte Task-Status-Segmente beschreiben. 7 Zugriffsrecht-Byte P DPL S Anfangsadresse A15 - A 7 reserviert für 8386 (muß sein) Anfangsadresse A23 - A16 Segmentlänge 8 6 4 2 8 Byte 15 Zugriffsrecht-Byte P DPL x x S Typ = 1 Abb. 5.13: LDT-Deskriptor und Zugriffsbyte Genau wie die aktuellen Segmentdeskriptoren wird auch der aktuelle LDT-Deskriptor in einem Cache-Register in der CPU automatisch gespeichert. Immer dann, wenn das LDTR-Register neu geladen wird, wird auch zugleich der Inhalt des zugehörigen LDT-Deskriptors (wie Länge, Anfangsadresse, Zugriffsrechte) in das 48 Bit breite Cache-Register geladen. Für das Laden der beiden Register GDTR und LDTR existieren zwei spezielle Befehle (LGDT und LLDT). Diese Befehle können nur von privilegierten Programmen der Stufe, dazu gehört insbesondere das Betriebssystem, gestartet werden. Sie stehen auf der Ebene der Anwendersoftware nicht zur Verfügung. CS DS ES SS Selektor Index TI Zugriff Anfang Länge Cache - Teil Laden durch Befehl Anfang Länge GDTR Laden bei Initialisierung Selektor Zugriff Anfang Länge LDTR Index Cache-Teil Tab.- Ende Virtuelle Adresse Segment-Selektor Offset Index TI = 1 15 15 GDT reserviert Zugriff Anfang LDT- Deskr. Anfang Länge Tab.- Ende LDT reserviert Zugriff Anfang Anfang Länge Segmentende Zielsegment gesuchter Platz Laden bei Initialisierung oder bei Task-Wechsel (Grau: CPU-Register) Tabel.- Anfang Speicher Tabellenanfang Speicher Segment-. anfang Abb. 5.14: Komplettes Schema der Adressbildung 16

Wird ein Prozessor im Multi-Tasking-Betrieb gefahren, so besitzt jede Task ihre eigene Deskriptortabelle im physikalischen Speicher und entsprechend einen LDT-Deskriptor im globalen Speicherraum. Wie andere Dateien kann natürlich eine solche Tabelle vorübergehend auch auf die Platte ausgelagert sein. Wenn das Betriebssystem einen Wechsel zwischen mehreren Tasks organisiert, so wird das LDT- Register mit dem zugehörigen neuen LDT-Selektor geladen. Dieser Selektor bestimmt dann die Adresse des LDT-Deskriptors, welcher die Anfangsadresse der neuen lokalen Deskriptortabelle enthält. Die globale Deskriptortabelle im Arbeitsspeicher wird durch das Betriebssystem gleich beim Start- Up des Rechners festgelegt. Diese Art der Speicherorganisation für die virtuelle Adressverwaltung wurde beim 8286 eingeführt und bei den nachfolgenden Intel-Prozessoren (8386, 8486, Pentium) im wesentlichen beibehalten. Sie wird von DOS nicht unterstützt, aber bildet die Grundlage für Microsoft WINDOWS. In dieser Form ist dann ein Rechnerbetrieb mit Multi-User- und Multi-Tasking-Betrieb möglich. Allerdings nutzt UNIX die Segment-basierte Speicherorganisation nicht. Die auf dem Konzept von Seiten (pages) basierende Speicherorganisation, wie sie zu UNIX passt und auch viel besser zu Speichern mit Caches passt, ist erst ab dem 8386-Prozessor implementiert. Zusammenfassend seien hier noch mal die im 8286 vorkommenden Despriptoren dargestellt. Segmentdeskriptoren beschreiben unmittelbar die Lage eines Segmentes (Daten oder Code) im physikalischen Speicherraum durch die Angabe der 24-Bit-Anfangsadresse und der 16-Bit-Länge des Segmentes. Format eines Segment - Deskriptors Format eines Gate-Deskriptors 7 7 7 7 reserviert für 8386 reserviert für 8386 (muß sein) 8 (muß sein) 8 Zugriffsrecht-Byte Anfangsadresse P DPL S T y p A23 - A16 6 Zugriffsrecht-Byte Anfangsadresse P DPL 1 T y p A23 - A16 6 Anfangsadresse A15 - A 4 Segment-Selektor T I 4 Segmentlänge 2 Offset 2 15 15 Abb. 5.15: Segementdeskriptor und Gate-Deskriptor Gate-Deskriptoren dagegen bestimmen indirekt, mit Hilfe eines "Gates" (was hier kein logisches Gatter, sondern eine SW-Funktion ist) eine Einsprungadresse in eine Programmroutine. Das "Gate" enthält den Segmentselektor und den Offset dieser Einsprungadresse. Die Adressierung geht dann ganz normal vor sich: Der Segmentselektor wählt aus einer Deskriptortabelle den passenden Codesegmentdeskriptor aus, auf dessen Basisadresse der Offset addiert wird. 17

Segment-Deskriptoren Gate-Deskriptoren Codesegment-Deskriptor Datensegment-Deskriptor Call-Gate-Deskriptor (Typ ) Task-Gate-Deskriptor (Typ 1) LDT-Deskriptor TSS-Deskriptor "Systemsegment- Deskriptoren" Interrupt-Gate-Deskriptor (Typ 1) Trap-Gate-Deskriptor (Typ 11) Abb. 5.16: Schema der Deskriptortypen Eine Übersicht über die insgesamt vorkommenden Typen von Deskriptoren dieser beiden Haupttypen gibt Abb. 5.16. Wir werden noch sehen, dass für die Implementierung von Schutzfunktionen und für die Interrupt-Bearbeitung noch einige weitere Typen notwendig sind. Uff.!! 5.2.5 Schutzfunktionen Die Intel-Prozessoren ab dem 8286 sind geradezu berühmt dafür, dass ein sehr aufwendiges Konzept für den Schutz der unterschiedlichen Speicherbereiche gegen unbefugten und unbeabsichtigten Zugriff implementiert ist. Dies gilt natürlich wieder nur für den Protected Mode. Im Real-Mode sind alle Speicherbereiche ungeschützt, man kann also nach Belieben alle wichtigen Daten verfälschen! Das Schutzkonzept im Protected Mode leistet folgende Funktionen: - Automatische Überprüfung jedes Speicherzugriffs auf Verträglichkeit - Isolierung von Speicherbereichen, die einzelnen Tasks zugeordnet sind, beim Multi-Tasking- Betrieb gegeneinander, - Schutz der Betriebssystemsoftware vor dem Anwenderprogramm. Durch die HW-seitige Implementierung sind diese Funktionen für den Entwickler von Betriebssystemen zugreifbar vorhanden, sie müssen nur aufgerufen werden, verursachen aber im Vergleich zu SW-basierten Techniken nur einen minimalen Mehraufwand an Codelaufzeit. Die Verletzung des Schutzkonzepts während der Laufzeit führt "Ausnahmeunterbrechungen", die sicher jeder Windowsanwender mehr oder weniger kennt. Die Grundlage für die Implementierung der Schutzfunktionen bildet natürlich die Segmentierung. Jedes Segment im Arbeitsspeicher ist durch den Segmentdeskriptor mit Schutzmöglichkeiten versehen. Diese können betreffen: - die Segmentlänge: Es wird geprüft, ob ein anzusprechender Speicherplatz überhaupt im Segment liegt. - das Präsenzbit P im Byte für das Zugriffsrecht: Ist das angesprochene Segment im Arbeitsspeicher vorhanden? - der Segmenttyp im Byte für das Zugriffsrecht: Das angesprochene Segment kann ein Codesegment, ein Datensegmant, oder ein Stack-Segment sein. Es kann vom Typ Execute-Only, Read-Only, Execute-Read oder Read-Write sein. 18

Eine weitere nicht-triviale Schutzfunktion ist selbstverständlich durch die Isolierung verschiedener Segmente, die zu unterschiedlichen Tasks gehören, gegeneinander gegeben. Jede Task besitzt ihre eigene lokale Deskriptortabelle. Für eine Quantisierung der Zugriffsrechte wurden vier Stufen eingeführt. Privileg Betriebssystem-Kern: kritische Prozeduren und Daten 1 Betriebssystem-Service-Routinen 2 Anwenderspezifische BS-Erweiterungen 3 Anwenderprogramme Abb. 5.17: Privilegebenen in der 8286-Architektur Jedes Code- und Datensegment besitzt eine eigene eindeutige Privilegebene. Allerdings kann ja eine Task auf eine Reihe von Segmenten zugreifen, die durchaus unter-schiedliche Ebenen der Privilegierung haben können. Um den Ablauf hier zu organisieren, existieren einige Grundregeln: Regel 1: Regel 2: Regel 3: generell: Wenn man sich innerhalb einer Task auf der gleichen Privilegstufe bewegt, so ist ein unbeschränkter direkter Zugriff auf Code- und Datensegmente möglich. Datenzugriff: Auf Daten kann ein Programm nur dann zugreifen, wenn die Privilegstufe eines aufgerufenen Datensegments gleich oder niedriger ist als die Stufe des zugreifenden Programms. Auf Datensegmente mit höherer Privilegstufe kann niemals zugegriffen werden. Codezugriff: Zwischen Codesegmenten mit unterschiedlichem Level darf im allge-meinen nicht unkontrolliert gewechselt werden. hoch DS CS C = CS C =1 CS CS BS-Kern 1 DS CS C = CS C =1 CS Gate BS-Service- Routinen 2 3 niedig DS DS CS CS-Zugriff auf Datensegmente CS JMP CS CALL CS CS-Zugriff auf Code- Segmente (mit conforming Bit) CS call Gate call Gate CS-Zugriff auf Code-Segmente via Call Gates BS- Erweiterungen Anwender- Programme DS Daten-Segment CS Code-Segment Gate Call- Gate Abb. 5.18: Zugriffsmöglichkeiten von einem Codesegment aus 19

a. Ein direktes Springen von einem Codesegment in ein anders ist nur bei gleicher Stufe erlaubt. Dazu wird ein JUMP-far-Befehl oder CALL-far-Befehl verwendet. b. Auf ein Codesegment mit niedrigerer Privilegstufe darf niemals zugegriffen werden. Dies dient dem Schutz qualitativ "hoher" Software (z. B. Betriebssystem) vor weniger erprobtem qualitativ "niedrigerem" Anwendercode. c. In ein Codesegment mit höherer Qualitätsstufe darf nur im Ausnahmefall direkt gesprungen werden, nämlich dann, wenn das höherwertige Segment ein "conforming"-segment ist, das eine Anpassung der Priviligierungsebenen unterstützt. Dort ist das C-Bit auf 1 gesetzt. d. Im Normalfall, also aus einem nicht-conforming Segment (C = ) dürfen nur ausgesuchte Unterprogramme (Routinen) mit höherer Privilegstufe aufgerufen werden, und dies nur unter der "Kontrolle" eines sogenannten Call-Gates. Das Call-Gate beinhaltet die feste Einsprungadresse in die Unterroutine. Dazu existieren in den Deskriptortabellen GDT und LDT sogenannte Call-Gate-Deskriptoren. Diese sehen wieder aus wie Segmentdeskriptoren, aber die einzelnen Bytes haben eine andere Bedeutung. Man kann übrigens diese Schutzfunktionen auch auf Ein-/Ausgabe-Operationen anwenden. 5.2.6 Interrupts Ein weiterer Quasi-Segmentdeskriptor existiert für Interrupts. Im Protected-Mode sind für die Abarbeitung von Interrupts bis zu 256 verschiedene Interrupt- Routinen aufrufbar, deren Startadressen irgendwo im virtuellen Speicherraum befinden können. Für das Auffinden der Startadressen existiert eine Start-Adressen-Tafel (Interrupt description Table, IDT). Die Lage dieser Tabelle im physikalischen Speicher wird durch das "Interrupt Description Table Register" (IDTR) angegeben. Dies ist ein 4-Bit-Register, das die physikalische Anfangsadresse und die Länge der IDT-Tabelle enthält. Dieses Register kann nur durch einen speziellen Befehl in der höchsten Privilegstufe geladen werden. Im Gegensatz zum 886, bei dem die Angabe von Startadressen für die Interrupt-Bearbeitung direkt erfolgt, werden die Startadressen im Protected Mode indirekt über Gates angegeben. Dazu existieren spezielle Interrupt-Gate-Deskriptoren. Es existiert eine sogenannte "Interrupt-Deskriptor-Tabelle", welche neben anderen Informationen für jeden einzelnen definierten Interrupt auch die Startadresse enthält. Die einzelnen Interrupts sind durch Kennzahlen charakterisiert, und jeder Kennzahl ist ein Interrupt-Deskriptor in der Deskriptortabelle zugeordnet. 7 7 reserviert für 8386 (muß sein) nicht verwendet Segment-Selektor der Startadresse TI Offset der Startadresse Zugriffsrecht-Byte P DPL 1 1 T xx 8 6 4 2 8 Byte 15 T = : Interrupt-Gate T = 1: Trap - Gate Abb. 5.19: Format eines Interrupt-Gate-Deskriptors 2

Für den Programmablauf im Protected Mode haben wir schon erwähnt, dass der Ablauf eines Programms innerhalb einer speziellen Task erfolgt. Eine solche Task ist eine vom Nutzer über das Betriebssystem gestartete Prozedur. Natürlich sind einzelne Tasks bezüglich des Speicherzugriffs gegeneinander abgesichert oder geschützt. Natürlich ist dieses Schema auch bei der Interrupt- Bearbeitung zu beachten. Man kann deshalb Interrupts definieren, bei denen - eine Interrupt-Bearbeitung nicht innerhalb der laufenden Task möglich ist. Dann muss der Interrupt einen Task-Wechsel auslösen. Der zugehörige Eintrag in die Interrupt- Deskriptor-Tabelle enthält ein sogenanntes Task-Gate, mit dessen Hilfe ein Übergang auf eine andere Task erfolgt. - eine Interrupt-Bearbeitung innerhalb der laufenden Task möglich ist. In diesem Fall enthält der Eintrag in die IDT-Tabelle ein "Interrupt-Gate" oder Trap-Gate", das die virtuelle Startadresse der Interrupt-Routine enthält. Im ersten Fall muss eine Art "Tor" zwischen zwei Tasks geschaffen werden, was relativ kompliziert ist. Deshalb betrachten wir zunächst den einfacheren zweiten Fall. Wenn der Interrupt auftritt, so folgt der Sprung in der in derselben Task im Speicher (oder mindestens im Adressraum, wenn der Teil auch gerade auf die Platte ausgelagert sein mag) vorhandene Interrupt-Startadressen-Tabelle. Die Startadresse für die Routine zur Abarbeitung des jeweiligen Interrupts steht im jeweiligen Interrupt-Gate-Deskriptor. Dieser enthält den Segmentselektor und den Offset der Startadresse für die Interrupt-Routine, also die virtuelle Startadresse. Eigentlich könnte man jetzt direkt mit Suchen der physikalischen Adresse für Start des Interrupt- Verarbeiungsprogramms beginnen. Weit gefehlt! Der Deskriptor enthält noch ein wichtiges Steuerbit. Für T = (Interrupt Gate) liegt ein gewöhnlicher Interrupt vor. Das bedeutet, für die Zeit der Interrupt-Verarbeitung ist das IF-Flag, welches die Annahme eines weiteren Interrupts erst möglich macht, auf gesetzt ist. Ein Abbruch zugunsten eines weiteren, vielleicht noch dringenderen Interrupts ist nicht möglich. Erst nach erfolgter Abarbeitung wird IF = 1 gesetzt und weitere Interrupts sind möglich. Für den Fall T = (Trap Gate) bleibt IF = 1, die aufgerufene Interrupt-Routine kann also beliebig selbst unterbrochen werden. Im Gate-Deskriptor gibt es die Angabe einer Privilegstufe DPL., das den Zugriff auf eine Interrupt- Routine steuert. Ein Interrupt-Befehl kann nur von einem Programm aus erfolgen, das im Vergleich zum Interrupt-Gate gleich hoch oder höher priviligiert ist. Der Offset des Gate-Deskriptors und der Segmentselektor bestimmen indirekt die Startadresse der Interrupt-Routine. Der Selektor wählt ein Codesegment in der GDT oder der LDT-Tabelle aus. Auf die Anfangsadresse des gefundenen Segments wird dann die Offsetadresse aufaddiert. Erst dann ist die physikalische Startadresse vorhanden. 21