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.
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
Für Linux ist es eigentlich einfach: GCC platziert den Code auf den meisten Architekturen auf der virtuellen Adresse 0. – tofro
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. –