Anonymous mmap zero-filled?

8

Unter Linux erklärt die Manpage mmap (2) , dass eine anonyme Zuordnung

ist
  

. . . wird von keiner Datei unterstützt; sein Inhalt wird auf Null initialisiert.

Die FreeBSD mmap (2) Manpage macht keine ähnliche Version Garantie auf Null-Füllung, obwohl es verspricht, dass Bytes nach dem Ende einer Datei in einem nicht anonymen Mapping Nullen sind.

Welche Varianten von Unix versprechen, null-initialisierten Speicher von anonymen mmaps zurückzugeben? Welche geben in der Praxis den Null-initialisierten Speicher zurück, machen aber auf ihren Manpages keine solchen Versprechen?

Ich habe den Eindruck, dass die Nullfüllung teilweise aus Sicherheitsgründen erfolgt. Ich frage mich, ob irgendwelche mmap-Implementierungen das Zero-Filling für eine Seite überspringen, die mmapped, munmapped, dann erneut mit einem einzigen Prozess mapped wurde, oder ob irgendwelche Implementierungen eine neu zugeordnete Seite mit pseudozufälligen Bits oder einer von Null verschiedenen Konstante füllen. p>

P.S. Anscheinend haben sogar brk und sbrk verwendet, um Seiten mit Null zu garantieren. Meine Experimente auf Linux scheinen darauf hinzuweisen, dass, selbst wenn ganze Seiten mit Seitenfehlern gefüllt sind, nachdem ein sbrk-Aufruf sie zugewiesen hat, unvollständige Seiten nicht:

sind %Vor%     
jbapple 09.07.2013, 03:42
quelle

1 Antwort

7

Es ist schwer zu sagen, welche versprechen was, ohne einfach alle man-Seiten oder andere Release-Dokumentation erschöpfend aufzuzählen, aber der zugrunde liegende Code, der MAP_ANON verarbeitet, wird (gewöhnlich? immer?) auch verwendet, um bss-Platz für ausführbare Dateien zuzuordnen Der BSS-Raum muss null sein. Also ist es verdammt wahrscheinlich.

Wenn Sie "Ihre alten Werte zurückgeben" (oder einige Werte ungleich null, aber höchstwahrscheinlich Ihre alten), wenn Sie die Zuordnung aufheben und neu zuordnen, scheint es sicher möglich zu sein, wenn ein System "faul" wäre. über die Aufhebung der Freigabe. Ich habe nur ein paar Systeme benutzt, die mmap an erster Stelle unterstützen (BSD und Linux-Derivate) und keiner ist so faul, zumindest nicht in der Kernel-Code-Behandlung mmap .

Der Grund, warum sbrk eine "neugewachsene" Seite auffüllen kann oder auch nicht, hängt wahrscheinlich mit dem Verlauf oder dem Fehlen davon zusammen. Der aktuelle FreeBSD-Code stimmt mit dem überein, was ich von den alten, pre mmap days her kenne: Es gibt zwei halbgeheime Variablen, minbrk und curbrk , und sowohl brk als auch sbrk rufen nur% co_de auf % (der echte Systemaufruf), wenn sie SYS_break auf einen Wert verschieben, der mindestens curbrk ist. (Eigentlich sieht das etwas kaputt aus: minbrk hat das at-mindest-Verhalten, aber brk fügt sein Argument nur zu sbrk hinzu und ruft curbrk auf. Scheint harmlos, da der Kernel prüft, in SYS_break in sys_obreak() , also wird ein zu negatives /sys/vm/vm_unix.c mit sbrk() fehlschlagen.)

Ich müsste mir die Linux C-Bibliothek anschauen (und dann vielleicht auch den Kernel-Code), aber es kann einfach Versuche ignorieren, "die Pause zu verringern", und einfach einen "logischen Bruch" -Wert in libc aufzeichnen. Wenn Sie EINVAL und keine Anforderungen für die Rückwärtskompatibilität haben, können Sie mmap() und brk() vollständig in libc implementieren, indem Sie anonyme Zuordnungen verwenden, und es wäre trivial, beide sozusagen als "Nur-Wachstum" zu implementieren .

    
torek 27.07.2013, 08:59
quelle

Tags und Links