2010-05-01 9 views
8

Je suis confus par le specification of mmap.alignement et granularité de mmap

Let pa être l'adresse de retour de mmap (la même que la spécification)

pa = mmap (ADDR, len, flags, Prot, fildes, OFF);

À mon avis, après l'appel de fonction réussir la plage suivante est valable

[pa, pa + len)

Ma question est de savoir si la portée de ce qui suit est toujours valide?

[round_down (pa, pagesize), round_up (pa + len, pagesize))
[base, base + size] pour faire court

C'est-à-dire:

  1. est le base toujours aligné sur la limite de la page?
  2. le size est-il toujours un multiple de la taille de la page (la granularité est la taille de la page en d'autres termes)?

Merci pour votre aide.

Je pense qu'il est impliqué dans ce paragraphe:

Le hors argument est contraint d'être aligné et dimensionné en fonction de la valeur retournée par sysconf() lorsqu'il est passé _SC_PAGESIZE ou _SC_PAGE_SIZE. Lorsque MAP_FIXED est spécifié, l'application doit s'assurer que l'argument addr répond également à ces contraintes. L'implémentation effectue des opérations de mappage sur des pages entières. Ainsi, alors que l'argument len ​​n'a pas besoin de respecter une contrainte de taille ou d'alignement, l'implémentation doit inclure, dans toute opération de mappage, toute page partielle spécifiée par l'intervalle [pa, pa + len).

Mais je ne suis pas sûr et je n'ai pas beaucoup d'expérience sur POSIX.

  • S'il vous plaît me montrer un peu plus explicite et plus preuve définitive
  • Ou me montrer au moins un système qui prend en charge POSIX et a un comportement différent

Merci planifions.

Répondre

3

Votre question est assez ouverte, étant donné que mmap a de nombreux modes et configurations différents, mais je vais essayer de couvrir les points les plus importants.

Reprenez le cas dans lequel vous mappez un fichier en mémoire. Le début des données dans le fichier sera toujours enraciné à l'adresse de retour de mmap(). Bien que le système d'exploitation ait pu créer des cartes aux limites de la page, je ne crois pas que la norme POSIX exige que le système d'exploitation rende cette mémoire inscriptible (par exemple, il pourrait forcer des segments sur ces régions). Dans le cas de fichiers de mappage, il n'est pas logique que ces zones d'adresse mémoire supplémentaires soient avec un fichier, il est donc plus logique que ces régions ne soient pas définies. Pour MMAP_ANONYMOUS, cependant, la mémoire est probablement accessible en écriture, mais, encore une fois, il serait imprudent d'utiliser cette mémoire. De plus, lorsque vous utilisez mmap() vous utilisez réellement la version de mmap() de glibc, et il peut découper et découper la mémoire de toute façon. Enfin, il convient de noter que sur OSX, qui est conforme à POSIX, aucun des textes cités que vous avez présentés n'apparaît dans la page man de mmap().