Archivos Mapeados en Memoria (Memory-Mapped I/O)
Archivo: src/mmap.rs (264 líneas)
¿Por qué existe?
Proporciona E/S de alto rendimiento mediante archivos mapeados en memoria. En lugar de usar read()/write() tradicionales (que copian datos entre kernel y userspace), mmap proyecta el archivo directamente en el espacio de direcciones del proceso, permitiendo acceso con punteros de memoria convencionales.
Implementación multi-plataforma
- Unix (Linux, macOS, BSD): Usa
mmap/munmap/msyncviaextern "C" - Windows: Usa
CreateFileMappingW/MapViewOfFile/UnmapViewOfFileviaextern "system"
Estructuras principales
| Estructura | Descripción |
|---|---|
MmapRegion | Describe una región mapeada: puntero addr, longitud len, offset, permisos |
Heap global (REGIONS) | HashMap<i64, MmapRegion> con Mutex para gestión de ciclos de vida |
API Pública
| Función | Descripción |
|---|---|
mmap_abrir(ruta, longitud, offset, escritura) -> Result<i64> | Abre y mapea un archivo, retorna un handle numérico |
mmap_cerrar(handle) -> Result<()> | Desmapea y cierra el archivo |
mmap_leer(handle, offset, len) -> Result<Vec<u8>> | Lee bytes de la región mapeada |
mmap_escribir(handle, offset, datos) -> Result<()> | Escribe bytes en la región mapeada |
mmap_sincronizar(handle) -> Result<()> | Fuerza la sincronización (msync) |
mmap_longitud(handle) -> Result<usize> | Obtiene el tamaño del mapeo |
Uso desde Forja
Expuesto a través del módulo mmap.fa de la stdlib, que provee funciones como mmap_abrir, mmap_cerrar, mmap_leer, y mmap_escribir. Ideal para procesamiento de archivos grandes, bases de datos, y operaciones de E/S de baja latencia.
⚠️ Seguridad: El sandbox de red (
sandbox.rs) no controla mmap, pero el módulo valida rangos de acceso para prevenir lecturas/escrituras fuera de los límites del mapeo.💡 Beneficio clave: mmap es significativamente más rápido que
read/write tradicionales para archivos grandes porque elimina la copia entre kernel-space y user-space, y delega la carga de páginas al administrador de memoria virtual del SO.