aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--StrixKernel/src/main.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/StrixKernel/src/main.rs b/StrixKernel/src/main.rs
index 7351a4e..36df1be 100644
--- a/StrixKernel/src/main.rs
+++ b/StrixKernel/src/main.rs
@@ -28,6 +28,14 @@ use bootloader::{entry_point, BootInfo};
use core::panic::PanicInfo;
use strix_os::println;
+use x86_64::VirtAddr;
+use strix_os::{ allocator, memory, memory::BootInfoFrameAllocator };
+
+extern crate alloc;
+use alloc::{ boxed::Box, rc::Rc, vec, vec::Vec };
+
+
+
// Register kernel_main as the entry point.
// The bootloader crate uses this macro to generate the actual entry point code
// with the correct calling convention and stack setup.
@@ -68,6 +76,32 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! {
// Initialize all kernel subsystems (GDT, IDT, PICs, enable interrupts)
strix_os::init();
+ let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset);
+ let mut mapper = unsafe { memory::init(phys_mem_offset) };
+ let mut frame_allocator = unsafe { BootInfoFrameAllocator::init(&boot_info.memory_map) };
+
+ allocator::init_heap(&mut mapper, &mut frame_allocator)
+ .expect("heap initialization failed");
+
+
+ // allocate a number on the heap
+ let heap_value = Box::new(41);
+ println!("heap_value at {:p}", heap_value);
+
+ // create a dynamically sized vector
+ let mut vec = Vec::new();
+ for i in 0..500 {
+ vec.push(i);
+ }
+ println!("vec at {:p}", vec.as_slice());
+
+ // create a reference counted vector -> will be freed when count reaches 0
+ let reference_counted = Rc::new(vec![1, 2, 3]);
+ let cloned_reference = reference_counted.clone();
+ println!("current reference count is {}", Rc::strong_count(&cloned_reference));
+ core::mem::drop(reference_counted);
+ println!("reference count is {} now", Rc::strong_count(&cloned_reference));
+
// In test mode, run the test harness instead of normal operation
#[cfg(test)]
test_main();