diff --git a/kernel/src/arch/x86_64/interrupt/trap.rs b/kernel/src/arch/x86_64/interrupt/trap.rs index ecc03f8d..9cd31fa9 100644 --- a/kernel/src/arch/x86_64/interrupt/trap.rs +++ b/kernel/src/arch/x86_64/interrupt/trap.rs @@ -401,7 +401,7 @@ unsafe extern "C" fn do_page_fault(regs: &'static TrapFrame, error_code: u64) { // panic!("Page Fault"); CurrentIrqArch::interrupt_disable(); let address = x86::controlregs::cr2(); - // crate::info!( + // log::info!( // "fault address: {:#x}, error_code: {:#b}, pid: {}\n", // address, // error_code, diff --git a/kernel/src/mm/page.rs b/kernel/src/mm/page.rs index eb75c3ee..11770811 100644 --- a/kernel/src/mm/page.rs +++ b/kernel/src/mm/page.rs @@ -861,6 +861,11 @@ impl PageMapper { let phys: PhysAddr = self.frame_allocator.allocate_one()?; compiler_fence(Ordering::SeqCst); + unsafe { + let vaddr = MMArch::phys_2_virt(phys).unwrap(); + MMArch::write_bytes(vaddr, 0, MMArch::PAGE_SIZE); + } + let mut page_manager_guard: SpinLockGuard<'static, PageManager> = page_manager_lock_irqsave(); if !page_manager_guard.contains(&phys) { diff --git a/kernel/src/mm/syscall.rs b/kernel/src/mm/syscall.rs index 16bca4d3..beac5cc2 100644 --- a/kernel/src/mm/syscall.rs +++ b/kernel/src/mm/syscall.rs @@ -329,7 +329,7 @@ impl Syscall { prot_flags, map_flags, true, - true, + false, )?; return Ok(start_page.virt_address().data()); } diff --git a/kernel/src/mm/ucontext.rs b/kernel/src/mm/ucontext.rs index 1919ddee..f5d484bc 100644 --- a/kernel/src/mm/ucontext.rs +++ b/kernel/src/mm/ucontext.rs @@ -1116,7 +1116,7 @@ impl LockedVMA { let before: Option> = guard.region.before(®ion).map(|virt_region| { let mut vma: VMA = unsafe { guard.clone() }; vma.region = virt_region; - + vma.mapped = false; let vma: Arc = LockedVMA::new(vma); vma }); @@ -1124,7 +1124,7 @@ impl LockedVMA { let after: Option> = guard.region.after(®ion).map(|virt_region| { let mut vma: VMA = unsafe { guard.clone() }; vma.region = virt_region; - + vma.mapped = false; let vma: Arc = LockedVMA::new(vma); vma }); @@ -1134,20 +1134,24 @@ impl LockedVMA { if let Some(before) = before.clone() { let virt_iter = before.lock().region.iter_pages(); for frame in virt_iter { - let paddr = utable.translate(frame.virt_address()).unwrap().0; - let page = page_manager_guard.get_mut(&paddr); - page.insert_vma(before.clone()); - page.remove_vma(self); + if let Some((paddr, _)) = utable.translate(frame.virt_address()) { + let page = page_manager_guard.get_mut(&paddr); + page.insert_vma(before.clone()); + page.remove_vma(self); + before.lock().mapped = true; + } } } if let Some(after) = after.clone() { let virt_iter = after.lock().region.iter_pages(); for frame in virt_iter { - let paddr = utable.translate(frame.virt_address()).unwrap().0; - let page = page_manager_guard.get_mut(&paddr); - page.insert_vma(after.clone()); - page.remove_vma(self); + if let Some((paddr, _)) = utable.translate(frame.virt_address()) { + let page = page_manager_guard.get_mut(&paddr); + page.insert_vma(after.clone()); + page.remove_vma(self); + after.lock().mapped = true; + } } } @@ -1490,12 +1494,6 @@ impl VMA { // 将VMA加入到anon_vma let page = page_manager_guard.get_mut(&paddr); page.insert_vma(r.clone()); - - // 清空内存 - unsafe { - let vaddr = MMArch::phys_2_virt(paddr).unwrap(); - MMArch::write_bytes(vaddr, 0, MMArch::PAGE_SIZE); - } } // debug!("VMA::zeroed: done"); return Ok(r);