+ -
当前位置:首页 → 问答吧 → x86_64下多个内核栈的疑问

x86_64下多个内核栈的疑问

时间:2010-10-02

来源:互联网

x86_64的smp下,我发现会有多个内核栈,这里它定义了一个kernel_stack的per cpu变量,这个设计是怎么考虑的呢?为什么只有在x86_64下面需要多个kernel stack呢?那么这些kernel stack之间的同步是如何来做的呢?

我的内核代码是2.6.35.7.

下面的代码是在do_boot_cpu中的:
  1. #ifdef CONFIG_X86_32
  2.         /* Stack for startup_32 can be just as for start_secondary onwards */
  3.         irq_ctx_init(cpu);
  4. #else
  5.         clear_tsk_thread_flag(c_idle.idle, TIF_FORK);
  6.         initial_gs = per_cpu_offset(cpu);
  7.         per_cpu(kernel_stack, cpu) =
  8.                 (unsigned long)task_stack_page(c_idle.idle) -
  9.                 KERNEL_STACK_OFFSET + THREAD_SIZE;
  10. #endif
复制代码
而定义是在common.c中:
  1. #ifdef CONFIG_X86_64
  2. DEFINE_PER_CPU(unsigned long, kernel_stack) =
  3.         (unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE;
  4. EXPORT_PER_CPU_SYMBOL(kernel_stack);
  5. ................
复制代码
可以看到这里会多出来一个KERNEL_STACK_OFFSET的东西,这个偏移是什么意思?如何计算出来的呢?

作者: simohayha_cu   发布时间: 2010-10-02

每进程都有自己的内核栈 你这里说的好象是初始化的时候
INTEL 3A上MP协议的CPU 分BSP和AP
都会跳到保护模式 猜测这个原因需要内核栈
而Intel486和Pentium只在主处理器执行初试化 其他一律停机

作者: smalloc   发布时间: 2010-10-11

就是,和x86-64有什么关系

作者: snail_314   发布时间: 2010-10-11