buddy_system_allocator
buddy_system_allocator
はサードパーティのクレートで、基本的なバディシステムアローケータを実装しています。このクレートはGlobalAlloc
を実装する LockedHeap
により( 以前見たように)標準のalloc
クレートを利用可能にするために使えますし、別のアドレス空間をアロケートするためにも使えます。例えば、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
とすることで実行してみましょう。(Playgroundではこの例が依存するクレートを利用できないため実行できません)