[][src]Struct x86_64::structures::paging::mapper::RecursivePageTable

pub struct RecursivePageTable<'a> { /* fields omitted */ }

A recursive page table is a last level page table with an entry mapped to the table itself.

This recursive mapping allows accessing all page tables in the hierarchy:

  • To access the level 4 page table, we “loop“ (i.e. follow the recursively mapped entry) four times.
  • To access a level 3 page table, we “loop” three times and then use the level 4 index.
  • To access a level 2 page table, we “loop” two times, then use the level 4 index, then the level 3 index.
  • To access a level 1 page table, we “loop” once, then use the level 4 index, then the level 3 index, then the level 2 index.

This struct implements the Mapper trait.

Methods

impl<'a> RecursivePageTable<'a>[src]

pub fn new(table: &'a mut PageTable) -> Result<Self, ()>[src]

Creates a new RecursivePageTable from the passed level 4 PageTable.

The page table must be recursively mapped, that means:

  • The page table must have one recursive entry, i.e. an entry that points to the table itself.
    • The reference must use that “loop”, i.e. be of the form 0o_xxx_xxx_xxx_xxx_0000 where xxx is the recursive entry.
  • The page table must be active, i.e. the CR3 register must contain its physical address.

Otherwise Err(()) is returned.

pub unsafe fn new_unchecked(
    table: &'a mut PageTable,
    recursive_index: u9
) -> Self
[src]

Creates a new RecursivePageTable without performing any checks.

The recursive_index parameter must be the index of the recursively mapped entry.

Trait Implementations

impl<'a> MapperAllSizes for RecursivePageTable<'a>[src]

fn translate_addr(&self, addr: VirtAddr) -> Option<PhysAddr>[src]

Translates the given virtual address to the physical address that it maps to. Read more

impl<'a> Mapper<Size1GiB> for RecursivePageTable<'a>[src]

unsafe fn identity_map<A>(
    &mut self,
    frame: PhysFrame<S>,
    flags: PageTableFlags,
    frame_allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
    A: FrameAllocator<Size4KiB>,
    S: PageSize,
    Self: Mapper<S>, 
[src]

Maps the given frame to the virtual page with the same address. Read more

impl<'a> Mapper<Size2MiB> for RecursivePageTable<'a>[src]

unsafe fn identity_map<A>(
    &mut self,
    frame: PhysFrame<S>,
    flags: PageTableFlags,
    frame_allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
    A: FrameAllocator<Size4KiB>,
    S: PageSize,
    Self: Mapper<S>, 
[src]

Maps the given frame to the virtual page with the same address. Read more

impl<'a> Mapper<Size4KiB> for RecursivePageTable<'a>[src]

unsafe fn identity_map<A>(
    &mut self,
    frame: PhysFrame<S>,
    flags: PageTableFlags,
    frame_allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
    A: FrameAllocator<Size4KiB>,
    S: PageSize,
    Self: Mapper<S>, 
[src]

Maps the given frame to the virtual page with the same address. Read more

impl<'a> Debug for RecursivePageTable<'a>[src]

Auto Trait Implementations

impl<'a> Unpin for RecursivePageTable<'a>

impl<'a> Send for RecursivePageTable<'a>

impl<'a> Sync for RecursivePageTable<'a>

Blanket Implementations

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]