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

Download history 971/week @ 2024-03-13 737/week @ 2024-03-20 152/week @ 2024-03-27 617/week @ 2024-04-03 469/week @ 2024-04-10 762/week @ 2024-04-17 686/week @ 2024-04-24 541/week @ 2024-05-01 547/week @ 2024-05-08 975/week @ 2024-05-15 1329/week @ 2024-05-22 395/week @ 2024-05-29 1045/week @ 2024-06-05 570/week @ 2024-06-12 19/week @ 2024-06-19 187/week @ 2024-06-26

每月下载量1,963

自定义许可

11KB
131

Rust crates.io docs.rs

kernel-alloc-rs

针对Windows内核空间定制的内存分配器。

为什么需要?

Rust有许多有用的抽象和实用工具,例如StringVecBox,它们需要堆分配。为了能够在Windows内核空间中使用它们,我们需要在运行时分配内存,这需要一个自定义分配器。此crate提供针对Windows内核定制的这样的分配器。

有关Rust中自定义分配器的更多信息,请参阅alloc::GlobalAllocatoralloc::Allocator文档。此外,Rust书籍提供了有关global_allocatorallocator_api的详细信息。

示例

要将KernelAllocPhysicalAllocator用作您的全局分配器,请将适当的代码添加到您的内核模块中

对于KernelAlloc

use kernel_alloc::KernelAlloc;

#[global_allocator]
static GLOBAL: KernelAlloc = KernelAlloc;

对于PhysicalAllocator

use kernel_alloc::PhysicalAllocator;

#[global_allocator]
static GLOBAL: PhysicalAllocator = PhysicalAllocator;

Box一起使用

一旦您将KernelAllocPhysicalAllocator设置为全局分配器,您就可以像在标准Rust环境中一样使用Box和其他堆分配类型。

以下是一个示例,演示如何使用KernelAllocPhysicalAllocatorBox一起在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,
        })
    }
}

致谢/参考

依赖项

~225KB