已知在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.c
: smp_ops.play_dead = native_play_dead,
arch/x86/kernel/smpboot.c
: native_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的实现。 所以除了创建新的模块/系统调用外,还有两种方法我可以想到:
使用ASM asm(<assembly code>);
其中汇编代码是体系结构特定的asm代码来修改cpu标志。
系统调用c( man 3 system
)。 假设你只是想通过c。
你可以通过使用像cpufreq
这样的管理员来得到最接近的结果。 使Linux排除CPU和省电模式将确保内核以最小的频率运行。