免费注册 查看新帖 |

Chinaunix

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

[CPU及多核] 请教__KERNEL_PERCPU被如何设置的呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-30 17:08 |只看该作者 |倒序浏览
在x86/kernel/head_32.S中:

movl $(__KERNEL_PERCPU), %eax
movl %eax,%fs

而__KERNEL_PERCPU是per-CPU GDT的一项:

*  ------- start of kernel segments:
*
*  12 - kernel code segment                <==== new cacheline
*  13 - kernel data segment
*  14 - default user CS
*  15 - default user DS
*  16 - TSS
*  17 - LDT
*  18 - PNPBIOS support (16->32 gate)
*  19 - PNPBIOS support
*  20 - PNPBIOS support
*  21 - PNPBIOS support
*  22 - PNPBIOS support
*  23 - APM BIOS support
*  24 - APM BIOS support
*  25 - APM BIOS support
*
*  26 - ESPFIX small SS
*  27 - per-cpu                        [ offset to per-cpu data area ]
*  28 - stack_canary-20                [ for stack protector ]
*  29 - unused
*  30 - unused
*  31 - TSS for double fault handler

在BP运行时,这个27项,也就是per-cpu项中的值,是如何设置的呢?

因为在start_kernel的开始调用boot_cpu_init的时候,就会调用smp_processor_id了,这里面会使用%%fs:cpu_number来获取cpu id。。。
那说明这个fs在之前肯定需要设置妥当!

有人帮忙解答下这个问题吗?

论坛徽章:
0
2 [报告]
发表于 2012-08-30 18:53 |只看该作者
__KERNEL_PERCPU 是个宏,定义在include/asm/segment.h中

论坛徽章:
0
3 [报告]
发表于 2012-08-30 21:18 |只看该作者
回复 2# janetliu9

这点我知道,但是这个位置处的描述符内容是如何填充的呢?特别是head_32.S里面:

movl $(__KERNEL_PERCPU), %eax
movl %eax,%fs

此时__KERNEL_PERCPU处的描述符内的基址应该是percpu区的基址吧,这是在何时设置的呢?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP