7个版本
0.2.3 | 2023年8月30日 |
---|---|
0.2.2 | 2023年7月4日 |
0.2.1 | 2023年1月24日 |
0.1.2 | 2022年1月19日 |
0.1.0 | 2020年8月21日 |
在内存管理中排名第225
每月下载量1,963
11KB
131 行
kernel-alloc-rs
针对Windows内核空间定制的内存分配器。
为什么需要?
Rust有许多有用的抽象和实用工具,例如String
、Vec
和Box
,它们需要堆分配。为了能够在Windows内核空间中使用它们,我们需要在运行时分配内存,这需要一个自定义分配器。此crate提供针对Windows内核定制的这样的分配器。
有关Rust中自定义分配器的更多信息,请参阅alloc::GlobalAllocator和alloc::Allocator文档。此外,Rust书籍提供了有关global_allocator和allocator_api的详细信息。
示例
要将KernelAlloc
或PhysicalAllocator
用作您的全局分配器,请将适当的代码添加到您的内核模块中
对于KernelAlloc
use kernel_alloc::KernelAlloc;
#[global_allocator]
static GLOBAL: KernelAlloc = KernelAlloc;
对于PhysicalAllocator
use kernel_alloc::PhysicalAllocator;
#[global_allocator]
static GLOBAL: PhysicalAllocator = PhysicalAllocator;
与Box
一起使用
一旦您将KernelAlloc
或PhysicalAllocator
设置为全局分配器,您就可以像在标准Rust环境中一样使用Box
和其他堆分配类型。
以下是一个示例,演示如何使用KernelAlloc
和PhysicalAllocator
与Box
一起在Windows内核中为不同的结构体分配内存
use kernel_alloc::{KernelAlloc, PhysicalAllocator};
use core::mem;
pub const PAGE_SIZE: usize = 0x1000;
pub const KERNEL_STACK_SIZE: usize = 0x6000;
pub const STACK_CONTENTS_SIZE: usize = KERNEL_STACK_SIZE - (mem::size_of::<*mut u64>() * 2);
#[repr(C, align(4096))]
pub struct Vmxon {
pub revision_id: u32,
pub data: [u8; PAGE_SIZE - 4],
}
#[repr(C, align(4096))]
pub struct HostStackLayout {
pub stack_contents: [u8; STACK_CONTENTS_SIZE],
pub padding_1: u64,
pub reserved_1: u64,
}
pub struct Vmx {
pub vmxon_region: Box<Vmxon, PhysicalAllocator>,
pub host_rsp: Box<HostStackLayout, KernelAlloc>,
}
impl Vmx {
pub fn new() -> Result<Self, AllocError> {
let vmxon_region = unsafe { Box::try_new_zeroed_in(PhysicalAllocator)?.assume_init() };
let host_rsp = unsafe { Box::try_new_zeroed_in(KernelAlloc)?.assume_init() };
Ok(Self {
vmxon_region: vmxon_region,
host_rsp: host_rsp,
})
}
}
致谢/参考
- Vergilius项目
- @not-matthias
- @jessiep_
- @memN0ps
依赖项
~225KB