Mapper (Virtual Memory Management)
Mapper
is a trait that provides a way to map and unmap virtual memory.
It is defined in awkernel_lib/src/paging.rs as follows.
#![allow(unused)] fn main() { pub trait Mapper { /// Return the physical address of `vm_addr`. fn vm_to_phy(vm_addr: VirtAddr) -> Option<PhyAddr>; /// Map `vm_addr` to `phy_addr` with `flag`. /// /// # Safety /// /// - Virtual memory must be enabled. /// - `flag` must be reasonable. /// - `phy_addr` must be being unmapped. unsafe fn map(vm_addr: VirtAddr, phy_addr: PhyAddr, flags: Flags) -> Result<(), MapError>; /// Unmap `vm_addr`. /// /// # Safety /// /// - Virtual memory must be enabled. /// - `vm_addr` must be being mapped. unsafe fn unmap(vm_addr: VirtAddr); } }
Mapper
uses VirtAddr
and PhyAddr
types to represent virtual and physical addresses.
These types are defined in awkernel_lib/src/addr/virt_addr.rs and awkernel_lib/src/addr/phy_addr.rs.
The Flags
type is used to represent the flags of the page table entry.
It is defined in awkernel_lib/src/paging.rs as follows.
#![allow(unused)] fn main() { /// Flag for a page. /// Note that every page is readable. #[derive(Debug, Clone, Copy)] pub struct Flags { pub execute: bool, // executable pub write: bool, // writable pub cache: bool, // enable cache pub write_through: bool, // write back if disabled pub device: bool, // this page is for MMIO, ignored on x86 } }
There are functions regarding the Mapper
trait in awkernel_lib/src/paging.rs as follows.
function | description |
---|---|
fn vm_to_phy(vm_addr: VirtAddr) -> Option<PhyAddr> | Return the physical address of vm_addr . |
unsafe fn map(vm_addr: VirtAddr, phy_addr: PhyAddr, flags: Flags) -> Result<(), MapError> | Map vm_addr to phy_addr with flag . |
fn unsafe fn unmap(vm_addr: VirtAddr) | Unmap vm_addr . |
Awkernel's page size is 4 KiB and it is defined by PAGESIZE
:awkernel_lib/src/paging.rs.
#![allow(unused)] fn main() { pub const PAGESIZE: usize = 4 * 1024; }
Implementation
x86_64
For x86_64, the X86
structure implements the Mapper
trait in awkernel_lib/src/arch/x86_64/paging.rs.
To handle page tables, the OffsetPageTable
structure defined in the x86_64
crate is used.
AArch64
For AArch64, the AArch64
structure implements the Mapper
trait in awkernel_lib/src/arch/aarch64/paging.rs.
To handle page tables, the PageTable
structure defined in the awkernel_lib/src/arch/aarch64/page_table.rs
is used.