Mercurial > lcfOS
diff cos/kernel/malloc.c @ 24:d8627924d40d
Split up in more files and reboot command
author | windel |
---|---|
date | Fri, 02 Dec 2011 14:00:02 +0100 |
parents | |
children | d3c4bf3720a3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cos/kernel/malloc.c Fri Dec 02 14:00:02 2011 +0100 @@ -0,0 +1,76 @@ +#include "kernel.h" + +#define HEAP_MAGIC 0xc0ffee +#define HEAP_START 0x400000 +#define HEAP_SIZE 0x200000 +#define HEAP_INUSE 1 +#define HEAP_FREE 0 + +typedef struct { + uint64_t magic; + uint64_t state; + uint64_t size; +} heap_t; + +/* + malloc and free divide the chunks of memory present at the heap + of the kernel into smaller parts. + The heap is located at: 0x +*/ +static heap_t* kernel_heap = (heap_t*) 0x400000; // 4 MB - 6 MB is heap +/* Allocates 'size' bytes and returns the pointer if succesfull. + Kernelpanic in case of failure.. +*/ + +void* kmalloc(uint64_t size) { + // printf("Malloc %d bytes\n", size); + + // Start at the beginning of our heap and search a free block: + heap_t *current = kernel_heap; + while (current->magic == HEAP_MAGIC) + { + if ((current->state == HEAP_FREE) && (current->size >= size)) + { + // Mark block as used: + current->state = HEAP_INUSE; + + // Insert a heap header if required: + if (current->size > size + sizeof(heap_t) + 1) + { + // Calculate location of the inserted header: + heap_t *newheader = (heap_t*) (((char*)current)+size+sizeof(heap_t)); + + // Set the new header fields: + newheader->size = current->size - size - sizeof(heap_t); + newheader->state = HEAP_FREE; + newheader->magic = HEAP_MAGIC; + + // Set the size of this block + current->size = size; + } + else + { + // We allocate this whole block + } + // Calculate the size of the block: + char *address = ((char*)current)+sizeof(heap_t); + return address; + + } + // Goto next heap block: + current = (heap_t*)(((char*) current) + current->size + sizeof(heap_t)); + } + return 0x0; +} + +void kfree(void* ptr) { + printf("Free address %x\n", ptr); +} + +void init_heap(void) +{ + // Initialize the kernel heap: + kernel_heap->magic = HEAP_MAGIC; + kernel_heap->state = HEAP_FREE; + kernel_heap->size = HEAP_SIZE - sizeof(heap_t); +}