Browse Source

feat(mm): 修复mmap未延迟分配内存的问题 (#837)

* 20240524 3:40

* 20240527 0010

* 修复mmap未延迟分配内存的问题

* Revert "Merge branch 'patch-add-file-mapping' into patch-fix-mmap"

This reverts commit 8eb687c60b43831d7e9614bca0af41e8f2175ae8, reversing
changes made to 33e9f0b34f9dc35a47757137a29605e51052a26e.
MemoryShore 9 months ago
parent
commit
de199e3c86

+ 1 - 1
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,

+ 5 - 0
kernel/src/mm/page.rs

@@ -861,6 +861,11 @@ impl<Arch: MemoryManagementArch, F: FrameAllocator> PageMapper<Arch, F> {
         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) {

+ 1 - 1
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());
     }

+ 14 - 16
kernel/src/mm/ucontext.rs

@@ -1116,7 +1116,7 @@ impl LockedVMA {
         let before: Option<Arc<LockedVMA>> = guard.region.before(&region).map(|virt_region| {
             let mut vma: VMA = unsafe { guard.clone() };
             vma.region = virt_region;
-
+            vma.mapped = false;
             let vma: Arc<LockedVMA> = LockedVMA::new(vma);
             vma
         });
@@ -1124,7 +1124,7 @@ impl LockedVMA {
         let after: Option<Arc<LockedVMA>> = guard.region.after(&region).map(|virt_region| {
             let mut vma: VMA = unsafe { guard.clone() };
             vma.region = virt_region;
-
+            vma.mapped = false;
             let vma: Arc<LockedVMA> = 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);