buddy_system_allocator
buddy_system_allocator é um crate de terceiros que implementa um alocador básico de sistema buddy. Ele pode ser usado tanto para LockedHeap implementando GlobalAlloc para que você possa usar o crate padrão alloc (como vimos antes), ou para alocar outro espaço de endereço. Por exemplo, podemos querer alocar espaço MMIO para os BARs PCI:
use buddy_system_allocator::FrameAllocator;
use core::alloc::Layout;
fn main() {
let mut allocator = FrameAllocator::<32>::new();
allocator.add_frame(0x200_0000, 0x400_0000);
let layout = Layout::from_size_align(0x100, 0x100).unwrap();
let bar = allocator
.alloc_aligned(layout)
.expect("Failed to allocate 0x100 byte MMIO region");
println!("Allocated 0x100 byte MMIO region at {:#x}", bar);
}
- Os BARs PCI sempre têm alinhamento igual ao seu tamanho.
- Execute o exemplo com
cargo runemsrc/bare-metal/useful-crates/allocator-example/. (Não executará no Playground por causa da dependência do crate).