2009-08-30 7 views
7

Est-ce que quelqu'un sait quelle est la différence entre mmap(2) et mmap(3)? La section Man 3 est décrite comme "Ce chapitre décrit toutes les fonctions de la bibliothèque à l'exclusion des fonctions de la bibliothèque décrites dans le chapitre 2, qui implémente les appels système." mmap(3) n'effectue-t-il pas un appel système? En lisant les deux pages man, je vois que mmap(2) semble accepter une plus grande variété de drapeaux que mmap(3), et prétend être capable de mapper des espaces d'E/S de périphérique. mmap(3) prétend pouvoir mapper des "objets mémoire partagés" et des "objets mémoire typés" en plus des fichiers, mais ne mentionne pas les E/S des périphériques.mmap (2) vs mmap (3)

Puisque les deux fonctions ont le même nom, je ne suis même pas sûr de savoir comment choisir l'une plutôt que l'autre.

Répondre

18

mmap(3) est censé être le POSIX function. Il devrait à tout point fournir la sémantique même que POSIX impose, même si cela dévie de ce que Linux fait "nativement". mmap(2) est l'appel système, et fournit toutes les cloches et sifflets que Linus considère important. La fonction de bibliothèque C est, bien sûr, implémentée en utilisant l'appel système.

Pour appeler l'appel système littéralement (en ignorant la bibliothèque C), vous pouvez utiliser <sys/syscall.h>.

La mise en œuvre réelle de mmap (3) peut être trouvée dans le C library. Comme vous pouvez le voir, il transfère généralement le contrôle directement à mmap (2), sauf si, au moment de la compilation (de la glibc), mmap2 (2) a été sélectionné comme "back-end".

+0

Merci, c'était très clair. Merci également pour le pointeur dans l'arborescence source de la bibliothèque C. Bien que je fasse pas mal de travail au niveau des noyaux et des pilotes, j'investis rarement dans l'espace utilisateur pour autre chose que des utilitaires de test, et je n'ai pas du tout cherché de source de glibc. Je peux voir que j'ai manqué une approche très utile à un certain nombre de problèmes. – EQvan