Struct Frame

Source
#[repr(transparent)]
pub struct Frame<M: AnyFrameMeta + ?Sized> { ptr: *const MetaSlot, _marker: PhantomData<M>, }
Expand description

A smart pointer to a frame.

A frame is a contiguous range of bytes in physical memory. The Frame type is a smart pointer to a frame that is reference-counted.

Frames are associated with metadata. The type of the metadata M is determines the kind of the frame. If M implements AnyUFrameMeta, the frame is a untyped frame. Otherwise, it is a typed frame.

Fields§

§ptr: *const MetaSlot§_marker: PhantomData<M>

Implementations§

Source§

impl<M: AnyFrameMeta> Frame<M>

Source

pub fn from_unused(paddr: Paddr, metadata: M) -> Result<Self, GetFrameError>

Gets a Frame with a specific usage from a raw, unused page.

The caller should provide the initial metadata of the page.

If the provided frame is not truly unused at the moment, it will return an error. If wanting to acquire a frame that is already in use, use Frame::from_in_use instead.

Source

pub fn meta(&self) -> &M

Gets the metadata of this page.

Source§

impl Frame<dyn AnyFrameMeta>

Source

pub fn from_in_use(paddr: Paddr) -> Result<Self, GetFrameError>

Gets a dynamically typed Frame from a raw, in-use page.

If the provided frame is not in use at the moment, it will return an error.

The returned frame will have an extra reference count to the frame.

Source§

impl<M: AnyFrameMeta + ?Sized> Frame<M>

Source

pub fn start_paddr(&self) -> Paddr

Gets the physical address of the start of the frame.

Source

pub const fn map_level(&self) -> PagingLevel

Gets the map level of this page.

This is the level of the page table entry that maps the frame, which determines the size of the frame.

Currently, the level is always 1, which means the frame is a regular page frame.

Source

pub const fn size(&self) -> usize

Gets the size of this page in bytes.

Source

pub fn dyn_meta(&self) -> &dyn AnyFrameMeta

Gets the dyncamically-typed metadata of this frame.

If the type is known at compile time, use Frame::meta instead.

Source

pub fn reference_count(&self) -> u64

Gets the reference count of the frame.

It returns the number of all references to the frame, including all the existing frame handles (Frame, Frame<dyn AnyFrameMeta>), and all the mappings in the page table that points to the frame.

§Safety

The function is safe to call, but using it requires extra care. The reference count can be changed by other threads at any time including potentially between calling this method and acting on the result.

Source

pub fn borrow(&self) -> FrameRef<'_, M>

Borrows a reference from the given frame.

Source

pub(super) fn into_raw(self) -> Paddr

Forgets the handle to the frame.

This will result in the frame being leaked without calling the custom dropper.

A physical address to the frame is returned in case the frame needs to be restored using Frame::from_raw later. This is useful when some architectural data structures need to hold the frame handle such as the page table.

Source

pub(super) unsafe fn from_raw(paddr: Paddr) -> Self

Restores a forgotten Frame from a physical address. For the frame pointed by paddr

Source

fn slot(&self) -> &MetaSlot

Source§

impl<C: PageTableConfig> Frame<PageTablePageMeta<C>>

Source

pub(super) fn level(&self) -> PagingLevel

Source

pub(super) fn alloc(level: PagingLevel) -> Self

Allocates a new empty page table node.

Source

pub(crate) unsafe fn activate(&self)

Activates the page table assuming it is a root page table.

Here we ensure not dropping an active page table by making a processor a page table owner. When activating a page table, the reference count of the last activated page table is decremented. And that of the current page table is incremented.

§Safety

The caller must ensure that the page table to be activated has proper mappings for the kernel and has the correct const parameters matching the current CPU.

§Panics

Only top-level page tables can be activated using this function.

  • The page table should be valid by having proper mapping and level.
Source

pub(super) unsafe fn first_activate(&self)

Activates the (root) page table assuming it is the first activation.

It will not try dropping the last activate page table. It is the same with Self::activate() in other senses.

  • This function should be called only once per system.

  • The page table, from the perspective of mapping and level, should be valid.

Trait Implementations§

Source§

impl<M: AnyFrameMeta + ?Sized> Clone for Frame<M>

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<M: AnyFrameMeta + ?Sized> Debug for Frame<M>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<M: AnyFrameMeta + ?Sized> Drop for Frame<M>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<M: AnyFrameMeta> From<Frame<M>> for Frame<dyn AnyFrameMeta>

Source§

fn from(frame: Frame<M>) -> Self

Converts to this type from the input type.
Source§

impl<M: AnyUFrameMeta> From<Frame<M>> for UFrame

Source§

fn from(frame: Frame<M>) -> Self

Converts to this type from the input type.
Source§

impl<M: AnyFrameMeta + ?Sized> From<Frame<M>> for Segment<M>

Source§

fn from(frame: Frame<M>) -> Self

Converts to this type from the input type.
Source§

impl From<Frame<dyn AnyUFrameMeta>> for Frame<dyn AnyFrameMeta>

Source§

fn from(frame: UFrame) -> Self

Converts to this type from the input type.
Source§

impl<M: AnyFrameMeta + ?Sized> From<UniqueFrame<M>> for Frame<M>

Source§

fn from(unique: UniqueFrame<M>) -> Self

Converts to this type from the input type.
Source§

impl<M: AnyFrameMeta + ?Sized> NonNullPtr for Frame<M>

Source§

const ALIGN_BITS: u32 = 3u32

The power of two of the pointer alignment.
Source§

type Target = PhantomData<Frame<M>>

The target type that this pointer refers to.
Source§

type Ref<'a> = FrameRef<'a, M> where Self: 'a

A type that behaves just like a shared reference to the NonNullPtr.
Source§

fn into_raw(self) -> NonNull<Self::Target>

Converts to a raw pointer. Read more
Source§

unsafe fn from_raw(raw: NonNull<Self::Target>) -> Self

Converts back from a raw pointer. Read more
Source§

unsafe fn raw_as_ref<'a>(raw: NonNull<Self::Target>) -> Self::Ref<'a>

Obtains a shared reference to the original pointer. Read more
Source§

fn ref_as_raw(ptr_ref: Self::Ref<'_>) -> NonNull<Self::Target>

Converts a shared reference to a raw pointer.
Source§

impl<M: AnyFrameMeta + ?Sized> PartialEq for Frame<M>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<M: AnyFrameMeta + ?Sized> TryFrom<Frame<M>> for UniqueFrame<M>

Source§

fn try_from(frame: Frame<M>) -> Result<Self, Self::Error>

Tries to get a unique frame from a shared frame.

If the reference count is not 1, the frame is returned back.

Source§

type Error = Frame<M>

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

impl<M: AnyFrameMeta> TryFrom<Frame<dyn AnyFrameMeta>> for Frame<M>

Source§

fn try_from(dyn_frame: Frame<dyn AnyFrameMeta>) -> Result<Self, Self::Error>

Tries converting a Frame<dyn AnyFrameMeta> into the statically-typed Frame.

If the usage of the frame is not the same as the expected usage, it will return the dynamic frame itself as is.

Source§

type Error = Frame<dyn AnyFrameMeta>

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

impl TryFrom<Frame<dyn AnyFrameMeta>> for UFrame

Source§

fn try_from(dyn_frame: Frame<dyn AnyFrameMeta>) -> Result<Self, Self::Error>

Tries converting a Frame<dyn AnyFrameMeta> into UFrame.

If the usage of the frame is not the same as the expected usage, it will return the dynamic frame itself as is.

Source§

type Error = Frame<dyn AnyFrameMeta>

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

impl<UM: AnyUFrameMeta + ?Sized> UntypedMem for Frame<UM>

Source§

fn reader(&self) -> VmReader<'_, Infallible>

Borrows a reader that can read the untyped memory.
Source§

fn writer(&self) -> VmWriter<'_, Infallible>

Borrows a writer that can write the untyped memory.
Source§

impl<UM: AnyUFrameMeta + ?Sized> VmIo for Frame<UM>

Source§

fn read(&self, offset: usize, writer: &mut VmWriter<'_>) -> Result<()>

Reads requested data at a specified offset into a given VmWriter. Read more
Source§

fn write(&self, offset: usize, reader: &mut VmReader<'_>) -> Result<()>

Writes all data from a given VmReader at a specified offset. Read more
Source§

fn read_bytes(&self, offset: usize, buf: &mut [u8]) -> Result<()>

Reads a specified number of bytes at a specified offset into a given buffer. Read more
Source§

fn read_val<T: Pod>(&self, offset: usize) -> Result<T>

Reads a value of a specified type at a specified offset.
Source§

fn read_slice<T: Pod>(&self, offset: usize, slice: &mut [T]) -> Result<()>

Reads a slice of a specified type at a specified offset. Read more
Source§

fn write_bytes(&self, offset: usize, buf: &[u8]) -> Result<()>

Writes a specified number of bytes from a given buffer at a specified offset. Read more
Source§

fn write_val<T: Pod>(&self, offset: usize, new_val: &T) -> Result<()>

Writes a value of a specified type at a specified offset.
Source§

fn write_slice<T: Pod>(&self, offset: usize, slice: &[T]) -> Result<()>

Writes a slice of a specified type at a specified offset. Read more
Source§

fn write_vals<'a, T: Pod + 'a, I: Iterator<Item = &'a T>>( &self, offset: usize, iter: I, align: usize, ) -> Result<usize>

Writes a sequence of values given by an iterator (iter) from the specified offset (offset). Read more
Source§

impl<M: AnyFrameMeta + ?Sized> Eq for Frame<M>

Source§

impl<M: AnyFrameMeta + ?Sized> Send for Frame<M>

Source§

impl<M: AnyFrameMeta + ?Sized> Sync for Frame<M>

Auto Trait Implementations§

§

impl<M> Freeze for Frame<M>
where M: ?Sized,

§

impl<M> !RefUnwindSafe for Frame<M>

§

impl<M> Unpin for Frame<M>
where M: Unpin + ?Sized,

§

impl<M> !UnwindSafe for Frame<M>

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> 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
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. 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> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
§

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.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

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.