#kernel #allocator #no-std

no-std alloc_buddy_simple2

为在裸金属(no_std)上运行的Rust提供的简单、即插即用的分配器

2个版本

使用旧Rust 2015

0.1.2 2016年6月21日
0.1.1 2016年6月21日

#591 in 内存管理


2个库中使用(通过enclave

Apache-2.0/MIT

30KB
394 代码行

alloc_buddy_simple:裸金属Rust的简单“伙伴分配器”

你在裸金属上使用Rust吗?使用mallocfree吗?你想有一个兼容Rust的分配器,可以与libcollections一起使用吗?

警告:好吧,你不应该在内核空间中使用libcollections做任何严肃的事情,因为它在你耗尽内存时会引发恐慌。但是,如果你只想在启动时在已知的系统上使用一个或两个Vec,那就非常方便了,也许你愿意承担后果。

这是一个简单的伙伴分配器,你可以用它来替换Rust的常规分配器。它高度实验性,可能会损坏你的数据,使你的机器引发恐慌等。但它似乎足以使Vec::push工作,至少在非常有限的测试中是这样的。

有一个测试套件,尝试分配和释放大量内存,并试图确保每次都最终在内存中的预期位置。

使用此分配器

你可以使用以下命令将其拉入Cargo构建

[dependencies.alloc_buddy_simple]
git = "https://github.com/emk/toyos-rs"
features = ["use-as-rust-allocator"]

然后你需要在某个地方为你的堆分配一些内存。这需要在一个4096字节的边界上对齐,并且它的大小必须是2的幂。你可以使用以下声明与nasm一起使用

section .bss
align 4096
HEAP_BOTTOM:
        resb 4*1024*1024
HEAP_TOP:

从那里,你需要做的只是(1)声明一个有足够空间的空闲列表数组

extern crate alloc_buddy_simple;

use alloc_buddy_simple::{FreeBlock, initialize_allocator};

static mut FREE_LISTS: [*mut FreeBlock; 19] = [0 as *mut _; 19];

这里的难点是19。这决定了最小可分配的块大小,这将大于heap_size >> (19 - 1)。你的最小块大小必须至少与一个FreeBlock一样大。

关于调用 initialize_allocator,请参考toyos 的 heap.rs 文件中的示例代码。在使用堆之前执行此操作,否则您可能会遇到 Rust 的 panic!

编译自定义 libcollections

您需要手动编译来自 rust/src 目录的一组库,并将它们复制到 ~/.multirust/toolchains/nightly/lib/rustlib/$(target)/lib 或您系统上的等效目录。有关示例代码,请参阅toyos 的 Makefile

如果您的内核空间不支持浮点数,您可能还需要将barebones nofp 补丁应用到 libcore

警告

此代码仅在内存的“低半部分”运行,如果您将堆存储在内存范围的“高半部分”,您可能会遇到一些与 isizeusize 相关的问题。

许可协议

根据您的选择,在Apache License, Version 2.0MIT 许可协议下许可。这是一份高度实验性的“原样提供”代码,它可能会对您的计算机或数据造成严重损害。但如果您正在内核空间中实现一个具有 panic 的 malloc 版本并使用随机的 unsafe 不稳定的 Rust 库,您可能已经知道了这一点。

依赖项

~40KB