alloc

برای استفاده از alloc باید یک global (heap) allocator را پیاده‌سازی کنید.

#![no_main]
#![no_std]

extern crate alloc;
extern crate panic_halt as _;

use alloc::string::ToString;
use alloc::vec::Vec;
use buddy_system_allocator::LockedHeap;

#[global_allocator]
static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new();

static mut HEAP: [u8; 65536] = [0; 65536];

pub fn entry() {
    // SAFETY: `HEAP` is only used here and `entry` is only called once.
    unsafe {
        // Give the allocator some memory to allocate.
        HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len());
    }

    // Now we can do things that require heap allocation.
    let mut v = Vec::new();
    v.push("A string".to_string());
}
  • buddy_system_allocatorیک third-party crate است که یک تخصیص‌دهنده buddy system را پیاده‌سازی می‌کند. crateهای دیگر در دسترس هستند یا می‌توانید نسخه مربوط به خود را بنویسید یا به تخصیص دهنده موجود خود متصل کنید.
  • پارامتر const LockedHeap حداکثر ترتیب تخصیص‌دهنده (allocator) است. یعنی در این مورد می‌تواند مناطقی تا 2**32 بایت را اختصاص دهد.
  • اگر هر crate ای در درخت وابستگی شما به alloc بستگی دارد، باید دقیقاً یک تخصیص‌دهنده سراسری در باینری خود تعریف کنید. معمولاً این کار در binary crate سطح بالا انجام می‌شود.
  • برای اطمینان از اینکه panic_halt crate لینک شده است، استفاده extern crate panic_halt as _ ضروری است، بنابراین panic handler آن را دریافت می‌کنیم.
  • این مثال ساخته می شود اما اجرا نمی‌شود، زیرا entry point ندارد.