2012-03-21 19 views
5

Estoy tratando de entender cómo funciona mmap. La llamada a nivel de usuario de mmap se ve a continuación.Conexión entre la llamada de usuario de mmap a la llamada al núcleo de mmap

void *mmap(void *addr, size_t len, int prot, int flags, 
     int fildes, off_t off); 

pero mmap nivel del núcleo de un controlador de dispositivo en particular se parece a:

int <device_name>_mmap(struct file*fp, struct vm_area_struct *vma) 

Yo también miraba el código fuente, pero no soy capaz de encontrar la conexión entre ellos.

¿Cómo mmap para un dispositivo particular obtiene sus argumentos "struct vm_area_struct * vma"? ¿Puedes ayudarme a entender eso? Aprecio tu ayuda.

+0

en realidad lo hice pero no he podido encontrar la conexión – vindyz

+0

La 'vm_area_struct' contiene la información sobre el rango de direcciones virtuales que se asignará en el proceso de usuario y el desplazamiento en el dispositivo que la aplicación desea asignar. El argumento 'archivo' corresponde al descriptor de archivo en el lado del usuario. –

+0

Ejemplo de módulo kernel mínimo ejecutable: https://stackoverflow.com/questions/10760479/how-to-mmap-a-linux-kernel-buffer-to-user-space/45645732#45645732 –

Respuesta

12

La llamada a la biblioteca mmap() es implementada por libc, que convierte el desplazamiento en bytes a un desplazamiento en páginas, luego llama a la llamada al sistema mmap_pgoff().

La llamada al sistema mmap_pgoff() obtiene el struct file * correspondiente al argumento del descriptor de archivo y llama al do_mmap_pgoff().

do_mmap_pgoff() calcula la dirección y la longitud reales que se utilizarán en función de la pista y el espacio de direcciones disponible, convierte las banderas proporcionadas en banderas de VM y prueba el permiso para realizar la asignación. Luego llama al mmap_region().

mmap_region() elimina las asignaciones anteriores en el área que está siendo reemplazado por el nuevo mapeo, realiza la contabilidad de la memoria y crea el nuevo struct vm_area_struct que describe la región del espacio de direcciones se asignan (esto encapsula las banderas VM dirección, longitud, offset y de la cartografía). Luego llama a la implementación del archivo ->mmap(), pasando el struct file * y el struct vm_area_struct *. Para los archivos del dispositivo, esta será una llamada a la función de implementación mmap del dispositivo.

+0

Está muy bien explicado. ¿Dónde puedo encontrar esa explicación para otras funciones del kernel? ¿Hay algo a lo que pueda hacer referencia además del código fuente? – vindyz

+0

@vinay: Creo que solo necesitas practicar leyendo el código fuente, realmente no es tan difícil. [lxr.linux.no] (http://lxr.linux.no/) es bueno para rastrear a través de la fuente. Para los puntos de entrada de syscall, busque 'SYSCALL_DEFINE'. – caf

+0

@caf - Entonces, es correcto inferir que en el caso de los archivos de texto guardados en el disco, la implementación del archivo-> mmap() es realizada por el sistema de archivos. Por ejemplo, mmap_region() llamará a la implementación ext4 mmap si un archivo guardado en el disco (formateado con ext4) está mapeado? – bornfree