如果Linux在多核CPU上运行,每个内核是否有全局的“当前”?

有些书说

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

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

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

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

 movq %gs:current_task,%rax 

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

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

current实际上是一个宏观,而不是一个变量。 但是,是的,它是一个读取每个CPU变量的宏,意味着它总是会返回正在执行的CPU的当前任务。 这是 x86的定义 , 这里是在 64位x86的__switch_to 设置的__switch_to