silan
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2004-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3015回复:7

请教术语内存屏障,wmb()和rmb()(20分感谢)分数已给

楼主#
更多 发布于:2003-01-22 17:08
在Linux下面对I/O进行操作,读和写的顺序都很重要,要在每个读写的操作之后都加上wmb()/rmb()吗?文档说编译器和CPU会对代码进行优化,然后造成对I/O操作的顺序和我们代码上的顺序不一致,这种自作聪明的优化可能会使我们得到非预期的结果。其间又提到了I/O操作有边缘效应,我看的这本书比较烂,对这些术语不做任何解释,而只是对一些简单的概念绕来绕去,Faint!!!各位大虾办忙啊,解释一下这些术语吧。怎么Linux和Windows对I/O操作会有这么大差异啊(按照文档上说的应该是由于编译器造成的,难道GCC和Windows下的VC的差别很大吗)。


[编辑 -  1/27/03 by  silan]

[编辑 -  2/11/03 by  silan]
/***************************/ 认认真真学好三个代表,踏踏实实做好无产阶级接班人。 /***************************/
pengyc
驱动牛犊
驱动牛犊
  • 注册日期2001-07-16
  • 最后登录2010-04-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-22 21:32
摘自linux device driver 2nd edition:

#include <asm/system.h>
\"void rmb(void);\"
\"void wmb(void);\"
\"void mb(void);\"

这些函数在已编译的指令流中插入硬件内存屏障;具体的插入方法是平台相关的。rmb (读内存屏障)保证了屏障之前的读操作一定会在后来的读操作执行之前完成。wmb 保证写操作不会乱序,mb 指令保证了两者都不会。这些函数都是 barrier 函数的超集。

解释一下:编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据 缓存,读写指令乱序执行等等。如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错误。但如果对I/O操作进行类似优化很可能造成致命错误。所以要使用内存屏障,以强制该语句前后的指令以正确的次序完成。

在关键的地方需要加上wmb()/rmb(),以保证读写顺序。



silan
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2004-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-23 11:24
既然这种“优化”可能会产生错误,那是不是画蛇添足,甚至应该说是编译器自作聪明的bug?Window下的那些编译器好像就没有这种说法啊。能不能详细解释一下I/O操作的边际效应?对I/O操作的优化是不是也优化缓存到CPU寄存器/缓存?这不明摆着会有错误吗,为什么还要优化呢?谢谢
/***************************/ 认认真真学好三个代表,踏踏实实做好无产阶级接班人。 /***************************/
OS_Dev
驱动中牛
驱动中牛
  • 注册日期2002-01-09
  • 最后登录2004-03-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-24 10:29
X86下没有这个问题,这就是为什么萎软的文档没有这种说法的原因,因为windows只能跑x86。
I know nothing!
silan
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2004-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-27 09:15
我还是不明白,这么说能否优化还是和硬件平台相关的?或者说对I/O的乱序操作是由于CPU的自身优化处理造成的,还是说编译器根据CPU的类型优化编译时产生的?如果Linux和我的驱动都是跑在X86平台上,是不是就不需要加rmb(),wmb()这些东东?
/***************************/ 认认真真学好三个代表,踏踏实实做好无产阶级接班人。 /***************************/
OS_Dev
驱动中牛
驱动中牛
  • 注册日期2002-01-09
  • 最后登录2004-03-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-31 00:37
当然是和cpu密切相关,尤其是cache部分!
不同的cpu处理不同的,x86就不存在这个问题。
I know nothing!
callmefire
驱动牛犊
驱动牛犊
  • 注册日期2002-12-05
  • 最后登录2003-02-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-14 10:37
这个问题涉及到cache和总线锁,一般用于smp
liming
驱动牛犊
驱动牛犊
  • 注册日期2001-06-12
  • 最后登录2010-02-21
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-21 13:48
These two function expand to nothing on x86
游客

返回顶部