buddy_system_allocator

buddy_system_allocator は、基本的なバディシステム アロケータを実装するクレートです。これは、LockedHeap を使って GlobalAlloc を実装し、標準の alloc クレートを使えるようにするため (前に見たとおり)にも、FrameAllocator を使って別の アドレス空間を割り当てるためにも使用できます。たとえば、PCI BAR 用に MMIO 空間を割り当てたいことがあります:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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 では実行できません。)