【问题标题】:Is there a global "current" for each core if Linux is running on a multicore CPU?如果 Linux 在多核 CPU 上运行,每个内核是否有一个全局“当前”?
【发布时间】:2016-09-27 21:04:33
【问题描述】:

有些书说

current 指针指向当前正在执行的用户进程。 在执行系统调用期间,例如 openread, 当前进程是调用该调用的进程。

如果多个进程在多核 CPU 上同时调用一个系统调用(相同或不同的系统调用),每个内核调用一个系统调用会怎样?内核是否需要多个“当前”全局变量?

【问题讨论】:

    标签: linux multicore


    【解决方案1】:

    如果您好奇这是如何实现的:在 x86-64 上,每个 CPU 的 gs 选择器寄存器用于指向特定于该 CPU 的数据块。这使得使用一条指令即可轻松访问该数据。

    正如 hobbs 所指出的,current 是一个宏,它扩展为对内联函数的调用,该函数通过一些其他内联函数和内联 asm 扩展为类似的指令

    movq %gs:current_task,%rax
    

    它将这个 CPU 的 current 指针加载到 rax 寄存器中。这里的标签current_task是每个CPU数据块中current指针的偏移量,由链接器(或模块加载器)计算和填充。

    您可以在include/asm/percpu.h查看详细信息。

    【讨论】:

      【解决方案2】:

      current 实际上是一个宏,而不是一个变量。但是,是的,它是一个读取每个 CPU 变量的宏,这意味着它将始终返回正在执行的 CPU 的当前任务。 Here is its definition 用于 x86,here is where it's set 用于 __switch_to 用于 64 位 x86。

      【讨论】:

      • 在过去,在支持多处理器之前,它实际上是一个全局变量 (example from Linux 0.01),而宏的设计使您仍然可以像编写全局变量一样编写代码。
      • @NateEldredge 是有道理的。我已经有一段时间了,但我的知识仍然没有超过 Linux 2.0 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多