Startseite   |  Site map   |  A-Z artikel   |  Artikel einreichen   |   Kontakt   |  
   
  •  
    Biologie
    Themen der Chemie
    Deutsch online artikel
    Englisch / Englische
    Franzosisch
    Geographie
    Geschichte
    Informatik
    Kunst
    Mathematik / Studium
    Musik
    Philosophie
    Physik
    Recht
    Sport
    Wirtschaft & Technik



    Biographie

    Impressum

informatik artikel (Interpretation und charakterisierung)

Design

Steuerungsübergabe und call gates


1. Java
2. Viren



Bei einem Near-Call wird die Steuerung an eine Prozedur oder einen Sprungpunkt übergeben, der bzw. die sich im gleichen Segment wie der entsprechende CALL- oder JMP-Befehl befindet. Ein solcher Transfer verändert also nur den Wert des Befehlszählers EIP, und der i386 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 der i386 die Exception "allgemeiner Protection-Fehler" aus.

Tasks bestehen aber nur 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-Jump oder einem Interrupt statt. In allen drei Fällen wird ein neuer Selektor für das Codesegment 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 des Codesegments eine umfangreiche Prüfprozedur.

Für einen Far-Call oder Far-Jump 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 i386 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 aufrufenden Programmes und nicht der höher privilegierten Stufe des Conforming-Segments entspricht. Das verhindert, daß sich weniger privilegierte Programme über die Hintertür eines Conforming-Segments eine höhere Privilegstufe beschaffen und dadurch Zugriff auf geschützte Systembereiche erlangen.

. Besitzt das Zielsegment eine andere Privilegstufe 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 i386 einfach den Zielselektor 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üfung) 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 sogenanntes 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 Anwenderprogramm (PL=3) durch einen Interrupt-Handler im Kernel (PL=0) unterbrochen wird). Der Interrupt muß daher ein Interrupt- oder Trap-Gate benutzen, um den Interrupt-Handler zu aktivieren. Die Bedeutung der Task-Gates wird weiter unten 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 S=0 im Segmentdeskriptor und einen Wert des Typfeldes von 4 bis 7 und 12 bis 15 definiert. Sie sind also Teil der Systemsegmente.

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 und globalen Deskriptortabelle, nicht aber in der Interrupt-Deskriptortabelle auftreten. Dort sind nur Interrupt-, Trap- und Task-Gates erlaubt.

Wie die Abbildung bereits zeigt, unterscheidet sich der Aufbau eines Gate-Deskriptors ganz erheblich von einem "normalen" Segmentdeskriptor: Es fehlt z.B. die Basisadresse des Segments. Statt dessen ist das 5-Bit-Feld Param-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 Segmentdeskriptor-referenzen ausgeführt: die erste, um den Gate-Deskriptor zu ermitteln, und die zweite, um die Basisadresse des betreffenden Segments zu ermitteln. Das Gate enthält ja wiederum nur einen Zielsegment-selektor, nicht dessen lineare Adresse. Die Adressierungseinheit des i386 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 i386 erkennt am Eintrag im Typfeld, ob der Zielsegmentselektor für das CS-Register bei einem Far-Call oder Far-Sprung direkt ein Codesegment 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 unabhängig davon auf 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 Einsprungpunkt vorgegeben, so daß das aufrufende Programm nicht versehentlich einen falschen Einsprungpunkt vorgeben kann. Das ist besonders wichtig, wenn Funktionen des Betriebssystems aufgerufen werden: Ein falscher Einsprungpunkt in diesen Routinen führt gewöhnlich zu einem totalen Systemabsturz, die Angabe des falschen Gates dagegen höchstens zum Abbruch des Tasks und der Ausgabe einer Fehlermeldung.

Wie bereits erwähnt, besitzt jeder Task für jede der vier verschiedenen Privilegierungsstufen jeweils einen eigenen Stack. 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 Param-Count die Anzahl der zu kopierenden Doppelworte (á vier Byte) ein. Der i386 überträgt dann diese Doppelworte 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. Ein Programmierer, der mehr Byte für die Parameterübergabe benötigt, ist selbst schuld, doch bietet die Übergabe eines Far-Zeigers auf eine Datenstruktur mit den gewünschten Parametern einen einfachen und schnellen Ausweg.

Selbstverständlich führt der i386 auch bei einem Aufruf über Gates eine Prüfung der Zugriffsberechtigung aus. In diese Prüfung gehen die folgenden 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 z.B. benutzt, um die Steuerung an privilegierte Ebenen (z.B. das Betriebssystem) oder Code gleicher Stufe zu übergeben. Für letzteren Fall ist zwar kein Gate nötig, aber dieses Vorgehen ist auch möglich (und sicherer). Wichtig ist, daß nur CALL-Befehle Gates dazu verwenden können, Routinen niedriger Privilegierungsstufe (mit größerer 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) muß kleiner oder gleich dem DPL des Gate-Deskriptors sein;
. Der DPL des Zielsegment-Deskriptors muß gleich dem CPL des aufrufenden Programmes sein.

Für den CALL-Aufruf oder einen Sprung-Befehl zu einem Conforming-Segment müssen dagegen die folgenden zwei Bedingungen erfüllt sein:
. Die effektive Privilegierungsstufe EPL (gleich dem Maximum von CPL und RPL) muß kleiner oder gleich dem DPL des Gate-Deskriptors sein;
. Der DPL des Zielsegment-Deskriptors muß kleiner oder gleich dem CPL des aufrufenden Programmes sein.

Bei einem Aufruf einer Prozedur höherer Privilegierungsstufe über ein Call-Gate führt der i386 noch folgende Vorgänge aus:
. Der CPL-Wert wird so geändert, daß er die neue Privilegierungsstufe widerspiegelt;
. Der i386 übergibt die Steuerung an die aufgerufene Prozedur oder den angesprungenen Code;
. Statt 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.

 
 




Datenschutz

Top Themen / Analyse
IMesh
Wie komme ich zu einem Internet-Anschluss?
Daten und Datenstrukturen
Geschwindigkeit
Intelligente Tutorielle Systeme (ITS)
Bildung im Netz und die Erotik des Zweifels
Erläuterung einzelner Menüs des Lernservers
Die Geburt des Mikroprozessors
NetWare 4.x
Rechenprüfer, Qualitätskontrolleure und Normenprüfer





Datenschutz

Zum selben thema
Netzwerk
Software
Entwicklung
Windows
Programm
Unix
Games
Sicherheit
Disk
Technologie
Bildung
Mp3
Cd
Suche
Grafik
Zahlung
Html
Internet
Hardware
Cpu
Firewall
Speicher
Mail
Banking
Video
Hacker
Design
Sprache
Dvd
Drucker
Elektronisches
Geschichte
Fehler
Website
Linux
Computer
A-Z informatik artikel:
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 #

Copyright © 2008 - : ARTIKEL32 | Alle rechte vorbehalten.
Vervielfältigung im Ganzen oder teilweise das Material auf dieser Website gegen das Urheberrecht und wird bestraft, nach dem Gesetz.