Red de conocimiento informático - Aprendizaje de programación - ¿Cómo se aplica dinámicamente la memoria del espacio de usuario de Linux?

¿Cómo se aplica dinámicamente la memoria del espacio de usuario de Linux?

La función que solicita memoria dinámicamente en el espacio del usuario es malloc (), que se usa consistentemente en varios sistemas operativos, y la función de liberación para que malloc () solicite memoria es free (). Para Linux, la función malloc() de la biblioteca C generalmente solicita memoria del kernel a través de las llamadas al sistema brk() y mmap(). Dado que el algoritmo malloc de la biblioteca C del espacio de usuario en realidad tiene capacidades de administración secundaria, no todas las solicitudes y liberaciones de memoria van necesariamente acompañadas de una llamada del sistema al kernel. Por ejemplo, la aplicación del Listado 11.2 puede llamar a free() inmediatamente después de adquirir memoria del kernel. Dado que free() anteriormente llamaba a mallopt(M_TRIM_THRESHOLD, 1) y mallopt(M_MMAP_MAX, 0), este free() no devuelve la memoria al kernel, sino que solo la devuelve al algoritmo de asignación de bibliotecas C de la biblioteca C (la memoria todavía pertenece para procesar), por lo que todas las solicitudes y liberaciones de memoria dinámica posteriores se realizan en modo de usuario. Además, el kernel de Linux siempre usa Demand Paging, por lo que cuando malloc () regresa, aunque tiene éxito, el kernel en realidad no proporciona memoria al proceso. Si lee la memoria solicitada en este momento, el contenido será todo cero. y la página asignada es de solo lectura. Sólo cuando se escribe en una página el núcleo realmente entrega la página al proceso después de un error de página.

Las funciones principales involucradas en la solicitud de memoria en el espacio del kernel de Linux incluyen kmalloc (), obtener páginas gratuitas () y vmalloc ()

kmalloc () y _get_free páginas () (y sus funciones similares) la memoria solicitada está en el área mapeada de DMA y el área regular, y también es físicamente contigua, solo hay un desplazamiento fijo entre ellos y la dirección física real, por lo que existe una relación de traducción más simple. Aunque vmalloc () proporciona un área de memoria continua en el espacio de memoria virtual, de hecho, esta memoria virtual continua no es necesariamente continua en la memoria física y existe una brecha entre la memoria virtual solicitada por vmalloc () y la memoria física. No existe una simple relación de conversión.