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:
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.
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.
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.
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.
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.
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.