【问题标题】:Processor affinity settings for Linux kernel modules?Linux内核模块的处理器关联设置?
【发布时间】:2011-03-03 06:51:50
【问题描述】:

在 Windows 中,我可以使用 KeSetSystemAffinityThread 设置驱动程序代码的处理器亲和性,并使用 KeGetCurrentProcessorNumber 检查我的代码在哪个处理器上运行。

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

编辑:

我想我已经知道如何获取当前的处理器了。 smp_processor_id() 似乎应该可以工作。

【问题讨论】:

标签: linux-kernel smp affinity


【解决方案1】:

smp_processor_id() 应该会告诉您正在运行的逻辑处理器。

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

【讨论】:

    【解决方案2】:

    我认为您可能必须修改内核,但更改并不太粗略。只需将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.
    

    【讨论】:

    • 我以前见过这个,并认为它只适用于用户级进程,但是如果我将 pid 参数设置为 0 它实际上可以工作。我设法做到了这一点,而无需使用函数指针重新编译内核并在 /boot/System.map 中查找 sched_setaffinity,只是为了测试它。 long (extern_sched_setaffinity)(pid_t pid, const struct cpumask *in_mask) = (void)0xffffffff81066a70;在我的系统上。谢谢。
    • 这可能不是一个好主意,除非您只是设置由驱动程序专门创建的内核线程的亲和性。否则,驱动程序代码可以在不同时间在许多不同进程的上下文中运行,每个进程都有其自己的调度程序亲和性。如果你只想执行一小段代码而不被反弹到另一个 CPU,你可以使用 preempt_disable()preempt_enable() 创建一个 preemption-disabled 临界区。
    • @caf:我认为你所描述的就是这种情况,因为他说的是“我的代码”。不过,无论如何都是好建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2016-03-25
    • 2011-11-29
    • 2015-07-23
    • 2019-02-17
    • 2012-04-11
    相关资源
    最近更新 更多