Here’s a malloc/free implementation in few lines of code. It maps malloc
/free
1-to-1 with mmap
/munmap
. To do so, it rounds up all desired sizes to the nearest page size. This is pretty wasteful, but saves on implementation complexity.
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
int div_roundup(int a, int b) {
return (a+b-1)/b;
}
void * jim_malloc(size_t size) {
int pagesize = getpagesize();
size_t required = size + sizeof(size_t);
int num_pages = div_roundup(required, pagesize);
void * new_region = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
if (new_region == MAP_FAILED) return NULL;
*(size_t*)new_region = required; // We use this to free() the right number of bytes
return new_region+sizeof(size_t);
}
void jim_free(void * ptr) {
void* region = ptr-sizeof(size_t);
if (munmap(region, *(size_t*)region) != 0) {
perror("Could not munmap");
}
}
I wrote this because I felt like it. This post is my own, and not associated with my employer.
Jim. Public speaking. Friends. Vidrio.