ARM内存屏障产生的原因

【推荐阅读】

浅谈linux 内核网络 sk_buff 之克隆与复制

深入linux内核架构--进程&线程

了解Docker 依赖的linux内核技术

程序在执行时的实际内存访问顺序和程序代码编写的访问顺序不一致,会导致内存乱序访问。

  1. 编译时,编译器优化导致内存乱序访问;
  2. 执行时,多个CPU间交互引起的内存乱序访问。

这些优化可能会导致实际执行代码与程序员的代码逻辑不符,导致一些错误的发生,为了保证内存访问的一致性,也是保证程序的正确性,使用内存屏障来保证内存的访问顺序。

ARM采用的是弱一致性内存模型,使用内存屏障将一致性问题交由程序员解决。内存屏障指令的基本原则如下:

  • 所有在内存屏障指令之前的数据访问必须在内存屏障指令之前完成;
  • 所有在内存屏障指令后面的数据访问必须等待内存屏障指令执行完;
  • 多条内存屏障指令是按顺序执行的。

ARM有三种内存屏障指令,分别是:

  • Instruction Synchronization Barrier (ISB),指令同步屏障
  • Data Memory Barrier (DMB),数据存储屏障
  • Data Synchronization Barrier (DSB),数据同步屏障

假设有如下代码片段:

Core A:
	STR R0, [Msg]
	STR R1, [Flag]
Core B:
	Poll_loop:
		LDR R1, [Flag]
		CMP R1, #0
		BEQ Poll_loop
		+ DMB
		LDR R0, [Msg]

上述代码由CoreA将新数据写入Msg地址,CoreB判断Flag置位后读取新数据,但是在上述代码执行时,CoreB可能读不到最新的数据。因为CoreB乱序执行先读取了Msg,然后再读取Flag。
在弱一致内存模型中,处理器不知道Msg和Flag有数据依赖,所以需要用内存屏障指出。在"LDR R0, [Msg]"前插入DMB,保证读取完Flag后才读取Msg。

三种内存屏障有不同的用途:

1.ISB,指令同步屏障
ISB用来保证屏障后面的指令会被重新读取,以便使用当前的MMU配置检查特权和访问权限。它用于确保任何先前执行的上下文更改操作(如对系统控制寄存器的写入)在ISB完成时已经完成。例如,在硬件方面,这可能意味着指令管道被刷新。它的典型用途是内存管理、缓存控制和上下文切换代码,或者在内存中移动代码。

2.DMB,数据存储屏障
DMB阻止跨屏障指令的数据访问指令的乱序执行,所有的数据访问,包括loads和stores,但不包括指令预取,都要在DMB之前执行。
例如:

LDR x0, [x1] // Must be seen by the memory system before the STR below.
DMB ISHLD
ADD x2, #1 // May be executed before or after the memory system sees
LDR.
STR x3, [x4] // Must be seen by the memory system after the LDR above.

3.DSB,数据同步屏障
DSB与DMB不同的一点是,DSB阻止执行屏障后的任何指令,直到同步完成。

对ISB更多的解释:

ARM将上下文(context)定义为系统寄存器的状态,将上下文更改操作定义为缓存、TLB和分支预测操作,或者改变系统控制寄存器的状态,例如 SCTLR_EL1, TCR_EL1, 和TTBRn_EL1。改变上下文的操作只有在上下文同步事件后才能被保证可见。
有三种上下文同步事件:

  • 发生一个异常;
  • 从一个异常返回;
  • 指令同步屏障(ISB).

ISB刷新流水线,然后从缓存或内存重新取出指令,并确保ISB之前完成的任何上下文更改操作的效果对ISB之后的任何指令都可见。它还确保在ISB指令之后的任何上下文更改操作只在ISB执行之后生效,并且ISB之前的指令看不到这些操作。这并不意味着在每个修改处理器寄存器的指令之后都需要ISB。例如,对PSTATE字段、ELRs,SPs和SPSRs的读取或写入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值