pub struct PageTable<T: TableMeta, A: FrameAllocator> { /* private fields */ }Implementations§
Source§impl<T: TableMeta, A: FrameAllocator> PageTable<T, A>
impl<T: TableMeta, A: FrameAllocator> PageTable<T, A>
pub const VALID_BITS: usize = Frame<T, A>::PT_VALID_BITS
Sourcepub fn new(allocator: A) -> PagingResult<Self>
pub fn new(allocator: A) -> PagingResult<Self>
创建一个新的页表
pub const fn root_paddr(&self) -> PhysAddr
Sourcepub fn clone_missing_root_entries_from(
&mut self,
other: &PageTableRef<T, A>,
start_vaddr: VirtAddr,
size: usize,
) -> PagingResult
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>>§
Sourcepub fn map_page(
&mut self,
vaddr: VirtAddr,
paddr: PhysAddr,
page_size: usize,
config: PteConfigOf<T>,
) -> PagingResult
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.
Sourcepub fn map_region(
&mut self,
start_vaddr: VirtAddr,
get_paddr: impl Fn(VirtAddr) -> PhysAddr,
size: usize,
config: PteConfigOf<T>,
allow_huge: bool,
) -> PagingResult
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.
Sourcepub fn unmap_page(
&mut self,
vaddr: VirtAddr,
) -> PagingResult<(PhysAddr, PteConfigOf<T>, usize)>
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.
Sourcepub fn protect_page(
&mut self,
vaddr: VirtAddr,
config: PteConfigOf<T>,
) -> PagingResult<usize>
pub fn protect_page( &mut self, vaddr: VirtAddr, config: PteConfigOf<T>, ) -> PagingResult<usize>
Changes one existing mapping’s flags and returns its page size.
Sourcepub fn protect_region(
&mut self,
start_vaddr: VirtAddr,
size: usize,
config: PteConfigOf<T>,
) -> PagingResult
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.
Sourcepub fn remap_page(
&mut self,
vaddr: VirtAddr,
paddr: PhysAddr,
config: PteConfigOf<T>,
) -> PagingResult<usize>
pub fn remap_page( &mut self, vaddr: VirtAddr, paddr: PhysAddr, config: PteConfigOf<T>, ) -> PagingResult<usize>
Remaps one existing mapping and returns its page size.
Sourcepub fn query(
&self,
vaddr: VirtAddr,
) -> PagingResult<(PhysAddr, PteConfigOf<T>, usize)>
pub fn query( &self, vaddr: VirtAddr, ) -> PagingResult<(PhysAddr, PteConfigOf<T>, usize)>
Queries one mapping and returns the translated physical address, flags, and page size.
Sourcepub fn map(&mut self, config: &MapConfig<PteConfigOf<T>>) -> PagingResult
pub fn map(&mut self, config: &MapConfig<PteConfigOf<T>>) -> PagingResult
映射虚拟地址范围到物理地址范围
Sourcepub fn unmap_with_config(&mut self, config: &UnmapConfig) -> PagingResult<()>
pub fn unmap_with_config(&mut self, config: &UnmapConfig) -> PagingResult<()>
使用配置对象取消映射
Sourcepub fn walk_all(&self, config: WalkConfig) -> PageTableWalker<'_, T, A> ⓘ
pub fn walk_all(&self, config: WalkConfig) -> PageTableWalker<'_, T, A> ⓘ
创建页表遍历迭代器
pub fn walk( &self, start_vaddr: VirtAddr, end_vaddr: VirtAddr, ) -> impl Iterator<Item = PteInfo<T::P>> + '_
Sourcepub fn walk_valid(&self) -> impl Iterator<Item = PteInfo<T::P>> + '_
pub fn walk_valid(&self) -> impl Iterator<Item = PteInfo<T::P>> + '_
遍历所有有效的最终映射页表项(过滤掉无效项和中间级别的页表指针)
Sourcepub unsafe fn deallocate(&mut self)
pub unsafe fn deallocate(&mut self)
释放页表占用的所有页表帧
与destroy()不同,这个方法保留PageTable结构, 但释放所有关联的页表帧。调用后PageTable不再可用。
释放行为:
- 释放所有页表帧
- 清除所有页表项(设为invalid)
- 不释放映射的物理页(数据页/大页)
§Safety
调用者必须确保:
- 没有其他代码在访问这个页表
- 没有CPU正在使用这个页表进行地址翻译
Sourcepub fn deallocate_range(
&mut self,
start_vaddr: VirtAddr,
end_vaddr: VirtAddr,
) -> PagingResult
pub fn deallocate_range( &mut self, start_vaddr: VirtAddr, end_vaddr: VirtAddr, ) -> PagingResult
释放页表中的指定映射区域
释放指定虚拟地址范围内的所有页表项和子页表帧 在释放前将相关PTE设为invalid
Sourcepub fn translate_with_level(
&self,
vaddr: VirtAddr,
) -> PagingResult<(PhysAddr, T::P, usize)>
pub fn translate_with_level( &self, vaddr: VirtAddr, ) -> PagingResult<(PhysAddr, T::P, usize)>
Translates a virtual address and returns the matched PTE level.
Sourcepub fn translate_phys(&self, vaddr: VirtAddr) -> PagingResult<PhysAddr>
pub fn translate_phys(&self, vaddr: VirtAddr) -> PagingResult<PhysAddr>
Sourcepub fn root_paddr(&self) -> PhysAddr
pub fn root_paddr(&self) -> PhysAddr
获取页表的根帧物理地址