| Crates.io | mbarrier |
| lib.rs | mbarrier |
| version | 0.1.3 |
| created_at | 2025-07-02 07:40:06.919588+00 |
| updated_at | 2025-07-03 00:53:52.178406+00 |
| description | Cross-platform memory barrier implementations for Rust, inspired by Linux kernel |
| homepage | |
| repository | https://github.com/drivercraft/mbarrier |
| max_upload_size | |
| id | 1734675 |
| size | 45,074 |
跨平台的 Rust 内存屏障实现,参考 Linux 内核设计。
| 架构 | 状态 | 测试方式 |
|---|---|---|
| x86_64 | ✅ | 原生 + 交叉编译 |
| x86 (32-bit) | ✅ | 交叉编译 |
| AArch64 | ✅ | QEMU + 交叉编译 |
| ARM (32-bit) | ✅ | QEMU + 交叉编译 |
| RISC-V 64 | ✅ | QEMU + 交叉编译 |
| RISC-V 32 | ✅ | 交叉编译 |
| 函数 | 描述 |
|---|---|
rmb() |
读内存屏障 - 确保屏障前的读操作在屏障后的读操作之前完成 |
wmb() |
写内存屏障 - 确保屏障前的写操作在屏障后的写操作之前完成 |
mb() |
通用内存屏障 - 确保屏障前的所有内存操作在屏障后的操作之前完成 |
smp_rmb() |
SMP 读屏障 - 在 SMP 系统上等同于 rmb(),在 UP 系统上仅为编译器屏障 |
smp_wmb() |
SMP 写屏障 - 在 SMP 系统上等同于 wmb(),在 UP 系统上仅为编译器屏障 |
smp_mb() |
SMP 通用屏障 - 在 SMP 系统上等同于 mb(),在 UP 系统上仅为编译器屏障 |
use mbarrier::*;
// 基本用法
fn example_basic() {
// 读内存屏障
rmb();
// 写内存屏障
wmb();
// 通用内存屏障
mb();
}
// 生产者-消费者模式
fn producer_consumer_example() {
// 生产者
unsafe {
// 写入数据
core::ptr::write_volatile(data_ptr, 42);
// 写屏障确保数据写入完成
wmb();
// 设置标志
core::ptr::write_volatile(flag_ptr, true);
}
// 消费者
unsafe {
// 读取标志
if core::ptr::read_volatile(flag_ptr) {
// 读屏障确保标志读取完成
rmb();
// 读取数据
let value = core::ptr::read_volatile(data_ptr);
}
}
}
rmb(): 编译器屏障(x86 系列读操作天然有序)wmb(): sfence 指令mb(): mfence 指令rmb(): dmb ld / dsb ld 指令wmb(): dmb st / dsb st 指令mb(): dmb sy / dsb sy 指令rmb(): fence r,r 指令wmb(): fence w,w 指令mb(): fence rw,rw 指令smp (默认启用): 启用 SMP 感知的屏障std: 启用标准库特性(预留)此库使用 unsafe 内联汇编来实现内存屏障。虽然这些操作在设计上是安全的,但请确保:
此项目采用 MIT 或 Apache-2.0 双许可证。
此实现参考了 Linux 内核的内存屏障设计,特别是:
arch/x86/include/asm/barrier.harch/arm/include/asm/barrier.harch/arm64/include/asm/barrier.harch/riscv/include/asm/barrier.h