在 Windows 中,我可以使用 KeSetSystemAffinityThread 设置驱动程序代码的处理器亲和性,并使用 KeGetCurrentProcessorNumber 检查我的代码在哪个处理器上运行。
我正在尝试在 Linux 内核模块中做类似的事情,但我能看到的唯一关联调用是针对用户态进程的。有没有办法做到这一点,以便我可以在特定处理器上运行汇编代码?(即新加坡元)
编辑:
我想我已经弄清楚如何获得当前的处理器了。smp_processor_id() 似乎应该可以工作。
在 Windows 中,我可以使用 KeSetSystemAffinityThread 设置驱动程序代码的处理器亲和性,并使用 KeGetCurrentProcessorNumber 检查我的代码在哪个处理器上运行。
我正在尝试在 Linux 内核模块中做类似的事情,但我能看到的唯一关联调用是针对用户态进程的。有没有办法做到这一点,以便我可以在特定处理器上运行汇编代码?(即新加坡元)
编辑:
我想我已经弄清楚如何获得当前的处理器了。smp_processor_id() 似乎应该可以工作。
我认为您可能必须修改内核,但更改并不太粗略。只需导出sched_setaffinity
到sched.c
模块:
long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
{
...
}
+ EXPORT_SYMBOL_GPL(sched_setaffinity); // Exported, now callable from your code.
smp_processor_id()
应该告诉您正在运行的逻辑处理器。
一些体系结构还支持smp_call_function_single
内核功能,该功能将使用处理器间中断在另一个处理器上运行功能。