跨平台的 Rust 内存屏障实现,参考 Linux 内核设计。
- 🚀 跨平台支持:x86/x86_64, ARM/AArch64, RISC-V
- 🔧 内核级实现:基于 Linux 内核的内存屏障设计
- 📦 无标准库依赖:适用于嵌入式和内核开发
- ⚡ 高性能:内联汇编实现,零开销抽象
- 🎯 SMP 感知:支持单处理器和多处理器环境
- ✅ 持续集成:在多种架构上进行测试验证
| 架构 | 状态 | 测试方式 |
|---|---|---|
| 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: 启用标准库特性(预留)
- 所有屏障函数都是内联的,提供零开销抽象
- 在不需要的架构上,某些屏障可能被优化为无操作
- SMP 版本的屏障在单处理器系统上仅为编译器屏障
此库使用 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