Virtuelle Speicherkonzepte

Ich bin verwirrt über einige Themen in Bezug auf den virtuellen Speicher. Also werde ich sie auflisten und Fragen stellen. Bei der Beantwortung ziehe ich es vor, wenn Sie auch eine Quelle angeben, aus der ich diesen Zweifel klären kann. Ich werde mit Bezug auf eine ausführbare Linux-Elf-Datei sprechen.

Ich habe gehört, dass jeder Prozess den Adressraum von 4 GB in einem 32-Bit-System hat. Als ich das objdump einer meiner ausführbaren relocatable Akte überprüfte, sah ich, dass es Begrenzungen von 00000000 zu ffffffff hatte. Es enthielt auch den Kernelraum. Dies ist der Adressraum der Datei.Ist das die virtuelle Erinnerung, über die wir sprechen? Wenn ja, dann hatte ich gelesen, dass der virtuelle Speichermechanismus das Ausführen von Prozessen mit sehr großen Größen ermöglicht und diese Prozessgröße nicht durch die Hauptspeichergröße begrenzt ist (wir können die erforderlichen Seiten nach Bedarf in den Hauptspeicher bringen).Wenn der virtuelle Speicher nur 4 GB groß ist, ist die maximale Größe von Programmen dann nicht auf 4 GB begrenzt? Außerdem überprüfte ich das objdump einer anderen Datei und es hatte die gleiche Adresse (d. H. 00000000 zu ffffffff).Also, was bedeutet das? Bedeutet das, dass unsere Datei eine Art verschiebbare Datei ist, zu der erneut Startadressen hinzugefügt werden(obwohl dies absurd erscheint, weil es sich bereits um eine ausführbare verschiebbare Objektdatei handelt).

Ich hatte gelesen, dass in einem Speicher, in dem die Segmentierung implementiert wurde, die CPU eine virtuelle (logische) Adresse erzeugt. Diese Adresse besteht aus drei Teilen - dem Segment, dem Offset innerhalb des Segments. Außerdem sind die Segmente, über die hier gesprochen wird, Code, Daten, Stapel usw.

Im Prozessadressraum befinden sich diese Segmente ab bestimmten Positionen. Also, was ist der Inhalt der virtuellen Adresse der CPU?Liegt die erzeugte virtuelle Adresse zwischen 00000000 und ffffffff? Wenn ja dannist der Vorgang des Zugriffs auf den Inhalt unter der virtuellen Adresse, der folgende:

The segment part is looked up in the segment descriptor table to find the segment's
starting address in linear address space. Then the offset is indexed within the segment and
the resulting address is the linear address. Then, we look up the page table and map the
address to physical address. If the page is not currently in the main memory, it is 
brought. 

Dies ergibt sich wiederum aus der Tatsache, dass kein Prozess zu irgendeinem Zeitpunkt vollständig im Hauptspeicher sein kann, da dann der gesamte Speicher von nur einem Prozess belegt wird(Da der Adressraum des Prozesses selbst 4GB ist).

Wenn alle Prozesse über einen Adressraum von 00000000 bis ffffffff verfügen und gleichzeitig mehrere Prozesse im Hauptspeicher vorhanden sein können, ist dies auch möglichAlle Prozesse sollten über eine eigene Segmentdeskriptortabelle verfügen, die die Adresse des Segments im linearen Adressraum zurückgibt

Ich habe gelesen, dass das Betriebssystem beim Hochfahren in den Hauptspeicher geladen wird. DannWas ist der Unterschied zwischen diesem Betriebssystem und dem Kernel-Code im Kernel-Space eines bestimmten Prozesses? Verfügen alle Prozesse über eine eigene Kopie des Kernel-Codes in ihrem Kernel-Space?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage