Palloc
Portable linked-list allocator for embedded / baremetal systems.
Using the crate
Include this in the [dependencies]
section of Cargo.toml
palloc = "0.1.0"
This crate uses unstable features of Rust, so it requires the nightly
update channel. Update the toolchain for your project folder with:
rustup override set nightly
Crate features
spin
(default): provides a GlobalAllocator implementation using a spin lock.allocator_api
(default): enables the Allocator trait and implements it on all global allocators.
Example
#![no_std]
use core::ptr::NonNull;
use palloc::{GlobalPalloc, SpinPalloc};
// the allocator is initialized using a const empty function, but it is
// not ready yet, we must initialize it first in main.
#[global_allocator]
static mut ALLOCATOR: SpinPalloc = SpinPalloc::empty();
fn main() {
// First of all we must define the bounds of our heap. Check
// Palloc or GlobalPalloc documentation for informations.
// Heap starting address
let heap_start = 0x8000 as *mut u8;
// Heap size
let heap_size = 0xF000;
// accessing statics is an unsafe operation
// so it must be sorrounded by an unsafe block
unsafe { ALLOCATOR.init(NonNull::new(heap_start).unwrap(), heap_size) };
// we can now use the heap!
// ...
}
Documentation
Everything you need to know is already written in the rustdocs. Click on the badge under the readme's title or click here to read the full documentation.