有些书说
当前指针指的是当前正在执行的用户进程。 在执行系统调用期间,例如打开或读取 ,当前进程是调用该调用的进程。
如果多个进程在一个多核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
。