1#![no_std]
9#![deny(warnings, missing_docs)]
10
11mod space;
12
13pub extern crate page_table;
14pub use space::AddressSpace;
15
16use core::ptr::NonNull;
17use page_table::{Pte, VmFlags, VmMeta, PPN};
18
19pub trait PageManager<Meta: VmMeta> {
21 fn new_root() -> Self;
23
24 fn root_ptr(&self) -> NonNull<Pte<Meta>>;
26
27 #[inline]
29 fn root_ppn(&self) -> PPN<Meta> {
30 self.v_to_p(self.root_ptr())
31 }
32
33 fn p_to_v<T>(&self, ppn: PPN<Meta>) -> NonNull<T>;
35
36 fn v_to_p<T>(&self, ptr: NonNull<T>) -> PPN<Meta>;
38
39 fn check_owned(&self, pte: Pte<Meta>) -> bool;
41
42 fn allocate(&mut self, len: usize, flags: &mut VmFlags<Meta>) -> NonNull<u8>;
46
47 fn deallocate(&mut self, pte: Pte<Meta>, len: usize) -> usize;
49
50 fn drop_root(&mut self);
52}