Skip to content

Commit

Permalink
over sir!
Browse files Browse the repository at this point in the history
  • Loading branch information
Jasonhonghh committed Oct 24, 2024
1 parent 7db960c commit 08fd5ce
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 10 deletions.
9 changes: 6 additions & 3 deletions os/src/mm/memory_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ lazy_static! {
}
/// address space
pub struct MemorySet {
page_table: PageTable,
areas: Vec<MapArea>,
/// page table
pub page_table: PageTable,
/// map areas
pub areas: Vec<MapArea>,
}

impl MemorySet {
Expand Down Expand Up @@ -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<VirtPageNum, FrameTracker>,
map_type: MapType,
map_perm: MapPermission,
Expand Down
6 changes: 3 additions & 3 deletions os/src/mm/page_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions os/src/syscall/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
};
Expand Down Expand Up @@ -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 {
Expand Down
28 changes: 27 additions & 1 deletion os/src/task/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
}

0 comments on commit 08fd5ce

Please sign in to comment.