- 论坛徽章:
- 0
|
x86_64的smp下,我发现会有多个内核栈,这里它定义了一个kernel_stack的per cpu变量,这个设计是怎么考虑的呢?为什么只有在x86_64下面需要多个kernel stack呢?那么这些kernel stack之间的同步是如何来做的呢?
我的内核代码是2.6.35.7.
下面的代码是在do_boot_cpu中的:- #ifdef CONFIG_X86_32
- /* Stack for startup_32 can be just as for start_secondary onwards */
- irq_ctx_init(cpu);
- #else
- clear_tsk_thread_flag(c_idle.idle, TIF_FORK);
- initial_gs = per_cpu_offset(cpu);
- per_cpu(kernel_stack, cpu) =
- (unsigned long)task_stack_page(c_idle.idle) -
- KERNEL_STACK_OFFSET + THREAD_SIZE;
- #endif
复制代码 而定义是在common.c中:- #ifdef CONFIG_X86_64
- DEFINE_PER_CPU(unsigned long, kernel_stack) =
- (unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE;
- EXPORT_PER_CPU_SYMBOL(kernel_stack);
- ................
复制代码 可以看到这里会多出来一个KERNEL_STACK_OFFSET的东西,这个偏移是什么意思?如何计算出来的呢? |
|