From 3cdd3231d874d7bf2afdd52eca03d38fb3aa9b4d Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Thu, 16 May 2019 08:47:22 +0800 Subject: [PATCH] Update enlarge heap and drivers provider --- kernel/src/drivers/provider.rs | 19 ++++++++++++------- kernel/src/memory.rs | 10 +--------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/kernel/src/drivers/provider.rs b/kernel/src/drivers/provider.rs index c72bf2a..c100990 100644 --- a/kernel/src/drivers/provider.rs +++ b/kernel/src/drivers/provider.rs @@ -1,6 +1,8 @@ use alloc::alloc::{alloc_zeroed, dealloc, Layout}; pub use crate::arch::paging::PageTableImpl; +use crate::consts::PHYSICAL_MEMORY_OFFSET; +use crate::memory::{alloc_frame, dealloc_frame, phys_to_virt, virt_to_phys}; use isomorphic_drivers::provider; use rcore_memory::paging::PageTable; use rcore_memory::PAGE_SIZE; @@ -11,16 +13,19 @@ impl provider::Provider for Provider { const PAGE_SIZE: usize = PAGE_SIZE; fn alloc_dma(size: usize) -> (usize, usize) { - let layout = Layout::from_size_align(size, PAGE_SIZE).unwrap(); - let vaddr = unsafe { alloc_zeroed(layout) } as usize; - let mut page_table = unsafe { PageTableImpl::active() }; - let paddr = page_table.get_entry(vaddr).unwrap().target(); - core::mem::forget(page_table); + // TODO: allocate continuous pages + let mut paddr = alloc_frame().unwrap(); + for i in 1..(size / PAGE_SIZE) { + let paddr_new = alloc_frame().unwrap(); + assert_eq!(paddr - PAGE_SIZE, paddr_new); + paddr = paddr_new; + } + let vaddr = phys_to_virt(paddr); (vaddr, paddr) } fn dealloc_dma(vaddr: usize, size: usize) { - let layout = Layout::from_size_align(size, PAGE_SIZE).unwrap(); - unsafe { dealloc(vaddr as *mut u8, layout) } + let paddr = virt_to_phys(vaddr); + dealloc_frame(paddr); } } diff --git a/kernel/src/memory.rs b/kernel/src/memory.rs index f6d9792..955020f 100644 --- a/kernel/src/memory.rs +++ b/kernel/src/memory.rs @@ -146,13 +146,9 @@ pub fn init_heap() { pub fn enlarge_heap(heap: &mut Heap) { info!("Enlarging heap to avoid oom"); - let mut page_table = unsafe { PageTableImpl::active() }; let mut addrs = [(0, 0); 32]; let mut addr_len = 0; - #[cfg(target_arch = "x86_64")] - let va_offset = KERNEL_OFFSET + 0xe0000000; - #[cfg(not(target_arch = "x86_64"))] - let va_offset = KERNEL_OFFSET + 0x00e00000; + let va_offset = PHYSICAL_MEMORY_OFFSET; for i in 0..16384 { let page = alloc_frame().unwrap(); let va = va_offset + page; @@ -168,15 +164,11 @@ pub fn enlarge_heap(heap: &mut Heap) { addr_len += 1; } for (addr, len) in addrs[..addr_len].into_iter() { - for va in (*addr..(*addr + *len)).step_by(PAGE_SIZE) { - page_table.map(va, va - va_offset).update(); - } info!("Adding {:#X} {:#X} to heap", addr, len); unsafe { heap.init(*addr, *len); } } - core::mem::forget(page_table); } pub fn access_ok(from: usize, len: usize) -> bool {