bluempire 发表于 2013-02-05 17:27

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,偏移量怎么理解?
谢谢

瀚海书香 发表于 2013-02-06 08:17

回复 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变量了。
   

stephen_du 发表于 2013-02-06 08:28

bluempire 发表于 2013-02-06 13:00

谢谢楼上两位。
下面是我对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。

瀚海书香 发表于 2013-02-06 13:09

回复 4# bluempire
per_cpu_offset指的是每个cpu副本的私有数据区相对于 __per_cpu_start的offset。
应该是这样的

   

embeded-linux 发表于 2015-02-13 14:30

回复 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]
查看完整版本: per_cpu 疑问