WIP: Create new page table for clone

This commit is contained in:
Jeremy Soller 2016-09-14 22:21:52 -06:00
parent c000820d72
commit b01a918556
3 changed files with 70 additions and 40 deletions

View file

@ -63,8 +63,6 @@ impl Mapper {
/// Unmap a page
pub fn unmap(&mut self, page: Page) {
assert!(self.translate(page.start_address()).is_some());
let p1 = self.p4_mut()
.next_table_mut(page.p4_index())
.and_then(|p3| p3.next_table_mut(page.p3_index()))
@ -76,6 +74,18 @@ impl Mapper {
deallocate_frame(frame);
}
/// Unmap a page, return frame without free
pub fn unmap_return(&mut self, page: Page) -> Frame {
let p1 = self.p4_mut()
.next_table_mut(page.p4_index())
.and_then(|p3| p3.next_table_mut(page.p3_index()))
.and_then(|p2| p2.next_table_mut(page.p2_index()))
.expect("mapping code does not support huge pages");
let frame = p1[page.p1_index()].pointed_frame().unwrap();
p1[page.p1_index()].set_unused();
frame
}
pub fn translate_page(&self, page: Page) -> Option<Frame> {
self.p4().next_table(page.p4_index())
.and_then(|p3| p3.next_table(page.p3_index()))