From 5e03409586efc37931f07b40ee0c71a9a9e109f7 Mon Sep 17 00:00:00 2001 From: salmonik Date: Fri, 31 Jul 2026 15:51:28 +0200 Subject: rsnix: memory management — free-list heap, bitmap pages, paging adoption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - uefi.rs: full EfiMemoryType constants (0-14) + memory_type_name(); fix MEMORY_TYPE_LOADER_DATA from 6 to 2 per the UEFI spec - memory.rs: replace the bump allocator with a first-fit free-list heap (splitting, coalescing, 8-byte back-pointer for alignment-safe free); add a bitmap physical page allocator (heap region reserved, page-0 guard, aligned runs); grow the heap from the page allocator on demand - paging.rs: identity page-table helpers — adopt_tables() rebuilds the firmware map into our own tables (OVMF maps its tables read-only, so the firmware tree can't be modified in place) and switches CR3; map_page/unmap_page/is_mapped with 2 MB/1 GB large-page splitting - main.rs: boot self-tests for heap, pages, and paging --- rsdos/src/main.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'rsdos/src') diff --git a/rsdos/src/main.rs b/rsdos/src/main.rs index 543556b..1169785 100644 --- a/rsdos/src/main.rs +++ b/rsdos/src/main.rs @@ -106,6 +106,38 @@ pub extern "efiapi" fn efi_main(image_handle: Handle, system_table: *mut SystemT dump_memory_summary(); + if rsnix::memory::self_test() { + rsnix::serial_println!("heap: self-test OK (alloc/free/coalesce)"); + } else { + rsnix::serial_println!("heap: self-test FAILED"); + } + + if rsnix::memory::init_page_allocator() { + rsnix::serial_println!("pages: bitmap allocator ready"); + } else { + rsnix::serial_println!("pages: init FAILED"); + } + if rsnix::memory::page_self_test() { + rsnix::serial_println!("pages: self-test OK (alloc/free/runs)"); + } else { + rsnix::serial_println!("pages: self-test FAILED"); + } + + if rsnix::paging::adopt_tables() { + rsnix::serial_println!( + "pg: adopted own page tables (cr3={:#x})", + rsnix::paging::cr3() + ); + } else { + rsnix::serial_println!("pg: adopt_tables FAILED"); + } + + if rsnix::paging::self_test() { + rsnix::serial_println!("pg: self-test OK (map/unmap/split)"); + } else { + rsnix::serial_println!("pg: self-test FAILED"); + } + rsnix::serial_println!("boot: entering shell"); shell::run(); } -- cgit v1.2.3