1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
//! Memory mapper module. use core::num::NonZeroUsize; /// A mapper trait for accessing physical memory. pub trait Mapper { /// Maps `bytes` bytes of physical memory region starting from `phys_start` and returns the /// first virtual address. /// /// # Safety /// /// The caller must ensure that /// - no [`&mut`] references are aliased. /// - no values have invalid or uninitialized values. /// /// The caller must be careful, especially if it tries to remap by calling [`Mapper::unmap`], then /// [`Mapper::map`] to the same memory region. /// /// # Examples /// /// ```no_run /// use accessor::mapper::Mapper; /// /// unsafe fn map_pages<M>(m: &mut M, phys_start: usize, bytes: usize) /// where /// M: Mapper /// { /// let virt_start = m.map(phys_start, bytes); /// println!("Physical address 0x{:X} is mapped to the virtual address 0x{:X}.", /// phys_start, virt_start); /// } unsafe fn map(&mut self, phys_start: usize, bytes: usize) -> NonZeroUsize; /// Unmaps `bytes` bytes of the virtual memory region starting from `virt_start`. /// /// # Examples /// /// ```no_run /// use accessor::mapper::Mapper; /// /// fn unmap_pages<M>(m: &mut M, virt_start: usize, bytes: usize) /// where /// M: Mapper, /// { /// m.unmap(virt_start, bytes); /// println!( /// "Virtual memory region 0x{:X}..0x{:X} is unmapped.", /// virt_start, /// virt_start + bytes /// ); /// } /// ``` fn unmap(&mut self, virt_start: usize, bytes: usize); }