Chinaunix

标题: 请教__KERNEL_PERCPU被如何设置的呢? [打印本页]

作者: dingyujie    时间: 2012-08-30 17:08
标题: 请教__KERNEL_PERCPU被如何设置的呢?
在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在之前肯定需要设置妥当!

有人帮忙解答下这个问题吗?
作者: janetliu9    时间: 2012-08-30 18:53
__KERNEL_PERCPU 是个宏,定义在include/asm/segment.h中
作者: dingyujie    时间: 2012-08-30 21:18
回复 2# janetliu9

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

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

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

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2