From b314d4827fb97e1fa906496420a2ae04e01bb5ae Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 7 Dec 2015 10:56:26 +0100 Subject: [PATCH] Move Frame::start_address to memory/mod.rs and use it in identity_map() --- posts/DRAFT-paging.md | 14 ++++++-------- src/memory/mod.rs | 5 +++++ src/memory/paging/entry.rs | 6 ------ src/memory/paging/mod.rs | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/posts/DRAFT-paging.md b/posts/DRAFT-paging.md index a088a6c2..04461493 100644 --- a/posts/DRAFT-paging.md +++ b/posts/DRAFT-paging.md @@ -130,18 +130,16 @@ pub fn set(&mut self, frame: Frame, flags: EntryFlags) { ``` The start address of a frame should be page aligned and smaller than 2^52 (since x86 uses 52bit physical addresses). Since an invalid address could mess up the entry, we add an assertion. To actually set the entry, we just need to `or` the start address and the flag bits. -The missing `start_address` function is pretty simple: +The missing `Frame::start_address` method is pretty simple: ```rust -use memory::paging::PhysicalAddress; +use self::paging::PhysicalAddress; -impl Frame { - fn start_address(&self) -> PhysicalAddress { - self.number << 12 - } +fn start_address(&self) -> PhysicalAddress { + self.number * PAGE_SIZE } ``` -Since we only need it in the entry submodule, we put it in a new `impl Frame` block in `entry.rs`. +We add it to the `impl Frame` block in `memory/mod.rs`. ### Page Tables To model page tables, we create a basic `Table` struct in a new `table` submodule: @@ -640,7 +638,7 @@ pub fn identity_map(&mut self, allocator: &mut A) where A: FrameAllocator { - let page = Page { number: frame.number }; + let page = Page::containing_address(frame.start_address()); self.map_to(&page, frame, flags, allocator) } ``` diff --git a/src/memory/mod.rs b/src/memory/mod.rs index 57335343..7bf5033d 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -1,4 +1,5 @@ pub use self::area_frame_allocator::AreaFrameAllocator; +use self::paging::PhysicalAddress; pub mod paging; mod area_frame_allocator; @@ -14,6 +15,10 @@ impl Frame { fn containing_address(address: usize) -> Frame { Frame { number: address / PAGE_SIZE } } + + fn start_address(&self) -> PhysicalAddress { + self.number * PAGE_SIZE + } } pub trait FrameAllocator { diff --git a/src/memory/paging/entry.rs b/src/memory/paging/entry.rs index 1048f469..ce6f2c82 100644 --- a/src/memory/paging/entry.rs +++ b/src/memory/paging/entry.rs @@ -44,9 +44,3 @@ bitflags! { const NO_EXECUTE = 1 << 63, } } - -impl Frame { - fn start_address(&self) -> PhysicalAddress { - self.number << 12 - } -} diff --git a/src/memory/paging/mod.rs b/src/memory/paging/mod.rs index 471bf876..10548a50 100644 --- a/src/memory/paging/mod.rs +++ b/src/memory/paging/mod.rs @@ -150,7 +150,7 @@ impl RecursivePageTable { pub fn identity_map(&mut self, frame: Frame, flags: EntryFlags, allocator: &mut A) where A: FrameAllocator { - let page = Page { number: frame.number }; + let page = Page::containing_address(frame.start_address()); self.map_to(&page, frame, flags, allocator) }