alloc
Para usar alloc
, vocĂȘ deve implementar um alocador global (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() { // SEGURANĂA: `HEAP` Ă© usado apenas aqui e `entry` Ă© chamado apenas uma vez. unsafe { // DĂȘ ao alocador alguma memĂłria para alocar. HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len()); } // Agora podemos fazer coisas que exigem alocação de heap. let mut v = Vec::new(); v.push("Uma string".to_string()); }
buddy_system_allocator
Ă© um crate de terceiros que implementa um alocador bĂĄsico de sistema de buddy. Outros crates estĂŁo disponĂveis, ou vocĂȘ pode escrever o seu prĂłprio ou conectar-se ao seu alocador existente.- O parĂąmetro const de
LockedHeap
Ă© a ordem mĂĄxima do alocador; ou seja, neste caso, ele pode alocar regiĂ”es de atĂ© 2**32 bytes. - Se algum crate na sua ĂĄrvore de dependĂȘncias depender de
alloc
, vocĂȘ deve ter exatamente um alocador global definido no seu binĂĄrio. Normalmente, isso Ă© feito no crate binĂĄrio de mais alto nĂvel. extern crate panic_halt as _
Ă© necessĂĄrio para garantir que o cratepanic_halt
seja vinculado para que obtenhamos seu panic handler.- Este exemplo irĂĄ compilar, mas nĂŁo executarĂĄ, pois nĂŁo possui um ponto de entrada.