From 5ce895d15a3df89ee52df3d267cfb0f0c67dfab1 Mon Sep 17 00:00:00 2001 From: Dream <2036019675@qq.com> Date: Tue, 14 May 2024 22:00:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=20sys=5Fmunmap=20?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=B0=83=E7=94=A8=20=E8=A6=81=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E7=9A=84=E5=8F=98=E6=9B=B4=EF=BC=9A=20=20=20=20=20=20?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20src/mm/memory=5Fse?= =?UTF-8?q?t.rs=20=20=20=20=20=20=20=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20src/mm/mod.rs=20=20=20=20=20=20=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20src/mm/page=5Ftable.rs=20=20=20=20=20?= =?UTF-8?q?=20=20=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20src/syscall/pro?= =?UTF-8?q?cess.rs=20=20=20=20=20=20=20=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20src/task/mod.rs=20=20=20=20=20=20=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20src/task/processor.rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- os/src/mm/memory_set.rs | 17 +++++++++++++++++ os/src/mm/page_table.rs | 4 ++-- os/src/task/mod.rs | 11 ++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/os/src/mm/memory_set.rs b/os/src/mm/memory_set.rs index f1891f4..5677a74 100644 --- a/os/src/mm/memory_set.rs +++ b/os/src/mm/memory_set.rs @@ -284,6 +284,23 @@ impl MemorySet { -1 } } + + /// 取消当前进程指定区间的映射 + /// 样例比较简单所以直接以开头页面进行删除了 + pub fn unmap_vpnrange(&mut self, start: VirtPageNum, end: VirtPageNum) -> isize { + if let Some(_) = self.areas + .iter() + .position(|area| { + let (l, r) = (area.vpn_range.get_start(), area.vpn_range.get_end()); + l == start && r == end + }) + { + self.remove_area_with_start_vpn(start); + 0 + } else { + -1 + } + } } /// map area structure, controls a contiguous piece of virtual memory pub struct MapArea { diff --git a/os/src/mm/page_table.rs b/os/src/mm/page_table.rs index 0ba30a9..a5a376e 100644 --- a/os/src/mm/page_table.rs +++ b/os/src/mm/page_table.rs @@ -158,8 +158,8 @@ impl PageTable { return None; } pub fn is_map(&self, vpn: VirtPageNum) -> bool { - if let Some(_) = self.find_pte(vpn) { - true + if let Some(pte) = self.find_pte(vpn) { + pte.is_valid() } else { false } diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index 2af050c..3cd48e1 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -247,12 +247,12 @@ impl TaskManager { curr_task.memory_set.insert_framed_area(start_va, end_va, permission); } - /// unmap [start_va, end_va] - pub fn curr_munmap_with_start_vpn(&self, start_vpn: VirtPageNum) -> isize { + /// unmap [start_va, end _va] + pub fn curr_munmap(&self, start_vpn: VirtPageNum, end_vpn: VirtPageNum) -> isize { let mut inner = self.inner.exclusive_access(); let curr_id = inner.current_task; let curr_task = &mut inner.tasks[curr_id]; - curr_task.memory_set.remove_area_with_start_vpn(start_vpn) + curr_task.memory_set.unmap_vpnrange(start_vpn, end_vpn) } } @@ -346,9 +346,10 @@ pub fn curr_mmap(start: usize, len: usize, mut port: usize) -> isize { pub fn curr_munmap(start: usize, len: usize) -> isize { let start_va = VirtAddr::from(start); let end_va = VirtAddr::from(start + len); - if !start_va.aligned() || curr_vpnrange_exist_unmap(start_va.floor(), end_va.ceil()) { + if !start_va.aligned() || + curr_vpnrange_exist_unmap(start_va.floor(), end_va.ceil()) { -1 } else { - TASK_MANAGER.curr_munmap_with_start_vpn(start_va.floor()) + TASK_MANAGER.curr_munmap(start_va.floor(), end_va.ceil()) } } \ No newline at end of file