我一开始不理解其中的"memory"是什么意思,
后来在网上看到说是设置“内存屏障”的,并找到了关于"memory"的一段阐述:
“memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。”
我的问题是,这段关于"memory"的阐述,来自于哪一个权威文件或者英文手册?我在gcc手册中怎么没找到呢?
请大侠告诉我是哪一个手册,并且最好能把上面那段对阐述对应的英文原文贴出来!十分感谢!
11 个解决方案
#1
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.
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.
#2
c.一些网上抄过来的笔记
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在前面已经解释
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在前面已经解释
#3
up
#4
学习学习。。
#5
LZ 兄弟,貌似你出自华为...
#6
华为我一直都想,可惜上大学的时候不知道好好学习,毕业之后又入错行了,一转眼29了,估计没机会进华为了,希望以后能自创一个
#7
请查gcc内嵌汇编
就有详细说明的
http://topic.csdn.net/u/20090521/11/35609357-57b9-4c7c-af6a-04a76eef49a3.html
就有详细说明的
http://topic.csdn.net/u/20090521/11/35609357-57b9-4c7c-af6a-04a76eef49a3.html
#8
那在单CPU的情况,能不能说所有的asm volatile("xxxx":??:??:"memory");都隐喻了一个memory barrier?
多核的情况怎样?似乎还需要通知其他的CPU使他们对应的cache和register失效?
多核的情况怎样?似乎还需要通知其他的CPU使他们对应的cache和register失效?
#9
学习内嵌汇编 __asm __, __volatile__, ("":::"memory") 修饰字!
#10
深入理解Linux有强劲解释
#11
学习了
#1
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.
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.
#2
c.一些网上抄过来的笔记
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在前面已经解释
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在前面已经解释
#3
up
#4
学习学习。。
#5
LZ 兄弟,貌似你出自华为...
#6
华为我一直都想,可惜上大学的时候不知道好好学习,毕业之后又入错行了,一转眼29了,估计没机会进华为了,希望以后能自创一个
#7
请查gcc内嵌汇编
就有详细说明的
http://topic.csdn.net/u/20090521/11/35609357-57b9-4c7c-af6a-04a76eef49a3.html
就有详细说明的
http://topic.csdn.net/u/20090521/11/35609357-57b9-4c7c-af6a-04a76eef49a3.html
#8
那在单CPU的情况,能不能说所有的asm volatile("xxxx":??:??:"memory");都隐喻了一个memory barrier?
多核的情况怎样?似乎还需要通知其他的CPU使他们对应的cache和register失效?
多核的情况怎样?似乎还需要通知其他的CPU使他们对应的cache和register失效?
#9
学习内嵌汇编 __asm __, __volatile__, ("":::"memory") 修饰字!
#10
深入理解Linux有强劲解释
#11
学习了