Austauschen, Paging, Segmentierung und virtueller Speicher auf der x86 PM-Architektur

25616
jacks

Nun, dies mag eine häufige oder bereits gestellte Frage sein, aber nachdem ich verschiedene Bücher, Online-Tutorials und sogar hier auf SU durchsucht habe, bin ich immer noch verwirrt, wie diese vier Tiere auf einem x86-geschützten Modus zusammenarbeiten.

Was ist die korrekte Terminologie, die verwendet werden kann, wenn über diese Dinge diskutiert wird?

Soweit ich es verstehe, sind alle diese 4 Konzepte völlig verschieden, wurden aber miteinander in Verbindung gebracht, wenn wir über den Schutz des Gedächtnisses sprechen. Hier wurde es für mich versaut!

Ich werde zuerst mit dem Tauschen beginnen.

Tauschen:

Ein Prozess muss sich zur Ausführung im physischen Speicher befinden. Ein Prozess kann vorübergehend aus dem physischen Speicher in einen Sicherungsspeicher ausgelagert und dann zur weiteren Ausführung wieder in den Speicher gebracht werden.

Dies gilt insbesondere für Multitasking-Umgebungen, in denen mehrere Prozesse gleichzeitig ausgeführt werden sollen. Daher wird ein CPU-Scheduler implementiert, der entscheidet, welcher Prozess in den Hintergrundspeicher wechselt.

Paging: aka einfaches Paging:

Angenommen, ein Prozess hat alle Adressen, auf die er Zugriff hat, im Bereich von 0 bis 16 MB. Wir können es den logischen Adressraum des Prozesses nennen, da die Adressen vom Prozess generiert werden.

Beachten Sie, dass sich der logische Adressraum eines Prozesses von dem eines anderen Prozesses unterscheiden kann, da der Prozess größer oder kleiner sein kann.

Jetzt teilen wir diesen logischen Adressraum eines Prozesses in Blöcke gleicher Größe auf, die als Seiten bezeichnet werden . Teilen Sie auch den physischen Speicher in Blöcke fester Größe auf, die als Frames bezeichnet werden .

Von def. logische Adresse = Seite #: Offset auf dieser Seite

Wenn ein Prozess ausgewählt wird, um vom CPU-Scheduler ausgeführt zu werden, werden seine Seiten aus dem Sicherungsspeicher in alle verfügbaren Speicherframes geladen .

Beachten Sie, dass alle Seiten, die zu diesem Prozess gehören, in den Speicher geladen werden, bevor die Steuerung vom Scheduler an diesen Prozess übertragen wird. Wenn dieser Prozess in den Hintergrundspeicher ausgelagert werden soll, werden alle Seiten im Hintergrundspeicher gespeichert.

Der Hintergrundspeicher ist in Blöcke fester Größe unterteilt, die die gleiche Größe wie physische Speicherrahmen haben.

Dies erleichtert den Auslagerungsprozess, da wir eine Seite und keine Bytes austauschen. Dies verringert die Fragmentierung des Sicherungsspeichers, da für einige Bytes kein Platz gefunden werden muss. Stattdessen prüfen wir, ob der Platz für eine Seite verfügbar ist oder nicht.

Die Paging-Technik verringert auch die Fragmentierung des physischen Speichers, da wir eine Seite im Speicher behalten.

Der Hauptspeicher muss Platz für alle Seiten haben, die zu einem Prozess gehören, um diesen Prozess zur Ausführung in den Speicher zu laden. Wenn nur wenige Seiten dieses Prozesses Platz haben, müssen einige andere Prozesse (dh alle zu Prozess gehörenden Seiten) in den Sicherungsspeicher ausgelagert werden, und dann müssen nur alle Seiten des Prozesses, die ausgeführt werden sollen, in den Speicher geladen werden.

Daher liefert die Paging-Technik eine bessere Leistung als das einfache Austauschen.

Durch das Austauschen können wir also mehrere Prozesse ausführen, ohne zu viel Speicher zu kaufen. Stattdessen kann mit wenig Speicher gearbeitet werden (diese Menge muss so sein, dass alle Seiten des größten Programms / Prozesses, der auf einem PC ausgeführt werden soll) Sie können in den Arbeitsspeicher geladen werden - dh Sie müssen wissen, wie viel Speicher Ihr Programm benötigt, bevor Sie es ausführen.) plus einen zusätzlichen Sicherungsspeicher, in der Regel eine Festplatte, die sehr viel weniger Kosten für eine viel größere Kapazität als den Hauptspeicher verursacht.

So + Paging - Swapping ermöglicht die effiziente Verwaltung von Speichern, so dass mehrere Prozesse auf einem System ausgeführt werden können.

Demand-Paging:

Der in einem System installierte physische Speicher muss jedoch nicht den Anforderungen des Prozesses entsprechen. Es müssen auch mehrere Prozesse ausgeführt werden.

Die Lösung besteht darin, nur einige Seiten eines Prozesses in den Speicher zu laden. Wenn der Prozess auf eine Adresse in einer Seite zugreift, die sich nicht im Speicher befindet, wird ein Seitenfehler generiert und das Betriebssystem lädt diese Seite auf Anforderung, sodass der Prozess die Ausführung fortsetzen kann . Dies spart Zeit, um alle Seiten dieses Prozesses zu laden, bevor die Steuerung darauf übertragen wird - wie bei Paging + Swapping.

Diese Technik, bei der nur Teile eines Prozesses im Speicher verbleiben und auf einem Sicherungsspeicher, z. B. einer Platte, ruhen, wird als Bedarfs-Paging bezeichnet .

So verlangen-Paging = Paging + Swapping + nur einige Seiten halten (nicht alle) eines Prozesses im Speicher.


Hier geht es um Paging und Swapping, die ich kenne. Fühlen Sie sich bitte, um mich zu korrigieren. Irgendwo oben bin ich falsch.

Nun sind meine Fragen:

  1. Wie genau sich die Begriffe "virtueller Speicher" und "virtueller Adressraum" ("linearer Adressraum") mit Demand-Paging im Kontext des x86-geschützten Modus beziehen.

  2. Ist "virtueller Speicher eines Prozesses" ein korrekter Begriff oder ist virtueller Speicher für alle Prozesse definiert, die derzeit in einem Multitasking-System ausgeführt werden?

  3. Bin ich richtig in: virtueller Speicher, der einem Prozess zur Verfügung steht == höchste Adresse im virtuellen Adressraum (auch als linearer Adressraum bezeichnet) eines Prozesses + 1?

  4. Hier geht es um die Segmentierung: In einem x86-geschützten Modus wird uns gesagt, dass jeder Prozess einen virtuellen Adressraum von 4 GB (VAS) haben kann. Dies bedeutet, da die Segmentierung in der x86-Architektur vorhanden ist, können wir diesen VAS in zwei oder mehr Segmente unterteilen . Im x86-Flat-ModellIm VAS erstellen wir Segmente eines Prozesses, die sich alle genau überlappen, sodass die Segmentierung effektiv deaktiviert wird - es gibt keine Segmente. Wenn jedoch bei einer virtuellen Adresse in einem VAS eines Prozesses einige CPU-Anweisungen vorhanden sind, können diese Anweisungen möglicherweise überschrieben werden, während Speicher zugewiesen wird (in diesem VAS) oder wenn Variablen oder Arrays erstellt werden. Wie stellen wir sicher, dass dies nicht geschieht? Die Schutzbits im Deskriptor unterscheiden nicht zwischen den Regionen, da sich alle Segmente im flachen Modus überlappen. Dieses Bit kann nur das Lesen von Code oder das Ausführen von Daten verhindern, und dies auch nur, weil auf die Segmente über Selektoren zugegriffen wird.

  5. Oder ist es so, als würde jedes Segment als sein eigenes VAS behandelt. In diesem Fall wäre der gesamte virtuelle Speicher (oder der gesamte VAS), der einem Prozess in einem flachen Modus zur Verfügung steht, dann: " Anzahl der Segmente, die zu einem Prozess x virtuellen Speicher für ein einzelnes Segment gehören". Für einen x86-geschützten Modus würde dies zu 6 x 4 GB = 24 GB VAS führen! unter der Annahme von 6 Segmenten, die durch CS-, DS-, ES-, GS-, FS-, SS-Register angezeigt werden. Ist das richtig ?

  6. Wie kann eine Umgebung, die einfaches Paging (kein Demand-Paging), aber keinen virtuellen Speicher unterstützt, den Schutz verschiedener Segmente im Flat-Memory-Modell gewährleisten? Wir haben hier zwei Fälle - ein einzelnes Tasking-System und ein Multitasking-System.

UPDATE: am 2012-07-29

Also wenn ich es richtig verstehe:

Virtueller Speicher ist ein Konzept, das auf der x86-Architektur implementiert wird, indem die Demand-Paging-Technik + einige Schutzbits (speziell U-Bit und W-Bit) verwendet wird.

Bei IOWs wird der VAS eines Prozesses in Seiten unterteilt, die dann beim Demand-Paging verwendet werden.

Der Mechanismus des virtuellen Speichers hat in einer Multitasking-Umgebung grundsätzlich zwei Verwendungszwecke :

  1. Die Größe des Programms kann den verfügbaren physischen Speicher überschreiten. Das Betriebssystem behält die aktuell verwendeten Teile des Programms im Hauptspeicher und den Rest auf der Festplatte. Dies wird durch Bedarfs-Paging implementiert, wobei jede Seite ein zugehöriges "gegenwärtiges Bit" und "aufgegriffenes Bit" in ihrem Seitentabelleneintrag hat.

  2. Um einen Speicherschutz bereitzustellen, indem jedem Prozess ein eigener virtueller Adressraum zugewiesen wird, kann ein Prozess nicht auf den VAS eines anderen Prozesses zugreifen . Dies wird implementiert, indem jeder Seite einige Schutzbits zugeordnet werden . Insbesondere werden 'User / Supervisor-Bit - U-Bit', Lese- / Schreibbit W-Bit 'im Seitentabelleneintrag für den Seitenzugriffsschutz verwendet .

Virtueller Speicher ist sowohl für Single-Tasking-Systeme als auch für Multi-Tasking-Systeme nützlich . Für Single-Tasking-Systeme ist nur Use # 1 relevant.

Der Seitenzugriffsschutz hat zwei Aspekte : den Schutz der Berechtigungsstufe und den Schreibschutz . Diese werden durch U-Bit (für Prviledge) bzw. W-Bit (für Schreiben) implementiert. Diese Bits sind im Seitentabelleneintrag für diese Seite vorhanden.

Der Speicherschutz hat zwei Aspekte : den Schutz der Programme vor dem gegenseitigen Zugriff und den Schutz der Programme vor dem Überschreiben, falls sich Segmente in VAS dieses Prozesses / Programms überschneiden.

Jetzt wird das frühere Problem durch ein VAS- oder virtuelles Speicherkonzept gelöst, aber was ist mit dem letzteren ?

Das Schutzsystem für den Seitenzugriff verhindert letzteres meines Wissens nicht . IOWs, das virtuelle Speicherverfahren verhindert nicht, dass sich die Programme überschreiben, falls sich Segmente in VAS eines Prozesses überlappen.

Es scheint mir jedoch, dass selbst der Schutz auf Segmentebene das letztere (Überschreiben) des Speicherschutzes nicht verhindern kann.

Die x86-CPU wertet immer den Schutz auf Segmentebene aus, bevor die Schutzprüfung auf Seitenebene durchgeführt wird - unabhängig davon, ob es sich um ein flaches Modell oder ein Modell mit mehreren Segmenten handelt - da die Segmentierung auf x86-CPU nicht deaktiviert werden kann.

Betrachten Sie ein Szenario mit einem flachen Modell:

Betrachten Sie eine virtuelle Adresse, auf die von CS: off verwiesen wird. Jetzt bezieht sich DS: off auch auf dieselbe virtuelle Adresse wie von CS: off, wenn der Wert "off" in beiden Fällen genau derselbe ist. Dies gilt auch für SS: off.

Dies bedeutet auch, dass die Seite, in der diese virtuelle / lineare Adresse liegt, von der Paging-Einheit als eine Seite betrachtet wird, die der Segmentierung nicht bekannt ist.

Angenommen, alle Segmente eines Programms gehören im Flat-Modus zur gleichen Berechtigungsebene, z. B. Ring0.

Was passiert nun, wenn wir versuchen, Daten in CS zu schreiben oder auszuführen: off = DS: off = SS: off.

Angenommen, diese Adresse gehört nicht zu dem in VAS des Prozesses abgebildeten OS-Code. Bitte halten Sie das OS einfachheitshalber beiseite. Ich spreche vom Schutz auf Hardwareebene!

Erstens Schutzsegmentebene wird übergeben werden, dann werden die Berechtigungsstufe Prüfungen bestanden werden, während Zugriff auf diese Seite (die Seite mit CS: off oder DS: off oder SS: aus) als alle Segmente gehören gleiche Privileg hier, aber was W bit für diese Seite. Dieser Wert sollte auf 1 gesetzt werden, um Schreibvorgänge zu ermöglichen. Andernfalls kann ein Datensegment keine Schreibvorgänge auf seiner Seite ausführen. Das bedeutet also, dass diese Seite auch beschreibbar ist.

Das bedeutet, dass wir die Daten an dieser virtuellen (linearen) Adresse lesen / schreiben / ausführen können: CS: aus = DS: aus = SS: aus.

Ich verstehe nicht, wie x86-Hardware in diesem Fall Schutz bieten kann, wenn sich Segmente überschneiden.

4

1 Antwort auf die Frage

3
Dougvj

Okay, so zugegebenermaßen gab es viele Begriffe, die herumflogen und verwirrende Formulierungen liefen, aber ich werde mein Bestes geben, um zu antworten. Soweit ich das beurteilen konnte, sind Sie in den meisten Fällen Ihres Verständnisses richtig, aber es gibt einige Punkte, die zu besprechen sind.

Es ist wichtig zu verstehen, wie Paging und virtueller Speicher in einem Hardwarekontext funktionieren. Paging wäre ohne Hardwareunterstützung unpraktisch, da die Prozesse in Bezug auf die Anordnung des Speichers agnostisch sein müssen und das Betriebssystem keine Software verwenden muss, um jeden Prozess auf dem System zu babysitten. An dieser Stelle kommt die Memory Management Unit (MMU) ins Spiel. Diese Einheit ist vom Betriebssystem so programmiert, dass sie Seiten in einem virtuellen Adressraum anordnet und vom Betriebssystem nach Belieben gesteuert werden kann. Das Betriebssystem kann dem Gerät mitteilen, welche Seiten sich tatsächlich im physischen RAM befinden und welche Seiten noch nicht geladen oder ausgelagert sind.

Wie können wir also verhindern, dass Programme mit dieser Speicherverwaltung herumspielen? Etwas, das wir Schutz nennen. Wir können Prozesse im Sandkasten halten, so dass sie das Betriebssystem und andere Prozesse nicht stören. Die Verwirrung darüber, warum all diese Begriffe zusammengeworfen werden, rührt von der Tatsache her, dass sie tatsächlich miteinander verbunden sind. Die Privilegien, die dieser Code hat, werden in der Seitentabelle angegeben. Die Seitentabelle gibt der MMU an, wie ein virtueller Raum angelegt ist, und teilt der MMU mit, ob eine Seite vorhanden ist. A) Vorhanden B) Lese- / Schreibzugriff C) Code ausführen darf und D) auf welcher Berechtigungsstufe (Ring) der Code aktiviert ist die besagte Seite kann ausgeführt werden.

Wenn der Scheduler einen Prozess plant, wird die Seitentabelle nicht neu erstellt, und es muss kein neuer Speicher eingerichtet werden. Das Betriebssystem fordert die MMU lediglich an, eine andere Seitentabelle zu verwenden, die ein O (1) -Prozess ist, oder anders ausgedrückt: nicht abhängig von der Größe des Prozesses oder von dem verwendeten Speicher. Ganze Prozesse werden selten gleichzeitig auf einmal aus dem Arbeitsspeicher ausgelagert, meist sind es nur Seiten auf einmal, daher wird der Begriff "Auslagern" häufig als "Auslagern der Seiten" bezeichnet.

Okay, vor diesem Hintergrund werde ich versuchen, jede Ihrer Fragen zu beantworten:

  1. Linearer Adressraum bedeutet einfach, dass Sie auf Dinge von 0 bis 2 ^ 32 zugreifen können. Keine Notwendigkeit für ausgefallene Segmentierung, wie es zu Zeiten von 16-Bit-Prozessoren erforderlich war. Virtueller Speicher bedeutet einfach, dass der lineare Adressraum eines Prozesses nicht durch den Hauptspeicher, sondern durch das Betriebssystem definiert wird. Dies bedeutet, dass das Betriebssystem Seiten in diesem Adressraum beliebig anordnen kann, wobei es sich auf einem hohen Niveau befindet und der Prozess auf einem niedrigeres Niveau zum Beispiel. Zusätzlich kann der Prozessor festlegen, auf welche Teile dieses virtuellen Adressraums mit welchen Berechtigungen zugegriffen werden kann. Das Betriebssystem (Kernel) wird in jeden virtuellen Adressraum geladen, so dass die Prozesse Systemaufrufe durchführen können und ein Platz zum Ablegen vorhanden ist, wenn sie vorzeitig gelöscht werden. Sie können jedoch nicht in diesen Bereich lesen oder schreiben, da dies vom Betriebssystem als "privilegierter Code" gekennzeichnet ist. Demand Paging bedeutet einfach, dass der Prozess erwartet, dass bestimmte Teile dieses virtuellen Adressraums einen bestimmten Inhalt haben (vielleicht eine Datei oder sogar Teile von sich selbst), aber es ist nicht wirklich vorhanden. Das Betriebssystem hat den Bereich in der Seitentabelle als "nicht vorhanden" markiert . Wenn der Prozess schließlich auf diesen Bereich zugreift, weil er nicht vorhanden ist, löst die CPU einen Fehler aus, der vom Betriebssystem eingefangen wird. Das Betriebssystem ist dann intelligent genug, um diese Seite zu laden und den Prozess dort fortzusetzen, wo er aufgehört hat. Das Ergebnis ist, dass der Prozess den Schluckauf nicht einmal wahrnimmt und die Dinge nur bei Bedarf geladen werden, um Speicherplatz zu sparen. Demand Paging bedeutet einfach, dass der Prozess erwartet, dass bestimmte Teile dieses virtuellen Adressraums einen bestimmten Inhalt haben (vielleicht eine Datei oder sogar Teile von sich selbst), aber es ist nicht wirklich vorhanden. Das Betriebssystem hat den Bereich in der Seitentabelle als "nicht vorhanden" markiert . Wenn der Prozess schließlich auf diesen Bereich zugreift, weil er nicht vorhanden ist, löst die CPU einen Fehler aus, der vom Betriebssystem eingefangen wird. Das Betriebssystem ist dann intelligent genug, um diese Seite zu laden und den Prozess dort fortzusetzen, wo er aufgehört hat. Das Ergebnis ist, dass der Prozess den Schluckauf nicht einmal wahrnimmt und die Dinge nur bei Bedarf geladen werden, um Speicherplatz zu sparen. Da es nicht vorhanden ist, löst die CPU einen Fehler aus, der vom Betriebssystem eingefangen wird. Das Betriebssystem ist dann intelligent genug, um diese Seite zu laden und den Prozess dort fortzusetzen, wo er aufgehört hat. Das Ergebnis ist, dass der Prozess den Schluckauf nicht einmal wahrnimmt und die Dinge nur bei Bedarf geladen werden, um Speicherplatz zu sparen. Da es nicht vorhanden ist, löst die CPU einen Fehler aus, der vom Betriebssystem eingefangen wird. Das Betriebssystem ist dann intelligent genug, um diese Seite zu laden und den Prozess dort fortzusetzen, wo er aufgehört hat. Das Ergebnis ist, dass der Prozess den Schluckauf nicht einmal wahrnimmt und die Dinge nur bei Bedarf geladen werden, um Speicherplatz zu sparen.

  2. Virtueller Speicher ist der Name dieses gesamten Mechanismus zum Festlegen von Seitentabellen und ihres Schutzes sowie der Seiten, die möglicherweise auf einem anderen Medium wie einer Festplatte liegen und daher Paging sind. Virtueller Speicher ist wahrscheinlich der Oberbegriff für Ihren Titel, mit Ausnahme der Segmentierung. Wenn ich mich auf einen bestimmten Prozess beziehe, würde ich persönlich etwas wie "Virtueller Adressraum eines Prozesses" verwenden, da sich dieser eindeutig auf das virtuelle Speicherlayout eines bestimmten Prozesses bezieht.

  3. Nein. Wie bereits erwähnt, kann das Betriebssystem realen Speicher beliebig im virtuellen Adressraum eines Prozesses zuordnen. Dies bedeutet, dass es beispielsweise zu einer Situation kommen kann, in der sich der Prozesscode an der Adresse 0x0 befindet, der Heapspeicher (absteigend) jedoch bei 0xFFFFFFF beginnt und auf der anderen Seite des Adressraums gelöscht wird. Es kann tatsächlich Einschränkungen hinsichtlich der Zuordnung von Dingen geben, da Gerätetreiber bestimmte Adressbereiche für die Hardware benötigen. Für das Verständnis des virtuellen Speichers besteht jedoch keine Einschränkung.

  4. Segmentierung ist einfach ein Adressierungsschema. Im 286 wurde er auch als Mechanismus zum Implementieren des Schutzes verwendet. Dies erwies sich jedoch als zu unflexibel. Daher wird der Schutz bei 32-Bit-Prozessoren immer mit Paging ausgeführt (obwohl ich weiß, werden die 286-Schutzschemata beim Paging beibehalten.) ist behindert). Da der Schutz durch den Paging-Mechanismus definiert wird, besteht bei der Segmentierung kein größeres oder geringeres Risiko für das Überschreiben von Daten als bei einem flachen Speichermodus. Bei den meisten ausführbaren Dateiformaten ist das Codesegment klar vom Datensegment getrennt. Da wir davon ausgehen können, dass sich der Code niemals ändert, kennzeichnet das Betriebssystem die Seiten des Codesegments im Allgemeinen als schreibgeschützt. Daher führt jeder Versuch, in den Code zu schreiben, zu einem Fehler, und das Programm wird beendet. Dies wird niemals der Fall sein, wenn in einem modernen Betriebssystem alle Variablen und Arrays über den Stack oder Heap zugewiesen werden. Wenn das Programm jedoch außerhalb davon startet, stürzt es ab, bevor es möglich ist, Code zu überschreiben. Ein größeres Risiko (und eines, das früher ein großes Problem war) besteht darin, dass Ihr Stapel in einem Pufferüberschuss überschrieben wird. Einige könnten dies ausnutzen, um Code auf den Stapel zu setzen und ihn dann unberechtigt auszuführen. Als Fix wurde ein neues Bit in das NX-Bit (No Execute) der Seitentabelle eingefügt. Dies verhindert, dass eine Seite jemals ausgeführt wird. Einige könnten dies ausnutzen, um Code auf den Stapel zu setzen und ihn dann unberechtigt auszuführen. Als Fix wurde ein neues Bit in das NX-Bit (No Execute) der Seitentabelle eingefügt. Dies verhindert, dass eine Seite jemals ausgeführt wird. Einige könnten dies ausnutzen, um Code auf den Stapel zu setzen und ihn dann unberechtigt auszuführen. Als Fix wurde ein neues Bit in das NX-Bit (No Execute) der Seitentabelle eingefügt. Dies verhindert, dass eine Seite jemals ausgeführt wird.

  5. Das stimmt überhaupt nicht. Die Segmente fungieren einfach als Zeiger auf einen Bereich (Segment) des ursprünglichen 2 ^ 32 Bytes des Adressraums. Die Idee dahinter war ursprünglich, dass die Zeiger klein bleiben würden, da in diesem Segment ein Segmentzeiger und ein Zeiger vorhanden sein könnten, der kleiner als der gesamte Adressraum war. In 286 (einem 16-Bit-Prozessor) war es beispielsweise sinnvoll, Zeiger auf 16-Bit zu halten, was jedoch ein Problem darstellte, da der 286 2 · 24 Bytes Speicher adressieren konnte. Die Lösung? Verwenden Sie die Segmentierung. Ein Segment könnte 2 ^ 16 Bytes groß sein und sie könnten irgendwo in den Adressraum zeigen. Wenn Code ausgeführt werden musste, wurden dann 16-Bit-Zeiger nur für dieses Segment verwendet. Dies war schneller und effizienter. Als 32-Bit-Prozessoren herauskamen, war dieser Mechanismus nicht mehr erforderlich. Aber da es von Code früher so häufig verwendet wurde und Programmierer an sie gewöhnt waren, wurde die Segmentierung beibehalten. Neuere 64-Bit-Prozessoren verwenden überhaupt keine Segmentierung.

  6. Verwirrung ist hier die Tatsache, dass virtueller Speicher für viele dieser unterschiedlichen Mechanismen steht. Virtueller Speicher ist für Multitasking erforderlich, um einen Prozess vor dem Adressraum eines anderen Prozesses zu schützen. Paging und preemptives Multitasking durch Erweiterung ist nur mit virtuellen Arbeitsspeicherfunktionen möglich. Viele dieser Funktionen können jedoch effektiv deaktiviert werden. Vielleicht möchten Sie keine Adressübersetzung? Dann ordnen Sie jede Seite sich selbst zu. Vielleicht möchten Sie keinen Speicherschutz, sondern eine Adressübersetzung? Geben Sie dann jeder Seite alle Privilegien. In DOS und anderen Einzelprozessorsystemen tritt eine Verwirrung auf, wenn auf den "geschützten Modus" Bezug genommen wird. Normalerweise bezieht sich dies auf den 32-Bit-Modus und nicht auf den 16-Bit-Realmodus. Daher bedeutet dies trotz des Namens nicht unbedingt, dass der Schutz verwendet wird, nur dass in diesem Modus er aktiviert werden kann. Es gibt wahrscheinlich viele Einzelprozesssysteme, die in diesem "geschützten Modus" ausgeführt werden, jedoch keinen virtuellen Speicher oder Schutz verwenden. Die ursprüngliche Xbox ist ein gutes Beispiel dafür. Wenn alle diese Funktionen deaktiviert sind, kann es zu einer geringfügigen Leistungssteigerung kommen. Unter DOS kann es jedoch immer noch vorteilhaft sein, viele dieser Funktionen zu verwenden. Am bemerkenswertesten ist das Austauschen von Seiten, da in den frühen Tagen, als DOS allgegenwärtig war, RAM nur schwer zu finden war und daher jeder Mechanismus, der im RAM gespeichert wurde, begrüßt und gut genutzt wurde. Der Schutz hatte auch bei Einzelprozesssystemen seine Vorteile, da er verhindern konnte, dass das Programm auf hässliche Weise abstürzte, ein besseres Debugging möglich war und eine Datenbeschädigung aufgrund eines schlechten Hardwarezugriffs verhindert wurde. Verwenden Sie jedoch keinen virtuellen Speicher oder Schutz. Die ursprüngliche Xbox ist ein gutes Beispiel dafür. Wenn alle diese Funktionen deaktiviert sind, kann es zu einer geringfügigen Leistungssteigerung kommen. Unter DOS kann es jedoch immer noch vorteilhaft sein, viele dieser Funktionen zu verwenden. Am bemerkenswertesten ist das Austauschen von Seiten, da in den frühen Tagen, als DOS allgegenwärtig war, RAM nur schwer zu finden war und daher jeder Mechanismus, der im RAM gespeichert wurde, begrüßt und gut genutzt wurde. Der Schutz hatte auch bei Einzelprozesssystemen seine Vorteile, da er verhindern konnte, dass das Programm auf hässliche Weise abstürzte, ein besseres Debugging möglich war und eine Datenbeschädigung aufgrund eines schlechten Hardwarezugriffs verhindert wurde. Verwenden Sie jedoch keinen virtuellen Speicher oder Schutz. Die ursprüngliche Xbox ist ein gutes Beispiel dafür. Wenn alle diese Funktionen deaktiviert sind, kann es zu einer geringfügigen Leistungssteigerung kommen. Unter DOS kann es jedoch immer noch vorteilhaft sein, viele dieser Funktionen zu verwenden. Am bemerkenswertesten ist das Austauschen von Seiten, da in den frühen Tagen, als DOS allgegenwärtig war, RAM nur schwer zu finden war und daher jeder Mechanismus, der im RAM gespeichert wurde, begrüßt und gut genutzt wurde. Der Schutz hatte auch bei Einzelprozesssystemen seine Vorteile, da er verhindern konnte, dass das Programm auf hässliche Weise abstürzte, ein besseres Debugging möglich war und eine Datenbeschädigung aufgrund eines schlechten Hardwarezugriffs verhindert wurde. Unter DOS kann es dennoch vorteilhaft sein, viele dieser Funktionen zu verwenden. Am bemerkenswertesten ist das Austauschen von Seiten, da in den frühen Tagen, als DOS allgegenwärtig war, RAM nur schwer zu finden war und daher jeder Mechanismus, der im RAM gespeichert wurde, begrüßt und gut genutzt wurde. Der Schutz hatte auch bei Einzelprozesssystemen seine Vorteile, da er verhindern konnte, dass das Programm auf hässliche Weise abstürzte, ein besseres Debugging möglich war und eine Datenbeschädigung aufgrund eines schlechten Hardwarezugriffs verhindert wurde. Unter DOS kann es dennoch vorteilhaft sein, viele dieser Funktionen zu verwenden. Am bemerkenswertesten ist das Austauschen von Seiten, da in den frühen Tagen, als DOS allgegenwärtig war, RAM nur schwer zu finden war und daher jeder Mechanismus, der im RAM gespeichert wurde, begrüßt und gut genutzt wurde. Der Schutz hatte auch bei Einzelprozesssystemen seine Vorteile, da er verhindern konnte, dass das Programm auf hässliche Weise abstürzte, ein besseres Debugging möglich war und eine Datenbeschädigung aufgrund eines schlechten Hardwarezugriffs verhindert wurde.

Ich hoffe, das beantwortet deine Frage.

Okay, es wird klarer. :) Aber ich habe keine Antwort auf meine Fragen # 4 und 6 erhalten. Zu Frage 4 siehe mein Update am 2012-07-29. Was Q # 6 betrifft, fragte ich es, weil einige [DPMI] -Umgebungen (die in Anwendungen von ring0 laufen und die selbst unter reinem DOS laufen) don ' t unterstützt virtuellen Speicher, aber Paging. Ich habe nicht verstanden, wie nützlich Paging in einem solchen Fall ist, insbesondere wenn eine Single-Tasking-Umgebung, z. B. DOS, auf dem System vorhanden ist. jacks vor 11 Jahren 0
@jacks Ich habe die Antwort geändert, um diese Fragen besser beantworten zu können. Die kurze Version lautet: Das Überschreiben von Code wird verhindert, indem die Codepages nur gelesen werden. DPMI bedeutet nicht immer, dass Schutz oder Paging aktiviert ist. Manchmal müssen jedoch Speicherplatz gespart und ein Absturz verhindert werden. Dougvj vor 11 Jahren 0
Das heißt, ohne * Implementierung von * virtuellem Speicher ist Paging nutzlos. Ist es nicht In Bezug auf * "x86-Hardware kann in diesem Fall bei überlappenden Segmenten Schutz bieten" *, es scheint, dass keine Betriebssystemunterstützung vorliegt, dh, wir führen unser Programm in ring0 ohne Betriebssystem aus, dh unsere Anwendung ist also eine Kernel-ähnliche App Es gibt * nichts * in x86-Hardware, das uns daran hindern kann, * Daten auszuführen * und * in das Codesegment zu schreiben. Es ist das Betriebssystem, das zusammen mit der Unterstützung von x86-Hardware verhindert, dass dies passiert. Habe ich recht? jacks vor 11 Jahren 0
Das ist richtig, auch wenn unsere ring0-App wie das Betriebssystem fungieren und die richtigen Schutzmechanismen einrichten könnte, um dies zu verhindern, wäre sie wirklich nur beim Debugging und nicht bei der eigentlichen Sicherheit nützlich. Das Auslagern von Seiten wäre nützlich, um Speicher zu sparen, aber die Implementierung für eine einzelne App ist nicht unproblematisch. Dougvj vor 11 Jahren 0
Ich habs. :) Ich werde mehr zu diesem Thema recherchieren und sehen, ob es etwas gibt, das mich verwirren könnte. jacks vor 11 Jahren 0