pub use self::area_frame_allocator::AreaFrameAllocator; pub use self::paging::remap_the_kernel; use self::paging::PhysicalAddress; mod area_frame_allocator; pub mod heap_allocator; mod paging; pub const PAGE_SIZE: usize = 4096; #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Frame { number: usize, } impl Frame { fn containing_address(address: usize) -> Frame { Frame{ number: address / PAGE_SIZE } } fn start_address(&self) -> PhysicalAddress { self.number * PAGE_SIZE } fn clone(&self) -> Frame { Frame { number: self.number } } fn range_inclusive(start: Frame, end: Frame) -> FrameIter { FrameIter { start: start, end: end, } } } struct FrameIter { start: Frame, end: Frame, } impl Iterator for FrameIter { type Item = Frame; fn next(&mut self) -> Option { if self.start <= self.end { let frame = self.start.clone(); self.start.number += 1; Some(frame) } else { None } } } pub trait FrameAllocator { fn allocate_frame(&mut self) -> Option; fn deallocate_frame(&mut self, frame: Frame); }