You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.7 KiB
57 lines
1.7 KiB
//! Generic page table interface
|
|
//!
|
|
//! Implemented for every architecture, used by OS.
|
|
|
|
use super::*;
|
|
#[cfg(test)]
|
|
pub use self::mock_page_table::MockPageTable;
|
|
|
|
#[cfg(test)]
|
|
mod mock_page_table;
|
|
|
|
pub trait PageTable {
|
|
type Entry: Entry;
|
|
fn map(&mut self, addr: VirtAddr, target: PhysAddr) -> &mut Self::Entry;
|
|
fn unmap(&mut self, addr: VirtAddr);
|
|
fn get_entry(&mut self, addr: VirtAddr) -> &mut Self::Entry;
|
|
// For testing with mock
|
|
fn read_page(&mut self, addr: VirtAddr, data: &mut [u8]);
|
|
fn write_page(&mut self, addr: VirtAddr, data: &[u8]);
|
|
fn read(&mut self, addr: VirtAddr) -> u8;
|
|
fn write(&mut self, addr: VirtAddr, data: u8);
|
|
}
|
|
|
|
pub trait Entry {
|
|
/// IMPORTANT!
|
|
/// This must be called after any change to ensure it become effective.
|
|
/// Usually this will make a flush to TLB/MMU.
|
|
fn update(&mut self);
|
|
|
|
/// Will be set when accessed
|
|
fn accessed(&self) -> bool;
|
|
/// Will be set when written
|
|
fn dirty(&self) -> bool;
|
|
/// Will PageFault when try to write page where writable=0
|
|
fn writable(&self) -> bool;
|
|
/// Will PageFault when try to access page where present=0
|
|
fn present(&self) -> bool;
|
|
|
|
fn clear_accessed(&mut self);
|
|
fn clear_dirty(&mut self);
|
|
fn set_writable(&mut self, value: bool);
|
|
fn set_present(&mut self, value: bool);
|
|
|
|
fn target(&self) -> PhysAddr;
|
|
|
|
// For Copy-on-write extension
|
|
fn writable_shared(&self) -> bool;
|
|
fn readonly_shared(&self) -> bool;
|
|
fn set_shared(&mut self, writable: bool);
|
|
fn clear_shared(&mut self);
|
|
|
|
fn user(&self) -> bool;
|
|
fn set_user(&mut self, value: bool);
|
|
fn execute(&self) -> bool;
|
|
fn set_execute(&mut self, value: bool);
|
|
}
|