lab-04: mmap, munmap

This commit is contained in:
Tateisi 2025-08-03 13:48:14 +08:00
parent eaacb4fa25
commit cc1a9a4751
14 changed files with 311 additions and 2 deletions

View file

@ -1,6 +1,8 @@
//! Process management syscalls
use crate::task::{change_program_brk, exit_current_and_run_next, suspend_current_and_run_next};
use crate::config::PAGE_SIZE;
use crate::mm::{MapPermission, VPNRange, VirtAddr};
use crate::task::{change_program_brk, create_new_map_area, exit_current_and_run_next, get_current_task_page_table_entry, suspend_current_and_run_next, unmap_virtual_page};
use crate::timer::get_time_ms;
/// task exits and submit an exit code
@ -29,3 +31,47 @@ pub fn sys_sbrk(size: i32) -> isize {
-1
}
}
/// map files or devices into memory
pub fn sys_mmap(start: usize, len: usize, prot: usize) -> isize {
if start % PAGE_SIZE != 0 || prot & !0x7 != 0 || prot & 0x7 == 0 {
return -1;
}
let vpn_start = VirtAddr::from(start).floor();
let vpn_end = VirtAddr::from(start + len).ceil();
let vpn_range = VPNRange::new(vpn_start, vpn_end);
for vpn in vpn_range {
if let Some(pte) = get_current_task_page_table_entry(vpn) {
if pte.is_valid() {
return -1;
}
}
}
create_new_map_area(
vpn_start.into(),
vpn_end.into(),
MapPermission::from_bits_truncate((prot << 1) as u8) | MapPermission::U
);
0
}
/// unmap files or devices into memory
pub fn sys_munmap(start: usize, len: usize) -> isize {
if start % PAGE_SIZE != 0 {
return -1;
}
let vpn_start = VirtAddr::from(start).floor();
let vpn_end = VirtAddr::from(start + len).ceil();
let vpn_range = VPNRange::new(vpn_start, vpn_end);
for vpn in vpn_range {
if let Some(pte) = get_current_task_page_table_entry(vpn) {
if !pte.is_valid() {
return -1;
}
unmap_virtual_page(vpn)
} else {
return -1;
}
}
0
}