Chinaunix首页 | 论坛 | 博客
  • 博客访问: 203094
  • 博文数量: 77
  • 博客积分: 1749
  • 博客等级: 上尉
  • 技术积分: 810
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-28 18:27
文章分类
文章存档

2012年(28)

2011年(49)

分类: LINUX

2011-12-12 19:53:27

定义:DEFINE_PER_CPU(int, my_flags);
供其他模块使用,声明为全局:EXPORT_PER_CPU_SYMBOL(per_cpu_var);
赋值:__get_cpu_var(my_flags) = 1 ;
取值:if( __get_cpu_var(my_flags) == 1 )
或 :get_cpu_var(my_flags); put_cpu_var(my_flags);
或使用:per_cpu(my_flags, cpuid)来获取指定cpu的变量
for( i = 0 ; i< NR_CPUS; i++)
per_cpu(my_flags, i) = 1;
在模块中使用,声明:DECLARE_PER_CPU(int, my_flags);

说明:
per-cpu 变量的引入有效的解决了SMP系统中处理器对锁得竞争,每个cpu只需访问自己的本地变量。
自定义的所有per-cpu变量都是放在.data.percpu段的。
SMP下,每个cpu使用的都是在.data.percpu段中的这些per-cpu变量的副本,有几个cpu就创建几个这样的副本。
在系统初始化期间,start_kernel()函数中调用setup_per_cpu_areas()函数,用于为每个cpu的per-cpu变量副本分配空间,注意这时alloc内存分配器还没建立起来,该函数调用alloc_bootmem函数为初始化期间的这些变量副本分配物理空间在分配好每个cpu的per-cpu变量副本所占用的物理空间的同时,也对__per_cpu_offset[NR_CPUS]数组进行了初始化用于以后找到指定CPU的这些per-cpu变量副本。

阅读(1159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~