diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-07-10 21:04:18 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-07-10 21:04:18 +0200 |
commit | 573b82fd2d46ebca7f98e5323e9f18e593a7996f (patch) | |
tree | 643d480130d1a6ac2639d63b384f43ca9cd82d83 /src/kernel | |
parent | ea3afaaf2e1926328ca94fa1227c49631adaf5e7 (diff) | |
download | abaos-573b82fd2d46ebca7f98e5323e9f18e593a7996f.tar.gz abaos-573b82fd2d46ebca7f98e5323e9f18e593a7996f.tar.bz2 |
VGA Z-buffer is now dynamically allocated and freed
memory management can reuse the last pointer malloced if freed again
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/kernel.c | 13 | ||||
-rw-r--r-- | src/kernel/memorymanagement.c | 15 | ||||
-rw-r--r-- | src/kernel/memorymanagement.h | 1 |
3 files changed, 21 insertions, 8 deletions
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index f2210d6..c0bc285 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -91,13 +91,14 @@ void kernel_main( void ) // TODO: get memupper from multiboot header (but this needs // a multiboot compliant entry function first) or use BIOS // functions to determine size of memory, for now assume we - // have at least, for now use the memory above 1 MB, 64 MB - // heap is enough for what we are doing in the kernel - memory_manager_init( &global_context.memory_manager, 0x100000, 0xFFFF ); + // have at least, for now use the memory above 1 MB, 128 KB + // heap is enough for what we are doing in the kernel plus + // eventual z buffering the VGA graphic mode + uint32_t heap_offset = 0x01000000; + size_t heap_size = 128 * 1024; + memory_manager_init( &global_context.memory_manager, heap_offset, heap_size ); __stdlib_set_memory_manager( &global_context.memory_manager ); - printf( "Kernel heap at 0x%X, size 0x%X\n", 0x100000, 0xFFFF ); - void *test = malloc( 2048 ); - free( test ); + printf( "Kernel heap at 0x%X, size 0x%X\n", heap_offset, heap_size ); // exit point in case of kernel panic, do this as soon as // possible, as soon we have an early console we can croak on diff --git a/src/kernel/memorymanagement.c b/src/kernel/memorymanagement.c index dc2d160..b8a84b2 100644 --- a/src/kernel/memorymanagement.c +++ b/src/kernel/memorymanagement.c @@ -11,6 +11,7 @@ void memory_manager_init( memory_manager_t *memory_manager, size_t offset, size_ memory_manager->offset = offset; memory_manager->size = size; memory_manager->free_ptr = offset; + memory_manager->prev_ptr = 0xFFFFFFFF; } void *memory_manager_allocate( memory_manager_t *memory_manager, size_t size ) @@ -19,10 +20,11 @@ void *memory_manager_allocate( memory_manager_t *memory_manager, size_t size ) if( memory_manager->free_ptr - memory_manager->offset + size > memory_manager->size ) { kernel_panic( "Heap allocation out of memory (requested %d bytes, available %d)", - size, size - ( memory_manager->free_ptr - memory_manager->offset ) - 1 ); + size, size - ( memory_manager->free_ptr - memory_manager->offset ) ); } p = (void *)memory_manager->free_ptr; + memory_manager->prev_ptr = memory_manager->free_ptr; memory_manager->free_ptr += size; return p; @@ -34,7 +36,16 @@ void memory_manager_deallocate( memory_manager_t *memory_manager, void **p ) kernel_panic( "Double free of pointer 0x%X in heap", *p ); } - *p = NULL; + // This actually doesn't work and we do it outside after free, when + // a buffer has an optional semantic + //*p = NULL; + + // are we freeing the previously allocated block, if yes, we can + // adjust the free pointer + if( (uint32_t)*p == memory_manager->prev_ptr ) { + memory_manager->free_ptr = memory_manager->prev_ptr; + memory_manager->prev_ptr = 0xFFFFFFFF; + } } diff --git a/src/kernel/memorymanagement.h b/src/kernel/memorymanagement.h index 16f0b29..647c05d 100644 --- a/src/kernel/memorymanagement.h +++ b/src/kernel/memorymanagement.h @@ -6,6 +6,7 @@ typedef struct { size_t offset; size_t size; + uint32_t prev_ptr; uint32_t free_ptr; } memory_manager_t; |