diff --git a/kernel/src/mm/syscall.rs b/kernel/src/mm/syscall.rs index 4d0cde0d..13b1e72c 100644 --- a/kernel/src/mm/syscall.rs +++ b/kernel/src/mm/syscall.rs @@ -129,6 +129,10 @@ impl Into for VmFlags { map_flags |= MapFlags::MAP_SYNC; } + if self.contains(VmFlags::VM_MAYSHARE) { + map_flags |= MapFlags::MAP_SHARED; + } + map_flags } } diff --git a/kernel/src/mm/ucontext.rs b/kernel/src/mm/ucontext.rs index 10ef700d..352caedf 100644 --- a/kernel/src/mm/ucontext.rs +++ b/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();