stack stuff for willy wonka

This commit is contained in:
Jack Halford 2018-04-15 18:12:51 +02:00
parent 700b8a4e00
commit e1f8c3f9ca
3 changed files with 24 additions and 12 deletions

View file

@ -1,14 +1,15 @@
mod bump; mod bump;
mod recycle; mod recycle;
// mod stack_allocator; mod stack_allocator;
use multiboot2; use multiboot2;
use x86::structures::paging::*; use x86::structures::paging::*;
use x86::*;
use spin::Mutex; use spin::Mutex;
use self::bump::BumpFrameAllocator; use self::bump::BumpFrameAllocator;
use self::recycle::RecycleAllocator; use self::recycle::RecycleAllocator;
// use self::stack_allocator::StackAllocator; use self::stack_allocator::StackAllocator;
pub trait FrameAllocator { pub trait FrameAllocator {
fn allocate_frames(&mut self, size: usize) -> Option<PhysFrame>; fn allocate_frames(&mut self, size: usize) -> Option<PhysFrame>;
@ -17,7 +18,7 @@ pub trait FrameAllocator {
pub struct MemoryControler { pub struct MemoryControler {
frame_allocator: RecycleAllocator<BumpFrameAllocator>, frame_allocator: RecycleAllocator<BumpFrameAllocator>,
// stack_allocator: StackAllocator, stack_allocator: StackAllocator,
} }
static MEMORY_CONTROLER: Mutex<Option<MemoryControler>> = Mutex::new(None); static MEMORY_CONTROLER: Mutex<Option<MemoryControler>> = Mutex::new(None);
@ -50,16 +51,19 @@ pub fn init(boot_info: &multiboot2::BootInformation) {
let frame_allocator = RecycleAllocator::new(bump_allocator); let frame_allocator = RecycleAllocator::new(bump_allocator);
// let stack_allocator = { let heap_end_page =
// let stack_alloc_start = heap_end_page + 1; Page::containing_address(VirtAddr::new(::HEAP_START as u32 + ::HEAP_SIZE as u32 - 1));
// let stack_alloc_end = stack_alloc_start + 100;
// let stack_alloc_range = stack_alloc_start..stack_alloc_end + 1; let stack_allocator = {
// StackAllocator::new(stack_alloc_range) let stack_alloc_start = heap_end_page + 1;
// }; let stack_alloc_end = stack_alloc_start + 100;
let stack_alloc_range = stack_alloc_start..stack_alloc_end + 1;
StackAllocator::new(stack_alloc_range)
};
*MEMORY_CONTROLER.lock() = Some(MemoryControler { *MEMORY_CONTROLER.lock() = Some(MemoryControler {
frame_allocator, frame_allocator,
// stack_allocator, stack_allocator,
}); });
} }
@ -79,6 +83,14 @@ pub fn deallocate_frames(frame: PhysFrame, count: usize) {
} }
} }
pub fn allocate_stack() {
if let Some(ref mut controler) = *MEMORY_CONTROLER.lock() {
controler.stack_allocator.allocate_stack()
} else {
panic!("frame allocator not initialized!");
}
}
/// Init memory module after core /// Init memory module after core
/// Must be called once, and only once, /// Must be called once, and only once,
pub fn init_noncore() { pub fn init_noncore() {

View file

@ -34,7 +34,7 @@ impl StackAllocator {
StackAllocator { range } StackAllocator { range }
} }
pub fn alloc_stack<FA: FrameAllocator>( pub fn allocate_stack<FA: FrameAllocator>(
&mut self, &mut self,
active_table: &mut ActivePageTable, active_table: &mut ActivePageTable,
frame_allocator: &mut FA, frame_allocator: &mut FA,

@ -1 +1 @@
Subproject commit f5e4cb879953ebbeba28a1eaa28bf531424e6824 Subproject commit 2a8416d0af403786d082695d13a0f74cd2b7f216