2012-04-11 16 views
1

Ist es möglich, ausführbare Seiten unter Linux zu teilen, um Speicherplatz zu sparen? Ich weiß, dass es Shared-Memory-APIs gibt, die verwendet werden können, um Speicher zwischen verschiedenen Prozessen zu teilen, aber ich denke nicht, dass das dafür gedacht ist.Sharing ausführbare Speicherseiten in Linux?

Grundsätzlich möchte ich eine Shared Memory-Region haben, in die einige häufig verwendete Shared Libraries geladen werden können. Ich möchte, dass der dynamische Linker mit den vorgeladenen (schreibgeschützten) Bildern verknüpft wird, anstatt alle Bilder der gemeinsam genutzten Bibliothek in jeden einzelnen Prozess laden zu müssen (was wie eine Verschwendung aussieht).

Ist dies auf dem Linux-Kernel möglich? Der Darwin-Kernel implementiert dies mithilfe einer Funktion von Mach VM, die als commpages bekannt ist (der gemeinsam genutzte Cache wird dort gespeichert). Die Kommunikationsseiten sind für jeden Prozess zugänglich und freigegeben.

Nur um zu klären, weiß ich, was gemeinsame Objekte (Bibliotheken) sind. Was der dynamische Linker unter Linux tut, ist, dass er alle benötigten Bibliotheken in den Adressraum des Programms lädt, was bedeutet, dass jede Anwendung, die zum Beispiel libc verlinkt, ein Bild von libc irgendwo in ihrem Adressraum hat. Bei Darwin kann dieses Problem behoben werden, indem die ausführbaren (und andere schreibgeschützten) Abschnitte von libc eine Gruppe von gemeinsam genutzten Speicherseiten enthält. Die beschreibbaren Abschnitte der geteilten Bilder sind noch getrennt.

Edit: Ich weiß, dass das ELF-Format die Trennung von DATA- und TEXT-Segmenten der gemeinsam genutzten Bibliotheken nicht unterstützt. Ich verwende keine ELF, Ich verwende ein anderes Binärformat (mit meinem eigenen binfmt Kernelmodul und meinem eigenen dynamischen Linker). Ich bin interessiert, ob der Linux-Kernel eine commpage-ähnliche Funktion unterstützt.

Bearbeiten 2: Die einzige Möglichkeit, dies zu tun wäre, eine große Platte des Speichers im Kernel zuzuordnen und es in jede binäre, die ausgeführt wird, zuordnen. Wenn eine Binärdatei das erste Mal ausgeführt wird, kann der dynamische Linker den Schutz aufheben, sie mit den gewünschten Daten füllen und sie schützen. Dann müsste der Kernel irgendwie sicherstellen, dass das Speichersegment nicht durch irgendetwas anderes verändert wird, da dies eine massive Sicherheitslücke öffnen würde. Ein anderer

Antwort

4

Wie Geekosaur gesagt hat, tut Linux das bereits.

Beim Start der Anwendung der dynamische Linker (ld.so) mmap() s die gemeinsam genutzten Bibliotheken. Es führt mehrere Anrufe mmap() für jede Bibliothek:

  • mmap(PROT_READ|PROT_EXEC) für den ausführbaren Abschnitt (dh .text)
  • mmap(PROT_READ|PROT_WRITE) für die Daten (dh .data und .bss)

(Sie Überprüfen Sie dies für sich selbst mit strace.)

Der Kernel, ein cleveres wenig Code, realisiert, dass die ausführbare Sektion, durch Offset und die Inode (bekannt durch die fd), ist bereits abgebildet. Da es schreibgeschützt ist, hat es keinen Sinn, mehr Speicher dafür zuzuweisen.

Dies bedeutet auch, dass, wenn Sie eine andere Datei haben, die Sie mmap() schreibgeschützt von mehreren Anwendung wird der Speicher auch nur einmal verbraucht werden.

+0

Die Antwort von Kristof wird in Diskussionen über das Verknüpfen und Laden typischerweise beschönigt. Es gibt zwei Begriffe der gemeinsamen Nutzung: Sie beziehen sich auf das gleiche Code-Objekt (in einer Datei) und greifen auf dieselbe Seite (Code) im physischen Speicher zu. Die Kernel-Funktion mmap() versteht letztere, und das Verknüpfen versteht es nur so weit, dass es passieren kann. Selbst zwei Prozesse, die dasselbe statisch verknüpfte Programm ausführen, können sich physikalische Codepages teilen, letzteres. – bootchk

4

Linux tut dies bereits; in der Tat, das ist, was ein shared Objekt ist ungefähr/für.

+0

Gemeinsame Objekte werden in den Adressraum jeder Anwendung dupliziert. –

+0

Sie sind in jeden Anwendungsadressraum * abgebildet *, aber sie sind nur einmal physikalisch im Speicher vorhanden. –

+0

Welcher Teil von ld-linux macht das? –