pub struct CachedViewBuilder<T, Q> { /* private fields */ }

Implementations§

source§

impl<T: MemoryView> CachedViewBuilder<T, DefaultCacheValidator>

source

pub fn new(mem: T) -> Self

Creates a new CachedView builder. The memory object is mandatory as the CachedView struct wraps around it.

This type of cache also is required to know the exact page size of the target system. This can either be set directly via the page_size() method or via the arch() method. If no page size has been set this builder will fail to build the CachedView.

Without further adjustments this function creates a cache that is 2 megabytes in size and caches pages that contain pagetable entries as well as read-only pages.

It is also possible to either let the CachedView object own or just borrow the underlying memory object.

Examples

Moves ownership of a mem object and retrieves it back:

use memflow::prelude::v1::*;
use memflow::dummy::DummyMemory;

let mut virt_mem = VirtualDma::new(phys_mem, x64::ARCH, translator);

let mut cached_mem = CachedView::builder(virt_mem)
    .arch(x64::ARCH)
    .build()
    .unwrap();

let addr = virt_base; // some arbitrary address

cached_mem.write(addr, &MAGIC_VALUE).unwrap();

let value: u64 = cached_mem.read(addr).unwrap();
assert_eq!(value, MAGIC_VALUE);

Borrowing a mem object:

use memflow::prelude::v1::*;
use memflow::dummy::DummyMemory;

fn build<T: MemoryView>(mem: Fwd<&mut T>)
    -> impl MemoryView + '_ {
    CachedView::builder(mem)
        .arch(x64::ARCH)
        .build()
        .unwrap()
}

let mut virt_mem = VirtualDma::new(phys_mem, x64::ARCH, translator);
let mut cached_view = build(virt_mem.forward_mut());

let read = cached_view.read::<u32>(0.into()).unwrap();
source§

impl<T: MemoryView, Q: CacheValidator> CachedViewBuilder<T, Q>

source

pub fn build<'a>(self) -> Result<CachedView<'a, T, Q>>

Builds the CachedView object or returns an error if the page size is not set.

source

pub fn validator<QN: CacheValidator>( self, validator: QN ) -> CachedViewBuilder<T, QN>

Sets a custom validator for the cache.

If this function is not called it will default to a DefaultCacheValidator. The default validator for std builds is the [TimedCacheValidator]. The default validator for no_std builds is the [CountCacheValidator].

The default setting is DefaultCacheValidator::default().

Examples:
use memflow::prelude::v1::*;
use memflow::dummy::DummyMemory;
use std::time::Duration;

let mut virt_mem = VirtualDma::new(phys_mem, x64::ARCH, translator);

let mut cached_mem = CachedView::builder(virt_mem)
    .arch(x64::ARCH)
    .validator(DefaultCacheValidator::new(Duration::from_millis(2000).into()))
    .build()
    .unwrap();

let addr = virt_base; // some arbitrary address

cached_mem.write(addr, &MAGIC_VALUE).unwrap();

let value: u64 = cached_mem.read(addr).unwrap();
assert_eq!(value, MAGIC_VALUE);
source

pub fn page_size(self, page_size: usize) -> Self

Changes the page size of the cache.

The cache has to know the exact page size of the target system internally to give reasonable performance. The page size can be either set directly via this function or it can be fetched from the Architecture via the arch() method of the builder.

If the page size is not set the builder will fail.

Examples
use memflow::prelude::v1::*;
use memflow::dummy::DummyMemory;

let mut virt_mem = VirtualDma::new(phys_mem, x64::ARCH, translator);

let mut cached_mem = CachedView::builder(virt_mem)
    .page_size(size::kb(4))
    .build()
    .unwrap();

let addr = virt_base; // some arbitrary address

cached_mem.write(addr, &MAGIC_VALUE).unwrap();

let value: u64 = cached_mem.read(addr).unwrap();
assert_eq!(value, MAGIC_VALUE);
source

pub fn arch(self, arch: impl Into<ArchitectureObj>) -> Self

Retrieves the page size for this cache from the given Architecture.

The cache has to know the exact page size of the target system internally to give reasonable performance. The page size can be either fetched from the Architecture via this method or it can be set directly via the page_size() method of the builder.

If the page size is not set the builder will fail.

Examples
use memflow::prelude::v1::*;
use memflow::dummy::DummyMemory;

let mut virt_mem = VirtualDma::new(phys_mem, x64::ARCH, translator);

let mut cached_mem = CachedView::builder(virt_mem)
    .arch(x64::ARCH)
    .build()
    .unwrap();

let addr = virt_base; // some arbitrary address

cached_mem.write(addr, &MAGIC_VALUE).unwrap();

let value: u64 = cached_mem.read(addr).unwrap();
assert_eq!(value, MAGIC_VALUE);
source

pub fn cache_size(self, cache_size: usize) -> Self

Sets the total amount of cache to be used.

This is the total amount of cache (in bytes) this page cache will allocate. Ideally you’d want to keep this value low enough so that most of the cache stays in the lower level caches of your cpu.

The default setting is 2 megabytes.

This setting can drastically impact the performance of the cache.

Examples:
use memflow::prelude::v1::*;
use memflow::dummy::DummyMemory;

let mut virt_mem = VirtualDma::new(phys_mem, x64::ARCH, translator);

let mut cached_mem = CachedView::builder(virt_mem)
    .arch(x64::ARCH)
    .cache_size(size::mb(2))
    .build()
    .unwrap();

let addr = virt_base; // some arbitrary address

cached_mem.write(addr, &MAGIC_VALUE).unwrap();

let value: u64 = cached_mem.read(addr).unwrap();
assert_eq!(value, MAGIC_VALUE);

Auto Trait Implementations§

§

impl<T, Q> RefUnwindSafe for CachedViewBuilder<T, Q>

§

impl<T, Q> Send for CachedViewBuilder<T, Q>
where Q: Send, T: Send,

§

impl<T, Q> Sync for CachedViewBuilder<T, Q>
where Q: Sync, T: Sync,

§

impl<T, Q> Unpin for CachedViewBuilder<T, Q>
where Q: Unpin, T: Unpin,

§

impl<T, Q> UnwindSafe for CachedViewBuilder<T, Q>
where Q: UnwindSafe, T: 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> 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> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, F> From2<T> for F
where T: Into<F>,

source§

fn from2(other: T) -> F

source§

impl<T> GetWithMetadata for T

§

type ForSelf = WithMetadata_<T, T>

This is always WithMetadata_<Self, Self>
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<S> ROExtAcc for S

§

fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F

Gets a reference to a field, determined by offset. Read more
§

fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F

Gets a muatble reference to a field, determined by offset. Read more
§

fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F

Gets a const pointer to a field, the field is determined by offset. Read more
§

fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F

Gets a mutable pointer to a field, determined by offset. Read more
§

impl<S> ROExtOps<Aligned> for S

§

fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F

Replaces a field (determined by offset) with value, returning the previous value of the field. Read more
§

fn f_swap<F>(&mut self, offset: FieldOffset<S, F, Aligned>, right: &mut S)

Swaps a field (determined by offset) with the same field in right. Read more
§

fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> F
where F: Copy,

Gets a copy of a field (determined by offset). The field is determined by offset. Read more
§

impl<S> ROExtOps<Unaligned> for S

§

fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F

Replaces a field (determined by offset) with value, returning the previous value of the field. Read more
§

fn f_swap<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, right: &mut S)

Swaps a field (determined by offset) with the same field in right. Read more
§

fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> F
where F: Copy,

Gets a copy of a field (determined by offset). The field is determined by offset. Read more
§

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

§

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

Compares the address of self with the address of other. Read more
§

fn piped<F, U>(self, f: F) -> U
where F: FnOnce(Self) -> U, Self: Sized,

Emulates the pipeline operator, allowing method syntax in more places. Read more
§

fn piped_ref<'a, F, U>(&'a self, f: F) -> U
where F: FnOnce(&'a Self) -> U,

The same as piped except that the function takes &Self Useful for functions that take &Self instead of Self. Read more
§

fn piped_mut<'a, F, U>(&'a mut self, f: F) -> U
where F: FnOnce(&'a mut Self) -> U,

The same as piped, except that the function takes &mut Self. Useful for functions that take &mut Self instead of Self.
§

fn mutated<F>(self, f: F) -> Self
where F: FnOnce(&mut Self), Self: Sized,

Mutates self using a closure taking self by mutable reference, passing it along the method chain. Read more
§

fn observe<F>(self, f: F) -> Self
where F: FnOnce(&Self), Self: Sized,

Observes the value of self, passing it along unmodified. Useful in long method chains. Read more
§

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

Performs a conversion with Into. using the turbofish .into_::<_>() syntax. Read more
§

fn as_ref_<T>(&self) -> &T
where Self: AsRef<T>, T: ?Sized,

Performs a reference to reference conversion with AsRef, using the turbofish .as_ref_::<_>() syntax. Read more
§

fn as_mut_<T>(&mut self) -> &mut T
where Self: AsMut<T>, T: ?Sized,

Performs a mutable reference to mutable reference conversion with AsMut, using the turbofish .as_mut_::<_>() syntax. Read more
§

fn drop_(self)
where Self: Sized,

Drops self using method notation. Alternative to std::mem::drop. Read more
source§

impl<This> TransmuteElement for This
where This: ?Sized,

source§

unsafe fn transmute_element<T>(self) -> Self::TransmutedPtr
where Self: CanTransmuteElement<T>,

Transmutes the element type of this pointer.. Read more
source§

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

§

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>,

§

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<T> TypeIdentity for T
where T: ?Sized,

§

type Type = T

This is always Self.
§

fn into_type(self) -> Self::Type
where Self: Sized, Self::Type: Sized,

Converts a value back to the original type.
§

fn as_type(&self) -> &Self::Type

Converts a reference back to the original type.
§

fn as_type_mut(&mut self) -> &mut Self::Type

Converts a mutable reference back to the original type.
§

fn into_type_box(self: Box<Self>) -> Box<Self::Type>

Converts a box back to the original type.
§

fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type>

Converts an Arc back to the original type. Read more
§

fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type>

Converts an Rc back to the original type. Read more
§

fn from_type(this: Self::Type) -> Self
where Self: Sized, Self::Type: Sized,

Converts a value back to the original type.
§

fn from_type_ref(this: &Self::Type) -> &Self

Converts a reference back to the original type.
§

fn from_type_mut(this: &mut Self::Type) -> &mut Self

Converts a mutable reference back to the original type.
§

fn from_type_box(this: Box<Self::Type>) -> Box<Self>

Converts a box back to the original type.
§

fn from_type_arc(this: Arc<Self::Type>) -> Arc<Self>

Converts an Arc back to the original type.
§

fn from_type_rc(this: Rc<Self::Type>) -> Rc<Self>

Converts an Rc back to the original type.