He detectado algunas diferencias en el comportamiento del asignador de memoria dinámica GNU / Linux en i386 vs amd64. Si bien es posible que no esté entendiendo algo (en este caso, hágamelo saber), no entiendo por qué están presentes estas diferencias y antes de indagar dentro del código, quiero saber si alguien ya lo ha investigado.
Tomemos este programa (test.c) como ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
unsigned int *a = malloc(100); //(1)
memcpy(a,"AAAAAAAAAAAAAAAAAA",18);
free(a); //(2)
unsigned int *b = malloc(10); //(3)
memcpy(b,"BBBBBB",6);
return 0;
}
Después del malloc en (1) tenemos en ambos casos que el espacio se toma directamente de la parte superior, y esto es como se esperaba:
Sinembargo,despuésdelaliberaciónen(2),sepuedeobservarlaprimeradiferencia:
Como se puede ver en la captura de pantalla en los bits ELF-64, el fragmento que se ha liberado no se actualiza con el nuevo tamaño, pero el tamaño sigue siendo 0x71 y el primer QWORD se anula. En los bits ELF-32, como esperaba, el fragmento liberado se fusiona con el Top Chunk y el tamaño se actualiza a 0x20f99 + 0x68 = 0x21001.
Más tarde, cuando se ejecuta el segundo malloc en (3), en el caso x64, el nuevo fragmento se asigna justo después del fragmento anterior al reducir el segmento superior, mientras que en el caso i386 se reutiliza el fragmento liberado anteriormente.
Estas son solo dos de las diferencias que he notado, y creo que hay muchas otras ...
Entonces, ¿hay en algún lugar un documento / investigación / documento técnico que describa estas diferencias?
Estoy usando libc-2.23.so en un Ubuntu 16.04
Gracias de antemano por cualquier información sobre esto.