Browse Source

完善重映射过程中获取新映射区域时的map_flags (#569)

Jomo 1 year ago
parent
commit
3055390c25
2 changed files with 10 additions and 5 deletions
  1. 4 0
      kernel/src/mm/syscall.rs
  2. 6 5
      kernel/src/mm/ucontext.rs

+ 4 - 0
kernel/src/mm/syscall.rs

@@ -129,6 +129,10 @@ impl Into<MapFlags> for VmFlags {
             map_flags |= MapFlags::MAP_SYNC;
         }
 
+        if self.contains(VmFlags::VM_MAYSHARE) {
+            map_flags |= MapFlags::MAP_SHARED;
+        }
+
         map_flags
     }
 }

+ 6 - 5
kernel/src/mm/ucontext.rs

@@ -409,18 +409,19 @@ impl InnerAddressSpace {
             return Err(SystemError::EINVAL);
         }
 
+        // 初始化映射标志
+        let mut map_flags: MapFlags = vm_flags.into();
+        // 初始化内存区域保护标志
+        let prot_flags: ProtFlags = vm_flags.into();
+
         // 取消新内存区域的原映射
         if mremap_flags.contains(MremapFlags::MREMAP_FIXED) {
+            map_flags |= MapFlags::MAP_FIXED;
             let start_page = VirtPageFrame::new(new_vaddr);
             let page_count = PageFrameCount::from_bytes(new_len).unwrap();
             self.munmap(start_page, page_count)?;
         }
 
-        // 初始化映射标志
-        let map_flags: MapFlags = vm_flags.into();
-        // 初始化内存区域保护标志
-        let prot_flags: ProtFlags = vm_flags.into();
-
         // 获取映射后的新内存页面
         let new_page = self.map_anonymous(new_vaddr, new_len, prot_flags, map_flags, true)?;
         let new_page_vaddr = new_page.virt_address();