以编程方式禁用CPU核心

hor*_*rro 22 linux hardware multicore processor hardware-programming

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

我的问题更进一步,是否有可能不仅忽略它而是以编程方式将其关闭?我希望CPU不接收任何电源,以使其能耗为零.

我知道可以从BIOS中禁用内核(并非总是如此),但我想知道是否可以在某个程序中执行此操作.

小智 14

当你这样做时echo 0 > /sys/devices/system/cpu/cpu<number>/online,接下来发生的事情取决于特定的CPU.在ARM嵌入式系统上,内核通常会禁用驱动特定内核PLL的时钟,以便您有效地获得所需内容.

在Intel X86系统上,您只能禁用中断并调用hlt指令(Linux Kernel会执行此操作).这有效地将CPU置于节能状态,直到被用户请求的另一个CPU唤醒.如果你有一台笔记本电脑,你可以通过读取/sys/class/power_supply/BAT{0,1}/current_now(或uevent所有值,如电压)或使用"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之前将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.嗯,我意识到除了研究内核资源外我对英特尔一无所知.