From c55bc80baa51dc1028cbbae8a02540cfe4c56557 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Wed, 5 Jul 2017 13:53:42 +0200 Subject: 'mem' command shows memory usage of kernel heap now implemented a malloc/free and memory manager (simplest possible implementation, just allocating linearly and never freeing) --- src/kernel/kernel.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'src/kernel/kernel.c') diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index a9802e1..a6594f6 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -42,6 +42,7 @@ typedef struct { vga_text_t vga_text; driver_manager_t driver_manager; task_manager_t task_manager; + memory_manager_t memory_manager; vga_t vga; mode_t mode; mouse_t mouse; @@ -60,6 +61,7 @@ static void refresh_screen( void ); static void switch_to_graphics_mode( global_context_t *global_context ); static void switch_to_text_mode( global_context_t *global_context ); static void print_task_status( global_context_t *global_context ); +static void print_memory_status( global_context_t *global_context ); // must be first entry in kernel.bin (0x8800) as stage 2 of // the boot loader expects the entry point to be here! @@ -78,13 +80,25 @@ void kernel_main( void ) console_init( &console ); console_add_vga_text_output( &console, &global_context.vga_text ); console_add_serial_output( &console, &serial ); - + // initialize the early console of the kernel - stdio_set_console( &console ); + __stdio_set_console( &console ); puts( "Started early kernel console" ); // TODO: get those values somehow from the boot loader printf( "Kernel code and data is at 0x%X, kernel stack at 0x%X\n", 0x8800, 0x90000 ); + // initialize memory management first, we may need it + // 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 ); + __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 ); + // exit point in case of kernel panic, do this as soon as // possible, as soon we have an early console we can croak on if( setjmp( panic_jmp_buf ) > 0 ) { @@ -211,7 +225,7 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) } else if( strcmp( buf, "halt" ) == 0 ) { longjmp( panic_jmp_buf, 0 ); } else if( strcmp( buf, "mem" ) == 0 ) { - // TODO: print memory usage + print_memory_status( global_context ); } else if( strcmp( buf, "task" ) == 0 ) { print_task_status( global_context ); } else if( strcmp( buf, "driver" ) == 0 ) { @@ -411,3 +425,17 @@ static void print_task_status( global_context_t *global_context ) } } +static void print_memory_status( global_context_t *global_context ) +{ + memory_manager_t *memory_manager = &global_context->memory_manager; + + printf( "heap memory size: %d\n", memory_manager->size ); + printf( "heap memory offset: 0x%X\n", memory_manager->offset ); + printf( "heap memory in use: %d\n", + memory_manager->free_ptr - memory_manager->offset ); + printf( "heap memory free: %d\n", + memory_manager->size - ( memory_manager->free_ptr - memory_manager->offset ) - 1 ); + +} + + -- cgit v1.2.3-54-g00ecf