Interfaces relacionadas con la memoria

A continuación, hablemos de las interfaces: las interfaces son como un punto de interacción para la comunicación. El papel que desempeñan las interfaces en la capa del núcleo/capa de controlador y en la capa de aplicación es similar al papel que desempeñan los registros en el hardware y el software . En términos generales, son como especificaciones de protocolo en comunicación. En el trabajo, cuando los ingenieros de kernel/controladores se conectan con los ingenieros de desarrollo de aplicaciones, también se comunican a través de interfaces.

La interfaz de memoria sigue siendo muy importante en el proceso de desarrollo; al igual que el desarrollo de la capa de aplicación, las interfaces de funciones relacionadas para el procesamiento de familias de cadenas son importantes y de uso común.

A continuación se muestra un breve resumen de las siguientes interfaces y escenarios de aplicación:

Capa del kernel : kmalloc y kfree, vmalloc y vfree, kzalloc, kcalloc, alloc_pages, devm_kzalloc

kmalloc es una solución común para la asignación de memoria en el kernel. Escenario aplicable: páginas físicas continuas

Parámetros de uso común: GFP_KERNEL y GFP_ATOMIC.

GFP_ATOMIC: realiza una asignación de alta prioridad sin dormir, adecuada para manejadores de interrupciones y otros segmentos de código que no pueden dormir;

GFP_KERNEL: para segmentos de código que se pueden dormir, como código de contexto de proceso sin bloqueos de giro.

vmalloc: la dirección virtual de la memoria es continua pero no se garantiza que la dirección física sea continua. Asigne la memoria física al espacio de direcciones lógicas contiguas (hay una pérdida de rendimiento).

alloc_page: asigna memoria de alto nivel y asigna tamaño de página. Tenga en cuenta que el valor de retorno de la función es un puntero a la estructura de la página de ejecución.

kzalloc: en comparación con kmalloc, se agrega una bandera para borrar el contenido aplicado. __GFP_ZERO

kcalloc: asigna memoria para la matriz.

Capa de aplicación : mallloc, calloc, realloc y mmap (biblioteca de funciones)

Diferencia: diferencias en escenarios, rendimiento y funciones aplicables.

Escenario: malloc+memset = calloc

Rendimiento: calloc tiene solo la mitad de las instrucciones de ensamblaje de malloc

Funcionalmente: realloc puede ajustar el tamaño de la memoria asignada por malloc y aumentar la memoria al tamaño .

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main()
{
   char *str;
 
   /* 最初的内存分配 */
   str = (char *) malloc(5*sizeof(int));
   strcpy(str, "aaaaaaaaaaaaaaaaaaaabbbb");
   printf("String = %s,  Address = %u\n", str, str);
 
   /* 重新分配内存 */
   str = (char *) realloc(str,7*sizeof(int));
   strcat(str, ".com");
   printf("String = %s,  Address = %u\n", str, str);
 
   free(str);
 
   return(0);
}

Parte de la implementación subyacente de malloc es mmap. Es decir, la implementación de malloc llama a sys_mmap para asignar memoria cuando es mayor a 128k; cuando es menor a 128k, llama a sys_brk.

El principio de implementación y el uso de la interfaz mmap se discutirán por separado más adelante.

Supongo que te gusta

Origin blog.csdn.net/tanxiezang5399/article/details/122513658
Recomendado
Clasificación