#memory-allocator #memory-buffer #shared-memory #process #allocated #multiple #concurrency

不依赖 std reloaded-memory-buffers

与进程生命周期相关的共享、并发、永久内存分配器

16 个稳定版本

4.1.0 2023年12月30日
4.0.3 2023年12月26日
4.0.0 2023年11月28日
3.3.1 2023年11月26日
3.0.4 2023年7月24日

#69 in 内存管理

GPL-3.0 许可证

180KB
3.5K SLoC

重载缓冲区库



分配内存,& Knuckles

Coverage NuGet Build Status
NuGet Build Status

关于

Reloaded.Memory.Buffers 是一个用于在给定最小和最大内存地址之间分配内存的库,适用于 C# 和 Rust。

以下属性

  • 内存高效:没有浪费的内存。
  • 共享:可以被多个用户找到并读取/写入。
  • 静态:分配的数据从不移动或被覆盖。
  • 永久:分配的数据持续进程的生命周期。
  • 并发:多个用户可以同时访问。
  • 大地址感知:在 Windows 上,库可以正确利用 32 位进程中的所有 4GB。
  • 跨平台:支持 Windows、OSX 和 Linux。

注意:Rust/C 端口也支持 FreeBSD(未测试),并具有部分 (有限)Android 支持

Wiki & 文档

有关完整文档,请参阅 Wiki.

示例用例

这些只是示例

  • 钩子:使用像 Reloaded.Hooks 这样的钩子库可以减少从函数中窃取的字节数。
  • :像 Reloaded.Assembler 这样的库需要将内存分配在 x64 FASM 的前 2GB。

使用方法

!!! info "该库提供了一个简单的高级 API 以使用。"

!!! info "有关 Rust 使用方法,请参阅 Wiki。"

获取缓冲区

获取一个可以分配 4096 字节内存的缓冲区,位于地址空间的前 2GiB。

var settings = new BufferSearchSettings()
{
    MinAddress = 0,
    MaxAddress = int.MaxValue,
    Size = 4096
};

// Make sure to dispose, so lock gets released.
using var item = Buffers.GetBuffer(settings);

// Write some data, get pointer back.
var ptr = item->Append(data); 

获取带有接近度的缓冲区

获取一个缓冲区,其中写入的 4096 字节将在 0x140000000 的 2GiB 内。

var settings = BufferSearchSettings.FromProximity(int.MaxValue, (nuint)0x140000000, 4096);

// Make sure to dispose, so lock gets released.
using var item = Buffers.GetBuffer(settings);

// Write some data, get pointer back.
var ptr = item->Append(data); 

分配内存

允许您在特定地址范围和大小限制内临时分配内存。

// Arrange
var settings = new BufferAllocatorSettings()
{
    MinAddress = 0,
    MaxAddress = int.MaxValue,
    Size = 4096
};

using var item = Buffers.AllocatePrivateMemory(settings);

// You have allocated memory in first 2GiB of address space.
// Disposing this memory (via `using` statement) will free it.
item.BaseAddress.Should().NotBeNull();
item.Size.Should().BeGreaterOrEqualTo(settings.Size);

您可以在 BufferAllocatorSettings 中指定另一个进程,使用 TargetProcess = someProcess,但这仅在 Windows 上受支持。

库功能(Rust)

  • std:[默认启用] 启用使用标准库。
  • external_processes:支持外部进程(仅限 Windows)。
  • no_format:在错误中禁用代码格式化,节省 ~8kB 空间。
  • size_opt:使冷路径优化为大小而不是速度。 [需要 'nightly' Rust]
  • c_exports 为库提供 C 导出。

社区反馈

如果您有任何问题/错误报告等,请随时 创建一个问题

欢迎并鼓励贡献。只要它们满足存储库中现有代码设定的质量标准,您就可以自由实现新功能、修复错误或提出建议。

有关设置方式的想法,请参阅 Reloaded 项目配置

快乐编程 💜

依赖关系

~3–31MB
~453K SLoC