alloc

Para utilizar alloc, debes implementar un asignador global (de heap).

#![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 {
        // Proporciona al asignador algo de memoria para asignar.
        HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len());
    }

    // Ahora podemos llevar a cabo acciones que requieran la asignación de montículo.
    let mut v = Vec::new();
    v.push("A string".to_string());
}
  • buddy_system_allocator es un crate de terceros que implementa un buddy system allocator (una técnica de asignación de memoria) básico. Hay otros crates disponibles, pero también puedes escribir el tuyo propio o conectarte a tu asignador.
  • El parámetro const de LockedHeap es el orden máximo del asignador. Es decir, en este caso, puede asignar regiones de hasta 2**32 bytes.
  • Si algún crate del árbol de dependencias depende de alloc, debes tener exactamente un asignador global definido en el binario. Esto se suele hacer en el crate binario de nivel superior.
  • extern crate panic_halt as _ es necesario para asegurar que el crate panic_halt esté vinculado y así podamos obtener su controlador de panic.
  • Este ejemplo se compilará pero no se ejecutará, ya que no cuenta con un punto de entrada.