我正在尝试了解linux syscallsched_setaffinity()的工作方式。这是我在这里提出的问题的后续。
我有本指南,该指南说明了如何使用syscall并有一个非常简洁(工作!)的示例。
因此,我下载了Linux 2.6.27.19 内核源代码。
我对包含该系统调用的行进行了“ grep”操作,得到了91个结果。没有希望。
最终,我试图了解内核如何 为特定内核 (或处理器)设置指令指针。
我熟悉单核单线程程序的工作方式。可能会发出“ jmp foo”指令,这基本上将IP设置为“ foo”标签的内存地址。但是,当一个具有多个内核时,必须说“在内存地址foo处获取下一条指令,并设置 2号内核 的指令指针以在那里开始执行”。
我们在汇编代码中的哪个位置指定执行该操作的内核?
回到内核代码:这里重要的是什么?文件“ kernel / sched.c”具有一个名为sched_setaffinity()的函数,但返回的类型为“ long”-与手册页不一致。那么这里重要的是什么?以下哪个模块显示了发出的组装说明?哪个模块正在读取“ task_struct”,查看“ cpus_allowed”成员,然后将其转换为指令?(我也翻阅过glibc源代码- 但我认为它只是调用内核代码来完成此任务。)
sched_setaffinity() 只需告诉调度程序允许该进程/线程在哪个CPU上运行,然后调用重新调度即可。
sched_setaffinity()
调度程序实际上在每个CPU上运行,因此有机会决定在该特定CPU上下一步执行什么任务。
如果您对如何在其他CPU上实际调用某些代码感兴趣,建议您参考一下smp_call_function_single()。如果我们要在另一个CPU上调用某个东西,则调用generic_exec_single()。后者只是将函数添加到目标CPU的调用队列中,并通过一些IPI东西(如果队列为空)来强制重新计划。
smp_call_function_single()
generic_exec_single()
底线是:该_jmp_指令没有实际的SMP变体。相反,在其他CPU上运行的代码可以协作完成任务。
_jmp_