Skip to main content

PageTable

Struct PageTable 

Source
pub struct PageTable<T: TableMeta, A: FrameAllocator> { /* private fields */ }

Implementations§

Source§

impl<T: TableMeta, A: FrameAllocator> PageTable<T, A>

Source

pub const VALID_BITS: usize = Frame<T, A>::PT_VALID_BITS

Source

pub fn new(allocator: A) -> PagingResult<Self>

创建一个新的页表

Source

pub const fn root_paddr(&self) -> PhysAddr

Source

pub fn clone_missing_root_entries_from( &mut self, other: &PageTableRef<T, A>, start_vaddr: VirtAddr, size: usize, ) -> PagingResult

Deep-copies source root entries that are absent from this page table.

Leaf mappings keep referring to the same physical memory, while every copied intermediate page-table frame is independently owned by this page table. Existing destination root entries are left unchanged.

If allocation fails, entries copied before the failure remain installed and are reclaimed normally when this page table is dropped.

§Errors

Returns an error if the range overflows or wraps around the root table, or if an intermediate page-table frame cannot be allocated.

Methods from Deref<Target = PageTableRef<T, A>>§

Source

pub fn map_page( &mut self, vaddr: VirtAddr, paddr: PhysAddr, page_size: usize, config: PteConfigOf<T>, ) -> PagingResult

Maps one page with the requested page size.

Source

pub fn map_region( &mut self, start_vaddr: VirtAddr, get_paddr: impl Fn(VirtAddr) -> PhysAddr, size: usize, config: PteConfigOf<T>, allow_huge: bool, ) -> PagingResult

Maps a contiguous virtual region, choosing large pages when possible. Mappings installed by this call are rolled back if a later page fails. TLB invalidation is deferred and batched until the region has been updated.

Source

pub fn unmap_page( &mut self, vaddr: VirtAddr, ) -> PagingResult<(PhysAddr, PteConfigOf<T>, usize)>

Unmaps one page and returns its physical address, flags, and page size.

Source

pub fn protect_page( &mut self, vaddr: VirtAddr, config: PteConfigOf<T>, ) -> PagingResult<usize>

Changes one existing mapping’s flags and returns its page size.

Source

pub fn protect_region( &mut self, start_vaddr: VirtAddr, size: usize, config: PteConfigOf<T>, ) -> PagingResult

Changes flags for a region. Unmapped base pages are skipped.

Source

pub fn remap_page( &mut self, vaddr: VirtAddr, paddr: PhysAddr, config: PteConfigOf<T>, ) -> PagingResult<usize>

Remaps one existing mapping and returns its page size.

Source

pub fn query( &self, vaddr: VirtAddr, ) -> PagingResult<(PhysAddr, PteConfigOf<T>, usize)>

Queries one mapping and returns the translated physical address, flags, and page size.

Source

pub fn map(&mut self, config: &MapConfig<PteConfigOf<T>>) -> PagingResult

映射虚拟地址范围到物理地址范围

Source

pub fn unmap(&mut self, start_vaddr: VirtAddr, size: usize) -> PagingResult<()>

取消映射虚拟地址范围

§参数
  • start_vaddr: 要取消映射的起始虚拟地址
  • size: 要取消映射的大小(字节)
§返回值
  • Ok(()): 取消映射成功
  • Err(PagingError): 取消映射失败
§行为
  • 清除指定虚拟地址范围内的所有页表项
  • 自动回收空的子页表帧
  • 支持大页和普通页面的取消映射
  • 根据配置刷新TLB
Source

pub fn unmap_with_config(&mut self, config: &UnmapConfig) -> PagingResult<()>

使用配置对象取消映射

Source

pub fn walk_all(&self, config: WalkConfig) -> PageTableWalker<'_, T, A>

创建页表遍历迭代器

Source

pub fn walk( &self, start_vaddr: VirtAddr, end_vaddr: VirtAddr, ) -> impl Iterator<Item = PteInfo<T::P>> + '_

Source

pub fn walk_valid(&self) -> impl Iterator<Item = PteInfo<T::P>> + '_

遍历所有有效的最终映射页表项(过滤掉无效项和中间级别的页表指针)

Source

pub unsafe fn deallocate(&mut self)

释放页表占用的所有页表帧

与destroy()不同,这个方法保留PageTable结构, 但释放所有关联的页表帧。调用后PageTable不再可用。

释放行为:

  • 释放所有页表帧
  • 清除所有页表项(设为invalid)
  • 不释放映射的物理页(数据页/大页)
§Safety

调用者必须确保:

  • 没有其他代码在访问这个页表
  • 没有CPU正在使用这个页表进行地址翻译
Source

pub fn deallocate_range( &mut self, start_vaddr: VirtAddr, end_vaddr: VirtAddr, ) -> PagingResult

释放页表中的指定映射区域

释放指定虚拟地址范围内的所有页表项和子页表帧 在释放前将相关PTE设为invalid

Source

pub fn translate(&self, vaddr: VirtAddr) -> PagingResult<(PhysAddr, T::P)>

通过虚拟地址查询页表项

§参数
  • vaddr: 要查询的虚拟地址
§返回值
  • Ok(T::P): 找到的页表项,包含物理地址信息
  • Err(PagingError): 查询失败,原因可能包括:
    • 地址未映射
    • 页表项无效
    • 页表层次结构错误
Source

pub fn translate_with_level( &self, vaddr: VirtAddr, ) -> PagingResult<(PhysAddr, T::P, usize)>

Translates a virtual address and returns the matched PTE level.

Source

pub fn translate_phys(&self, vaddr: VirtAddr) -> PagingResult<PhysAddr>

通过虚拟地址查询物理地址(便利方法)

§参数
  • vaddr: 要查询的虚拟地址
§返回值
  • Ok(PhysAddr): 找到的物理地址
  • Err(PagingError): 查询失败
Source

pub fn is_mapped(&self, vaddr: VirtAddr) -> bool

检查虚拟地址是否已映射

这是一个便利方法,用于快速检查地址是否已映射而不需要获取页表项

§参数
  • vaddr: 要检查的虚拟地址
§返回值
  • true: 地址已映射
  • false: 地址未映射
Source

pub fn root_paddr(&self) -> PhysAddr

获取页表的根帧物理地址

Trait Implementations§

Source§

impl<T: TableMeta, A: FrameAllocator> Deref for PageTable<T, A>

Source§

type Target = PageTableRef<T, A>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<T: TableMeta, A: FrameAllocator> DerefMut for PageTable<T, A>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl<T: TableMeta, A: FrameAllocator> Drop for PageTable<T, A>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl<T: TableMeta, A: FrameAllocator> PageTableOp for PageTable<T, A>

Source§

type PteConfig = <<T as TableMeta>::P as PageTableEntry>::PteConfig

Source§

fn addr(&self) -> PhysAddr

Source§

fn map(&mut self, config: &MapConfig<Self::PteConfig>) -> PagingResult

Source§

fn unmap(&mut self, virt_start: VirtAddr, size: usize) -> PagingResult

Auto Trait Implementations§

§

impl<T, A> Freeze for PageTable<T, A>
where A: Freeze,

§

impl<T, A> RefUnwindSafe for PageTable<T, A>

§

impl<T, A> Send for PageTable<T, A>

§

impl<T, A> Sync for PageTable<T, A>

§

impl<T, A> Unpin for PageTable<T, A>
where A: Unpin, T: Unpin,

§

impl<T, A> UnsafeUnpin for PageTable<T, A>
where A: UnsafeUnpin,

§

impl<T, A> UnwindSafe for PageTable<T, A>
where A: UnwindSafe, T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.