有些书说
当前指针指的是当前正在执行的用户进程。 在执行系统调用期间,例如打开或读取, 当前进程是调用该调用的进程。
如果多个进程在多核CPU上同时调用系统调用(相同或不同的系统调用),每个核心上有一个进程,该怎么办?内核是否需要多个“当前”全局变量?
答案 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。