2010-06-13 80 views
0

在Windows中,我可以使用KeSetSystemAffinityThread设置驱动程序代码的处理器关联性,并使用KeGetCurrentProcessorNumber检查我的代码在哪个处理器上运行。Linux内核模块的处理器关联设置?

我正在尝试在Linux内核模块中做类似的事情,但唯一能够看到的关联调用是针对用户级进程的。有没有办法做到这一点,以便我可以在特定的处理器上运行汇编代码? (即SGDT)

编辑:

我想我已经找到了如何让当前处理器。 smp_processor_id()似乎应该可以工作。

回答

3

我认为你可能不得不修改内核,但改变不是太粗糙。就在sched.c出口sched_setaffinity到模块:

long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) 
    { 
    ... 
    } 
+ EXPORT_SYMBOL_GPL(sched_setaffinity); // Exported, now callable from your code. 
+0

我以前见过这种情况,并认为它只适用于userland进程,但是如果我将pid参数设置为0,它实际上可以工作。 我设法做到这一点,不用使用函数指针重新编译内核,并在/boot/System.map中查找sched_setaffinity,只是为了测试它。 long(* extern_sched_setaffinity)(pid_t pid,const struct cpumask * in_mask)=(void *)0xffffffff81066a70;在我的系统上。 谢谢。 – 2010-06-13 19:15:51

+3

这不太可能是一个好主意,除非您只是设置由驱动程序专门创建的内核线程的亲和性。否则,驱动程序代码可以在不同时间的许多不同进程的上下文中运行,每个进程都有其自己的调度程序亲和性。如果您只想执行一小段代码而不会被弹回到另一个CPU,则可以使用'preempt_disable()'和'preempt_enable()'创建一个抢先禁用临界区。 – caf 2010-06-16 07:36:56

+0

@caf:我认为你描述的是这种情况,因为他说“我的代码”。不管怎样,不管怎么说,好的建议。 – 2010-06-16 10:11:37

1

smp_processor_id()应该告诉你什么逻辑处理器你正在运行的。

某些架构还支持smp_call_function_single内核函数,该函数将使用内部处理器中断在另一个处理器上运行函数。