LF OS
Hobby operating system for amd64 with high ambitions
Loading...
Searching...
No Matches
slab.c
Go to the documentation of this file.
1#include "slab.h"
2#include "bitmap.h"
3#include "string.h"
4#include "panic.h"
5
6void init_slab(ptr_t mem_start, ptr_t mem_end, size_t allocation_size) {
7 size_t mem_total = mem_end - mem_start;
8 size_t num_entries = mem_total / allocation_size;
9 size_t overhead = bitmap_size(num_entries) + sizeof(SlabHeader);
10
11 num_entries -= (overhead + allocation_size) / allocation_size;
12
13 SlabHeader* header = (SlabHeader*)mem_start;
14 header->allocation_size = allocation_size;
15 header->num_entries = num_entries;
16 header->bitmap_size = bitmap_size(num_entries);
17
18 bitmap_t bitmap = (bitmap_t)((ptr_t)header + sizeof(SlabHeader));
19 memset(bitmap, 0, header->bitmap_size);
20}
21
23 bitmap_t bitmap = (bitmap_t)((ptr_t)slab + sizeof(SlabHeader));
24
25 SlabIndexType idx;
26 for(idx = 0; idx < slab->num_entries && bitmap_get(bitmap, idx); ++idx);
27
28 if(idx < slab->num_entries) {
29 bitmap_set(bitmap, idx);
30 return slab_mem(slab, idx);
31 }
32
33 panic_message("Out of entries in slab allocator");
34 return 0;
35}
36
37void slab_free(SlabHeader* slab, ptr_t mem) {
38 bitmap_t bitmap = (bitmap_t)((ptr_t)slab + sizeof(SlabHeader));
39 bitmap_clear(bitmap, slab_index(slab, mem));
40}
41
struct acpi_table_header header
Definition acpi.c:0
uint64_t ptr_t
Definition arch.h:17
static bool bitmap_get(bitmap_t bitmap, uint64_t entry)
Retrieve state of the given entry from bitmap.
Definition bitmap.h:26
static size_t bitmap_size(size_t num_entries)
Return the size of the bitmap in bytes for a given amount of entries.
Definition bitmap.h:11
uint8_t * bitmap_t
Type for a single entry in the array.
Definition bitmap.h:8
static void bitmap_clear(bitmap_t bitmap, uint64_t entry)
Unset given entry in bitmap.
Definition bitmap.h:36
static void bitmap_set(bitmap_t bitmap, uint64_t entry)
Set given entry in bitmap.
Definition bitmap.h:31
void * memset(void *dest, int c, size_t size)
Definition string.c:72
void panic_message(const char *message)
Definition panic.c:64
void slab_free(SlabHeader *slab, ptr_t mem)
Definition slab.c:37
ptr_t slab_alloc(SlabHeader *slab)
Definition slab.c:22
void init_slab(ptr_t mem_start, ptr_t mem_end, size_t allocation_size)
Definition slab.c:6
SlabIndexType num_entries
Number of objects in this region.
Definition slab.h:15
static SlabIndexType slab_index(const SlabHeader *slab, const ptr_t mem)
Definition slab.h:76
static ptr_t slab_mem(const SlabHeader *slab, const SlabIndexType idx)
Definition slab.h:65
uint16_t SlabIndexType
Type for indexing objects in a Slab region.
Definition slab.h:7
Header of a Slab region.
Definition slab.h:10