定义: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变量副本。
阅读(1168) | 评论(0) | 转发(0) |