瀏覽代碼

Merge branch 'patch-add-file-mapping' into feat-dynamic-link

MemoryShore 8 月之前
父節點
當前提交
ed782e67ff
共有 1 個文件被更改,包括 14 次插入14 次删除
  1. 14 14
      kernel/src/mm/fault.rs

+ 14 - 14
kernel/src/mm/fault.rs

@@ -76,7 +76,7 @@ impl<'a> PageFaultMessage<'a> {
         });
         Self {
             vma: vma.clone(),
-            address,
+            address: VirtAddr::new(crate::libs::align::page_align_down(address.data())),
             flags,
             file_pgoff,
             page: None,
@@ -294,6 +294,17 @@ impl PageFaultHandler {
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
     pub unsafe fn do_cow_fault(pfm: &mut PageFaultMessage) -> VmFaultReason {
+        let mut ret = Self::filemap_fault(pfm);
+
+        if unlikely(ret.intersects(
+            VmFaultReason::VM_FAULT_ERROR
+                | VmFaultReason::VM_FAULT_NOPAGE
+                | VmFaultReason::VM_FAULT_RETRY
+                | VmFaultReason::VM_FAULT_DONE_COW,
+        )) {
+            return ret;
+        }
+
         let cache_page = pfm.page.clone().unwrap();
         let mapper = &mut pfm.mapper;
 
@@ -306,17 +317,6 @@ impl PageFaultHandler {
         let cow_page = Arc::new(Page::new(false, cow_page_phys));
         pfm.cow_page = Some(cow_page.clone());
 
-        let mut ret = Self::filemap_fault(pfm);
-
-        if unlikely(ret.intersects(
-            VmFaultReason::VM_FAULT_ERROR
-                | VmFaultReason::VM_FAULT_NOPAGE
-                | VmFaultReason::VM_FAULT_RETRY
-                | VmFaultReason::VM_FAULT_DONE_COW,
-        )) {
-            return ret;
-        }
-
         //复制PageCache内容到新的页内
         let new_frame = MMArch::phys_2_virt(cow_page_phys).unwrap();
         (new_frame.data() as *mut u8).copy_from_nonoverlapping(
@@ -331,8 +331,8 @@ impl PageFaultHandler {
         // 新页加入页管理器中
         page_manager_guard.insert(cow_page_phys, &cow_page);
         cow_page.write_irqsave().set_page_cache_index(
-            cow_page.read_irqsave().page_cache(),
-            cow_page.read_irqsave().index(),
+            cache_page.read_irqsave().page_cache(),
+            cache_page.read_irqsave().index(),
         );
 
         // 将vma插入页的vma表中