【发布时间】:2016-09-27 21:04:33
【问题描述】:
有些书说
current 指针指向当前正在执行的用户进程。 在执行系统调用期间,例如 open 或 read, 当前进程是调用该调用的进程。
如果多个进程在多核 CPU 上同时调用一个系统调用(相同或不同的系统调用),每个内核调用一个系统调用会怎样?内核是否需要多个“当前”全局变量?
【问题讨论】:
有些书说
current 指针指向当前正在执行的用户进程。 在执行系统调用期间,例如 open 或 read, 当前进程是调用该调用的进程。
如果多个进程在多核 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 的当前任务。 Here is its definition 用于 x86,here is where it's set 用于 __switch_to 用于 64 位 x86。
【讨论】: