mirror of
https://github.com/rcore-os/rCore.git
synced 2024-11-24 00:46:17 +04:00
81196729e4
- Fix __atomic_compare_exchange_4(). - Add patch for core::sync::atomic. - Revert kernel Mutex.
75 lines
2.2 KiB
Rust
75 lines
2.2 KiB
Rust
pub use arch::paging::*;
|
|
use bit_allocator::{BitAlloc, BitAlloc4K, BitAlloc64K};
|
|
use consts::MEMORY_OFFSET;
|
|
use spin::{Mutex, MutexGuard};
|
|
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_<InactivePageTable0>;
|
|
|
|
// 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<FrameAlloc> = Mutex::new(FrameAlloc::default());
|
|
}
|
|
|
|
pub fn alloc_frame() -> Option<usize> {
|
|
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<CowExt<ActivePageTable>> = Mutex::new(unsafe {
|
|
CowExt::new(ActivePageTable::new())
|
|
});
|
|
}
|
|
|
|
/// The only way to get active page table
|
|
pub fn active_table() -> MutexGuard<'static, CowExt<ActivePageTable>> {
|
|
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());
|
|
// }
|
|
//}
|