2010-05-01 4 views
8

Ich bin verwirrt durch die specification of mmap.Ausrichtung und Granularität von mmap

Lassen pa die Rücksprungadresse von Mmap sein (das gleiche wie die Spezifikation)

pa = Mmap (addr, len, Prot, Fahnen, fildes, aus);

Meiner Meinung nach dem Aufruf Funktion den folgenden Bereich erfolgreich gilt

[pa, pa + len)

Meine Frage ist, ob der Bereich der folgenden Bedingungen noch gültig?

[round_down (pa, Seitengrße), round_up (pa + len, Seitengrße))
[base, base + size] für kurze

Das heißt:

  1. ist die base immer auf der Seitengrenze ausgerichtet?
  2. ist die size immer ein Vielfaches von pagesize (die Granularität ist pagesize mit anderen Worten)?

Danke für Ihre Hilfe.

ich denke, es in diesem Absatz angedeutet wird:

Das off Argument eingeschränkt ist nach dem von sysconf() zurückgegebene Wert ausgerichtet und so bemessen werden, wenn _SC_PAGESIZE oder _SC_PAGE_SIZE geben. Wenn MAP_FIXED angegeben ist, muss die Anwendung sicherstellen, dass das Argument addr diese Einschränkungen ebenfalls erfüllt. Die Implementierung führt Mapping-Vorgänge über ganze Seiten hinweg. Während also das Argument len ​​eine Größen- oder Ausrichtungsbeschränkung nicht erfüllen muss, muss die Implementierung in jeder Zuordnungsoperation jede Teilseite einschließen, die durch den Bereich [pa, pa + len] spezifiziert ist.

Aber ich bin mir nicht sicher und ich habe nicht viel Erfahrung auf POSIX.

  • Bitte zeigen Sie mir etwas mehr explizite und mehr definitive Beweise
  • Oder zeigen Sie mir mindestens ein System, das POSIX unterstützt und ein anderes Verhalten

Dank agian hat.

Antwort

3

Ihre Frage ist ziemlich offen, wenn man bedenkt, dass mmap viele verschiedene Modi und Konfigurationen hat, aber ich werde versuchen, die wichtigsten Punkte zu behandeln.

Nehmen Sie den Fall, in dem Sie eine Datei in den Speicher mappen. Der Anfang der Daten in der Datei wird immer mit der Rückgabeadresse von mmap() verwurzelt sein. Obwohl das Betriebssystem tatsächlich Karten an Seitengrenzen erstellt hat, glaube ich nicht, dass der POSIX-Standard erfordert, dass das Betriebssystem diesen Speicher schreibbar macht (zum Beispiel könnte es Segmentierungen in diesen Bereichen erzwingen). Im Fall von Mapping-Dateien ist es nicht sinnvoll, dass diese zusätzlichen Speicheradressenbereiche sind, die von einer Datei unterstützt werden, es macht mehr Sinn, dass diese Regionen nicht definiert sind.

Für MMAP_ANONYMOUS ist jedoch der Speicher wahrscheinlich beschreibbar - aber es wäre auch unklug, diesen Speicher zu verwenden.

Wenn Sie mmap() verwenden, verwenden Sie tatsächlich die glibc-Version von mmap(), und es kann den Speicher nach Belieben in Scheiben schneiden. Schließlich ist es erwähnenswert, dass unter OSX, das mit POSIX kompatibel ist, keiner der zitierten zitierten Texte in der Manpage für mmap() erscheint.