summaryrefslogtreecommitdiff
path: root/src/kernel/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/kernel.c')
-rw-r--r--src/kernel/kernel.c34
1 files changed, 31 insertions, 3 deletions
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 );
+
+}
+
+