Skip to main content

tg_kernel_vm/
lib.rs

1//! 内核虚存管理。
2
3#![no_std]
4#![deny(warnings, missing_docs)]
5
6mod space;
7
8pub extern crate page_table;
9pub use space::AddressSpace;
10
11use core::ptr::NonNull;
12use page_table::{Pte, VmFlags, VmMeta, PPN};
13
14/// 物理页管理。
15pub trait PageManager<Meta: VmMeta> {
16    /// 新建根页表页。
17    fn new_root() -> Self;
18
19    /// 获取根页表。
20    fn root_ptr(&self) -> NonNull<Pte<Meta>>;
21
22    /// 获取根页表的物理页号。
23    #[inline]
24    fn root_ppn(&self) -> PPN<Meta> {
25        self.v_to_p(self.root_ptr())
26    }
27
28    /// 计算当前地址空间上指向物理页的指针。
29    fn p_to_v<T>(&self, ppn: PPN<Meta>) -> NonNull<T>;
30
31    /// 计算当前地址空间上的指针指向的物理页。
32    fn v_to_p<T>(&self, ptr: NonNull<T>) -> PPN<Meta>;
33
34    /// 检查是否拥有一个页的所有权。
35    fn check_owned(&self, pte: Pte<Meta>) -> bool;
36
37    /// 为地址空间分配 `len` 个物理页。
38    fn allocate(&mut self, len: usize, flags: &mut VmFlags<Meta>) -> NonNull<u8>;
39
40    /// 从地址空间释放 `pte` 指示的 `len` 个物理页。
41    fn deallocate(&mut self, pte: Pte<Meta>, len: usize) -> usize;
42
43    /// 释放根页表。
44    fn drop_root(&mut self);
45}