Startseite   |  Site map   |  A-Z artikel   |  Artikel einreichen   |   Kontakt   |  
  


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


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