内存屏障机制及内核相关源代码分析-part1

上传人:ji****n 文档编号:47574378 上传时间:2018-07-03 格式:PDF 页数:8 大小:70.52KB
返回 下载 相关 举报
内存屏障机制及内核相关源代码分析-part1_第1页
第1页 / 共8页
内存屏障机制及内核相关源代码分析-part1_第2页
第2页 / 共8页
内存屏障机制及内核相关源代码分析-part1_第3页
第3页 / 共8页
内存屏障机制及内核相关源代码分析-part1_第4页
第4页 / 共8页
内存屏障机制及内核相关源代码分析-part1_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《内存屏障机制及内核相关源代码分析-part1》由会员分享,可在线阅读,更多相关《内存屏障机制及内核相关源代码分析-part1(8页珍藏版)》请在金锄头文库上搜索。

1、 内存屏障机制及内核相关源代码分析 分析人:余旭 分析版本:Linux Kernel 2.6.14 来自于:www.kernel.org 分析开始时间:2005-11-17-20:45:56 分析结束时间:2005-11-21-20:07:32 编号:2-1 类别:进程管理-准备工作 1-内存屏障 Email: 版权声明:版权保留。本文用作其他用途当经作者本人同意,转载请注明作者姓名 All Rights Reserved. If for other use,must Agreed By the writer.Citing this text,please claim the writers

2、name. Copyright (C) 2005 YuXu * 内存屏障是 Linux Kernel 中常要遇到的问题,这里专门来对其进行研究。一者查阅网上现有资料,进行整理汇集;二者翻阅 Linux 内核方面的指导书,从中提炼观点;最后,自己加以综合分析,提出自己的看法。下面将对个问题进行专题分析。 * - 专题研究:内存屏障- -论坛众人资料汇集分析- set_current_state(),_set_current_state(),set_task_state(),_set_task_state(),rmb(),wmb(),mb()的源代码中的相关疑难问题及众人的论坛观点: - 1.-y

3、mons 在 Linux 内核技术论坛发贴问: set_current_state 和_set_current_state 的区别? #define _set_current_state(state_value) do current-state = (state_value); while (0) #define set_current_state(state_value) set_mb(current-state, (state_value) #define set_mb(var, value) do var = value; mb(); while (0) #define mb() _

4、asm_ _volatile_ (“ : : : “memory“) 在 linux 的源代码中经常有这种设置当前进程状态的代码,但我搞不清楚这两种用法的不同?有哪位大虾指点一二,必将感谢不尽! - 2.- chyyuu(chenyu-) 在 的 Linux 内核技术上发贴问: 在 kernel.h 中有一个 define /* Optimization barrier */ /* The “volatile“ is due to gcc bugs */ #define barrier() _asm_ _volatile_(“: : :“memory“) 在内核许多地方被调用,不知到底是生成

5、什么汇编指令? 请教! - 3.-tigerl 02-12-08 10:57 在 的 Linux 内核技术提问: 这一句(include/asm-i386/system.h 中)定义是什么意思? #define mb() _asm_ _volatile_ (“lock; addl $0,0(%esp)“: : :“memory“) 4.-jackcht 01-03-02 10:55 在 Linux 内核技术 : 各位大虾,我在分析 linux 的时候发现有一个古怪的函数,就是 barrier,俺愣是不知道它是干嘛用的,帮帮我这菜鸟吧,感谢感谢! 还有就是下面这句中的(“:“memory“)

6、是什么意思呀,我苦! # define barrier() _asm_volatile_(“: : :“memory“) *众人的观点* ANSWER: 1.jkl Reply:这就是所谓的内存屏障,前段时间曾经讨论过。CPU 越过内存屏障后,将刷新自已对存储器的缓冲状态。这条语句实际上不生成任何代码,但可使 gcc 在barrier()之后刷新寄存器对变量的分配。 2.wheelz 发帖指出: #define _set_task_state(tsk, state_value) do (tsk)-state = (state_value); while (0) #define set_task

7、_state(tsk, state_value) set_mb(tsk)-state, (state_value) set_task_state()带有一个 memory barrier,_set_task_state()则没有,当状态 state 是 RUNNING 时,因为 scheduler 可能访问这个 state,因此此时要变成其他状态(如 INTERRUPTIBLE),就要用 set_task_state()而当 state 不是 RUNNING 时,因为没有其他人会访问这个 state,因此可以用_set_task_state()反正用set_task_state()肯定是安全的

8、,但_set_task_state()可能会快些。 自己分析: wheelz 讲解很清楚,尤其是指出了_set_task_state()速度会快于 set_task_state()。这一点,很多贴子忽略了,这里有独到之处。在此,作者专门强调之。 3.自己分析: 1)set_mb(),mb(),barrier()函数追踪到底,就是_asm_ _volatile_(“:“memory“),而这行代码就是内存屏障。 2)_asm_用于指示编译器在此插入汇编语句 3)_volatile_用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。 4)memo

9、ry 强制 gcc 编译器假设 RAM 所有内存单元均被汇编指令修改,这样 cpu 中的 registers 和 cache 中已缓存的内存单元中的数据将作废。cpu 将不得不在需要的时候重新读取内存中的数据。这就阻止了 cpu 又将 registers,cache 中的数据用于去优化指令,而避免去访问内存。 5)“:表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。在后文将讨论什么叫串行化指令。 6)_asm_,_volatile_,memory 在前面已经解释 7)lock 前缀表示将后面这句汇编语句:“addl $0,0(%esp)“作为 cpu 的一个内存屏障。 8)

10、addl $0,0(%esp)表示将数值 0 加到 esp 寄存器中,而该寄存器指向栈顶的内存单元。加上一个 0,esp 寄存器的数值依然不变。即这是一条无用的汇编指令。在此利用这条无价值的汇编指令来配合 lock 指令,在_asm_,_volatile_,memory 的作用下,用作 cpu 的内存屏障。 9)set_current_state()和_set_current_state()区别就不难看出。 10)至于 barrier()就很易懂了。 11)作者注明:作者在回答这个问题时候,参考了深入理解 LINUX 内核一书,陈莉君译,中国电力出版社,P174 4.xshell 发贴指出:

11、#include “void rmb(void);“ “void wmb(void);“ “void mb(void);“ 这些函数在已编译的指令流中插入硬件内存屏障; 具体的插入方法是平台相关的。 rmb (读内存屏障) 保证了屏障之前的读操作一定会在后来的读操作执行之前完成。 wmb 保证写操作不会乱序,mb 指令保证了两者都不会。这些函数都是 barrier 函数的超集。解释一下:编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据缓存,读写指令乱序执行等等。如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错误。但如果对 I/O 操作进行类似优化很可能造成致命错误

12、。所以要使用内存屏障,以强制该语句前后的指令以正确的次序完成。其实在指令序列中放一个 wmb 的效果是使得指令执行到该处时,把所有缓存的数据写到 该写的地方,同时使得 wmb 前面的写指令一定会在 wmb 的写指令之前执行。 5.Nazarite 发贴指出: _volatitle_是防止编译器移动该指令的位置或者把它优化掉。“memory“,是提示编译器该指令对内存修改,防止使用某个寄存器中已经 load 的内存的值。lock 前缀是让 cpu 的执行下一行指令之前,保证以前的指令都被正确执行。 再次发贴指出: The memory keyword forces the compiler to

13、 assume that all memory locations in RAM have been changed by the assembly language instruction; therefore, the compiler cannot optimize the code by using the values of memory locations stored in CPU registers before the asm instruction. 6.bx bird 发贴指出: cpu 上有一根 pin #HLOCK 连到北桥,lock 前缀会在执行这条指令前先去拉这根 pin,持续到这个指令结束时放开#HLOCK pin,在这期间,北桥会屏蔽掉一切外设以及AGP 的内存操作。也就保证了这条指令的 atomic。 7.coldwind 发贴指出: “memory“,是提示编译器该指令对内存修改,防止使用某个寄存器中已经 load 的内存的值,应该是告诉 CPU 内存已经被修改过,让 CPU invalidate 所有的 cache。 通过以上众人的贴子的分析,自己综合一下,这 4 个宏 set_current_state(),_set_current_state(),set_task_state(),_set_task_sta

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号