如果Linux在多核CPU上运行,那么每个核心是否存在全局“当前”?

时间:2016-05-30 06:16:41

标签: linux multicore

有些书说

  

当前指针指的是当前正在执行的用户进程。   在执行系统调用期间,例如打开读取,   当前进程是调用该调用的进程。

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

2 个答案:

答案 0 :(得分:3)

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

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

的指令。
movq %gs:current_task,%rax

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

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

答案 1 :(得分:2)

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