pub use arch::paging::*; use bit_allocator::{BitAlloc, BitAlloc4K, BitAlloc64K}; use consts::MEMORY_OFFSET; use sync::{MutexGuard, Spin}; use sync::SpinLock as Mutex; use super::HEAP_ALLOCATOR; use ucore_memory::{*, paging::PageTable}; use ucore_memory::cow::CowExt; pub use ucore_memory::memory_set::{MemoryArea, MemoryAttr, MemorySet as MemorySet_, Stack}; pub type MemorySet = MemorySet_; // x86_64 support up to 256M memory #[cfg(target_arch = "x86_64")] pub type FrameAlloc = BitAlloc64K; // RISCV only have 8M memory #[cfg(target_arch = "riscv32")] pub type FrameAlloc = BitAlloc4K; lazy_static! { pub static ref FRAME_ALLOCATOR: Mutex = Mutex::new(FrameAlloc::default()); } pub fn alloc_frame() -> Option { let ret = FRAME_ALLOCATOR.lock().alloc().map(|id| id * PAGE_SIZE + MEMORY_OFFSET); trace!("Allocate frame: {:x?}", ret); ret } pub fn dealloc_frame(target: usize) { trace!("Deallocate frame: {:x}", target); FRAME_ALLOCATOR.lock().dealloc((target - MEMORY_OFFSET) / PAGE_SIZE); } // alloc from heap pub fn alloc_stack() -> Stack { use alloc::alloc::{alloc, Layout}; const STACK_SIZE: usize = 0x8000; let bottom = unsafe{ alloc(Layout::from_size_align(STACK_SIZE, 0x8000).unwrap()) } as usize; let top = bottom + STACK_SIZE; Stack { top, bottom } } lazy_static! { static ref ACTIVE_TABLE: Mutex> = Mutex::new(unsafe { CowExt::new(ActivePageTable::new()) }); } /// The only way to get active page table pub fn active_table() -> MutexGuard<'static, CowExt, Spin> { ACTIVE_TABLE.lock() } // Return true to continue, false to halt pub fn page_fault_handler(addr: usize) -> bool { // Handle copy on write unsafe { ACTIVE_TABLE.force_unlock(); } active_table().page_fault_handler(addr, || alloc_frame().unwrap()) } pub fn init_heap() { use consts::KERNEL_HEAP_SIZE; static mut HEAP: [u8; KERNEL_HEAP_SIZE] = [0; KERNEL_HEAP_SIZE]; unsafe { HEAP_ALLOCATOR.lock().init(HEAP.as_ptr() as usize, KERNEL_HEAP_SIZE); } info!("heap init end"); } //pub mod test { // pub fn cow() { // use super::*; // use ucore_memory::cow::test::test_with; // test_with(&mut active_table()); // } //}