From 09098f0d2f5053e7db0711f265cc4fe74f50d879 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Thu, 26 Apr 2018 16:23:54 +0800 Subject: [PATCH] Add physical mod and reorganize. --- crate/memory/src/lib.rs | 6 ++- crate/memory/src/paging/mod.rs | 4 ++ .../page_table/mock_page_table.rs | 0 .../memory/src/{ => paging}/page_table/mod.rs | 3 +- crate/memory/src/physical/frame.rs | 33 ++++++++++++ .../src/physical/frame_allocator/mod.rs | 11 ++++ crate/memory/src/physical/mod.rs | 9 ++++ crate/memory/src/physical/physaddr.rs | 50 +++++++++++++++++++ crate/memory/src/swap/enhanced_clock.rs | 2 +- crate/memory/src/swap/fifo.rs | 2 +- crate/memory/src/swap/mod.rs | 2 +- 11 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 crate/memory/src/paging/mod.rs rename crate/memory/src/{ => paging}/page_table/mock_page_table.rs (100%) rename crate/memory/src/{ => paging}/page_table/mod.rs (82%) create mode 100644 crate/memory/src/physical/frame.rs create mode 100644 crate/memory/src/physical/frame_allocator/mod.rs create mode 100644 crate/memory/src/physical/mod.rs create mode 100644 crate/memory/src/physical/physaddr.rs diff --git a/crate/memory/src/lib.rs b/crate/memory/src/lib.rs index 4f08587..e9dc3de 100644 --- a/crate/memory/src/lib.rs +++ b/crate/memory/src/lib.rs @@ -3,8 +3,10 @@ extern crate alloc; +pub mod physical; +pub mod paging; pub mod memory_set; pub mod swap; -pub mod page_table; -type VirtAddr = usize; \ No newline at end of file +type VirtAddr = usize; +const PAGE_SIZE: usize = 4096; \ No newline at end of file diff --git a/crate/memory/src/paging/mod.rs b/crate/memory/src/paging/mod.rs new file mode 100644 index 0000000..cd6f6b6 --- /dev/null +++ b/crate/memory/src/paging/mod.rs @@ -0,0 +1,4 @@ +pub use self::page_table::*; +use super::*; + +mod page_table; \ No newline at end of file diff --git a/crate/memory/src/page_table/mock_page_table.rs b/crate/memory/src/paging/page_table/mock_page_table.rs similarity index 100% rename from crate/memory/src/page_table/mock_page_table.rs rename to crate/memory/src/paging/page_table/mock_page_table.rs diff --git a/crate/memory/src/page_table/mod.rs b/crate/memory/src/paging/page_table/mod.rs similarity index 82% rename from crate/memory/src/page_table/mod.rs rename to crate/memory/src/paging/page_table/mod.rs index d10f652..8e1752d 100644 --- a/crate/memory/src/page_table/mod.rs +++ b/crate/memory/src/paging/page_table/mod.rs @@ -1,6 +1,7 @@ use super::*; +pub use self::mock_page_table::MockPageTable; -pub mod mock_page_table; +mod mock_page_table; pub trait PageTable { fn accessed(&self, addr: VirtAddr) -> bool; diff --git a/crate/memory/src/physical/frame.rs b/crate/memory/src/physical/frame.rs new file mode 100644 index 0000000..d88b1a1 --- /dev/null +++ b/crate/memory/src/physical/frame.rs @@ -0,0 +1,33 @@ +use super::*; + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Frame { + number: usize, +} + +impl Frame { + pub fn containing_address(address: PhysAddr) -> Frame { + Frame{ number: address.get() as usize / PAGE_SIZE } + } + //TODO: Set private + pub fn start_address(&self) -> PhysAddr { + PhysAddr::new((self.number * PAGE_SIZE) as u64) + } + + pub fn clone(&self) -> Frame { + Frame { number: self.number } + } + //TODO: Set private +// pub fn range_inclusive(start: Frame, end: Frame) -> FrameIter { +// FrameIter { +// start: start, +// end: end, +// } +// } +} + +impl Drop for Frame { + fn drop(&mut self) { + panic!("frame must be deallocate"); + } +} diff --git a/crate/memory/src/physical/frame_allocator/mod.rs b/crate/memory/src/physical/frame_allocator/mod.rs new file mode 100644 index 0000000..80c508d --- /dev/null +++ b/crate/memory/src/physical/frame_allocator/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +pub trait FrameAllocator { + fn allocate_frame(&mut self) -> Option; + fn deallocate_frame(&mut self, frame: Frame); +} + +pub trait MemoryArea { + fn begin(&self) -> PhysAddr; + fn end(&self) -> PhysAddr; +} \ No newline at end of file diff --git a/crate/memory/src/physical/mod.rs b/crate/memory/src/physical/mod.rs new file mode 100644 index 0000000..02e9ca4 --- /dev/null +++ b/crate/memory/src/physical/mod.rs @@ -0,0 +1,9 @@ +pub use self::physaddr::PhysAddr; +pub use self::frame::Frame; +pub use self::frame_allocator::FrameAllocator; + +use super::*; + +mod frame; +mod physaddr; +mod frame_allocator; \ No newline at end of file diff --git a/crate/memory/src/physical/physaddr.rs b/crate/memory/src/physical/physaddr.rs new file mode 100644 index 0000000..3da6871 --- /dev/null +++ b/crate/memory/src/physical/physaddr.rs @@ -0,0 +1,50 @@ +use core::fmt; + +/// Represents a physical memory address +#[derive(Copy, Clone, Eq, Ord, PartialEq, PartialOrd)] +pub struct PhysAddr(u64); + +impl PhysAddr { + pub fn new(addr: u64) -> PhysAddr { + PhysAddr(addr) + } + pub fn get(&self) -> u64 { + self.0 + } +} + +impl fmt::Debug for PhysAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:#x}", self.0) + } +} + +impl fmt::Binary for PhysAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +impl fmt::Display for PhysAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +impl fmt::LowerHex for PhysAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +impl fmt::Octal for PhysAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +impl fmt::UpperHex for PhysAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} \ No newline at end of file diff --git a/crate/memory/src/swap/enhanced_clock.rs b/crate/memory/src/swap/enhanced_clock.rs index 64f8a9e..c495d8d 100644 --- a/crate/memory/src/swap/enhanced_clock.rs +++ b/crate/memory/src/swap/enhanced_clock.rs @@ -81,7 +81,7 @@ mod test { use alloc::{arc::Arc, boxed::Box}; use core::mem::uninitialized; use core::cell::RefCell; - use page_table::mock_page_table::MockPageTable; + use paging::MockPageTable; impl SwappablePageTable for MockPageTable { fn swap_out(&mut self, addr: usize) -> Result<(), ()> { diff --git a/crate/memory/src/swap/fifo.rs b/crate/memory/src/swap/fifo.rs index 1550c57..9e1213e 100644 --- a/crate/memory/src/swap/fifo.rs +++ b/crate/memory/src/swap/fifo.rs @@ -39,7 +39,7 @@ mod test { use super::*; use alloc::{arc::Arc, boxed::Box}; use core::cell::RefCell; - use page_table::mock_page_table::MockPageTable; + use paging::MockPageTable; enum MemOp { R(usize), W(usize) diff --git a/crate/memory/src/swap/mod.rs b/crate/memory/src/swap/mod.rs index 5b9c108..292e425 100644 --- a/crate/memory/src/swap/mod.rs +++ b/crate/memory/src/swap/mod.rs @@ -2,7 +2,7 @@ pub use self::fifo::FifoSwapManager; pub use self::enhanced_clock::EnhancedClockSwapManager; use super::*; -use super::page_table::PageTable; +use super::paging::PageTable; mod fifo; mod enhanced_clock;