From f1459a552cff88740aebf56541ec57eefc2e3b03 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Tue, 18 Apr 2017 18:18:18 +0200 Subject: [PATCH] Return a memory controller from memory::init --- src/memory/mod.rs | 17 +++++++++++++++-- src/memory/paging/mod.rs | 11 ++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/memory/mod.rs b/src/memory/mod.rs index 22970bd..2dde292 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -11,8 +11,7 @@ mod stack_allocator; pub const PAGE_SIZE: usize = 4096; - -pub fn init(boot_info: &BootInformation) { +pub fn init(boot_info: &BootInformation) -> MemoryController { assert_has_not_been_called!("memory::init must be called only once"); let memory_map_tag = boot_info.memory_map_tag().expect( @@ -50,6 +49,20 @@ pub fn init(boot_info: &BootInformation) { for page in Page::range_inclusive(heap_start_page, heap_end_page) { active_table.map(page, paging::WRITABLE, &mut frame_allocator); } + + let stack_allocator = { + let stack_alloc_start = heap_end_page + 1; + let stack_alloc_end = stack_alloc_start + 100; + let stack_alloc_range = Page::range_inclusive(stack_alloc_start, + stack_alloc_end); + stack_allocator::StackAllocator::new(stack_alloc_range) + }; + + MemoryController { + active_table: active_table, + frame_allocator: frame_allocator, + stack_allocator: stack_allocator, + } } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] diff --git a/src/memory/paging/mod.rs b/src/memory/paging/mod.rs index 98b150c..36a6dcb 100644 --- a/src/memory/paging/mod.rs +++ b/src/memory/paging/mod.rs @@ -1,6 +1,6 @@ pub use self::entry::*; pub use self::mapper::Mapper; -use core::ops::{Deref, DerefMut}; +use core::ops::{Deref, DerefMut, Add}; use core::ptr::Unique; use memory::{PAGE_SIZE, Frame, FrameAllocator}; use multiboot2::BootInformation; @@ -55,6 +55,15 @@ impl Page { } } +impl Add for Page { + type Output = Page; + + fn add(self, rhs: usize) -> Page { + Page { number: self.number + rhs } + } +} + + #[derive(Clone)] pub struct PageIter { start: Page,