如果 Linux 在多核 CPU 上运行,每个内核是否有全局"current"?



某本书说

当前

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

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

如果您对如何实现这一点感到好奇:在 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中设置的位置。

相关内容

最新更新