From 08fd5cee6b44a27d9ded1dbc215710c214a1b2c6 Mon Sep 17 00:00:00 2001 From: mmhong Date: Thu, 24 Oct 2024 14:48:55 +0800 Subject: [PATCH] over sir! --- os/src/mm/memory_set.rs | 9 ++++++--- os/src/mm/page_table.rs | 6 +++--- os/src/syscall/process.rs | 6 +++--- os/src/task/mod.rs | 28 +++++++++++++++++++++++++++- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/os/src/mm/memory_set.rs b/os/src/mm/memory_set.rs index 7a7b7eae..e54ee02b 100644 --- a/os/src/mm/memory_set.rs +++ b/os/src/mm/memory_set.rs @@ -35,8 +35,10 @@ lazy_static! { } /// address space pub struct MemorySet { - page_table: PageTable, - areas: Vec, + /// page table + pub page_table: PageTable, + /// map areas + pub areas: Vec, } impl MemorySet { @@ -265,7 +267,8 @@ impl MemorySet { } /// map area structure, controls a contiguous piece of virtual memory pub struct MapArea { - vpn_range: VPNRange, + /// virtual page number range + pub vpn_range: VPNRange, data_frames: BTreeMap, map_type: MapType, map_perm: MapPermission, diff --git a/os/src/mm/page_table.rs b/os/src/mm/page_table.rs index 525f8769..48b50429 100644 --- a/os/src/mm/page_table.rs +++ b/os/src/mm/page_table.rs @@ -121,13 +121,13 @@ impl PageTable { let mut result: Option<&mut PageTableEntry> = None; for (i, idx) in idxs.iter().enumerate() { let pte = &mut ppn.get_pte_array()[*idx]; + if !pte.is_valid() { + return None; + } if i == 2 { result = Some(pte); break; } - if !pte.is_valid() { - return None; - } ppn = pte.ppn(); } result diff --git a/os/src/syscall/process.rs b/os/src/syscall/process.rs index 8604936e..4f02e54c 100644 --- a/os/src/syscall/process.rs +++ b/os/src/syscall/process.rs @@ -2,7 +2,7 @@ use crate::{ config::MAX_SYSCALL_NUM, task::{ - task_mmap_area,get_current_task_info,current_user_token,change_program_brk, exit_current_and_run_next, suspend_current_and_run_next, TaskStatus, + task_munmap_area,task_mmap_area,get_current_task_info,current_user_token,change_program_brk, exit_current_and_run_next, suspend_current_and_run_next, TaskStatus, }, mm::{MapPermission,translated_byte_buffer}, }; @@ -99,8 +99,8 @@ pub fn sys_mmap(_start: usize, _len: usize, _prot: usize) -> isize { // YOUR JOB: Implement munmap. pub fn sys_munmap(_start: usize, _len: usize) -> isize { - trace!("kernel: sys_munmap NOT IMPLEMENTED YET!"); - -1 + trace!("kernel: sys_munmap"); + task_munmap_area(_start, _len) } /// change data segment size pub fn sys_sbrk(size: i32) -> isize { diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index 90353e1e..c2eba54e 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -190,10 +190,32 @@ impl TaskManager { let memory_set = &mut task.memory_set; //传入虚拟内存地址,之后调用的函数会自动转换为页号,向下向上取整 let start_va = VirtAddr::from(_start); - let end_va = VirtAddr::from(_start + _len-1);//注意这个地方是减一 + let end_va = VirtAddr::from(_start + _len);//注意这个地方是减一 memory_set.insert_framed_area(start_va,end_va, _permission); 0 } + fn task_munmap_area(&self,_start:usize,_len:usize)->isize{ + let mut inner = self.inner.exclusive_access(); + let current = inner.current_task; + let task = &mut inner.tasks[current];//控制块 + let memory_set = &mut task.memory_set;//其areas字段私有,只能通过控制块访问,修改为pub + let mut area_id = 0; + let page_table =&mut memory_set.page_table; + for area in memory_set.areas.iter_mut(){ + // println!("vpn_range start:{:?} end:{:?}",area.vpn_range.get_start().0,area.vpn_range.get_end().0); + // println!("start:{:?} end:{:?}",_start/4096,(_start+_len)/4096); + if area.vpn_range.get_start().0*4096 == _start && area.vpn_range.get_end().0*4096 == _start+_len{ + // println!("find area"); + area.unmap(page_table); + // println!("find area"); + memory_set.areas.remove(area_id); + // println!("find area"); + return 0; + } + area_id += 1; + } + -1 + } } /// Run the first task in task list. @@ -258,3 +280,7 @@ pub fn increase_current_syscall_count(syscall_id: usize) { pub fn task_mmap_area(_start:usize,_len:usize,permission:MapPermission)->isize{ TASK_MANAGER.task_mmap_area(_start,_len,permission) } +///task_munmap_area +pub fn task_munmap_area(_start:usize,_len:usize)->isize{ + TASK_MANAGER.task_munmap_area(_start,_len) +} \ No newline at end of file