以编程方式禁用CPU内核

已知在Linux中禁用逻辑CPU的方法基本上是echo > 0 /sys/devices/system/cpu/cpu<number>/online 。 这样,你只告诉操作系统忽略给定的( <number> )CPU。

我的问题更进一步,是不是可以忽略它,而是以程序化的方式closures它? 我想让CPU不接收任何电力,以使其能耗为零。

我知道可以从BIOS中禁用内核(不总是),但是我想知道是否可以在某个程序中做到这一点。

当你执行echo 0 > /sys/devices/system/cpu/cpu<number>/online ,接下来发生什么取决于特定的CPU。 在ARM嵌入式系统上,内核通常会禁用驱动特定内核PLL的时钟,从而达到您想要的效果。

在Intel X86系统上,只能禁止中断并调用hlt指令(Linux内核)。 这有效地使CPU处于省电状态,直到被用户请求由另一个CPU唤醒。 如果您有便携式计算机,则可以通过从/sys/class/power_supply/BAT{0,1}/current_now (或者针对所有值(例如电压))读取电源来禁用内核,或者使用“powertop”工具。

例如,下面是在Linux内核中为Intel CPU禁用CPU内核的调用链。 https://github.com/torvalds/linux/blob/master/drivers/cpufreq/intel_pstate.c

arch/x86/kernel/smp.csmp_ops.play_dead = native_play_dead,

arch/x86/kernel/smpboot.cnative_play_dead() – > play_dead_common() – > local_irq_disable()

在此之前,CPUFREQ还会在禁用之前将CPU设置为最低功耗级别,尽管这似乎不是绝对必要的。

intel_pstate_stop_cpu – > intel_cpufreq_stop_cpu – > intel_pstate_set_min_pstate – > intel_pstate_set_pstate – > wrmsrl_on_cpu(cpu->cpu, MSR_IA32_PERF_CTL, pstate_funcs.get_val(cpu, pstate));

在Intel X86上,似乎没有官方的方法来禁用实际的时钟和电压调节器。 即使有,这将是具体的主板,因此你最接近的赌注可能是看着BIOS,如coreboot。 嗯,我意识到我不知道有关英特尔除了调查内核来源。

AFAIK目前没有可用的系统调用或库函数。 甚至是ioctl的实现。 所以除了创建新的模块/系统调用外,还有两种方法我可以想到:

  1. 使用ASM asm(<assembly code>); 其中汇编代码是体系结构特定的asm代码来修改cpu标志。

  2. 系统调用c( man 3 system )。 假设你只是想通过c。

你可以通过使用像cpufreq这样的管理员来得到最接近的结果。 使Linux排除CPU和省电模式将确保内核以最小的频率运行。