在 ARM64 架构中,
DSB
(Data Synchronization Barrier)和
DMB
(Data Memory Barrier)是用于强制内存访问顺序的关键指令。以下是它们在嵌入式汇编(如 GNU 汇编或 C 内联汇编)中的正确写法及其作用说明:
1.
DMB
(Data Memory Barrier)
确保在屏障
之前
的所有内存访问(Load/Store)在屏障
之后
的内存访问之前完成,但对指令执行顺序无影响。
常用于多核/多线程场景,防止内存访问乱序。
语法格式
:
dmb <option>
常用选项
:
ish
: Inner Shareable Domain(多核间共享内存的屏障)
nsh
: Non-shareable Domain(单核内非共享内存的屏障)
sy
: Full System Barrier(全系统范围,默认选项)
嵌入式汇编示例
:
// C 内联汇编写法(GNU 语法)
asm volatile("dmb ish" ::: "memory");
2.
DSB
(Data Synchronization Barrier)
比
DMB
更严格,确保屏障
之前
的所有内存访问(包括缓存、总线操作)完成之后,
后续指令
才会执行。
常用于对硬件寄存器的操作,确保写入生效后再继续执行。
语法格式
:
dsb <option>
常用选项
:
ish
: Inner Shareable Domain
nsh
: Non-shareable Domain
sy
: Full System Barrier(默认)
嵌入式汇编示例
:
// C 内联汇编写法(GNU 语法)
asm volatile("dsb sy" ::: "memory");
3. 典型使用场景
(1) 内存写入后确保生效
在对硬件寄存器写入后,使用
DSB
确保写入完成:
// 写入设备寄存器
*((volatile uint32_t*)0x1000) = 0x1234;
// 强制写入完成后再继续执行
asm volatile("dsb sy" ::: "memory");
(2) 多核间共享数据同步
使用
DMB
确保多核间数据访问顺序:
// 核1写入共享数据
shared_data = 42;
asm volatile("dmb ish" ::: "memory"); // 确保写入对其他核可见
// 核2读取共享数据
asm volatile("dmb ish" ::: "memory"); // 确保读取前内存一致性
int value = shared_data;
(3) 上下文切换或异常处理
在修改关键内存(如页表)后,使用
DSB
和
ISB
确保安全和指令流水线刷新:
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. 注意事项
内存屏障会强制处理器等待操作完成,可能降低性能,需仅在必要时使用。
编译器屏障
asm volatile("" ::: "memory")
是编译器级别的内存屏障,防止编译器重排指令,但
不生成硬件指令
。需与
DMB
/
DSB
结合使用。
ARMv8 与旧架构差异
ARMv8 对屏障语义进行了优化,部分场景下
DMB
可以替代
DSB
,但需严格遵循硬件手册。
6. 完整示例(C 内联汇编)
#include <stdint.h>
// 写入寄存器并同步
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 嵌入式系统中确保内存访问的可靠性和一致性。
文章目录
arm
64
启动过程分析
arm
64
启动过程分析(一)boot protocol
arm
64
启动过程分析(二)内核启动第一步
arm
64
启动过程分析(三)创建启动阶段页表
arm
64
启动过程分析(四)为开启mmu进行的cpu初始化
arm
64
启动过程分析(五)开启mmu
arm
64
启动过程分析(六)进入start_kernel
arm
64
启动过程分析(七)其他一些功能实现
arm
64
启动过程分析
参考:DDI0487F_b_
arm
v8_
arm
.pdf
蜗窝科技
ARM
v8A Arch
arm
64
启动过程分析
DSB
与
ISB
指令
的详解及应用
嵌入式
系统开发中,
DSB
(Data Synchronization Barrier)和
ISB
(Instruction Synchronization Barrier)
指令
是关键的同步
指令
。它们在多核处理器或多线程开发环境下起到了确保数据的一致性与同步的重要作用。本文将深入解读
DSB
和
ISB
指令
的原理、用途,并提供相应的源代码示例。
DSB
指令
的语法如下:
其中,[options]是可选的参数,用于指定同步操作的类型。常见的选项有:下面是一个简单的示例代码,展示了
DSB
指令
的使用方
一.概念:
指令
集指一个微处理器所有
指令
的集合。处理器的
指令
集可以分为CISC(复杂
指令
集)和RISC(精简
指令
集),
ARM
处理器使用RISC。
ARM
处理器支持
ARM
和Thumb两种
指令
集:
ARM
指令
集工作在32位模式下,
指令
长度都是32b;Thumb
指令
集工作在16位模式下,
指令
长度都是16b。
二.
指令
集种类
1.算术运算
指令
1.1.ADD
指令
ADD
指令