#kernel #memory-allocator #allocator #no-std

no-std buddyalloc

适用于在嵌入式或裸机系统(no_std)上运行的Rust的简单、安全的即插即用分配器

2个版本

0.1.5 2021年7月24日
0.1.4 2021年7月24日

#585 in 嵌入式开发

Apache-2.0/MIT

31KB
322

buddyalloc:裸机Rust的简单“伙伴分配器”

你正在使用裸机上的Rust吗?#[no_std]?你是否连一个工作的 mallocfree 都没有?你是否希望有一个与 core::alloc 兼容的分配器?

这是一个简单的伙伴分配器,你可以用它来替换Rust的常规分配器。它高度实验性,可能会破坏你的数据,使机器崩溃等。但它似乎足够让 Vec::push 工作,至少在极端有限的测试中。

有一个测试套件,尝试分配和释放一些内存,并确保每次都能在内存的预期位置结束。

这个库最初是基于toyos仓库中的工作。

如何使用此分配器

// This can be a block of free system memory on your microcontroller.
const HEAP_MEM: usize  = 0xFFF0_0000;
const HEAP_SIZE: usize = 0x0008_0000;

let mut heap: Heap<16> = unsafe {
    Heap::new(NonNull::new(HEAP_MEM as *mut u8).unwrap(), HEAP_SIZE).unwrap()
};
let mem = heap.allocate(Layout::from_size_align(16, 16).unwrap()).unwrap();

// Yay! We have a 16-byte block of memory from the heap.

静态初始化

此分配器无需在运行时初始化!

const HEAP_MEM: usize  = 0xFFF0_0000;
const HEAP_SIZE: usize = 0x0008_0000;

// You'll want to wrap this heap in a lock abstraction for real-world use.
static mut ALLOCATOR: Heap<16> = unsafe {
    Heap::new_unchecked(HEAP_MEM as *mut u8, HEAP_SIZE)
};

pub fn some_func() {
  let mem = unsafe {
    ALLOCATOR.allocate(Layout::from_size_align(16, 16).unwrap()).unwrap()
  };

  // Yay! We now have a 16-byte block from the heap without initializing it!
}

查看分配器示例以了解如何使用此堆。

为什么这个crate比原始的buddy分配器更好?

对原始crate的最后修改是在2016年。它使用比我觉得舒适的更多不安全代码,没有详细的错误报告,并且没有与Rust分配器特 Traits 兼容的接口。

新版本最大限度地减少了不安全代码的使用,并优先于返回错误代码(同时提供未检查的变体)。

此外,现在每个可能的错误条件都与一个相关的错误枚举关联,确保可靠的错误报告(这在无法将调试器附加到嵌入式系统时非常重要)。

最后,由于我们报告了所有可能的错误条件,因此已从该crate中删除所有恐慌语句。

许可

许可协议为Apache License, Version 2.0或MIT许可协议,您可根据需要选择。此代码为高度实验性代码,提供“现状”且可能对您的计算机或数据造成严重损害。

无运行时依赖