免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: lli_njupt
打印 上一主题 下一主题

[操作系统] ARM 中的原子位操作是如何保证原子性的 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-01-03 16:10 |只看该作者
回复 10# lli_njupt

:) 请教提不上,互相讨论吧...

使用ldrex和strex来保证原子操作的话在我的理解里应该是不需要关中断的,这个就是新的ldrex和strex来保证原子操作最强大的地方
一不会锁总线,二不需要关中断。

ldrex和strex之间会发生中断会发生中断,因为没关中断的话,中断在任何地方都会发生。但是ldrex和strex的这个操作序列保证了无论是否有中断产生,操作都是原子的。

原子操作包含4个步骤:
step 1.ldrex r0,[addr]    ; 从addr中读取值,并借助monitor在对应的地址上做一个tag
step 2.  some operation   ;对读出的值做一些操作
step 3. strex r1,r0,[addr]  ;将处理后的r0写回[addr],r1指示此次写操作是否成功,而此次写操作能够成功的一个条件是,在step 1的ldrex中标记的tag仍然存在
step 4. teq r1,#0;bne 1b    ;如果step 3写失败,返回step 1.

而在linux中,在所有中断的入口都会调用clrex来清除掉monitor标记的这个tag
那么如果step 1和step 3之间有中断发生,在中断处理完成返回之后step 3会失败(因为step1中的tag已经被清除),然后又会进入step 1重新读[addr]中的值。
也就是无论如何都不会发生“交错读”这种现象。因为每次strex失败之后都会重新再读一次[addr]的值。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP