增加remove_area_with_start_vpn 和 recycle_data_pages 用于释放地址空间中的映射

ch5
zhangxinyu 2 years ago
parent ca37923488
commit 082d65446f

@ -309,6 +309,22 @@ impl MemorySet {
self.page_table.token() self.page_table.token()
} }
// 从当前地址空间中,根据start 虚拟页 找到逻辑段, 取消映射 一个逻辑段, 并把这个逻辑段 从 areas中删除
pub fn remove_area_with_start_vpn(&mut self, start_vpn: VirtPageNum) {
if let Some((idx, area)) = self.areas.iter_mut().enumerate().find(|(_, area)| {
area.vpn_range.l == start_vpn
}) {
area.unmap(&mut self.page_table);
self.areas.remove(idx);
}
}
// 释放当前地址空间的 逻辑页帧areas, 把对应的物理页帧通过RAII 归还给全局物理页帧管理器
pub fn recycle_data_pages(&mut self) {
//*self = Self::new_bare();
self.areas.clear();
}
// 激活当前地址空间 // 激活当前地址空间
pub fn activate(&self) { pub fn activate(&self) {
// let satp = self.page_table.token(); // let satp = self.page_table.token();

@ -5,7 +5,6 @@ use crate::config::TRAMPOLINE;
use crate::mm::address::{PhysPageNum, VirtAddr, VirtPageNum}; use crate::mm::address::{PhysPageNum, VirtAddr, VirtPageNum};
use crate::mm::frame_allocator::{frame_alloc, FrameTracker}; use crate::mm::frame_allocator::{frame_alloc, FrameTracker};
use crate::println; use crate::println;
use crate::task::TASK_MANAGER;
bitflags! { bitflags! {

Loading…
Cancel
Save