Mmap

Es más rápido mapear que las operaciones del file system

Un poco de Explicación...

Lo único que queda por implementar es el mapeo de memoria.

Mapeo de memoria es un proceso por el cual existe un archivo en disco y hay un segmento de memoria que estan correlacionados byte-por-byte. Es más rápido hacer cambios en la memoria que realizar operaciones a disco directamente (empleando los System Calls de read/write). Estás muy familiarizado con este concepto más de lo que crees... un ejemplo es tener un bloc de notas (un proceso) y un archivo hola.txt. Cuando abres el archivo hola.txt ocurre el mapeo de memoria. Y cuando guardas los cambios hechos, estos cambios ya se escriben a disco.

En pocas palabras, mapeo de memoria es tener el archivo mapeado a la memoria de un proceso y a través del proceso puedes modificar dicho archivo.

¡En PintOS, haremos lo mismo!

Objetivo

Implementar memory mapping en PintOS.

Implementación

Como es un mmap es un System call, estaremos trabajando únicamente en userprog/syscall.c.

Te proporciono el código base:

mapid_t mmap(int fd, void* addr){
    size_t read_bytes;
    size_t zero_bytes;
}

El tipo de retorno mapid_t es un tipo de dato definido por nosotros (algo similar con los File Descriptors que has trabajado en la fase), entonces sería bueno que lo definieras en alguna parte como en vm/thread.h.

Debes de recordar que un proceso puede tener varios archivos mapeados a memoria, entonces necesitas tener una estructura de datos que mantenga registro de todos esos archivos (identificados por un mapid_t).

Si entendiste muy bien la sección de Loader de la guía, practicamente Mmap es un copy and paste. Te invito a que leas otra vez la función load_segment() porque la matemática que tendrás que lidiar es la misma.

El proceso de mmap es el siguiente:

  1. Sanity Check (tanto del file descriptor como los punteros).

  2. Obtienes un frame libre. (Ya estás muy familiarizado con esto).

  3. Verifica que no exista un traslape de páginas (es decir, que la página que se quiere asociar no se haya cargado previamente. Si es así, matas el proceso).

  4. Lees cierta cantidad de bytes del archivo a ese frame y si es necesario, seteas a 0 los bytes restantes.

  5. Guardas información adicional con respecto a esa página y el archivo.

  6. Asocias el frame con la página y actualizas la Page Table del Proceso.

FAQ

  • ¿Necesito usar los File Descriptors para esta parte?

    Sí.

Make Grade

Con el Sanity Check implementado y Mmap, pasarás varias pruebas.

Al correr las pruebas, aprobarás exitosamente los siguientes:

Functionality

Robustness

Última actualización