Ich bin verwirrt durch die Spezifikation von mmap .
Lassen Sie pa
die Rückgabeadresse von mmap (das gleiche wie die Spezifikation)
pa = mmap (adr, len, prot, flags, fildes, aus);
Meiner Meinung nach ist nach dem Funktionsaufruf der folgende Bereich gültig
[pa, pa + len]
Meine Frage ist, ob der Bereich der folgenden noch gültig ist?
[round_down (pa, Seitengröße), round_up (pa + len, Seitengröße))
[Basis, Basis + Größe] für kurze
Das heißt:
base
immer an der Seitengrenze ausgerichtet? size
immer ein Vielfaches von pagesize (die Granularität ist pagesize mit anderen Worten)? Danke für Ihre Hilfe.
Ich denke, es ist in diesem Absatz impliziert:
Das Argument off muss so ausgerichtet und skaliert werden, dass es dem von sysconf () , wenn Sie _SC_PAGESIZE oder _SC_PAGE_SIZE übergeben haben. Wenn MAP_FIXED angegeben wird, muss die Anwendung sicherstellen, dass das Argument addr diese Einschränkungen ebenfalls erfüllt. Die Implementierung führt Mapping-Vorgänge über ganze Seiten durch . Während also das Argument len eine Größen- oder Ausrichtungsbeschränkung nicht erfüllen muss, muss die Implementierung bei jeder Mapping-Operation irgendeine Teilseite einschließen, die durch den Bereich [pa, pa + len] spezifiziert ist.
Aber ich bin mir nicht sicher und ich habe nicht viel Erfahrung mit POSIX.
Danke Agian.
Ihre Frage ist ziemlich offen, wenn man bedenkt, dass mmap viele verschiedene Modi und Konfigurationen hat, aber ich werde versuchen, die wichtigsten Punkte zu beschreiben.
Nehmen wir 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 von einer Datei unterstützt werden, es macht mehr Sinn, dass diese Regionen nicht definiert sind.
Für MMAP_ANONYMOUS ist der Speicher wahrscheinlich beschreibbar - aber es wäre auch nicht sinnvoll, diesen Speicher zu verwenden.
Wenn Sie mmap () verwenden, verwenden Sie außerdem 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 man-Seite von mmap () erscheint.