mbarrier

Crates.iombarrier
lib.rsmbarrier
version0.1.3
created_at2025-07-02 07:40:06.919588+00
updated_at2025-07-03 00:53:52.178406+00
descriptionCross-platform memory barrier implementations for Rust, inspired by Linux kernel
homepage
repositoryhttps://github.com/drivercraft/mbarrier
max_upload_size
id1734675
size45,074
周睿 (ZR233)

documentation

README

mbarrier

CI Crates.io Documentation

跨平台的 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);
        }
    }
}

架构支持

x86/x86_64

  • rmb(): 编译器屏障(x86 系列读操作天然有序)
  • wmb(): sfence 指令
  • mb(): mfence 指令

ARM/AArch64

  • rmb(): dmb ld / dsb ld 指令
  • wmb(): dmb st / dsb st 指令
  • mb(): dmb sy / dsb sy 指令

RISC-V

  • rmb(): fence r,r 指令
  • wmb(): fence w,w 指令
  • mb(): fence rw,rw 指令

特性标志

  • smp (默认启用): 启用 SMP 感知的屏障
  • std: 启用标准库特性(预留)

性能考虑

  • 所有屏障函数都是内联的,提供零开销抽象
  • 在不需要的架构上,某些屏障可能被优化为无操作
  • SMP 版本的屏障在单处理器系统上仅为编译器屏障

安全性

此库使用 unsafe 内联汇编来实现内存屏障。虽然这些操作在设计上是安全的,但请确保:

  1. 正确理解内存屏障的语义
  2. 在多线程环境中正确使用
  3. 了解目标架构的内存模型

许可证

此项目采用 MIT 或 Apache-2.0 双许可证。

致谢

此实现参考了 Linux 内核的内存屏障设计,特别是:

  • arch/x86/include/asm/barrier.h
  • arch/arm/include/asm/barrier.h
  • arch/arm64/include/asm/barrier.h
  • arch/riscv/include/asm/barrier.h
Commit count: 0

cargo fmt