diff --git a/src/lib.rs b/src/lib.rs index 7089496..048cf5f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,12 +52,7 @@ pub extern fn rust_main(multiboot_information_address: usize) { kernel_start as usize, kernel_end as usize, multiboot_start, multiboot_end, memory_map_tag.memory_areas()); - for i in 0.. { - if let None = frame_allocator.allocate_frame() { - println!("allocated {} frames", i); - break; - } - } + memory::test_paging(&mut frame_allocator); loop{} } diff --git a/src/memory/mod.rs b/src/memory/mod.rs index 98b36e0..02dbf6a 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -1,4 +1,5 @@ pub use self::area_frame_allocator::AreaFrameAllocator; +pub use self::paging::test_paging; use self::paging::PhysicalAddress; mod area_frame_allocator; diff --git a/src/memory/paging/mod.rs b/src/memory/paging/mod.rs index a19264e..b2f59ed 100644 --- a/src/memory/paging/mod.rs +++ b/src/memory/paging/mod.rs @@ -151,3 +151,20 @@ impl ActivePageTable { allocator.deallocate_frame(frame); } } + + +pub fn test_paging(allocator: &mut A) + where A: FrameAllocator +{ + let mut page_table = unsafe { ActivePageTable::new() }; + + let addr = 42 * 512 * 512 * 4096; // 42th P3 entry + let page = Page::containing_address(addr); + let frame = allocator.allocate_frame().expect("no more frames"); + println!("None = {:?}, map to {:?}", + page_table.translate(addr), + frame); + page_table.map_to(page, frame, EntryFlags::empty(), allocator); + println!("Some = {:?}", page_table.translate(addr)); + println!("next free frame: {:?}", allocator.allocate_frame()); +}