2009-08-30 18 views
7

¿Alguien sabe cuál es la diferencia entre mmap(2) y mmap(3)? La sección 3 del manual se describe como "Este capítulo describe todas las funciones de la biblioteca, excluidas las funciones de la biblioteca descritas en el capítulo 2, que implementan llamadas al sistema". ¿No realiza mmap(3) una llamada al sistema?mmap (2) vs mmap (3)

Al leer las páginas de dos man, veo que mmap(2) parece aceptar una variedad de banderas mucho más amplia que mmap(3), y afirma que puede asignar espacios de E/S del dispositivo. mmap(3) afirma que puede asignar "objetos de memoria compartida" y "objetos de memoria tipeados" además de archivos, pero no menciona la E/S del dispositivo.

Dado que las dos funciones tienen el mismo nombre, ni siquiera estoy seguro de cómo puedo elegir una en lugar de la otra.

Respuesta

18

mmap(3) se supone que es el POSIX function. Debería proporcionar en todos los aspectos la misma semántica que POSIX exige, incluso si eso se desvía de lo que Linux hace "de forma nativa". mmap(2) es la llamada al sistema y proporciona todos los detalles que Linus considera importantes. La función de biblioteca C se implementa, por supuesto, utilizando la llamada al sistema.

Para invocar la llamada al sistema literalmente (sin pasar por la biblioteca C), puede usar <sys/syscall.h>.

La implementación real de mmap (3) se puede encontrar en el C library. Como puede ver, generalmente transfiere el control directamente a mmap (2), a menos que, en tiempo de compilación (de glibc), mmap2 (2) se haya seleccionado como el "back-end".

+0

Gracias, eso fue muy claro. Gracias también por el puntero en el árbol fuente de la biblioteca C. Aunque realizo una gran cantidad de trabajo a nivel de kernel y controlador, rara vez incursiono en el espacio de usuario para algo más que las utilidades de prueba, y no he investigado en absoluto la fuente de glibc. Veo que me falta un enfoque muy útil para una serie de cuestiones. – EQvan