|
|
@ -66,7 +66,7 @@ impl MapArea {
|
|
|
|
// 截取抛弃内存碎片
|
|
|
|
// 截取抛弃内存碎片
|
|
|
|
let start_vpn: VirtPageNum = start_va.floor();
|
|
|
|
let start_vpn: VirtPageNum = start_va.floor();
|
|
|
|
let end_vpn: VirtPageNum = end_va.ceil();
|
|
|
|
let end_vpn: VirtPageNum = end_va.ceil();
|
|
|
|
println!("start va: {} start vpn {}", start_va.0, start_vpn.0);
|
|
|
|
|
|
|
|
Self {
|
|
|
|
Self {
|
|
|
|
vpn_range: VPNRange {l:start_vpn, r: end_vpn},
|
|
|
|
vpn_range: VPNRange {l:start_vpn, r: end_vpn},
|
|
|
|
data_frames: BTreeMap::new(),
|
|
|
|
data_frames: BTreeMap::new(),
|
|
|
@ -111,9 +111,8 @@ impl MapArea {
|
|
|
|
|
|
|
|
|
|
|
|
// 映射 当前逻辑段中的每一个虚拟页, 到页表中
|
|
|
|
// 映射 当前逻辑段中的每一个虚拟页, 到页表中
|
|
|
|
pub fn map(&mut self, page_table: &mut PageTable) {
|
|
|
|
pub fn map(&mut self, page_table: &mut PageTable) {
|
|
|
|
println!("self.vpn_range.get_start {} {}", self.vpn_range.l.0, self.vpn_range.r.0);
|
|
|
|
|
|
|
|
for vpn in self.vpn_range {
|
|
|
|
for vpn in self.vpn_range {
|
|
|
|
println!("range vpn :{}", vpn.0);
|
|
|
|
|
|
|
|
self.map_one(page_table, vpn);
|
|
|
|
self.map_one(page_table, vpn);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -178,7 +177,6 @@ impl MemorySet {
|
|
|
|
memory_set.map_trampoline();
|
|
|
|
memory_set.map_trampoline();
|
|
|
|
// map program headers of elf, with U flag
|
|
|
|
// map program headers of elf, with U flag
|
|
|
|
// 分析外部传进来的 elf文件数据
|
|
|
|
// 分析外部传进来的 elf文件数据
|
|
|
|
println!("enf len: {}", elf_data.len());
|
|
|
|
|
|
|
|
let elf = xmas_elf::ElfFile::new(elf_data).unwrap();
|
|
|
|
let elf = xmas_elf::ElfFile::new(elf_data).unwrap();
|
|
|
|
let elf_header = elf.header;
|
|
|
|
let elf_header = elf.header;
|
|
|
|
let magic = elf_header.pt1.magic;
|
|
|
|
let magic = elf_header.pt1.magic;
|
|
|
@ -196,7 +194,7 @@ impl MemorySet {
|
|
|
|
let start_va: VirtAddr = (ph.virtual_addr() as usize).into();
|
|
|
|
let start_va: VirtAddr = (ph.virtual_addr() as usize).into();
|
|
|
|
// 当前段结束位置 (开始位置+大小)
|
|
|
|
// 当前段结束位置 (开始位置+大小)
|
|
|
|
let end_va: VirtAddr = ((ph.virtual_addr() + ph.mem_size()) as usize).into();
|
|
|
|
let end_va: VirtAddr = ((ph.virtual_addr() + ph.mem_size()) as usize).into();
|
|
|
|
println!("start_va {} end_va {}", start_va.0, end_va.0);
|
|
|
|
|
|
|
|
// 当前段权限
|
|
|
|
// 当前段权限
|
|
|
|
let mut map_perm = MapPermission::U;
|
|
|
|
let mut map_perm = MapPermission::U;
|
|
|
|
let ph_flags = ph.flags();
|
|
|
|
let ph_flags = ph.flags();
|
|
|
@ -260,7 +258,6 @@ impl MemorySet {
|
|
|
|
|
|
|
|
|
|
|
|
// 设置 TrapContext为统一的虚拟地址
|
|
|
|
// 设置 TrapContext为统一的虚拟地址
|
|
|
|
// 将 虚拟地址的 次高页添加到用户空间, 后面会被内核强行找到物理地址并修改为 trap context
|
|
|
|
// 将 虚拟地址的 次高页添加到用户空间, 后面会被内核强行找到物理地址并修改为 trap context
|
|
|
|
println!("TRAP_CONTEXT: {}, TRAMPOLINE: {}", TRAP_CONTEXT, TRAMPOLINE);
|
|
|
|
|
|
|
|
memory_set.push(
|
|
|
|
memory_set.push(
|
|
|
|
MapArea::from(
|
|
|
|
MapArea::from(
|
|
|
|
TRAP_CONTEXT.into(),
|
|
|
|
TRAP_CONTEXT.into(),
|
|
|
@ -270,7 +267,7 @@ impl MemorySet {
|
|
|
|
),
|
|
|
|
),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
println!(3);
|
|
|
|
|
|
|
|
(
|
|
|
|
(
|
|
|
|
memory_set, // 地址空间
|
|
|
|
memory_set, // 地址空间
|
|
|
|
user_stack_top, // 用户栈底和当前的栈顶, 他在地址空间各个逻辑段的上面, 同时
|
|
|
|
user_stack_top, // 用户栈底和当前的栈顶, 他在地址空间各个逻辑段的上面, 同时
|
|
|
|