Struct x86_64::structures::paging::RecursivePageTable [−][src]
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]
impl<'a> RecursivePageTable<'a>
pub fn new(table: &'a mut PageTable) -> Result<Self, NotRecursivelyMapped>
[src]
pub fn new(table: &'a mut PageTable) -> Result<Self, NotRecursivelyMapped>
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
wherexxx
is the recursive entry.
- The reference must use that “loop”, i.e. be of the form
- The page table must be active, i.e. the CR3 register must contain its physical address.
Otherwise Err(NotRecursivelyMapped)
is returned.
pub unsafe fn new_unchecked(
table: &'a mut PageTable,
recursive_index: u9
) -> Self
[src]
pub unsafe fn new_unchecked(
table: &'a mut PageTable,
recursive_index: u9
) -> Self
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> Mapper<Size1GiB> for RecursivePageTable<'a>
[src]
impl<'a> Mapper<Size1GiB> for RecursivePageTable<'a>
fn map_to<A>(
&mut self,
page: Page<Size1GiB>,
frame: PhysFrame<Size1GiB>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<Size1GiB>, MapToError> where
A: FrameAllocator<Size4KiB>,
[src]
fn map_to<A>(
&mut self,
page: Page<Size1GiB>,
frame: PhysFrame<Size1GiB>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<Size1GiB>, MapToError> where
A: FrameAllocator<Size4KiB>,
Creates a new mapping in the page table. Read more
fn unmap(
&mut self,
page: Page<Size1GiB>
) -> Result<(PhysFrame<Size1GiB>, MapperFlush<Size1GiB>), UnmapError>
[src]
fn unmap(
&mut self,
page: Page<Size1GiB>
) -> Result<(PhysFrame<Size1GiB>, MapperFlush<Size1GiB>), UnmapError>
Removes a mapping from the page table and returns the frame that used to be mapped. Read more
fn update_flags(
&mut self,
page: Page<Size1GiB>,
flags: PageTableFlags
) -> Result<MapperFlush<Size1GiB>, FlagUpdateError>
[src]
fn update_flags(
&mut self,
page: Page<Size1GiB>,
flags: PageTableFlags
) -> Result<MapperFlush<Size1GiB>, FlagUpdateError>
Updates the flags of an existing mapping.
fn translate_page(&self, page: Page<Size1GiB>) -> Option<PhysFrame<Size1GiB>>
[src]
fn translate_page(&self, page: Page<Size1GiB>) -> Option<PhysFrame<Size1GiB>>
Return the frame that the specified page is mapped to.
fn identity_map<A>(
&mut self,
frame: PhysFrame<S>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
A: FrameAllocator<Size4KiB>,
S: PageSize,
Self: Mapper<S>,
[src]
fn identity_map<A>(
&mut self,
frame: PhysFrame<S>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
A: FrameAllocator<Size4KiB>,
S: PageSize,
Self: Mapper<S>,
Maps the given frame to the virtual page with the same address.
impl<'a> Mapper<Size2MiB> for RecursivePageTable<'a>
[src]
impl<'a> Mapper<Size2MiB> for RecursivePageTable<'a>
fn map_to<A>(
&mut self,
page: Page<Size2MiB>,
frame: PhysFrame<Size2MiB>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<Size2MiB>, MapToError> where
A: FrameAllocator<Size4KiB>,
[src]
fn map_to<A>(
&mut self,
page: Page<Size2MiB>,
frame: PhysFrame<Size2MiB>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<Size2MiB>, MapToError> where
A: FrameAllocator<Size4KiB>,
Creates a new mapping in the page table. Read more
fn unmap(
&mut self,
page: Page<Size2MiB>
) -> Result<(PhysFrame<Size2MiB>, MapperFlush<Size2MiB>), UnmapError>
[src]
fn unmap(
&mut self,
page: Page<Size2MiB>
) -> Result<(PhysFrame<Size2MiB>, MapperFlush<Size2MiB>), UnmapError>
Removes a mapping from the page table and returns the frame that used to be mapped. Read more
fn update_flags(
&mut self,
page: Page<Size2MiB>,
flags: PageTableFlags
) -> Result<MapperFlush<Size2MiB>, FlagUpdateError>
[src]
fn update_flags(
&mut self,
page: Page<Size2MiB>,
flags: PageTableFlags
) -> Result<MapperFlush<Size2MiB>, FlagUpdateError>
Updates the flags of an existing mapping.
fn translate_page(&self, page: Page<Size2MiB>) -> Option<PhysFrame<Size2MiB>>
[src]
fn translate_page(&self, page: Page<Size2MiB>) -> Option<PhysFrame<Size2MiB>>
Return the frame that the specified page is mapped to.
fn identity_map<A>(
&mut self,
frame: PhysFrame<S>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
A: FrameAllocator<Size4KiB>,
S: PageSize,
Self: Mapper<S>,
[src]
fn identity_map<A>(
&mut self,
frame: PhysFrame<S>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
A: FrameAllocator<Size4KiB>,
S: PageSize,
Self: Mapper<S>,
Maps the given frame to the virtual page with the same address.
impl<'a> Mapper<Size4KiB> for RecursivePageTable<'a>
[src]
impl<'a> Mapper<Size4KiB> for RecursivePageTable<'a>
fn map_to<A>(
&mut self,
page: Page<Size4KiB>,
frame: PhysFrame<Size4KiB>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<Size4KiB>, MapToError> where
A: FrameAllocator<Size4KiB>,
[src]
fn map_to<A>(
&mut self,
page: Page<Size4KiB>,
frame: PhysFrame<Size4KiB>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<Size4KiB>, MapToError> where
A: FrameAllocator<Size4KiB>,
Creates a new mapping in the page table. Read more
fn unmap(
&mut self,
page: Page<Size4KiB>
) -> Result<(PhysFrame<Size4KiB>, MapperFlush<Size4KiB>), UnmapError>
[src]
fn unmap(
&mut self,
page: Page<Size4KiB>
) -> Result<(PhysFrame<Size4KiB>, MapperFlush<Size4KiB>), UnmapError>
Removes a mapping from the page table and returns the frame that used to be mapped. Read more
fn update_flags(
&mut self,
page: Page<Size4KiB>,
flags: PageTableFlags
) -> Result<MapperFlush<Size4KiB>, FlagUpdateError>
[src]
fn update_flags(
&mut self,
page: Page<Size4KiB>,
flags: PageTableFlags
) -> Result<MapperFlush<Size4KiB>, FlagUpdateError>
Updates the flags of an existing mapping.
fn translate_page(&self, page: Page<Size4KiB>) -> Option<PhysFrame<Size4KiB>>
[src]
fn translate_page(&self, page: Page<Size4KiB>) -> Option<PhysFrame<Size4KiB>>
Return the frame that the specified page is mapped to.
fn identity_map<A>(
&mut self,
frame: PhysFrame<S>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
A: FrameAllocator<Size4KiB>,
S: PageSize,
Self: Mapper<S>,
[src]
fn identity_map<A>(
&mut self,
frame: PhysFrame<S>,
flags: PageTableFlags,
allocator: &mut A
) -> Result<MapperFlush<S>, MapToError> where
A: FrameAllocator<Size4KiB>,
S: PageSize,
Self: Mapper<S>,
Maps the given frame to the virtual page with the same address.
Auto Trait Implementations
impl<'a> Send for RecursivePageTable<'a>
impl<'a> Send for RecursivePageTable<'a>
impl<'a> Sync for RecursivePageTable<'a>
impl<'a> Sync for RecursivePageTable<'a>