飞腾CPU体系结构之顺序保证指令

基本概念

飞腾CPU采用的弱顺序模型,因此程序执行的结果可能不正确,特别是涉及到多处理器编程或设备驱动编程的情况。

飞腾CPU提供ISB、DMB和DSB三种顺序保证指令,很多时候,顺序保证指令又称为屏障指令。

  1. ISB指令,主要是保证ISB指令之后的所有程序代码指令是在ISB指令执行完成后才从指令缓冲或内存中取指。一般说来,缓冲和TLB的操作之后,或者在访问系统寄存器之后,插入ISB指令,确保在ISB指令之后,前面的操作全部有效。
  2. DMB指令,主要是保证DBM指令前后的某种类型访存指令的执行必须遵守顺序。DMB指令并不保证前后访存指令完成的顺序。
  3. DSB指令,主要是保证DSB指令之前的某种类型访存指令必须在DSB指令完成之前完成。

顺序保证指令DMB和DSB,一般有两方面因素需要考虑:

  1. 范围,即在定义的范围内保证顺序性。armv8定义了四种范围,最大是全系统范围,依次是外部共享范围、内部共享范围和非共享范围。
  2. 访存指令类型,即哪些访存指令需要保证顺序性。
范围约束的访存类型
sy全系统范围读、写
st全系统范围
ld全系统范围
osh外部共享范围读、写
oshst外部共享范围
oshld外部共享范围
ish内部共享范围读、写
ishst内部共享范围
ishld内部共享范围
nsh非共享范围读、写
nshst非共享范围
nshld非共享范围

ISB

#define isb()    asm volatile("isb" : : : "memory")

DMB

#define dmb(opt)     asm volatile("dmb " #opt : : : "memory")

#define __smp_mb()     dmb(ish)
#define __smp_rmb()    dmb(ishld)
#define __smp_wmb()    dmb(ishst)

#define dma_mb()     dmb(osh)
#define dma_rmb()    dmb(oshld)
#define dma_wmb()    dmb(oshst)

DSB

#define dsb(opt)    asm volatile("dsb " #opt : : : "memory")

#define mb()     dsb(sy)
#define rmb()    dsb(ld)
#define wmb()    dsb(st)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值