From 57d66236b76a7a66ce8057bc8fe197273d8159bb Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 7 Sep 2020 22:02:52 -0600 Subject: [PATCH] WIP buddy allocator free pages using bitmap --- src/main.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index d6518aa137..a1254a20e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -326,7 +326,33 @@ impl BuddyAllocator { if base >= entry.base && base.add(size) <= entry.base.add(entry.size) { println!("{:X}:{:X} inside of {:X}:{:X}", base.data(), size, entry.base.data(), entry.size); - //TODO + //TODO: Correct logic + let pages = size / A::PAGE_SIZE; + for page in 0 .. pages { + let page_base = base.add(page * A::PAGE_SIZE); + let index = (page_base.data() - entry.base.data()) / A::PAGE_SIZE; + let mut map_page = index / Self::MAP_PAGE_BITS; + let map_bit = index % Self::MAP_PAGE_BITS; + println!("index {} => map_page {}, map_bit {}", index, map_page, map_bit); + + //TODO: improve performance + let mut map_phys = entry.map; + loop { + if map_phys.data() == 0 { unimplemented!() } + let map_virt = A::phys_to_virt(map_phys); + if map_page == 0 { + let map_byte_virt = map_virt.add(map_bit / 8); + let mut value: u8 = A::read(map_byte_virt); + value |= 1 << (map_bit % 8); + A::write(map_byte_virt, value); + return; + } else { + let footer = A::read::(map_virt); + map_phys = footer.next; + map_page -= 1; + } + } + } } } }