LinuxMalloc Analysis - Desde User Space a Kernel Space

  

Este artículo describe la implementación de malloc y su malloc en la operación de expansión del montón, y analiza cómo se realiza la asignación de la dirección virtual a la dirección física.

orden original, enlace original: http://blog.csdn.net/ordeder/article/details/41654509

1 conocimiento previo

1.1 espacio de usuario del proceso < Br>



Figura 1: Fuente http://www.open-open.com/lib/view/open1409716051963.html


La estructura se define mediante el proceso task_struct.mm_struct mm_struct se define de la siguiente manera:


? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 struct mm_struct {struct vm_area_struct * mmap; /* lista de VMA * /... pgd_t * pgd; //para el mapeo de direcciones atomic_t mm_users; /* ¿Cuántos usuarios con espacio de usuario? * /atomic_t mm_count; /* ¿Cuántas referencias a " struct mm_struct " ( Usuarios coun t como 1) * /int map_count; /* número de VMAs * /... //Describa la distribución de segmentos del espacio de usuario: segmento de datos, segmento de código, segmento de pila sin firmar long_code start, end_code, start_data, end_data; unsigned long start_brk, Brk, start_stack; unsigned long arg_start, arg_end, env_start, env_end; unsigned long rss, total_vm, locked_vm; ...};


El startxxx y el endxxx en la estructura describen el segmento de datos del espacio del usuario del proceso Direccion Para el espacio de almacenamiento dinámico, start_brk es la dirección de inicio del espacio de almacenamiento dinámico, y el almacenamiento dinámico se amplía. Para la extensión del espacio del montón del proceso, brk registra la posición superior del montón. El espacio de direcciones (la variable que se usa) del espacio aplicado dinámicamente por el proceso se asigna, y estos espacios de direcciones se registran en la estructura de lista vinculada vm_area_struct * mmap.

1.2 Asignación de direcciones

Asignación de direcciones virtuales y direcciones físicas: http://blog.csdn.net/ordeder/article/details/41630945


< H1> 2 malloc y free

malloc es la interfaz de funciones para la extensión del montón de espacio del usuario. Esta función es una biblioteca C que pertenece a la función de biblioteca glibc que encapsula la llamada al sistema relevante (brk ()). En lugar de una llamada del sistema (el sistema no puede tener sys_malloc (). Si habla de las operaciones del núcleo del sistema involucrado en la función malloc, el conjunto puede dividirse en nivel de espacio de usuario y nivel de espacio de núcleo.

2.1 Capa de usuario < Br>


El código fuente de malloc está visible en http://repo.or.cz/w/glibc.git/blob/HEAD:/malloc/malloc.c

Malloc y gratis Funciona a nivel de usuario, lo que proporciona al usuario una interfaz que es más conveniente para administrar el montón. Su trabajo principal es mantener una lista de búferes de espacio de montón libre. El búfer se puede expresar en la siguiente estructura de datos:


? 1 2 3 4 5 6 7 8 9 struct malloc_chunk {INTERNAL_SIZE_T prev_size; /* Tamaño del fragmento anterior (si es gratis). * /INTERNAL_SIZE_T size; /* Tamaño en bytes, incluidos los gastos generales. * /struct malloc_chunk * Fd; /* enlaces dobles: solo se utilizan si son gratuitos. * /Struct malloc_chunk * bk; /* Solo se utiliza para bloques grandes: puntero al siguiente tamaño más grande. * /Struct malloc_chunk * fd_nextsize; /* enlaces dobles: solo se utiliza si está libre. * /Struct malloc_chunk * bk_nextsize;};

< Br>

La versión simplificada de la lista de búferes libres se muestra a continuación. La cabecera es la estructura malloc_chunk descrita anteriormente. El área de memoria del tamaño del siguiente tamaño es el área de datos correspondiente al fragmento.

[malloc]

Siempre que un proceso llama a malloc, primero busca un bloque de memoria de tamaño suficiente en el búfer del montón para asignarlo al proceso (el bloque en el búfer tiene el primer golpe y Mejor golpeó dos algoritmos). Si freechunklist ya no puede satisfacer la porción requerida, entonces malloc expandirá el montón del espacio de proceso llamando al sistema llamada brk (), creará una nueva porción en el espacio de pila recién expandido y lo agregará a la lista gratuita. Este proceso es equivalente a El proceso por lotes quiere que el sistema solicite un pedazo de memoria (el tamaño puede ser mucho más grande que la demanda real).

La dirección devuelta por malloc es la primera dirección en el fragmento utilizado para almacenar datos, es decir: chunk + sizeof (chunk)


Un simple pseudo primer golpe de malloc Código:

Copyright © Conocimiento de Windows All Rights Reserved