buddy_system_allocator
buddy_system_allocator
是第三方 crate,用于实现基本伙伴系统分配器。同时,也可将其用于 LockedHeap
以实现 GlobalAlloc
,这样便可以使用标准的 alloc
crate(正如在 之前部分 中所示),或者用于分配其他地址空间。例如,我们可能需要为 PCI BAR 分配 MMIO 空间:
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 的对齐方式始终与其大小相等。
- 使用
src/bare-metal/useful-crates/allocator-example/
目录下的cargo run
运行该示例。(由于存在 crate 依赖项,无法在 Playground 中运行该示例。)