Ответ 1
Когда вы выполняете echo 0 > /sys/devices/system/cpu/cpu<number>/online
, то, что происходит дальше, зависит от конкретного процессора. В встроенных системах ARM ядро, как правило, отключает часы, которые управляют конкретной базой PLL, так что вы получаете то, что хотите.
В системах Intel X86 вы можете отключать прерывания и вызывать инструкцию hlt
(что ядро Linux). Это эффективно переводит CPU в энергосберегающее состояние, пока оно не пробуждается другим процессором по запросу пользователя. Если у вас есть ноутбук, вы можете убедиться в том, что питание отключено, когда вы отключите ядро, прочитав питание от /sys/class/power_supply/BAT{0,1}/current_now
(или uevent
для всех значений, таких как напряжение) или с помощью утилиты "powertop".
Например, здесь цепочка вызовов для отключения ядра ЦП ядра Linux для процессоров Intel. 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. Хм, я понял, что понятия не имею о Intel, кроме как смотреть в исходные тексты ядра.