某本书说
当前指针是指当前正在执行的用户进程。 在执行系统调用(例如打开或读取)期间, 当前进程是调用调用的进程。
如果多个进程在多核 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
中设置的位置。