2016-06-23 13 views
-1

Ich versuche, ein paar Konzepte zu versöhnen.Hat ein Compiler bei der Speichererstellung den Kernel-Speicherplatz berücksichtigt?

Ich weiß, dass virtueller Speicher zwischen dem Kernel und allen Benutzerprozessen, die ich gelesen habe here freigegeben (zugeordnet). Ich weiß auch, dass der Kernel, wenn der Compiler Adressen für Code + Daten generiert, diese an den richtigen virtuellen Adressen für diesen Prozess laden muss.

Um den Umfang der Frage zu beschränken, ich meine nur gcc, wenn ich "den Compiler" erwähne. Muss der Compiler also mit jeder neuen Version eines Betriebssystems kompatibel sein, um Code oder Daten nicht an die für den Kernel reservierten hohen Speicheradressen zu legen? Wie in, muss jemand, der diesen Teil des Compilers schreibt, die Details wissen, wie der Kernel plant, das Programm zu laden (damit der Compiler keinen ausführbaren Code in den Speicher legt)?

Oder verwirre ich verschiedene Konzepte? Ich bin etwas verwirrt, als ich durch this tutorial ging, besonders ganz unten, wo es OS-Code in niedrigen Speicheradressen hat, weil ich dachte, dass Linux hohen Speicher für den Kernel verwendet.

Antwort

1

Der Compiler bestimmt nicht die Adressbereiche im Speicher, in denen Dinge platziert werden. Das wird vom Betriebssystem gehandhabt.

Wenn das Programm zum ersten Mal ausgeführt wird, speichert der Loader die verschiedenen Teile des Programms und seiner Bibliotheken im Speicher. Bei Speicher, der dynamisch zugewiesen wird, werden große Blöcke vom Betriebssystem zugewiesen und dann manchmal in kleinere Blöcke aufgeteilt.

Der OS-Lader weiß, wo er die Dinge laden soll. Und die virtuelle Speicherzuweisungslogik des Betriebssystems, um sichere, leere Räume in dem Adressraum zu finden, den der Prozess verwendet.

Ich bin mir nicht sicher, was Sie mit den "hohen Speicheradressen für den Kernel reserviert" meinen. Wenn Sie von einer 2G/2G- oder 3G/1G-Aufteilung auf einem 32-Bit-Betriebssystem sprechen, ist dies ein grundlegendes Designelement der Betriebssysteme, die es verwenden. Es ändert sich nicht mit Versionen.

Wenn Sie über hohen physischen Speicher sprechen, dann nein. Compiler kümmern sich nicht um physischen Speicher.

+0

Es ist oft ein unsichtbarer Klebstoff dazwischen, viele Compiler (oder vielmehr der Linker) spezifizieren das Speicherlayout über ein Linker-Skript, das auf das Betriebssystem zugeschnitten ist - wo im Speicher die verschiedenen Teile einer ausführbaren Datei abgelegt werden. – nos

+0

Für Linux ist es eigentlich einfach: GCC platziert den Code auf den meisten Architekturen auf der virtuellen Adresse 0. – tofro

+0

Sie haben Recht. Ich habe es anscheinend in meinen Kopf bekommen, als ich die Disassemblierung betrachtete, dass direkte (virtuelle) Adressen verwendet wurden und verwirrt wurden. –

1

Linux gibt jeder Anwendung ihren eigenen Speicherraum, der sich vom Kernel unterscheidet. Die Seitentabelle enthält die Übersetzungen zwischen diesem Speicherbereich und dem physischen RAM, und der Kernel richtet die Seitentabelle so ein, dass keine Interferenz auftritt.

Das heißt, der Compiler kümmert sich normalerweise nicht einmal, wo das Programm im Speicher geladen wird. Warum sollte es?

+0

Ich habe überlegt, ob es eine jmp-Anweisung an eine statische Adresse anlegt, oder wie man weiß, wo statische/globale Daten liegen. –

+0

Ah auf den zweiten Blick sehe ich, dass globale Daten relativ behandelt werden, und irgendwelche direkten Sprünge sind per Definition auch relativ. –