在所有内核上设置控制寄存器

时间:2012-03-21 20:51:48

标签: linux linux-kernel kernel-module

我需要在给定系统的所有内核上启用cr4 bit 8(PCE)。我目前有一个工作模块,它在加载模块时运行的核心上设置这个位。我被困在这里并且没有找到关于如何并行化这个以在所有核上运行的文档:

1)看起来卸载并不总是发生在负载发生的核心上,所以我无法正确清理

2)我无法想出任何强制模块初始化在特定核心上执行的方法 - 如果可以的话,我可以简单地为每个核心分别调用一个模块来设置所有核心。模块似乎没有sched_setaffinity等效项。

有没有办法强制这个模块在所有内核上运行,通过并行化或迭代所有内核?我无法修改内核本身或者在启动时加载模块,所以我不能只改变寄存器最初设置的内容。

感谢您的任何提示,我在这里试图解决这个问题!

1 个答案:

答案 0 :(得分:4)

想出来 - smp_call_function()在系统的所有核心上调用一个函数。获得一个带来这一点的搜索结果(很少/没有文档)是非常棘手的: - /

这非常有效,您可以通过在被调用函数中打印smp_processor_id()来验证每个核心是否运行代码。

编辑:此功能仅调用其他内核,因此您仍需要单独调用该函数一次以获取当前正在运行模块的内核!