buddy_system_allocator

'buddy_system_allocator' یک third-party crate است که یک buddy system allocator را پیاده‌سازی می‌کند. می‌توان آن را هم برای 'LockedHeap' در پیاده‌سازی [GlobalAlloc]‌(https://doc.rust-lang.org/core/alloc/trait.GlobalAlloc.html) استفاده کرد. بنابراین می‌توانید از crate استاندارد alloc (همانطور که قبل از دیدیم) یا برای تخصیص فضای آدرس دیگر استفاده کنید. به عنوان مثال، ممکن است بخواهیم فضای MMIO را برای PCI BARها اختصاص دهیم:

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);
}
  • ‏ PCI BAR‌ها همیشه دارای تراز برابر با اندازه خود هستند.
  • مثال را با cargo run در src/bare-metal/useful-crates/allocator-example/ اجرا کنید. (به دلیل وابستگی به crate در Playground اجرا نمی‌شود.)