Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

buddy_system_allocator

buddy_system_allocator — крейт, реализующий простой аллокатор «системы двойников». Его можно использовать как для реализации GlobalAlloc (с помощью LockedHeap), чтобы использовать стандартный крейт alloc (как мы видели ранее), так и для выделения другого адресного пространства (с помощью FrameAllocator). Например, нам может понадобиться выделить пространство MMIO для BAR PCI:

// 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);
}
  • Выравнивание BAR PCI всегда равно их размеру.
  • Запустите пример командой cargo run в каталоге src/bare-metal/useful-crates/allocator-example/. (В Playground он не запустится из-за зависимости от крейта.)