ARM64 嵌入式汇编内存屏蔽指令的写法

在 ARM64 架构中,DSB(Data Synchronization Barrier)和 DMB(Data Memory Barrier)是用于强制内存访问顺序的关键指令。以下是它们在嵌入式汇编(如 GNU 汇编或 C 内联汇编)中的正确写法及其作用说明:


1. DMB(Data Memory Barrier)

作用:
确保在屏障之前的所有内存访问(Load/Store)在屏障之后的内存访问之前完成,但对指令执行顺序无影响。
常用于多核/多线程场景,防止内存访问乱序。

语法格式:

asm

复制

dmb 
常用选项:
  • ish: Inner Shareable Domain(多核间共享内存的屏障)

  • nsh: Non-shareable Domain(单核内非共享内存的屏障)

  • sy: Full System Barrier(全系统范围,默认选项)

嵌入式汇编示例:

c

复制

// C 内联汇编写法(GNU 语法)
asm volatile("dmb ish" ::: "memory");

2. DSB(Data Synchronization Barrier)

作用:
比 DMB 更严格,确保屏障之前的所有内存访问(包括缓存、总线操作)完成之后,后续指令才会执行。
常用于对硬件寄存器的操作,确保写入生效后再继续执行。

语法格式:

asm

复制

dsb 
常用选项:
  • ish: Inner Shareable Domain

  • nsh: Non-shareable Domain

  • sy: Full System Barrier(默认)

嵌入式汇编示例:

c

复制

// C 内联汇编写法(GNU 语法)
asm volatile("dsb sy" ::: "memory");

3. 典型使用场景

(1) 内存写入后确保生效

在对硬件寄存器写入后,使用 DSB 确保写入完成:

c

复制

// 写入设备寄存器
*((volatile uint32_t*)0x1000) = 0x1234;

// 强制写入完成后再继续执行
asm volatile("dsb sy" ::: "memory");
(2) 多核间共享数据同步

使用 DMB 确保多核间数据访问顺序:

c

复制

// 核1写入共享数据
shared_data = 42;
asm volatile("dmb ish" ::: "memory"); // 确保写入对其他核可见

// 核2读取共享数据
asm volatile("dmb ish" ::: "memory"); // 确保读取前内存一致性
int value = shared_data;
(3) 上下文切换或异常处理

在修改关键内存(如页表)后,使用 DSB 和 ISB 确保安全和指令流水线刷新:

c

复制

asm volatile("dsb sy");  // 确保内存操作完成
asm volatile("isb sy");  // 刷新流水线,确保后续指令使用新上下文

4. 参数选项详解

选项 作用域 描述
sy Full System 全系统范围屏障(最严格)
ish Inner Shareable 多核间共享内存的屏障
osh Outer Shareable 外部共享域(如 GPU/DMA)
nsh Non-shareable 单核内非共享内存的屏障
st Store-Store Barrier 仅针对存储操作的屏障(ARMv8 特有)

5. 注意事项

  1. 性能影响
    内存屏障会强制处理器等待操作完成,可能降低性能,需仅在必要时使用。

  2. 编译器屏障
    asm volatile("" ::: "memory") 是编译器级别的内存屏障,防止编译器重排指令,但不生成硬件指令。需与 DMB/DSB 结合使用。

  3. ARMv8 与旧架构差异
    ARMv8 对屏障语义进行了优化,部分场景下 DMB 可以替代 DSB,但需严格遵循硬件手册。


6. 完整示例(C 内联汇编)

c

复制

#include 

// 写入寄存器并同步
void write_register(uintptr_t addr, uint32_t value) {
    *((volatile uint32_t*)addr) = value;
    // 确保写入完成后再继续
    asm volatile("dsb sy" ::: "memory");
}

// 多核间共享数据操作
void update_shared_data(int* shared_var, int value) {
    *shared_var = value;
    // 确保写入对其他核可见
    asm volatile("dmb ish" ::: "memory");
}

通过合理使用 DMB 和 DSB,可以在 ARM64 嵌入式系统中确保内存访问的可靠性和一致性。

你可能感兴趣的:(cpu,arm64,内存屏障,指令屏障,嵌入式汇编)