Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Projekt: OS-Development  ::  Wie funktioniert die virtuelle Addressvergabe bei heutigen Systemen  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
MemoryManagment
Unregistrierter




Beitrag MemoryManagment Unregistrierter 17:06:57 16.08.2014   Titel:   Wie funktioniert die virtuelle Addressvergabe bei heutigen Systemen            Zitieren

Hallo C++.de Community,
zuallerest meine Frage ist keine direkte Frage zur Entwicklung von Betriebssystem Funktionen,sondern sie bezieht sich auf die Funktionsweiße von heutigen Betriebssystemen ich dachte mir allerdings hier ist der richtige Platz dafür.



Ich verstehe leider auch nach X Wikipedia Artikeln zum Speichermanagment eines Betriebssystem nicht wie die Addressen einem Prozess zugeteilt.
So habe ich es verstanden (kurzfassung):
Heute ist es ja normal,dass ein Prozess bei jedem Start einen bestimmten virtuellen Addressberreich zugeteilt bekommt (welcher sich auch nach jedem neustart des Prozesses auch ändert).Eine virtuelle Addresse besteht aus der BasisAdresse (Start des Adressraums eines Prozesses)
und einem Offset welches auch jedes mal anders lautet.In der MMU wird dann eine virtuelle Adresse mittels einer Datenbank(Tabelle) in den physichen Speicherberreich umgewandelt welcher zu, Zugriff auf die Hardware genutzt werden kann.Die logischen(virtuellen) Adressen liegen wie gesagt immer in einem zussammenhängenden Berreich und der Prozess kann deshalb auch nur auf seinen eigenen logischen Adressberreich zugreifen.Der physische Speicherberreich einer logischen Adresse kann dagegen weit von den anderen logischen Adressen entfernt liegen.


Frage:
Wenn ich nun aber ein C++ Programm compile müssen doch nach meinem verständniss die virtuellen Adressen für meine Variablen schon feststehen wie sollte mein Programm sonst wissen wohin gesprungen werden soll,oder wo eine Variable liegt.
Wieso kann das Betriebssystem meinem Prozess dann (immer verschiedene)logische Adressen zuordnen es müssten ja irgendwie die alten Adressen welche zur compile Zeit festgelegt wurden ausgetauscht werden.

Ich würde mich echt freuen,wenn mir hier jemand eine Antwort darauf geben könnte wahrscheinlich werde ich einfach irgendwo ein grundsätzliches Verständnissproblem haben ,deshalb habe ich oben nochmal extra in der kurzfassung geschrieben wie ich das vorgehen aktueller Betriebssysteme verstanden habe.
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28256
Beitrag SeppJ Global Moderator 17:34:55 16.08.2014   Titel:              Zitieren

Du kannst Adressen auch relativ angeben. Das dürfte alles beantworten, oder? Programmcode, der erst zur Laufzeit nachgeladen wird (dll, ld) muss schon seit jeher damit zurecht kommen, von beliebiger Stelle aus ausgeführt zu werden.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.


Zuletzt bearbeitet von SeppJ am 17:37:49 16.08.2014, insgesamt 1-mal bearbeitet
MemoryManagment
Unregistrierter




Beitrag MemoryManagment Unregistrierter 18:01:39 16.08.2014   Titel:              Zitieren

Ist damit gemeint,dass im fertig kompilierten Programm immernoch einfach nur der Name der Variablen steht und das OS ordnet den Namen dann erst beim Start des Programms die logischen Adressen zu,oder was ist mit relativ gemeint?
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28256
Beitrag SeppJ Global Moderator 18:17:25 16.08.2014   Titel:              Zitieren

MemoryManagment schrieb:
Ist damit gemeint,dass im fertig kompilierten Programm immernoch einfach nur der Name der Variablen steht und das OS ordnet den Namen dann erst beim Start des Programms die logischen Adressen zu,oder was ist mit relativ gemeint?
Nein, überhaupt gar nicht. Du scheinst eine völlig falsche Vorstellung zu haben, wie ein Maschinensprachenprogramm funktioniert. Variablen existieren gar nicht mehr und erst recht nicht ihre Namen. Ich denke nicht, dass ich das im Rahmen eines Forenbeitrags erklären kann, außer mit Phrasen wie "alles, an was du glaubst, ist eine Lüge" oder "vergessen du musst, was früher du gelernt hast". Es macht auch nicht viel Sinn, eine Antwort auf deine erste Frage zu versuchen, du würdest sie nicht verstehen.

Lern mal die Grundlagen von Assembler (ist so nah an der Maschinensprache, dass man von einer 1:1 Übersetzung reden kann, bloß eben für Menschen lesbar), egal für welche Maschine. Dann guck dir vielleicht mal an, was dein Compiler aus einem einfachen Testprogramm macht (viele Compiler können Assembler als Zwischenschritt ausgeben oder zur Not übersetzt man das fertige Programm zurück). Dann bist du so weit, dass du eine Antwort verstehen würdest. Aber höchstwahrscheinlich hat sich die Frage dann ganz von selbst erledigt, denn die Antwort ist (mit diesem Hintergrundwissen) unmittelbar offensichtlich.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
MemoryManagment
Unregistrierter




Beitrag MemoryManagment Unregistrierter 18:31:32 16.08.2014   Titel:              Zitieren

Hast du denn eine Empfehlung für Assembly Lektüre?
Das ein Name selbst nichtmehr existiert ist klar der der würde natürlich nach dem Compilen nurnoch aus einer Bitcodierung bestehen,das OS könnte dieses Bitmuster dann aber auch wieder interpretieren das Meinte ich damit,dass in Binärcode keine Namen stehen ist mir bewusst :D das war etwas unglücklich formuliert.

Ich würde das jetzt aber schon gerne verstehen,weil mich diese Frage schon eine ganze weile plagt.
Was steht im kompilierten Quellcode (in Assembler ausgedrückt) wird einfach jeder Variablen beim Compilen ein Offset vergeben und beim start wird dieses Offset auch die Base des Prozesses addiert um die logische Adresse zu erhalten,oder wie?
Ich verstehe eben nur nicht was du in diesem Zusammenhang mit relativ meinst.
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28256
Beitrag SeppJ Global Moderator 18:42:20 16.08.2014   Titel:              Zitieren

MemoryManagment schrieb:
Hast du denn eine Empfehlung für Assembly Lektüre?
Leider nein, hab das selber in der Schule gelernt.
Zitat:

Das ein Name selbst nichtmehr existiert ist klar der der würde natürlich nach dem Compilen nurnoch aus einer Bitcodierung bestehen,das OS könnte dieses Bitmuster dann aber auch wieder interpretieren das Meinte ich damit,dass in Binärcode keine Namen stehen ist mir bewusst :D das war etwas unglücklich formuliert.
Auch das ist eine völlig falsche Vorstellung. Es gibt keine Variablen. Variablen sind Elemente von Hochsprachen, damit Menschen einfacher Programme schreiben können.


Zitat:
Ich würde das jetzt aber schon gerne verstehen,weil mich diese Frage schon eine ganze weile plagt.
Ich kann leider nicht den komplizierteren Fall (nicht, dass es wirklich kompliziert wäre, bloß komplizierter) erklären, wenn dir nicht einmal im Ansatz klar ist, was der Normalfall ist.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.


Zuletzt bearbeitet von SeppJ am 18:53:02 16.08.2014, insgesamt 1-mal bearbeitet
MemoryManagment
Unregistrierter




Beitrag MemoryManagment Unregistrierter 18:55:18 16.08.2014   Titel:              Zitieren

SeppJ schrieb:
Auch das ist eine völlig falsche Vorstellung. Es gibt keine Variablen. Variablen sind Elemente von Hochsprachen, damit Menschen einfacher Programme schreiben können.



Ist mir bewusst mit einer Definition einer Variablen gibt man dem Rechner nur an lege X bit/Byte in einen Speicherberreich an und Adressiere mir diesen.
Wie die Bits/Bytes später interpretiert werden sollen hängt vom Programmierer ab das bestimmt er mit dem Typ einer Variablen....

Könntest du mir nicht einfach ein kurzes Beispiel geben,oder erläutern was du mit relativer Adressangabe meintest.
Wenn ich es nicht verstehen sollte Ok dann lass ich das Thema halt erstmal links liegen,aber im moment interessiert mich das schon sehr.
MemoryManagment
Unregistrierter




Beitrag MemoryManagment Unregistrierter 19:12:48 16.08.2014   Titel:              Zitieren

Ergänzung des vorigen posts:
Bei der Definition legt man natürlich nichts an hatte ich wieder blöd ausgedrückt ,sondern man reserviert den Speicherberreich.Bei der Initialisierung wird ein bestimmtes Bitmuster erzeugt welches dann in diesen Speicherberreich geschrieben wird.(Nur damit ich nicht falsch verstanden werde).
Ich weiß ich drücke mich manchmal sehr unglücklich aus,aber nur zu schreiben alles was du denkst ist falsch ohne jede Erklärung hilft mit leider wenig weiter(No Offense :D ).
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28256
Beitrag SeppJ Global Moderator 19:49:34 16.08.2014   Titel:              Zitieren

MemoryManagment schrieb:

Ist mir bewusst mit einer Definition einer Variablen gibt man dem Rechner nur an lege X bit/Byte in einen Speicherberreich an und Adressiere mir diesen.
Wie die Bits/Bytes später interpretiert werden sollen hängt vom Programmierer ab das bestimmt er mit dem Typ einer Variablen....
Eben auch nicht. Vielleicht in absichtlich unoptimierten Code, damit ein Debugger noch irgendwie einen Zusammenhang zwischen Speicherbereichen und Variablen im Quellcode herstellen kann.


Zitat:
Könntest du mir nicht einfach ein kurzes Beispiel geben,oder erläutern was du mit relativer Adressangabe meintest.
Na, relativ eben. Anstatt zu sagen "nimm den Wert an Adresse XYZ", sagt man "nimm den Wert an Stackpointer - 16". Und dieses "Anlegen" von Variablen ist dann das Verschieben des Stackpointers an eine andere Stelle, so dass vor dem Stackpointer genug Platz ist für die Variablen, die eine Funktion braucht. Und wenn die Funktion fertig ist, dann setzt sie den Zeiger wieder da hin, wo er vorher war, so dass die Funktion, aus der die erste Funktion her aufgerufen wurde, von all dem überhaupt gar nichts mitbekommt und ganz normal mit ihren "Variablen" weiter arbeiten kann.

Obiges ist, wie lokale Variablen funktionieren. Wenn du das verstanden hast, dann bist du schon viel weiter. Guck mal hier:
http://en.wikipedia.org/wiki/Call_stack

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
MemoryManagment
Unregistrierter




Beitrag MemoryManagment Unregistrierter 20:19:05 16.08.2014   Titel:              Zitieren

Danke für deine Erklärung das war jetzt auch verständlich für mich.
Wenn der Prozess gestartet wird wird der StackPointer auf die erste Adresse gesetzt. Der Compiler wandelt beim Aufruf einer lokalen Variablen diese einfach um in (Adresse1+X) um.Das geht,weil die logischen Adressen in einem zusammenhängenden Speicherberreich liegen.Die Base wird ja eh immer vom Os bestimmt.Jetzt verstehe ich denke ich auch was mit relativ gemeint war in C++ kann man ja ebenfalls:
C++:
int arr[10];
int* p_arr=arr;
*p_arr+5=10;

schreiben.
C++ Forum :: Projekt: OS-Development  ::  Wie funktioniert die virtuelle Addressvergabe bei heutigen Systemen  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.