|
|
|
@ -152,6 +152,34 @@ impl MapArea {
|
|
|
|
|
current_vpn = (current_vpn.0 + 1).into();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 当前段, 缩小到新的结束位置, 即把new_end后面的页, 都还给物理页帧管理器, 并取消映射(通过unmap_one方法即可)
|
|
|
|
|
pub fn shrink_to(&mut self, page_table: &mut PageTable, new_end: VirtPageNum) {
|
|
|
|
|
let tmp_vpn_range = VPNRange{
|
|
|
|
|
l: self.vpn_range.l,
|
|
|
|
|
r: new_end,
|
|
|
|
|
};
|
|
|
|
|
for vpn in tmp_vpn_range {
|
|
|
|
|
self.unmap_one(page_table, vpn)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 注意 当前段的区间 也要调整哦new(self.vpn_range.get_start(), new_end);
|
|
|
|
|
self.vpn_range.r = new_end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 当前段, 把当前结束的位置, 扩展到新的结束的位置
|
|
|
|
|
pub fn append_to(&mut self, page_table: &mut PageTable, new_end: VirtPageNum) {
|
|
|
|
|
let tmp_vpn_range = VPNRange{
|
|
|
|
|
l: self.vpn_range.r,
|
|
|
|
|
r: new_end,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for vpn in tmp_vpn_range {
|
|
|
|
|
self.map_one(page_table, vpn)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.vpn_range.r = new_end;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -169,7 +197,6 @@ impl MemorySet {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn from_elf(elf_data: &[u8]) -> (Self, usize, usize) {
|
|
|
|
|
let mut memory_set = Self::new();
|
|
|
|
|
// map trampoline
|
|
|
|
@ -245,7 +272,7 @@ impl MemorySet {
|
|
|
|
|
None,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// used in sbrk
|
|
|
|
|
// 用户的堆空间段 只有一个起始位置即可, 因为 user_stack_top上面全是堆的空间(除了最后两页)
|
|
|
|
|
memory_set.push(
|
|
|
|
|
MapArea::from(
|
|
|
|
|
user_stack_top.into(),
|
|
|
|
@ -391,4 +418,30 @@ impl MemorySet {
|
|
|
|
|
);
|
|
|
|
|
memory_set
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 当前地址空间, 缩小 虚拟地址start位置到虚拟地址 new end的位置
|
|
|
|
|
pub fn shrink_to(&mut self, start: VirtAddr, new_end: VirtAddr) -> bool {
|
|
|
|
|
// 起始虚拟地址所在的页
|
|
|
|
|
let start_vpn = start.floor();
|
|
|
|
|
|
|
|
|
|
// 找到起始地址所在的段, 传入页表, 把当前段缩小到指定结束位置new_end
|
|
|
|
|
if let Some(area) = self.areas.iter_mut().find(|area| area.vpn_range.l == start_vpn) {
|
|
|
|
|
area.shrink_to(&mut self.page_table, new_end.ceil());
|
|
|
|
|
true
|
|
|
|
|
} else {
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 增加当前的地址空间 扩展为 start到 新的结束的位置
|
|
|
|
|
pub fn append_to(&mut self, start: VirtAddr, new_end: VirtAddr) -> bool {
|
|
|
|
|
// 同上, 找到逻辑段之后, 只不过这里是 扩展
|
|
|
|
|
if let Some(area) = self.areas.iter_mut().find(|area| area.vpn_range.l == start.floor()) {
|
|
|
|
|
area.append_to(&mut self.page_table, new_end.ceil());
|
|
|
|
|
true
|
|
|
|
|
} else {
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|