2个版本
使用旧Rust 2015
0.1.2 | 2016年6月21日 |
---|---|
0.1.1 | 2016年6月21日 |
#591 in 内存管理
在2个库中使用(通过enclave)
30KB
394 代码行
alloc_buddy_simple
:裸金属Rust的简单“伙伴分配器”
你在裸金属上使用Rust吗?使用malloc
和free
吗?你想有一个兼容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
。
警告
此代码仅在内存的“低半部分”运行,如果您将堆存储在内存范围的“高半部分”,您可能会遇到一些与 isize
与 usize
相关的问题。
许可协议
根据您的选择,在Apache License, Version 2.0 或 MIT 许可协议下许可。这是一份高度实验性的“原样提供”代码,它可能会对您的计算机或数据造成严重损害。但如果您正在内核空间中实现一个具有 panic 的 malloc
版本并使用随机的 unsafe 不稳定的 Rust 库,您可能已经知道了这一点。
依赖项
~40KB