#pragma once // boolean types #include // size_t, already in libft.h but for readability #include // Remove this and replace it with header // for debugging purposes // BPZ = Blocks Per Zone, which is the max // number of blocks for a new zone enum { BPZ = 128, PAGES_TINY = 16, PAGES_SMALL = 64, MEM_ALIGN = 4 }; typedef enum { TINY, SMALL, LARGE } block_type_t; /* METADATA: * ptr: the ptr to return with kmalloc (aligned) * size: the actual size * sub_size: the size asked by the user (different * from size only if krealloc and krealloc size < size) * in_use: bool to track block state * zone: the zone containing the block * * LINKED LIST: * next and prev will never change, it's the original block's * position (initialized when creating the blocks) * next/prev_used: linked list for the * in_use blocks (Block *used in struct Zone) * next/prev_free: linked list for the * available blocks (Block *free in struct Zone) */ typedef struct Block { void *ptr; size_t size; size_t sub_size; bool in_use; struct Zone *zone; struct Block *prev; struct Block *next; struct Block *prev_used; struct Block *next_used; struct Block *prev_free; struct Block *next_free; } Block; /* free is the first list, when creating the blocks * used is a list at the end of the free list, which contains all the blocks * in_use */ typedef struct Zone { Block *free; Block *used; size_t size; struct Zone *prev; struct Zone *next; block_type_t type; } Zone; /* Linked list to store all the zones (pages) mapped. * The attribute type is either TINY, SMALL or LARGE. * For TINY and SMALL, the zone will be divided in blocks. * For LARGE, it will be entire page(s). */ extern Zone *kzones[3]; extern Zone *vzones[3]; /*----------- UTILS ----------*/ block_type_t get_type(size_t size); size_t get_zone_size(block_type_t type); size_t align_mem(size_t addr); /*----------------------------*/ /*-------- ALLOCATOR ---------*/ int new_kzone(block_type_t type, size_t size); int new_vzone(block_type_t type, size_t size); /*----------------------------*/ void *kmalloc(size_t size); void kfree(void *ptr); void *krealloc(void *ptr, size_t size); void *vmalloc(size_t size); void vfree(void *ptr); void *vrealloc(void *ptr, size_t size); void show_kalloc_mem(void); void show_valloc_mem(void); size_t ksize(void *virt_addr); size_t vsize(void *virt_addr);