uboot中语句__asm__ __volatile__("": : :"memory");理解
来源:互联网 发布:程序员技术博客 编辑:程序博客网 时间:2024/06/05 16:58
The GCC manual says using "asm volatile" prevents the asm instruction from being "moved
significantly" and adding "memory" to the clobber list prevents GCC from keeping memory values cached
in registers across the assembler instruction, but also says "GCC will perform some optimizations
across a volatile asm instruction" but doesn't explain what.
1.内存屏障(memory barrier)
#define set_mb(var, value) do { var = value; mb(); } while (0)
#define mb() __asm__ __volatile__ ("" : : : "memory")
1)set_mb(),mb(),barrier()函数追踪到底,就是__asm__ __volatile__("":::"memory"),而这行代码就是内存屏障。
2)__asm__用于指示编译器在此插入汇编语句
3)__volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
4) memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。
5)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。在后文将讨论什么叫串行化指令。
6)__asm__,__volatile__,memory在前面已经解释
转载自:http://blog.csdn.net/njuitjf/article/details/20448959
- uboot中语句__asm__ __volatile__("": : :"memory");理解
- uboot中语句__asm__ __volatile__("": : :"memory");理解
- __asm__ __volatile__ ("" : : : "memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")含义
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- 关于__asm__ __volatile__ (“” : : : “memory”)
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")
- __asm__ __volatile__("": : :"memory")含义
- __asm__ __volatile__("": : :"memory")
- 内存屏障(__asm__ __volatile__("": : :"memory"))
- 【偶遇的知识点】documentElement
- UDP协议的两个主要方法sendto和recvfrom详解
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
- matlab 矩阵数值比较总结
- 关于Request.Form的实验
- uboot中语句__asm__ __volatile__("": : :"memory");理解
- 借助WinDriver认识Windows PCIE设备的空间结构
- iOS 网络编程之TCP/IP <二> 框架的二次封装
- POJ 3618
- leetcode.304. Range Sum Query 2D - Immutable
- Codeforces Round #349 (Div. 2) C. Reberland Linguistics 【DP】
- dom4j回车换行符(给群中朋友需要解决的基础写的乱看看就行)
- iOS7.0导航栏设置
- stristr_strrchr.php