per_cpu 疑问
#define DEFINE_PER_CPU(type, name) \
__attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name
所以
static DEFINE_PER_CPU(struct runqueue, runqueues);
会扩展成
__attribute__((__section__(".data.percpu"))) __typeof__(struct runqueue) per_cpu__runqueues;
也就是在.data.percpu这个section中定义了一个变量per_cpu__runqueues,其类型是struct runqueue。
事实上,这里所谓的变量per_cpu__runqueues,其实就是相对于__per_cpu_start的偏移量。
问题:
所谓的变量per_cpu__runqueues,其实就是相对于__per_cpu_start的偏移量,为什么???
我反汇编看到的信息:c05b9880 d per_cpu__runqueues ,c05b8000 D __per_cpu_start,偏移量怎么理解?
谢谢
回复 1# bluempire
__attribute__((__section__(".data.percpu"))) __typeof__(struct runqueue) per_cpu__runqueues;
也就是在.data.percpu这个section中定义了一个变量per_cpu__runqueues,其类型是struct runqueue。
事实上,这里所谓的变量per_cpu__runqueues,其实就是相对于__per_cpu_start的偏移量。
问题:
所谓的变量per_cpu__runqueues,其实就是相对于__per_cpu_start的偏移量,为什么???
所有的per_cpu变量初始都在.data.percpu段,每一个变量都是在_per_cpu_start后面直接添加,实际上就是一个相对于_per_cpu_start的偏移。当系统初始化的时候,每个cpu都会把.data.percpu中的数据copy到各自的专有数据区,初始化后这块空间就会释放掉了。
_per_cpu_start【struct a】【struct b】【struct c】
所以每一个变量都是相对于_per_cpu_start的偏移。当访问per_cpu变量的时候,首先找到各个cpu的偏移,然后加上每个变量相对于_per_cpu_start的偏移,就可以访问到per_cpu变量了。
谢谢楼上两位。
下面是我对per_cpu函数的理解:
per_cpu的定义如下:
#define per_cpu(var, cpu) \
(*SHIFT_PERCPU_PTR(&per_cpu_var(var), per_cpu_offset(cpu)))
其中 宏per_cpu_var是从__per_cpu_start开始的一段内存,也就是我们反汇编看到的:
c05b9880 d per_cpu__runqueues
c05b8000 D __per_cpu_start
per_cpu_offset指的是每个cpu副本的私有数据区相对于 __per_cpu_start的offset。
回复 4# bluempire
per_cpu_offset指的是每个cpu副本的私有数据区相对于 __per_cpu_start的offset。
应该是这样的
回复 2# 瀚海书香
我不认同:"所谓的变量per_cpu__runqueues,其实就是相对于__per_cpu_start的偏移量" 这个观点,因为我们看这个取per cpu变量的宏,
#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
这里可是取了per cpu变量的地址,如果per cpu变量就是相对于__per_cpu_start的偏移,这里不是应该直接传地变量就好了麽
页:
[1]