실습환경 : Ubuntu 16.04
실습코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char* a0=(char*)malloc(0x3f0);
char* b0=(char*)malloc(0x80);
char* a1=(char*)malloc(0x400);
char* b1=(char*)malloc(0x40);
char* a2=(char*)malloc(0x410);
char* b2=(char*)malloc(0x200);
char* a3=(char*)malloc(0x420);
char* b3=(char*)malloc(0x200);
char* a4=(char*)malloc(0x430);
char* b4=(char*)malloc(0x300);
char* a5=(char*)malloc(0x440);
char* b5=(char*)malloc(0x300);
char* a6=(char*)malloc(0x450);
char* b6=(char*)malloc(0x300);
char* a7=(char*)malloc(0x460);
char* b7=(char*)malloc(0x300);
char* a8=(char*)malloc(0x470);
char* b8=(char*)malloc(0x300);
free(a0);
char* e0=(char*)malloc(0x500);
free(a1);
char* e1=(char*)malloc(0x500);
free(a2);
char* e2=(char*)malloc(0x500);
free(a3);
char* e3=(char*)malloc(0x600);
free(a4);
char* e4=(char*)malloc(0x600);
free(a5);
char* e5=(char*)malloc(0x500);
free(a6);
char* e6=(char*)malloc(0x500);
free(a7);
char* e7=(char*)malloc(0x600);
free(a8);
char* e8=(char*)malloc(0x600);
return 0;
}
위 코드는 보기 쉽게 병합이 진행되지 않게 malloc 및 free가 되는 코드입니다. 요청한 사이즈 그대로 디버깅을 통해 largebin에 들어가는 것을 보기위함입니다.
마지막 malloc이 호출된 직후 메모리 상황을 보겠습니다. (a로 시작하는 변수들이 의미있는 부분임)
현재 large_bins[63]에 0x400부터 0x430 까지의 사이즈를 가진 청크가 들어가 있습니다. 또한 정렬이되어 맨 왼쪽이 가장 큰 사이즈를 갖는다.
larebin[63] 의 각 청크들은 모두 사이즈가 다르므로 fd,bk와 fd_nextsize,bk_nextsize 모두 동일합니다.