linux内核工程师 3.09.02节 Linux Per-cpu变量

1,Linux per-cpu变量的作用

当创建一个per-CPU变量时,系统中的每个处理器都会获得它自己对这个变量的拷贝(副本).存取per-CPU变量时几乎不需要加锁,因为每个处理器使用的都是它自己的拷贝



2,Linux per-cpu变量的使用

在编译的时候声明一个per-cpu变量

[cpp]  view plain  copy
  1. 编译期间创建一个per-CPU变量:  
  2.     DEFINE_PER_CPU(int,my_percpu); //声明一个变量  
  3.     DEFINE_PER_CPU(int[3],my_percpu_array); //声明一个数组  
  4.   
  5. 使用编译时生成的per-CPU变量:  
  6.     ptr = get_cpu_var(my_percpu); //  
  7.     使用ptr  
  8.     put_cpu_var(my_percpu); //  
  9.   
  10. 当然,也可以使用下列宏来访问特定CPU上的per-CPU变量  
  11.     per_cpu(my_percpu, cpu_id); //  
  12.    
  13. per-CPU变量导出,供模块使用:  
  14.     EXPORT_PER_CPU_SYMBOL(per_cpu_var);  
  15.     EXPORT_PER_CPU_SYMBOL_GPL(per_cpu_var);  

动态分配一个per-cpu变量

[cpp]  view plain  copy
  1. 动态分配per-CPU变量:  
  2.     void *alloc_percpu(type);  
  3.     void *__alloc_percpu(size_t size, size_t align);  
  4.   
  5. 使用动态生成的per-CPU变量:  
  6.     int cpu;  
  7.     cpu = get_cpu();  
  8.     ptr = per_cpu_ptr(my_percpu);  
  9.     //使用ptr  
  10.     put_cpu();  



3,per-cpu变量的原理

在调用get_cpu_var函数生成一个per-cpu变量的时候,该函数调用了preempt_disable()函数来禁止内核抢占,在多核SMP系统中,在编译的时候每个cpu的变量放在data.percpu段,在系统初始化期 间,start_kernel()函数中调用setup_per_cpu_areas()函数,用于为每个cpu的per-cpu变量副本分配空间.

[cpp]  view plain  copy
  1. 11 #define DEFINE_PER_CPU(type, name) \  
  2.   12 __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name  


猜你喜欢

转载自blog.csdn.net/zjy900507/article/details/80707590