MmapRegion

Struct MmapRegion 

pub struct MmapRegion<B = ()> { /* private fields */ }
Expand description

Helper structure for working with mmaped memory regions in Unix.

The structure is used for accessing the guest’s physical memory by mmapping it into the current process.

§Limitations

When running a 64-bit virtual machine on a 32-bit hypervisor, only part of the guest’s physical memory may be mapped into the current process due to the limited virtual address space size of the process.

Implementations§

§

impl<B> MmapRegion<B>
where B: NewBitmap,

pub fn new(size: usize) -> Result<MmapRegion<B>, Error>

Creates a shared anonymous mapping of size bytes.

§Arguments
  • size - The size of the memory region in bytes.

pub fn from_file( file_offset: FileOffset, size: usize, ) -> Result<MmapRegion<B>, Error>

Creates a shared file mapping of size bytes.

§Arguments
  • file_offset - The mapping will be created at offset file_offset.start in the file referred to by file_offset.file.
  • size - The size of the memory region in bytes.

pub fn build( file_offset: Option<FileOffset>, size: usize, prot: i32, flags: i32, ) -> Result<MmapRegion<B>, Error>

Creates a mapping based on the provided arguments.

§Arguments
  • file_offset - if provided, the method will create a file mapping at offset file_offset.start in the file referred to by file_offset.file.
  • size - The size of the memory region in bytes.
  • prot - The desired memory protection of the mapping.
  • flags - This argument determines whether updates to the mapping are visible to other processes mapping the same region, and whether updates are carried through to the underlying file.

pub unsafe fn build_raw( addr: *mut u8, size: usize, prot: i32, flags: i32, ) -> Result<MmapRegion<B>, Error>

Creates a MmapRegion instance for an externally managed mapping.

This method is intended to be used exclusively in situations in which the mapping backing the region is provided by an entity outside the control of the caller (e.g. the dynamic linker).

§Arguments
  • addr - Pointer to the start of the mapping. Must be page-aligned.
  • size - The size of the memory region in bytes.
  • prot - Must correspond to the memory protection attributes of the existing mapping.
  • flags - Must correspond to the flags that were passed to mmap for the creation of the existing mapping.
§Safety

To use this safely, the caller must guarantee that addr and size define a region within a valid mapping that is already present in the process.

§

impl<B> MmapRegion<B>
where B: Bitmap,

pub fn as_ptr(&self) -> *mut u8

Returns a pointer to the beginning of the memory region. Mutable accesses performed using the resulting pointer are not automatically accounted for by the dirty bitmap tracking functionality.

Should only be used for passing this region to ioctls for setting guest memory.

pub fn size(&self) -> usize

Returns the size of this region.

pub fn file_offset(&self) -> Option<&FileOffset>

Returns information regarding the offset into the file backing this region (if any).

pub fn prot(&self) -> i32

Returns the value of the prot parameter passed to mmap when mapping this region.

pub fn flags(&self) -> i32

Returns the value of the flags parameter passed to mmap when mapping this region.

pub fn owned(&self) -> bool

Returns true if the mapping is owned by this MmapRegion instance.

pub fn fds_overlap<T>(&self, other: &MmapRegion<T>) -> bool
where T: Bitmap,

Checks whether this region and other are backed by overlapping FileOffset objects.

This is mostly a sanity check available for convenience, as different file descriptors can alias the same file.

pub fn set_hugetlbfs(&mut self, hugetlbfs: bool)

Set the hugetlbfs of the region

pub fn is_hugetlbfs(&self) -> Option<bool>

Returns true if the region is hugetlbfs

pub fn bitmap(&self) -> &B

Returns a reference to the inner bitmap object.

Trait Implementations§

§

impl<B> Debug for MmapRegion<B>
where B: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<B> Drop for MmapRegion<B>

§

fn drop(&mut self)

Executes the destructor for this type. Read more
§

impl<B> VolatileMemory for MmapRegion<B>
where B: Bitmap,

§

type B = B

Type used for dirty memory tracking.
§

fn len(&self) -> usize

Gets the size of this slice.
§

fn get_slice( &self, offset: usize, count: usize, ) -> Result<VolatileSlice<'_, <B as WithBitmapSlice<'_>>::S>, Error>

Returns a VolatileSlice of count bytes starting at offset. Read more
§

fn is_empty(&self) -> bool

Check whether the region is empty.
§

fn as_volatile_slice( &self, ) -> VolatileSlice<'_, <Self::B as WithBitmapSlice<'_>>::S>

Gets a slice of memory for the entire region that supports volatile access.
§

fn get_ref<T>( &self, offset: usize, ) -> Result<VolatileRef<'_, T, <Self::B as WithBitmapSlice<'_>>::S>, Error>
where T: ByteValued,

Gets a VolatileRef at offset.
§

fn get_array_ref<T>( &self, offset: usize, n: usize, ) -> Result<VolatileArrayRef<'_, T, <Self::B as WithBitmapSlice<'_>>::S>, Error>
where T: ByteValued,

Returns a VolatileArrayRef of n elements starting at offset.
§

unsafe fn aligned_as_ref<T>(&self, offset: usize) -> Result<&T, Error>
where T: ByteValued,

Returns a reference to an instance of T at offset. Read more
§

unsafe fn aligned_as_mut<T>(&self, offset: usize) -> Result<&mut T, Error>
where T: ByteValued,

Returns a mutable reference to an instance of T at offset. Mutable accesses performed using the resulting reference are not automatically accounted for by the dirty bitmap tracking functionality. Read more
§

fn get_atomic_ref<T>(&self, offset: usize) -> Result<&T, Error>
where T: AtomicInteger,

Returns a reference to an instance of T at offset. Mutable accesses performed using the resulting reference are not automatically accounted for by the dirty bitmap tracking functionality. Read more
§

fn compute_end_offset(&self, base: usize, offset: usize) -> Result<usize, Error>

Returns the sum of base and offset if it is valid to access a range of offset bytes starting at base. Read more
§

impl<B> Send for MmapRegion<B>
where B: Send,

§

impl<B> Sync for MmapRegion<B>
where B: Sync,

Auto Trait Implementations§

§

impl<B> Freeze for MmapRegion<B>
where B: Freeze,

§

impl<B> RefUnwindSafe for MmapRegion<B>
where B: RefUnwindSafe,

§

impl<B> Unpin for MmapRegion<B>
where B: Unpin,

§

impl<B> UnwindSafe for MmapRegion<B>
where B: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Return the immutable any encapsulated object.
Source§

fn as_mut_any(&mut self) -> &mut (dyn Any + 'static)

Return the mutable encapsulated any object.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V