-
Notifications
You must be signed in to change notification settings - Fork 540
Open
Description
os/mm/page_table.rs中的find_pte函数,如果参数是一个没有被映射过的VPN,函数也会返回PTE,调用该函数的translate函数(page_table.rs内)没有检查PTE合法的手段,原OS代码不报错是因为所查询的PPN都在合法范围内。
原代码:
fn find_pte(&self, vpn: VirtPageNum) -> Option<&mut PageTableEntry> {
let idxs = vpn.indexes();
let mut ppn = self.root_ppn;
let mut result: Option<&mut PageTableEntry> = None;
for (i, idx) in idxs.iter().enumerate() {
let pte = &mut ppn.get_pte_array()[*idx];
if i == 2 {
result = Some(pte);
break;
}
if !pte.is_valid() {
return None;
}
ppn = pte.ppn();
}
result
}
修改后:
fn find_pte(&self, vpn: VirtPageNum) -> Option<&mut PageTableEntry> {
let idxs = vpn.indexes();
let mut ppn = self.root_ppn;
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;
}
ppn = pte.ppn();
}
result
}
Metadata
Metadata
Assignees
Labels
No labels