2013-11-20 13 views
6

In Mmap multipel() manpage:Warum Datei in mmap Start-Offset() muss der Seitengröße

Der Prototyp ist:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); 

und Beschreibung:

The mmap() function asks to map 'length' bytes starting at offset 'offset' 
from the file (or other object) specified by the file descriptor fd into 
memory, preferably at address 'start'. 

Sepcifically für das letzte Argument:

'offset' should be a multiple of the page size as returned by getpagesize(2). 

Von dem, was ich geübt habe, offset MUSS ein Vielfaches der Seitengröße sein, zum Beispiel 4096 auf meinem Linux, andernfalls würde mmap() Invalid argument, offset ist für den Dateioffset, warum es mehrere Seiten des virtuellen Speichersystems Größe sein muss ?

Danke,

Antwort

4

Die einfache Antwort: es schnell zu machen. Die komplexere Antwort: Immer, wenn Sie auf den Speicher an einer Position innerhalb des zugeordneten Speichers zugreifen, muss das Betriebssystem sicherstellen, dass dieser Speicherort mit dem Inhalt der Datei gefüllt ist. Aber das Betriebssystem kann nur erkennen, ob Sie auf eine Speicherseite zugreifen - nicht auf einen einzelnen Speicherort. Er erstellt eine einfache Beziehung zwischen Offsets in der Datei und den Speicherseiten - und wenn Sie auf eine Speicherseite zugreifen, wird dieser Teil der Datei geladen. Um diese Berechnungen schnell durchzuführen, müssen Sie bei bestimmten Offsets beginnen.

+1

"Das Betriebssystem muss sicherstellen, dass dieser Speicherort mit dem Inhalt der Datei gefüllt ist. Aber das Betriebssystem kann nur erkennen, ob Sie auf eine Speicherseite zugreifen - nicht auf einen einzelnen Speicherort." Könntest du hier etwas einfacher und klarer sein? Unfähig zu absorbieren. Vielen Dank! –

+0

@GauravMinocha Das Betriebssystem kann nur feststellen, dass eine ganze Seite gelesen wird (in diesem Beispiel 4096 Byte), nicht z. B. eine einzelne Byteadresse (im RAM kann jedes einzelne Byte des Speichers adressierbar sein). So werden ganze Seiten der Datei gleichzeitig geladen. – jwbensley

-2

Der gesamte Speicher eines Prozesses ist virtuell.
"Virtueller Speicher" ist Speicherplatz auf Ihrer Festplatte, der dem physischen RAM zugeordnet ist.

auf einer Festplatte werden die Daten in dünnen, konzentrischen Bänder Spuren genannt gespeichert.

Das Betriebssystem verlangt, den Raum auf eine lineare, kontinuierliche Weise zu sehen.
HDD-Hersteller haben dieses Modell in den 90er Jahren übernommen.

Die kleinste zuweisbare Einheit auf einer Festplatte ist ein Sektor, der 512 Byte groß ist ... ein halber Kilobyte.

NTFS unter Windows gibt Ihnen aus der Perspektive des Betriebssystems einen Standardwert von 4096 Byte als Größe für die kleinste zuweisbare Einheit auf der Festplatte an.

Dies wäre ein Cluster von vier Sektoren ... die Größe einer Seite.

Quelle: http://ntfs.com/hard-disk-basics.htm

Eine Seite oft ist 4096 Bytes groß, weil Intel x86 MMU Karten Speicher ...

durch eine Reihe von Tabellen, zwei um genau zu sein. Sie sind das Paging-Verzeichnis und die Paging-Tabelle. Beide Tabellen enthalten 1024 4 Byte Einträge, so dass sie jeweils 4 KB.

In der Seitentabelle verweist jeder Eintrag auf eine physikalische Adresse, die dann auf die virtuelle Adresse zugeordnet ist, indem er den Offset innerhalb des Verzeichnisses und den Offset innerhalb der Tabelle berechnet.

Bitte beachten Sie, dass dies bedeutet, dass Seiten als 4096 größer sein können,
aber es ist die kleinste möglich Einheitsgröße für die MMU!

Quelle: http://wiki.osdev.org/Paging#MMU

Fazit:
Die Größe von dem bestimmt wird, die/programmiert, um das Betriebssystem entwickelt. Es kann ein beliebiges Vielfaches von 4096 Byte sein.