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)

Fehler

Unix

Segmentselektoren, segmentdeskriptoren und privilegierungsstufen


1. Java
2. Viren



Wie schon beschrieben, multipliziert die Adressierungseinheit des i386 im Real Mode den Wert des Segmentregisters einfach mit 16, um die lineare Basisadresse des betreffenden Segments zu ermitteln. Die Adresse innerhalb eines solchen 64kByte großen Segments wird dann durch den Offset in einem Vielzweckregister angegeben. Im Protected Mode werden die Werte der Segmentregister völlig anders interpretiert, sie stellen keine Basisadressen, sondern sogenannte Selektoren dar.
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 (RPL: Requestor Privilege Level) an, ab der ein Programm auf das Segment zugreifen darf. Der Wert des Feldes RPL im Segmentselektor des Code-Segments CS wird als gegenwärtige Privilegierungsstufe (CPL: Current Privilege Level) bezeichnet, da dem gegenwärtig aktiven Programmcode diese Privilegierungsstufe zugewiesen ist. Das aktive Programm kann also auf Datensegmente zugreifen, deren Privilegierungsstufe gleich 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 i386 kennt insgesamt vier Privilegierungsstufen (PL) 0 bis 3 - 0 kennzeichnet die höchste, 3 die niedrigste Stufe. Ein größerer Wert gibt also eine niedrigere, ein kleinerer eine höhere Privilegierungsstufe an. 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öherer CPL) dürfen nur in Ausnahmefällen auf Segmente mit höherer Stufe (kleinerer CPL) zugreifen. Hierzu dienen sogenannte Gates (Tore). Damit wird der Schutz innerhalb eines Tasks durch die verschiedenen Privilegierungsstufen vermittelt.

Die höchste Privilegierungsstufe 0 besitzt üblicherweise der kritische Teil oder Kernel des Betriebssystems. Dieser umfaßt zumeist die Routinen zur Speicherverwaltung, zum Ausführen von Task-Switches, zu Behandlung kritischer Fehler, usw. Viele Befehle, die den Status des Prozessors oder Computers direkt betreffen, wie beispielsweise LGDT (Load Global Descriptor Table) oder LMSW (Load Machine Status Word) können im Protected Mode nur von einem Programm ausgeführt werden, das die Privilegierungsstufe 0 aufweist. Damit soll verhindert werden, daß Anwendungsprogramme durch einen Programmierfehler das Betriebssystem zerstören oder Hacker unkontrolliert Zugriff auf Daten bekommen.

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 arbeiten häufig auf dieser Stufe. Weniger kritische Betriebssystemfunktionen, z.B. Unterstützungen für eine graphische Benutzeroberfläche (API), können dagegen Stufe 2 aufweisen.

Die niedrigste Privilegierungsstufe aller Tasks besitzen Anwendungsprogramme, da diese den Computer nur benutzen, aber nicht steuern oder kontrollieren sollen. Durch die niedrige Stufe (hohe 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 dem Abbruch des fehlerhaften Programms, alle anderen Tasks laufen unbeschädigt und unbeeinflußt weiter. Damit können Bugs, d.h. Programmfehler, besser entdeckt werden. Dies alles setzt natürlich voraus, daß das Betriebssystem fehlerfrei ist, was wegen der Komplexität von Multitasking-Betriebssystemen leider keine Selbstverständlichkeit darstellt.

Der i386 sieht für jede Privilegierungsstufe PL=0 bis PL=3 eines Tasks einen eigenen Stack vor. Beispielsweise wäre bei der Ausführung von Word ein Stack für das Programm Word (PL=3), einer für die Funktionen der Benutzeroberfläche (PL=2), ein weiterer für die Betriebssystemfunktionen zur Dateiverwaltung (PL=1) und ein letzter für 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 eröffnen oder zu schließen - es also auf fremde Funktionen zugreift -, garantieren die Gates, daß der Zugriff fehlerfrei lä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 gibt als sogenannter Tabellenindikator (TI) an, ob die globale (TI=0) oder lokale (TI=1) Deskriptortabelle für die Lokalisierung des Segments im Speicher benutzt werden soll. Diese beiden Tabellen sind wesentlich für die Segmentierung des Speichers im Protected Mode. Der i386 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. Jeder Deskriptor umfaßt acht Byte. Diese Deskriptortabelle wird als global bezeichnet, weil sie Segmente beschreibt, die üblicherweise allen Tasks zur Verfügung stehen (wenn deren Privilegierungsstufe oder entsprechende Gates den Zugriff gestatten). Auch die lokale Deskriptortabelle ist eine Liste mit gleichartig aufgebauten Segmentdeskriptoren. Im Gegensatz zur globalen Deskriptortabelle steht die lokale aber normalerweise nur dem gerade aktiven Task zur Verfügung, d.h. bei einem Task-Switch wird auch die lokale Deskriptortabelle gewechselt.

Die 32 Basisbits des Segmentdeskriptors geben die Startadresse des beschriebenen Segments im Speicher an. Diese 32 Bits der Basisadresse entsprechen den 32 Adreßleitungen des i386. Damit können im Protected Mode 232 Byte oder 4gByte adressiert werden. Der Basiseintrag eines Segmentdeskriptors gibt die Startadresse des betreffenden Segments in diesem doch recht großen Adreßraum an.

Im Real Mode ist jedes Segment 64kByte groß, selbst, wenn nur wenige Daten in einem Segment gespeichert werden. Durch die festgelegte Verzahnung der Segmente bleiben aber höchstens 15 Byte unbenutzt, da die Segmente mit 16 Byte Abstand aufeinander folgen. Die völlige Entkoppelung 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 auf, um die tatsächliche Größe des Segments in Byte zu definieren. Bei gelöschtem G-Bit (Page-Granularität [=Körnigkeit]) sind durch die 20 Bits des Limiteintrags im Protected Mode also Segmente mit einer maximalen Größe von 220*1Byte (=1mByte) möglich, bei gesetztem G-Bit hingegen Segmente mit einer Größe von bis zu 220*4kByte (=4gByte).

Das tatsächliche Segmentlimit (oder gleichbedeutend die Größe) des vom Deskriptor beschriebenen Segments hängt also neben dem 20-Bit-Limit noch vom Granularity-Bit G ab. Zu beachten ist, daß beim i386 eine Page 4kByte (=4,096 Byte) groß ist.


Beispiel:
Limit=1000, G=0: Segmentlimit 1000 Byte
Limit=1000, G=1: Segmentlimit 1000*4kByte=4096000 Byte

Der volle Adressierungsbereich der 32-Bit-Offset-Register kommt daher erst bei Page-Körnigkeit zum Tragen. In diesem Fall ist die kleinste Zuweisungseinheit für ein Segment aber bereits 4kByte groß, d.h. der Speicher wird in Portionen zu 4kByte in Segmente eingeteilt. Das kommt nur für größere Systeme in Betracht, für PC-Anwender sind Segmente mit einer Größe von 1mByte meist ausreichen, der Speicherplatz wird dann besser ausgenutzt. OS/2 und auch Windows NT verwenden aber ein sogenanntes flaches Speichermodell (flat memory), bei dem ein einziges 4gByte großes Segment alle Tasks aufnimmt, d.h. die Segmentierung spielt hier fast keine Rolle mehr. Statt dessen wird eine Speicheraufteilung in Pages vorgenommen, für die weitere Schutzmechanismen existieren. [im Rahmen dieser Arbeit werden die Paging-Mechanismen jedoch nicht dargestellt]
Das Bit S im Segmentdeskriptor gibt an, um welchen Deskriptortyp es sich handelt. Ist S gleich 0, so beschreibt der Deskriptor ein Systemsegment, ansonsten ein Applikations-segment. Das Feld Type im Segmentdeskriptor gibt die Art und DPL (Descriptor PL) die Privilegierungsstufe (von 0 bis 3) des Segments an. Schließlich ist das Bit P (Present) ein Indikator dafür, ob sich das Segment tatsächlich im Speicher befindet (oder auf Festplatte ausgelagert ist etc.).

Das Bit AVL im Segmentdeskriptor kann der Anwender oder das Betriebssystem frei benutzen, der i386 verwendet es nicht, und Intel hat es auch nicht für künftige Verwendung reserviert.

Das Bit DB (Default/Big) gibt an, ob der i386 für das vom Deskriptor beschriebene Segment standardmäßig 16- oder 32-Bit-Operanden im Fall eines Datensegments bzw. 16- oder 32-Bit-Adressen für ein Codesegment verwenden soll. Ist DB=0, so benutzt der i386 16-Bit-Operanden oder -Adressen. Dieses Bit dient vor allem der Emulation von 16-Bit-Programmen, die für den 80286 geschrieben worden sind, auf einem i386.

 
 




Datenschutz

Top Themen / Analyse
Einleitung zu MFC
Das Benutzerkonzept von Windows NT
24-Nadeldrucker
SDRAM -
DAISY-CHAIN TECHNIK
Mehrfachvererbung
Different types of tasks
RAID 4 oder Block Striping with Parity
Stealth-Viren:
Die Entwicklung der Pager





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.