/
allocator.c
78 lines (56 loc) · 1.5 KB
/
allocator.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Jesse Kennedy
// Operating Systems Project
// Fall 2015
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#define PAGESIZE 4096
#define SIZES 10
void __attribute__ ((constructor)) shim_init(void);
void __attribute__ ((destructor)) shim_cleanup(void);
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
typedef struct blockheader {
//int size;
//void *payload;
struct blockheader *next;
} blockheader_t;
typedef struct pageheader {
blockheader_t *free_l, *alloc_l;
struct pageheader *next;
} pageheader_t;
//int fd = open("/dev/zero", O_RDONLY);
pageheader_t pages[SIZES]; // Allocate an array of page headers to hold 2..1024 sized blocks
void page_init(pageheader_t *page, size_t size) {
//page->next = NULL;
blockheader_t *cursor = (void *) page + sizeof(pageheader_t); // Advance cursor to beginning of data area
blockheader_t *end = (void *) page + PAGESIZE;
size_t blocksize = sizeof(blockheader_t) + size;
while (cursor + blocksize < end) {
cursor->next = page->free_l;
page->free_l = cursor;
cursor += blocksize;
}
}
void shim_init(void) {
for (int i = 1; i <= SIZES; i++) {
page_init(&pages[i], 1 << i);
}
}
void *malloc(size_t size) {
blockheader_t *block;
return block;
}
void free(void *ptr) {
}
void *calloc(size_t nmemb, size_t size) {
}
void *realloc(void *ptr, size_t size) {
}
void shim_cleanup(void) {
}