免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3587 | 回复: 5
打印 上一主题 下一主题

[内核入门] per_cpu 疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-05 17:27 |只看该作者 |倒序浏览



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

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 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变量了。
   

论坛徽章:
0
3 [报告]
发表于 2013-02-06 08:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 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。

percpu.png (83.63 KB, 下载次数: 56)

percpu.png

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-02-06 13:09 |只看该作者
回复 4# bluempire
per_cpu_offset指的是每个cpu副本的私有数据区相对于 __per_cpu_start的offset。

应该是这样的

   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 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的偏移,这里不是应该直接传地变量就好了麽
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP