2个版本
0.1.5 | 2021年7月24日 |
---|---|
0.1.4 | 2021年7月24日 |
#585 in 嵌入式开发
31KB
322 行
buddyalloc
:裸机Rust的简单“伙伴分配器”
你正在使用裸机上的Rust吗?#[no_std]
?你是否连一个工作的 malloc
和 free
都没有?你是否希望有一个与 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许可协议,您可根据需要选择。此代码为高度实验性代码,提供“现状”且可能对您的计算机或数据造成严重损害。