2009-07-30 5 views
2

Aus Wikipedia:.Speichersegmentierung auf modernen Betriebssystemen: Warum benötigen Sie 4 Segmente?

„Segmentation nicht auf x86-Prozessoren ausgeschaltet werden kann, so viele Betrieb Systeme eine flache Speichermodell zu make Segmentierung unmerklich zu Programmen verwenden Zum Beispiel setzt die Linux Kernel up nur 4 Segmente“

ich seit Schutz bedeuten bereits Pflege durch den virtuellen Speicher-Subsystem genommen wird (PTEs einen Schutz Bit haben), warum würden Sie brauchen vier Segmente (statt 2: dh Daten/Code mit DPL 3 seit Sie können ausführen te code, der sich in einem Segment mit niedrigerer Priorität befindet)?

Danke.

Antwort

3

Sie zitieren nicht genug von diesem wikipedia page, wo es die vier Segmente und warum alle beschreibt nötig sind, um ...

Gewöhnlich aber implizite Segmente sind verwendet. Alle Befehlsabrufe kommen aus dem Codesegment im CS Register. Die meisten Speicherreferenzen stammen aus dem Datensegment im DS-Register . Processor Stapelreferenzen, entweder implizit (z.B. Push- und Pop Anweisungen) oder explizit (Speicher greift auf den ESP oder (E) BP Register verwendet wird) verwenden, um das Stapelsegment in die SS registrieren. Schließlich verwenden die Zeichenfolgen (z. B. stos, movs) auch das zusätzliche Segment ES.

Wenn Sie also ein flaches Modell einrichten möchten, wo Programmierer müssen nicht über die Segmentierung zu denken, müssen Sie alle vier dieser Segmentregister einzurichten (CS, DS, SS, ES) die haben gleiche Basis. Dann sind Adressen, die für alle vier berechnet wurden, äquivalent.

Diese Seite zeigt ein Beispiel mit allen vier Satz auf Basis = 0, limit = 4Gb

+0

Das beantwortet meine Frage nicht. Die Art und Weise, wie die Segmentierung im geschützten Modus implementiert wird, ist eine Indirektionstabelle (dh die GDT/LDT), so dass Sie immer noch 2 Segmente einrichten können und 2 Register auf denselben Eintrag in der Tabelle zeigen ... –

+0

Sie müssten extra arbeiten arbeiten Sie, um die impliziten Segmentverweise zu vermeiden, wenn Sie nicht für alle gültige Konfigurationen hatten 4. Wenn Sie nur CS und DS eingerichtet hätten, müssten Sie ein Segment-Override-Präfix für die Anweisungen verwenden, in denen SS und ES implizit verwendet werden. Es ist also viel einfacher, alle 4 identisch einzurichten. Dann können Sie vergessen, dass eine Segmentierung existiert. Ich bin auf meinem x86 so rostig, dass ich wahrscheinlich einen Fall vermisse, in dem selbst die Verwendung von Override-Präfixen mehr Probleme verursachen würde. Warum diese Dose Würmer überhaupt öffnen? Welche Schwierigkeit ist es, alle 4 einzurichten? –

1

Sie einen separaten Satz von Segmenten für Kernel- und User-Modus, so dass Code-User-Modus kann nicht Modusdaten auf Kernel schreiben. Das wäre eine schlechte Sache.

+0

Dies ist die richtige Antwort. Die andere Antwort konzentriert sich fälschlicherweise auf das Segment _registers_, nicht auf die Segmente selbst. (Und es fehlen 2 der 6-Segment-Register, "FS" und "GS"). Segmente existieren in [GDT] (http://en.wikipedia.org/wiki/Global_Descriptor_Table) und LDT. – MSalters