linux内核工程师 3.09.02节 Linux Per-cpu变量
1,Linux per-cpu变量的作用
当创建一个per-CPU变量时,系统中的每个处理器都会获得它自己对这个变量的拷贝(副本).存取per-CPU变量时几乎不需要加锁,因为每个处理器使用的都是它自己的拷贝
2,Linux per-cpu变量的使用
在编译的时候声明一个per-cpu变量
- 编译期间创建一个per-CPU变量:
- DEFINE_PER_CPU(int,my_percpu); //声明一个变量
- DEFINE_PER_CPU(int[3],my_percpu_array); //声明一个数组
- 使用编译时生成的per-CPU变量:
- ptr = get_cpu_var(my_percpu); //
- 使用ptr
- put_cpu_var(my_percpu); //
- 当然,也可以使用下列宏来访问特定CPU上的per-CPU变量
- per_cpu(my_percpu, cpu_id); //
- per-CPU变量导出,供模块使用:
- EXPORT_PER_CPU_SYMBOL(per_cpu_var);
- EXPORT_PER_CPU_SYMBOL_GPL(per_cpu_var);
动态分配一个per-cpu变量
- 动态分配per-CPU变量:
- void *alloc_percpu(type);
- void *__alloc_percpu(size_t size, size_t align);
- 使用动态生成的per-CPU变量:
- int cpu;
- cpu = get_cpu();
- ptr = per_cpu_ptr(my_percpu);
- //使用ptr
- 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变量副本分配空间.
- 11 #define DEFINE_PER_CPU(type, name) \
- 12 __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name