diff --git a/src/memory/mod.rs b/src/memory/mod.rs index d29928f1..2dbeef9a 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -43,7 +43,18 @@ pub fn init(boot_info: &BootInformation) { boot_info.start_address(), boot_info.end_address(), memory_map_tag.memory_areas()); - paging::remap_the_kernel(&mut frame_allocator, boot_info); + let mut active_table = paging::remap_the_kernel(&mut frame_allocator, + boot_info); + + use self::paging::{Page, WRITABLE}; + use bump_allocator::{HEAP_START, HEAP_SIZE}; + + let heap_start_page = Page::containing_address(HEAP_START); + let heap_end_page = Page::containing_address(HEAP_START + HEAP_SIZE-1); + + for page in Page::range_inclusive(heap_start_page, heap_end_page) { + active_table.map(page, paging::WRITABLE, &mut frame_allocator); + } } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] diff --git a/src/memory/paging/mod.rs b/src/memory/paging/mod.rs index bce6d3cf..684b0f30 100644 --- a/src/memory/paging/mod.rs +++ b/src/memory/paging/mod.rs @@ -24,7 +24,7 @@ const ENTRY_COUNT: usize = 512; pub type PhysicalAddress = usize; pub type VirtualAddress = usize; -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct Page { number: usize, } @@ -53,6 +53,32 @@ impl Page { fn p1_index(&self) -> usize { (self.number >> 0) & 0o777 } + + pub fn range_inclusive(start: Page, end: Page) -> PageIter { + PageIter { + start: start, + end: end, + } + } +} + +pub struct PageIter { + start: Page, + end: Page, +} + +impl Iterator for PageIter { + type Item = Page; + + fn next(&mut self) -> Option { + if self.start <= self.end { + let page = self.start; + self.start.number += 1; + Some(page) + } else { + None + } + } } pub struct ActivePageTable { @@ -142,6 +168,7 @@ impl InactivePageTable { } pub fn remap_the_kernel(allocator: &mut A, boot_info: &BootInformation) + -> ActivePageTable where A: FrameAllocator { let mut temporary_page = TemporaryPage::new(Page { number: 0xcafebabe }, allocator); @@ -196,4 +223,6 @@ pub fn remap_the_kernel(allocator: &mut A, boot_info: &BootInformation) let old_p4_page = Page::containing_address(old_table.p4_frame.start_address()); active_table.unmap(old_p4_page, allocator); println!("guard page at {:#x}", old_p4_page.start_address()); + + active_table }