Struct kernel::memory::buddy_allocator::BuddyAllocator
source · pub struct BuddyAllocator {
bins: [BTreeSet<PAddr>; 13],
}
Fields§
§bins: [BTreeSet<PAddr>; 13]
The bins of free blocks, where bin i
contains blocks of size BASE_SIZE * (2^i)
. Uses BTreeSet
to
store the blocks in each bin, for efficient buddy location. Each block is stored as the physical address
of the start of the block. The actual frames can be constructed for each block using the start address and
the order of the block.
Implementations§
source§impl BuddyAllocator
impl BuddyAllocator
pub fn new() -> BuddyAllocator
sourcepub fn add_range(&mut self, range: Range<Frame>)
pub fn add_range(&mut self, range: Range<Frame>)
Add a range of Frame
s to this allocator, marking them free to allocate.
pub fn available_bytes(&self) -> Bytes
sourcepub fn allocate_n(&mut self, block_size: Bytes) -> Option<PAddr>
pub fn allocate_n(&mut self, block_size: Bytes) -> Option<PAddr>
Allocate a block of block_size
bytes from this allocator. Returns None
if the allocator can’t satisfy
the allocation.
sourcepub fn free_n(&mut self, start: PAddr, block_size: Bytes)
pub fn free_n(&mut self, start: PAddr, block_size: Bytes)
Free a block starting at start
of block_size
bytes. block_size
must be a valid size of a whole block.
sourcefn allocate_block(&mut self, order: usize) -> Option<PAddr>
fn allocate_block(&mut self, order: usize) -> Option<PAddr>
Tries to allocate a block of the given order. If no blocks of the correct size are available, tries to recursively split a larger block to form a block of the requested size.
sourcefn free_block(&mut self, start: PAddr, order: usize)
fn free_block(&mut self, start: PAddr, order: usize)
Free a block starting at start
of order order
.
Auto Trait Implementations§
impl RefUnwindSafe for BuddyAllocator
impl Send for BuddyAllocator
impl Sync for BuddyAllocator
impl Unpin for BuddyAllocator
impl UnwindSafe for BuddyAllocator
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can then be
further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<dyn Any>
. Rc<dyn Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Anydyn Any
. This is needed since Rust cannot
generate &Anydyn Any
’s vtable from &Trait
’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Anydyn Any
. This is needed since Rust cannot
generate &mut dyn Any
’s vtable from &mut Trait
’s.