公司网站建设管理,WordPress企业 破解主题,北京本地网络推广平台,广东黄页企业名录今天一个读者朋友给我留言#xff0c;问了这个问题#xff0c;ARM原子操作的汇编代码#xff0c;还给我截图了两个不同的解释#xff0c;让我说哪个是正确的。原子操作的起因是为了内核同步#xff0c;保证数据在正确性#xff0c;之前已经吹过一波#xff0c;可以看这几… 今天一个读者朋友给我留言问了这个问题ARM原子操作的汇编代码还给我截图了两个不同的解释让我说哪个是正确的。原子操作的起因是为了内核同步保证数据在正确性之前已经吹过一波可以看这几篇文章。Linux 互锁斥 信号量 死锁 原子操作第4章 原子操作第4章 原子操作 第二节CPU和和存储的连接图原子操作的代码我截取的这段是ARM7之后的代码在ARM6之前的CPU并不支持SMP。所以原子操作的代码也分成了ARM6之前的和ARM7之后的区分。#define ATOMIC_OP(op, c_op, asm_op) \
static inline void atomic_##op(int i, atomic_t *v) \
{ \unsigned long tmp; \int result; \\prefetchw(v-counter); \errata_855872_dmb(); \\__asm__ __volatile__( atomic_ #op \n \
1: ldrex %0, [%3]\n \#asm_op %0, %0, %4\n \strex %1, %0, [%3]\n \teq %1, #0\n \bne 1b \: r (result), r (tmp), Qo (v-counter) \: r (v-counter), Ir (i) \: cc); \
}
我们主要讨论两个汇编指令LDREX Rt,[Rn]LDREX 指令从「Rn」中获取「内存地址」并且将「内存地址」的内容加载到「Rt」目标寄存器中。STREXRd,Rt,[Rn]STREX 指令从「Rn」中获取「内存地址」并且将「内存地址」的内容加载到「Rt」目标寄存器中并且把执行结果保存在 「Rd」。在执行的时候还有两个监视器在共同工作local monitor 「本地监视器」global monitor「全局监视器」单CPU执行原子操作执行的同步情况单CPU的情况下是不需要global monitor 参与的。多CPU执行原子操作执行的同步情况多CPU的情况下需要global monitor 参与。关于这个同步机子的C语言嵌入汇编代码还有更加详细的解释大家如果有兴趣的话可以看这几个链接会更加详细。http://www.wowotech.net/linux_kenrel/atomic.htmlhttps://biscuitos.github.io/blog/ATOMIC/ 推荐阅读 专辑|Linux文章汇总 专辑|程序人生 专辑|C语言嵌入式Linux微信扫描二维码关注我的公众号